[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 13/13: Refactor hook dispatch in VM
From: |
Andy Wingo |
Subject: |
[Guile-commits] 13/13: Refactor hook dispatch in VM |
Date: |
Wed, 27 Jun 2018 14:00:14 -0400 (EDT) |
wingo pushed a commit to branch master
in repository guile.
commit 593e2db1dd835b29c6c87a46df6cd8ede5f33c4b
Author: Andy Wingo <address@hidden>
Date: Wed Jun 27 19:56:55 2018 +0200
Refactor hook dispatch in VM
* libguile/vm-engine.c (GOTO_HOOK, HOOK_HANDLER): Split hooks that don't
take args into a "goto" side and a "target" side. The idea is to just
reify the hook call at one place in the binary, since the VM
continuation is fully in the registers.
(APPLY_HOOK, PUSH_CONTINUATION_HOOK, NEXT_HOOK)
(ABORT_CONTINUATION_HOOK): Reimplement in terms of goto hooks.
(POP_CONTINUATION_HOOK): This one is still old-style.
(CONTINUE): New helper definition.
(call, call-label): Move the push-continuation hooks up a bit, so it's
clear they don't depend on intermediate opcode state.
(vm_engine): Reify hook handlers for apply, etc.
---
libguile/vm-engine.c | 56 +++++++++++++++++++++++++++++++++++++---------------
1 file changed, 40 insertions(+), 16 deletions(-)
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index d08ebbb..da064ad 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -110,6 +110,19 @@
#endif
#if VM_USE_HOOKS
+#define GOTO_HOOK(h) \
+ do { \
+ if (SCM_UNLIKELY (VP->trace_level)) \
+ goto run_##h##_hook; \
+ } while (0)
+#define HOOK_HANDLER(h) \
+ do { \
+ run_##h##_hook: \
+ SYNC_IP (); \
+ vm_dispatch_##h##_hook (thread); \
+ CACHE_SP (); \
+ CONTINUE; \
+ } while (0)
#define RUN_HOOK(exp) \
do { \
if (SCM_UNLIKELY (VP->trace_level)) \
@@ -121,16 +134,18 @@
} while (0)
#else
#define RUN_HOOK(exp)
+#define GOTO_HOOK(h)
+#define HOOK_HANDLER(h)
#endif
-#define RUN_HOOK0(h) RUN_HOOK (vm_dispatch_##h##_hook (thread))
-#define RUN_HOOK1(h, arg) RUN_HOOK (vm_dispatch_##h##_hook (thread, arg))
-#define APPLY_HOOK() RUN_HOOK0 (apply)
-#define PUSH_CONTINUATION_HOOK() RUN_HOOK0 (push_continuation)
-#define POP_CONTINUATION_HOOK(old_fp) RUN_HOOK1 (pop_continuation, old_fp)
-#define NEXT_HOOK() RUN_HOOK0 (next)
-#define ABORT_CONTINUATION_HOOK() RUN_HOOK0 (abort)
+#define APPLY_HOOK() GOTO_HOOK (apply)
+#define PUSH_CONTINUATION_HOOK() GOTO_HOOK (push_continuation)
+#define NEXT_HOOK() GOTO_HOOK (next)
+#define ABORT_CONTINUATION_HOOK() GOTO_HOOK (abort)
+/* The only hook that needs an arg, currently. */
+#define POP_CONTINUATION_HOOK(old_fp) \
+ RUN_HOOK (vm_dispatch_pop_continuation_hook (thread, old_fp))
@@ -213,13 +228,13 @@
#ifdef HAVE_LABELS_AS_VALUES
# define BEGIN_DISPATCH_SWITCH /* */
# define END_DISPATCH_SWITCH /* */
+# define CONTINUE do { op = *ip; goto *jump_table[op & 0xff]; } while (0)
# define NEXT(n) \
do \
{ \
ip += n; \
NEXT_HOOK (); \
- op = *ip; \
- goto *jump_table[op & 0xff]; \
+ CONTINUE; \
} \
while (0)
# define VM_DEFINE_OP(opcode, tag, name, meta) \
@@ -233,11 +248,12 @@
{
# define END_DISPATCH_SWITCH \
}
+# define CONTINUE do { goto vm_start; } while (0)
# define NEXT(n) \
do \
{ \
ip += n; \
- goto vm_start; \
+ CONTINUE; \
} \
while (0)
# define VM_DEFINE_OP(opcode, tag, name, meta) \
@@ -363,11 +379,11 @@ VM_NAME (scm_thread *thread)
uint32_t proc, nlocals;
union scm_vm_stack_element *old_fp;
+ PUSH_CONTINUATION_HOOK ();
+
UNPACK_24 (op, proc);
UNPACK_24 (ip[1], nlocals);
- PUSH_CONTINUATION_HOOK ();
-
old_fp = VP->fp;
VP->fp = SCM_FRAME_SLOT (old_fp, proc - 1);
SCM_FRAME_SET_DYNAMIC_LINK (VP->fp, old_fp);
@@ -405,12 +421,12 @@ VM_NAME (scm_thread *thread)
int32_t label;
union scm_vm_stack_element *old_fp;
+ PUSH_CONTINUATION_HOOK ();
+
UNPACK_24 (op, proc);
UNPACK_24 (ip[1], nlocals);
label = ip[2];
- PUSH_CONTINUATION_HOOK ();
-
old_fp = VP->fp;
VP->fp = SCM_FRAME_SLOT (old_fp, proc - 1);
SCM_FRAME_SET_DYNAMIC_LINK (VP->fp, old_fp);
@@ -2994,6 +3010,14 @@ VM_NAME (scm_thread *thread)
}
END_DISPATCH_SWITCH;
+
+ HOOK_HANDLER (apply);
+ HOOK_HANDLER (push_continuation);
+ HOOK_HANDLER (next);
+ HOOK_HANDLER (abort);
+
+ /* Unreachable. */
+ abort ();
}
@@ -3013,8 +3037,8 @@ VM_NAME (scm_thread *thread)
#undef POP_CONTINUATION_HOOK
#undef PUSH_CONTINUATION_HOOK
#undef RUN_HOOK
-#undef RUN_HOOK0
-#undef RUN_HOOK1
+#undef HOOK_HANDLER
+#undef GOTO_HOOK
#undef SYNC_IP
#undef UNPACK_8_8_8
#undef UNPACK_8_16
- [Guile-commits] branch master updated (7883290 -> 593e2db), Andy Wingo, 2018/06/27
- [Guile-commits] 01/13: allocate-words intrinsic, Andy Wingo, 2018/06/27
- [Guile-commits] 04/13: Intrinsic for "prompt", Andy Wingo, 2018/06/27
- [Guile-commits] 07/13: Refactor handling of active VM registers, Andy Wingo, 2018/06/27
- [Guile-commits] 05/13: bind-rest inst uses cons-rest intrinsic, Andy Wingo, 2018/06/27
- [Guile-commits] 11/13: Minor optimizations to debug hook dispatch, Andy Wingo, 2018/06/27
- [Guile-commits] 02/13: Compile current-module as intrinsic call, Andy Wingo, 2018/06/27
- [Guile-commits] 12/13: Microoptimizations to hook dispatch, Andy Wingo, 2018/06/27
- [Guile-commits] 13/13: Refactor hook dispatch in VM,
Andy Wingo <=
- [Guile-commits] 09/13: Intrinsics take registers from thread, Andy Wingo, 2018/06/27
- [Guile-commits] 06/13: Use CALL_INTRINSICS helper in VM, Andy Wingo, 2018/06/27
- [Guile-commits] 08/13: Minor scm_thread refactoring, Andy Wingo, 2018/06/27
- [Guile-commits] 03/13: Remove dedicated current-module instruction., Andy Wingo, 2018/06/27
- [Guile-commits] 10/13: Remove "resume" arg from vm engine, Andy Wingo, 2018/06/27