guile-commits
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]