Index: src/wasm/function-body-decoder.h |
diff --git a/src/wasm/function-body-decoder.h b/src/wasm/function-body-decoder.h |
index 836dda4b44a9c4408f85aab006237cc6d30e2e3a..b4faf576d39fbc5cce219cad80099bfc6818c8ca 100644 |
--- a/src/wasm/function-body-decoder.h |
+++ b/src/wasm/function-body-decoder.h |
@@ -70,7 +70,9 @@ struct ImmF32Operand { |
float value; |
unsigned length; |
inline ImmF32Operand(Decoder* decoder, const byte* pc) { |
- value = bit_cast<float>(decoder->checked_read_u32(pc, 1, "immf32")); |
+ // Avoid bit_cast because it might not preserve the signalling bit of a NaN. |
+ uint32_t tmp = decoder->checked_read_u32(pc, 1, "immf32"); |
+ memcpy(&value, &tmp, sizeof(value)); |
length = 4; |
} |
}; |
@@ -79,7 +81,9 @@ struct ImmF64Operand { |
double value; |
unsigned length; |
inline ImmF64Operand(Decoder* decoder, const byte* pc) { |
- value = bit_cast<double>(decoder->checked_read_u64(pc, 1, "immf64")); |
+ // Avoid bit_cast because it might not preserve the signalling bit of a NaN. |
+ uint64_t tmp = decoder->checked_read_u64(pc, 1, "immf64"); |
+ memcpy(&value, &tmp, sizeof(value)); |
length = 8; |
} |
}; |