Commit c39093d8 authored by Damien George's avatar Damien George
Browse files

py: In native ARM emitter, load r7 with table earlier in func prelude.

r7 may be needed to set up code state, so it must be loaded before the
set-up function is called.
parent 94ef8879
...@@ -693,6 +693,13 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop ...@@ -693,6 +693,13 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
} }
ASM_ENTRY(emit->as, num_locals); ASM_ENTRY(emit->as, num_locals);
// TODO don't load r7 if we don't need it
#if N_THUMB
asm_thumb_mov_reg_i32(emit->as, ASM_THUMB_REG_R7, (mp_uint_t)mp_fun_table);
#elif N_ARM
asm_arm_mov_reg_i32(emit->as, ASM_ARM_REG_R7, (mp_uint_t)mp_fun_table);
#endif
#if N_X86 #if N_X86
for (int i = 0; i < scope->num_pos_args; i++) { for (int i = 0; i < scope->num_pos_args; i++) {
if (i == 0) { if (i == 0) {
...@@ -730,6 +737,13 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop ...@@ -730,6 +737,13 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
// allocate space on C-stack for code_state structure, which includes state // allocate space on C-stack for code_state structure, which includes state
ASM_ENTRY(emit->as, STATE_START + emit->n_state); ASM_ENTRY(emit->as, STATE_START + emit->n_state);
// TODO don't load r7 if we don't need it
#if N_THUMB
asm_thumb_mov_reg_i32(emit->as, ASM_THUMB_REG_R7, (mp_uint_t)mp_fun_table);
#elif N_ARM
asm_arm_mov_reg_i32(emit->as, ASM_ARM_REG_R7, (mp_uint_t)mp_fun_table);
#endif
// prepare incoming arguments for call to mp_setup_code_state // prepare incoming arguments for call to mp_setup_code_state
#if N_X86 #if N_X86
asm_x86_mov_arg_to_r32(emit->as, 0, REG_ARG_2); asm_x86_mov_arg_to_r32(emit->as, 0, REG_ARG_2);
...@@ -796,15 +810,6 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop ...@@ -796,15 +810,6 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
} }
} }
#if N_THUMB
// TODO don't load r7 if we don't need it
asm_thumb_mov_reg_i32(emit->as, ASM_THUMB_REG_R7, (mp_uint_t)mp_fun_table);
#endif
#if N_ARM
// TODO don't load r7 if we don't need it
asm_arm_mov_reg_i32(emit->as, ASM_ARM_REG_R7, (mp_uint_t)mp_fun_table);
#endif
} }
STATIC void emit_native_end_pass(emit_t *emit) { STATIC void emit_native_end_pass(emit_t *emit) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment