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') 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