diff options
author | Björn Gustavsson <[email protected]> | 2017-09-02 14:35:39 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2017-09-13 12:20:56 +0200 |
commit | 8650d6d811bb99490e1a75cbbab684a673a950ba (patch) | |
tree | 39924f5d0b31516b7e1d54e0755a6e7cc47c2b78 /erts/emulator/beam/macros.tab | |
parent | bffbd4fb504e9551fc7feb9177ef0a2394c00cae (diff) | |
download | otp-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.tab | 19 |
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); } |