xref: /DragonOS/kernel/src/common/math/libm.h (revision 2813126e3190c9b3c1a836a647b259a7adbe0cf3)
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