summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2020-11-10 23:04:16 +0200
committerGitHub <noreply@github.com>2020-11-10 13:04:16 -0800
commit236296d8563e0f90c3b57f32f1f8f63bac414b89 (patch)
tree56aaabeedd5d02229d20622d4214fba8f63e6f7f /src
parent0c20d9f427b63a6fdc354bb917c11f382068eaec (diff)
downloadbinaryen-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.cpp3
-rw-r--r--src/asmjs/shared-constants.h5
-rw-r--r--src/passes/RemoveNonJSOps.cpp7
-rw-r--r--src/passes/wasm-intrinsics.wat34
-rw-r--r--src/wasm2js.h8
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");