From f10bc3e2c9c6a96634e14500347bbd2c51ce607c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 May 2019 15:09:53 -0700 Subject: wasm2js: 'handle' saturating float to int conversions - we don't handle any of them precisely anyhow (#2087) --- src/wasm2js.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/wasm2js.h b/src/wasm2js.h index 30d694f78..24d168355 100644 --- a/src/wasm2js.h +++ b/src/wasm2js.h @@ -1176,19 +1176,22 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, switch (curr->type) { case i32: { switch (curr->op) { - case ClzInt32: + case ClzInt32: { return ValueBuilder::makeCall( MATH_CLZ32, visit(curr->value, EXPRESSION_RESULT)); + } case CtzInt32: - case PopcntInt32: + case PopcntInt32: { std::cerr << "i32 unary should have been removed: " << curr << std::endl; WASM_UNREACHABLE(); - case EqZInt32: + } + case EqZInt32: { // XXX !x does change the type to bool, which is correct, but may // be slower? return ValueBuilder::makeUnary( L_NOT, visit(curr->value, EXPRESSION_RESULT)); + } case ReinterpretFloat32: { ABI::wasm2js::ensureScratchMemoryHelpers( module, ABI::wasm2js::SCRATCH_STORE_F32); @@ -1205,14 +1208,18 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, // generate (~~expr), what Emscripten does case TruncSFloat32ToInt32: case TruncSFloat64ToInt32: + case TruncSatSFloat32ToInt32: + case TruncSatSFloat64ToInt32: { return ValueBuilder::makeUnary( B_NOT, ValueBuilder::makeUnary(B_NOT, visit(curr->value, EXPRESSION_RESULT))); - + } // generate (~~expr >>> 0), what Emscripten does case TruncUFloat32ToInt32: case TruncUFloat64ToInt32: + case TruncSatUFloat32ToInt32: + case TruncSatUFloat64ToInt32: { return ValueBuilder::makeBinary( ValueBuilder::makeUnary( B_NOT, @@ -1220,7 +1227,7 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, B_NOT, visit(curr->value, EXPRESSION_RESULT))), TRSHIFT, ValueBuilder::makeNum(0)); - + } default: { std::cerr << "Unhandled unary i32 operator: " << curr << std::endl; -- cgit v1.2.3