(emit-test)))
(results)))
-(defmacro test-type (value target not-p &rest type-codes)
+(defmacro test-type (value target not-p
+ (&rest type-codes)
+ &rest other-args
+ &key &allow-other-keys)
;; Determine what interesting combinations we need to test for.
(let* ((type-codes (mapcar #'eval type-codes))
(fixnump (and (member even-fixnum-lowtag type-codes)
(error "can't mix fixnum testing with other immediates"))
(if headers
`(%test-fixnum-and-headers ,value ,target ,not-p
- ',(canonicalize-headers headers))
- `(%test-fixnum ,value ,target ,not-p)))
+ ',(canonicalize-headers headers)
+ ,@other-args)
+ `(%test-fixnum ,value ,target ,not-p
+ ,@other-args)))
(immediates
(when headers
(error "can't mix testing of immediates with testing of headers"))
(error "can't mix testing of immediates with testing of lowtags"))
(when (cdr immediates)
(error "can't test multiple immediates at the same time"))
- `(%test-immediate ,value ,target ,not-p ,(car immediates)))
+ `(%test-immediate ,value ,target ,not-p ,(car immediates)
+ ,@other-args))
(lowtags
(when (cdr lowtags)
(error "can't test multiple lowtags at the same time"))
(if headers
`(%test-lowtag-and-headers
,value ,target ,not-p ,(car lowtags)
- ,function-p ',(canonicalize-headers headers))
- `(%test-lowtag ,value ,target ,not-p ,(car lowtags))))
+ ,function-p ',(canonicalize-headers headers)
+ ,@other-args)
+ `(%test-lowtag ,value ,target ,not-p ,(car lowtags)
+ ,@other-args)))
(headers
`(%test-headers ,value ,target ,not-p ,function-p
- ',(canonicalize-headers headers)))
+ ',(canonicalize-headers headers)
+ ,@other-args))
(t
(error "nothing to test?")))))
(: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)))
`((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 ,(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)
+ (test-type value err-lab t (,@type-codes))
(move result value))))))
,@(when ptype
`((primitive-type-vop ,check-name (:check) ,ptype))))))
(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)
(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)))
(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)
(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))))
;;; for internal versions, especially for internal versions off the
;;; main CVS branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.7.7.20-backend-cleanup-1.3"
+"0.7.7.20-backend-cleanup-1.4"