| ... | @@ -12,6 +12,8 @@ extern "C" { | ... | @@ -12,6 +12,8 @@ extern "C" { |
| 12 | #include "softfloat.h" | 12 | #include "softfloat.h" |
| 13 | } | 13 | } |
| 14 | | 14 | |
| | 15 | #include "zigendian.h" |
| | 16 | |
| 15 | static inline float16_t zig_double_to_f16(double x) { | 17 | static inline float16_t zig_double_to_f16(double x) { |
| 16 | float64_t y; | 18 | float64_t y; |
| 17 | static_assert(sizeof(x) == sizeof(y), ""); | 19 | static_assert(sizeof(x) == sizeof(y), ""); |
| ... | @@ -36,10 +38,22 @@ static inline bool zig_f16_isNaN(float16_t a) { | ... | @@ -36,10 +38,22 @@ static inline bool zig_f16_isNaN(float16_t a) { |
| 36 | } | 38 | } |
| 37 | | 39 | |
| 38 | static inline bool zig_f128_isNaN(float128_t *aPtr) { | 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 | return | 54 | return |
| 41 | (UINT64_C(0x7FFF000000000000) < absA64) | 55 | (UINT64_C(0x7FFF000000000000) < absA64) |
| 42 | || ((absA64 == UINT64_C(0x7FFF000000000000)) && aPtr->v[0]); | 56 | || ((absA64 == UINT64_C(0x7FFF000000000000)) && lo); |
| 43 | } | 57 | } |
| 44 | | 58 | |
| 45 | #endif | 59 | #endif |