aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/ops.tab
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2017-09-13 11:45:38 +0200
committerGitHub <[email protected]>2017-09-13 11:45:38 +0200
commit89c5a525ea9dc47677ef7b68bd5e80fad1cb546e (patch)
tree6ed75b219d0809f5addb096062c471a800aeb838 /erts/emulator/beam/ops.tab
parentedafd99aa0b808b79733dbe6ce3175b593c7b307 (diff)
parentf9a323d10a9f5da305cbdec632d6bdf7ad4770b5 (diff)
downloadotp-89c5a525ea9dc47677ef7b68bd5e80fad1cb546e.tar.gz
otp-89c5a525ea9dc47677ef7b68bd5e80fad1cb546e.tar.bz2
otp-89c5a525ea9dc47677ef7b68bd5e80fad1cb546e.zip
Merge pull request #1544 from michalmuskala/eq-opt
Optimise equality comparisons
Diffstat (limited to 'erts/emulator/beam/ops.tab')
-rw-r--r--erts/emulator/beam/ops.tab17
1 files changed, 13 insertions, 4 deletions
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab
index d64f6f2cfc..992857b099 100644
--- a/erts/emulator/beam/ops.tab
+++ b/erts/emulator/beam/ops.tab
@@ -430,9 +430,18 @@ send
# Optimized comparisons with one immediate/literal operand.
#
-is_eq_exact Lbl R=xy C=ian => i_is_eq_exact_immed Lbl R C
+is_eq_exact Lbl S S =>
+is_eq_exact Lbl C1=c C2=c => move C1 x | is_eq_exact Lbl x C2
+is_eq_exact Lbl C=c R=xy => is_eq_exact Lbl R C
+
+is_eq_exact Lbl R=xy n => is_nil Lbl R
+is_eq_exact Lbl R=xy C=ia => i_is_eq_exact_immed Lbl R C
is_eq_exact Lbl R=xy C=q => i_is_eq_exact_literal Lbl R C
+is_ne_exact Lbl S S => jump Lbl
+is_ne_exact Lbl C1=c C2=c => move C1 x | is_ne_exact Lbl x C2
+is_ne_exact Lbl C=c R=xy => is_ne_exact Lbl R C
+
is_ne_exact Lbl R=xy C=ian => i_is_ne_exact_immed Lbl R C
is_ne_exact Lbl R=xy C=q => i_is_ne_exact_literal Lbl R C
@@ -446,7 +455,9 @@ i_is_ne_exact_literal f xy c
is_eq_exact Lbl Y=y X=x => is_eq_exact Lbl X Y
is_eq_exact f x xy
-is_eq_exact f s s
+is_eq_exact f y y
+
+is_ne_exact f S S
is_lt f x x
is_lt f x c
@@ -462,8 +473,6 @@ is_ge f c x
is_ge f s s
%hot
-is_ne_exact f s s
-
is_eq f s s
is_ne f s s