summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
authorJF Bastien <github@jfbastien.com>2016-05-02 16:08:23 -0700
committerJF Bastien <github@jfbastien.com>2016-05-02 16:08:23 -0700
commit5456ae59515d08c1c3de3aaca7331d420ede8a32 (patch)
treee8cfb68a1b7ca10eb25907d791efb0c7bd03bcc1 /src/wasm-interpreter.h
parent91c62dd70ec09a762542e2835273942f97509c5d (diff)
downloadbinaryen-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.h9
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();
}
}