From 0ed1a4855cd4c821107dde0eb43e472fe233374b Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 10 Mar 2018 20:10:40 -0800 Subject: 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. --- genvmop.txr | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 genvmop.txr (limited to 'genvmop.txr') diff --git a/genvmop.txr b/genvmop.txr new file mode 100644 index 00000000..31c6062a --- /dev/null +++ b/genvmop.txr @@ -0,0 +1,18 @@ +@(include "asm") +@(in-package :sys) +@(bind oc @(keep-if .code %oc-list%)) +@(next "vm.h") +@(collect) +@{copyright} +@(until) + +@(end) +@(output "vmop.h") +@{copyright "\n"} + +typedef enum vm_op { +@ (repeat :vars (oc)) + @{oc.symbol :filter :upcase} = @{oc.code}, +@ (end) +} vm_op_t; +@(end) -- cgit v1.2.3