From 5cf1e739a5599943c1ac1d40d0577f83f5e0e62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Thu, 9 Dec 2010 20:57:27 +0100 Subject: Eliminate use of GetArg1() in the badmatch and case_end instructions Create separate instructions for each register type. The "badmatch x(0)" and "case_end x(0)" (which are very common) will only require a single word each, compared to two words when GetArg1() is used. --- erts/emulator/beam/beam_emu.c | 30 ++++++++++++++++++++++++++---- erts/emulator/beam/ops.tab | 14 ++++++++++---- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index fdb7d86c78..ea813ef09f 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -3040,10 +3040,21 @@ void process_main(void) goto find_func_info; } - OpCase(badmatch_s): { + { Eterm badmatch_val; - GetArg1(0, badmatch_val); + OpCase(badmatch_y): + badmatch_val = yb(Arg(0)); + goto do_badmatch; + + OpCase(badmatch_x): + badmatch_val = xb(Arg(0)); + goto do_badmatch; + + OpCase(badmatch_r): + badmatch_val = r(0); + + do_badmatch: c_p->fvalue = badmatch_val; c_p->freason = BADMATCH; } @@ -3244,11 +3255,22 @@ void process_main(void) StoreBifResult(1, result); } - OpCase(case_end_s): { Eterm case_end_val; - GetArg1(0, case_end_val); + OpCase(case_end_x): + case_end_val = xb(Arg(0)); + goto do_case_end; + + OpCase(case_end_y): + case_end_val = yb(Arg(0)); + goto do_case_end; + + OpCase(case_end_r): + case_end_val = r(0); + I--; + + do_case_end: c_p->fvalue = case_end_val; c_p->freason = EXC_CASE_CLAUSE; goto find_func_info; diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab index edc44f966b..c10b3e8d52 100644 --- a/erts/emulator/beam/ops.tab +++ b/erts/emulator/beam/ops.tab @@ -250,11 +250,17 @@ is_number Fail Literal=q => move Literal x | is_number Fail x jump f -case_end Literal=q => move Literal x | case_end x -badmatch Literal=q => move Literal x | badmatch x +case_end Literal=cq => move Literal x | case_end x +badmatch Literal=cq => move Literal x | badmatch x + +case_end r +case_end x +case_end y + +badmatch r +badmatch x +badmatch y -case_end s -badmatch s if_end raise s s -- cgit v1.2.3