X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Ftype-vops.lisp;h=062c47f150d86e090b52d14b28f68bb3ec276084;hb=20b2378572cf7378f3f267e2234c4234dacfbdc9;hp=1dc2594a7217eaa732a6c7fefa6a8209faf7ad02;hpb=d007a04970c7daa85d522a1816e3ffc7a3bf1913;p=sbcl.git diff --git a/src/compiler/x86/type-vops.lisp b/src/compiler/x86/type-vops.lisp index 1dc2594..062c47f 100644 --- a/src/compiler/x86/type-vops.lisp +++ b/src/compiler/x86/type-vops.lisp @@ -65,12 +65,6 @@ (inst cmp al-tn lowtag) (inst jmp (if not-p :ne :e) target)) -(defun %test-lowtag-and-headers (value target not-p lowtag function-p headers) - (let ((drop-through (gen-label))) - (%test-lowtag value (if not-p drop-through target) nil lowtag) - (%test-headers value target not-p function-p headers drop-through t))) - - (defun %test-headers (value target not-p function-p headers &optional (drop-through (gen-label)) al-loaded) (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag))) @@ -139,54 +133,45 @@ (:info target not-p) (:policy :fast-safe)) -;;; FIXME: DEF-TYPE-VOPS and DEF-SIMPLE-TYPE-VOPS are only used in -;;; this file, so they should be in the EVAL-WHEN above, or otherwise -;;; tweaked so that they don't appear in the target system. - (defun cost-to-test-types (type-codes) (+ (* 2 (length type-codes)) (if (> (apply #'max type-codes) lowtag-limit) 7 2))) -(defmacro def-type-vops (pred-name check-name ptype error-code - &rest type-codes) - (let ((cost (cost-to-test-types (mapcar #'eval type-codes)))) +(defmacro !define-type-vops (pred-name check-name ptype error-code + (&rest type-codes) + &key (variant nil variant-p) &allow-other-keys) + ;; KLUDGE: UGH. Why do we need this eval? Can't we put this in the + ;; expansion? + (let* ((cost (cost-to-test-types (mapcar #'eval type-codes))) + (prefix (if variant-p + (concatenate 'string (string variant) "-") + ""))) `(progn ,@(when pred-name - `((define-vop (,pred-name type-predicate) + `((define-vop (,pred-name ,(intern (concatenate 'string prefix "TYPE-PREDICATE"))) (:translate ,pred-name) (:generator ,cost - (test-type value target not-p ,@type-codes))))) + (test-type value target not-p (,@type-codes)))))) ,@(when check-name - `((define-vop (,check-name check-type) + `((define-vop (,check-name ,(intern (concatenate 'string prefix "CHECK-TYPE"))) (:generator ,cost (let ((err-lab (generate-error-code vop ,error-code value))) - (test-type value err-lab t ,@type-codes) - (move result value)))))) - ,@(when ptype - `((primitive-type-vop ,check-name (:check) ,ptype)))))) - -(defmacro def-simple-type-vops (pred-name check-name ptype error-code - &rest type-codes) - (let ((cost (cost-to-test-types (mapcar #'eval type-codes)))) - `(progn - ,@(when pred-name - `((define-vop (,pred-name simple-type-predicate) - (:translate ,pred-name) - (:generator ,cost - (test-type value target not-p ,@type-codes))))) - ,@(when check-name - `((define-vop (,check-name simple-check-type) - (:generator ,cost - (let ((err-lab - (generate-error-code vop ,error-code value))) - (test-type value err-lab t ,@type-codes) + (test-type value err-lab t (,@type-codes)) (move result value)))))) ,@(when ptype `((primitive-type-vop ,check-name (:check) ,ptype)))))) ;;;; other integer ranges +(define-vop (fixnump/unsigned-byte-32 simple-type-predicate) + (:args (value :scs (unsigned-reg))) + (:arg-types unsigned-num) + (:translate fixnump) + (:generator 5 + (inst cmp value #.sb!xc:most-positive-fixnum) + (inst jmp (if not-p :a :be) target))) + ;;; A (SIGNED-BYTE 32) can be represented with either fixnum or a bignum with ;;; exactly one digit. @@ -328,7 +313,7 @@ (let ((is-symbol-label (if not-p drop-thru target))) (inst cmp value nil-value) (inst jmp :e is-symbol-label) - (test-type value target not-p symbol-header-widetag)) + (test-type value target not-p (symbol-header-widetag))) DROP-THRU)) (define-vop (check-symbol check-type) @@ -336,7 +321,7 @@ (let ((error (generate-error-code vop object-not-symbol-error value))) (inst cmp value nil-value) (inst jmp :e drop-thru) - (test-type value error t symbol-header-widetag)) + (test-type value error t (symbol-header-widetag))) DROP-THRU (move result value))) @@ -346,7 +331,7 @@ (let ((is-not-cons-label (if not-p target drop-thru))) (inst cmp value nil-value) (inst jmp :e is-not-cons-label) - (test-type value target not-p list-pointer-lowtag)) + (test-type value target not-p (list-pointer-lowtag))) DROP-THRU)) (define-vop (check-cons check-type) @@ -354,5 +339,5 @@ (let ((error (generate-error-code vop object-not-cons-error value))) (inst cmp value nil-value) (inst jmp :e error) - (test-type value error t list-pointer-lowtag) + (test-type value error t (list-pointer-lowtag)) (move result value))))