1 ;;;; machine-independent aspects of the object representation and
4 ;;;; This software is part of the SBCL system. See the README file for
7 ;;;; This software is derived from the CMU CL system, which was
8 ;;;; written at Carnegie Mellon University and released into the
9 ;;;; public domain. The software is in the public domain and is
10 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
11 ;;;; files for more information.
15 ;;;; primitive type definitions
17 (/show0 "primtype.lisp 17")
19 (!def-primitive-type t (descriptor-reg))
20 (/show0 "primtype.lisp 20")
21 (setf *backend-t-primitive-type* (primitive-type-or-lose t))
23 ;;; primitive integer types that fit in registers
24 (/show0 "primtype.lisp 24")
25 (!def-primitive-type positive-fixnum (any-reg signed-reg unsigned-reg)
26 :type (unsigned-byte 29))
27 (/show0 "primtype.lisp 27")
29 (!def-primitive-type unsigned-byte-31 (signed-reg unsigned-reg descriptor-reg)
30 :type (unsigned-byte 31))
31 (/show0 "primtype.lisp 31")
33 (!def-primitive-type unsigned-byte-32 (unsigned-reg descriptor-reg)
34 :type (unsigned-byte 32))
35 (/show0 "primtype.lisp 35")
37 (!def-primitive-type unsigned-byte-63 (signed-reg unsigned-reg descriptor-reg)
38 :type (unsigned-byte 63))
40 (!def-primitive-type unsigned-byte-64 (unsigned-reg descriptor-reg)
41 :type (unsigned-byte 64))
42 (!def-primitive-type fixnum (any-reg signed-reg)
43 :type (signed-byte 30))
45 (!def-primitive-type signed-byte-32 (signed-reg descriptor-reg)
46 :type (signed-byte 32))
48 (!def-primitive-type signed-byte-64 (signed-reg descriptor-reg)
49 :type (signed-byte 64))
51 (defvar *fixnum-primitive-type* (primitive-type-or-lose 'fixnum))
53 (/show0 "primtype.lisp 53")
54 (!def-primitive-type-alias tagged-num (:or positive-fixnum fixnum))
55 (!def-primitive-type-alias unsigned-num (:or #!-alpha unsigned-byte-32
56 #!-alpha unsigned-byte-31
57 #!+alpha unsigned-byte-64
58 #!+alpha unsigned-byte-63
60 (!def-primitive-type-alias signed-num (:or #!-alpha signed-byte-32
61 #!+alpha signed-byte-64
63 #!-alpha unsigned-byte-31
64 #!+alpha unsigned-byte-63
67 ;;; other primitive immediate types
68 (/show0 "primtype.lisp 68")
69 (!def-primitive-type base-char (base-char-reg any-reg))
71 ;;; primitive pointer types
72 (/show0 "primtype.lisp 73")
73 (!def-primitive-type function (descriptor-reg))
74 (!def-primitive-type list (descriptor-reg))
75 (!def-primitive-type instance (descriptor-reg))
77 (/show0 "primtype.lisp 77")
78 (!def-primitive-type funcallable-instance (descriptor-reg))
80 ;;; primitive other-pointer number types
81 (/show0 "primtype.lisp 81")
82 (!def-primitive-type bignum (descriptor-reg))
83 (!def-primitive-type ratio (descriptor-reg))
84 (!def-primitive-type complex (descriptor-reg))
85 (/show0 "about to !DEF-PRIMITIVE-TYPE SINGLE-FLOAT")
86 (!def-primitive-type single-float (single-reg descriptor-reg))
87 (/show0 "about to !DEF-PRIMITIVE-TYPE DOUBLE-FLOAT")
88 (!def-primitive-type double-float (double-reg descriptor-reg))
90 (!def-primitive-type long-float (long-reg descriptor-reg))
91 (/show0 "about to !DEF-PRIMITIVE-TYPE COMPLEX-SINGLE-FLOAT")
92 (!def-primitive-type complex-single-float (complex-single-reg descriptor-reg)
93 :type (complex single-float))
94 (/show0 "about to !DEF-PRIMITIVE-TYPE COMPLEX-DOUBLE-FLOAT")
95 (!def-primitive-type complex-double-float (complex-double-reg descriptor-reg)
96 :type (complex double-float))
98 (!def-primitive-type complex-long-float (complex-long-reg descriptor-reg)
99 :type (complex long-float))
101 ;;; primitive other-pointer array types
102 (/show0 "primtype.lisp 96")
103 (!def-primitive-type simple-string (descriptor-reg)
104 :type simple-base-string)
105 (!def-primitive-type simple-bit-vector (descriptor-reg))
106 (!def-primitive-type simple-vector (descriptor-reg))
107 (!def-primitive-type simple-array-unsigned-byte-2 (descriptor-reg)
108 :type (simple-array (unsigned-byte 2) (*)))
109 (!def-primitive-type simple-array-unsigned-byte-4 (descriptor-reg)
110 :type (simple-array (unsigned-byte 4) (*)))
111 (!def-primitive-type simple-array-unsigned-byte-8 (descriptor-reg)
112 :type (simple-array (unsigned-byte 8) (*)))
113 (!def-primitive-type simple-array-unsigned-byte-16 (descriptor-reg)
114 :type (simple-array (unsigned-byte 16) (*)))
115 (!def-primitive-type simple-array-unsigned-byte-32 (descriptor-reg)
116 :type (simple-array (unsigned-byte 32) (*)))
117 (!def-primitive-type simple-array-signed-byte-8 (descriptor-reg)
118 :type (simple-array (signed-byte 8) (*)))
119 (!def-primitive-type simple-array-signed-byte-16 (descriptor-reg)
120 :type (simple-array (signed-byte 16) (*)))
121 (!def-primitive-type simple-array-signed-byte-30 (descriptor-reg)
122 :type (simple-array (signed-byte 30) (*)))
123 (!def-primitive-type simple-array-signed-byte-32 (descriptor-reg)
124 :type (simple-array (signed-byte 32) (*)))
125 (!def-primitive-type simple-array-single-float (descriptor-reg)
126 :type (simple-array single-float (*)))
127 (!def-primitive-type simple-array-double-float (descriptor-reg)
128 :type (simple-array double-float (*)))
130 (!def-primitive-type simple-array-long-float (descriptor-reg)
131 :type (simple-array long-float (*)))
132 (!def-primitive-type simple-array-complex-single-float (descriptor-reg)
133 :type (simple-array (complex single-float) (*)))
134 (!def-primitive-type simple-array-complex-double-float (descriptor-reg)
135 :type (simple-array (complex double-float) (*)))
137 (!def-primitive-type simple-array-complex-long-float (descriptor-reg)
138 :type (simple-array (complex long-float) (*)))
140 ;;; Note: The complex array types are not included, 'cause it is pointless to
141 ;;; restrict VOPs to them.
143 ;;; other primitive other-pointer types
144 (!def-primitive-type system-area-pointer (sap-reg descriptor-reg))
145 (!def-primitive-type weak-pointer (descriptor-reg))
147 ;;; miscellaneous primitive types that don't exist at the LISP level
148 (!def-primitive-type catch-block (catch-block) :type nil)
150 ;;;; PRIMITIVE-TYPE-OF and friends
152 ;;; Return the most restrictive primitive type that contains Object.
153 (/show0 "primtype.lisp 147")
154 (!def-vm-support-routine primitive-type-of (object)
155 (let ((type (ctype-of object)))
156 (cond ((not (member-type-p type)) (primitive-type type))
157 ((equal (member-type-members type) '(nil))
158 (primitive-type-or-lose 'list))
160 *backend-t-primitive-type*))))
162 (defvar *simple-array-primitive-types*
163 '((base-char . simple-string)
164 (bit . simple-bit-vector)
165 ((unsigned-byte 2) . simple-array-unsigned-byte-2)
166 ((unsigned-byte 4) . simple-array-unsigned-byte-4)
167 ((unsigned-byte 8) . simple-array-unsigned-byte-8)
168 ((unsigned-byte 16) . simple-array-unsigned-byte-16)
169 ((unsigned-byte 32) . simple-array-unsigned-byte-32)
170 ((signed-byte 8) . simple-array-signed-byte-8)
171 ((signed-byte 16) . simple-array-signed-byte-16)
172 (fixnum . simple-array-signed-byte-30)
173 ((signed-byte 32) . simple-array-signed-byte-32)
174 (single-float . simple-array-single-float)
175 (double-float . simple-array-double-float)
176 #!+long-float (long-float . simple-array-long-float)
177 ((complex single-float) . simple-array-complex-single-float)
178 ((complex double-float) . simple-array-complex-double-float)
180 ((complex long-float) . simple-array-complex-long-float)
183 "An a-list for mapping simple array element types to their
184 corresponding primitive types.")
186 ;;; Return the primitive type corresponding to a type descriptor
187 ;;; structure. The second value is true when the primitive type is
188 ;;; exactly equivalent to the argument Lisp type.
190 ;;; In a bootstrapping situation, we should be careful to use the
191 ;;; correct values for the system parameters.
193 ;;; We need an aux function because we need to use both
194 ;;; !DEF-VM-SUPPORT-ROUTINE and DEFUN-CACHED.
195 (/show0 "primtype.lisp 188")
196 (!def-vm-support-routine primitive-type (type)
197 (primitive-type-aux type))
198 (/show0 "primtype.lisp 191")
199 (defun-cached (primitive-type-aux
200 :hash-function (lambda (x)
201 (logand (type-hash-value x) #x1FF))
204 :default (values nil :empty))
206 (declare (type ctype type))
207 (macrolet ((any () '(values *backend-t-primitive-type* nil))
209 `(values (primitive-type-or-lose ',type) t))
211 `(values (primitive-type-or-lose ',type) nil)))
212 (flet ((maybe-numeric-type-union (t1 t2)
213 (let ((t1-name (primitive-type-name t1))
214 (t2-name (primitive-type-name t2)))
217 (if (or (eq t2-name 'fixnum)
218 (eq t2-name #!-alpha 'signed-byte-32
219 #!+alpha 'signed-byte-64)
220 (eq t2-name #!-alpha 'unsigned-byte-31
221 #!+alpha 'unsigned-byte-63)
222 (eq t2-name #!-alpha 'unsigned-byte-32
223 #!+alpha 'unsigned-byte-64))
227 (#!-alpha signed-byte-32
228 #!+alpha signed-byte-64 t2)
229 (#!-alpha unsigned-byte-31
230 #!+alpha unsigned-byte-63
231 (primitive-type-or-lose
232 #!-alpha 'signed-byte-32
233 #!+alpha 'signed-byte-64))))
234 (#!-alpha signed-byte-32
235 #!+alpha signed-byte-64
236 (if (eq t2-name #!-alpha 'unsigned-byte-31
237 #!+alpha 'unsigned-byte-63)
239 (#!-alpha unsigned-byte-31
240 #!+alpha unsigned-byte-63
241 (if (eq t2-name #!-alpha 'unsigned-byte-32
242 #!+alpha 'unsigned-byte-64)
246 (let ((lo (numeric-type-low type))
247 (hi (numeric-type-high type)))
248 (case (numeric-type-complexp type)
250 (case (numeric-type-class type)
254 `((positive-fixnum 0 ,(1- (ash 1 29)))
256 (unsigned-byte-31 0 ,(1- (ash 1 31)))
258 (unsigned-byte-32 0 ,(1- (ash 1 32)))
260 (unsigned-byte-63 0 ,(1- (ash 1 63)))
262 (unsigned-byte-64 0 ,(1- (ash 1 64)))
266 (signed-byte-32 ,(ash -1 31)
269 (signed-byte-64 ,(ash -1 63)
271 (if (or (< hi (ash -1 29))
272 (> lo (1- (ash 1 29))))
275 (let ((type (car spec))
278 (when (<= min lo hi max)
280 (primitive-type-or-lose type)
281 (and (= lo min) (= hi max))))))))
282 ((or (and hi (< hi most-negative-fixnum))
283 (and lo (> lo most-positive-fixnum)))
288 (let ((exact (and (null lo) (null hi))))
289 (case (numeric-type-format type)
290 ((short-float single-float)
291 (values (primitive-type-or-lose 'single-float)
293 ((double-float #!-long-float long-float)
294 (values (primitive-type-or-lose 'double-float)
298 (values (primitive-type-or-lose 'long-float)
305 (if (eq (numeric-type-class type) 'float)
306 (let ((exact (and (null lo) (null hi))))
307 (case (numeric-type-format type)
308 ((short-float single-float)
309 (values (primitive-type-or-lose 'complex-single-float)
311 ((double-float #!-long-float long-float)
312 (values (primitive-type-or-lose 'complex-double-float)
316 (values (primitive-type-or-lose 'complex-long-float)
324 (if (array-type-complexp type)
326 (let* ((dims (array-type-dimensions type))
327 (etype (array-type-specialized-element-type type))
328 (type-spec (type-specifier etype))
329 (ptype (cdr (assoc type-spec *simple-array-primitive-types*
331 (if (and (consp dims) (null (rest dims)) ptype)
332 (values (primitive-type-or-lose ptype)
333 (eq (first dims) '*))
336 (if (type= type (specifier-type 'list))
338 (let ((types (union-type-types type)))
339 (multiple-value-bind (res exact) (primitive-type (first types))
340 (dolist (type (rest types) (values res exact))
341 (multiple-value-bind (ptype ptype-exact)
342 (primitive-type type)
343 (unless ptype-exact (setq exact nil))
344 (unless (eq ptype res)
346 (or (maybe-numeric-type-union res ptype)
347 (maybe-numeric-type-union ptype res))))
350 (return (any)))))))))))
352 (let* ((members (member-type-members type))
353 (res (primitive-type-of (first members))))
354 (dolist (mem (rest members) (values res nil))
355 (let ((ptype (primitive-type-of mem)))
356 (unless (eq ptype res)
357 (let ((new-ptype (or (maybe-numeric-type-union res ptype)
358 (maybe-numeric-type-union ptype res))))
361 (return (any)))))))))
363 (ecase (named-type-name type)
364 ((t *) (values *backend-t-primitive-type* t))
366 (sb!xc:built-in-class
367 (case (sb!xc:class-name type)
368 ((complex function instance
369 system-area-pointer weak-pointer)
370 (values (primitive-type-or-lose (sb!xc:class-name type)) t))
371 (funcallable-instance
382 (if (csubtypep type (specifier-type 'function))
388 (/show0 "primtype.lisp end of file")