[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 03/06: VM does not initialize stack frames
From: |
Andy Wingo |
Subject: |
[Guile-commits] 03/06: VM does not initialize stack frames |
Date: |
Fri, 7 Jun 2019 11:06:13 -0400 (EDT) |
wingo pushed a commit to branch master
in repository guile.
commit f07fadc72e148d13bb4b42a3d9ecde6ab7a2296c
Author: Andy Wingo <address@hidden>
Date: Thu Jun 6 17:39:53 2019 +0200
VM does not initialize stack frames
* libguile/jit.c (compile_alloc_frame): Stop initializing locals.
(compile_bind_rest): Use emit_alloc_frame.
* libguile/vm-engine.c (assert_nargs_ee_locals, allocate_frame): Don't
initialize locals.
(bind_rest): Don't initialize locals, and assert that the locals count
has a minimum.
---
libguile/jit.c | 34 ++--------------------------------
libguile/vm-engine.c | 27 ++++++++-------------------
2 files changed, 10 insertions(+), 51 deletions(-)
diff --git a/libguile/jit.c b/libguile/jit.c
index 6e92730..ed95ba5 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 a2e4be5..5596dab 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))
{
- [Guile-commits] branch master updated (12d6e43 -> 3bbdf22), Andy Wingo, 2019/06/07
- [Guile-commits] 03/06: VM does not initialize stack frames,
Andy Wingo <=
- [Guile-commits] 01/06: Add bind-optionals instruction, Andy Wingo, 2019/06/07
- [Guile-commits] 02/06: Allow for bind-optionals without alloc-frame, Andy Wingo, 2019/06/07
- [Guile-commits] 05/06: Add support no closure in $callk, Andy Wingo, 2019/06/07
- [Guile-commits] 04/06: Add compiler support for eliding closure bindings, Andy Wingo, 2019/06/07
- [Guile-commits] 06/06: Enable closure elision., Andy Wingo, 2019/06/07