From 3694076f5a68cc78e9ccd6c67651bc0f761fc94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Tue, 7 Dec 2010 13:57:24 +0100 Subject: Eliminate use of GetArg2() in the i_element instruction Use separate instructions for each register type. --- erts/emulator/beam/beam_emu.c | 48 ++++++++++++++++++++++++++---------------- erts/emulator/beam/beam_load.c | 6 +++--- erts/emulator/beam/ops.tab | 4 +++- 3 files changed, 36 insertions(+), 22 deletions(-) (limited to 'erts') 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 -- cgit v1.2.3