0.7.6.27:
[sbcl.git] / src / compiler / hppa / sap.lisp
1 (in-package "SB!VM")
2
3 \f
4 ;;;; Moves and coercions:
5
6 ;;; Move a tagged SAP to an untagged representation.
7 ;;;
8 (define-vop (move-to-sap)
9   (:args (x :scs (descriptor-reg)))
10   (:results (y :scs (sap-reg)))
11   (:note "system area pointer indirection")
12   (:generator 1
13     (loadw y x sap-pointer-slot other-pointer-lowtag)))
14
15 ;;;
16 (define-move-vop move-to-sap :move
17   (descriptor-reg) (sap-reg))
18
19
20 ;;; Move an untagged SAP to a tagged representation.
21 ;;;
22 (define-vop (move-from-sap)
23   (:args (x :scs (sap-reg) :to (:eval 1)))
24   (:temporary (:scs (non-descriptor-reg)) ndescr)
25   (:results (y :scs (descriptor-reg) :from (:eval 0)))
26   (:note "system area pointer allocation")
27   (:generator 20
28     (with-fixed-allocation (y ndescr sap-widetag sap-size)
29       (storew x y sap-pointer-slot other-pointer-lowtag))))
30 ;;;
31 (define-move-vop move-from-sap :move
32   (sap-reg) (descriptor-reg))
33
34
35 ;;; Move untagged sap values.
36 ;;;
37 (define-vop (sap-move)
38   (:args (x :target y
39             :scs (sap-reg)
40             :load-if (not (location= x y))))
41   (:results (y :scs (sap-reg)
42                :load-if (not (location= x y))))
43   (:effects)
44   (:affected)
45   (:generator 0
46     (move x y)))
47 ;;;
48 (define-move-vop sap-move :move
49   (sap-reg) (sap-reg))
50
51
52 ;;; Move untagged sap arguments/return-values.
53 ;;;
54 (define-vop (move-sap-argument)
55   (:args (x :target y
56             :scs (sap-reg))
57          (fp :scs (any-reg)
58              :load-if (not (sc-is y sap-reg))))
59   (:results (y))
60   (:generator 0
61     (sc-case y
62       (sap-reg
63        (move x y))
64       (sap-stack
65        (storew x fp (tn-offset y))))))
66 ;;;
67 (define-move-vop move-sap-argument :move-arg
68   (descriptor-reg sap-reg) (sap-reg))
69
70
71 ;;; Use standard MOVE-ARGUMENT + coercion to move an untagged sap to a
72 ;;; descriptor passing location.
73 ;;;
74 (define-move-vop move-argument :move-arg
75   (sap-reg) (descriptor-reg))
76
77
78 \f
79 ;;;; SAP-INT and INT-SAP
80
81 (define-vop (sap-int)
82   (:args (sap :scs (sap-reg) :target int))
83   (:arg-types system-area-pointer)
84   (:results (int :scs (unsigned-reg)))
85   (:result-types unsigned-num)
86   (:translate sap-int)
87   (:policy :fast-safe)
88   (:generator 1
89     (move sap int)))
90
91 (define-vop (int-sap)
92   (:args (int :scs (unsigned-reg) :target sap))
93   (:arg-types unsigned-num)
94   (:results (sap :scs (sap-reg)))
95   (:result-types system-area-pointer)
96   (:translate int-sap)
97   (:policy :fast-safe)
98   (:generator 1
99     (move int sap)))
100
101
102 \f
103 ;;;; POINTER+ and POINTER-
104
105 (define-vop (pointer+)
106   (:translate sap+)
107   (:args (ptr :scs (sap-reg) :target res)
108          (offset :scs (signed-reg)))
109   (:arg-types system-area-pointer signed-num)
110   (:results (res :scs (sap-reg)))
111   (:result-types system-area-pointer)
112   (:policy :fast-safe)
113   (:generator 1
114     (inst add ptr offset res)))
115
116 (define-vop (pointer+-c)
117   (:translate sap+)
118   (:args (ptr :scs (sap-reg)))
119   (:info offset)
120   (:arg-types system-area-pointer (:constant (signed-byte 11)))
121   (:results (res :scs (sap-reg)))
122   (:result-types system-area-pointer)
123   (:policy :fast-safe)
124   (:generator 1
125     (inst addi offset ptr res)))
126
127 (define-vop (pointer-)
128   (:translate sap-)
129   (:args (ptr1 :scs (sap-reg))
130          (ptr2 :scs (sap-reg)))
131   (:arg-types system-area-pointer system-area-pointer)
132   (:policy :fast-safe)
133   (:results (res :scs (signed-reg)))
134   (:result-types signed-num)
135   (:generator 1
136     (inst sub ptr1 ptr2 res)))
137
138
139 \f
140 ;;;; mumble-SYSTEM-REF and mumble-SYSTEM-SET
141
142 (macrolet ((def-system-ref-and-set
143           (ref-name set-name sc type size &optional signed)
144   (let ((ref-name-c (symbolicate ref-name "-C"))
145         (set-name-c (symbolicate set-name "-C")))
146     `(progn
147        (define-vop (,ref-name)
148          (:translate ,ref-name)
149          (:policy :fast-safe)
150          (:args (object :scs (sap-reg))
151                 (offset :scs (signed-reg)))
152          (:arg-types system-area-pointer signed-num)
153          (:results (result :scs (,sc)))
154          (:result-types ,type)
155          (:generator 5
156            (inst ,(ecase size
157                     (:byte 'ldbx)
158                     (:short 'ldhx)
159                     (:long 'ldwx)
160                     (:float 'fldx))
161                  offset object result)
162            ,@(when (and signed (not (eq size :long)))
163                `((inst extrs result 31 ,(ecase size
164                           (:byte 8)
165                           (:short 16))
166                        result)))))
167        (define-vop (,ref-name-c)
168          (:translate ,ref-name)
169          (:policy :fast-safe)
170          (:args (object :scs (sap-reg)))
171          (:arg-types system-area-pointer
172                      (:constant ,(if (eq size :float)
173                                      '(signed-byte 5)
174                                      '(signed-byte 14))))
175          (:info offset)
176          (:results (result :scs (,sc)))
177          (:result-types ,type)
178          (:generator 4
179            (inst ,(ecase size
180                     (:byte 'ldb)
181                     (:short 'ldh)
182                     (:long 'ldw)
183                     (:float 'flds))
184                  offset object result)
185            ,@(when (and signed (not (eq size :long)))
186                `((inst extrs result 31 ,(ecase size
187                           (:byte 8)
188                           (:short 16))
189                        result)))))
190        (define-vop (,set-name)
191          (:translate ,set-name)
192          (:policy :fast-safe)
193          (:args (object :scs (sap-reg)
194                         ,@(unless (eq size :float) '(:target sap)))
195                 (offset :scs (signed-reg))
196                 (value :scs (,sc) :target result))
197          (:arg-types system-area-pointer signed-num ,type)
198          (:results (result :scs (,sc)))
199          (:result-types ,type)
200          ,@(unless (eq size :float)
201              '((:temporary (:scs (sap-reg) :from (:argument 0)) sap)))
202          (:generator 5
203            ,@(if (eq size :float)
204                  `((inst fstx value offset object)
205                    (unless (location= value result)
206                      (inst funop :copy value result)))
207                  `((inst add object offset sap)
208                    (inst ,(ecase size (:byte 'stb) (:short 'sth) (:long 'stw))
209                          value 0 sap)
210                    (move value result)))))
211        (define-vop (,set-name-c)
212          (:translate ,set-name)
213          (:policy :fast-safe)
214          (:args (object :scs (sap-reg))
215                 (value :scs (,sc) :target result))
216          (:arg-types system-area-pointer
217                      (:constant ,(if (eq size :float)
218                                      '(signed-byte 5)
219                                      '(signed-byte 14)))
220                      ,type)
221          (:info offset)
222          (:results (result :scs (,sc)))
223          (:result-types ,type)
224          (:generator 5
225            ,@(if (eq size :float)
226                  `((inst fsts value offset object)
227                    (unless (location= value result)
228                      (inst funop :copy value result)))
229                  `((inst ,(ecase size (:byte 'stb) (:short 'sth) (:long 'stw))
230                          value offset object)
231                    (move value result)))))))))
232   (def-system-ref-and-set sap-ref-8 %set-sap-ref-8
233     unsigned-reg positive-fixnum :byte nil)
234   (def-system-ref-and-set signed-sap-ref-8 %set-signed-sap-ref-8
235     signed-reg tagged-num :byte t)
236   (def-system-ref-and-set sap-ref-16 %set-sap-ref-16
237     unsigned-reg positive-fixnum :short nil)
238   (def-system-ref-and-set signed-sap-ref-16 %set-signed-sap-ref-16
239     signed-reg tagged-num :short t)
240   (def-system-ref-and-set sap-ref-32 %set-sap-ref-32
241     unsigned-reg unsigned-num :long nil)
242   (def-system-ref-and-set signed-sap-ref-32 %set-signed-sap-ref-32
243     signed-reg signed-num :long t)
244   (def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
245     sap-reg system-area-pointer :long)
246   (def-system-ref-and-set sap-ref-single %set-sap-ref-single
247     single-reg single-float :float)
248   (def-system-ref-and-set sap-ref-double %set-sap-ref-double
249     double-reg double-float :float))
250
251 \f
252 ;;; Noise to convert normal lisp data objects into SAPs.
253
254 (define-vop (vector-sap)
255   (:translate vector-sap)
256   (:policy :fast-safe)
257   (:args (vector :scs (descriptor-reg)))
258   (:results (sap :scs (sap-reg)))
259   (:result-types system-area-pointer)
260   (:generator 2
261     (inst addi
262           (- (* vector-data-offset n-word-bytes) other-pointer-lowtag)
263           vector
264           sap)))
265
266 \f
267 ;;; Transforms for 64-bit SAP accessors.
268
269 ;;; FIXME: So these are now commented out on the SPARC, PPC and HPPA
270 ;;; backends. Did they ever serve a purpose? Could they in future? --
271 ;;; CSR, 2002-08-10
272 #|
273 (deftransform sap-ref-64 ((sap offset) (* *))
274   '(logior (ash (sap-ref-32 sap offset) 32)
275            (sap-ref-32 sap (+ offset 4))))
276
277 (deftransform signed-sap-ref-64 ((sap offset) (* *))
278   '(logior (ash (signed-sap-ref-32 sap offset) 32)
279            (sap-ref-32 sap (+ 4 offset))))
280
281 (deftransform %set-sap-ref-64 ((sap offset value) (* * *))
282   '(progn
283      (%set-sap-ref-32 sap offset (ash value -32))
284      (%set-sap-ref-32 sap (+ offset 4) (logand value #xffffffff))))
285
286 (deftransform %set-signed-sap-ref-64 ((sap offset value) (* * *))
287   '(progn
288      (%set-signed-sap-ref-32 sap offset (ash value -32))
289      (%set-sap-ref-32 sap (+ 4 offset) (logand value #xffffffff))))
290 |#