Allow raw slots in fixedobj_points_to_younger_p()
[sbcl.git] / src / compiler / hppa / system.lisp
blob134781aad5ecbdc7e85ec24d547ef4f1d6f059ac
1 (in-package "SB!VM")
3 \f
4 ;;;; Type frobbing VOPs
6 (define-vop (lowtag-of)
7 (:translate lowtag-of)
8 (:policy :fast-safe)
9 (:args (object :scs (any-reg descriptor-reg) :target result))
10 (:results (result :scs (unsigned-reg)))
11 (:result-types positive-fixnum)
12 (:generator 1
13 (inst extru object 31 n-lowtag-bits result)))
15 ;FIX this vop got instruction-exploded after mips convert, look at old hppa
16 (define-vop (widetag-of)
17 (:translate widetag-of)
18 (:policy :fast-safe)
19 (:args (object :scs (descriptor-reg)))
20 (:temporary (:scs (non-descriptor-reg)) temp1 temp2)
21 (:results (result :scs (unsigned-reg)))
22 (:result-types positive-fixnum)
23 (:generator 6
24 (inst li lowtag-mask temp1)
25 (inst li other-pointer-lowtag temp2)
26 (inst and temp1 object temp1)
27 (inst xor temp1 temp2 temp1)
28 (inst comb := temp1 zero-tn OTHER-PTR)
29 (inst li (logxor other-pointer-lowtag fun-pointer-lowtag) temp2)
30 (inst xor temp1 temp2 temp1)
31 (inst comb := temp1 zero-tn FUNCTION-PTR)
32 (inst li fixnum-tag-mask temp1) ; pick off fixnums
33 (inst li 1 temp2)
34 (inst and temp1 object result)
35 (inst comb := result zero-tn DONE)
37 (inst and object temp2 result)
38 (inst comb :<> result zero-tn LOWTAG-ONLY :nullify t)
40 ;; must be an other immediate
41 (inst li widetag-mask temp2)
42 (inst b DONE)
43 (inst and temp2 object result)
45 FUNCTION-PTR
46 (load-type result object (- fun-pointer-lowtag))
47 (inst b done :nullify t)
49 LOWTAG-ONLY
50 (inst li lowtag-mask temp1)
51 (inst b done)
52 (inst and object temp1 result)
54 OTHER-PTR
55 (load-type result object (- other-pointer-lowtag))
57 DONE))
59 (define-vop (%other-pointer-widetag)
60 (:translate %other-pointer-widetag)
61 (:policy :fast-safe)
62 (:args (object :scs (descriptor-reg)))
63 (:results (result :scs (unsigned-reg)))
64 (:result-types positive-fixnum)
65 (:generator 6
66 (load-type result object (- other-pointer-lowtag))))
68 (define-vop (fun-subtype)
69 (:translate fun-subtype)
70 (:policy :fast-safe)
71 (:args (function :scs (descriptor-reg)))
72 (:results (result :scs (unsigned-reg)))
73 (:result-types positive-fixnum)
74 (:generator 6
75 (load-type result function (- fun-pointer-lowtag))))
77 (define-vop (get-header-data)
78 (:translate get-header-data)
79 (:policy :fast-safe)
80 (:args (x :scs (descriptor-reg)))
81 (:results (res :scs (unsigned-reg)))
82 (:result-types positive-fixnum)
83 (:generator 6
84 (loadw res x 0 other-pointer-lowtag)
85 (inst srl res n-widetag-bits res)))
87 (define-vop (get-closure-length)
88 (:translate get-closure-length)
89 (:policy :fast-safe)
90 (:args (x :scs (descriptor-reg)))
91 (:results (res :scs (unsigned-reg)))
92 (:result-types positive-fixnum)
93 (:generator 6
94 (loadw res x 0 fun-pointer-lowtag)
95 (inst srl res n-widetag-bits res)))
96 ;;; FIXME-lav, not sure we need data of type immediate and zero, test without,
97 ;;; if so revert to old hppa code
98 (define-vop (set-header-data)
99 (:translate set-header-data)
100 (:policy :fast-safe)
101 (:args (x :scs (descriptor-reg) :target res)
102 (data :scs (any-reg immediate zero)))
103 (:arg-types * positive-fixnum)
104 (:results (res :scs (descriptor-reg)))
105 (:temporary (:scs (non-descriptor-reg)) t1 t2)
106 (:generator 6
107 (loadw t1 x 0 other-pointer-lowtag)
108 ;; replace below 2 inst with: (mask widetag-mask t1 t1)
109 (inst li widetag-mask t2)
110 (inst and t1 t2 t1)
111 (sc-case data
112 (any-reg
113 (inst sll data (- n-widetag-bits 2) t2)
114 (inst or t1 t2 t1))
115 (immediate
116 (inst li (ash (tn-value data) n-widetag-bits) t2)
117 (inst or t1 t2 t1))
118 (zero))
120 (storew t1 x 0 other-pointer-lowtag)
121 (move x res)))
123 (define-vop (pointer-hash)
124 (:translate pointer-hash)
125 (:args (ptr :scs (any-reg descriptor-reg)))
126 (:results (res :scs (any-reg descriptor-reg)))
127 (:policy :fast-safe)
128 (:generator 1
129 (inst zdep ptr n-positive-fixnum-bits n-positive-fixnum-bits res)))
131 ;;;; Allocation
133 (define-vop (dynamic-space-free-pointer)
134 (:results (int :scs (sap-reg)))
135 (:result-types system-area-pointer)
136 (:translate dynamic-space-free-pointer)
137 (:policy :fast-safe)
138 (:generator 1
139 (move alloc-tn int)))
141 (define-vop (binding-stack-pointer-sap)
142 (:results (int :scs (sap-reg)))
143 (:result-types system-area-pointer)
144 (:translate binding-stack-pointer-sap)
145 (:policy :fast-safe)
146 (:generator 1
147 (move bsp-tn int)))
149 (define-vop (control-stack-pointer-sap)
150 (:results (int :scs (sap-reg)))
151 (:result-types system-area-pointer)
152 (:translate control-stack-pointer-sap)
153 (:policy :fast-safe)
154 (:generator 1
155 (move csp-tn int)))
158 ;;;; Code object frobbing.
160 (define-vop (code-instructions)
161 (:translate code-instructions)
162 (:policy :fast-safe)
163 (:args (code :scs (descriptor-reg)))
164 (:temporary (:scs (non-descriptor-reg)) ndescr)
165 (:results (sap :scs (sap-reg)))
166 (:result-types system-area-pointer)
167 (:generator 10
168 (loadw ndescr code 0 other-pointer-lowtag)
169 (inst srl ndescr n-widetag-bits ndescr)
170 (inst sll ndescr word-shift ndescr)
171 (inst addi (- other-pointer-lowtag) ndescr ndescr)
172 (inst add code ndescr sap)))
174 (define-vop (compute-fun)
175 (:args (code :scs (descriptor-reg))
176 (offset :scs (signed-reg unsigned-reg)))
177 (:arg-types * positive-fixnum)
178 (:results (func :scs (descriptor-reg)))
179 (:temporary (:scs (non-descriptor-reg)) ndescr)
180 (:generator 10
181 (loadw ndescr code 0 other-pointer-lowtag)
182 ;; FIXME-lav: replace below two with DEPW
183 (inst srl ndescr n-widetag-bits ndescr)
184 (inst sll ndescr word-shift ndescr)
185 (inst add ndescr offset ndescr)
186 (inst addi (- fun-pointer-lowtag other-pointer-lowtag) ndescr ndescr)
187 (inst add ndescr code func)))
190 ;;;; Other random VOPs.
193 (defknown sb!unix::receive-pending-interrupt () (values))
194 (define-vop (sb!unix::receive-pending-interrupt)
195 (:policy :fast-safe)
196 (:translate sb!unix::receive-pending-interrupt)
197 (:generator 1
198 (inst break pending-interrupt-trap)))
201 (define-vop (halt)
202 (:generator 1
203 (inst break halt-trap)))
205 #!+hpux
206 (define-vop (setup-return-from-lisp-stub)
207 (:results)
208 (:save-p t)
209 (:temporary (:sc any-reg :offset nl0-offset) nl0)
210 (:temporary (:sc any-reg :offset cfunc-offset) cfunc)
211 (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save)
212 (:temporary (:scs (non-descriptor-reg)) temp)
213 (:vop-var vop)
214 (:generator 100
215 (let ((stub (make-fixup 'return-from-lisp-stub :assembly-routine)))
216 (inst li stub nl0))
217 (let ((cur-nfp (current-nfp-tn vop)))
218 (when cur-nfp
219 (store-stack-tn nfp-save cur-nfp))
220 (inst li (make-fixup "setup_return_from_lisp_stub" :foreign) cfunc)
221 (let ((fixup (make-fixup "call_into_c" :foreign)))
222 (inst ldil fixup temp)
223 (inst ble fixup c-text-space temp))
224 (inst addi 64 nsp-tn nsp-tn)
225 (inst addi -64 nsp-tn nsp-tn)
226 (when cur-nfp
227 (load-stack-tn cur-nfp nfp-save)))))
229 ;;;; Dynamic vop count collection support
231 (define-vop (count-me)
232 (:args (count-vector :scs (descriptor-reg)))
233 (:info index)
234 (:temporary (:scs (non-descriptor-reg)) count)
235 (:generator 1
236 (let ((offset
237 (- (* (+ index vector-data-offset) n-word-bytes) other-pointer-lowtag)))
238 (inst ldw offset count-vector count)
239 (inst addi 1 count count)
240 (inst stw count offset count-vector))))
242 ;;;; Dummy definition for a spin-loop hint VOP
243 (define-vop (spin-loop-hint)
244 (:translate spin-loop-hint)
245 (:policy :fast-safe)
246 (:generator 0))