mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 14:21:10 +02:00
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.
This commit is contained in:
parent
2a8d72f7e0
commit
593e2db1dd
1 changed files with 40 additions and 16 deletions
|
@ -110,6 +110,19 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if VM_USE_HOOKS
|
#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) \
|
#define RUN_HOOK(exp) \
|
||||||
do { \
|
do { \
|
||||||
if (SCM_UNLIKELY (VP->trace_level)) \
|
if (SCM_UNLIKELY (VP->trace_level)) \
|
||||||
|
@ -121,16 +134,18 @@
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define RUN_HOOK(exp)
|
#define RUN_HOOK(exp)
|
||||||
|
#define GOTO_HOOK(h)
|
||||||
|
#define HOOK_HANDLER(h)
|
||||||
#endif
|
#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 APPLY_HOOK() GOTO_HOOK (apply)
|
||||||
#define PUSH_CONTINUATION_HOOK() RUN_HOOK0 (push_continuation)
|
#define PUSH_CONTINUATION_HOOK() GOTO_HOOK (push_continuation)
|
||||||
#define POP_CONTINUATION_HOOK(old_fp) RUN_HOOK1 (pop_continuation, old_fp)
|
#define NEXT_HOOK() GOTO_HOOK (next)
|
||||||
#define NEXT_HOOK() RUN_HOOK0 (next)
|
#define ABORT_CONTINUATION_HOOK() GOTO_HOOK (abort)
|
||||||
#define ABORT_CONTINUATION_HOOK() RUN_HOOK0 (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
|
#ifdef HAVE_LABELS_AS_VALUES
|
||||||
# define BEGIN_DISPATCH_SWITCH /* */
|
# define BEGIN_DISPATCH_SWITCH /* */
|
||||||
# define END_DISPATCH_SWITCH /* */
|
# define END_DISPATCH_SWITCH /* */
|
||||||
|
# define CONTINUE do { op = *ip; goto *jump_table[op & 0xff]; } while (0)
|
||||||
# define NEXT(n) \
|
# define NEXT(n) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
ip += n; \
|
ip += n; \
|
||||||
NEXT_HOOK (); \
|
NEXT_HOOK (); \
|
||||||
op = *ip; \
|
CONTINUE; \
|
||||||
goto *jump_table[op & 0xff]; \
|
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
# define VM_DEFINE_OP(opcode, tag, name, meta) \
|
# define VM_DEFINE_OP(opcode, tag, name, meta) \
|
||||||
|
@ -233,11 +248,12 @@
|
||||||
{
|
{
|
||||||
# define END_DISPATCH_SWITCH \
|
# define END_DISPATCH_SWITCH \
|
||||||
}
|
}
|
||||||
|
# define CONTINUE do { goto vm_start; } while (0)
|
||||||
# define NEXT(n) \
|
# define NEXT(n) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
ip += n; \
|
ip += n; \
|
||||||
goto vm_start; \
|
CONTINUE; \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
# define VM_DEFINE_OP(opcode, tag, name, meta) \
|
# define VM_DEFINE_OP(opcode, tag, name, meta) \
|
||||||
|
@ -363,11 +379,11 @@ VM_NAME (scm_thread *thread)
|
||||||
uint32_t proc, nlocals;
|
uint32_t proc, nlocals;
|
||||||
union scm_vm_stack_element *old_fp;
|
union scm_vm_stack_element *old_fp;
|
||||||
|
|
||||||
|
PUSH_CONTINUATION_HOOK ();
|
||||||
|
|
||||||
UNPACK_24 (op, proc);
|
UNPACK_24 (op, proc);
|
||||||
UNPACK_24 (ip[1], nlocals);
|
UNPACK_24 (ip[1], nlocals);
|
||||||
|
|
||||||
PUSH_CONTINUATION_HOOK ();
|
|
||||||
|
|
||||||
old_fp = VP->fp;
|
old_fp = VP->fp;
|
||||||
VP->fp = SCM_FRAME_SLOT (old_fp, proc - 1);
|
VP->fp = SCM_FRAME_SLOT (old_fp, proc - 1);
|
||||||
SCM_FRAME_SET_DYNAMIC_LINK (VP->fp, old_fp);
|
SCM_FRAME_SET_DYNAMIC_LINK (VP->fp, old_fp);
|
||||||
|
@ -405,12 +421,12 @@ VM_NAME (scm_thread *thread)
|
||||||
int32_t label;
|
int32_t label;
|
||||||
union scm_vm_stack_element *old_fp;
|
union scm_vm_stack_element *old_fp;
|
||||||
|
|
||||||
|
PUSH_CONTINUATION_HOOK ();
|
||||||
|
|
||||||
UNPACK_24 (op, proc);
|
UNPACK_24 (op, proc);
|
||||||
UNPACK_24 (ip[1], nlocals);
|
UNPACK_24 (ip[1], nlocals);
|
||||||
label = ip[2];
|
label = ip[2];
|
||||||
|
|
||||||
PUSH_CONTINUATION_HOOK ();
|
|
||||||
|
|
||||||
old_fp = VP->fp;
|
old_fp = VP->fp;
|
||||||
VP->fp = SCM_FRAME_SLOT (old_fp, proc - 1);
|
VP->fp = SCM_FRAME_SLOT (old_fp, proc - 1);
|
||||||
SCM_FRAME_SET_DYNAMIC_LINK (VP->fp, old_fp);
|
SCM_FRAME_SET_DYNAMIC_LINK (VP->fp, old_fp);
|
||||||
|
@ -2994,6 +3010,14 @@ VM_NAME (scm_thread *thread)
|
||||||
}
|
}
|
||||||
|
|
||||||
END_DISPATCH_SWITCH;
|
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 POP_CONTINUATION_HOOK
|
||||||
#undef PUSH_CONTINUATION_HOOK
|
#undef PUSH_CONTINUATION_HOOK
|
||||||
#undef RUN_HOOK
|
#undef RUN_HOOK
|
||||||
#undef RUN_HOOK0
|
#undef HOOK_HANDLER
|
||||||
#undef RUN_HOOK1
|
#undef GOTO_HOOK
|
||||||
#undef SYNC_IP
|
#undef SYNC_IP
|
||||||
#undef UNPACK_8_8_8
|
#undef UNPACK_8_8_8
|
||||||
#undef UNPACK_8_16
|
#undef UNPACK_8_16
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue