123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #pragma once
- #include <common/sys/types.h>
- // ===== 描述long double 的数据比特结构
- #if __LDBL_MANT_DIG__ == 53 && __LDBL_MAX_EXP__ == 1024
- #elif __LDBL_MANT_DIG__ == 64 && __LDBL_MAX_EXP__ == 16384 && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- union ldshape
- {
- long double f;
- struct
- {
- uint64_t m;
- uint16_t se;
- } i;
- };
- #elif __LDBL_MANT_DIG__ == 113 && __LDBL_MAX_EXP__ == 16384 && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- union ldshape
- {
- long double f;
- struct
- {
- uint64_t lo;
- uint32_t mid;
- uint16_t top;
- uint16_t se;
- } i;
- struct
- {
- uint64_t lo;
- uint64_t hi;
- } i2;
- };
- #elif __LDBL_MANT_DIG__ == 113 && __LDBL_MAX_EXP__ == 16384 && __BYTE_ORDER__ == __BIG_ENDIAN
- union ldshape
- {
- long double f;
- struct
- {
- uint16_t se;
- uint16_t top;
- uint32_t mid;
- uint64_t lo;
- } i;
- struct
- {
- uint64_t hi;
- uint64_t lo;
- } i2;
- };
- #else
- #error Unsupported long double representation
- #endif
- #define FORCE_EVAL(x) \
- do \
- { \
- if (sizeof(x) == sizeof(float)) \
- { \
- volatile float __x; \
- __x = (x); \
- (void)__x; \
- } \
- else if (sizeof(x) == sizeof(double)) \
- { \
- volatile double __x; \
- __x = (x); \
- (void)__x; \
- } \
- else \
- { \
- volatile long double __x; \
- __x = (x); \
- (void)__x; \
- } \
- } while (0)
|