X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fvm-type.lisp;h=f447b9c82183335b4cd025f7f025458ff553bf0e;hb=cd5a858174d892f876699373dc3ea389cf2c4d40;hp=c214fe8a74e6cf64863cc6c6598a54fd9a5093b4;hpb=a4cffc065c83d046fce193919bf6d4e53f181455;p=sbcl.git diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index c214fe8..f447b9c 100644 --- a/src/compiler/generic/vm-type.lisp +++ b/src/compiler/generic/vm-type.lisp @@ -17,6 +17,8 @@ ;;;; FIXME: I'm not sure where to put this. -- WHN 19990817 (def!type sb!vm:word () `(unsigned-byte ,sb!vm:n-word-bits)) +(def!type sb!vm:signed-word () `(signed-byte ,sb!vm:n-word-bits)) + ;;;; implementation-dependent DEFTYPEs @@ -59,7 +61,7 @@ ;;; PATHNAME pieces, as returned by the PATHNAME-xxx functions (sb!xc:deftype pathname-host () '(or sb!impl::host null)) (sb!xc:deftype pathname-device () - '(or simple-string (member nil :unspecific))) + '(or simple-string (member nil :unspecific :unc))) (sb!xc:deftype pathname-directory () 'list) (sb!xc:deftype pathname-name () '(or simple-string sb!impl::pattern (member nil :unspecific :wild))) @@ -94,6 +96,9 @@ (types `(simple-array ,type ,dims)))) (types))) +(sb!xc:deftype complex-vector (&optional element-type length) + `(and (vector ,element-type ,length) (not simple-array))) + ;;; Return the symbol that describes the format of FLOAT. (declaim (ftype (function (float) symbol) float-format-name)) (defun float-format-name (x) @@ -167,9 +172,9 @@ ;;; Return the most specific integer type that can be quickly checked that ;;; includes the given type. (defun containing-integer-type (subtype) - (dolist (type '(fixnum - (signed-byte 32) - (unsigned-byte 32) + (dolist (type `(fixnum + (signed-byte ,sb!vm:n-word-bits) + (unsigned-byte ,sb!vm:n-word-bits) integer) (error "~S isn't an integer type?" subtype)) (when (csubtypep subtype (specifier-type type)) @@ -177,6 +182,7 @@ ;;; If TYPE has a CHECK-xxx template, but doesn't have a corresponding ;;; PRIMITIVE-TYPE, then return the template's name. Otherwise, return NIL. +;;; The second value is T if the template needs TYPE to be passed. (defun hairy-type-check-template-name (type) (declare (type ctype type)) (typecase type @@ -203,6 +209,11 @@ #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or)) ((type= type (specifier-type '(unsigned-byte 64))) 'sb!c:check-unsigned-byte-64) + #!+(or x86 x86-64) ; Not implemented yet on other platforms + ((and (eql (numeric-type-class type) 'integer) + (eql (numeric-type-low type) 0) + (fixnump (numeric-type-high type))) + (values 'sb!c:check-mod-fixnum t)) (t nil))) (fun-type 'sb!c:check-fun)