Optimize (mod FIXNUM) type-checks on x86oids.
[sbcl.git] / src / compiler / generic / vm-type.lisp
index c214fe8..f447b9c 100644 (file)
@@ -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))
+
 \f
 ;;;; 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)
 ;;; 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))
 
 ;;; 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
            #!+#.(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)