diff options
author | JF Bastien <github@jfbastien.com> | 2016-05-02 16:08:23 -0700 |
---|---|---|
committer | JF Bastien <github@jfbastien.com> | 2016-05-02 16:08:23 -0700 |
commit | 5456ae59515d08c1c3de3aaca7331d420ede8a32 (patch) | |
tree | e8cfb68a1b7ca10eb25907d791efb0c7bd03bcc1 /src/wasm-interpreter.h | |
parent | 91c62dd70ec09a762542e2835273942f97509c5d (diff) | |
download | binaryen-5456ae59515d08c1c3de3aaca7331d420ede8a32.tar.gz binaryen-5456ae59515d08c1c3de3aaca7331d420ede8a32.tar.bz2 binaryen-5456ae59515d08c1c3de3aaca7331d420ede8a32.zip |
f32.demote/f64 fix UB (#423)
Another fix for #404.
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r-- | src/wasm-interpreter.h | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index d0e64c91e..5e3011282 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -455,7 +455,14 @@ private: case TruncSFloat64: return truncSFloat(curr, value); case TruncUFloat64: return truncUFloat(curr, value); case ReinterpretFloat: return value.castToI64(); - case DemoteFloat64: return value.truncateToF32(); + case DemoteFloat64: { + double val = value.getFloat(); + if (std::isnan(val)) return Literal(float(val)); + if (std::isinf(val)) return Literal(float(val)); + if (val < -std::numeric_limits<float>::max()) return Literal(-std::numeric_limits<float>::infinity()); + if (val > std::numeric_limits<float>::max()) return Literal(std::numeric_limits<float>::infinity()); + return value.truncateToF32(); + } default: abort(); } } |