diff options
author | Andy Wingo <wingo@pobox.com> | 2019-06-06 16:20:20 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2019-06-06 16:36:32 +0200 |
commit | 9fd978ed7eebe32ceff7762eb87bba5d56a0743c (patch) | |
tree | e2b7e28c42924c1c5aced9f56cdbdec525c5146c /libguile/jit.c | |
parent | 12d6e4317657e4334306b1345a09a11b0e256fa3 (diff) | |
download | guile-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.c | 31 |
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; |