summaryrefslogtreecommitdiff
path: root/libguile/jit.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-06-06 16:20:20 +0200
committerAndy Wingo <wingo@pobox.com>2019-06-06 16:36:32 +0200
commit9fd978ed7eebe32ceff7762eb87bba5d56a0743c (patch)
treee2b7e28c42924c1c5aced9f56cdbdec525c5146c /libguile/jit.c
parent12d6e4317657e4334306b1345a09a11b0e256fa3 (diff)
downloadguile-9fd978ed7eebe32ceff7762eb87bba5d56a0743c.tar.gz
Add bind-optionals instruction
* doc/ref/vm.texi (Function Prologue Instructions): Document new instruction. * libguile/jit.c (compile_bind_optionals): New compiler. * libguile/vm-engine.c (VM_NAME): New interpreter. * module/system/vm/assembler.scm (opt-prelude): Emit bind-optionals as appropriate. * module/system/vm/disassembler.scm (define-stack-effect-parser) (code-annotation): Handle bind-optionals.
Diffstat (limited to 'libguile/jit.c')
-rw-r--r--libguile/jit.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/libguile/jit.c b/libguile/jit.c
index d09c3ad5d..4e4a35506 100644
--- a/libguile/jit.c
+++ b/libguile/jit.c
@@ -2006,6 +2006,37 @@ compile_bind_rest (scm_jit_state *j, uint32_t dst)
}
static void
+compile_bind_optionals (scm_jit_state *j, uint32_t dst)
+{
+ ASSERT_HAS_REGISTER_STATE (FP_IN_REGISTER | SP_IN_REGISTER);
+ ASSERT(j->frame_size == -1);
+
+ jit_gpr_t saved_frame_size = T1_PRESERVED;
+ jit_subr (j->jit, saved_frame_size, FP, SP);
+
+ jit_reloc_t no_optionals = jit_bgei
+ (j->jit, saved_frame_size, dst * sizeof (union scm_vm_stack_element));
+
+ emit_alloc_frame (j, T0, dst);
+
+ jit_gpr_t walk = saved_frame_size;
+ jit_subr (j->jit, walk, FP, saved_frame_size);
+
+ jit_reloc_t done = jit_bler (j->jit, walk, SP);
+ jit_movi (j->jit, T0, 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, T0);
+ jit_patch_there (j->jit, jit_bner (j->jit, walk, SP), head);
+
+ jit_patch_here (j->jit, done);
+ jit_patch_here (j->jit, no_optionals);
+
+ ASSERT(j->frame_size == -1);
+}
+
+static void
compile_allocate_words (scm_jit_state *j, uint16_t dst, uint16_t nwords)
{
jit_gpr_t t = T0;