0.8.13.26:
[sbcl.git] / src / compiler / generic / vm-type.lisp
index 3bec6e1..6c9658e 100644 (file)
@@ -16,7 +16,7 @@
 
 ;;;; FIXME: I'm not sure where to put this. -- WHN 19990817
 
-(deftype sb!vm:word () `(unsigned-byte ,sb!vm:n-word-bits))
+(def!type sb!vm:word () `(unsigned-byte ,sb!vm:n-word-bits))
 \f
 ;;;; implementation-dependent DEFTYPEs
 
@@ -33,7 +33,7 @@
   `(single-float ,low ,high))
 
 ;;; an index into an integer
-(sb!xc:deftype bit-index () `(integer 0 ,most-positive-fixnum))
+(sb!xc:deftype bit-index () `(integer 0 ,sb!xc:most-positive-fixnum))
 
 ;;; worst-case values for float attributes
 (sb!xc:deftype float-exponent ()
@@ -43,6 +43,9 @@
   #!-long-float `(integer 0 ,sb!vm:double-float-digits)
   #!+long-float `(integer 0 ,sb!vm:long-float-digits))
 (sb!xc:deftype float-radix () '(integer 2 2))
+(sb!xc:deftype float-int-exponent ()
+  #!-long-float 'double-float-int-exponent
+  #!+long-float 'long-float-int-exponent)
 
 ;;; a code for BOOLE
 (sb!xc:deftype boole-code () '(unsigned-byte 4))
 
 (sb!xc:deftype bignum-element-type () `(unsigned-byte ,sb!vm:n-word-bits))
 (sb!xc:deftype bignum-type () 'bignum)
-(sb!xc:deftype bignum-index () 'index)
+;;; FIXME: see also DEFCONSTANT MAXIMUM-BIGNUM-LENGTH in
+;;; src/code/bignum.lisp.  -- CSR, 2004-07-19
+(sb!xc:deftype bignum-index ()
+  '(integer 0 #.(1- (ash 1 (- 32 sb!vm:n-widetag-bits)))))
 \f
 ;;;; hooks into the type system
 
                ;; them on the fly this way? (Call the new array
                ;; *SPECIALIZED-ARRAY-ELEMENT-SPECIFIER-TYPES* or something..)
                (let ((stype (specifier-type stype-name)))
+                 (aver (not (unknown-type-p stype)))
                  (when (csubtypep eltype stype)
                    (return stype))))))
     type))
 
+(defun sb!xc:upgraded-array-element-type (spec &optional environment)
+  #!+sb-doc
+  "Return the element type that will actually be used to implement an array
+   with the specifier :ELEMENT-TYPE Spec."
+  (declare (ignore environment))
+  (if (unknown-type-p (specifier-type spec))
+      (error "undefined type: ~S" spec)
+      (type-specifier (array-type-specialized-element-type
+                      (specifier-type `(array ,spec))))))
+
+(defun sb!xc:upgraded-complex-part-type (spec &optional environment)
+  #!+sb-doc
+  "Return the element type of the most specialized COMPLEX number type that
+   can hold parts of type SPEC."
+  (declare (ignore environment))
+  (if (unknown-type-p (specifier-type spec))
+      (error "undefined type: ~S" spec)
+      (let ((ctype (specifier-type `(complex ,spec))))
+       (cond
+         ((eq ctype *empty-type*) '(eql 0))
+         ((csubtypep ctype (specifier-type '(complex single-float)))
+          'single-float)
+         ((csubtypep ctype (specifier-type '(complex double-float)))
+          'double-float)
+         #!+long-float
+         ((csubtypep ctype (specifier-type '(complex long-float)))
+          'long-float)
+         ((csubtypep ctype (specifier-type '(complex rational)))
+          'rational)
+         (t 'real)))))
+
 ;;; Return the most specific integer type that can be quickly checked that
 ;;; includes the given type.
 (defun containing-integer-type (subtype)