diff options
author | Björn Gustavsson <[email protected]> | 2010-12-07 13:57:24 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2011-01-17 15:23:44 +0100 |
commit | 3694076f5a68cc78e9ccd6c67651bc0f761fc94f (patch) | |
tree | 4cbb16a21177e908eecd3151d421214ee77ae46f | |
parent | ec2fcc7aefec2f4ede4f789098f5093cd2fe00b2 (diff) | |
download | otp-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.c | 48 | ||||
-rw-r--r-- | erts/emulator/beam/beam_load.c | 6 | ||||
-rw-r--r-- | erts/emulator/beam/ops.tab | 4 |
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 |