summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-02-02 16:40:44 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-02-02 19:20:43 -0800
commitb1cd906c688f52228a59a8ff244ec581d062550e (patch)
tree65a4f8f5bfc9b2fe3b68c75e5537c3b113d1359a
parent9a4dc90db0433473fbcf2b0ba3fa99efc9e77a31 (diff)
downloadbinaryen-b1cd906c688f52228a59a8ff244ec581d062550e.tar.gz
binaryen-b1cd906c688f52228a59a8ff244ec581d062550e.tar.bz2
binaryen-b1cd906c688f52228a59a8ff244ec581d062550e.zip
convert Neg to use int bits
-rw-r--r--src/wasm-interpreter.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 3fa83b863..eb0ba9c19 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -411,8 +411,9 @@ private:
float v = value.getf32();
float ret;
switch (curr->op) {
- case Neg: ret = -v; break;
- case Abs: return Literal(value.reinterpreti32() & 0x7fffffff).castToF32(); break; // operate on bits directly, to avoid signalling bit being set on a float
+ // operate on bits directly, to avoid signalling bit being set on a float
+ case Neg: return Literal(value.reinterpreti32() ^ 0x80000000).castToF32(); break;
+ case Abs: return Literal(value.reinterpreti32() & 0x7fffffff).castToF32(); break;
case Ceil: ret = std::ceil(v); break;
case Floor: ret = std::floor(v); break;
case Trunc: ret = std::trunc(v); break;
@@ -430,8 +431,9 @@ private:
double v = value.getf64();
double ret;
switch (curr->op) {
- case Neg: ret = -v; break;
- case Abs: return Literal(value.reinterpreti64() & 0x7fffffffffffffffUL).castToF64(); break; // operate on bits directly, to avoid signalling bit being set on a float
+ // operate on bits directly, to avoid signalling bit being set on a float
+ case Neg: return Literal(value.reinterpreti64() ^ 0x8000000000000000UL).castToF64(); break;
+ case Abs: return Literal(value.reinterpreti64() & 0x7fffffffffffffffUL).castToF64(); break;
case Ceil: ret = std::ceil(v); break;
case Floor: ret = std::floor(v); break;
case Trunc: ret = std::trunc(v); break;