diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-10 20:10:40 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-10 20:10:40 -0800 |
commit | 0ed1a4855cd4c821107dde0eb43e472fe233374b (patch) | |
tree | d20f1a4fd4724707a49c3dfca6d4aef39203c5a7 /lib.h | |
parent | 82d26bb83a07c5eac808455c3f7dab50f55f4a8a (diff) | |
download | txr-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.h | 3 |
1 files changed, 3 insertions, 0 deletions
@@ -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); |