diff options
-rw-r--r-- | src/wasm.h | 18 | ||||
-rw-r--r-- | test/llvm_autogenerated/immediates.wast | 8 |
2 files changed, 16 insertions, 10 deletions
diff --git a/src/wasm.h b/src/wasm.h index 91c318034..367af082a 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -193,9 +193,12 @@ struct Literal { union { float ff; uint32_t ll; - } u; - u.ff = f; - o << "nan:0x" << std::hex << u.ll << std::dec; + } fu, iu; + fu.ff = f; + memcpy(&iu, &fu, sizeof(fu)); + bool sign = std::signbit(f); + uint32_t payload = ~0xffc00000u & iu.ll; + o << (sign ? "-" : "") << "nan:0x" << std::hex << payload << std::dec; return; } printDouble(o, f); @@ -210,9 +213,12 @@ struct Literal { union { double dd; uint64_t ll; - } u; - u.dd = d; - o << "nan:0x" << std::hex << u.ll << std::dec; + } du, iu; + du.dd = d; + memcpy(&iu, &du, sizeof(du)); + bool sign = std::signbit(d); + uint32_t payload = ~0xfff8000000000000ull & iu.ll; + o << (sign ? "" : "-") << "nan:0x" << std::hex << payload << std::dec; return; } if (!std::isfinite(d)) { diff --git a/test/llvm_autogenerated/immediates.wast b/test/llvm_autogenerated/immediates.wast index 85763fe54..19c8c0087 100644 --- a/test/llvm_autogenerated/immediates.wast +++ b/test/llvm_autogenerated/immediates.wast @@ -136,7 +136,7 @@ (block $fake_return_waka123 (block (br $fake_return_waka123 - (f32.const nan:0x7fc00000) + (f32.const nan:0x0) ) ) ) @@ -145,7 +145,7 @@ (block $fake_return_waka123 (block (br $fake_return_waka123 - (f32.const nan:0xffc00000) + (f32.const -nan:0x0) ) ) ) @@ -208,7 +208,7 @@ (block $fake_return_waka123 (block (br $fake_return_waka123 - (f64.const nan:0x7ff8000000000000) + (f64.const -nan:0x0) ) ) ) @@ -217,7 +217,7 @@ (block $fake_return_waka123 (block (br $fake_return_waka123 - (f64.const nan:0xfff8000000000000) + (f64.const nan:0x0) ) ) ) |