9a168ea2283778c4c1f47a9272c1fca105d2c7ba
[sbcl.git] / src / compiler / generic / late-type-vops.lisp
1 ;;;; generic type testing and checking VOPs
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
11 (in-package "SB!VM")
12 \f
13 (!define-type-vops fixnump check-fixnum fixnum object-not-fixnum-error
14   (even-fixnum-lowtag odd-fixnum-lowtag)
15   ;; we can save a register on the x86.
16   :variant simple
17   ;; we can save a couple of instructions and a branch on the ppc.
18   ;; FIXME: make this be FIXNUM-MASK
19   :mask 3)
20
21 (!define-type-vops functionp check-fun function object-not-fun-error
22   (fun-pointer-lowtag)
23   :mask lowtag-mask)
24
25 (!define-type-vops listp check-list list object-not-list-error
26   (list-pointer-lowtag)
27   :mask lowtag-mask)
28
29 (!define-type-vops %instancep check-instance instance object-not-instance-error
30   (instance-pointer-lowtag)
31   :mask lowtag-mask)
32
33 (!define-type-vops bignump check-bignum bignum object-not-bignum-error
34   (bignum-widetag))
35
36 (!define-type-vops ratiop check-ratio ratio object-not-ratio-error
37   (ratio-widetag))
38
39 (!define-type-vops complexp check-complex complex object-not-complex-error
40   (complex-widetag complex-single-float-widetag complex-double-float-widetag
41                    #!+long-float complex-long-float-widetag))
42
43 (!define-type-vops complex-rational-p check-complex-rational nil
44     object-not-complex-rational-error
45   (complex-widetag))
46
47 (!define-type-vops complex-float-p check-complex-float nil
48     object-not-complex-float-error
49   (complex-single-float-widetag complex-double-float-widetag
50                                 #!+long-float complex-long-float-widetag))
51
52 (!define-type-vops complex-single-float-p check-complex-single-float complex-single-float
53     object-not-complex-single-float-error
54   (complex-single-float-widetag))
55
56 (!define-type-vops complex-double-float-p check-complex-double-float complex-double-float
57     object-not-complex-double-float-error
58   (complex-double-float-widetag))
59
60 #!+long-float
61 (!define-type-vops complex-long-float-p check-complex-long-float complex-long-float
62     object-not-complex-long-float-error
63   (complex-long-float-widetag))
64
65 (!define-type-vops single-float-p check-single-float single-float
66     object-not-single-float-error
67   (single-float-widetag))
68
69 (!define-type-vops double-float-p check-double-float double-float
70     object-not-double-float-error
71   (double-float-widetag))
72
73 #!+long-float
74 (!define-type-vops long-float-p check-long-float long-float
75     object-not-long-float-error
76   (long-float-widetag))
77
78 (!define-type-vops simple-string-p check-simple-string nil
79     object-not-simple-string-error
80   (simple-base-string-widetag simple-array-nil-widetag))
81
82 (!define-type-vops simple-base-string-p check-simple-base-string simple-base-string
83     object-not-simple-base-string-error
84   (simple-base-string-widetag))
85
86 (!define-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
87     object-not-simple-bit-vector-error
88   (simple-bit-vector-widetag))
89
90 (!define-type-vops simple-vector-p check-simple-vector simple-vector
91     object-not-simple-vector-error
92   (simple-vector-widetag))
93
94 (!define-type-vops simple-array-nil-p
95                    check-simple-array-nil
96                    simple-array-nil
97                    object-not-simple-array-nil-error
98   (simple-array-nil-widetag))
99                    
100 (!define-type-vops simple-array-unsigned-byte-2-p
101       check-simple-array-unsigned-byte-2
102       simple-array-unsigned-byte-2
103     object-not-simple-array-unsigned-byte-2-error
104   (simple-array-unsigned-byte-2-widetag))
105
106 (!define-type-vops simple-array-unsigned-byte-4-p
107       check-simple-array-unsigned-byte-4
108       simple-array-unsigned-byte-4
109     object-not-simple-array-unsigned-byte-4-error
110   (simple-array-unsigned-byte-4-widetag))
111
112 (!define-type-vops simple-array-unsigned-byte-8-p
113       check-simple-array-unsigned-byte-8
114       simple-array-unsigned-byte-8
115     object-not-simple-array-unsigned-byte-8-error
116   (simple-array-unsigned-byte-8-widetag))
117
118 (!define-type-vops simple-array-unsigned-byte-16-p
119       check-simple-array-unsigned-byte-16
120       simple-array-unsigned-byte-16
121     object-not-simple-array-unsigned-byte-16-error
122   (simple-array-unsigned-byte-16-widetag))
123
124 (!define-type-vops simple-array-unsigned-byte-32-p
125       check-simple-array-unsigned-byte-32
126       simple-array-unsigned-byte-32
127     object-not-simple-array-unsigned-byte-32-error
128   (simple-array-unsigned-byte-32-widetag))
129
130 (!define-type-vops simple-array-signed-byte-8-p
131       check-simple-array-signed-byte-8
132       simple-array-signed-byte-8
133     object-not-simple-array-signed-byte-8-error
134   (simple-array-signed-byte-8-widetag))
135
136 (!define-type-vops simple-array-signed-byte-16-p
137       check-simple-array-signed-byte-16
138       simple-array-signed-byte-16
139     object-not-simple-array-signed-byte-16-error
140   (simple-array-signed-byte-16-widetag))
141
142 (!define-type-vops simple-array-signed-byte-30-p
143       check-simple-array-signed-byte-30
144       simple-array-signed-byte-30
145     object-not-simple-array-signed-byte-30-error
146   (simple-array-signed-byte-30-widetag))
147
148 (!define-type-vops simple-array-signed-byte-32-p
149       check-simple-array-signed-byte-32
150       simple-array-signed-byte-32
151     object-not-simple-array-signed-byte-32-error
152   (simple-array-signed-byte-32-widetag))
153
154 (!define-type-vops simple-array-single-float-p check-simple-array-single-float
155       simple-array-single-float
156     object-not-simple-array-single-float-error
157   (simple-array-single-float-widetag))
158
159 (!define-type-vops simple-array-double-float-p check-simple-array-double-float
160       simple-array-double-float
161     object-not-simple-array-double-float-error
162   (simple-array-double-float-widetag))
163
164 #!+long-float
165 (!define-type-vops simple-array-long-float-p check-simple-array-long-float
166       simple-array-long-float
167     object-not-simple-array-long-float-error
168   (simple-array-long-float-widetag))
169
170 (!define-type-vops simple-array-complex-single-float-p
171       check-simple-array-complex-single-float
172       simple-array-complex-single-float
173     object-not-simple-array-complex-single-float-error
174   (simple-array-complex-single-float-widetag))
175
176 (!define-type-vops simple-array-complex-double-float-p
177       check-simple-array-complex-double-float
178       simple-array-complex-double-float
179     object-not-simple-array-complex-double-float-error
180   (simple-array-complex-double-float-widetag))
181
182 #!+long-float
183 (!define-type-vops simple-array-complex-long-float-p
184       check-simple-array-complex-long-float
185       simple-array-complex-long-float
186     object-not-simple-array-complex-long-float-error
187   (simple-array-complex-long-float-widetag))
188
189 (!define-type-vops base-char-p check-base-char base-char
190     object-not-base-char-error
191   (base-char-widetag))
192
193 (!define-type-vops system-area-pointer-p check-system-area-pointer
194       system-area-pointer
195     object-not-sap-error
196   (sap-widetag))
197
198 (!define-type-vops weak-pointer-p check-weak-pointer weak-pointer
199     object-not-weak-pointer-error
200   (weak-pointer-widetag))
201
202 (!define-type-vops code-component-p nil nil nil
203   (code-header-widetag))
204
205 (!define-type-vops lra-p nil nil nil
206   (return-pc-header-widetag))
207
208 (!define-type-vops fdefn-p nil nil nil
209   (fdefn-widetag))
210
211 (!define-type-vops funcallable-instance-p nil nil nil
212   (funcallable-instance-header-widetag))
213
214 (!define-type-vops array-header-p nil nil nil
215   (simple-array-widetag complex-base-string-widetag complex-bit-vector-widetag
216    complex-vector-widetag complex-array-widetag complex-vector-nil-widetag))
217
218 (!define-type-vops stringp check-string nil object-not-string-error
219   (simple-base-string-widetag complex-base-string-widetag
220    simple-array-nil-widetag complex-vector-nil-widetag))
221
222 (!define-type-vops base-string-p check-base-string nil object-not-base-string-error
223   (simple-base-string-widetag complex-base-string-widetag))
224
225 (!define-type-vops bit-vector-p check-bit-vector nil
226     object-not-bit-vector-error
227   (simple-bit-vector-widetag complex-bit-vector-widetag))
228
229 (!define-type-vops vector-nil-p check-vector-nil nil
230     object-not-vector-nil-error
231   (simple-array-nil-widetag complex-vector-nil-widetag))
232
233 (!define-type-vops vectorp check-vector nil object-not-vector-error
234   (simple-base-string-widetag
235    simple-array-nil-widetag
236    simple-bit-vector-widetag
237    simple-vector-widetag
238    simple-array-unsigned-byte-2-widetag
239    simple-array-unsigned-byte-4-widetag
240    simple-array-unsigned-byte-8-widetag
241    simple-array-unsigned-byte-16-widetag
242    simple-array-unsigned-byte-32-widetag
243    simple-array-signed-byte-8-widetag
244    simple-array-signed-byte-16-widetag
245    simple-array-signed-byte-30-widetag
246    simple-array-signed-byte-32-widetag
247    simple-array-single-float-widetag
248    simple-array-double-float-widetag
249    #!+long-float simple-array-long-float-widetag
250    simple-array-complex-single-float-widetag
251    simple-array-complex-double-float-widetag
252    #!+long-float simple-array-complex-long-float-widetag
253    complex-base-string-widetag
254    complex-vector-nil-widetag
255    complex-bit-vector-widetag
256    complex-vector-widetag))
257
258 ;;; Note that this "type VOP" is sort of an oddball; it doesn't so
259 ;;; much test for a Lisp-level type as just expose a low-level type
260 ;;; code at the Lisp level. It is used as a building block to help us
261 ;;; to express things like the test for (TYPEP FOO '(VECTOR T))
262 ;;; efficiently in Lisp code, but it doesn't correspond to any type
263 ;;; expression which would actually occur in reasonable application
264 ;;; code. (Common Lisp doesn't have any natural way of expressing this
265 ;;; type.) Thus, there's no point in building up the full machinery of
266 ;;; associated backend type predicates and so forth as we do for
267 ;;; ordinary type VOPs.
268 (!define-type-vops complex-vector-p check-complex-vector nil
269     object-not-complex-vector-error
270   (complex-vector-widetag))
271
272 (!define-type-vops simple-array-p check-simple-array nil
273     object-not-simple-array-error
274   (simple-array-widetag
275    simple-base-string-widetag
276    simple-array-nil-widetag
277    simple-bit-vector-widetag
278    simple-vector-widetag
279    simple-array-unsigned-byte-2-widetag
280    simple-array-unsigned-byte-4-widetag
281    simple-array-unsigned-byte-8-widetag
282    simple-array-unsigned-byte-16-widetag
283    simple-array-unsigned-byte-32-widetag
284    simple-array-signed-byte-8-widetag
285    simple-array-signed-byte-16-widetag
286    simple-array-signed-byte-30-widetag
287    simple-array-signed-byte-32-widetag
288    simple-array-single-float-widetag
289    simple-array-double-float-widetag
290    #!+long-float simple-array-long-float-widetag
291    simple-array-complex-single-float-widetag
292    simple-array-complex-double-float-widetag
293    #!+long-float simple-array-complex-long-float-widetag))
294
295 (!define-type-vops arrayp check-array nil object-not-array-error
296   (simple-array-widetag
297    simple-base-string-widetag
298    simple-array-nil-widetag
299    simple-bit-vector-widetag
300    simple-vector-widetag
301    simple-array-unsigned-byte-2-widetag
302    simple-array-unsigned-byte-4-widetag
303    simple-array-unsigned-byte-8-widetag
304    simple-array-unsigned-byte-16-widetag
305    simple-array-unsigned-byte-32-widetag
306    simple-array-signed-byte-8-widetag
307    simple-array-signed-byte-16-widetag
308    simple-array-signed-byte-30-widetag
309    simple-array-signed-byte-32-widetag
310    simple-array-single-float-widetag
311    simple-array-double-float-widetag
312    #!+long-float simple-array-long-float-widetag
313    simple-array-complex-single-float-widetag
314    simple-array-complex-double-float-widetag
315    #!+long-float simple-array-complex-long-float-widetag
316    complex-base-string-widetag
317    complex-vector-nil-widetag
318    complex-bit-vector-widetag
319    complex-vector-widetag
320    complex-array-widetag))
321
322 (!define-type-vops numberp check-number nil object-not-number-error
323   (even-fixnum-lowtag
324    odd-fixnum-lowtag
325    bignum-widetag
326    ratio-widetag
327    single-float-widetag
328    double-float-widetag
329    #!+long-float long-float-widetag
330    complex-widetag
331    complex-single-float-widetag
332    complex-double-float-widetag
333    #!+long-float complex-long-float-widetag))
334
335 (!define-type-vops rationalp check-rational nil object-not-rational-error
336   (even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag))
337
338 (!define-type-vops integerp check-integer nil object-not-integer-error
339   (even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag))
340
341 (!define-type-vops floatp check-float nil object-not-float-error
342   (single-float-widetag double-float-widetag #!+long-float long-float-widetag))
343
344 (!define-type-vops realp check-real nil object-not-real-error
345   (even-fixnum-lowtag
346    odd-fixnum-lowtag
347    ratio-widetag
348    bignum-widetag
349    single-float-widetag
350    double-float-widetag
351    #!+long-float long-float-widetag))