84 lines
2.3 KiB
C
84 lines
2.3 KiB
C
/*
|
|
This file defines sane integer types for our target platforms. This
|
|
library only runs on machines with the following characteristics:
|
|
|
|
- supports integer word sizes of 8, 16, 32, and 64 bits
|
|
- uses unsigned and signed 2's complement representations
|
|
- all pointer types are the same size
|
|
- there is an integer type with the same size as a pointer
|
|
|
|
Some features require:
|
|
- IEEE 754 single- and double-precision floating point
|
|
|
|
We assume the LP64 convention for 64-bit platforms.
|
|
*/
|
|
|
|
#undef BITS32 // TODO
|
|
#define BITS64 // TODO
|
|
|
|
#ifdef __GNUC__
|
|
#define EXTERN_NORETURN(ret, args) extern ret args __attribute__((__noreturn__))
|
|
#define STATIC_NORETURN(ret, args) static ret args __attribute__((__noreturn__))
|
|
#endif
|
|
|
|
#ifdef _MSC_VER
|
|
#define EXTERN_NORETURN(ret, args) __declspec(noreturn) extern ret args
|
|
#define STATIC_NORETURN(ret, args) __declspec(noreturn) static ret args
|
|
#endif
|
|
|
|
#ifdef __WATCOMC__
|
|
#pragma aux noreturn aborts;
|
|
#define EXTERN_NORETURN(ret, args) extern ret __pragma("noreturn") args
|
|
#define STATIC_NORETURN(ret, args) static ret __pragma("noreturn") args
|
|
#endif
|
|
|
|
#define LLT_ALLOC(n) malloc(n)
|
|
#define LLT_REALLOC(p, n) realloc((p), (n))
|
|
#define LLT_FREE(x) free(x)
|
|
|
|
typedef int bool_t;
|
|
|
|
#ifdef BITS64
|
|
#define TOP_BIT 0x8000000000000000
|
|
#define NBITS 64
|
|
#else
|
|
#define TOP_BIT 0x80000000
|
|
#define NBITS 32
|
|
#endif
|
|
|
|
#define LLT_ALIGN(x, sz) (((x) + (sz - 1)) & (-sz))
|
|
|
|
// branch prediction annotations
|
|
#ifdef __GNUC__
|
|
#define __unlikely(x) __builtin_expect(!!(x), 0)
|
|
#define __likely(x) __builtin_expect(!!(x), 1)
|
|
#else
|
|
#define __unlikely(x) (x)
|
|
#define __likely(x) (x)
|
|
#endif
|
|
|
|
#define DBL_MAXINT 9007199254740992LL
|
|
#define FLT_MAXINT 16777216
|
|
#define U64_MAX 18446744073709551615ULL
|
|
#define S64_MAX 9223372036854775807LL
|
|
#define S64_MIN (-S64_MAX - 1LL)
|
|
#define BIT63 0x8000000000000000LL
|
|
#define BIT31 0x80000000
|
|
|
|
#define LOG2_10 3.3219280948873626
|
|
#define sign_bit(r) ((*(int64_t *)&(r)) & BIT63)
|
|
#define LABS(n) (((n) ^ ((n) >> (NBITS - 1))) - ((n) >> (NBITS - 1)))
|
|
#define NBABS(n, nb) (((n) ^ ((n) >> ((nb)-1))) - ((n) >> ((nb)-1)))
|
|
#define DFINITE(d) \
|
|
(((*(int64_t *)&(d)) & 0x7ff0000000000000LL) != 0x7ff0000000000000LL)
|
|
#define DNAN(d) ((d) != (d))
|
|
|
|
extern double D_PNAN;
|
|
extern double D_NNAN;
|
|
extern double D_PINF;
|
|
extern double D_NINF;
|
|
extern float F_PNAN;
|
|
extern float F_NNAN;
|
|
extern float F_PINF;
|
|
extern float F_NINF;
|