Skip to content

Commit 84046e7

Browse files
committed
rearrange vm.lisp again
This mess of circular dependencies where everything wants to be evaluated at compile-time (and so everything it depends on needs to be ready at read-time, ew) is horrible. But it needs to be this way, at least for now, so that we can give some locations to the various register storage classes. We now get beyond packing, and fail to emit a block header, and subsequently fail to support type tests. Some more platform-specific development looms in our future...
1 parent 3da9509 commit 84046e7

File tree

1 file changed

+49
-46
lines changed

1 file changed

+49
-46
lines changed

src/compiler/rv32/vm.lisp

+49-46
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,46 @@
1111

1212
(in-package "SB!VM")
1313

14+
(eval-when (:compile-toplevel :load-toplevel :execute)
15+
(defvar *register-names* (make-array 32 :initial-element nil)))
16+
17+
(macrolet ((defreg (name offset)
18+
(let ((offset-sym (symbolicate name "-OFFSET")))
19+
`(eval-when (:compile-toplevel :load-toplevel :execute)
20+
(defconstant ,offset-sym ,offset)
21+
(setf (svref *register-names* ,offset-sym) ,(symbol-name name)))))
22+
(defregset (name &rest regs)
23+
(flet ((offset-namify (n) (symbolicate n "-OFFSET")))
24+
`(eval-when (:compile-toplevel :load-toplevel :execute)
25+
(defparameter ,name
26+
(list ,@(mapcar #'offset-namify regs))))))
27+
(define-argument-register-set (&rest args)
28+
`(progn
29+
(defregset *register-arg-offsets* ,@args)
30+
(defconstant register-arg-count ,(length args)))))
31+
(defreg zero 0)
32+
(defreg lr 1)
33+
(defreg nsp 2)
34+
(defreg lra 5) ; alternate link register
35+
(defreg cfp 6)
36+
(defreg ocfp 7)
37+
(defreg nfp 8)
38+
(defreg csp 9)
39+
(defreg a0 10)
40+
(defreg nl0 11)
41+
(defreg a1 12)
42+
(defreg nl1 13)
43+
(defreg a2 14)
44+
(defreg nl2 15)
45+
(defreg a3 16)
46+
(defreg nl3 17)
47+
(defreg nargs 31)
48+
49+
(defregset non-descriptor-regs nl0 nl1 nl2 nl3 nargs nfp)
50+
(defregset descriptor-regs a0 a1 a2 a3 ocfp lra)
51+
52+
(define-argument-register-set a0 a1 a2 a3))
53+
1454
(!define-storage-bases
1555
(define-storage-base registers :finite :size 32)
1656
(define-storage-base control-stack :unbounded :size 8)
@@ -28,9 +68,10 @@
2868
(zero immediate-constant)
2969

3070
(control-stack control-stack)
31-
(any-reg registers :alternate-scs (control-stack) :constant-scs (immediate))
32-
(descriptor-reg registers :alternate-scs (control-stack))
33-
(non-descriptor-reg registers)
71+
(any-reg registers :locations #.(append non-descriptor-regs descriptor-regs)
72+
:alternate-scs (control-stack) :constant-scs (immediate))
73+
(descriptor-reg registers :locations #.descriptor-regs :alternate-scs (control-stack))
74+
(non-descriptor-reg registers :locations #.non-descriptor-regs)
3475

3576
(character-stack non-descriptor-stack)
3677
(character-reg registers :alternate-scs (character-stack))
@@ -54,49 +95,6 @@
5495
(catch-block control-stack :element-size catch-block-size)
5596
(unwind-block control-stack :element-size unwind-block-size)
5697
)
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))
99-
10098
(defun immediate-constant-sc (value)
10199
(typecase value
102100
((integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum) immediate-sc-number)))
@@ -112,6 +110,11 @@
112110
(defconstant lra-save-offset 1)
113111
(defconstant nfp-save-offset 2)
114112

113+
(defparameter *register-arg-tns*
114+
(let ((drsc (sc-or-lose 'descriptor-reg)))
115+
(flet ((make (n) (make-random-tn :kind :normal :sc drsc :offset n)))
116+
(mapcar #'make *register-arg-offsets*))))
117+
115118
(defun location-print-name (tn)
116119
(declare (type tn tn))
117120
(let ((sb (sb-name (sc-sb (tn-sc tn))))

0 commit comments

Comments
 (0)