Skip to content

Commit 506323c

Browse files
committed
slightly less trivial boring things
Attemting to run the cross-compiler, even on such a minimal source file, reveals some necessary support routines that aren't needed when compiling the cross-compiler but are needed pretty much immediately in running it. Those routines (and some variables) require at least some of the machine registers' functions to be defined, so have a stab at defining them: - we'll use x5 to hold our lisp return address, since that is defined in the platform ABI as an alternate link register (participating in return address prediction, for Spectre or for worse) - x0 is wired to 0, so define that (and its storage class); also use the platform ABI to define the number (C) stack and frame pointer registers - define args and temporaries in the function argument/return values register region (supported by the RISC-V C extension, in case we can save on instruction space later) - use ABI temporaries for the control (Lisp) stack and frame pointers - put nargs somewhere arbitrary for now
1 parent f681d67 commit 506323c

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

src/compiler/rv32/call.lisp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,28 @@
1111

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

14+
(defun make-return-pc-passing-location (standard)
15+
(if standard
16+
(make-wired-tn *backend-t-primitive-type* descriptor-reg-sc-number lra-offset)
17+
(make-restricted-tn *backend-t-primitive-type* descriptor-reg-sc-number)))
18+
19+
(defun make-old-fp-passing-location ()
20+
(make-wired-tn *fixnum-primitive-type* immediate-arg-scn ocfp-offset))
21+
22+
(defconstant old-fp-passing-offset
23+
(make-sc+offset descriptor-reg-sc-number ocfp-offset))
24+
25+
(defun make-old-fp-save-location (env)
26+
(specify-save-tn
27+
(physenv-debug-live-tn (make-normal-tn *fixnum-primitive-type*) env)
28+
(make-wired-tn *fixnum-primitive-type* control-stack-arg-scn ocfp-save-offset)))
29+
(defun make-return-pc-save-location (env)
30+
(specify-save-tn
31+
(physenv-debug-live-tn (make-normal-tn *backend-t-primitive-type*) env)
32+
(make-wired-tn *backend-t-primitive-type* control-stack-arg-scn lra-save-offset)))
33+
(defun make-arg-count-location ()
34+
(make-wired-tn *fixnum-primitive-type* immediate-arg-scn nargs-offset))
35+
1436
(define-vop (current-fp)
1537
(:results (val :scs (any-reg)))
1638
(:generator 1))

src/compiler/rv32/vm.lisp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
;;;; files for more information.
1111

1212
(in-package "SB!VM")
13-
13+
1414
(!define-storage-bases
1515
(define-storage-base registers :finite :size 32)
1616
(define-storage-base control-stack :unbounded :size 8)
@@ -25,6 +25,7 @@
2525
(!define-storage-classes
2626
(constant constant)
2727
(immediate immediate-constant)
28+
(zero immediate-constant)
2829

2930
(control-stack control-stack)
3031
(any-reg registers :alternate-scs (control-stack))
@@ -53,10 +54,63 @@
5354
(catch-block control-stack :element-size catch-block-size)
5455
(unwind-block control-stack :element-size unwind-block-size)
5556
)
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))
5699

57100
(defun immediate-constant-sc (value)
58101
(typecase value
59102
((integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum) immediate-sc-number)))
60103

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+
61115
(defun combination-implementation-style (node)
62116
(values :default nil))

0 commit comments

Comments
 (0)