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