summaryrefslogtreecommitdiffstats
path: root/lib.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-10 20:10:40 -0800
committerKaz Kylheku <kaz@kylheku.com>2018-03-10 20:10:40 -0800
commit0ed1a4855cd4c821107dde0eb43e472fe233374b (patch)
treed20f1a4fd4724707a49c3dfca6d4aef39203c5a7 /lib.h
parent82d26bb83a07c5eac808455c3f7dab50f55f4a8a (diff)
downloadtxr-0ed1a4855cd4c821107dde0eb43e472fe233374b.tar.gz
txr-0ed1a4855cd4c821107dde0eb43e472fe233374b.tar.bz2
txr-0ed1a4855cd4c821107dde0eb43e472fe233374b.zip
New: virtual machine with assembler.
This commit is the start of compiler work to make TXR Lisp execute faster. In six days of part time work, we now have a register-style virtual machine with 32 instructions, handling exceptions, unwind-protect, lexical closures, and global environment access/mutation. We have a complete assembler and disassembler for this machine. The assembler supports labels with forward referencing with backpatching, and features pseudo-ops: for instance the (mov ...) pseudo-instruction chooses one of three kinds of specific move instruction based on the operands. * Makelfile (OBJS): Add vm.o. * eval.c (lookup_sym_lisp1): Static function becomes external; the virtual machine needs to use this to support that style of lookup. * genvmop.txr: New file. This is the generator for the "vmop.h" header. * lib.c (func_vm): New function. (generic_funcall): Handle the FVM function type via new vm_execute_closure function. In the variadic case, we want to avoid the argument copying which we do for the sake of C functions that get their fixed arguments directly, and then just the trailing arguments. Thus the code is restructured a bit in order to switch twice on the function type. (init): Call vm_init. * lib.h (functype_t): New enum member FVM. (struct func): New member in the .f union: vm_desc. (func_vm): Declared. * lisplib.c (set_dlt_entries_impl): New static function, formed from set_dlt_entries. (set_dlt_entries): Reduced to wrapper for set_dlt_entries_impl, passing in the user package. (set_dlt_entries_sys): New static function: like set_dlt_entries but targetting the sys package. (asm_instantiate, asm_set_entries): New static functions. (lisplib_init): Auto-load the sys:assembler class. * share/txr/stdlib/asm.tl: New file. * vm.c, vm.h, vmop.h: New files.
Diffstat (limited to 'lib.h')
-rw-r--r--lib.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/lib.h b/lib.h
index f80f497a..ca72f970 100644
--- a/lib.h
+++ b/lib.h
@@ -70,6 +70,7 @@ typedef enum type {
typedef enum functype
{
FINTERP, /* Interpreted function. */
+ FVM, /* VM function. */
F0, F1, F2, F3, F4, /* Intrinsic functions with env. */
N0, N1, N2, N3, N4, N5, N6, N7, N8 /* No-env intrinsics. */
} functype_t;
@@ -148,6 +149,7 @@ struct func {
val env;
union {
val interp_fun;
+ val vm_desc;
val (*f0)(val);
val (*f1)(val, val);
val (*f2)(val, val, val);
@@ -890,6 +892,7 @@ val func_n1ov(val (*fun)(val, varg), int reqargs);
val func_n2ov(val (*fun)(val, val, varg), int reqargs);
val func_n3ov(val (*fun)(val, val, val, varg), int reqargs);
val func_interp(val env, val form);
+val func_vm(val closure, val desc, int fixparam, int reqargs, int variadic);
val func_get_form(val fun);
val func_get_env(val fun);
val func_set_env(val fun, val env);