1 #define CVTFN(type1, type2) \ 2 __attribute__((noinline)) type1 \ 3 cvt_##type1##_##type2 (type2 x) \ 4 { \ 5 return x; \ 6 } 7 8 typedef signed char sc; 9 #define sc_MIN (-__SCHAR_MAX__ - 1) 10 #define sc_MAX __SCHAR_MAX__ 11 typedef unsigned char uc; 12 #define uc_MIN 0 13 #define uc_MAX (2U * __SCHAR_MAX__ + 1U) 14 typedef 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) 17 typedef signed short ss; 18 #define ss_MIN (-__SHRT_MAX__ - 1) 19 #define ss_MAX __SHRT_MAX__ 20 typedef unsigned short us; 21 #define us_MIN 0 22 #define us_MAX (2U * __SHRT_MAX__ + 1U) 23 typedef signed int si; 24 #define si_MIN (-__INT_MAX__ - 1) 25 #define si_MAX __INT_MAX__ 26 typedef unsigned int ui; 27 #define ui_MIN 0 28 #define ui_MAX (2U * __INT_MAX__ + 1U) 29 typedef signed long sl; 30 #define sl_MIN (-__LONG_MAX__ - 1L) 31 #define sl_MAX __LONG_MAX__ 32 typedef unsigned long ul; 33 #define ul_MIN 0L 34 #define ul_MAX (2UL * __LONG_MAX__ + 1UL) 35 typedef signed long long sll; 36 #define sll_MIN (-__LONG_LONG_MAX__ - 1LL) 37 #define sll_MAX __LONG_LONG_MAX__ 38 typedef unsigned long long ull; 39 #define ull_MIN 0LL 40 #define ull_MAX (2ULL * __LONG_LONG_MAX__ + 1ULL) 41 #ifdef USE_INT128 42 typedef 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) 47 typedef 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 79 typedef 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) 83 typedef 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) 87 typedef 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) 93 CVTS (f) 94 CVTS (d) 95 CVTS (ld) 96 #endif 97 #ifdef USE_FLOAT80 98 typedef __float80 f80; 99 # define f80_RADIX 2 100 # define f80_MANT_DIG 64 101 # define f80_MAX ((TWO << (f80_MANT_DIG - 1)) - 1) 102 CVTS (f80) 103 #endif 104 #ifdef USE_FLOAT128 105 typedef __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) 111 CVTS (f128) 112 #endif 113 #ifdef USE_DFP 114 # ifdef __cplusplus 115 typedef float _Decimal32 __attribute__((mode(SD))); 116 typedef float _Decimal64 __attribute__((mode(DD))); 117 typedef float _Decimal128 __attribute__((mode(TD))); 118 # endif 119 typedef _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 125 typedef _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 131 typedef _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 147 CVTS (d32) 148 CVTS (d64) 149 CVTS (d128) 150 #endif 151 152 extern 153 #ifdef __cplusplus 154 "C" 155 #endif 156 void abort (); 157