summaryrefslogtreecommitdiff
path: root/libguile/jit.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-07-19 10:56:44 +0200
committerAndy Wingo <wingo@pobox.com>2018-07-20 11:42:30 +0200
commitc2a8224a63da432c82f24a76c008e4cfe9cba25b (patch)
tree76416a0cb8f23953912b4ac8ce5c691f6e4a8635 /libguile/jit.c
parent043432fd573648fe8591672aca7e2438b71e6774 (diff)
downloadguile-c2a8224a63da432c82f24a76c008e4cfe9cba25b.tar.gz
Rework VM approach to shuffling unknown numbers of args
* libguile/vm-engine.c (shuffle-down, expand-apply-argument): New instructions. (tail-call, tail-call-label, return-values): Don't reset the frame. The compiler should reset the frame appropriately. (tail-call/shuffle, tail-apply): Remove unused instructions. * libguile/vm.c (vm_builtin_apply_code): Use new shuffle-down and expand-apply-argument opcodes. (vm_builtin_call_with_values_code): Replace tail-call/shuffle with shuffle-down then tail-call. * libguile/jit.c (compile_shuffle_down, compile_expand_apply_argument): Add compiler stubs (COMPILE_X8_F12_F12): New definition. (compile_tail_call_shuffle, compile_tail_apply): Remove unused compilers. * module/language/cps/compile-bytecode.scm (compile-function): Emit reset-frame before tail calls and returns. * module/system/vm/assembler.scm (system): Remove unbound "emit-return" export. * module/system/vm/disassembler.scm (code-annotation) (instruction-has-fallthrough?, define-stack-effect-parser): Adapt for opcode changes.
Diffstat (limited to 'libguile/jit.c')
-rw-r--r--libguile/jit.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/libguile/jit.c b/libguile/jit.c
index 3cb3ddd26..04e28101b 100644
--- a/libguile/jit.c
+++ b/libguile/jit.c
@@ -61,32 +61,32 @@ compile_call_label (scm_jit_state *j, uint32_t a, uint32_t b, int32_t offset)
}
static void
-compile_tail_call (scm_jit_state *j, uint32_t a)
+compile_tail_call (scm_jit_state *j)
{
}
static void
-compile_tail_call_label (scm_jit_state *j, uint32_t a, int32_t offset)
+compile_tail_call_label (scm_jit_state *j, int32_t offset)
{
}
static void
-compile_tail_call_shuffle (scm_jit_state *j, uint32_t a)
+compile_receive (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
-compile_receive (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
+compile_receive_values (scm_jit_state *j, uint32_t a, uint8_t b, uint32_t c)
{
}
static void
-compile_receive_values (scm_jit_state *j, uint32_t a, uint8_t b, uint32_t c)
+compile_shuffle_down (scm_jit_state *j, uint16_t from, uint16_t to)
{
}
static void
-compile_return_values (scm_jit_state *j, uint32_t a)
+compile_return_values (scm_jit_state *j)
{
}
@@ -111,11 +111,6 @@ compile_compose_continuation (scm_jit_state *j, uint32_t a)
}
static void
-compile_tail_apply (scm_jit_state *j)
-{
-}
-
-static void
compile_call_cc (scm_jit_state *j)
{
}
@@ -191,6 +186,11 @@ compile_assert_nargs_ee_locals (scm_jit_state *j, uint16_t a, uint16_t b)
}
static void
+compile_expand_apply_argument (scm_jit_state *j)
+{
+}
+
+static void
compile_bind_kwargs (scm_jit_state *j, uint32_t a, uint8_t b, uint32_t c, uint32_t d, int32_t offset)
{
}
@@ -917,6 +917,8 @@ compile_f64_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
COMPILE_X8_C12_C12 (j, comp)
#define COMPILE_X8_S12_S12(j, comp) \
COMPILE_X8_C12_C12 (j, comp)
+#define COMPILE_X8_F12_F12(j, comp) \
+ COMPILE_X8_C12_C12 (j, comp)
#define COMPILE_X8_S12_Z12(j, comp) \
{ \
@@ -953,6 +955,13 @@ compile_f64_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
j->ip += 2; \
}
+#define COMPILE_X32__L32(j, comp) \
+ { \
+ int32_t a = j->ip[1]; \
+ comp (j, a); \
+ j->ip += 1; \
+ }
+
#define COMPILE_X8_C24__L32(j, comp) \
{ \
uint32_t a; \