Skip to content

Commit 3da9509

Browse files
committed
define more move functions and vops
The compiler needs to know how to move quantities between locations and between representations. The MOVE-VOPs are used to move them within a routine; the MOVE-FUNs are for register spilling and save/restore, at least according to a comment. We also need to extend the storage base definition of ANY-REG, so that it knows that constants in the IMMEDIATE storage class can be moved into ANY-REG locations. This gets us as far as failing to pack (choose actual registers for our Temporary Names) which is reasonable since we haven't actually given any of these storage classes any actual registers.
1 parent 86ea59e commit 3da9509

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

src/compiler/rv32/move.lisp

+35-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@
1111

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

14+
(define-move-fun (load-immediate 1) (vop x y)
15+
((immediate) (any-reg descriptor-reg))
16+
(let ((val (tn-value x)))
17+
(etypecase val
18+
(integer (load-immediate-word y (fixnumize val))))))
19+
20+
(define-move-fun (load-number 1) (vop x y)
21+
((immediate) (signed-reg unsigned-reg))
22+
(load-immediate-word y (tn-value x)))
23+
1424
(define-move-fun (load-stack 5) (vop x y)
1525
((control-stack) (any-reg descriptor-reg))
1626
(load-stack-tn y x))
@@ -37,12 +47,36 @@
3747
(:args (x :scs (any-reg descriptor-reg)))
3848
(:results (y :scs (any-reg descriptor-reg control-stack)))
3949
(:generator 0))
50+
(define-move-vop move :move
51+
(any-reg descriptor-reg) (any-reg descriptor-reg))
4052

53+
(define-vop (move-to-word/fixnum)
54+
(:args (x :scs (any-reg descriptor-reg)))
55+
(:results (y :scs (signed-reg unsigned-reg)))
56+
(:arg-types tagged-num)
57+
(:generator 1))
58+
(define-move-vop move-to-word/fixnum :move
59+
(any-reg descriptor-reg) (signed-reg unsigned-reg))
4160
(define-vop (move-from-word/fixnum)
4261
(:args (x :scs (signed-reg unsigned-reg) :target y))
4362
(:results (y :scs (any-reg descriptor-reg)))
4463
(:result-types tagged-num)
45-
(:generator 0))
64+
(:generator 1))
65+
(define-move-vop move-from-word/fixnum :move
66+
(signed-reg unsigned-reg) (any-reg descriptor-reg))
67+
68+
(define-vop (move-from-signed)
69+
(:args (x :scs (signed-reg unsigned-reg) :target y))
70+
(:results (y :scs (any-reg descriptor-reg)))
71+
(:generator 18))
72+
(define-move-vop move-from-signed :move
73+
(signed-reg) (descriptor-reg))
74+
(define-vop (move-from-unsigned)
75+
(:args (x :scs (signed-reg unsigned-reg) :target y))
76+
(:results (y :scs (any-reg descriptor-reg)))
77+
(:generator 20))
78+
(define-move-vop move-from-unsigned :move
79+
(unsigned-reg) (descriptor-reg))
4680

4781
(define-vop (word-move)
4882
(:args (x :scs (signed-reg unsigned-reg) :target y))

src/compiler/rv32/vm.lisp

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
(zero immediate-constant)
2929

3030
(control-stack control-stack)
31-
(any-reg registers :alternate-scs (control-stack))
31+
(any-reg registers :alternate-scs (control-stack) :constant-scs (immediate))
3232
(descriptor-reg registers :alternate-scs (control-stack))
3333
(non-descriptor-reg registers)
3434

0 commit comments

Comments
 (0)