mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 15:26:47 +00:00
76 lines
2.0 KiB
C
76 lines
2.0 KiB
C
#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)
|