1#define CVTFN(type1, type2) \ 2__attribute__((noinline)) type1 \ 3cvt_##type1##_##type2 (type2 x) \ 4{ \ 5 return x; \ 6} 7 8typedef signed char sc; 9#define sc_MIN (-__SCHAR_MAX__ - 1) 10#define sc_MAX __SCHAR_MAX__ 11typedef unsigned char uc; 12#define uc_MIN 0 13#define uc_MAX (2U * __SCHAR_MAX__ + 1U) 14typedef char c; 15#define c_MIN ((((char) -1) > (char) 0) ? uc_MIN : sc_MIN) 16#define c_MAX ((((char) -1) > (char) 0) ? uc_MAX : sc_MAX) 17typedef signed short ss; 18#define ss_MIN (-__SHRT_MAX__ - 1) 19#define ss_MAX __SHRT_MAX__ 20typedef unsigned short us; 21#define us_MIN 0 22#define us_MAX (2U * __SHRT_MAX__ + 1U) 23typedef signed int si; 24#define si_MIN (-__INT_MAX__ - 1) 25#define si_MAX __INT_MAX__ 26typedef unsigned int ui; 27#define ui_MIN 0 28#define ui_MAX (2U * __INT_MAX__ + 1U) 29typedef signed long sl; 30#define sl_MIN (-__LONG_MAX__ - 1L) 31#define sl_MAX __LONG_MAX__ 32typedef unsigned long ul; 33#define ul_MIN 0L 34#define ul_MAX (2UL * __LONG_MAX__ + 1UL) 35typedef signed long long sll; 36#define sll_MIN (-__LONG_LONG_MAX__ - 1LL) 37#define sll_MAX __LONG_LONG_MAX__ 38typedef unsigned long long ull; 39#define ull_MIN 0LL 40#define ull_MAX (2ULL * __LONG_LONG_MAX__ + 1ULL) 41#ifdef USE_INT128 42typedef signed __int128 si128; 43# define si128_MAX \ 44 ((signed __int128) ((((unsigned __int128) 1) \ 45 << (__CHAR_BIT__ * __SIZEOF_INT128__ - 1)) - 1)) 46# define si128_MIN (-si128_MAX - 1) 47typedef unsigned __int128 ui128; 48#define ui128_MIN ((unsigned __int128) 0) 49#define ui128_MAX (((unsigned __int128) 2) * si128_MAX + 1) 50#endif 51 52#ifdef si128_MAX 53# define CVTS128(type2) CVTFN (si128, type2) CVTFN (ui128, type2) 54#else 55# define CVTS128(type2) 56#endif 57 58#define CVTS(type2) \ 59 CVTFN (sc, type2) CVTFN (c, type2) CVTFN (uc, type2) \ 60 CVTFN (ss, type2) CVTFN (us, type2) \ 61 CVTFN (si, type2) CVTFN (ui, type2) \ 62 CVTFN (sl, type2) CVTFN (ul, type2) \ 63 CVTFN (sll, type2) CVTFN (ull, type2) \ 64 CVTS128 (type2) 65 66#ifdef __SIZEOF_INT128__ 67# define TWO ((unsigned __int128) 2) 68# define M1U ((unsigned __int128) -1) 69# define MAXS (__CHAR_BIT__ * __SIZEOF_INT128__) 70# define MAXT unsigned __int128 71#else 72# define TWO 2ULL 73# define M1U -1ULL 74# define MAXS (__CHAR_BIT__ * __SIZEOF_LONG_LONG__) 75# define MAXT unsigned long long 76#endif 77 78#ifdef USE_FLT_DBL_LDBL 79typedef float f; 80#define f_RADIX 2 81#define f_MANT_DIG __FLT_MANT_DIG__ 82#define f_MAX ((TWO << (f_MANT_DIG - 1)) - 1) 83typedef double d; 84#define d_RADIX 2 85#define d_MANT_DIG __DBL_MANT_DIG__ 86#define d_MAX ((TWO << (d_MANT_DIG - 1)) - 1) 87typedef long double ld; 88#define ld_RADIX 2 89#define ld_MANT_DIG __LDBL_MANT_DIG__ 90#define ld_MAX \ 91 (ld_MANT_DIG > MAXS ? M1U : (TWO << (ld_MANT_DIG > MAXS \ 92 ? 0 : ld_MANT_DIG - 1)) - 1) 93CVTS (f) 94CVTS (d) 95CVTS (ld) 96#endif 97#ifdef USE_FLOAT80 98typedef __float80 f80; 99# define f80_RADIX 2 100# define f80_MANT_DIG 64 101# define f80_MAX ((TWO << (f80_MANT_DIG - 1)) - 1) 102CVTS (f80) 103#endif 104#ifdef USE_FLOAT128 105typedef __float128 f128; 106# define f128_RADIX 2 107# define f128_MANT_DIG 113 108# define f128_MAX \ 109 (f128_MANT_DIG > MAXS ? M1U : (TWO << (f128_MANT_DIG > MAXS \ 110 ? 0 : f128_MANT_DIG - 1)) - 1) 111CVTS (f128) 112#endif 113#ifdef USE_DFP 114# ifdef __cplusplus 115typedef float _Decimal32 __attribute__((mode(SD))); 116typedef float _Decimal64 __attribute__((mode(DD))); 117typedef float _Decimal128 __attribute__((mode(TD))); 118# endif 119typedef _Decimal32 d32; 120# define d32_RADIX 10 121# define d32_MANT_DIG __DEC32_MANT_DIG__ 122# if d32_MANT_DIG == 7 123# define d32_MAX 9999999ULL 124# endif 125typedef _Decimal64 d64; 126# define d64_RADIX 10 127# define d64_MANT_DIG __DEC64_MANT_DIG__ 128# if d64_MANT_DIG == 16 129# define d64_MAX 9999999999999999ULL 130# endif 131typedef _Decimal128 d128; 132# define d128_RADIX 10 133# define d128_MANT_DIG __DEC128_MANT_DIG__ 134# if d128_MANT_DIG == 34 135# ifdef __SIZEOF_INT128__ 136/* #define d128_MAX 0x1ed09bead87c0378d8e63ffffffff */ 137# define d128_MAX \ 138 ((((unsigned __int128) 0x1ed09bead87c0) << 64) + 0x378d8e63ffffffffULL) 139# else 140# define d128_MAX M1U 141# endif 142# endif 143# ifdef BROKEN_DECIMAL_INT128 144# undef CVTS128 145# define CVTS128(type2) 146# endif 147CVTS (d32) 148CVTS (d64) 149CVTS (d128) 150#endif 151 152extern 153#ifdef __cplusplus 154"C" 155#endif 156void abort (); 157