diff options
author | JF Bastien <jfb@chromium.org> | 2016-01-28 09:01:07 -0800 |
---|---|---|
committer | JF Bastien <jfb@chromium.org> | 2016-01-28 09:01:07 -0800 |
commit | 700c910cd1be1dcfd84f3a2bc4252a47999b9341 (patch) | |
tree | a344523409679e08fd66fbdeb5ca088e7a85660b | |
parent | 30a371284f7a8128c52beec39ccbac03103a2b5c (diff) | |
download | binaryen-700c910cd1be1dcfd84f3a2bc4252a47999b9341.tar.gz binaryen-700c910cd1be1dcfd84f3a2bc4252a47999b9341.tar.bz2 binaryen-700c910cd1be1dcfd84f3a2bc4252a47999b9341.zip |
Output NaN payloads only
As discussed with @binji and @sunfish in https://github.com/WebAssembly/sexpr-wasm-prototype/issues/28
-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) ) ) ) |