src/wam/constants.lisp @ 902d171a1a85
Remove unnecessary stack/structure opcodes Structures always live in local registers, never in stack registers. So we don't need both variants of the get/put-structure opcodes, just the local ones.
| author | Steve Losh <steve@stevelosh.com> |
|---|---|
| date | Mon, 18 Apr 2016 13:08:47 +0000 |
| parents | ce87039ad178 |
| children | d8dc03903456 |
(in-package #:bones.wam) (define-constant +cell-width+ 16 :documentation "Number of bits in each heap cell.") (define-constant +cell-tag-width+ 2 :documentation "Number of bits reserved for cell type tags.") (define-constant +cell-value-width+ (- +cell-width+ +cell-tag-width+) :documentation "Number of bits reserved for cell values.") (define-constant +cell-tag-bitmask+ #b11 :documentation "Bitmask for masking the cell type tags.") (define-constant +heap-limit+ (expt 2 +cell-value-width+) ;; We can only address 2^value-bits cells. :documentation "Maximum size of the WAM heap.") (define-constant +code-word-size+ 16 :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-sentinal+ (1- +code-limit+) :documentation "Sentinal value used in the PC and CP.") (define-constant +tag-null+ #b00 :documentation "An empty cell.") (define-constant +tag-structure+ #b01 :documentation "A structure cell.") (define-constant +tag-reference+ #b10 :documentation "A pointer to a cell.") (define-constant +tag-functor+ #b11 :documentation "A functor.") (define-constant +functor-arity-width+ 4 :documentation "Number of bits dedicated to functor arity.") (define-constant +functor-arity-bitmask+ #b1111 :documentation "Bitmask for the functor arity bits.") (define-constant +register-count+ 16 :documentation "The number of registers the WAM has available.") (define-constant +maximum-arity+ (1- (expt 2 +functor-arity-width+)) :documentation "The maximum allowed arity of functors.") (define-constant +maximum-query-size+ 256 :documentation "The maximum size (in bytes of bytecode) a query may compile to.") (define-constant +tag-local-register+ #b0 :documentation "A local register (X_n or A_n).") (define-constant +tag-stack-register+ #b1 :documentation "A stack register (Y_n).") (define-constant +stack-word-size+ 16 :documentation "Size (in bits) of each word in WAM stack.") (define-constant +stack-limit+ (expt 2 +stack-word-size+) ;; We can only address 2^value-bits cells, and since stack address are ;; themselves stored on the stack (the environment continuation pointer) they ;; can only reference so much memory. ;; ;; todo: we might want to limit this further to prevent the stack from growing ;; too large. :documentation "Maximum size of the WAM stack.") (define-constant +stack-frame-size-limit+ (+ 3 +register-count+) :documentation "The maximum size, in stack frame words, that a stack frame could be.") ;;;; Opcodes ;;; Program (define-constant +opcode-get-structure-local+ 0) (define-constant +opcode-unify-variable-local+ 1) (define-constant +opcode-unify-variable-stack+ 2) (define-constant +opcode-unify-value-local+ 3) (define-constant +opcode-unify-value-stack+ 4) (define-constant +opcode-get-variable-local+ 5) (define-constant +opcode-get-variable-stack+ 6) (define-constant +opcode-get-value-local+ 7) (define-constant +opcode-get-value-stack+ 8) ;;; Query (define-constant +opcode-put-structure-local+ 9) (define-constant +opcode-set-variable-local+ 10) (define-constant +opcode-set-variable-stack+ 11) (define-constant +opcode-set-value-local+ 12) (define-constant +opcode-set-value-stack+ 13) (define-constant +opcode-put-variable-local+ 14) (define-constant +opcode-put-variable-stack+ 15) (define-constant +opcode-put-value-local+ 16) (define-constant +opcode-put-value-stack+ 17) ;;; Control (define-constant +opcode-call+ 18) (define-constant +opcode-proceed+ 19) (define-constant +opcode-allocate+ 20) (define-constant +opcode-deallocate+ 21) ;;;; Debug Config (defparameter *off-by-one* nil)