diff options
author | Damien George <damien.p.george@gmail.com> | 2018-10-13 12:57:32 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2018-10-13 15:16:33 +1100 |
commit | 8e4b4bac7079caafbe40646b9303dc9e3ce23fbc (patch) | |
tree | 11bc88c0088d8fc5350c8b223955bbc490496167 /py/emitnative.c | |
parent | 8941c632909bbe51fb854065fbbd58458426a3cf (diff) |
py/asmx64: Change indirect calls to load fun ptr from the native table.
Instead of storing the function pointer directly in the assembly code.
This makes the generated code more independent of the runtime (so easier to
relocate the code), and reduces the generated code size.
Diffstat (limited to 'py/emitnative.c')
-rw-r--r-- | py/emitnative.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/py/emitnative.c b/py/emitnative.c index 1abdb6792..81669af7c 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -379,6 +379,8 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop asm_arm_mov_reg_i32(emit->as, ASM_ARM_REG_R7, (mp_uint_t)mp_fun_table); #elif N_XTENSA ASM_MOV_REG_IMM(emit->as, ASM_XTENSA_REG_A15, (uint32_t)mp_fun_table); + #elif N_X64 + asm_x64_mov_i64_to_r64_optimised(emit->as, (intptr_t)mp_fun_table, ASM_X64_REG_RBP); #endif // Store function object (passed as first arg) to stack if needed @@ -469,6 +471,8 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop asm_arm_mov_reg_i32(emit->as, ASM_ARM_REG_R7, (mp_uint_t)mp_fun_table); #elif N_XTENSA ASM_MOV_REG_IMM(emit->as, ASM_XTENSA_REG_A15, (uint32_t)mp_fun_table); + #elif N_X64 + asm_x64_mov_i64_to_r64_optimised(emit->as, (intptr_t)mp_fun_table, ASM_X64_REG_RBP); #endif if (!(emit->scope->scope_flags & MP_SCOPE_FLAG_GENERATOR)) { |