aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorBjörn Gustavsson <bjorn@erlang.org>2010-12-16 08:22:11 +0100
committerBjörn Gustavsson <bjorn@erlang.org>2011-01-17 15:23:47 +0100
commitd8a47b34744be64db10a458991bf340328af8f9c (patch)
tree07291b097e72ea44d3803811cdd3d983352e50f7 /erts
parent51ddd2047c70bce67c8644d85f5d5de72842c320 (diff)
downloadotp-d8a47b34744be64db10a458991bf340328af8f9c.tar.gz
otp-d8a47b34744be64db10a458991bf340328af8f9c.tar.bz2
otp-d8a47b34744be64db10a458991bf340328af8f9c.zip
Introduce a few more variations of the move instructions
Frequency counts show that move Const x(1) move Const x(2) are very common.
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/beam_emu.c11
-rw-r--r--erts/emulator/beam/ops.tab6
2 files changed, 17 insertions, 0 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index edb4d61ed2..16741aa2d7 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -1520,6 +1520,17 @@ void process_main(void)
NextPF(1, next);
}
+ OpCase(move_x1_c): {
+ x(1) = Arg(0);
+ Next(1);
+ }
+
+ OpCase(move_x2_c): {
+ x(2) = Arg(0);
+ Next(1);
+ }
+
+
OpCase(return): {
SET_I(c_p->cp);
/*
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab
index ac63b352ef..e861f97e7a 100644
--- a/erts/emulator/beam/ops.tab
+++ b/erts/emulator/beam/ops.tab
@@ -291,6 +291,12 @@ move X1=x Y1=y | move X2=x Y2=y => move2 X1 Y1 X2 Y2
move Y1=y X1=x | move Y2=y X2=x => move2 Y1 X1 Y2 X2
move X1=x X2=x | move X3=x X4=x => move2 X1 X2 X3 X4
+move C=aiq X=x==1 => move_x1 C
+move C=aiq X=x==2 => move_x2 C
+
+move_x1 c
+move_x2 c
+
%macro: move2 Move2 -pack
move2 x y x y
move2 y x y x