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