summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/passes/optimize-instructions_all-features.txt83
-rw-r--r--test/passes/optimize-instructions_all-features.wast81
2 files changed, 155 insertions, 9 deletions
diff --git a/test/passes/optimize-instructions_all-features.txt b/test/passes/optimize-instructions_all-features.txt
index ee6b1162a..272cce240 100644
--- a/test/passes/optimize-instructions_all-features.txt
+++ b/test/passes/optimize-instructions_all-features.txt
@@ -2737,13 +2737,25 @@
)
(unreachable)
)
- (func $srem-by-1 (param $x i32) (param $y i64)
+ (func $srem-by-const (param $x i32) (param $y i64)
(drop
(i32.const 0)
)
(drop
(i64.const 0)
)
+ (drop
+ (i32.and
+ (local.get $x)
+ (i32.const 2147483647)
+ )
+ )
+ (drop
+ (i64.and
+ (local.get $y)
+ (i64.const 9223372036854775807)
+ )
+ )
)
(func $srem-by-pot-eq-ne-zero (param $x i32) (param $y i64)
(drop
@@ -2774,11 +2786,43 @@
(i64.eqz
(i64.and
(local.get $y)
+ (i64.const 3)
+ )
+ )
+ )
+ (drop
+ (i32.eqz
+ (i32.and
+ (local.get $x)
+ (i32.const 3)
+ )
+ )
+ )
+ (drop
+ (i64.eqz
+ (i64.and
+ (local.get $y)
(i64.const 1)
)
)
)
(drop
+ (i32.eqz
+ (i32.and
+ (local.get $x)
+ (i32.const 3)
+ )
+ )
+ )
+ (drop
+ (i64.eqz
+ (i64.and
+ (local.get $y)
+ (i64.const 3)
+ )
+ )
+ )
+ (drop
(i32.ne
(i32.and
(local.get $x)
@@ -2797,17 +2841,48 @@
)
(drop
(i32.eqz
- (i32.rem_s
+ (i32.const 0)
+ )
+ )
+ (drop
+ (i32.eqz
+ (i32.and
(local.get $x)
- (i32.const 3)
+ (i32.const 2147483647)
+ )
+ )
+ )
+ (drop
+ (i32.ne
+ (i32.and
+ (local.get $x)
+ (i32.const 2147483647)
+ )
+ (i32.const 0)
+ )
+ )
+ (drop
+ (i64.eqz
+ (i64.and
+ (local.get $y)
+ (i64.const 9223372036854775807)
)
)
)
(drop
+ (i64.ne
+ (i64.and
+ (local.get $y)
+ (i64.const 9223372036854775807)
+ )
+ (i64.const 0)
+ )
+ )
+ (drop
(i32.eqz
(i32.rem_s
(local.get $x)
- (i32.const -4)
+ (i32.const 3)
)
)
)
diff --git a/test/passes/optimize-instructions_all-features.wast b/test/passes/optimize-instructions_all-features.wast
index 71646de93..05e0e37c3 100644
--- a/test/passes/optimize-instructions_all-features.wast
+++ b/test/passes/optimize-instructions_all-features.wast
@@ -3093,7 +3093,7 @@
)
(unreachable)
)
- (func $srem-by-1 (param $x i32) (param $y i64)
+ (func $srem-by-const (param $x i32) (param $y i64)
;; (signed)x % 1
(drop (i32.rem_s
(local.get $x)
@@ -3103,6 +3103,16 @@
(local.get $y)
(i64.const 1)
))
+ ;; (signed)x % 0x80000000 -> x & 0x7FFFFFFF
+ (drop (i32.rem_s
+ (local.get $x)
+ (i32.const 0x80000000)
+ ))
+ ;; (signed)x % 0x8000000000000000 -> x & 0x7FFFFFFFFFFFFFFF
+ (drop (i64.rem_s
+ (local.get $y)
+ (i64.const 0x8000000000000000)
+ ))
)
(func $srem-by-pot-eq-ne-zero (param $x i32) (param $y i64)
;; eqz((signed)x % 4)
@@ -3118,6 +3128,19 @@
(i64.const 4)
)
))
+ ;; eqz((signed)x % -4)
+ (drop (i32.eqz
+ (i32.rem_s
+ (local.get $x)
+ (i32.const -4)
+ )
+ ))
+ (drop (i64.eqz
+ (i64.rem_s
+ (local.get $y)
+ (i64.const -4)
+ )
+ ))
;; (signed)x % 4 == 0
(drop (i32.eq
(i32.rem_s
@@ -3133,7 +3156,22 @@
)
(i64.const 0)
))
- ;; ;; (signed)x % 2 != 0
+ ;; (signed)x % -4 == 0
+ (drop (i32.eq
+ (i32.rem_s
+ (local.get $x)
+ (i32.const -4)
+ )
+ (i32.const 0)
+ ))
+ (drop (i64.eq
+ (i64.rem_s
+ (local.get $y)
+ (i64.const -4)
+ )
+ (i64.const 0)
+ ))
+ ;; (signed)x % 2 != 0
(drop (i32.ne
(i32.rem_s
(local.get $x)
@@ -3148,18 +3186,51 @@
)
(i64.const 0)
))
- ;; ;;
+ ;; (signed)x % -1 == 0 -> 0 == 0
(drop (i32.eq
(i32.rem_s
(local.get $x)
- (i32.const 3) ;; skip
+ (i32.const -1)
+ )
+ (i32.const 0)
+ ))
+ ;; (signed)x % 0x80000000 == 0
+ (drop (i32.eq
+ (i32.rem_s
+ (local.get $x)
+ (i32.const 0x80000000)
+ )
+ (i32.const 0)
+ ))
+ ;; (signed)x % 0x80000000 != 0
+ (drop (i32.ne
+ (i32.rem_s
+ (local.get $x)
+ (i32.const 0x80000000)
)
(i32.const 0)
))
+ ;; (signed)x % 0x8000000000000000 == 0
+ (drop (i64.eq
+ (i64.rem_s
+ (local.get $y)
+ (i64.const 0x8000000000000000)
+ )
+ (i64.const 0)
+ ))
+ ;; (signed)x % 0x8000000000000000 != 0
+ (drop (i64.ne
+ (i64.rem_s
+ (local.get $y)
+ (i64.const 0x8000000000000000)
+ )
+ (i64.const 0)
+ ))
+ ;;
(drop (i32.eq
(i32.rem_s
(local.get $x)
- (i32.const -4) ;; skip
+ (i32.const 3) ;; skip
)
(i32.const 0)
))