aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2017-09-15 12:29:58 +0200
committerBjörn Gustavsson <[email protected]>2017-10-05 12:37:57 +0200
commit985524704ddd62cf85385a323861377608d66c9c (patch)
treeae1deb50e492837ee0ca8837b4dff2447d6a9301 /erts
parentf88bd45a2c76f84a16b004922945579898cc35ac (diff)
downloadotp-985524704ddd62cf85385a323861377608d66c9c.tar.gz
otp-985524704ddd62cf85385a323861377608d66c9c.tar.bz2
otp-985524704ddd62cf85385a323861377608d66c9c.zip
Optimize instruction prefetch
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/beam_emu.c2
-rwxr-xr-xerts/emulator/utils/beam_makeops4
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);";
}
#