From 236296d8563e0f90c3b57f32f1f8f63bac414b89 Mon Sep 17 00:00:00 2001 From: Max Graey Date: Tue, 10 Nov 2020 23:04:16 +0200 Subject: [wasm2js] Use native JavaScript Math.trunc (#3329) --- src/asmjs/shared-constants.cpp | 3 +-- src/asmjs/shared-constants.h | 5 ++--- src/passes/RemoveNonJSOps.cpp | 7 ------- src/passes/wasm-intrinsics.wat | 34 ---------------------------------- src/wasm2js.h | 8 ++++++-- 5 files changed, 9 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/asmjs/shared-constants.cpp b/src/asmjs/shared-constants.cpp index 2cb7d901c..20b148155 100644 --- a/src/asmjs/shared-constants.cpp +++ b/src/asmjs/shared-constants.cpp @@ -52,6 +52,7 @@ cashew::IString I32U_REM("i32u-rem"); cashew::IString ABS("abs"); cashew::IString FLOOR("floor"); cashew::IString CEIL("ceil"); +cashew::IString TRUNC("trunc"); cashew::IString SQRT("sqrt"); cashew::IString POW("pow"); cashew::IString I32_TEMP("asm2wasm_i32_temp"); @@ -86,8 +87,6 @@ cashew::IString WASM_FETCH_HIGH_BITS("__wasm_fetch_high_bits"); cashew::IString INT64_TO_32_HIGH_BITS("i64toi32_i32$HIGH_BITS"); cashew::IString WASM_NEAREST_F32("__wasm_nearest_f32"); cashew::IString WASM_NEAREST_F64("__wasm_nearest_f64"); -cashew::IString WASM_TRUNC_F32("__wasm_trunc_f32"); -cashew::IString WASM_TRUNC_F64("__wasm_trunc_f64"); cashew::IString WASM_I64_MUL("__wasm_i64_mul"); cashew::IString WASM_I64_SDIV("__wasm_i64_sdiv"); cashew::IString WASM_I64_UDIV("__wasm_i64_udiv"); diff --git a/src/asmjs/shared-constants.h b/src/asmjs/shared-constants.h index d458db684..20edacb7e 100644 --- a/src/asmjs/shared-constants.h +++ b/src/asmjs/shared-constants.h @@ -55,6 +55,7 @@ extern cashew::IString I32U_REM; extern cashew::IString ABS; extern cashew::IString FLOOR; extern cashew::IString CEIL; +extern cashew::IString TRUNC; extern cashew::IString SQRT; extern cashew::IString POW; extern cashew::IString I32_TEMP; @@ -66,8 +67,8 @@ extern cashew::IString STACK_MAX; extern cashew::IString INSTRUMENT; extern cashew::IString MATH_IMUL; extern cashew::IString MATH_ABS; -extern cashew::IString MATH_CEIL; extern cashew::IString MATH_CLZ32; +extern cashew::IString MATH_CEIL; extern cashew::IString MATH_FLOOR; extern cashew::IString MATH_TRUNC; extern cashew::IString MATH_SQRT; @@ -89,8 +90,6 @@ extern cashew::IString WASM_FETCH_HIGH_BITS; extern cashew::IString INT64_TO_32_HIGH_BITS; extern cashew::IString WASM_NEAREST_F32; extern cashew::IString WASM_NEAREST_F64; -extern cashew::IString WASM_TRUNC_F32; -extern cashew::IString WASM_TRUNC_F64; extern cashew::IString WASM_I64_MUL; extern cashew::IString WASM_I64_SDIV; extern cashew::IString WASM_I64_UDIV; diff --git a/src/passes/RemoveNonJSOps.cpp b/src/passes/RemoveNonJSOps.cpp index abd3526c4..08e6e6482 100644 --- a/src/passes/RemoveNonJSOps.cpp +++ b/src/passes/RemoveNonJSOps.cpp @@ -299,13 +299,6 @@ struct RemoveNonJSOpsPass : public WalkerPass> { functionCall = WASM_NEAREST_F64; break; - case TruncFloat32: - functionCall = WASM_TRUNC_F32; - break; - case TruncFloat64: - functionCall = WASM_TRUNC_F64; - break; - case PopcntInt64: functionCall = WASM_POPCNT64; break; diff --git a/src/passes/wasm-intrinsics.wat b/src/passes/wasm-intrinsics.wat index 17bf0d649..185bef961 100644 --- a/src/passes/wasm-intrinsics.wat +++ b/src/passes/wasm-intrinsics.wat @@ -26,8 +26,6 @@ (export "__wasm_i64_srem" (func $__wasm_i64_srem)) (export "__wasm_i64_urem" (func $__wasm_i64_urem)) (export "__wasm_i64_mul" (func $__wasm_i64_mul)) - (export "__wasm_trunc_f32" (func $__wasm_trunc_f32)) - (export "__wasm_trunc_f64" (func $__wasm_trunc_f64)) (export "__wasm_ctz_i32" (func $__wasm_ctz_i32)) (export "__wasm_ctz_i64" (func $__wasm_ctz_i64)) (export "__wasm_rotl_i32" (func $__wasm_rotl_i32)) @@ -144,38 +142,6 @@ (local.get $var$1) ) ) - ;; lowering of the f32.trunc instruction, rounds to the nearest integer, - ;; towards zero - (func $__wasm_trunc_f32 (; 5 ;) (type $1) (param $var$0 f32) (result f32) - (select - (f32.ceil - (local.get $var$0) - ) - (f32.floor - (local.get $var$0) - ) - (f32.lt - (local.get $var$0) - (f32.const 0) - ) - ) - ) - ;; lowering of the f64.trunc instruction, rounds to the nearest integer, - ;; towards zero - (func $__wasm_trunc_f64 (; 6 ;) (type $2) (param $var$0 f64) (result f64) - (select - (f64.ceil - (local.get $var$0) - ) - (f64.floor - (local.get $var$0) - ) - (f64.lt - (local.get $var$0) - (f64.const 0) - ) - ) - ) ;; lowering of the i32.ctz instruction, counting the number of zeros in $var$0 (func $__wasm_ctz_i32 (; 7 ;) (type $3) (param $var$0 i32) (result i32) (if diff --git a/src/wasm2js.h b/src/wasm2js.h index bdaa2f9f7..b31886329 100644 --- a/src/wasm2js.h +++ b/src/wasm2js.h @@ -519,6 +519,7 @@ void Wasm2JSBuilder::addBasics(Ref ast, Module* wasm) { addMath(MATH_MAX, MAX); addMath(MATH_FLOOR, FLOOR); addMath(MATH_CEIL, CEIL); + addMath(MATH_TRUNC, TRUNC); addMath(MATH_SQRT, SQRT); // abort function Ref abortVar = ValueBuilder::makeVar(); @@ -1613,6 +1614,11 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, ret = ValueBuilder::makeCall( MATH_FLOOR, visit(curr->value, EXPRESSION_RESULT)); break; + case TruncFloat32: + case TruncFloat64: + ret = ValueBuilder::makeCall( + MATH_TRUNC, visit(curr->value, EXPRESSION_RESULT)); + break; case SqrtFloat32: case SqrtFloat64: ret = ValueBuilder::makeCall( @@ -1666,8 +1672,6 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, // TODO: more complex unary conversions case NearestFloat32: case NearestFloat64: - case TruncFloat32: - case TruncFloat64: WASM_UNREACHABLE( "operation should have been removed in previous passes"); -- cgit v1.2.3