diff options
author | Damien George <damien@micropython.org> | 2021-07-17 23:18:40 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2021-07-19 23:18:13 +1000 |
commit | d0227d5862ce57ec064563febf5b644cb39d2c07 (patch) | |
tree | e9478515c48b0fad2b5b179c81ab30aebb76b3cd /py | |
parent | cc77b306396ce7979baaac69b5d7abef7da29110 (diff) |
py/emitnative: Reuse need_reg_all func in need_stack_settled.
To reduce code size and code duplication.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py')
-rw-r--r-- | py/emitnative.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/py/emitnative.c b/py/emitnative.c index 425ba2d33..a40d690f2 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -841,10 +841,13 @@ STATIC void need_reg_single(emit_t *emit, int reg_needed, int skip_stack_pos) { } } +// Ensures all unsettled registers that hold Python values are copied to the +// concrete Python stack. All registers are then free to use. STATIC void need_reg_all(emit_t *emit) { for (int i = 0; i < emit->stack_size; i++) { stack_info_t *si = &emit->stack_info[i]; if (si->kind == STACK_REG) { + DEBUG_printf(" reg(%u) to local(%u)\n", si->data.u_reg, emit->stack_start + i); si->kind = STACK_VALUE; emit_native_mov_state_reg(emit, emit->stack_start + i, si->data.u_reg); } @@ -871,16 +874,13 @@ STATIC vtype_kind_t load_reg_stack_imm(emit_t *emit, int reg_dest, const stack_i } } +// Copies all unsettled registers and immediates that are Python values into the +// concrete Python stack. This ensures the concrete Python stack holds valid +// values for the current stack_size. +// This function may clobber REG_TEMP0. STATIC void need_stack_settled(emit_t *emit) { DEBUG_printf(" need_stack_settled; stack_size=%d\n", emit->stack_size); - for (int i = 0; i < emit->stack_size; i++) { - stack_info_t *si = &emit->stack_info[i]; - if (si->kind == STACK_REG) { - DEBUG_printf(" reg(%u) to local(%u)\n", si->data.u_reg, emit->stack_start + i); - si->kind = STACK_VALUE; - emit_native_mov_state_reg(emit, emit->stack_start + i, si->data.u_reg); - } - } + need_reg_all(emit); for (int i = 0; i < emit->stack_size; i++) { stack_info_t *si = &emit->stack_info[i]; if (si->kind == STACK_IMM) { |