diff --git a/std/assembly/math.ts b/std/assembly/math.ts index ffc20132b8..0b4313a61d 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -1583,19 +1583,18 @@ export namespace NativeMath { } var ux1 = ux << 1; if (ux1 <= uy1) { - if (ux1 == uy1) return 0 * x; - return x; + return x * f64(ux1 != uy1); } if (!ex) { ex -= builtin_clz(ux << 12); - ux <<= -ex + 1; + ux <<= 1 - ex; } else { ux &= -1 >> 12; ux |= 1 << 52; } if (!ey) { ey -= builtin_clz(uy << 12); - uy <<= -ey + 1; + uy <<= 1 - ey; } else { uy &= -1 >> 12; uy |= 1 << 52; @@ -1622,8 +1621,7 @@ export namespace NativeMath { } else { ux >>= -ex + 1; } - ux |= sx << 63; - return reinterpret(ux); + return reinterpret(ux | (sx << 63)); } export function rem(x: f64, y: f64): f64 { // see: musl/src/math/remquo.c @@ -1640,14 +1638,14 @@ export namespace NativeMath { var uxi = ux; if (!ex) { ex -= builtin_clz(uxi << 12); - uxi <<= -ex + 1; + uxi <<= 1 - ex; } else { uxi &= -1 >> 12; uxi |= 1 << 52; } if (!ey) { ey -= builtin_clz(uy << 12); - uy <<= -ey + 1; + uy <<= 1 - ey; } else { uy &= -1 >> 12; uy |= 1 << 52; @@ -2884,7 +2882,7 @@ export namespace NativeMathf { var uy = reinterpret(y); var ex = (ux >> 23 & 0xFF); var ey = (uy >> 23 & 0xFF); - var sx = ux & 0x80000000; + var sm = ux & 0x80000000; var uy1 = uy << 1; if (uy1 == 0 || ex == 0xFF || isNaN(y)) { let m = x * y; @@ -2892,19 +2890,18 @@ export namespace NativeMathf { } var ux1 = ux << 1; if (ux1 <= uy1) { - if (ux1 == uy1) return 0 * x; - return x; + return x * f32(ux1 != uy1); } if (!ex) { ex -= builtin_clz(ux << 9); - ux <<= -ex + 1; + ux <<= 1 - ex; } else { ux &= -1 >> 9; ux |= 1 << 23; } if (!ey) { ey -= builtin_clz(uy << 9); - uy <<= -ey + 1; + uy <<= 1 - ey; } else { uy &= -1 >> 9; uy |= 1 << 23; @@ -2931,8 +2928,7 @@ export namespace NativeMathf { } else { ux >>= -ex + 1; } - ux |= sx; - return reinterpret(ux); + return reinterpret(ux | sm); } export function rem(x: f32, y: f32): f32 { // see: musl/src/math/remquof.c @@ -2946,14 +2942,14 @@ export namespace NativeMathf { if (ux << 1 == 0) return x; if (!ex) { ex -= builtin_clz(uxi << 9); - uxi <<= -ex + 1; + uxi <<= 1 - ex; } else { uxi &= -1 >> 9; uxi |= 1 << 23; } if (!ey) { ey -= builtin_clz(uy << 9); - uy <<= -ey + 1; + uy <<= 1 - ey; } else { uy &= -1 >> 9; uy |= 1 << 23; diff --git a/tests/compiler/binary.untouched.wat b/tests/compiler/binary.untouched.wat index a7a522d0ef..fe63b928b4 100644 --- a/tests/compiler/binary.untouched.wat +++ b/tests/compiler/binary.untouched.wat @@ -1288,16 +1288,12 @@ local.get $7 i32.le_u if + local.get $0 local.get $9 local.get $7 - i32.eq - if - f32.const 0 - local.get $0 - f32.mul - return - end - local.get $0 + i32.ne + f32.convert_i32_u + f32.mul return end local.get $4 @@ -1311,11 +1307,9 @@ i32.sub local.set $4 local.get $2 - i32.const 0 + i32.const 1 local.get $4 i32.sub - i32.const 1 - i32.add i32.shl local.set $2 else @@ -1343,11 +1337,9 @@ i32.sub local.set $5 local.get $3 - i32.const 0 + i32.const 1 local.get $5 i32.sub - i32.const 1 - i32.add i32.shl local.set $3 else @@ -1460,8 +1452,6 @@ local.get $2 local.get $6 i32.or - local.set $2 - local.get $2 f32.reinterpret_i32 ) (func $~lib/math/NativeMathf.pow (param $0 f32) (param $1 f32) (result f32) @@ -2163,16 +2153,12 @@ local.get $7 i64.le_u if + local.get $0 local.get $9 local.get $7 - i64.eq - if - f64.const 0 - local.get $0 - f64.mul - return - end - local.get $0 + i64.ne + f64.convert_i32_u + f64.mul return end local.get $4 @@ -2188,11 +2174,9 @@ i64.sub local.set $4 local.get $2 - i64.const 0 + i64.const 1 local.get $4 i64.sub - i64.const 1 - i64.add i64.shl local.set $2 else @@ -2222,11 +2206,9 @@ i64.sub local.set $5 local.get $3 - i64.const 0 + i64.const 1 local.get $5 i64.sub - i64.const 1 - i64.add i64.shl local.set $3 else @@ -2341,8 +2323,6 @@ i64.const 63 i64.shl i64.or - local.set $2 - local.get $2 f64.reinterpret_i64 ) (func $start:binary diff --git a/tests/compiler/std/math.optimized.wat b/tests/compiler/std/math.optimized.wat index 0be7bd82f2..b3418d80b0 100644 --- a/tests/compiler/std/math.optimized.wat +++ b/tests/compiler/std/math.optimized.wat @@ -6519,146 +6519,151 @@ f64.div return end - block $folding-inner0 + local.get $2 + i64.const 1 + i64.shl + local.tee $8 + local.get $6 + i64.le_u + if + local.get $0 + local.get $6 + local.get $8 + i64.ne + f64.convert_i32_u + f64.mul + return + end + local.get $4 + i64.eqz + if (result i64) local.get $2 i64.const 1 + local.get $4 + local.get $2 + i64.const 12 i64.shl - local.tee $8 - local.get $6 - i64.le_u - if - local.get $6 - local.get $8 - i64.eq - br_if $folding-inner0 - local.get $0 - return - end + i64.clz + i64.sub + local.tee $4 + i64.sub + i64.shl + else + local.get $2 + i64.const 4503599627370495 + i64.and + i64.const 4503599627370496 + i64.or + end + local.set $2 + local.get $5 + i64.eqz + if (result i64) + local.get $3 + i64.const 1 + local.get $5 + local.get $3 + i64.const 12 + i64.shl + i64.clz + i64.sub + local.tee $5 + i64.sub + i64.shl + else + local.get $3 + i64.const 4503599627370495 + i64.and + i64.const 4503599627370496 + i64.or + end + local.set $3 + loop $while-continue|0 local.get $4 - i64.eqz - if (result i64) - local.get $2 - i64.const 1 - local.get $4 - local.get $2 - i64.const 12 - i64.shl - i64.clz - i64.sub - local.tee $4 - i64.sub - i64.shl - else - local.get $2 - i64.const 4503599627370495 - i64.and - i64.const 4503599627370496 - i64.or - end - local.set $2 local.get $5 - i64.eqz - if (result i64) - local.get $3 - i64.const 1 - local.get $5 - local.get $3 - i64.const 12 - i64.shl - i64.clz - i64.sub - local.tee $5 - i64.sub - i64.shl - else + i64.gt_s + if + local.get $2 local.get $3 - i64.const 4503599627370495 - i64.and - i64.const 4503599627370496 - i64.or - end - local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i64.gt_s - if + i64.ge_u + if (result i64) local.get $2 local.get $3 - i64.ge_u - if (result i64) - local.get $2 - local.get $3 - i64.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i64.sub - else - local.get $2 + i64.eq + if + local.get $0 + f64.const 0 + f64.mul + return end - i64.const 1 - i64.shl - local.set $2 - local.get $4 - i64.const 1 + local.get $2 + local.get $3 i64.sub - local.set $4 - br $while-continue|0 + else + local.get $2 end + i64.const 1 + i64.shl + local.set $2 + local.get $4 + i64.const 1 + i64.sub + local.set $4 + br $while-continue|0 end + end + local.get $2 + local.get $3 + i64.ge_u + if local.get $2 local.get $3 - i64.ge_u + i64.eq if - local.get $2 - local.get $3 - i64.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i64.sub - local.set $2 + local.get $0 + f64.const 0 + f64.mul + return end local.get $2 - local.get $2 - i64.const 11 - i64.shl - i64.clz - local.tee $3 - i64.shl - local.set $2 - local.get $4 local.get $3 i64.sub - local.tee $4 - i64.const 0 - i64.gt_s - if (result i64) - local.get $2 - i64.const 4503599627370496 - i64.sub - local.get $4 - i64.const 52 - i64.shl - i64.or - else - local.get $2 - i64.const 1 - local.get $4 - i64.sub - i64.shr_u - end - local.get $7 - i64.const 63 + local.set $2 + end + local.get $2 + local.get $2 + i64.const 11 + i64.shl + i64.clz + local.tee $3 + i64.shl + local.set $2 + local.get $4 + local.get $3 + i64.sub + local.tee $4 + i64.const 0 + i64.gt_s + if (result i64) + local.get $2 + i64.const 4503599627370496 + i64.sub + local.get $4 + i64.const 52 i64.shl i64.or - f64.reinterpret_i64 - return + else + local.get $2 + i64.const 1 + local.get $4 + i64.sub + i64.shr_u end - local.get $0 - f64.const 0 - f64.mul + local.get $7 + i64.const 63 + i64.shl + i64.or + f64.reinterpret_i64 ) (func $std/math/test_mod (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 @@ -6741,142 +6746,147 @@ f32.div return end - block $folding-inner0 + local.get $2 + i32.const 1 + i32.shl + local.tee $8 + local.get $6 + i32.le_u + if + local.get $0 + local.get $6 + local.get $8 + i32.ne + f32.convert_i32_u + f32.mul + return + end + local.get $4 + if (result i32) + local.get $2 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + else local.get $2 i32.const 1 + local.get $4 + local.get $2 + i32.const 9 i32.shl - local.tee $8 - local.get $6 - i32.le_u - if - local.get $6 - local.get $8 - i32.eq - br_if $folding-inner0 - local.get $0 - return - end + i32.clz + i32.sub + local.tee $4 + i32.sub + i32.shl + end + local.set $2 + local.get $5 + if (result i32) + local.get $3 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + else + local.get $3 + i32.const 1 + local.get $5 + local.get $3 + i32.const 9 + i32.shl + i32.clz + i32.sub + local.tee $5 + i32.sub + i32.shl + end + local.set $3 + loop $while-continue|0 local.get $4 - if (result i32) - local.get $2 - i32.const 8388607 - i32.and - i32.const 8388608 - i32.or - else - local.get $2 - i32.const 1 - local.get $4 - local.get $2 - i32.const 9 - i32.shl - i32.clz - i32.sub - local.tee $4 - i32.sub - i32.shl - end - local.set $2 local.get $5 - if (result i32) - local.get $3 - i32.const 8388607 - i32.and - i32.const 8388608 - i32.or - else - local.get $3 - i32.const 1 - local.get $5 + i32.gt_s + if + local.get $2 local.get $3 - i32.const 9 - i32.shl - i32.clz - i32.sub - local.tee $5 - i32.sub - i32.shl - end - local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i32.gt_s - if + i32.ge_u + if (result i32) local.get $2 local.get $3 - i32.ge_u - if (result i32) - local.get $2 - local.get $3 - i32.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i32.sub - else - local.get $2 + i32.eq + if + local.get $0 + f32.const 0 + f32.mul + return end - i32.const 1 - i32.shl - local.set $2 - local.get $4 - i32.const 1 + local.get $2 + local.get $3 i32.sub - local.set $4 - br $while-continue|0 + else + local.get $2 end + i32.const 1 + i32.shl + local.set $2 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + br $while-continue|0 end + end + local.get $2 + local.get $3 + i32.ge_u + if local.get $2 local.get $3 - i32.ge_u + i32.eq if - local.get $2 - local.get $3 - i32.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i32.sub - local.set $2 + local.get $0 + f32.const 0 + f32.mul + return end local.get $2 + local.get $3 + i32.sub + local.set $2 + end + local.get $2 + local.get $2 + i32.const 8 + i32.shl + i32.clz + local.tee $3 + i32.shl + local.set $2 + local.get $4 + local.get $3 + i32.sub + local.tee $4 + i32.const 0 + i32.gt_s + if (result i32) local.get $2 - i32.const 8 - i32.shl - i32.clz - local.tee $3 + i32.const 8388608 + i32.sub + local.get $4 + i32.const 23 i32.shl - local.set $2 + i32.or + else + local.get $2 + i32.const 1 local.get $4 - local.get $3 i32.sub - local.tee $4 - i32.const 0 - i32.gt_s - if (result i32) - local.get $2 - i32.const 8388608 - i32.sub - local.get $4 - i32.const 23 - i32.shl - i32.or - else - local.get $2 - i32.const 1 - local.get $4 - i32.sub - i32.shr_u - end - local.get $7 - i32.or - f32.reinterpret_i32 - return + i32.shr_u end - local.get $0 - f32.const 0 - f32.mul + local.get $7 + i32.or + f32.reinterpret_i32 ) (func $~lib/math/NativeMath.pow (param $0 f64) (param $1 f64) (result f64) (local $2 f64) diff --git a/tests/compiler/std/math.untouched.wat b/tests/compiler/std/math.untouched.wat index 22a4c8bbc2..271d353465 100644 --- a/tests/compiler/std/math.untouched.wat +++ b/tests/compiler/std/math.untouched.wat @@ -9227,16 +9227,12 @@ local.get $7 i64.le_u if + local.get $0 local.get $9 local.get $7 - i64.eq - if - f64.const 0 - local.get $0 - f64.mul - return - end - local.get $0 + i64.ne + f64.convert_i32_u + f64.mul return end local.get $4 @@ -9252,11 +9248,9 @@ i64.sub local.set $4 local.get $2 - i64.const 0 + i64.const 1 local.get $4 i64.sub - i64.const 1 - i64.add i64.shl local.set $2 else @@ -9286,11 +9280,9 @@ i64.sub local.set $5 local.get $3 - i64.const 0 + i64.const 1 local.get $5 i64.sub - i64.const 1 - i64.add i64.shl local.set $3 else @@ -9405,8 +9397,6 @@ i64.const 63 i64.shl i64.or - local.set $2 - local.get $2 f64.reinterpret_i64 ) (func $std/math/test_mod (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) @@ -9520,16 +9510,12 @@ local.get $7 i32.le_u if + local.get $0 local.get $9 local.get $7 - i32.eq - if - f32.const 0 - local.get $0 - f32.mul - return - end - local.get $0 + i32.ne + f32.convert_i32_u + f32.mul return end local.get $4 @@ -9543,11 +9529,9 @@ i32.sub local.set $4 local.get $2 - i32.const 0 + i32.const 1 local.get $4 i32.sub - i32.const 1 - i32.add i32.shl local.set $2 else @@ -9575,11 +9559,9 @@ i32.sub local.set $5 local.get $3 - i32.const 0 + i32.const 1 local.get $5 i32.sub - i32.const 1 - i32.add i32.shl local.set $3 else @@ -9692,8 +9674,6 @@ local.get $2 local.get $6 i32.or - local.set $2 - local.get $2 f32.reinterpret_i32 ) (func $std/math/test_modf (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) @@ -11753,11 +11733,9 @@ i64.sub local.set $4 local.get $8 - i64.const 0 + i64.const 1 local.get $4 i64.sub - i64.const 1 - i64.add i64.shl local.set $8 else @@ -11787,11 +11765,9 @@ i64.sub local.set $5 local.get $3 - i64.const 0 + i64.const 1 local.get $5 i64.sub - i64.const 1 - i64.add i64.shl local.set $3 else @@ -12075,11 +12051,9 @@ i32.sub local.set $4 local.get $7 - i32.const 0 + i32.const 1 local.get $4 i32.sub - i32.const 1 - i32.add i32.shl local.set $7 else @@ -12107,11 +12081,9 @@ i32.sub local.set $5 local.get $3 - i32.const 0 + i32.const 1 local.get $5 i32.sub - i32.const 1 - i32.add i32.shl local.set $3 else diff --git a/tests/compiler/std/mod.optimized.wat b/tests/compiler/std/mod.optimized.wat index bb2ae1418a..e399f928d3 100644 --- a/tests/compiler/std/mod.optimized.wat +++ b/tests/compiler/std/mod.optimized.wat @@ -77,146 +77,151 @@ f64.div return end - block $folding-inner0 + local.get $2 + i64.const 1 + i64.shl + local.tee $8 + local.get $6 + i64.le_u + if + local.get $0 + local.get $6 + local.get $8 + i64.ne + f64.convert_i32_u + f64.mul + return + end + local.get $4 + i64.eqz + if (result i64) local.get $2 i64.const 1 + local.get $4 + local.get $2 + i64.const 12 i64.shl - local.tee $8 - local.get $6 - i64.le_u - if - local.get $6 - local.get $8 - i64.eq - br_if $folding-inner0 - local.get $0 - return - end + i64.clz + i64.sub + local.tee $4 + i64.sub + i64.shl + else + local.get $2 + i64.const 4503599627370495 + i64.and + i64.const 4503599627370496 + i64.or + end + local.set $2 + local.get $5 + i64.eqz + if (result i64) + local.get $3 + i64.const 1 + local.get $5 + local.get $3 + i64.const 12 + i64.shl + i64.clz + i64.sub + local.tee $5 + i64.sub + i64.shl + else + local.get $3 + i64.const 4503599627370495 + i64.and + i64.const 4503599627370496 + i64.or + end + local.set $3 + loop $while-continue|0 local.get $4 - i64.eqz - if (result i64) - local.get $2 - i64.const 1 - local.get $4 - local.get $2 - i64.const 12 - i64.shl - i64.clz - i64.sub - local.tee $4 - i64.sub - i64.shl - else - local.get $2 - i64.const 4503599627370495 - i64.and - i64.const 4503599627370496 - i64.or - end - local.set $2 local.get $5 - i64.eqz - if (result i64) - local.get $3 - i64.const 1 - local.get $5 - local.get $3 - i64.const 12 - i64.shl - i64.clz - i64.sub - local.tee $5 - i64.sub - i64.shl - else + i64.gt_s + if + local.get $2 local.get $3 - i64.const 4503599627370495 - i64.and - i64.const 4503599627370496 - i64.or - end - local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i64.gt_s - if + i64.ge_u + if (result i64) local.get $2 local.get $3 - i64.ge_u - if (result i64) - local.get $2 - local.get $3 - i64.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i64.sub - else - local.get $2 + i64.eq + if + local.get $0 + f64.const 0 + f64.mul + return end - i64.const 1 - i64.shl - local.set $2 - local.get $4 - i64.const 1 + local.get $2 + local.get $3 i64.sub - local.set $4 - br $while-continue|0 + else + local.get $2 end + i64.const 1 + i64.shl + local.set $2 + local.get $4 + i64.const 1 + i64.sub + local.set $4 + br $while-continue|0 end + end + local.get $2 + local.get $3 + i64.ge_u + if local.get $2 local.get $3 - i64.ge_u + i64.eq if - local.get $2 - local.get $3 - i64.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i64.sub - local.set $2 + local.get $0 + f64.const 0 + f64.mul + return end local.get $2 - local.get $2 - i64.const 11 - i64.shl - i64.clz - local.tee $3 - i64.shl - local.set $2 - local.get $4 local.get $3 i64.sub - local.tee $4 - i64.const 0 - i64.gt_s - if (result i64) - local.get $2 - i64.const 4503599627370496 - i64.sub - local.get $4 - i64.const 52 - i64.shl - i64.or - else - local.get $2 - i64.const 1 - local.get $4 - i64.sub - i64.shr_u - end - local.get $7 - i64.const 63 + local.set $2 + end + local.get $2 + local.get $2 + i64.const 11 + i64.shl + i64.clz + local.tee $3 + i64.shl + local.set $2 + local.get $4 + local.get $3 + i64.sub + local.tee $4 + i64.const 0 + i64.gt_s + if (result i64) + local.get $2 + i64.const 4503599627370496 + i64.sub + local.get $4 + i64.const 52 i64.shl i64.or - f64.reinterpret_i64 - return + else + local.get $2 + i64.const 1 + local.get $4 + i64.sub + i64.shr_u end - local.get $0 - f64.const 0 - f64.mul + local.get $7 + i64.const 63 + i64.shl + i64.or + f64.reinterpret_i64 ) (func $std/mod/check (param $0 f64) (param $1 f64) (result i32) local.get $1 @@ -324,142 +329,147 @@ f32.div return end - block $folding-inner0 + local.get $2 + i32.const 1 + i32.shl + local.tee $8 + local.get $6 + i32.le_u + if + local.get $0 + local.get $6 + local.get $8 + i32.ne + f32.convert_i32_u + f32.mul + return + end + local.get $4 + if (result i32) + local.get $2 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + else local.get $2 i32.const 1 + local.get $4 + local.get $2 + i32.const 9 i32.shl - local.tee $8 - local.get $6 - i32.le_u - if - local.get $6 - local.get $8 - i32.eq - br_if $folding-inner0 - local.get $0 - return - end + i32.clz + i32.sub + local.tee $4 + i32.sub + i32.shl + end + local.set $2 + local.get $5 + if (result i32) + local.get $3 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + else + local.get $3 + i32.const 1 + local.get $5 + local.get $3 + i32.const 9 + i32.shl + i32.clz + i32.sub + local.tee $5 + i32.sub + i32.shl + end + local.set $3 + loop $while-continue|0 local.get $4 - if (result i32) - local.get $2 - i32.const 8388607 - i32.and - i32.const 8388608 - i32.or - else - local.get $2 - i32.const 1 - local.get $4 - local.get $2 - i32.const 9 - i32.shl - i32.clz - i32.sub - local.tee $4 - i32.sub - i32.shl - end - local.set $2 local.get $5 - if (result i32) - local.get $3 - i32.const 8388607 - i32.and - i32.const 8388608 - i32.or - else - local.get $3 - i32.const 1 - local.get $5 + i32.gt_s + if + local.get $2 local.get $3 - i32.const 9 - i32.shl - i32.clz - i32.sub - local.tee $5 - i32.sub - i32.shl - end - local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i32.gt_s - if + i32.ge_u + if (result i32) local.get $2 local.get $3 - i32.ge_u - if (result i32) - local.get $2 - local.get $3 - i32.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i32.sub - else - local.get $2 + i32.eq + if + local.get $0 + f32.const 0 + f32.mul + return end - i32.const 1 - i32.shl - local.set $2 - local.get $4 - i32.const 1 + local.get $2 + local.get $3 i32.sub - local.set $4 - br $while-continue|0 + else + local.get $2 end + i32.const 1 + i32.shl + local.set $2 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + br $while-continue|0 end + end + local.get $2 + local.get $3 + i32.ge_u + if local.get $2 local.get $3 - i32.ge_u + i32.eq if - local.get $2 - local.get $3 - i32.eq - br_if $folding-inner0 - local.get $2 - local.get $3 - i32.sub - local.set $2 + local.get $0 + f32.const 0 + f32.mul + return end local.get $2 + local.get $3 + i32.sub + local.set $2 + end + local.get $2 + local.get $2 + i32.const 8 + i32.shl + i32.clz + local.tee $3 + i32.shl + local.set $2 + local.get $4 + local.get $3 + i32.sub + local.tee $4 + i32.const 0 + i32.gt_s + if (result i32) local.get $2 - i32.const 8 - i32.shl - i32.clz - local.tee $3 + i32.const 8388608 + i32.sub + local.get $4 + i32.const 23 i32.shl - local.set $2 + i32.or + else + local.get $2 + i32.const 1 local.get $4 - local.get $3 i32.sub - local.tee $4 - i32.const 0 - i32.gt_s - if (result i32) - local.get $2 - i32.const 8388608 - i32.sub - local.get $4 - i32.const 23 - i32.shl - i32.or - else - local.get $2 - i32.const 1 - local.get $4 - i32.sub - i32.shr_u - end - local.get $7 - i32.or - f32.reinterpret_i32 - return + i32.shr_u end - local.get $0 - f32.const 0 - f32.mul + local.get $7 + i32.or + f32.reinterpret_i32 ) (func $std/mod/test_fmodf (param $0 f32) (param $1 f32) (param $2 f32) (result i32) block $__inlined_func$std/mod/check (result i32) diff --git a/tests/compiler/std/mod.untouched.wat b/tests/compiler/std/mod.untouched.wat index 3edcfeadf3..5ef26eb943 100644 --- a/tests/compiler/std/mod.untouched.wat +++ b/tests/compiler/std/mod.untouched.wat @@ -101,16 +101,12 @@ local.get $7 i64.le_u if + local.get $0 local.get $9 local.get $7 - i64.eq - if - f64.const 0 - local.get $0 - f64.mul - return - end - local.get $0 + i64.ne + f64.convert_i32_u + f64.mul return end local.get $4 @@ -126,11 +122,9 @@ i64.sub local.set $4 local.get $2 - i64.const 0 + i64.const 1 local.get $4 i64.sub - i64.const 1 - i64.add i64.shl local.set $2 else @@ -160,11 +154,9 @@ i64.sub local.set $5 local.get $3 - i64.const 0 + i64.const 1 local.get $5 i64.sub - i64.const 1 - i64.add i64.shl local.set $3 else @@ -279,8 +271,6 @@ i64.const 63 i64.shl i64.or - local.set $2 - local.get $2 f64.reinterpret_i64 ) (func $std/mod/check (param $0 f64) (param $1 f64) (result i32) @@ -418,16 +408,12 @@ local.get $7 i32.le_u if + local.get $0 local.get $9 local.get $7 - i32.eq - if - f32.const 0 - local.get $0 - f32.mul - return - end - local.get $0 + i32.ne + f32.convert_i32_u + f32.mul return end local.get $4 @@ -441,11 +427,9 @@ i32.sub local.set $4 local.get $2 - i32.const 0 + i32.const 1 local.get $4 i32.sub - i32.const 1 - i32.add i32.shl local.set $2 else @@ -473,11 +457,9 @@ i32.sub local.set $5 local.get $3 - i32.const 0 + i32.const 1 local.get $5 i32.sub - i32.const 1 - i32.add i32.shl local.set $3 else @@ -590,8 +572,6 @@ local.get $2 local.get $6 i32.or - local.set $2 - local.get $2 f32.reinterpret_i32 ) (func $std/mod/check (param $0 f32) (param $1 f32) (result i32) diff --git a/tests/compiler/std/typedarray.optimized.wat b/tests/compiler/std/typedarray.optimized.wat index 2b7d584dfd..c34566198c 100644 --- a/tests/compiler/std/typedarray.optimized.wat +++ b/tests/compiler/std/typedarray.optimized.wat @@ -9616,121 +9616,126 @@ f32.div return end - block $folding-inner0 + local.get $1 + i32.const 1 + i32.shl + local.tee $3 + i32.const -2147483648 + i32.le_u + if + local.get $0 + local.get $3 + i32.const -2147483648 + i32.ne + f32.convert_i32_u + f32.mul + return + end + local.get $2 + if (result i32) + local.get $1 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + else local.get $1 i32.const 1 + local.get $2 + local.get $1 + i32.const 9 i32.shl - local.tee $3 - i32.const -2147483648 - i32.le_u - if - local.get $3 - i32.const -2147483648 - i32.eq - br_if $folding-inner0 - local.get $0 - return - end + i32.clz + i32.sub + local.tee $2 + i32.sub + i32.shl + end + local.set $1 + loop $while-continue|0 local.get $2 - if (result i32) + i32.const 128 + i32.gt_s + if local.get $1 - i32.const 8388607 - i32.and i32.const 8388608 - i32.or - else - local.get $1 - i32.const 1 - local.get $2 - local.get $1 - i32.const 9 - i32.shl - i32.clz - i32.sub - local.tee $2 - i32.sub - i32.shl - end - local.set $1 - loop $while-continue|0 - local.get $2 - i32.const 128 - i32.gt_s - if + i32.ge_u + if (result i32) local.get $1 i32.const 8388608 - i32.ge_u - if (result i32) - local.get $1 - i32.const 8388608 - i32.eq - br_if $folding-inner0 - local.get $1 - i32.const 8388608 - i32.sub - else - local.get $1 + i32.eq + if + local.get $0 + f32.const 0 + f32.mul + return end - i32.const 1 - i32.shl - local.set $1 - local.get $2 - i32.const 1 + local.get $1 + i32.const 8388608 i32.sub - local.set $2 - br $while-continue|0 + else + local.get $1 end + i32.const 1 + i32.shl + local.set $1 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + br $while-continue|0 end + end + local.get $1 + i32.const 8388608 + i32.ge_u + if local.get $1 i32.const 8388608 - i32.ge_u + i32.eq if - local.get $1 - i32.const 8388608 - i32.eq - br_if $folding-inner0 - local.get $1 - i32.const 8388608 - i32.sub - local.set $1 + local.get $0 + f32.const 0 + f32.mul + return end local.get $1 + i32.const 8388608 + i32.sub + local.set $1 + end + local.get $1 + local.get $1 + i32.const 8 + i32.shl + i32.clz + local.tee $3 + i32.shl + local.set $1 + local.get $2 + local.get $3 + i32.sub + local.tee $2 + i32.const 0 + i32.gt_s + if (result i32) local.get $1 - i32.const 8 - i32.shl - i32.clz - local.tee $3 + i32.const 8388608 + i32.sub + local.get $2 + i32.const 23 i32.shl - local.set $1 + i32.or + else + local.get $1 + i32.const 1 local.get $2 - local.get $3 i32.sub - local.tee $2 - i32.const 0 - i32.gt_s - if (result i32) - local.get $1 - i32.const 8388608 - i32.sub - local.get $2 - i32.const 23 - i32.shl - i32.or - else - local.get $1 - i32.const 1 - local.get $2 - i32.sub - i32.shr_u - end - local.get $4 - i32.or - f32.reinterpret_i32 - return + i32.shr_u end - local.get $0 - f32.const 0 - f32.mul + local.get $4 + i32.or + f32.reinterpret_i32 ) (func $std/typedarray/testArrayEvery<~lib/typedarray/Float32Array,f32>~anonymous|0 (param $0 f32) (param $1 i32) (param $2 i32) (result i32) local.get $2 @@ -9838,124 +9843,129 @@ f64.div return end - block $folding-inner0 + local.get $1 + i64.const 1 + i64.shl + local.tee $3 + i64.const -9223372036854775808 + i64.le_u + if + local.get $0 + local.get $3 + i64.const -9223372036854775808 + i64.ne + f64.convert_i32_u + f64.mul + return + end + local.get $2 + i64.eqz + if (result i64) local.get $1 i64.const 1 + local.get $2 + local.get $1 + i64.const 12 i64.shl - local.tee $3 - i64.const -9223372036854775808 - i64.le_u - if - local.get $3 - i64.const -9223372036854775808 - i64.eq - br_if $folding-inner0 - local.get $0 - return - end + i64.clz + i64.sub + local.tee $2 + i64.sub + i64.shl + else + local.get $1 + i64.const 4503599627370495 + i64.and + i64.const 4503599627370496 + i64.or + end + local.set $1 + loop $while-continue|0 local.get $2 - i64.eqz - if (result i64) - local.get $1 - i64.const 1 - local.get $2 - local.get $1 - i64.const 12 - i64.shl - i64.clz - i64.sub - local.tee $2 - i64.sub - i64.shl - else + i64.const 1024 + i64.gt_s + if local.get $1 - i64.const 4503599627370495 - i64.and i64.const 4503599627370496 - i64.or - end - local.set $1 - loop $while-continue|0 - local.get $2 - i64.const 1024 - i64.gt_s - if + i64.ge_u + if (result i64) local.get $1 i64.const 4503599627370496 - i64.ge_u - if (result i64) - local.get $1 - i64.const 4503599627370496 - i64.eq - br_if $folding-inner0 - local.get $1 - i64.const 4503599627370496 - i64.sub - else - local.get $1 + i64.eq + if + local.get $0 + f64.const 0 + f64.mul + return end - i64.const 1 - i64.shl - local.set $1 - local.get $2 - i64.const 1 + local.get $1 + i64.const 4503599627370496 i64.sub - local.set $2 - br $while-continue|0 + else + local.get $1 end + i64.const 1 + i64.shl + local.set $1 + local.get $2 + i64.const 1 + i64.sub + local.set $2 + br $while-continue|0 end + end + local.get $1 + i64.const 4503599627370496 + i64.ge_u + if local.get $1 i64.const 4503599627370496 - i64.ge_u + i64.eq if - local.get $1 - i64.const 4503599627370496 - i64.eq - br_if $folding-inner0 - local.get $1 - i64.const 4503599627370496 - i64.sub - local.set $1 + local.get $0 + f64.const 0 + f64.mul + return end local.get $1 - local.get $1 - i64.const 11 - i64.shl - i64.clz - local.tee $3 - i64.shl + i64.const 4503599627370496 + i64.sub local.set $1 - local.get $2 - local.get $3 + end + local.get $1 + local.get $1 + i64.const 11 + i64.shl + i64.clz + local.tee $3 + i64.shl + local.set $1 + local.get $2 + local.get $3 + i64.sub + local.tee $2 + i64.const 0 + i64.gt_s + if (result i64) + local.get $1 + i64.const 4503599627370496 i64.sub - local.tee $2 - i64.const 0 - i64.gt_s - if (result i64) - local.get $1 - i64.const 4503599627370496 - i64.sub - local.get $2 - i64.const 52 - i64.shl - i64.or - else - local.get $1 - i64.const 1 - local.get $2 - i64.sub - i64.shr_u - end - local.get $4 - i64.const 63 + local.get $2 + i64.const 52 i64.shl i64.or - f64.reinterpret_i64 - return + else + local.get $1 + i64.const 1 + local.get $2 + i64.sub + i64.shr_u end - local.get $0 - f64.const 0 - f64.mul + local.get $4 + i64.const 63 + i64.shl + i64.or + f64.reinterpret_i64 ) (func $std/typedarray/testArrayEvery<~lib/typedarray/Float64Array,f64>~anonymous|0 (param $0 f64) (param $1 i32) (param $2 i32) (result i32) local.get $2 diff --git a/tests/compiler/std/typedarray.untouched.wat b/tests/compiler/std/typedarray.untouched.wat index ddc0bedaf9..329b76adb2 100644 --- a/tests/compiler/std/typedarray.untouched.wat +++ b/tests/compiler/std/typedarray.untouched.wat @@ -19101,16 +19101,12 @@ local.get $7 i32.le_u if + local.get $0 local.get $9 local.get $7 - i32.eq - if - f32.const 0 - local.get $0 - f32.mul - return - end - local.get $0 + i32.ne + f32.convert_i32_u + f32.mul return end local.get $4 @@ -19124,11 +19120,9 @@ i32.sub local.set $4 local.get $2 - i32.const 0 + i32.const 1 local.get $4 i32.sub - i32.const 1 - i32.add i32.shl local.set $2 else @@ -19156,11 +19150,9 @@ i32.sub local.set $5 local.get $3 - i32.const 0 + i32.const 1 local.get $5 i32.sub - i32.const 1 - i32.add i32.shl local.set $3 else @@ -19273,8 +19265,6 @@ local.get $2 local.get $6 i32.or - local.set $2 - local.get $2 f32.reinterpret_i32 ) (func $std/typedarray/testArrayEvery<~lib/typedarray/Float32Array,f32>~anonymous|0 (param $0 f32) (param $1 i32) (param $2 i32) (result i32) @@ -19528,16 +19518,12 @@ local.get $7 i64.le_u if + local.get $0 local.get $9 local.get $7 - i64.eq - if - f64.const 0 - local.get $0 - f64.mul - return - end - local.get $0 + i64.ne + f64.convert_i32_u + f64.mul return end local.get $4 @@ -19553,11 +19539,9 @@ i64.sub local.set $4 local.get $2 - i64.const 0 + i64.const 1 local.get $4 i64.sub - i64.const 1 - i64.add i64.shl local.set $2 else @@ -19587,11 +19571,9 @@ i64.sub local.set $5 local.get $3 - i64.const 0 + i64.const 1 local.get $5 i64.sub - i64.const 1 - i64.add i64.shl local.set $3 else @@ -19706,8 +19688,6 @@ i64.const 63 i64.shl i64.or - local.set $2 - local.get $2 f64.reinterpret_i64 ) (func $std/typedarray/testArrayEvery<~lib/typedarray/Float64Array,f64>~anonymous|0 (param $0 f64) (param $1 i32) (param $2 i32) (result i32)