| ... | ... | @@ -12,6 +12,8 @@ extern "C" { |
| 12 | 12 | #include "softfloat.h" |
| 13 | 13 | } |
| 14 | 14 | |
| 15 | #include "zigendian.h" |
| 16 | |
| 15 | 17 | static inline float16_t zig_double_to_f16(double x) { |
| 16 | 18 | float64_t y; |
| 17 | 19 | static_assert(sizeof(x) == sizeof(y), ""); |
| ... | ... | @@ -36,10 +38,22 @@ static inline bool zig_f16_isNaN(float16_t a) { |
| 36 | 38 | } |
| 37 | 39 | |
| 38 | 40 | static inline bool zig_f128_isNaN(float128_t *aPtr) { |
| 39 | | uint64_t absA64 = aPtr->v[1] & UINT64_C(0x7FFFFFFFFFFFFFFF); |
| 41 | uint64_t hi, lo; |
| 42 | |
| 43 | #if defined(ZIG_BYTE_ORDER) && ZIG_BYTE_ORDER == ZIG_LITTLE_ENDIAN |
| 44 | hi = aPtr->v[1]; |
| 45 | lo = aPtr->v[0]; |
| 46 | #elif defined(ZIG_BYTE_ORDER) && ZIG_BYTE_ORDER == ZIG_BIG_ENDIAN |
| 47 | hi = aPtr->v[0]; |
| 48 | lo = aPtr->v[1]; |
| 49 | #else |
| 50 | #error Unsupported endian |
| 51 | #endif |
| 52 | |
| 53 | uint64_t absA64 = hi & UINT64_C(0x7FFFFFFFFFFFFFFF); |
| 40 | 54 | return |
| 41 | 55 | (UINT64_C(0x7FFF000000000000) < absA64) |
| 42 | | || ((absA64 == UINT64_C(0x7FFF000000000000)) && aPtr->v[0]); |
| 56 | || ((absA64 == UINT64_C(0x7FFF000000000000)) && lo); |
| 43 | 57 | } |
| 44 | 58 | |
| 45 | 59 | #endif |