diff options
author | Max Graey <maxgraey@gmail.com> | 2020-10-21 22:43:30 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-21 12:43:30 -0700 |
commit | a2fa37eb94fdd6896f4d90f22e34fbd5f028d742 (patch) | |
tree | 1c5a934bebac2668f38dd1c138b04834487d015c /test/passes/optimize-instructions_all-features.wast | |
parent | dc5638879350e7186ea79aa5199606ad570fa0c3 (diff) | |
download | binaryen-a2fa37eb94fdd6896f4d90f22e34fbd5f028d742.tar.gz binaryen-a2fa37eb94fdd6896f4d90f22e34fbd5f028d742.tar.bz2 binaryen-a2fa37eb94fdd6896f4d90f22e34fbd5f028d742.zip |
Add float simplifications for absolute binary expressions (#3013)
Diffstat (limited to 'test/passes/optimize-instructions_all-features.wast')
-rw-r--r-- | test/passes/optimize-instructions_all-features.wast | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/test/passes/optimize-instructions_all-features.wast b/test/passes/optimize-instructions_all-features.wast index 60ae8d3c2..e989fda45 100644 --- a/test/passes/optimize-instructions_all-features.wast +++ b/test/passes/optimize-instructions_all-features.wast @@ -5361,6 +5361,132 @@ ) ) ) + (func $optimize-float-points (param $x0 f64) (param $x1 f64) (param $y0 f32) (param $y1 f32) + ;; abs(x) * abs(x) ==> x * x + (drop (f64.mul + (f64.abs (local.get $x0)) + (f64.abs (local.get $x0)) + )) + (drop (f32.mul + (f32.abs (local.get $y0)) + (f32.abs (local.get $y0)) + )) + (drop (f64.mul + (f64.abs (f64.add (local.get $x0) (local.get $x1))) + (f64.abs (f64.add (local.get $x0) (local.get $x1))) + )) + + ;; abs(x) * abs(y) ==> abs(x * y) + (drop (f64.mul + (f64.abs (local.get $x0)) + (f64.abs (local.get $x1)) + )) + (drop (f32.mul + (f32.abs (local.get $y1)) + (f32.abs (local.get $y0)) + )) + + (drop (f64.mul + (f64.abs (local.get $x0)) + (f64.abs (f64.const 0)) ;; skip + )) + (drop (f32.mul + (f32.abs (f32.const 0)) ;; skip + (f32.abs (local.get $y0)) + )) + (drop (f64.mul + (f64.abs (f64.add (local.get $x0) (local.get $x1))) + (f64.abs (f64.add (local.get $x0) (local.get $x0))) + )) + + + ;; abs(-x) ==> abs(x) + (drop (f64.abs + (f64.neg (local.get $x0)) + )) + (drop (f32.abs + (f32.neg (local.get $y0)) + )) + + ;; abs(0 - x) ==> skip for non-fast math + (drop (f64.abs + (f64.sub + (f64.const 0) + (local.get $x0) + ) + )) + (drop (f32.abs + (f32.sub + (f32.const 0) + (local.get $y0) + ) + )) + + ;; abs(x) / abs(x) ==> x / x + (drop (f64.div + (f64.abs (local.get $x0)) + (f64.abs (local.get $x0)) + )) + (drop (f32.div + (f32.abs (local.get $y0)) + (f32.abs (local.get $y0)) + )) + (drop (f64.div + (f64.abs (f64.add (local.get $x0) (local.get $x1))) + (f64.abs (f64.add (local.get $x0) (local.get $x1))) + )) + + ;; abs(x) / abs(y) ==> abs(x / y) + (drop (f64.div + (f64.abs (local.get $x0)) + (f64.abs (local.get $x1)) + )) + (drop (f32.div + (f32.abs (local.get $y1)) + (f32.abs (local.get $y0)) + )) + + ;; abs(x * x) ==> x * x + (drop (f64.abs + (f64.mul + (local.get $x0) + (local.get $x0) + ) + )) + (drop (f32.abs + (f32.mul + (local.get $y0) + (local.get $y0) + ) + )) + + ;; abs(x / x) ==> x / x + (drop (f64.abs + (f64.div + (local.get $x0) + (local.get $x0) + ) + )) + (drop (f32.abs + (f32.div + (local.get $y0) + (local.get $y0) + ) + )) + + (drop (f64.div + (f64.abs (local.get $x0)) + (f64.abs (f64.const 0)) ;; skip + )) + (drop (f32.div + (f32.abs (f32.const 0)) ;; skip + (f32.abs (local.get $y0)) + )) + (drop (f64.div + (f64.abs (f64.add (local.get $x0) (local.get $x1))) + (f64.abs (f64.add (local.get $x0) (local.get $x0))) + )) + ) ) (module (import "env" "memory" (memory $0 (shared 256 256))) |