From 2957433b25373dccc336492f6817a1cefadb945c Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sun, 1 Nov 2020 18:25:43 +0100 Subject: [PATCH] stage1: Fix comptime comparison of NaNs --- src/stage1/ir.cpp | 4 ++-- src/stage1/softfloat.hpp | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp index 98422ef578..c85c26f2c0 100644 --- a/src/stage1/ir.cpp +++ b/src/stage1/ir.cpp @@ -10953,13 +10953,13 @@ static bool float_is_nan(ZigValue *op) { } else if (op->type->id == ZigTypeIdFloat) { switch (op->type->data.floating.bit_count) { case 16: - return f16_isSignalingNaN(op->data.x_f16); + return zig_f16_isNaN(op->data.x_f16); case 32: return op->data.x_f32 != op->data.x_f32; case 64: return op->data.x_f64 != op->data.x_f64; case 128: - return f128M_isSignalingNaN(&op->data.x_f128); + return zig_f128_isNaN(&op->data.x_f128); default: zig_unreachable(); } diff --git a/src/stage1/softfloat.hpp b/src/stage1/softfloat.hpp index a1173690b5..57e60a5fc0 100644 --- a/src/stage1/softfloat.hpp +++ b/src/stage1/softfloat.hpp @@ -29,4 +29,17 @@ static inline double zig_f16_to_double(float16_t x) { return z; } +static inline bool zig_f16_isNaN(float16_t a) { + union { uint16_t ui; float16_t f; } uA; + uA.f = a; + return 0x7C00 < (uA.ui & 0x7FFF); +} + +static inline bool zig_f128_isNaN(float128_t *aPtr) { + uint64_t absA64 = aPtr->v[1] & UINT64_C(0x7FFFFFFFFFFFFFFF); + return + (UINT64_C(0x7FFF000000000000) < absA64) + || ((absA64 == UINT64_C(0x7FFF000000000000)) && aPtr->v[0]); +} + #endif