X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Ftypetran.lisp;h=8733eb43f5b486b27c17818fd33b5eb641d17c37;hb=2cfc78cdd55a4641b16e0eb7f277286e520fc959;hp=aeb9a7b4b8cfe7da471c808971ca55781edfb7a3;hpb=aa01df7a18a5d8747423173bda7c20eb46092514;p=sbcl.git diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index aeb9a7b..8733eb4 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -232,8 +232,14 @@ (once-only ((n-object object)) (ecase (numeric-type-complexp type) (:real - `(and (typep ,n-object ',base) - ,(transform-numeric-bound-test n-object type base))) + (if (and #!-(or x86 x86-64) ;; Not implemented elsewhere yet + nil + (eql (numeric-type-class type) 'integer) + (eql (numeric-type-low type) 0) + (fixnump (numeric-type-high type))) + `(fixnum-mod-p ,n-object ,(numeric-type-high type)) + `(and (typep ,n-object ',base) + ,(transform-numeric-bound-test n-object type base)))) (:complex `(and (complexp ,n-object) ,(once-only ((n-real `(realpart (truly-the complex ,n-object))) @@ -340,6 +346,20 @@ collect `(<= ,(car pair) ,n-code ,(cdr pair))))))))))) +#!+sb-simd-pack +(defun source-transform-simd-pack-typep (object type) + (if (type= type (specifier-type 'simd-pack)) + `(simd-pack-p ,object) + (once-only ((n-obj object)) + (let ((n-tag (gensym "TAG"))) + `(and + (simd-pack-p ,n-obj) + (let ((,n-tag (%simd-pack-tag ,n-obj))) + (or ,@(loop + for type in (simd-pack-type-element-type type) + for index = (position type *simd-pack-element-types*) + collect `(eql ,n-tag ,index))))))))) + ;;; Return the predicate and type from the most specific entry in ;;; *TYPE-PREDICATES* that is a supertype of TYPE. (defun find-supertype-predicate (type) @@ -607,6 +627,9 @@ (source-transform-cons-typep object ctype)) (character-set-type (source-transform-character-set-typep object ctype)) + #!+sb-simd-pack + (simd-pack-type + (source-transform-simd-pack-typep object ctype)) (t nil)) `(%typep ,object ',type))))