src/wam/constants.lisp @ ba96e98a1d54
Add precompilation of static queries at compile time
Imagine a function like this:
(defun legal-moves ()
(query (legal ?who ?move)))
The argument to `query` there is constant, so we can compile it into WAM
bytecode once, when the Lisp function around it is compiled. Then running the
query doesn't need to touch the Bones compiler -- it can just load the bytecode
from an array and first up the VM loop.
This saves a lot of time (and consing) compared to compiling the same query over
and over at runtime.
author |
Steve Losh <steve@stevelosh.com> |
date |
Sun, 17 Jul 2016 16:49:06 +0000 |
parents |
f1ef8f905a1d |
children |
3325913a9b16 |
(in-package #:bones.wam)
(defmacro define-constants (count-symbol &rest symbols)
`(progn
,@(loop :for c :from 0
:for s :in symbols
:collect `(define-constant ,s ,c))
(define-constant ,count-symbol ,(length symbols))))
(define-constant +code-word-size+ 60
:documentation "Size (in bits) of each word in the code store.")
(define-constant +code-limit+ (expt 2 +code-word-size+)
:documentation "Maximum size of the WAM code store.")
(define-constant +code-sentinel+ (1- +code-limit+)
; TODO: Should this sentinel value be 0 like everything else?
:documentation "Sentinel value used in the PC and CP.")
(define-constants +number-of-cell-types+
+cell-type-null+
+cell-type-structure+
+cell-type-reference+
+cell-type-functor+
+cell-type-constant+
+cell-type-list+
+cell-type-lisp-object+
+cell-type-stack+)
(define-constant +register-count+ 2048
:documentation "The number of local registers the WAM has available.")
(define-constant +maximum-arity+ 1024
:documentation "The maximum allowed arity of functors.")
;; TODO Make all this shit configurable at runtime
(define-constant +stack-limit+ 4096
:documentation "Maximum size of the WAM stack.")
(define-constant +stack-frame-size-limit+ (+ 7 +register-count+)
:documentation "The maximum size, in stack frame words, that a stack frame could be.")
(define-constant +maximum-query-size+ 1024
:documentation
"The maximum size (in bytes of bytecode) a query may compile to.")
(define-constant +maximum-instruction-size+ 4
:documentation
"The maximum number of code words an instruction (including opcode) might be.")
(define-constant +code-query-start+ 0
:documentation "The address in the code store where the query code begins.")
(define-constant +code-main-start+ +maximum-query-size+
:documentation "The address in the code store where the main program code begins.")
(define-constant +stack-start+ +register-count+
:documentation "The address in the store of the first cell of the stack.")
(define-constant +stack-end+ (+ +stack-start+ +stack-limit+)
:documentation
"The address in the store one past the last cell in the stack.")
(define-constant +heap-start+ +stack-end+
:documentation "The address in the store of the first cell of the heap.")
(define-constant +trail-limit+ array-total-size-limit
;; TODO: should probably limit this to something more reasonable
:documentation "The maximum number of variables that may exist in the trail.")
(define-constant +store-limit+ array-total-size-limit
:documentation "Maximum size of the WAM store.")
(define-constant +heap-limit+ (- +store-limit+ +register-count+ +stack-limit+)
;; The heap gets whatever's left over after the registers and stack have taken
;; their chunk of memory.
:documentation "Maximum size of the WAM heap.")
(define-constant +functor-limit+ array-total-size-limit
;; Functors are stored in a functor table.
:documentation "The maximum number of functors the WAM can keep track of.")
(define-constant +wildcard-symbol+ '?)
;;;; Opcodes
(define-constants +number-of-opcodes+
+opcode-noop+
;; Program
+opcode-get-structure+
+opcode-get-variable-local+
+opcode-get-variable-stack+
+opcode-get-value-local+
+opcode-get-value-stack+
;; Query
+opcode-put-structure+
+opcode-put-variable-local+
+opcode-put-variable-stack+
+opcode-put-value-local+
+opcode-put-value-stack+
;; Subterm
+opcode-subterm-variable-local+
+opcode-subterm-variable-stack+
+opcode-subterm-value-local+
+opcode-subterm-value-stack+
+opcode-subterm-void+
;; Control
+opcode-jump+
+opcode-call+
+opcode-dynamic-jump+
+opcode-dynamic-call+
+opcode-proceed+
+opcode-allocate+
+opcode-deallocate+
+opcode-done+
+opcode-try+
+opcode-retry+
+opcode-trust+
+opcode-cut+
;; Constants
+opcode-get-constant+
+opcode-put-constant+
+opcode-subterm-constant+
;; Lists
+opcode-get-list+
+opcode-put-list+
;; Lisp Objects
+opcode-get-lisp-object+
+opcode-put-lisp-object+)
;;;; Debug Config
(defparameter *off-by-one* nil)