aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_emu.c
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2010-11-19 16:46:58 +0100
committerBjörn Gustavsson <[email protected]>2011-01-17 15:23:43 +0100
commit55eef00e9e0331bddd277194509c6094e8306211 (patch)
tree32ce2794284c3a15fa0a3b2a9dc8e6514a64fa86 /erts/emulator/beam/beam_emu.c
parenta24830ce9db4325b51af56262094bb1d32ef4e2b (diff)
downloadotp-55eef00e9e0331bddd277194509c6094e8306211.tar.gz
otp-55eef00e9e0331bddd277194509c6094e8306211.tar.bz2
otp-55eef00e9e0331bddd277194509c6094e8306211.zip
Eliminate use of GetArg1() in the select_val instruction
Instead of having one i_select_val_sfI instruction that uses the GetArg1() macro to fetch the controlling expression, use three separate instructions for each of the register types. That will save one word when selecting on the {x,0} register. It should also be slightly faster since a conditional branch is eliminated. Although it seems that the BEAM compiler will never generate a constant controlling expression (even with optimizations turned off), we still make sure that they will work by evaluating the select_val instruction at load time. Handle the select_tuple_arity instruction in the same way.
Diffstat (limited to 'erts/emulator/beam/beam_emu.c')
-rw-r--r--erts/emulator/beam/beam_emu.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 09f6fc8cef..6cd7fa78e0 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -1865,9 +1865,19 @@ void process_main(void)
{
Eterm select_val;
- OpCase(i_select_tuple_arity_sfI):
- GetArg1(0, select_val);
+ OpCase(i_select_tuple_arity_xfI):
+ select_val = xb(Arg(0));
+ goto do_select_tuple_arity;
+ OpCase(i_select_tuple_arity_yfI):
+ select_val = yb(Arg(0));
+ goto do_select_tuple_arity;
+
+ OpCase(i_select_tuple_arity_rfI):
+ select_val = r(0);
+ I--;
+
+ do_select_tuple_arity:
if (is_tuple(select_val)) {
select_val = *tuple_val(select_val);
goto do_binary_search;
@@ -1875,9 +1885,17 @@ void process_main(void)
SET_I((BeamInstr *) Arg(1));
Goto(*I);
+ OpCase(i_select_val_xfI):
+ select_val = xb(Arg(0));
+ goto do_binary_search;
- OpCase(i_select_val_sfI):
- GetArg1(0, select_val);
+ OpCase(i_select_val_yfI):
+ select_val = yb(Arg(0));
+ goto do_binary_search;
+
+ OpCase(i_select_val_rfI):
+ select_val = r(0);
+ I--;
do_binary_search:
{