diff --git a/libguile/jit.c b/libguile/jit.c index 6e9273017..ed95ba5d2 100644 --- a/libguile/jit.c +++ b/libguile/jit.c @@ -1851,38 +1851,8 @@ compile_assert_nargs_le (scm_jit_state *j, uint32_t nlocals) static void compile_alloc_frame (scm_jit_state *j, uint32_t nlocals) { - jit_gpr_t t = T0, saved_frame_size = T1_PRESERVED; - - if (j->frame_size_min != j->frame_size_max) - jit_subr (j->jit, saved_frame_size, FP, SP); - /* This will clear the regalloc, so no need to track clobbers. */ - emit_alloc_frame (j, t, nlocals); - - if (j->frame_size_min == j->frame_size_max) - { - int32_t slots = nlocals - j->frame_size_min; - - if (slots > 0) - { - jit_movi (j->jit, t, SCM_UNPACK (SCM_UNDEFINED)); - while (slots-- > 0) - emit_sp_set_scm (j, slots, t); - } - } - else - { - jit_gpr_t walk = saved_frame_size; - - jit_subr (j->jit, walk, FP, saved_frame_size); - jit_reloc_t k = jit_bler (j->jit, walk, SP); - jit_movi (j->jit, t, SCM_UNPACK (SCM_UNDEFINED)); - void *head = jit_address (j->jit); - jit_subi (j->jit, walk, walk, sizeof (union scm_vm_stack_element)); - jit_str (j->jit, walk, t); - jit_patch_there (j->jit, jit_bner (j->jit, walk, SP), head); - jit_patch_here (j->jit, k); - } + emit_alloc_frame (j, T0, nlocals); j->frame_size_min = j->frame_size_max = nlocals; } @@ -2007,7 +1977,7 @@ compile_bind_rest (scm_jit_state *j, uint32_t dst) cons = emit_branch_if_frame_locals_count_greater_than (j, t, dst); - compile_alloc_frame (j, dst + 1); + emit_alloc_frame (j, t, dst + 1); emit_movi (j, t, SCM_UNPACK (SCM_EOL)); emit_sp_set_scm (j, 0, t); k = jit_jmp (j->jit); diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index a2e4be57a..5596dab02 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -649,8 +649,6 @@ VM_NAME (scm_thread *thread) VM_ASSERT (FRAME_LOCALS_COUNT () == expected, CALL_INTRINSIC (error_wrong_num_args, (thread))); ALLOC_FRAME (expected + nlocals); - while (nlocals--) - SP_SET (nlocals, SCM_UNDEFINED); NEXT (1); } @@ -773,53 +771,44 @@ VM_NAME (scm_thread *thread) VM_DEFINE_OP (17, bind_rest, "bind-rest", DOP1 (X8_F24)) { uint32_t dst, nargs; - SCM rest = SCM_EOL; UNPACK_24 (op, dst); nargs = FRAME_LOCALS_COUNT (); if (nargs <= dst) { + VM_ASSERT (nargs == dst, abort ()); ALLOC_FRAME (dst + 1); - while (nargs < dst) - FP_SET (nargs++, SCM_UNDEFINED); + SP_SET (0, SCM_EOL); } else { SYNC_IP (); - rest = CALL_INTRINSIC (cons_rest, (thread, dst)); + SCM rest = CALL_INTRINSIC (cons_rest, (thread, dst)); RESET_FRAME (dst + 1); + SP_SET (0, rest); } - FP_SET (dst, rest); - NEXT (1); } /* alloc-frame nlocals:24 * * Ensure that there is space on the stack for NLOCALS local variables. - * setting any new stack slots to SCM_UNDEFINED. */ VM_DEFINE_OP (18, alloc_frame, "alloc-frame", OP1 (X8_C24)) { - uint32_t nlocals, nargs; + uint32_t nlocals; UNPACK_24 (op, nlocals); - - nargs = FRAME_LOCALS_COUNT (); ALLOC_FRAME (nlocals); - while (nlocals-- > nargs) - FP_SET (nlocals, SCM_UNDEFINED); - NEXT (1); } /* reset-frame nlocals:24 * - * Like alloc-frame, but doesn't check that the stack is big enough, - * and doesn't reset stack slots to SCM_UNDEFINED. Used to reset the - * frame size to something less than the size that was previously set - * via alloc-frame. + * Like alloc-frame, but doesn't check that the stack is big enough. + * Used to reset the frame size to something less than the size that + * was previously set via alloc-frame. */ VM_DEFINE_OP (19, reset_frame, "reset-frame", OP1 (X8_C24)) {