summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm.h18
-rw-r--r--test/llvm_autogenerated/immediates.wast8
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)
)
)
)