X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fearly-type.lisp;h=de364ebc6c3c8c884b54bf77827ab548fb229db9;hb=cee8ef591040db9a79cdd19297867672a9529051;hp=5b761c06ab1dcd4044cd039fd13536cbf10dbfbd;hpb=f066ad2b0b89c016ab9ceaac6de0758e4eb4c1fb;p=sbcl.git diff --git a/src/code/early-type.lisp b/src/code/early-type.lisp index 5b761c0..de364eb 100644 --- a/src/code/early-type.lisp +++ b/src/code/early-type.lisp @@ -134,19 +134,30 @@ (:include args-type (class-info (type-class-or-lose 'values))) (:constructor %make-values-type) + (:predicate %values-type-p) (:copier nil))) +(declaim (inline value-type-p)) +(defun values-type-p (x) + (or (eq x *wild-type*) + (%values-type-p x))) + (defun-cached (make-values-type-cached :hash-bits 8 - :hash-function (lambda (req opt rest allowp) - (logand (logxor - (type-list-cache-hash req) - (type-list-cache-hash opt) - (if rest - (type-hash-value rest) - 42) - (sxhash allowp)) - #xFF))) + :hash-function + (lambda (req opt rest allowp) + (logand (logxor + (type-list-cache-hash req) + (type-list-cache-hash opt) + (if rest + (type-hash-value rest) + 42) + ;; Results (logand #xFF (sxhash t/nil)) + ;; hardcoded to avoid relying on the xc host. + (if allowp + 194 + 11)) + #xFF))) ((required equal-but-no-car-recursion) (optional equal-but-no-car-recursion) (rest eq) @@ -527,6 +538,29 @@ (t (values min :maybe)))) ())) +;;; A SIMD-PACK-TYPE is used to represent a SIMD-PACK type. +#!+sb-simd-pack +(defstruct (simd-pack-type + (:include ctype (class-info (type-class-or-lose 'simd-pack))) + (:constructor %make-simd-pack-type (element-type)) + (:copier nil)) + (element-type (missing-arg) + :type (cons #||(member #.*simd-pack-element-types*) ||#) + :read-only t)) + +#!+sb-simd-pack +(defun make-simd-pack-type (element-type) + (aver (neq element-type *wild-type*)) + (if (eq element-type *empty-type*) + *empty-type* + (%make-simd-pack-type + (dolist (pack-type *simd-pack-element-types* + (error "~S element type must be a subtype of ~ + ~{~S~#[~;, or ~:;, ~]~}." + 'simd-pack *simd-pack-element-types*)) + (when (csubtypep element-type (specifier-type pack-type)) + (return (list pack-type))))))) + ;;;; type utilities