From 985524704ddd62cf85385a323861377608d66c9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Fri, 15 Sep 2017 12:29:58 +0200
Subject: Optimize instruction prefetch

---
 erts/emulator/beam/beam_emu.c    | 2 ++
 erts/emulator/utils/beam_makeops | 4 ++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 73c4e3532b..aa94fbf536 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -52,11 +52,13 @@
 #  define CountCase(OpCode) case op_count_##OpCode
 #  define IsOpCode(InstrWord, OpCode)  (BeamCodeAddr(InstrWord) == (BeamInstr)op_##OpCode)
 #  define Goto(Rel)         {Go = BeamCodeAddr(Rel); goto emulator_loop;}
+#  define GotoPF(Rel)       Goto(Rel)
 #else
 #  define OpCase(OpCode)    lb_##OpCode
 #  define CountCase(OpCode) lb_count_##OpCode
 #  define IsOpCode(InstrWord, OpCode)  (BeamCodeAddr(InstrWord) == (BeamInstr)&&lb_##OpCode)
 #  define Goto(Rel)         goto *((void *)BeamCodeAddr(Rel))
+#  define GotoPF(Rel)       goto *((void *)Rel)
 #  define LabelAddr(Label)  &&Label
 #endif
 
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops
index 388e3d164d..322d60b00e 100755
--- a/erts/emulator/utils/beam_makeops
+++ b/erts/emulator/utils/beam_makeops
@@ -1452,10 +1452,10 @@ sub code_gen {
             "ASSERT(VALID_INSTR(*I));\n" .
             "Goto(*I);";
     } else {
-        $var_decls .= "BeamInstr next_pf = I[$instr_offset];\n";
+        $var_decls .= "BeamInstr next_pf = BeamCodeAddr(I[$instr_offset]);\n";
         $dispatch_next = "\nI += $instr_offset;\n" .
             "ASSERT(VALID_INSTR(next_pf));\n" .
-            "Goto(next_pf);";
+            "GotoPF(next_pf);";
     }
 
     #
-- 
cgit v1.2.3