diff options
author | Max Graey <maxgraey@gmail.com> | 2020-11-10 23:04:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-10 13:04:16 -0800 |
commit | 236296d8563e0f90c3b57f32f1f8f63bac414b89 (patch) | |
tree | 56aaabeedd5d02229d20622d4214fba8f63e6f7f /src | |
parent | 0c20d9f427b63a6fdc354bb917c11f382068eaec (diff) | |
download | binaryen-236296d8563e0f90c3b57f32f1f8f63bac414b89.tar.gz binaryen-236296d8563e0f90c3b57f32f1f8f63bac414b89.tar.bz2 binaryen-236296d8563e0f90c3b57f32f1f8f63bac414b89.zip |
[wasm2js] Use native JavaScript Math.trunc (#3329)
Diffstat (limited to 'src')
-rw-r--r-- | src/asmjs/shared-constants.cpp | 3 | ||||
-rw-r--r-- | src/asmjs/shared-constants.h | 5 | ||||
-rw-r--r-- | src/passes/RemoveNonJSOps.cpp | 7 | ||||
-rw-r--r-- | src/passes/wasm-intrinsics.wat | 34 | ||||
-rw-r--r-- | src/wasm2js.h | 8 |
5 files changed, 9 insertions, 48 deletions
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<PostWalker<RemoveNonJSOpsPass>> { 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"); |