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 ();