aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/macros.tab
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2017-09-02 14:35:39 +0200
committerBjörn Gustavsson <[email protected]>2017-09-13 12:20:56 +0200
commit8650d6d811bb99490e1a75cbbab684a673a950ba (patch)
tree39924f5d0b31516b7e1d54e0755a6e7cc47c2b78 /erts/emulator/beam/macros.tab
parentbffbd4fb504e9551fc7feb9177ef0a2394c00cae (diff)
downloadotp-8650d6d811bb99490e1a75cbbab684a673a950ba.tar.gz
otp-8650d6d811bb99490e1a75cbbab684a673a950ba.tar.bz2
otp-8650d6d811bb99490e1a75cbbab684a673a950ba.zip
Refactor instructions to support relative jumps
Introduce new macros that can be used for relative jumps and use them consistently. Test that everything works by using a non-zero constant JUMP_OFFSET. The loader subtracts JUMP_OFFSET from loaded labels, and all instructions that use 'f' operands add it back.
Diffstat (limited to 'erts/emulator/beam/macros.tab')
-rw-r--r--erts/emulator/beam/macros.tab19
1 files changed, 17 insertions, 2 deletions
diff --git a/erts/emulator/beam/macros.tab b/erts/emulator/beam/macros.tab
index bac96be7d3..959f7b28df 100644
--- a/erts/emulator/beam/macros.tab
+++ b/erts/emulator/beam/macros.tab
@@ -28,15 +28,30 @@ REFRESH_GEN_DEST() {
dst_ptr = REG_TARGET_PTR(dst);
}
+SET_I_REL(Offset) {
+ ASSERT(VALID_INSTR(* (Eterm *)((BeamInstr *) ($Offset) + JUMP_OFFSET)));
+ I = (BeamInstr *) $Offset + JUMP_OFFSET;
+}
+
+SET_CP_I_ABS(Target) {
+ c_p->i = $Target;
+ ASSERT(VALID_INSTR(* (Eterm *)c_p->i));
+}
+
+SET_REL_I(Dst, Offset) {
+ $Dst = (BeamInstr *) ($Offset) + JUMP_OFFSET;
+ ASSERT(VALID_INSTR(*$Dst));
+}
+
FAIL(Fail) {
//| -no_prefetch
- SET_I((BeamInstr *) $Fail);
+ $SET_I_REL($Fail);
Goto(*I);
}
JUMP(Fail) {
//| -no_next
- SET_I((BeamInstr *) $Fail);
+ $SET_I_REL($Fail);
Goto(*I);
}