0.7.7.20-backend-cleanup-1.4:
authorChristophe Rhodes <csr21@cam.ac.uk>
Tue, 10 Sep 2002 12:47:39 +0000 (12:47 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Tue, 10 Sep 2002 12:47:39 +0000 (12:47 +0000)
Generalize interface to TEST-TYPE to allow for different
architectural needs
... &REST OTHER-ARGS &KEY &ALLOW-OTHER-KEYS
... pass the OTHER-ARGS through to
architecture-specific %TEST-FIXNUM and friends
(still x86-only)

src/compiler/generic/early-type-vops.lisp
src/compiler/x86/type-vops.lisp
version.lisp-expr

index d3572d6..4aa4fa3 100644 (file)
        (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?")))))
 
index ca114cf..36f49a6 100644 (file)
   (: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))))
index 1090b94..c0f339a 100644 (file)
@@ -18,4 +18,4 @@
 ;;; 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"