summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/emitnative.c16
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) {