X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fvm-type.lisp;h=85c1b0b8af7b94b031a66ae7429c36e13e5bb4e3;hb=b63c4fb9b98fa8188e17ba926e150ba417a74635;hp=cde035f63deb13d33a0f1277c4e3c50498657048;hpb=cd1f265dd851941557ed3f764248c339c07493a9;p=sbcl.git diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index cde035f..85c1b0b 100644 --- a/src/compiler/generic/vm-type.lisp +++ b/src/compiler/generic/vm-type.lisp @@ -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)) ;;;; 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)) @@ -70,7 +73,10 @@ (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))))) ;;;; hooks into the type system @@ -124,6 +130,40 @@ (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)) + (let ((type (specifier-type spec))) + (cond + ((eq type *empty-type*) nil) + ((unknown-type-p type) (error "undefined type: ~S" spec)) + (t + (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)