aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2010-12-07 13:57:24 +0100
committerBjörn Gustavsson <[email protected]>2011-01-17 15:23:44 +0100
commit3694076f5a68cc78e9ccd6c67651bc0f761fc94f (patch)
tree4cbb16a21177e908eecd3151d421214ee77ae46f
parentec2fcc7aefec2f4ede4f789098f5093cd2fe00b2 (diff)
downloadotp-3694076f5a68cc78e9ccd6c67651bc0f761fc94f.tar.gz
otp-3694076f5a68cc78e9ccd6c67651bc0f761fc94f.tar.bz2
otp-3694076f5a68cc78e9ccd6c67651bc0f761fc94f.zip
Eliminate use of GetArg2() in the i_element instruction
Use separate instructions for each register type.
-rw-r--r--erts/emulator/beam/beam_emu.c48
-rw-r--r--erts/emulator/beam/beam_load.c6
-rw-r--r--erts/emulator/beam/ops.tab4
3 files changed, 36 insertions, 22 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index bdc730e6c1..fdb7d86c78 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -1467,24 +1467,36 @@ void process_main(void)
goto find_func_info;
}
- OpCase(i_element_jssd): {
- Eterm index;
- Eterm tuple;
-
- /*
- * Inlined version of element/2 for speed.
- */
- GetArg2(1, index, tuple);
- if (is_small(index) && is_tuple(tuple)) {
- Eterm* tp = tuple_val(tuple);
-
- if ((signed_val(index) >= 1) &&
- (signed_val(index) <= arityval(*tp))) {
- Eterm result = tp[signed_val(index)];
- StoreBifResult(3, result);
- }
- }
- }
+ {
+ Eterm element_index;
+ Eterm element_tuple;
+
+ OpCase(i_element_xjsd):
+ element_tuple = xb(Arg(0));
+ I++;
+ goto do_element;
+
+ OpCase(i_element_yjsd):
+ element_tuple = yb(Arg(0));
+ I++;
+ goto do_element;
+
+ OpCase(i_element_rjsd):
+ element_tuple = r(0);
+ /* Fall through */
+
+ do_element:
+ GetArg1(1, element_index);
+ if (is_small(element_index) && is_tuple(element_tuple)) {
+ Eterm* tp = tuple_val(element_tuple);
+
+ if ((signed_val(element_index) >= 1) &&
+ (signed_val(element_index) <= arityval(*tp))) {
+ Eterm result = tp[signed_val(element_index)];
+ StoreBifResult(2, result);
+ }
+ }
+ }
/* Fall through */
OpCase(badarg_j):
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c
index 4233e26f54..02aef95a52 100644
--- a/erts/emulator/beam/beam_load.c
+++ b/erts/emulator/beam/beam_load.c
@@ -2321,9 +2321,9 @@ gen_element(LoaderState* stp, GenOpArg Fail, GenOpArg Index,
op->a[3] = Dst;
} else {
op->op = genop_i_element_4;
- op->a[0] = Fail;
- op->a[1] = Index;
- op->a[2] = Tuple;
+ op->a[0] = Tuple;
+ op->a[1] = Fail;
+ op->a[2] = Index;
op->a[3] = Dst;
}
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab
index 491f8f1d90..edc44f966b 100644
--- a/erts/emulator/beam/ops.tab
+++ b/erts/emulator/beam/ops.tab
@@ -924,7 +924,9 @@ i_fast_element r j I d
i_fast_element x j I d
i_fast_element y j I d
-i_element j s s d
+i_element r j s d
+i_element x j s d
+i_element y j s d
bif1 f b s d
bif1_body b s d