(defun %test-fixnum-and-headers (value target not-p headers &key temp)
(let ((drop-through (gen-label)))
(assemble ()
(defun %test-fixnum-and-headers (value target not-p headers &key temp)
(let ((drop-through (gen-label)))
(assemble ()
(defun %test-immediate (value target not-p immediate &key temp)
(assemble ()
(inst and value 255 temp)
(inst xor temp immediate temp)
(if not-p
(defun %test-immediate (value target not-p immediate &key temp)
(assemble ()
(inst and value 255 temp)
(inst xor temp immediate temp)
(if not-p
(defun %test-lowtag (value target not-p lowtag &key temp)
(assemble ()
(inst and value lowtag-mask temp)
(inst xor temp lowtag temp)
(if not-p
(defun %test-lowtag (value target not-p lowtag &key temp)
(assemble ()
(inst and value lowtag-mask temp)
(inst xor temp lowtag temp)
(if not-p
- (when-true when-false)
- ;; WHEN-TRUE and WHEN-FALSE are the labels to branch to when
- ;; we know it's true and when we know it's false respectively.
- (if not-p
- (values drop-through target)
- (values target drop-through))
+ (when-true when-false)
+ ;; WHEN-TRUE and WHEN-FALSE are the labels to branch to when
+ ;; we know it's true and when we know it's false respectively.
+ (if not-p
+ (values drop-through target)
+ (values target drop-through))
- (%test-lowtag value when-false t lowtag :temp temp)
- (load-type temp value (- lowtag))
- (let ((delta 0))
- (do ((remaining headers (cdr remaining)))
- ((null remaining))
- (let ((header (car remaining))
- (last (null (cdr remaining))))
- (cond
- ((atom header)
- (inst subq temp (- header delta) temp)
- (setf delta header)
- (if last
- (if not-p
- (inst bne temp target)
- (inst beq temp target))
- (inst beq temp when-true)))
- (t
- (let ((start (car header))
- (end (cdr header)))
- (unless (= start bignum-widetag)
- (inst subq temp (- start delta) temp)
- (setf delta start)
- (inst blt temp when-false))
- (inst subq temp (- end delta) temp)
- (setf delta end)
- (if last
- (if not-p
- (inst bgt temp target)
- (inst ble temp target))
- (inst ble temp when-true))))))))
- (emit-label drop-through)))))
+ (%test-lowtag value when-false t lowtag :temp temp)
+ (load-type temp value (- lowtag))
+ (let ((delta 0))
+ (do ((remaining headers (cdr remaining)))
+ ((null remaining))
+ (let ((header (car remaining))
+ (last (null (cdr remaining))))
+ (cond
+ ((atom header)
+ (inst subq temp (- header delta) temp)
+ (setf delta header)
+ (if last
+ (if not-p
+ (inst bne temp target)
+ (inst beq temp target))
+ (inst beq temp when-true)))
+ (t
+ (let ((start (car header))
+ (end (cdr header)))
+ (unless (= start bignum-widetag)
+ (inst subq temp (- start delta) temp)
+ (setf delta start)
+ (inst blt temp when-false))
+ (inst subq temp (- end delta) temp)
+ (setf delta end)
+ (if last
+ (if not-p
+ (inst bgt temp target)
+ (inst ble temp target))
+ (inst ble temp when-true))))))))
+ (emit-label drop-through)))))
(if (> (apply #'max type-codes) lowtag-limit) 7 2)))
(defmacro !define-type-vops (pred-name check-name ptype error-code
(if (> (apply #'max type-codes) lowtag-limit) 7 2)))
(defmacro !define-type-vops (pred-name check-name ptype error-code
- `((define-vop (,pred-name type-predicate)
- (:translate ,pred-name)
- (:generator ,cost
- (test-type value target not-p (,@type-codes) :temp temp)))))
+ `((define-vop (,pred-name type-predicate)
+ (:translate ,pred-name)
+ (:generator ,cost
+ (test-type value target not-p (,@type-codes) :temp temp)))))
- `((define-vop (,check-name check-type)
- (:generator ,cost
- (let ((err-lab
- (generate-error-code vop ,error-code value)))
- (test-type value err-lab t (,@type-codes) :temp temp)
- (move value result))))))
+ `((define-vop (,check-name check-type)
+ (:generator ,cost
+ (let ((err-lab
+ (generate-error-code vop ,error-code value)))
+ (test-type value err-lab t (,@type-codes) :temp temp)
+ (move value result))))))
(:temporary (:scs (non-descriptor-reg)) temp1)
(:generator 45
(let ((loose (generate-error-code vop object-not-signed-byte-32-error
(:temporary (:scs (non-descriptor-reg)) temp1)
(:generator 45
(let ((loose (generate-error-code vop object-not-signed-byte-32-error
(defun unsigned-byte-32-test (value temp temp1 not-p target not-target)
(multiple-value-bind (yep nope)
(defun unsigned-byte-32-test (value temp temp1 not-p target not-target)
(multiple-value-bind (yep nope)
(inst beq temp single-word)
;; If it's other than two, we can't be an (unsigned-byte 32)
(inst li (logxor (+ (ash 1 n-widetag-bits) bignum-widetag)
(inst beq temp single-word)
;; If it's other than two, we can't be an (unsigned-byte 32)
(inst li (logxor (+ (ash 1 n-widetag-bits) bignum-widetag)
(:temporary (:scs (non-descriptor-reg)) temp1)
(:generator 45
(let ((loose (generate-error-code vop object-not-unsigned-byte-32-error
(:temporary (:scs (non-descriptor-reg)) temp1)
(:generator 45
(let ((loose (generate-error-code vop object-not-unsigned-byte-32-error