From 9a4dc90db0433473fbcf2b0ba3fa99efc9e77a31 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 2 Feb 2016 16:35:41 -0800 Subject: convert Abs to use int bits --- src/wasm-interpreter.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/wasm-interpreter.h') diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 381176390..3fa83b863 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -412,7 +412,7 @@ private: float ret; switch (curr->op) { case Neg: ret = -v; break; - case Abs: ret = std::abs(v); break; + case Abs: return Literal(value.reinterpreti32() & 0x7fffffff).castToF32(); break; // operate on bits directly, to avoid signalling bit being set on a float case Ceil: ret = std::ceil(v); break; case Floor: ret = std::floor(v); break; case Trunc: ret = std::trunc(v); break; @@ -431,7 +431,7 @@ private: double ret; switch (curr->op) { case Neg: ret = -v; break; - case Abs: ret = std::abs(v); break; + case Abs: return Literal(value.reinterpreti64() & 0x7fffffffffffffffUL).castToF64(); break; // operate on bits directly, to avoid signalling bit being set on a float case Ceil: ret = std::ceil(v); break; case Floor: ret = std::floor(v); break; case Trunc: ret = std::trunc(v); break; -- cgit v1.2.3 From b1cd906c688f52228a59a8ff244ec581d062550e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 2 Feb 2016 16:40:44 -0800 Subject: convert Neg to use int bits --- src/wasm-interpreter.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/wasm-interpreter.h') 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; -- cgit v1.2.3 From a28ccaece49c9c5a59eba7d951f2a61b9c27f18a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 2 Feb 2016 16:43:36 -0800 Subject: convert CopySign to use int bits --- src/wasm-interpreter.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'src/wasm-interpreter.h') diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index eb0ba9c19..41f1996ce 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -570,10 +570,8 @@ private: case Sub: ret = l - r; break; case Mul: ret = l * r; break; case Div: ret = l / r; break; - case CopySign: { - ret = std::copysign(l, r); - return Literal(ret); - } + // operate on bits directly, to avoid signalling bit being set on a float + case CopySign: return Literal((left.reinterpreti32() & 0x7fffffff) | (right.reinterpreti32() & 0x80000000)).castToF32(); break; case Min: { if (l == r && l == 0) ret = 1/l < 0 ? l : r; else ret = std::min(l, r); @@ -601,10 +599,8 @@ private: case Sub: ret = l - r; break; case Mul: ret = l * r; break; case Div: ret = l / r; break; - case CopySign: { - ret = std::copysign(l, r); - return Literal(ret); - } + // operate on bits directly, to avoid signalling bit being set on a float + case CopySign: return Literal((left.reinterpreti64() & 0x7fffffffffffffffUL) | (right.reinterpreti64() & 0x8000000000000000UL)).castToF64(); break; case Min: { if (l == r && l == 0) ret = 1/l < 0 ? l : r; else ret = std::min(l, r); -- cgit v1.2.3 From edc07c0cb8e66f8ca33de759b02cf1d3171b5df9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 2 Feb 2016 19:07:43 -0800 Subject: simplify interpreter int reinterpreting --- src/wasm-interpreter.h | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'src/wasm-interpreter.h') diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 41f1996ce..b08773c16 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -378,13 +378,7 @@ private: case Clz: return Literal((int32_t)CountLeadingZeroes(v)); case Ctz: return Literal((int32_t)CountTrailingZeroes(v)); case Popcnt: return Literal((int32_t)PopCount(v)); - case ReinterpretInt: { - float v = value.reinterpretf32(); - if (isnan(v)) { - return Literal(Literal(value.geti32() | 0x7f800000).reinterpretf32()); - } - return Literal(value.reinterpretf32()); - } + case ReinterpretInt: return value.castToF32(); case ExtendSInt32: return Literal(int64_t(value.geti32())); case ExtendUInt32: return Literal(uint64_t((uint32_t)value.geti32())); case ConvertUInt32: return curr->type == f32 ? Literal(float(uint32_t(value.geti32()))) : Literal(double(uint32_t(value.geti32()))); @@ -399,9 +393,7 @@ private: case Ctz: return Literal((int64_t)CountTrailingZeroes(v)); case Popcnt: return Literal((int64_t)PopCount(v)); case WrapInt64: return Literal(int32_t(value.geti64())); - case ReinterpretInt: { - return Literal(value.reinterpretf64()); - } + case ReinterpretInt: return value.castToF64(); case ConvertUInt64: return curr->type == f32 ? Literal(float((uint64_t)value.geti64())) : Literal(double((uint64_t)value.geti64())); case ConvertSInt64: return curr->type == f32 ? Literal(float(value.geti64())) : Literal(double(value.geti64())); default: abort(); -- cgit v1.2.3 From b1ba1b81ae7a382018f5b5769e25d9431fd462b9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 3 Feb 2016 10:19:28 -0800 Subject: fix type of large consts --- src/wasm-interpreter.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/wasm-interpreter.h') diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index b08773c16..97e9117f7 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -424,8 +424,8 @@ private: double ret; switch (curr->op) { // 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 Neg: return Literal(value.reinterpreti64() ^ 0x8000000000000000ULL).castToF64(); break; + case Abs: return Literal(value.reinterpreti64() & 0x7fffffffffffffffULL).castToF64(); break; case Ceil: ret = std::ceil(v); break; case Floor: ret = std::floor(v); break; case Trunc: ret = std::trunc(v); break; -- cgit v1.2.3