1*2813126eSlogin #pragma once 2*2813126eSlogin #include <common/sys/types.h> 3*2813126eSlogin 4*2813126eSlogin // ===== 描述long double 的数据比特结构 5*2813126eSlogin #if __LDBL_MANT_DIG__ == 53 && __LDBL_MAX_EXP__ == 1024 6*2813126eSlogin #elif __LDBL_MANT_DIG__ == 64 && __LDBL_MAX_EXP__ == 16384 && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 7*2813126eSlogin union ldshape 8*2813126eSlogin { 9*2813126eSlogin long double f; 10*2813126eSlogin struct 11*2813126eSlogin { 12*2813126eSlogin uint64_t m; 13*2813126eSlogin uint16_t se; 14*2813126eSlogin } i; 15*2813126eSlogin }; 16*2813126eSlogin #elif __LDBL_MANT_DIG__ == 113 && __LDBL_MAX_EXP__ == 16384 && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 17*2813126eSlogin union ldshape 18*2813126eSlogin { 19*2813126eSlogin long double f; 20*2813126eSlogin struct 21*2813126eSlogin { 22*2813126eSlogin uint64_t lo; 23*2813126eSlogin uint32_t mid; 24*2813126eSlogin uint16_t top; 25*2813126eSlogin uint16_t se; 26*2813126eSlogin } i; 27*2813126eSlogin struct 28*2813126eSlogin { 29*2813126eSlogin uint64_t lo; 30*2813126eSlogin uint64_t hi; 31*2813126eSlogin } i2; 32*2813126eSlogin }; 33*2813126eSlogin #elif __LDBL_MANT_DIG__ == 113 && __LDBL_MAX_EXP__ == 16384 && __BYTE_ORDER__ == __BIG_ENDIAN 34*2813126eSlogin union ldshape 35*2813126eSlogin { 36*2813126eSlogin long double f; 37*2813126eSlogin struct 38*2813126eSlogin { 39*2813126eSlogin uint16_t se; 40*2813126eSlogin uint16_t top; 41*2813126eSlogin uint32_t mid; 42*2813126eSlogin uint64_t lo; 43*2813126eSlogin } i; 44*2813126eSlogin struct 45*2813126eSlogin { 46*2813126eSlogin uint64_t hi; 47*2813126eSlogin uint64_t lo; 48*2813126eSlogin } i2; 49*2813126eSlogin }; 50*2813126eSlogin #else 51*2813126eSlogin #error Unsupported long double representation 52*2813126eSlogin #endif 53*2813126eSlogin 54*2813126eSlogin #define FORCE_EVAL(x) \ 55*2813126eSlogin do \ 56*2813126eSlogin { \ 57*2813126eSlogin if (sizeof(x) == sizeof(float)) \ 58*2813126eSlogin { \ 59*2813126eSlogin volatile float __x; \ 60*2813126eSlogin __x = (x); \ 61*2813126eSlogin (void)__x; \ 62*2813126eSlogin } \ 63*2813126eSlogin else if (sizeof(x) == sizeof(double)) \ 64*2813126eSlogin { \ 65*2813126eSlogin volatile double __x; \ 66*2813126eSlogin __x = (x); \ 67*2813126eSlogin (void)__x; \ 68*2813126eSlogin } \ 69*2813126eSlogin else \ 70*2813126eSlogin { \ 71*2813126eSlogin volatile long double __x; \ 72*2813126eSlogin __x = (x); \ 73*2813126eSlogin (void)__x; \ 74*2813126eSlogin } \ 75*2813126eSlogin } while (0) 76