|
10 | 10 | ;;;; files for more information. |
11 | 11 |
|
12 | 12 | (in-package "SB!VM") |
13 | | - |
| 13 | + |
14 | 14 | (!define-storage-bases |
15 | 15 | (define-storage-base registers :finite :size 32) |
16 | 16 | (define-storage-base control-stack :unbounded :size 8) |
|
25 | 25 | (!define-storage-classes |
26 | 26 | (constant constant) |
27 | 27 | (immediate immediate-constant) |
| 28 | + (zero immediate-constant) |
28 | 29 |
|
29 | 30 | (control-stack control-stack) |
30 | 31 | (any-reg registers :alternate-scs (control-stack)) |
|
53 | 54 | (catch-block control-stack :element-size catch-block-size) |
54 | 55 | (unwind-block control-stack :element-size unwind-block-size) |
55 | 56 | ) |
| 57 | + |
| 58 | +(defvar *register-names* (make-array 32 :initial-element nil)) |
| 59 | + |
| 60 | +(macrolet ((defreg (name offset) |
| 61 | + (let ((offset-sym (symbolicate name "-OFFSET"))) |
| 62 | + `(progn |
| 63 | + (defconstant ,offset-sym ,offset) |
| 64 | + (setf (svref *register-names* ,offset-sym) ,(symbol-name name))))) |
| 65 | + (defregset (name &rest regs) |
| 66 | + (flet ((offset-namify (n) (symbolicate n "-OFFSET"))) |
| 67 | + `(defparameter ,name |
| 68 | + (list ,@(mapcar #'offset-namify regs))))) |
| 69 | + (define-argument-register-set (&rest args) |
| 70 | + `(progn |
| 71 | + (defregset *register-arg-offsets* ,@args) |
| 72 | + (defconstant register-arg-count ,(length args)) |
| 73 | + (defparameter *register-arg-tns* |
| 74 | + (let ((drsc (sc-or-lose 'descriptor-reg))) |
| 75 | + (flet ((make (n) (make-random-tn :kind :normal :sc drsc :offset n))) |
| 76 | + (mapcar #'make *register-arg-offsets*))))))) |
| 77 | + (defreg zero 0) |
| 78 | + (defreg lr 1) |
| 79 | + (defreg nsp 2) |
| 80 | + (defreg lra 5) ; alternate link register |
| 81 | + (defreg cfp 6) |
| 82 | + (defreg ocfp 7) |
| 83 | + (defreg nfp 8) |
| 84 | + (defreg csp 9) |
| 85 | + (defreg a0 10) |
| 86 | + (defreg nl0 11) |
| 87 | + (defreg a1 12) |
| 88 | + (defreg nl1 13) |
| 89 | + (defreg a2 14) |
| 90 | + (defreg nl2 15) |
| 91 | + (defreg a3 16) |
| 92 | + (defreg nl3 17) |
| 93 | + (defreg nargs 31) |
| 94 | + |
| 95 | + (defregset non-descriptor-regs nl0 nl1 nl2 nl3 nargs nfp) |
| 96 | + (defregset descriptor-regs a0 a1 a2 a3 ocfp lra) |
| 97 | + |
| 98 | + (define-argument-register-set a0 a1 a2 a3)) |
56 | 99 |
|
57 | 100 | (defun immediate-constant-sc (value) |
58 | 101 | (typecase value |
59 | 102 | ((integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum) immediate-sc-number))) |
60 | 103 |
|
| 104 | +(defun boxed-immediate-sc-p (sc) |
| 105 | + (or (eql sc zero-sc-number) |
| 106 | + (eql sc immediate-sc-number))) |
| 107 | + |
| 108 | +(defconstant immediate-arg-scn any-reg-sc-number) |
| 109 | +(defconstant control-stack-arg-scn control-stack-sc-number) |
| 110 | + |
| 111 | +(defconstant ocfp-save-offset 0) |
| 112 | +(defconstant lra-save-offset 1) |
| 113 | +(defconstant nfp-save-offset 2) |
| 114 | + |
61 | 115 | (defun combination-implementation-style (node) |
62 | 116 | (values :default nil)) |
0 commit comments