0.7.7.23:
authorChristophe Rhodes <csr21@cam.ac.uk>
Fri, 13 Sep 2002 16:28:40 +0000 (16:28 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Fri, 13 Sep 2002 16:28:40 +0000 (16:28 +0000)
Merge backend_cleanup_1_branch
... I hope this is right :-)

22 files changed:
build-order.lisp-expr
src/assembly/ppc/foo.lisp [deleted file]
src/compiler/alpha/macros.lisp
src/compiler/alpha/type-vops.lisp
src/compiler/generic/early-type-vops.lisp [new file with mode: 0644]
src/compiler/generic/late-type-vops.lisp [new file with mode: 0644]
src/compiler/generic/utils.lisp
src/compiler/hppa/macros.lisp
src/compiler/hppa/type-vops.lisp
src/compiler/mips/macros.lisp
src/compiler/mips/type-vops.lisp
src/compiler/ppc/macros.lisp
src/compiler/ppc/subprim.lisp
src/compiler/ppc/type-vops.lisp
src/compiler/ppc/values.lisp
src/compiler/sparc/macros.lisp
src/compiler/sparc/subprim.lisp
src/compiler/sparc/type-vops.lisp
src/compiler/sparc/values.lisp
src/compiler/x86/macros.lisp
src/compiler/x86/type-vops.lisp
version.lisp-expr

index 6733168..9388117 100644 (file)
 
  ("src/compiler/target/insts")
  ("src/compiler/target/macros")
+ ("src/compiler/generic/early-type-vops")
 
  ("src/assembly/target/support")
 
   ;; src/compiler/x86/array for a candidate patch.) -- WHN 19990323
   :ignore-failure-p)
  ("src/compiler/target/pred")
+
  ("src/compiler/target/type-vops")
+ ("src/compiler/generic/late-type-vops")
 
  ("src/assembly/target/assem-rtns" :assem)
  ("src/assembly/target/array"      :assem)
diff --git a/src/assembly/ppc/foo.lisp b/src/assembly/ppc/foo.lisp
deleted file mode 100644 (file)
index 016d0f1..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-(in-package "SB!VM")
-
-\f
-;;;; Return-multiple with other than one value
-
-(define-assembly-routine
-    (return-multiple
-     (:return-style :none))
-
-     ;; These four are really arguments.
-    ((:temp nvals any-reg nargs-offset)
-     (:temp vals any-reg nl0-offset)
-     (:temp ocfp any-reg nl1-offset)
-     (:temp lra descriptor-reg lra-offset)
-
-     ;; These are just needed to facilitate the transfer
-     (:temp lip interior-reg lip-offset)
-     (:temp count any-reg nl2-offset)
-     (:temp src any-reg nl3-offset)
-     (:temp dst any-reg cfunc-offset)
-     (:temp temp descriptor-reg l0-offset)
-
-     
-     ;; These are needed so we can get at the register args.
-     (:temp a0 descriptor-reg a0-offset)
-     (:temp a1 descriptor-reg a1-offset)
-     (:temp a2 descriptor-reg a2-offset)
-     (:temp a3 descriptor-reg a3-offset))
-
-  ;; Note, because of the way the return-multiple vop is written, we can
-  ;; assume that we are never called with nvals == 1 and that a0 has already
-  ;; been loaded.
-  (inst cmpwi nvals 0))
-#|
-  (inst ble default-a0-and-on)
-  (inst cmpwi nvals (fixnumize 2))
-  (inst lwz a1 vals (* 1 n-word-bytes))
-  (inst ble default-a2-and-on)
-  (inst cmpwi nvals (fixnumize 3))
-  (inst lwz a2 vals (* 2 n-word-bytes))
-  (inst ble default-a3-and-on)
-  (inst cmpwi nvals (fixnumize 4))
-  (inst lwz a3 vals (* 3 n-word-bytes))
-  (inst ble done)
-
-  ;; Copy the remaining args to the top of the stack.
-  (inst addi src vals (* 4 n-word-bytes))
-  (inst addi dst cfp-tn (* 4 n-word-bytes))
-  (inst addic. count nvals (- (fixnumize 4)))
-
-  LOOP
-  (inst subic. count count (fixnumize 1))
-  (inst lwz temp src 0)
-  (inst addi src src n-word-bytes)
-  (inst stw temp dst 0)
-  (inst addi dst dst n-word-bytes)
-  (inst bge loop)
-               
-  (inst b done)
-
-  DEFAULT-A0-AND-ON
-  (inst mr a0 null-tn)
-  (inst mr a1 null-tn)
-  DEFAULT-A2-AND-ON
-  (inst mr a2 null-tn)
-  DEFAULT-A3-AND-ON
-  (inst mr a3 null-tn)
-  DONE
-  
-  ;; Clear the stack.
-  (move ocfp-tn cfp-tn)
-  (move cfp-tn ocfp)
-  (inst add csp-tn ocfp-tn nvals)
-  
-  ;; Return.
-  (lisp-return lra lip))
-
-\f
-;;;; tail-call-variable.
-
-#+sb-assembling ;; no vop for this one either.
-(define-assembly-routine
-    (tail-call-variable
-     (:return-style :none))
-
-    ;; These are really args.
-    ((:temp args any-reg nl0-offset)
-     (:temp lexenv descriptor-reg lexenv-offset)
-
-     ;; We need to compute this
-     (:temp nargs any-reg nargs-offset)
-
-     ;; These are needed by the blitting code.
-     (:temp src any-reg nl1-offset)
-     (:temp dst any-reg nl2-offset)
-     (:temp count any-reg nl3-offset)
-     (:temp temp descriptor-reg l0-offset)
-     (:temp lip interior-reg lip-offset)
-
-     ;; These are needed so we can get at the register args.
-     (:temp a0 descriptor-reg a0-offset)
-     (:temp a1 descriptor-reg a1-offset)
-     (:temp a2 descriptor-reg a2-offset)
-     (:temp a3 descriptor-reg a3-offset))
-
-
-  ;; Calculate NARGS (as a fixnum)
-  (inst sub nargs csp-tn args)
-     
-  ;; Load the argument regs (must do this now, 'cause the blt might
-  ;; trash these locations)
-  (inst lwz a0 args (* 0 n-word-bytes))
-  (inst lwz a1 args (* 1 n-word-bytes))
-  (inst lwz a2 args (* 2 n-word-bytes))
-  (inst lwz a3 args (* 3 n-word-bytes))
-
-  ;; Calc SRC, DST, and COUNT
-  (inst addic. count nargs (fixnumize (- register-arg-count)))
-  (inst addi src args (* n-word-bytes register-arg-count))
-  (inst ble done)
-  (inst addi dst cfp-tn (* n-word-bytes register-arg-count))
-       
-  LOOP
-  ;; Copy one arg.
-  (inst lwz temp src 0)
-  (inst addi src src n-word-bytes)
-  (inst stw temp dst 0)
-  (inst addic. count count (fixnumize -1))
-  (inst addi dst dst n-word-bytes)
-  (inst bgt loop)
-       
-  DONE
-  ;; We are done.  Do the jump.
-  (loadw temp lexenv closure-fun-slot fun-pointer-lowtag)
-  (lisp-jump temp lip))
-
-
-\f
-;;;; Non-local exit noise.
-
-(define-assembly-routine (unwind
-                         (:return-style :none)
-                         (:translate %continue-unwind)
-                         (:policy :fast-safe))
-                        ((:arg block (any-reg descriptor-reg) a0-offset)
-                         (:arg start (any-reg descriptor-reg) ocfp-offset)
-                         (:arg count (any-reg descriptor-reg) nargs-offset)
-                         (:temp lra descriptor-reg lra-offset)
-                         (:temp lip interior-reg lip-offset)
-                         (:temp cur-uwp any-reg nl0-offset)
-                         (:temp next-uwp any-reg nl1-offset)
-                         (:temp target-uwp any-reg nl2-offset))
-  (declare (ignore start count))
-
-  (let ((error (generate-error-code nil invalid-unwind-error)))
-    (inst cmpwi block 0)
-    (inst beq error))
-  
-  (load-symbol-value cur-uwp *current-unwind-protect-block*)
-  (loadw target-uwp block unwind-block-current-uwp-slot)
-  (inst cmpw cur-uwp target-uwp)
-  (inst bne do-uwp)
-      
-  (move cur-uwp block)
-
-  DO-EXIT
-      
-  (loadw cfp-tn cur-uwp unwind-block-current-cont-slot)
-  (loadw code-tn cur-uwp unwind-block-current-code-slot)
-  (loadw lra cur-uwp unwind-block-entry-pc-slot)
-  (lisp-return lra lip :frob-code nil)
-
-  DO-UWP
-
-  (loadw next-uwp cur-uwp unwind-block-current-uwp-slot)
-  (store-symbol-value next-uwp *current-unwind-protect-block*)
-  (inst b do-exit))
-
-(define-assembly-routine (throw
-                         (:return-style :none))
-                        ((:arg target descriptor-reg a0-offset)
-                         (:arg start any-reg ocfp-offset)
-                         (:arg count any-reg nargs-offset)
-                         (:temp catch any-reg a1-offset)
-                         (:temp tag descriptor-reg a2-offset))           
-  
-  (declare (ignore start count))
-
-  (load-symbol-value catch *current-catch-block*)
-  
-  loop
-  
-  (let ((error (generate-error-code nil unseen-throw-tag-error target)))
-    (inst cmpwi catch 0)
-    (inst beq error))
-  
-  (loadw tag catch catch-block-tag-slot)
-  (inst cmpw tag target)
-  (inst beq exit)
-  (loadw catch catch catch-block-previous-catch-slot)
-  (inst b loop)
-  
-  exit
-  
-  (move target catch)
-  (inst ba (make-fixup 'unwind :assembly-routine)))
-
-
-
-|#
\ No newline at end of file
index 998cec0..d472eef 100644 (file)
      ,@body))
 \f
 ;;;; error code
-
-(defvar *adjustable-vectors* nil)
-
-(defmacro with-adjustable-vector ((var) &rest body)
-  `(let ((,var (or (pop *adjustable-vectors*)
-                  (make-array 16
-                              :element-type '(unsigned-byte 8)
-                              :fill-pointer 0
-                              :adjustable t))))
-     (declare (type (vector (unsigned-byte 8) 16) ,var))
-     (setf (fill-pointer ,var) 0)
-     (unwind-protect
-        (progn
-          ,@body)
-       (push ,var *adjustable-vectors*))))
-
 (eval-when (:compile-toplevel :load-toplevel :execute) 
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
index 2105967..e1ff161 100644 (file)
 
 (in-package "SB!VM")
 \f
-;;;; test generation utilities
-
-(eval-when (:compile-toplevel :execute)
-
-(defparameter *immediate-types*
-  (list unbound-marker-widetag base-char-widetag))
-
-(defparameter *fun-header-widetags*
-  (list funcallable-instance-header-widetag
-       simple-fun-header-widetag
-       closure-fun-header-widetag
-       closure-header-widetag))
-
-(defun canonicalize-headers (headers)
-  (collect ((results))
-    (let ((start nil)
-         (prev nil)
-         (delta (- other-immediate-1-lowtag other-immediate-0-lowtag)))
-      (flet ((emit-test ()
-              (results (if (= start prev)
-                           start
-                           (cons start prev)))))
-       (dolist (header (sort headers #'<))
-         (cond ((null start)
-                (setf start header)
-                (setf prev header))
-               ((= header (+ prev delta))
-                (setf prev header))
-               (t
-                (emit-test)
-                (setf start header)
-                (setf prev header))))
-       (emit-test)))
-    (results)))
-
-) ; EVAL-WHEN
-
-(macrolet ((test-type (value temp target not-p &rest type-codes)
-  ;; Determine what interesting combinations we need to test for.
-  (let* ((type-codes (mapcar #'eval type-codes))
-        (fixnump (and (member even-fixnum-lowtag type-codes)
-                      (member odd-fixnum-lowtag type-codes)
-                      t))
-        (lowtags (remove lowtag-limit type-codes :test #'<))
-        (extended (remove lowtag-limit type-codes :test #'>))
-        (immediates (intersection extended *immediate-types* :test #'eql))
-        (headers (set-difference extended *immediate-types* :test #'eql))
-        (function-p (if (intersection headers *fun-header-widetags*)
-                        (if (subsetp headers *fun-header-widetags*)
-                            t
-                            (error "can't test for mix of function subtypes ~
-                                    and normal header types."))
-                        nil)))
-    (unless type-codes
-      (error "must supply at least one type for test-type"))
-    (cond
-     (fixnump
-      (when (remove-if (lambda (x)
-                        (or (= x even-fixnum-lowtag)
-                            (= x odd-fixnum-lowtag)))
-                      lowtags)
-       (error "can't mix fixnum testing with other lowtags"))
-      (when function-p
-       (error "can't mix fixnum testing with function subtype testing"))
-      (when immediates
-       (error "can't mix fixnum testing with other immediates"))
-      (if headers
-         `(%test-fixnum-and-headers ,value ,temp ,target ,not-p
-                                    ',(canonicalize-headers headers))
-         `(%test-fixnum ,value ,temp ,target ,not-p)))
-     (immediates
-      (when headers
-       (error "can't mix testing of immediates with testing of headers"))
-      (when lowtags
-       (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 ,temp ,target ,not-p ,(car immediates)))
-     (lowtags
-      (when (cdr lowtags)
-       (error "can't test multiple lowtags at the same time"))
-      (if headers
-         `(%test-lowtag-and-headers
-           ,value ,temp ,target ,not-p ,(car lowtags)
-           ,function-p ',(canonicalize-headers headers))
-         `(%test-lowtag ,value ,temp ,target ,not-p ,(car lowtags))))
-     (headers
-      `(%test-headers ,value ,temp ,target ,not-p ,function-p
-                     ',(canonicalize-headers headers)))
-     (t
-      (error "nothing to test?"))))))
-
-(defun %test-fixnum (value temp target not-p)
+(defun %test-fixnum (value target not-p &key temp)
   (assemble ()
     (inst and value 3 temp)
     (if not-p
         (inst bne temp target)
         (inst beq temp target))))
 
-(defun %test-fixnum-and-headers (value temp target not-p headers)
+(defun %test-fixnum-and-headers (value target not-p headers &key temp)
   (let ((drop-through (gen-label)))
     (assemble ()
       (inst and value 3 temp)
       (inst beq temp (if not-p drop-through target)))
-    (%test-headers value temp target not-p nil headers drop-through)))
+    (%test-headers value target not-p nil headers
+                  :drop-through drop-through :temp temp)))
 
-(defun %test-immediate (value temp target not-p immediate)
+(defun %test-immediate (value target not-p immediate &key temp)
   (assemble ()
     (inst and value 255 temp)
     (inst xor temp immediate temp)
        (inst bne temp target)
        (inst beq temp target))))
 
-(defun %test-lowtag (value temp target not-p lowtag)
+(defun %test-lowtag (value target not-p lowtag &key temp)
   (assemble ()
     (inst and value lowtag-mask temp)
     (inst xor temp lowtag temp)
        (inst bne temp target)
        (inst beq temp target))))
 
-(defun %test-lowtag-and-headers (value temp target not-p lowtag
-                                      function-p headers)
+(defun %test-lowtag-and-headers (value target not-p lowtag
+                                function-p headers &key temp)
   (let ((drop-through (gen-label)))
-    (%test-lowtag value temp (if not-p drop-through target) nil lowtag)
-    (%test-headers value temp target not-p function-p headers drop-through)))
+    (%test-lowtag value (if not-p drop-through target) nil lowtag :temp temp)
+    (%test-headers value target not-p function-p headers
+                  :drop-through drop-through :temp temp)))
 
-(defun %test-headers (value temp target not-p function-p headers
-                           &optional (drop-through (gen-label)))
+(defun %test-headers (value target not-p function-p headers
+                     &key (drop-through (gen-label)) temp)
   (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag)))
     (multiple-value-bind
        (when-true when-false)
            (values drop-through target)
            (values target drop-through))
       (assemble ()
-       (%test-lowtag value temp when-false t lowtag)
+       (%test-lowtag value when-false t lowtag :temp temp)
        (load-type temp value (- lowtag))
        (let ((delta 0))
          (do ((remaining headers (cdr remaining)))
                          (inst ble temp target))
                      (inst ble temp when-true))))))))
        (emit-label drop-through)))))
-
-
 \f
 ;;;; Type checking and testing:
 
   (:info target not-p)
   (:policy :fast-safe))
 
-
-(eval-when  (:compile-toplevel :execute)
-
-
 (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 #+sb-xc-host (cost-to-test-types (mapcar #'eval type-codes))
-              #-sb-xc-host 10))
+(defmacro !define-type-vops (pred-name check-name ptype error-code
+                            (&rest type-codes)
+                            &key &allow-other-keys)
+  (let ((cost (cost-to-test-types (mapcar #'eval type-codes))))
     `(progn
        ,@(when pred-name
           `((define-vop (,pred-name type-predicate)
               (:translate ,pred-name)
               (:generator ,cost
-                (test-type value temp target not-p ,@type-codes)))))
+                (test-type value target not-p (,@type-codes) :temp temp)))))
        ,@(when check-name
           `((define-vop (,check-name check-type)
               (:generator ,cost
                 (let ((err-lab
                        (generate-error-code vop ,error-code value)))
-                  (test-type value temp err-lab t ,@type-codes)
+                  (test-type value err-lab t (,@type-codes) :temp temp)
                   (move value result))))))
        ,@(when ptype
           `((primitive-type-vop ,check-name (:check) ,ptype))))))
-
-
-(def-type-vops fixnump check-fixnum fixnum object-not-fixnum-error
-  even-fixnum-lowtag odd-fixnum-lowtag)
-
-(def-type-vops functionp check-fun function
-  object-not-fun-error fun-pointer-lowtag)
-
-(def-type-vops listp check-list list object-not-list-error
-  list-pointer-lowtag)
-
-(def-type-vops %instancep check-instance instance object-not-instance-error
-  instance-pointer-lowtag)
-
-(def-type-vops bignump check-bignum bignum
-  object-not-bignum-error bignum-widetag)
-
-(def-type-vops ratiop check-ratio ratio
-  object-not-ratio-error ratio-widetag)
-
-(def-type-vops complexp check-complex complex
-  object-not-complex-error complex-widetag
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops complex-rational-p check-complex-rational nil
-  object-not-complex-rational-error complex-widetag)
-
-(def-type-vops complex-float-p check-complex-float nil
-  object-not-complex-float-error
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops complex-single-float-p check-complex-single-float
-  complex-single-float object-not-complex-single-float-error
-  complex-single-float-widetag)
-
-(def-type-vops complex-double-float-p check-complex-double-float
-  complex-double-float object-not-complex-double-float-error
-  complex-double-float-widetag)
-
-(def-type-vops single-float-p check-single-float single-float
-  object-not-single-float-error single-float-widetag)
-
-(def-type-vops double-float-p check-double-float double-float
-  object-not-double-float-error double-float-widetag)
-
-(def-type-vops simple-string-p check-simple-string simple-string
-  object-not-simple-string-error simple-string-widetag)
-
-(def-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
-  object-not-simple-bit-vector-error simple-bit-vector-widetag)
-
-(def-type-vops simple-vector-p check-simple-vector simple-vector
-  object-not-simple-vector-error simple-vector-widetag)
-
-(def-type-vops simple-array-unsigned-byte-2-p
-  check-simple-array-unsigned-byte-2
-  simple-array-unsigned-byte-2
-  object-not-simple-array-unsigned-byte-2-error
-  simple-array-unsigned-byte-2-widetag)
-
-(def-type-vops simple-array-unsigned-byte-4-p
-  check-simple-array-unsigned-byte-4
-  simple-array-unsigned-byte-4
-  object-not-simple-array-unsigned-byte-4-error
-  simple-array-unsigned-byte-4-widetag)
-
-(def-type-vops simple-array-unsigned-byte-8-p
-  check-simple-array-unsigned-byte-8
-  simple-array-unsigned-byte-8
-  object-not-simple-array-unsigned-byte-8-error
-  simple-array-unsigned-byte-8-widetag)
-
-(def-type-vops simple-array-unsigned-byte-16-p
-  check-simple-array-unsigned-byte-16
-  simple-array-unsigned-byte-16
-  object-not-simple-array-unsigned-byte-16-error
-  simple-array-unsigned-byte-16-widetag)
-
-(def-type-vops simple-array-unsigned-byte-32-p
-  check-simple-array-unsigned-byte-32
-  simple-array-unsigned-byte-32
-  object-not-simple-array-unsigned-byte-32-error
-  simple-array-unsigned-byte-32-widetag)
-
-(def-type-vops simple-array-signed-byte-8-p
-  check-simple-array-signed-byte-8
-  simple-array-signed-byte-8
-  object-not-simple-array-signed-byte-8-error
-  simple-array-signed-byte-8-widetag)
-
-(def-type-vops simple-array-signed-byte-16-p
-  check-simple-array-signed-byte-16
-  simple-array-signed-byte-16
-  object-not-simple-array-signed-byte-16-error
-  simple-array-signed-byte-16-widetag)
-
-(def-type-vops simple-array-signed-byte-30-p
-  check-simple-array-signed-byte-30
-  simple-array-signed-byte-30
-  object-not-simple-array-signed-byte-30-error
-  simple-array-signed-byte-30-widetag)
-
-(def-type-vops simple-array-signed-byte-32-p
-  check-simple-array-signed-byte-32
-  simple-array-signed-byte-32
-  object-not-simple-array-signed-byte-32-error
-  simple-array-signed-byte-32-widetag)
-
-(def-type-vops simple-array-single-float-p check-simple-array-single-float
-  simple-array-single-float object-not-simple-array-single-float-error
-  simple-array-single-float-widetag)
-
-(def-type-vops simple-array-double-float-p check-simple-array-double-float
-  simple-array-double-float object-not-simple-array-double-float-error
-  simple-array-double-float-widetag)
-
-(def-type-vops simple-array-complex-single-float-p
-  check-simple-array-complex-single-float
-  simple-array-complex-single-float
-  object-not-simple-array-complex-single-float-error
-  simple-array-complex-single-float-widetag)
-
-(def-type-vops simple-array-complex-double-float-p
-  check-simple-array-complex-double-float
-  simple-array-complex-double-float
-  object-not-simple-array-complex-double-float-error
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops base-char-p check-base-char base-char
-  object-not-base-char-error base-char-widetag)
-
-(def-type-vops system-area-pointer-p check-system-area-pointer
-  system-area-pointer object-not-sap-error sap-widetag)
-
-(def-type-vops weak-pointer-p check-weak-pointer weak-pointer
-  object-not-weak-pointer-error weak-pointer-widetag)
-
-
-;;; XXX
-#|
-(def-type-vops scavenger-hook-p nil nil nil
-  #!-gengc 0 #!+gengc scavenger-hook-type)
-|#
-
-(def-type-vops code-component-p nil nil nil
-  code-header-widetag)
-
-(def-type-vops lra-p nil nil nil
-  #!-gengc return-pc-header-widetag #!+gengc 0)
-
-(def-type-vops fdefn-p nil nil nil
-  fdefn-widetag)
-
-(def-type-vops funcallable-instance-p nil nil nil
-  funcallable-instance-header-widetag)
-
-(def-type-vops array-header-p nil nil nil
-  simple-array-widetag complex-string-widetag complex-bit-vector-widetag
-  complex-vector-widetag complex-array-widetag)
-
-(def-type-vops stringp check-string nil object-not-string-error
-  simple-string-widetag complex-string-widetag)
-
-;;; XXX surely just sticking this in here is not all that's required
-;;; to create the vop?  But I can't find out any other info
-(def-type-vops complex-vector-p check-complex-vector nil
-  object-not-complex-vector-error complex-vector-widetag)
-
-(def-type-vops bit-vector-p check-bit-vector nil object-not-bit-vector-error
-  simple-bit-vector-widetag complex-bit-vector-widetag)
-
-(def-type-vops vectorp check-vector nil object-not-vector-error
-  simple-string-widetag simple-bit-vector-widetag simple-vector-widetag
-  simple-array-unsigned-byte-2-widetag simple-array-unsigned-byte-4-widetag
-  simple-array-unsigned-byte-8-widetag simple-array-unsigned-byte-16-widetag
-  simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag)
-
-(def-type-vops simple-array-p check-simple-array nil object-not-simple-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops arrayp check-array nil object-not-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag
-  complex-array-widetag)
-
-(def-type-vops numberp check-number nil object-not-number-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag ratio-widetag
-  single-float-widetag double-float-widetag complex-widetag
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops rationalp check-rational nil object-not-rational-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag)
-
-(def-type-vops integerp check-integer nil object-not-integer-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag)
-
-(def-type-vops floatp check-float nil object-not-float-error
-  single-float-widetag double-float-widetag)
-
-(def-type-vops realp check-real nil object-not-real-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag
-  single-float-widetag double-float-widetag)
-
 \f
 ;;;; Other integer ranges.
 
 ;;; A (signed-byte 32) can be represented with either fixnum or a bignum with
 ;;; exactly one digit.
 
-
 (defun signed-byte-32-test (value temp temp1 not-p target not-target)
   (multiple-value-bind
       (yep nope)
   (:generator 12
     (inst cmpeq value null-tn temp)
     (inst bne temp (if not-p drop-thru target))
-    (test-type value temp target not-p symbol-header-widetag)
+    (test-type value target not-p (symbol-header-widetag) :temp temp)
     DROP-THRU))
 
 (define-vop (check-symbol check-type)
     (inst cmpeq value null-tn temp)
     (inst bne temp drop-thru)
     (let ((error (generate-error-code vop object-not-symbol-error value)))
-      (test-type value temp error t symbol-header-widetag))
+      (test-type value error t (symbol-header-widetag) :temp temp))
     DROP-THRU
     (move value result)))
   
   (:generator 8
     (inst cmpeq value null-tn temp)
     (inst bne temp (if not-p target drop-thru))
-    (test-type value temp target not-p list-pointer-lowtag)
+    (test-type value target not-p (list-pointer-lowtag) :temp temp)
     DROP-THRU))
 
 (define-vop (check-cons check-type)
     (let ((error (generate-error-code vop object-not-cons-error value)))
       (inst cmpeq value null-tn temp)
       (inst bne temp error)
-      (test-type value temp error t list-pointer-lowtag))
+      (test-type value error t (list-pointer-lowtag) :temp temp))
     (move value result)))
 
-) ; MACROLET
\ No newline at end of file
diff --git a/src/compiler/generic/early-type-vops.lisp b/src/compiler/generic/early-type-vops.lisp
new file mode 100644 (file)
index 0000000..8b4d96c
--- /dev/null
@@ -0,0 +1,107 @@
+;;;; generic type testing and checking apparatus
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+(in-package "SB!VM")
+\f
+(defparameter *immediate-types*
+  (list unbound-marker-widetag base-char-widetag))
+
+(defparameter *fun-header-widetags*
+  (list funcallable-instance-header-widetag
+       simple-fun-header-widetag
+       closure-fun-header-widetag
+       closure-header-widetag))
+
+(defun canonicalize-headers (headers)
+  (collect ((results))
+    (let ((start nil)
+         (prev nil)
+         (delta (- other-immediate-1-lowtag other-immediate-0-lowtag)))
+      (flet ((emit-test ()
+              (results (if (= start prev)
+                           start
+                           (cons start prev)))))
+       (dolist (header (sort headers #'<))
+         (cond ((null start)
+                (setf start header)
+                (setf prev header))
+               ((= header (+ prev delta))
+                (setf prev header))
+               (t
+                (emit-test)
+                (setf start header)
+                (setf prev header))))
+       (emit-test)))
+    (results)))
+
+(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)
+                      (member odd-fixnum-lowtag type-codes)
+                      t))
+        (lowtags (remove lowtag-limit type-codes :test #'<))
+        (extended (remove lowtag-limit type-codes :test #'>))
+        (immediates (intersection extended *immediate-types* :test #'eql))
+        (headers (set-difference extended *immediate-types* :test #'eql))
+        (function-p (if (intersection headers *fun-header-widetags*)
+                        (if (subsetp headers *fun-header-widetags*)
+                            t
+                            (error "can't test for mix of function subtypes ~
+                                    and normal header types"))
+                        nil)))
+    (unless type-codes
+      (error "At least one type must be supplied for TEST-TYPE."))
+    (cond
+      (fixnump
+       (when (remove-if (lambda (x)
+                         (or (= x even-fixnum-lowtag)
+                             (= x odd-fixnum-lowtag)))
+                       lowtags)
+        (error "can't mix fixnum testing with other lowtags"))
+       (when function-p
+        (error "can't mix fixnum testing with function subtype testing"))
+       (when immediates
+        (error "can't mix fixnum testing with other immediates"))
+       (if headers
+          `(%test-fixnum-and-headers ,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"))
+       (when lowtags
+        (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)
+        ,@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)
+            ,@other-args)
+          `(%test-lowtag ,value ,target ,not-p ,(car lowtags)
+            ,@other-args)))
+      (headers
+       `(%test-headers ,value ,target ,not-p ,function-p
+        ',(canonicalize-headers headers)
+        ,@other-args))
+      (t
+       (error "nothing to test?")))))
+
diff --git a/src/compiler/generic/late-type-vops.lisp b/src/compiler/generic/late-type-vops.lisp
new file mode 100644 (file)
index 0000000..4953792
--- /dev/null
@@ -0,0 +1,328 @@
+;;;; generic type testing and checking VOPs
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+(in-package "SB!VM")
+\f
+(!define-type-vops fixnump check-fixnum fixnum object-not-fixnum-error
+  (even-fixnum-lowtag odd-fixnum-lowtag)
+  ;; we can save a register on the x86.
+  :variant simple
+  ;; we can save a couple of instructions and a branch on the ppc.
+  ;; FIXME: make this be FIXNUM-MASK
+  :mask 3)
+
+(!define-type-vops functionp check-fun function object-not-fun-error
+  (fun-pointer-lowtag)
+  :mask lowtag-mask)
+
+(!define-type-vops listp check-list list object-not-list-error
+  (list-pointer-lowtag)
+  :mask lowtag-mask)
+
+(!define-type-vops %instancep check-instance instance object-not-instance-error
+  (instance-pointer-lowtag)
+  :mask lowtag-mask)
+
+(!define-type-vops bignump check-bignum bignum object-not-bignum-error
+  (bignum-widetag))
+
+(!define-type-vops ratiop check-ratio ratio object-not-ratio-error
+  (ratio-widetag))
+
+(!define-type-vops complexp check-complex complex object-not-complex-error
+  (complex-widetag complex-single-float-widetag complex-double-float-widetag
+                  #!+long-float complex-long-float-widetag))
+
+(!define-type-vops complex-rational-p check-complex-rational nil
+    object-not-complex-rational-error
+  (complex-widetag))
+
+(!define-type-vops complex-float-p check-complex-float nil
+    object-not-complex-float-error
+  (complex-single-float-widetag complex-double-float-widetag
+                               #!+long-float complex-long-float-widetag))
+
+(!define-type-vops complex-single-float-p check-complex-single-float complex-single-float
+    object-not-complex-single-float-error
+  (complex-single-float-widetag))
+
+(!define-type-vops complex-double-float-p check-complex-double-float complex-double-float
+    object-not-complex-double-float-error
+  (complex-double-float-widetag))
+
+#!+long-float
+(!define-type-vops complex-long-float-p check-complex-long-float complex-long-float
+    object-not-complex-long-float-error
+  (complex-long-float-widetag))
+
+(!define-type-vops single-float-p check-single-float single-float
+    object-not-single-float-error
+  (single-float-widetag))
+
+(!define-type-vops double-float-p check-double-float double-float
+    object-not-double-float-error
+  (double-float-widetag))
+
+#!+long-float
+(!define-type-vops long-float-p check-long-float long-float
+    object-not-long-float-error
+  (long-float-widetag))
+
+(!define-type-vops simple-string-p check-simple-string simple-string
+    object-not-simple-string-error
+  (simple-string-widetag))
+
+(!define-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
+    object-not-simple-bit-vector-error
+  (simple-bit-vector-widetag))
+
+(!define-type-vops simple-vector-p check-simple-vector simple-vector
+    object-not-simple-vector-error
+  (simple-vector-widetag))
+
+(!define-type-vops simple-array-unsigned-byte-2-p
+      check-simple-array-unsigned-byte-2
+      simple-array-unsigned-byte-2
+    object-not-simple-array-unsigned-byte-2-error
+  (simple-array-unsigned-byte-2-widetag))
+
+(!define-type-vops simple-array-unsigned-byte-4-p
+      check-simple-array-unsigned-byte-4
+      simple-array-unsigned-byte-4
+    object-not-simple-array-unsigned-byte-4-error
+  (simple-array-unsigned-byte-4-widetag))
+
+(!define-type-vops simple-array-unsigned-byte-8-p
+      check-simple-array-unsigned-byte-8
+      simple-array-unsigned-byte-8
+    object-not-simple-array-unsigned-byte-8-error
+  (simple-array-unsigned-byte-8-widetag))
+
+(!define-type-vops simple-array-unsigned-byte-16-p
+      check-simple-array-unsigned-byte-16
+      simple-array-unsigned-byte-16
+    object-not-simple-array-unsigned-byte-16-error
+  (simple-array-unsigned-byte-16-widetag))
+
+(!define-type-vops simple-array-unsigned-byte-32-p
+      check-simple-array-unsigned-byte-32
+      simple-array-unsigned-byte-32
+    object-not-simple-array-unsigned-byte-32-error
+  (simple-array-unsigned-byte-32-widetag))
+
+(!define-type-vops simple-array-signed-byte-8-p
+      check-simple-array-signed-byte-8
+      simple-array-signed-byte-8
+    object-not-simple-array-signed-byte-8-error
+  (simple-array-signed-byte-8-widetag))
+
+(!define-type-vops simple-array-signed-byte-16-p
+      check-simple-array-signed-byte-16
+      simple-array-signed-byte-16
+    object-not-simple-array-signed-byte-16-error
+  (simple-array-signed-byte-16-widetag))
+
+(!define-type-vops simple-array-signed-byte-30-p
+      check-simple-array-signed-byte-30
+      simple-array-signed-byte-30
+    object-not-simple-array-signed-byte-30-error
+  (simple-array-signed-byte-30-widetag))
+
+(!define-type-vops simple-array-signed-byte-32-p
+      check-simple-array-signed-byte-32
+      simple-array-signed-byte-32
+    object-not-simple-array-signed-byte-32-error
+  (simple-array-signed-byte-32-widetag))
+
+(!define-type-vops simple-array-single-float-p check-simple-array-single-float
+      simple-array-single-float
+    object-not-simple-array-single-float-error
+  (simple-array-single-float-widetag))
+
+(!define-type-vops simple-array-double-float-p check-simple-array-double-float
+      simple-array-double-float
+    object-not-simple-array-double-float-error
+  (simple-array-double-float-widetag))
+
+#!+long-float
+(!define-type-vops simple-array-long-float-p check-simple-array-long-float
+      simple-array-long-float
+    object-not-simple-array-long-float-error
+  (simple-array-long-float-widetag))
+
+(!define-type-vops simple-array-complex-single-float-p
+      check-simple-array-complex-single-float
+      simple-array-complex-single-float
+    object-not-simple-array-complex-single-float-error
+  (simple-array-complex-single-float-widetag))
+
+(!define-type-vops simple-array-complex-double-float-p
+      check-simple-array-complex-double-float
+      simple-array-complex-double-float
+    object-not-simple-array-complex-double-float-error
+  (simple-array-complex-double-float-widetag))
+
+#!+long-float
+(!define-type-vops simple-array-complex-long-float-p
+      check-simple-array-complex-long-float
+      simple-array-complex-long-float
+    object-not-simple-array-complex-long-float-error
+  (simple-array-complex-long-float-widetag))
+
+(!define-type-vops base-char-p check-base-char base-char
+    object-not-base-char-error
+  (base-char-widetag))
+
+(!define-type-vops system-area-pointer-p check-system-area-pointer
+      system-area-pointer
+    object-not-sap-error
+  (sap-widetag))
+
+(!define-type-vops weak-pointer-p check-weak-pointer weak-pointer
+    object-not-weak-pointer-error
+  (weak-pointer-widetag))
+
+(!define-type-vops code-component-p nil nil nil
+  (code-header-widetag))
+
+(!define-type-vops lra-p nil nil nil
+  (return-pc-header-widetag))
+
+(!define-type-vops fdefn-p nil nil nil
+  (fdefn-widetag))
+
+(!define-type-vops funcallable-instance-p nil nil nil
+  (funcallable-instance-header-widetag))
+
+(!define-type-vops array-header-p nil nil nil
+  (simple-array-widetag complex-string-widetag complex-bit-vector-widetag
+                       complex-vector-widetag complex-array-widetag))
+
+(!define-type-vops stringp check-string nil object-not-string-error
+  (simple-string-widetag complex-string-widetag))
+
+(!define-type-vops bit-vector-p check-bit-vector nil
+    object-not-bit-vector-error
+  (simple-bit-vector-widetag complex-bit-vector-widetag))
+
+(!define-type-vops vectorp check-vector nil object-not-vector-error
+  (simple-string-widetag
+   simple-bit-vector-widetag
+   simple-vector-widetag
+   simple-array-unsigned-byte-2-widetag
+   simple-array-unsigned-byte-4-widetag
+   simple-array-unsigned-byte-8-widetag
+   simple-array-unsigned-byte-16-widetag
+   simple-array-unsigned-byte-32-widetag
+   simple-array-signed-byte-8-widetag
+   simple-array-signed-byte-16-widetag
+   simple-array-signed-byte-30-widetag
+   simple-array-signed-byte-32-widetag
+   simple-array-single-float-widetag
+   simple-array-double-float-widetag
+   #!+long-float simple-array-long-float-widetag
+   simple-array-complex-single-float-widetag
+   simple-array-complex-double-float-widetag
+   #!+long-float simple-array-complex-long-float-widetag
+   complex-string-widetag
+   complex-bit-vector-widetag
+   complex-vector-widetag))
+
+;;; Note that this "type VOP" is sort of an oddball; it doesn't so
+;;; much test for a Lisp-level type as just expose a low-level type
+;;; code at the Lisp level. It is used as a building block to help us
+;;; to express things like the test for (TYPEP FOO '(VECTOR T))
+;;; efficiently in Lisp code, but it doesn't correspond to any type
+;;; expression which would actually occur in reasonable application
+;;; code. (Common Lisp doesn't have any natural way of expressing this
+;;; type.) Thus, there's no point in building up the full machinery of
+;;; associated backend type predicates and so forth as we do for
+;;; ordinary type VOPs.
+(!define-type-vops complex-vector-p check-complex-vector nil
+    object-not-complex-vector-error
+  (complex-vector-widetag))
+
+(!define-type-vops simple-array-p check-simple-array nil
+    object-not-simple-array-error
+  (simple-array-widetag
+   simple-string-widetag
+   simple-bit-vector-widetag
+   simple-vector-widetag
+   simple-array-unsigned-byte-2-widetag
+   simple-array-unsigned-byte-4-widetag
+   simple-array-unsigned-byte-8-widetag
+   simple-array-unsigned-byte-16-widetag
+   simple-array-unsigned-byte-32-widetag
+   simple-array-signed-byte-8-widetag
+   simple-array-signed-byte-16-widetag
+   simple-array-signed-byte-30-widetag
+   simple-array-signed-byte-32-widetag
+   simple-array-single-float-widetag
+   simple-array-double-float-widetag
+   #!+long-float simple-array-long-float-widetag
+   simple-array-complex-single-float-widetag
+   simple-array-complex-double-float-widetag
+   #!+long-float simple-array-complex-long-float-widetag))
+
+(!define-type-vops arrayp check-array nil object-not-array-error
+  (simple-array-widetag
+   simple-string-widetag
+   simple-bit-vector-widetag
+   simple-vector-widetag
+   simple-array-unsigned-byte-2-widetag
+   simple-array-unsigned-byte-4-widetag
+   simple-array-unsigned-byte-8-widetag
+   simple-array-unsigned-byte-16-widetag
+   simple-array-unsigned-byte-32-widetag
+   simple-array-signed-byte-8-widetag
+   simple-array-signed-byte-16-widetag
+   simple-array-signed-byte-30-widetag
+   simple-array-signed-byte-32-widetag
+   simple-array-single-float-widetag
+   simple-array-double-float-widetag
+   #!+long-float simple-array-long-float-widetag
+   simple-array-complex-single-float-widetag
+   simple-array-complex-double-float-widetag
+   #!+long-float simple-array-complex-long-float-widetag
+   complex-string-widetag
+   complex-bit-vector-widetag
+   complex-vector-widetag
+   complex-array-widetag))
+
+(!define-type-vops numberp check-number nil object-not-number-error
+  (even-fixnum-lowtag
+   odd-fixnum-lowtag
+   bignum-widetag
+   ratio-widetag
+   single-float-widetag
+   double-float-widetag
+   #!+long-float long-float-widetag
+   complex-widetag
+   complex-single-float-widetag
+   complex-double-float-widetag
+   #!+long-float complex-long-float-widetag))
+
+(!define-type-vops rationalp check-rational nil object-not-rational-error
+  (even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag))
+
+(!define-type-vops integerp check-integer nil object-not-integer-error
+  (even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag))
+
+(!define-type-vops floatp check-float nil object-not-float-error
+  (single-float-widetag double-float-widetag #!+long-float long-float-widetag))
+
+(!define-type-vops realp check-real nil object-not-real-error
+  (even-fixnum-lowtag
+   odd-fixnum-lowtag
+   ratio-widetag
+   bignum-widetag
+   single-float-widetag
+   double-float-widetag
+   #!+long-float long-float-widetag))
index b63b3c6..38fa31c 100644 (file)
@@ -1,4 +1,5 @@
-;;;; utility functions needed by the back end to generate code
+;;;; utility functions and macros needed by the back end to generate
+;;;; code
 
 ;;;; This software is part of the SBCL system. See the README file for
 ;;;; more information.
        (- list-pointer-lowtag)
        (* static-fun-index (pad-data-block fdefn-size))
        (* fdefn-raw-addr-slot n-word-bytes))))
+\f
+;;; Various error-code generating helpers
+(defvar *adjustable-vectors* nil)
+
+(defmacro with-adjustable-vector ((var) &rest body)
+  `(let ((,var (or (pop *adjustable-vectors*)
+                   (make-array 16
+                               :element-type '(unsigned-byte 8)
+                               :fill-pointer 0
+                               :adjustable t))))
+     (declare (type (vector (unsigned-byte 8) 16) ,var))
+     (setf (fill-pointer ,var) 0)
+     (unwind-protect
+         (progn
+           ,@body)
+       (push ,var *adjustable-vectors*))))
index d66bdae..5daaace 100644 (file)
@@ -1,3 +1,13 @@
+;;;; various useful macros for generating HPPA code
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
 (in-package "SB!VM")
 
 \f
@@ -80,7 +90,6 @@
 ;;; Load-Stack-TN, Store-Stack-TN  --  Interface
 ;;;
 ;;;    Move a stack TN to a register and vice-versa.
-;;;
 (defmacro load-stack-tn (reg stack)
   `(let ((reg ,reg)
         (stack ,stack))
         ((control-stack)
          (storew reg cfp-tn offset))))))
 
-
-;;; MAYBE-LOAD-STACK-TN  --  Interface
-;;;
 (defmacro maybe-load-stack-tn (reg reg-or-stack)
   "Move the TN Reg-Or-Stack into Reg if it isn't already there."
   (once-only ((n-reg reg)
 
 \f
 ;;;; Error Code
-
-(defvar *adjustable-vectors* nil)
-
-(defmacro with-adjustable-vector ((var) &rest body)
-  `(let ((,var (or (pop *adjustable-vectors*)
-                  (make-array 16
-                              :element-type '(unsigned-byte 8)
-                              :fill-pointer 0
-                              :adjustable t))))
-     (declare (type (vector (unsigned-byte 8) 16) ,var))
-     (setf (fill-pointer ,var) 0)
-     (unwind-protect
-        (progn
-          ,@body)
-       (push ,var *adjustable-vectors*))))
-
 (eval-when (compile load eval)
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
index 7b72169..cf5de08 100644 (file)
-(in-package "SB!VM")
+;;;; type testing and checking VOPs for the HPPA VM
 
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
 
+(in-package "SB!VM")
 \f
-;;;; Test generation utilities.
-
-(eval-when (:compile-toplevel :execute)
-
-(defparameter *immediate-types*
-  (list unbound-marker-widetag base-char-widetag))
-
-(defparameter *fun-header-widetags*
-  (list funcallable-instance-header-widetag
-       simple-fun-header-widetag
-       closure-fun-header-widetag
-       closure-header-widetag))
-
-(defun canonicalize-headers (headers)
-  (collect ((results))
-    (let ((start nil)
-         (prev nil)
-         (delta (- other-immediate-1-lowtag other-immediate-0-lowtag)))
-      (flet ((emit-test ()
-              (results (if (= start prev)
-                           start
-                           (cons start prev)))))
-       (dolist (header (sort headers #'<))
-         (cond ((null start)
-                (setf start header)
-                (setf prev header))
-               ((= header (+ prev delta))
-                (setf prev header))
-               (t
-                (emit-test)
-                (setf start header)
-                (setf prev header))))
-       (emit-test)))
-    (results)))
-
-); eval-when (compile eval)
-
-(macrolet ((test-type (value temp target not-p &rest type-codes)
-  ;; Determine what interesting combinations we need to test for.
-  (let* ((type-codes (mapcar #'eval type-codes))
-        (fixnump (and (member even-fixnum-lowtag type-codes)
-                      (member odd-fixnum-lowtag type-codes)
-                      t))
-        (lowtags (remove lowtag-limit type-codes :test #'<))
-        (extended (remove lowtag-limit type-codes :test #'>))
-        (immediates (intersection extended *immediate-types* :test #'eql))
-        (headers (set-difference extended *immediate-types* :test #'eql))
-        (function-p (if (intersection headers *fun-header-widetags*)
-                        (if (subsetp headers *fun-header-widetags*)
-                            t
-                            (error "Can't test for mix of function subtypes ~
-                                    and normal header types."))
-                        nil)))
-    (unless type-codes
-      (error "Must supply at least on type for test-type."))
-    (cond
-     (fixnump
-      (when (remove-if #'(lambda (x)
-                          (or (= x even-fixnum-lowtag)
-                              (= x odd-fixnum-lowtag)))
-                      lowtags)
-       (error "Can't mix fixnum testing with other lowtags."))
-      (when function-p
-       (error "Can't mix fixnum testing with function subtype testing."))
-      (when immediates
-       (error "Can't mix fixnum testing with other immediates."))
-      (if headers
-         `(%test-fixnum-and-headers ,value ,temp ,target ,not-p
-                                    ',(canonicalize-headers headers))
-         `(%test-fixnum ,value ,temp ,target ,not-p)))
-     (immediates
-      (when headers
-       (error "Can't mix testing of immediates with testing of headers."))
-      (when lowtags
-       (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 ,temp ,target ,not-p ,(car immediates)))
-     (lowtags
-      (when (cdr lowtags)
-       (error "Can't test multiple lowtags at the same time."))
-      (if headers
-         `(%test-lowtag-and-headers
-           ,value ,temp ,target ,not-p ,(car lowtags)
-           ,function-p ',(canonicalize-headers headers))
-         `(%test-lowtag ,value ,temp ,target ,not-p ,(car lowtags))))
-     (headers
-      `(%test-headers ,value ,temp ,target ,not-p ,function-p
-                     ',(canonicalize-headers headers)))
-     (t
-      (error "Nothing to test?"))))))
-
-
-(defun %test-fixnum (value temp target not-p)
+;;; Test generation utilities.
+(defun %test-fixnum (value target not-p &key temp)
   (declare (ignore temp))
   (assemble ()
     (inst extru value 31 2 zero-tn (if not-p := :<>))
     (inst b target :nullify t)))
 
-(defun %test-fixnum-and-headers (value temp target not-p headers)
+(defun %test-fixnum-and-headers (value target not-p headers &key temp)
   (let ((drop-through (gen-label)))
     (assemble ()
       (inst extru value 31 2 zero-tn :<>)
       (inst b (if not-p drop-through target) :nullify t))
-    (%test-headers value temp target not-p nil headers drop-through)))
+    (%test-headers value target not-p nil headers
+                  :drop-through drop-through :temp temp)))
 
-(defun %test-immediate (value temp target not-p immediate)
+(defun %test-immediate (value target not-p immediate &key temp)
   (assemble ()
     (inst extru value 31 8 temp)
     (inst bci := not-p immediate temp target)))
 
-(defun %test-lowtag (value temp target not-p lowtag &optional temp-loaded)
+(defun %test-lowtag (value target not-p lowtag
+                    &key temp temp-loaded)
   (assemble ()
     (unless temp-loaded
       (inst extru value 31 3 temp))
     (inst bci := not-p lowtag temp target)))
 
-(defun %test-lowtag-and-headers (value temp target not-p lowtag
-                                      function-p headers)
+(defun %test-lowtag-and-headers (value target not-p lowtag
+                                function-p headers &key temp)
   (let ((drop-through (gen-label)))
-    (%test-lowtag value temp (if not-p drop-through target) nil lowtag)
-    (%test-headers value temp target not-p function-p headers drop-through t)))
+    (%test-lowtag value (if not-p drop-through target) nil lowtag
+                 :temp temp)
+    (%test-headers value target not-p function-p headers
+                  :drop-through drop-through :temp temp :temp-loaded t)))
 
-(defun %test-headers (value temp target not-p function-p headers
-                           &optional (drop-through (gen-label)) temp-loaded)
+(defun %test-headers (value target not-p function-p headers
+                     &key temp (drop-through (gen-label)) temp-loaded)
   (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag)))
     (multiple-value-bind
        (equal greater-or-equal when-true when-false)
            (values :<> :< drop-through target)
            (values := :>= target drop-through))
       (assemble ()
-       (%test-lowtag value temp when-false t lowtag temp-loaded)
+       (%test-lowtag value when-false t lowtag
+                     :temp temp :temp-loaded temp-loaded)
        (inst ldb (- 3 lowtag) value temp)
        (do ((remaining headers (cdr remaining)))
            ((null remaining))
                    (inst bci greater-or-equal nil end temp target)
                    (inst bci :>= nil end temp when-true)))))))
        (emit-label drop-through)))))
-
 \f
 ;;;; Type checking and testing:
 
   (:info target not-p)
   (:policy :fast-safe))
 
-(eval-when (:compile-toplevel :execute)
-
 (defun cost-to-test-types (type-codes)
   (+ (* 2 (length type-codes))
      (if (> (apply #'max type-codes) lowtag-limit) 7 2)))
 
-) ; EVAL-WHEN
-
-(defmacro def-type-vops (pred-name check-name ptype error-code
-                                  &rest type-codes)
+(defmacro !define-type-vops (pred-name check-name ptype error-code
+                            (&rest type-codes)
+                            &key &allow-other-keys)
   (let ((cost (cost-to-test-types (mapcar #'eval type-codes))))
     `(progn
        ,@(when pred-name
           `((define-vop (,pred-name type-predicate)
               (:translate ,pred-name)
               (:generator ,cost
-                (test-type value temp target not-p ,@type-codes)))))
+                (test-type value target not-p (,@type-codes) :temp temp)))))
        ,@(when check-name
           `((define-vop (,check-name check-type)
               (:generator ,cost
                 (let ((err-lab
                        (generate-error-code vop ,error-code value)))
-                  (test-type value temp err-lab t ,@type-codes)
+                  (test-type value err-lab t (,@type-codes) :temp temp)
                   (move value result))))))
        ,@(when ptype
           `((primitive-type-vop ,check-name (:check) ,ptype))))))
-
-(def-type-vops fixnump check-fixnum fixnum object-not-fixnum-error
-  even-fixnum-lowtag odd-fixnum-lowtag)
-
-(def-type-vops functionp check-function function
-  object-not-fun-error fun-pointer-lowtag)
-
-(def-type-vops listp check-list list object-not-list-error
-  list-pointer-lowtag)
-
-(def-type-vops %instancep check-instance instance object-not-instance-error
-  instance-pointer-lowtag)
-
-(def-type-vops bignump check-bignum bignum
-  object-not-bignum-error bignum-widetag)
-
-(def-type-vops ratiop check-ratio ratio
-  object-not-ratio-error ratio-widetag)
-
-(def-type-vops complexp check-complex complex object-not-complex-error
-  complex-widetag complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops complex-rational-p check-complex-rational nil
-  object-not-complex-rational-error complex-widetag)
-
-(def-type-vops complex-float-p check-complex-float nil
-  object-not-complex-float-error
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops complex-single-float-p check-complex-single-float
-  complex-single-float object-not-complex-single-float-error
-  complex-single-float-widetag)
-
-(def-type-vops complex-double-float-p check-complex-double-float
-  complex-double-float object-not-complex-double-float-error
-  complex-double-float-widetag)
-
-(def-type-vops single-float-p check-single-float single-float
-  object-not-single-float-error single-float-widetag)
-
-(def-type-vops double-float-p check-double-float double-float
-  object-not-double-float-error double-float-widetag)
-
-(def-type-vops simple-string-p check-simple-string simple-string
-  object-not-simple-string-error simple-string-widetag)
-
-(def-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
-  object-not-simple-bit-vector-error simple-bit-vector-widetag)
-
-(def-type-vops simple-vector-p check-simple-vector simple-vector
-  object-not-simple-vector-error simple-vector-widetag)
-
-(def-type-vops simple-array-unsigned-byte-2-p
-  check-simple-array-unsigned-byte-2
-  simple-array-unsigned-byte-2
-  object-not-simple-array-unsigned-byte-2-error
-  simple-array-unsigned-byte-2-widetag)
-
-(def-type-vops simple-array-unsigned-byte-4-p
-  check-simple-array-unsigned-byte-4
-  simple-array-unsigned-byte-4
-  object-not-simple-array-unsigned-byte-4-error
-  simple-array-unsigned-byte-4-widetag)
-
-(def-type-vops simple-array-unsigned-byte-8-p
-  check-simple-array-unsigned-byte-8
-  simple-array-unsigned-byte-8
-  object-not-simple-array-unsigned-byte-8-error
-  simple-array-unsigned-byte-8-widetag)
-
-(def-type-vops simple-array-unsigned-byte-16-p
-  check-simple-array-unsigned-byte-16
-  simple-array-unsigned-byte-16
-  object-not-simple-array-unsigned-byte-16-error
-  simple-array-unsigned-byte-16-widetag)
-
-(def-type-vops simple-array-unsigned-byte-32-p
-  check-simple-array-unsigned-byte-32
-  simple-array-unsigned-byte-32
-  object-not-simple-array-unsigned-byte-32-error
-  simple-array-unsigned-byte-32-widetag)
-
-(def-type-vops simple-array-signed-byte-8-p
-  check-simple-array-signed-byte-8
-  simple-array-signed-byte-8
-  object-not-simple-array-signed-byte-8-error
-  simple-array-signed-byte-8-widetag)
-
-(def-type-vops simple-array-signed-byte-16-p
-  check-simple-array-signed-byte-16
-  simple-array-signed-byte-16
-  object-not-simple-array-signed-byte-16-error
-  simple-array-signed-byte-16-widetag)
-
-(def-type-vops simple-array-signed-byte-30-p
-  check-simple-array-signed-byte-30
-  simple-array-signed-byte-30
-  object-not-simple-array-signed-byte-30-error
-  simple-array-signed-byte-30-widetag)
-
-(def-type-vops simple-array-signed-byte-32-p
-  check-simple-array-signed-byte-32
-  simple-array-signed-byte-32
-  object-not-simple-array-signed-byte-32-error
-  simple-array-signed-byte-32-widetag)
-
-(def-type-vops simple-array-single-float-p check-simple-array-single-float
-  simple-array-single-float object-not-simple-array-single-float-error
-  simple-array-single-float-widetag)
-
-(def-type-vops simple-array-double-float-p check-simple-array-double-float
-  simple-array-double-float object-not-simple-array-double-float-error
-  simple-array-double-float-widetag)
-
-(def-type-vops simple-array-complex-single-float-p
-  check-simple-array-complex-single-float
-  simple-array-complex-single-float
-  object-not-simple-array-complex-single-float-error
-  simple-array-complex-single-float-widetag)
-
-(def-type-vops simple-array-complex-double-float-p
-  check-simple-array-complex-double-float
-  simple-array-complex-double-float
-  object-not-simple-array-complex-double-float-error
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops base-char-p check-base-char base-char
-  object-not-base-char-error base-char-widetag)
-
-(def-type-vops system-area-pointer-p check-system-area-pointer
-  system-area-pointer object-not-sap-error sap-widetag)
-
-(def-type-vops weak-pointer-p check-weak-pointer weak-pointer
-  object-not-weak-pointer-error weak-pointer-widetag)
-
-#|
-(def-type-vops scavenger-hook-p nil nil nil
-  0)
-|#
-
-(def-type-vops code-component-p nil nil nil
-  code-header-widetag)
-
-(def-type-vops lra-p nil nil nil
-  return-pc-header-widetag)
-
-(def-type-vops fdefn-p nil nil nil
-  fdefn-widetag)
-
-(def-type-vops funcallable-instance-p nil nil nil
-  funcallable-instance-header-widetag)
-
-(def-type-vops array-header-p nil nil nil
-  simple-array-widetag complex-string-widetag complex-bit-vector-widetag
-  complex-vector-widetag complex-array-widetag)
-
-#+nil
-(def-type-vops nil check-function-or-symbol nil
-  object-not-function-or-symbol-error
-  fun-pointer-lowtag symbol-header-widetag)
-
-(def-type-vops stringp check-string nil object-not-string-error
-  simple-string-widetag complex-string-widetag)
-
-(def-type-vops bit-vector-p check-bit-vector nil object-not-bit-vector-error
-  simple-bit-vector-widetag complex-bit-vector-widetag)
-
-(def-type-vops vectorp check-vector nil object-not-vector-error
-  simple-string-widetag simple-bit-vector-widetag simple-vector-widetag
-  simple-array-unsigned-byte-2-widetag simple-array-unsigned-byte-4-widetag
-  simple-array-unsigned-byte-8-widetag simple-array-unsigned-byte-16-widetag
-  simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag)
-
-(def-type-vops complex-vector-p check-complex-vector nil object-not-complex-vector-error
-  complex-vector-widetag)
-
-(def-type-vops simple-array-p check-simple-array nil object-not-simple-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops arrayp check-array nil object-not-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag
-  complex-array-widetag)
-
-(def-type-vops numberp check-number nil object-not-number-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag ratio-widetag
-  single-float-widetag double-float-widetag complex-widetag
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops rationalp check-rational nil object-not-rational-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag)
-
-(def-type-vops integerp check-integer nil object-not-integer-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag)
-
-(def-type-vops floatp check-float nil object-not-float-error
-  single-float-widetag double-float-widetag)
-
-(def-type-vops realp check-real nil object-not-real-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag
-  single-float-widetag double-float-widetag)
-
 \f
 ;;;; Other integer ranges.
 
   (:translate symbolp)
   (:generator 12
     (inst bc := nil value null-tn (if not-p drop-thru target))
-    (test-type value temp target not-p symbol-header-widetag)
+    (test-type value target not-p (symbol-header-widetag) :temp temp)
     DROP-THRU))
 
 (define-vop (check-symbol check-type)
   (:generator 12
     (inst comb := value null-tn drop-thru)
     (let ((error (generate-error-code vop object-not-symbol-error value)))
-      (test-type value temp error t symbol-header-widetag))
+      (test-type value error t (symbol-header-widetag) :temp temp))
     DROP-THRU
     (move value result)))
   
   (:translate consp)
   (:generator 8
     (inst bc := nil value null-tn (if not-p target drop-thru))
-    (test-type value temp target not-p list-pointer-lowtag)
+    (test-type value target not-p (list-pointer-lowtag) :temp temp)
     DROP-THRU))
 
 (define-vop (check-cons check-type)
   (:generator 8
     (let ((error (generate-error-code vop object-not-cons-error value)))
       (inst bc := nil value null-tn error)
-      (test-type value temp error t list-pointer-lowtag))
+      (test-type value error t (list-pointer-lowtag) :temp temp))
     (move value result)))
 
-) ; MACROLET
\ No newline at end of file
index 7f8f077..45ce543 100644 (file)
@@ -1,3 +1,13 @@
+;;;; various useful macros for generating MIPS code
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
 (in-package "SB!VM")
 
 ;;; Handy macro for defining top-level forms that depend on the compile
 ;;; Load-Stack-TN, Store-Stack-TN  --  Interface
 ;;;
 ;;;    Move a stack TN to a register and vice-versa.
-;;;
 (defmacro load-stack-tn (reg stack)
   `(let ((reg ,reg)
         (stack ,stack))
         ((control-stack)
          (storew reg cfp-tn offset))))))
 
-
-;;; MAYBE-LOAD-STACK-TN  --  Interface
-;;;
 (defmacro maybe-load-stack-tn (reg reg-or-stack)
   "Move the TN Reg-Or-Stack into Reg if it isn't already there."
   (once-only ((n-reg reg)
 
 \f
 ;;;; Storage allocation:
-
 (defmacro with-fixed-allocation ((result-tn flag-tn temp-tn type-code size)
                                 &body body)
   "Do stuff to allocate an other-pointer object of fixed Size with a single
 
 \f
 ;;;; Three Way Comparison
-
 (defun three-way-comparison (x y condition flavor not-p target temp)
   (ecase condition
     (:eq
 
 \f
 ;;;; Error Code
-
-
-(defvar *adjustable-vectors* nil)
-
-(defmacro with-adjustable-vector ((var) &rest body)
-  `(let ((,var (or (pop *adjustable-vectors*)
-                  (make-array 16
-                              :element-type '(unsigned-byte 8)
-                              :fill-pointer 0
-                              :adjustable t))))
-     (setf (fill-pointer ,var) 0)
-     (unwind-protect
-        (progn
-          ,@body)
-       (push ,var *adjustable-vectors*))))
-
 (eval-when (compile load eval)
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
index b5a618e..0864e69 100644 (file)
@@ -1,98 +1,18 @@
-(in-package "SB!VM")
+;;;; type testing and checking VOPs for the MIPS VM
 
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
 
+(in-package "SB!VM")
 \f
-;;;; Test generation utilities.
-
-(eval-when (:compile-toplevel :execute)
-  (defparameter *immediate-types*
-    (list unbound-marker-widetag base-char-widetag))
-
-  (defparameter *fun-header-widetags*
-    (list funcallable-instance-header-widetag 
-         simple-fun-header-widetag 
-         closure-fun-header-widetag
-         closure-header-widetag))
-
-  (defun canonicalize-headers (headers)
-    (collect ((results))
-            (let ((start nil)
-                  (prev nil)
-                  (delta (- other-immediate-1-lowtag other-immediate-0-lowtag)))
-              (flet ((emit-test ()
-                       (results (if (= start prev)
-                                    start
-                                    (cons start prev)))))
-                (dolist (header (sort headers #'<))
-                  (cond ((null start)
-                         (setf start header)
-                         (setf prev header))
-                        ((= header (+ prev delta))
-                         (setf prev header))
-                        (t
-                         (emit-test)
-                         (setf start header)
-                         (setf prev header))))
-                (emit-test)))
-            (results))))
-
-
-(macrolet ((test-type (value temp target not-p &rest type-codes)
-  ;; Determine what interesting combinations we need to test for.
-  (let* ((type-codes (mapcar #'eval type-codes))
-        (fixnump (and (member even-fixnum-lowtag type-codes)
-                      (member odd-fixnum-lowtag type-codes)
-                      t))
-        (lowtags (remove lowtag-limit type-codes :test #'<))
-        (extended (remove lowtag-limit type-codes :test #'>))
-        (immediates (intersection extended *immediate-types* :test #'eql))
-        (headers (set-difference extended *immediate-types* :test #'eql))
-        (function-p (if (intersection headers *fun-header-widetags*)
-                        (if (subsetp headers *fun-header-widetags*)
-                            t
-                            (error "Can't test for mix of function subtypes ~
-                                    and normal header types."))
-                        nil)))
-    (unless type-codes
-      (error "Must supply at least on type for test-type."))
-    (cond
-     (fixnump
-      (when (remove-if #'(lambda (x)
-                          (or (= x even-fixnum-lowtag)
-                              (= x odd-fixnum-lowtag)))
-                      lowtags)
-       (error "Can't mix fixnum testing with other lowtags."))
-      (when function-p
-       (error "Can't mix fixnum testing with function subtype testing."))
-      (when immediates
-       (error "Can't mix fixnum testing with other immediates."))
-      (if headers
-         `(%test-fixnum-and-headers ,value ,temp ,target ,not-p
-                                    ',(canonicalize-headers headers))
-         `(%test-fixnum ,value ,temp ,target ,not-p)))
-     (immediates
-      (when headers
-       (error "Can't mix testing of immediates with testing of headers."))
-      (when lowtags
-       (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 ,temp ,target ,not-p ,(car immediates)))
-     (lowtags
-      (when (cdr lowtags)
-       (error "Can't test multiple lowtags at the same time."))
-      (if headers
-         `(%test-lowtag-and-headers
-           ,value ,temp ,target ,not-p ,(car lowtags)
-           ,function-p ',(canonicalize-headers headers))
-         `(%test-lowtag ,value ,temp ,target ,not-p ,(car lowtags))))
-     (headers
-      `(%test-headers ,value ,temp ,target ,not-p ,function-p
-                     ',(canonicalize-headers headers)))
-     (t
-      (error "Nothing to test?"))))))
-
-(defun %test-fixnum (value temp target not-p)
+;;; Test generation utilities.
+(defun %test-fixnum (value target not-p &key temp)
   (assemble ()
     (inst and temp value 3)
     (if not-p
        (inst beq temp zero-tn target))
     (inst nop)))
 
-(defun %test-fixnum-and-headers (value temp target not-p headers)
+(defun %test-fixnum-and-headers (value target not-p headers &key temp)
   (let ((drop-through (gen-label)))
     (assemble ()
       (inst and temp value 3)
       (inst beq temp zero-tn (if not-p drop-through target)))
-    (%test-headers value temp target not-p nil headers drop-through)))
+    (%test-headers value target not-p nil headers
+                  :drop-through drop-through :temp temp)))
 
-(defun %test-immediate (value temp target not-p immediate)
+(defun %test-immediate (value target not-p immediate &key temp)
   (assemble ()
     (inst and temp value 255)
     (inst xor temp immediate)
        (inst beq temp zero-tn target))
     (inst nop)))
 
-(defun %test-lowtag (value temp target not-p lowtag &optional skip-nop)
+(defun %test-lowtag (value target not-p lowtag &key skip-nop temp)
   (assemble ()
     (inst and temp value lowtag-mask)
     (inst xor temp lowtag)
     (unless skip-nop
       (inst nop))))
 
-(defun %test-lowtag-and-headers (value temp target not-p lowtag
-                                      function-p headers)
+(defun %test-lowtag-and-headers (value target not-p lowtag
+                                function-p headers &key temp)
   (let ((drop-through (gen-label)))
-    (%test-lowtag value temp (if not-p drop-through target) nil lowtag t)
-    (%test-headers value temp target not-p function-p headers drop-through)))
+    (%test-lowtag value (if not-p drop-through target) nil lowtag
+                 :skip-nop t :temp temp)
+    (%test-headers value target not-p function-p headers
+                  :drop-through drop-through :temp temp)))
 
-(defun %test-headers (value temp target not-p function-p headers
-                           &optional (drop-through (gen-label)))
+(defun %test-headers (value target not-p function-p headers
+                     &key (drop-through (gen-label)) temp)
   (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag)))
     (multiple-value-bind
        (when-true when-false)
            (values drop-through target)
            (values target drop-through))
       (assemble ()
-       (%test-lowtag value temp when-false t lowtag)
+       (%test-lowtag value when-false t lowtag :temp temp)
        (load-type temp value (- lowtag))
        (inst nop)
        (let ((delta 0))
 
 
 \f
-;;;; Type checking and testing:
-
+;;; Type checking and testing (see also the use of !DEFINE-TYPE-VOPS
+;;; in src/compiler/generic/late-type-vops.lisp):
+;;;
+;;; [FIXME: Like some of the other comments in this file, this one
+;;; really belongs somewhere else]
 (define-vop (check-type)
   (:args (value :target result :scs (any-reg descriptor-reg)))
   (:results (result :scs (any-reg descriptor-reg)))
   (:info target not-p)
   (:policy :fast-safe))
 
-(eval-when (:compile-toplevel :execute)
-  (defun cost-to-test-types (type-codes)
-    (+ (* 2 (length type-codes))
-       (if (> (apply #'max type-codes) lowtag-limit) 7 2))))
+(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)
+(defmacro !define-type-vops (pred-name check-name ptype error-code
+                            (&rest type-codes)
+                            &key &allow-other-keys)
   (let ((cost (cost-to-test-types (mapcar #'eval type-codes))))
     `(progn
        ,@(when pred-name
           `((define-vop (,pred-name type-predicate)
               (:translate ,pred-name)
               (:generator ,cost
-                (test-type value temp target not-p ,@type-codes)))))
+                (test-type value target not-p (,@type-codes)
+                           :temp temp)))))
        ,@(when check-name
           `((define-vop (,check-name check-type)
               (:generator ,cost
                 (let ((err-lab
                        (generate-error-code vop ,error-code value)))
-                  (test-type value temp err-lab t ,@type-codes)
+                  (test-type value err-lab t (,@type-codes)
+                             :temp temp)
                   (move result value))))))
        ,@(when ptype
           `((primitive-type-vop ,check-name (:check) ,ptype))))))
-
-(def-type-vops fixnump check-fixnum fixnum object-not-fixnum-error
-  even-fixnum-lowtag odd-fixnum-lowtag)
-
-(def-type-vops functionp check-fun function
-  object-not-fun-error fun-pointer-lowtag)
-
-(def-type-vops listp check-list list object-not-list-error
-  list-pointer-lowtag)
-
-(def-type-vops %instancep check-instance instance object-not-instance-error
-  instance-pointer-lowtag)
-
-(def-type-vops bignump check-bignum bignum
-  object-not-bignum-error bignum-widetag)
-
-(def-type-vops ratiop check-ratio ratio
-  object-not-ratio-error ratio-widetag)
-
-(def-type-vops complexp check-complex complex object-not-complex-error
-  complex-widetag complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops complex-rational-p check-complex-rational nil
-  object-not-complex-rational-error complex-widetag)
-
-(def-type-vops complex-float-p check-complex-float nil
-  object-not-complex-float-error
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops complex-single-float-p check-complex-single-float
-  complex-single-float object-not-complex-single-float-error
-  complex-single-float-widetag)
-
-(def-type-vops complex-double-float-p check-complex-double-float
-  complex-double-float object-not-complex-double-float-error
-  complex-double-float-widetag)
-
-(def-type-vops single-float-p check-single-float single-float
-  object-not-single-float-error single-float-widetag)
-
-(def-type-vops double-float-p check-double-float double-float
-  object-not-double-float-error double-float-widetag)
-
-(def-type-vops simple-string-p check-simple-string simple-string
-  object-not-simple-string-error simple-string-widetag)
-
-(def-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
-  object-not-simple-bit-vector-error simple-bit-vector-widetag)
-
-(def-type-vops simple-vector-p check-simple-vector simple-vector
-  object-not-simple-vector-error simple-vector-widetag)
-
-(def-type-vops simple-array-unsigned-byte-2-p
-  check-simple-array-unsigned-byte-2
-  simple-array-unsigned-byte-2
-  object-not-simple-array-unsigned-byte-2-error
-  simple-array-unsigned-byte-2-widetag)
-
-(def-type-vops simple-array-unsigned-byte-4-p
-  check-simple-array-unsigned-byte-4
-  simple-array-unsigned-byte-4
-  object-not-simple-array-unsigned-byte-4-error
-  simple-array-unsigned-byte-4-widetag)
-
-(def-type-vops simple-array-unsigned-byte-8-p
-  check-simple-array-unsigned-byte-8
-  simple-array-unsigned-byte-8
-  object-not-simple-array-unsigned-byte-8-error
-  simple-array-unsigned-byte-8-widetag)
-
-(def-type-vops simple-array-unsigned-byte-16-p
-  check-simple-array-unsigned-byte-16
-  simple-array-unsigned-byte-16
-  object-not-simple-array-unsigned-byte-16-error
-  simple-array-unsigned-byte-16-widetag)
-
-(def-type-vops simple-array-unsigned-byte-32-p
-  check-simple-array-unsigned-byte-32
-  simple-array-unsigned-byte-32
-  object-not-simple-array-unsigned-byte-32-error
-  simple-array-unsigned-byte-32-widetag)
-
-(def-type-vops simple-array-signed-byte-8-p
-  check-simple-array-signed-byte-8
-  simple-array-signed-byte-8
-  object-not-simple-array-signed-byte-8-error
-  simple-array-signed-byte-8-widetag)
-
-(def-type-vops simple-array-signed-byte-16-p
-  check-simple-array-signed-byte-16
-  simple-array-signed-byte-16
-  object-not-simple-array-signed-byte-16-error
-  simple-array-signed-byte-16-widetag)
-
-(def-type-vops simple-array-signed-byte-30-p
-  check-simple-array-signed-byte-30
-  simple-array-signed-byte-30
-  object-not-simple-array-signed-byte-30-error
-  simple-array-signed-byte-30-widetag)
-
-(def-type-vops simple-array-signed-byte-32-p
-  check-simple-array-signed-byte-32
-  simple-array-signed-byte-32
-  object-not-simple-array-signed-byte-32-error
-  simple-array-signed-byte-32-widetag)
-
-(def-type-vops simple-array-single-float-p check-simple-array-single-float
-  simple-array-single-float object-not-simple-array-single-float-error
-  simple-array-single-float-widetag)
-
-(def-type-vops simple-array-double-float-p check-simple-array-double-float
-  simple-array-double-float object-not-simple-array-double-float-error
-  simple-array-double-float-widetag)
-
-(def-type-vops simple-array-complex-single-float-p
-  check-simple-array-complex-single-float
-  simple-array-complex-single-float
-  object-not-simple-array-complex-single-float-error
-  simple-array-complex-single-float-widetag)
-
-(def-type-vops simple-array-complex-double-float-p
-  check-simple-array-complex-double-float
-  simple-array-complex-double-float
-  object-not-simple-array-complex-double-float-error
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops base-char-p check-base-char base-char
-  object-not-base-char-error base-char-widetag)
-
-(def-type-vops system-area-pointer-p check-system-area-pointer
-  system-area-pointer object-not-sap-error sap-widetag)
-
-(def-type-vops weak-pointer-p check-weak-pointer weak-pointer
-  object-not-weak-pointer-error weak-pointer-widetag)
-
-(def-type-vops code-component-p nil nil nil
-  code-header-widetag)
-
-(def-type-vops lra-p nil nil nil
-  return-pc-header-widetag)
-
-(def-type-vops fdefn-p nil nil nil
-  fdefn-widetag)
-
-(def-type-vops funcallable-instance-p nil nil nil
-  funcallable-instance-header-widetag)
-
-(def-type-vops array-header-p nil nil nil
-  simple-array-widetag complex-string-widetag complex-bit-vector-widetag
-  complex-vector-widetag complex-array-widetag)
-
-(def-type-vops stringp check-string nil object-not-string-error
-  simple-string-widetag complex-string-widetag)
-
-(def-type-vops bit-vector-p check-bit-vector nil object-not-bit-vector-error
-  simple-bit-vector-widetag complex-bit-vector-widetag)
-
-(def-type-vops vectorp check-vector nil object-not-vector-error
-  simple-string-widetag simple-bit-vector-widetag simple-vector-widetag
-  simple-array-unsigned-byte-2-widetag simple-array-unsigned-byte-4-widetag
-  simple-array-unsigned-byte-8-widetag simple-array-unsigned-byte-16-widetag
-  simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag)
-
-(def-type-vops complex-vector-p check-complex-vector nil object-not-complex-vector-error
-  complex-vector-widetag)
-
-(def-type-vops simple-array-p check-simple-array nil object-not-simple-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops arrayp check-array nil object-not-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag
-  complex-array-widetag)
-
-(def-type-vops numberp check-number nil object-not-number-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag ratio-widetag
-  single-float-widetag double-float-widetag complex-widetag
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops rationalp check-rational nil object-not-rational-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag)
-
-(def-type-vops integerp check-integer nil object-not-integer-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag)
-
-(def-type-vops floatp check-float nil object-not-float-error
-  single-float-widetag double-float-widetag)
-
-(def-type-vops realp check-real nil object-not-real-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag
-  single-float-widetag double-float-widetag)
-
 \f
-;;;; Other integer ranges.
-
-;;; A (signed-byte 32) can be represented with either fixnum or a bignum with
-;;; exactly one digit.
+;;;; TYPE-VOPs for types that are more complex to test for than simple
+;;;; LOWTAG and WIDETAG tests, but that are nevertheless important:
 
+;;; A (SIGNED-BYTE 32) can be represented with either fixnum or a
+;;; bignum with exactly one digit.
 (defun signed-byte-32-test (value temp not-p target not-target)
   (multiple-value-bind
       (yep nope)
     OKAY
     (move result value)))
 
-;;; An (unsigned-byte 32) can be represented with either a positive fixnum, a
-;;; bignum with exactly one positive digit, or a bignum with exactly two digits
-;;; and the second digit all zeros.
-
+;;; An (UNSIGNED-BYTE 32) can be represented with either a positive
+;;; fixnum, a bignum with exactly one positive digit, or a bignum with
+;;; exactly two digits and the second digit all zeros.
 (defun unsigned-byte-32-test (value temp not-p target not-target)
   (multiple-value-bind (yep nope)
                       (if not-p
     OKAY
     (move result value)))
 
-
-\f
-;;;; List/symbol types:
-;;; 
-;;; symbolp (or symbol (eq nil))
-;;; consp (and list (not (eq nil)))
-
+;;; Because of our LOWTAG representation, SYMBOLP and CONSP are
+;;; slightly more complex:
+;;;
+;;; * SYMBOLP is true if the object has SYMBOL-HEADER-WIDETAG or is EQ
+;;; to NIL;
+;;;
+;;; * CONSP is true if the object has LIST-POINTER-LOWTAG and is not
+;;; EQ to NIL.
+;;;
+;;; [ FIXME: This comment should not really be here, in the bowels of
+;;; the MIPS type-vops, but where should it be?]
 (define-vop (symbolp type-predicate)
   (:translate symbolp)
   (:generator 12
     (inst beq value null-tn (if not-p drop-thru target))
-    (test-type value temp target not-p symbol-header-widetag)
+    (test-type value target not-p (symbol-header-widetag) :temp temp)
     DROP-THRU))
 
 (define-vop (check-symbol check-type)
   (:generator 12
     (inst beq value null-tn drop-thru)
     (let ((error (generate-error-code vop object-not-symbol-error value)))
-      (test-type value temp error t symbol-header-widetag))
+      (test-type value error t (symbol-header-widetag) :temp temp))
     DROP-THRU
     (move result value)))
   
   (:translate consp)
   (:generator 8
     (inst beq value null-tn (if not-p target drop-thru))
-    (test-type value temp target not-p list-pointer-lowtag)
+    (test-type value target not-p (list-pointer-lowtag) :temp temp)
     DROP-THRU))
 
 (define-vop (check-cons check-type)
   (:generator 8
     (let ((error (generate-error-code vop object-not-cons-error value)))
       (inst beq value null-tn error)
-      (test-type value temp error t list-pointer-lowtag))
+      (test-type value error t (list-pointer-lowtag) :temp temp))
     (move result value)))
-
-) ; MACROLET
\ No newline at end of file
index c59e49a..03748fa 100644 (file)
@@ -1,7 +1,15 @@
-;;; 
+;;;; a bunch of handy macros for the PPC
 
-(in-package "SB!VM")
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
 
+(in-package "SB!VM")
 \f
 ;;; Instruction-like macros.
 
 ;;; Load-Stack-TN, Store-Stack-TN  --  Interface
 ;;;
 ;;;    Move a stack TN to a register and vice-versa.
-;;;
 (defmacro load-stack-tn (reg stack)
   `(let ((reg ,reg)
         (stack ,stack))
         ((control-stack)
          (storew reg cfp-tn offset))))))
 
-
-;;; MAYBE-LOAD-STACK-TN  --  Interface
-;;;
 (defmacro maybe-load-stack-tn (reg reg-or-stack)
   "Move the TN Reg-Or-Stack into Reg if it isn't already there."
   (once-only ((n-reg reg)
 
 \f
 ;;;; Storage allocation:
-
 (defmacro with-fixed-allocation ((result-tn flag-tn temp-tn type-code size)
                                 &body body)
   "Do stuff to allocate an other-pointer object of fixed Size with a single
        ,@body)))
 
 \f
-;;;; Type testing noise.
-
-;;; GEN-RANGE-TEST -- internal
-;;;
-;;; Generate code that branches to TARGET iff REG contains one of VALUES.
-;;; If NOT-P is true, invert the test.  Jumping to NOT-TARGET is the same
-;;; as falling out the bottom.
-;;; 
-(defun gen-range-test (reg target not-target not-p min seperation max values)
-  (let ((tests nil)
-       (start nil)
-       (end nil)
-       (insts nil))
-    (multiple-value-bind (equal less-or-equal greater-or-equal label)
-                        (if not-p
-                            (values :ne :gt :lt not-target)
-                            (values :eq :le :ge target))
-      (flet ((emit-test ()
-              (if (= start end)
-                  (push start tests)
-                  (push (cons start end) tests))))
-       (dolist (value values)
-         (cond ((< value min)
-                (error "~S is less than the specified minimum of ~S"
-                       value min))
-               ((> value max)
-                (error "~S is greater than the specified maximum of ~S"
-                       value max))
-               ((not (zerop (rem (- value min) seperation)))
-                (error "~S isn't an even multiple of ~S from ~S"
-                       value seperation min))
-               ((null start)
-                (setf start value))
-               ((> value (+ end seperation))
-                (emit-test)
-                (setf start value)))
-         (setf end value))
-       (emit-test))
-      (macrolet ((inst (name &rest args)
-                      `(push (list 'inst ',name ,@args) insts)))
-       (do ((remaining (nreverse tests) (cdr remaining)))
-           ((null remaining))
-         (let ((test (car remaining))
-               (last (null (cdr remaining))))
-           (if (atom test)
-               (progn
-                 (inst cmpwi reg test)
-                 (if last
-                     (inst b? equal target)
-                     (inst beq label)))
-               (let ((start (car test))
-                     (end (cdr test)))
-                 (cond ((and (= start min) (= end max))
-                        (warn "The values ~S cover the entire range from ~
-                        ~S to ~S [step ~S]."
-                              values min max seperation)
-                        (push `(unless ,not-p (inst b ,target)) insts))
-                       ((= start min)
-                        (inst cmpwi reg end)
-                        (if last
-                            (inst b? less-or-equal target)
-                            (inst ble label)))
-                       ((= end max)
-                        (inst cmpwi reg start)
-                        (if last
-                            (inst b? greater-or-equal target)
-                            (inst bge label)))
-                       (t
-                        (inst cmpwi reg start)
-                        (inst blt (if not-p target not-target))
-                        (inst cmpwi reg end)
-                        (if last
-                            (inst b? less-or-equal target)
-                            (inst ble label))))))))))
-    (nreverse insts)))
-
-(defun gen-other-immediate-test (reg target not-target not-p values)
-  (gen-range-test reg target not-target not-p
-                 (+ other-immediate-0-lowtag lowtag-limit)
-                 (- other-immediate-1-lowtag other-immediate-0-lowtag)
-                 (ash 1 n-widetag-bits)
-                 values))
-
-
-(defun test-type-aux (reg temp target not-target not-p lowtags immed hdrs
-                         function-p)
-  (let* ((fixnump (and (member even-fixnum-lowtag lowtags :test #'eql)
-                      (member odd-fixnum-lowtag lowtags :test #'eql)))
-        (lowtags (sort (if fixnump
-                           (delete even-fixnum-lowtag
-                                   (remove odd-fixnum-lowtag lowtags
-                                           :test #'eql)
-                                   :test #'eql)
-                           (copy-list lowtags))
-                       #'<))
-        (lowtag (if function-p
-                    sb!vm:fun-pointer-lowtag
-                    sb!vm:other-pointer-lowtag))
-        (hdrs (sort (copy-list hdrs) #'<))
-        (immed (sort (copy-list immed) #'<)))
-    (append
-     (when immed
-       `((inst andi. ,temp ,reg widetag-mask)
-        ,@(if (or fixnump lowtags hdrs)
-              (let ((fall-through (gensym)))
-                `((let (,fall-through (gen-label))
-                    ,@(gen-other-immediate-test
-                       temp (if not-p not-target target)
-                       fall-through nil immed)
-                    (emit-label ,fall-through))))
-              (gen-other-immediate-test temp target not-target not-p immed))))
-     (when fixnump
-       `((inst andi. ,temp ,reg 3)
-        ,(if (or lowtags hdrs)
-             `(inst beq ,(if not-p not-target target))
-             `(inst b? ,(if not-p :ne :eq) ,target))))
-     (when (or lowtags hdrs)
-       `((inst andi. ,temp ,reg lowtag-mask)))
-     (when lowtags
-       (if hdrs
-          (let ((fall-through (gensym)))
-            `((let ((,fall-through (gen-label)))
-                ,@(gen-range-test temp (if not-p not-target target)
-                                  fall-through nil
-                                  0 1 (1- lowtag-limit) lowtags)
-                (emit-label ,fall-through))))
-          (gen-range-test temp target not-target not-p 0 1
-                          (1- lowtag-limit) lowtags)))
-     (when hdrs
-       `((inst cmpwi ,temp ,lowtag)
-        (inst bne ,(if not-p target not-target))
-        (load-type ,temp ,reg (- ,lowtag))
-        ,@(gen-other-immediate-test temp target not-target not-p hdrs))))))
-
-(defparameter immediate-types
-  (list base-char-widetag unbound-marker-widetag))
-
-(defparameter function-subtypes
-  (list funcallable-instance-header-widetag
-       simple-fun-header-widetag closure-fun-header-widetag
-       closure-header-widetag))
-
-(defmacro test-type (register temp target not-p &rest type-codes)
-  (let* ((type-codes (mapcar #'eval type-codes))
-        (lowtags (remove lowtag-limit type-codes :test #'<))
-        (extended (remove lowtag-limit type-codes :test #'>))
-        (immediates (intersection extended immediate-types :test #'eql))
-        (headers (set-difference extended immediate-types :test #'eql))
-        (function-p nil))
-    (unless type-codes
-      (error "Must supply at least on type for test-type."))
-    (when (and headers (member other-pointer-lowtag lowtags))
-      (warn "OTHER-POINTER-LOWTAG supersedes the use of ~S" headers)
-      (setf headers nil))
-    (when (and immediates
-              (or (member other-immediate-0-lowtag lowtags)
-                  (member other-immediate-1-lowtag lowtags)))
-      (warn "OTHER-IMMEDIATE-n-LOWTAG supersedes the use of ~S" immediates)
-      (setf immediates nil))
-    (when (intersection headers function-subtypes)
-      (unless (subsetp headers function-subtypes)
-       (error "Can't test for mix of function subtypes and normal ~
-               header types."))
-      (setq function-p t))
-      
-    (let ((n-reg (gensym))
-         (n-temp (gensym))
-         (n-target (gensym))
-         (not-target (gensym)))
-      `(let ((,n-reg ,register)
-            (,n-temp ,temp)
-            (,n-target ,target)
-            (,not-target (gen-label)))
-        (declare (ignorable ,n-temp))
-        ,@(if (constantp not-p)
-              (test-type-aux n-reg n-temp n-target not-target
-                             (eval not-p) lowtags immediates headers
-                             function-p)
-              `((cond (,not-p
-                       ,@(test-type-aux n-reg n-temp n-target not-target t
-                                        lowtags immediates headers
-                                        function-p))
-                      (t
-                       ,@(test-type-aux n-reg n-temp n-target not-target nil
-                                        lowtags immediates headers
-                                        function-p)))))
-        (emit-label ,not-target)))))
-
-\f
 ;;;; Error Code
-
-(defvar *adjustable-vectors* nil)
-
-(defmacro with-adjustable-vector ((var) &rest body)
-  `(let ((,var (or (pop *adjustable-vectors*)
-                  (make-array 16
-                              :element-type '(unsigned-byte 8)
-                              :fill-pointer 0
-                              :adjustable t))))
-     (declare (type (vector (unsigned-byte 8) 16) ,var))
-     (setf (fill-pointer ,var) 0)
-     (unwind-protect
-        (progn
-          ,@body)
-       (push ,var *adjustable-vectors*))))
-
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
index 9e1826d..5157c45 100644 (file)
       (inst cmpw ptr null-tn)
       (inst beq done)
 
-      (test-type ptr temp not-list t sb!vm:list-pointer-lowtag)
+      (test-type ptr not-list t (list-pointer-lowtag) :temp temp)
 
-      (loadw ptr ptr sb!vm:cons-cdr-slot sb!vm:list-pointer-lowtag)
+      (loadw ptr ptr cons-cdr-slot list-pointer-lowtag)
       (inst addi count count (fixnumize 1))
-      (test-type ptr temp loop nil sb!vm:list-pointer-lowtag)
+      (test-type ptr loop nil (list-pointer-lowtag) :temp temp)
 
       (cerror-call vop done object-not-list-error ptr)
 
index 0260508..87d5dee 100644 (file)
@@ -1,11 +1,83 @@
-(in-package "SB!VM")
+;;;; type testing and checking VOPs for the PPC VM
 
-\f
-;;;; Simple type checking and testing:
-;;;
-;;;    These types are represented by a single type code, so are easily
-;;; open-coded as a mask and compare.
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
 
+(in-package "SB!VM")
+\f
+(defun %test-fixnum (value target not-p &key temp)
+  (assemble ()
+    ;; FIXME: again, this 3 should be FIXNUM-MASK
+    (inst andi. temp value 3)
+    (inst b? (if not-p :ne :eq) target)))
+
+(defun %test-fixnum-and-headers (value target not-p headers &key temp)
+  (let ((drop-through (gen-label)))
+    (assemble ()
+      (inst andi. temp value 3)
+      (inst beq (if not-p drop-through target)))
+    (%test-headers value target not-p nil headers
+                  :drop-through drop-through :temp temp)))
+
+(defun %test-immediate (value target not-p immediate &key temp)
+  (assemble ()
+    (inst andi. temp value widetag-mask)
+    (inst cmpwi temp immediate)
+    (inst b? (if not-p :ne :eq) target)))
+
+(defun %test-lowtag (value target not-p lowtag &key temp)
+  (assemble ()
+    (inst andi. temp value lowtag-mask)
+    (inst cmpwi temp lowtag)
+    (inst b? (if not-p :ne :eq) target)))
+
+(defun %test-lowtag-and-headers (value target not-p lowtag function-p headers
+                                 &key temp)
+  (let ((drop-through (gen-label)))
+    (%test-lowtag value (if not-p drop-through target) not-p lowtag
+                  :temp temp)
+    (%test-headers value target not-p function-p headers
+                   :temp temp :drop-through drop-through)))
+
+(defun %test-headers (value target not-p function-p headers
+                     &key temp (drop-through (gen-label)))
+    (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag)))
+    (multiple-value-bind (when-true when-false)
+        (if not-p
+            (values drop-through target)
+            (values target drop-through))
+      (assemble ()
+        (%test-lowtag value when-false t lowtag :temp temp)
+        (load-type temp value (- lowtag))
+        (do ((remaining headers (cdr remaining)))
+            ((null remaining))
+          (let ((header (car remaining))
+                (last (null (cdr remaining))))
+            (cond
+              ((atom header)
+              (inst cmpwi temp header)
+               (if last
+                   (inst b? (if not-p :ne :eq) target)
+                   (inst beq when-true)))
+              (t
+               (let ((start (car header))
+                     (end (cdr header)))
+                 (unless (= start bignum-widetag)
+                   (inst cmpwi temp start)
+                   (inst blt when-false))
+                 (inst cmpwi temp end)
+                 (if last
+                     (inst b? (if not-p :gt :le) target)
+                     (inst ble when-true)))))))
+        (emit-label drop-through)))))
+
+;;; Simple type checking and testing:
 (define-vop (check-type)
   (:args (value :target result :scs (any-reg descriptor-reg)))
   (:results (result :scs (any-reg descriptor-reg)))
   (:policy :fast-safe)
   (:temporary (:scs (non-descriptor-reg)) temp))
 
-(eval-when (:compile-toplevel :load-toplevel)
-  (defun cost-to-test-types (type-codes)
-    (+ (* 2 (length type-codes))
-       (if (> (apply #'max type-codes) lowtag-limit) 7 2))))
+(defun cost-to-test-types (type-codes)
+  (+ (* 2 (length type-codes))
+     (if (> (apply #'max type-codes) lowtag-limit) 7 2)))
   
-(macrolet ((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)
+                            ;; KLUDGE: ideally, the compiler could
+                            ;; derive that it can use the sneaky trap
+                            ;; twice mechanism itself.  However, one
+                            ;; thing at a time...
+                            &key mask &allow-other-keys)
+  (let ((cost (cost-to-test-types (mapcar #'eval type-codes))))
     `(progn
        ,@(when pred-name
-          `((define-vop (,pred-name type-predicate)
+          `((define-vop (,pred-name type-predicate)
               (:translate ,pred-name)
               (:generator ,cost
-                (test-type value temp target not-p ,@type-codes)))))
+                (test-type value target not-p (,@type-codes) :temp temp)))))
        ,@(when check-name
           `((define-vop (,check-name check-type)
               (:generator ,cost
-                (let ((err-lab
-                       (generate-error-code vop ,error-code value)))
-                  (test-type value temp err-lab t ,@type-codes)
-                  (move result value))))))
+                ,@(if mask
+                      `((inst andi. temp value ,mask)
+                        (inst twi 0 value (error-number-or-lose ',error-code))
+                        (inst twi :ne temp ,@(if ;; KLUDGE: At
+                                                 ;; present, MASK is
+                                                 ;; 3 or LOWTAG-MASK
+                                                 (eql mask 3)
+                                                 ;; KLUDGE
+                                                 `(0)
+                                                 type-codes))
+                        (move result value))
+                      `((let ((err-lab
+                               (generate-error-code vop ,error-code value)))
+                          (test-type value err-lab t (,@type-codes) :temp temp)
+                          (move result value))))))))
        ,@(when ptype
-          `((primitive-type-vop ,check-name (:check) ,ptype)))))))
-
-  (def-type-vops fixnump nil nil object-not-fixnum-error
-                sb!vm:even-fixnum-lowtag sb!vm:odd-fixnum-lowtag)
-  (define-vop (check-fixnum check-type)
-      (:generator 3
-                 (inst andi. temp value 3)
-                 (inst twi 0 value (error-number-or-lose 'object-not-fixnum-error))
-                 (inst twi :ne temp 0)
-                 (move result value)))
-  (primitive-type-vop check-fixnum (:check) fixnum)
-  (def-type-vops functionp nil nil
-                object-not-fun-error sb!vm:fun-pointer-lowtag)
-  
-  (define-vop (check-fun check-type)
-      (:generator 3
-                 (inst andi. temp value 7)
-                 (inst twi 0 value (error-number-or-lose 'object-not-fun-error))
-                 (inst twi :ne temp sb!vm:fun-pointer-lowtag)
-                 (move result value)))
-  (primitive-type-vop check-fun (:check) function)
-  
-  (def-type-vops listp nil nil
-                object-not-list-error sb!vm:list-pointer-lowtag)
-  (define-vop (check-list check-type)
-      (:generator 3
-                 (inst andi. temp value 7)
-                 (inst twi 0 value (error-number-or-lose 'object-not-list-error))
-                 (inst twi :ne temp sb!vm:list-pointer-lowtag)
-                 (move result value)))
-  (primitive-type-vop check-list (:check) list)
-  
-  (def-type-vops %instancep nil nil
-                object-not-instance-error sb!vm:instance-pointer-lowtag)
-  (define-vop (check-instance check-type)
-      (:generator 3
-                 (inst andi. temp value 7)
-                 (inst twi 0 value (error-number-or-lose 'object-not-instance-error))
-                 (inst twi :ne temp sb!vm:instance-pointer-lowtag)
-                 (move result value)))
-  (primitive-type-vop check-instance (:check) instance)
-  
-  
-  (def-type-vops bignump check-bignum bignum
-                object-not-bignum-error sb!vm:bignum-widetag)
-  
-  (def-type-vops ratiop check-ratio ratio
-                object-not-ratio-error sb!vm:ratio-widetag)
-  
-  (def-type-vops complexp check-complex complex
-                object-not-complex-error sb!vm:complex-widetag
-                complex-single-float-widetag complex-double-float-widetag)
-  
-  (def-type-vops complex-rational-p check-complex-rational nil
-                object-not-complex-rational-error complex-widetag)
-  
-  (def-type-vops complex-float-p check-complex-float nil
-                object-not-complex-float-error
-                complex-single-float-widetag complex-double-float-widetag)
-  
-  (def-type-vops complex-single-float-p check-complex-single-float
-    complex-single-float object-not-complex-single-float-error
-    complex-single-float-widetag)
-  
-  (def-type-vops complex-double-float-p check-complex-double-float
-    complex-double-float object-not-complex-double-float-error
-    complex-double-float-widetag)
-  
-(def-type-vops single-float-p check-single-float single-float
-  object-not-single-float-error sb!vm:single-float-widetag)
-
-(def-type-vops double-float-p check-double-float double-float
-  object-not-double-float-error sb!vm:double-float-widetag)
-
-(def-type-vops simple-string-p check-simple-string simple-string
-  object-not-simple-string-error sb!vm:simple-string-widetag)
-
-(def-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
-  object-not-simple-bit-vector-error simple-bit-vector-widetag)
-
-(def-type-vops simple-vector-p check-simple-vector simple-vector
-  object-not-simple-vector-error sb!vm:simple-vector-widetag)
-
-(def-type-vops simple-array-unsigned-byte-2-p
-  check-simple-array-unsigned-byte-2
-  simple-array-unsigned-byte-2
-  object-not-simple-array-unsigned-byte-2-error
-  sb!vm:simple-array-unsigned-byte-2-widetag)
-
-(def-type-vops simple-array-unsigned-byte-4-p
-  check-simple-array-unsigned-byte-4
-  simple-array-unsigned-byte-4
-  object-not-simple-array-unsigned-byte-4-error
-  sb!vm:simple-array-unsigned-byte-4-widetag)
-
-(def-type-vops simple-array-unsigned-byte-8-p
-  check-simple-array-unsigned-byte-8
-  simple-array-unsigned-byte-8
-  object-not-simple-array-unsigned-byte-8-error
-  sb!vm:simple-array-unsigned-byte-8-widetag)
-
-(def-type-vops simple-array-unsigned-byte-16-p
-  check-simple-array-unsigned-byte-16
-  simple-array-unsigned-byte-16
-  object-not-simple-array-unsigned-byte-16-error
-  sb!vm:simple-array-unsigned-byte-16-widetag)
-
-(def-type-vops simple-array-unsigned-byte-32-p
-  check-simple-array-unsigned-byte-32
-  simple-array-unsigned-byte-32
-  object-not-simple-array-unsigned-byte-32-error
-  sb!vm:simple-array-unsigned-byte-32-widetag)
-
-(def-type-vops simple-array-signed-byte-8-p
-  check-simple-array-signed-byte-8
-  simple-array-signed-byte-8
-  object-not-simple-array-signed-byte-8-error
-  simple-array-signed-byte-8-widetag)
-
-(def-type-vops simple-array-signed-byte-16-p
-  check-simple-array-signed-byte-16
-  simple-array-signed-byte-16
-  object-not-simple-array-signed-byte-16-error
-  simple-array-signed-byte-16-widetag)
-
-(def-type-vops simple-array-signed-byte-30-p
-  check-simple-array-signed-byte-30
-  simple-array-signed-byte-30
-  object-not-simple-array-signed-byte-30-error
-  simple-array-signed-byte-30-widetag)
-
-(def-type-vops simple-array-signed-byte-32-p
-  check-simple-array-signed-byte-32
-  simple-array-signed-byte-32
-  object-not-simple-array-signed-byte-32-error
-  simple-array-signed-byte-32-widetag)
-
-(def-type-vops simple-array-single-float-p check-simple-array-single-float
-  simple-array-single-float object-not-simple-array-single-float-error
-  sb!vm:simple-array-single-float-widetag)
-
-(def-type-vops simple-array-double-float-p check-simple-array-double-float
-  simple-array-double-float object-not-simple-array-double-float-error
-  sb!vm:simple-array-double-float-widetag)
-
-(def-type-vops simple-array-complex-single-float-p
-  check-simple-array-complex-single-float
-  simple-array-complex-single-float
-  object-not-simple-array-complex-single-float-error
-  simple-array-complex-single-float-widetag)
-
-(def-type-vops simple-array-complex-double-float-p
-  check-simple-array-complex-double-float
-  simple-array-complex-double-float
-  object-not-simple-array-complex-double-float-error
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops base-char-p check-base-char base-char
-  object-not-base-char-error sb!vm:base-char-widetag)
-
-(def-type-vops system-area-pointer-p check-system-area-pointer
-  system-area-pointer object-not-sap-error sb!vm:sap-widetag)
-
-(def-type-vops weak-pointer-p check-weak-pointer weak-pointer
-  object-not-weak-pointer-error sb!vm:weak-pointer-widetag)
-
-(def-type-vops code-component-p nil nil nil
-  sb!vm:code-header-widetag)
-
-(def-type-vops lra-p nil nil nil
-  sb!vm:return-pc-header-widetag)
-
-(def-type-vops fdefn-p nil nil nil
-  sb!vm:fdefn-widetag)
-
-(def-type-vops funcallable-instance-p nil nil nil
-  sb!vm:funcallable-instance-header-widetag)
-
-(def-type-vops array-header-p nil nil nil
-  sb!vm:simple-array-widetag sb!vm:complex-string-widetag sb!vm:complex-bit-vector-widetag
-  sb!vm:complex-vector-widetag sb!vm:complex-array-widetag)
-
-(def-type-vops nil check-function-or-symbol nil object-not-function-or-symbol-error
-  sb!vm:fun-pointer-lowtag sb!vm:symbol-header-widetag)
-
-(def-type-vops stringp check-string nil object-not-string-error
-  sb!vm:simple-string-widetag sb!vm:complex-string-widetag)
-
-(def-type-vops complex-vector-p check-complex-vector nil
- object-not-complex-vector-error complex-vector-widetag)
-
-(def-type-vops bit-vector-p check-bit-vector nil object-not-bit-vector-error
-  sb!vm:simple-bit-vector-widetag sb!vm:complex-bit-vector-widetag)
-
-(def-type-vops vectorp check-vector nil object-not-vector-error
-  simple-string-widetag simple-bit-vector-widetag simple-vector-widetag
-  simple-array-unsigned-byte-2-widetag simple-array-unsigned-byte-4-widetag
-  simple-array-unsigned-byte-8-widetag simple-array-unsigned-byte-16-widetag
-  simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag)
-
-(def-type-vops simple-array-p check-simple-array nil object-not-simple-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag)
-
-(def-type-vops arrayp check-array nil object-not-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag
-  complex-array-widetag)
-
-(def-type-vops numberp check-number nil object-not-number-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag ratio-widetag
-  single-float-widetag double-float-widetag complex-widetag
-  complex-single-float-widetag complex-double-float-widetag)
-
-(def-type-vops rationalp check-rational nil object-not-rational-error
-  sb!vm:even-fixnum-lowtag sb!vm:odd-fixnum-lowtag sb!vm:ratio-widetag sb!vm:bignum-widetag)
-
-(def-type-vops integerp check-integer nil object-not-integer-error
-  sb!vm:even-fixnum-lowtag sb!vm:odd-fixnum-lowtag sb!vm:bignum-widetag)
-
-(def-type-vops floatp check-float nil object-not-float-error
-  sb!vm:single-float-widetag sb!vm:double-float-widetag)
-
-(def-type-vops realp check-real nil object-not-real-error
-  sb!vm:even-fixnum-lowtag sb!vm:odd-fixnum-lowtag sb!vm:ratio-widetag sb!vm:bignum-widetag
-  sb!vm:single-float-widetag sb!vm:double-float-widetag))
-
+          `((primitive-type-vop ,check-name (:check) ,ptype))))))
 \f
 ;;;; Other integer ranges.
 
              (values target not-target))
        (inst andi. temp value #x3)
        (inst beq yep)
-       (test-type value temp nope t sb!vm:other-pointer-lowtag)
-       (loadw temp value 0 sb!vm:other-pointer-lowtag)
-       (inst cmpwi temp (+ (ash 1 sb!vm:n-widetag-bits)
-                         sb!vm:bignum-widetag))
+       (test-type value nope t (other-pointer-lowtag) :temp temp)
+       (loadw temp value 0 other-pointer-lowtag)
+       (inst cmpwi temp (+ (ash 1 n-widetag-bits)
+                         bignum-widetag))
        (inst b? (if not-p :ne :eq) target)
        (emit-label not-target)))))
 
          (yep (gen-label)))
       (inst andi. temp value #x3)
       (inst beq yep)
-      (test-type value temp nope t sb!vm:other-pointer-lowtag)
-      (loadw temp value 0 sb!vm:other-pointer-lowtag)
-      (inst cmpwi temp (+ (ash 1 sb!vm:n-widetag-bits) sb!vm:bignum-widetag))
+      (test-type value nope t (other-pointer-lowtag) :temp temp)
+      (loadw temp value 0 other-pointer-lowtag)
+      (inst cmpwi temp (+ (ash 1 n-widetag-bits) bignum-widetag))
       (inst bne nope)
       (emit-label yep)
       (move result value))))
         (inst beq fixnum)
 
        ;; If not, is it an other pointer?
-       (test-type value temp nope t sb!vm:other-pointer-lowtag)
+       (test-type value nope t (other-pointer-lowtag) :temp temp)
        ;; Get the header.
-       (loadw temp value 0 sb!vm:other-pointer-lowtag)
+       (loadw temp value 0 other-pointer-lowtag)
        ;; Is it one?
-       (inst cmpwi temp (+ (ash 1 sb!vm:n-widetag-bits) sb!vm:bignum-widetag))
+       (inst cmpwi temp (+ (ash 1 n-widetag-bits) bignum-widetag))
        (inst beq single-word)
        ;; If it's other than two, we can't be an (unsigned-byte 32)
-       (inst cmpwi temp (+ (ash 2 sb!vm:n-widetag-bits) sb!vm:bignum-widetag))
+       (inst cmpwi temp (+ (ash 2 n-widetag-bits) bignum-widetag))
        (inst bne nope)
        ;; Get the second digit.
-       (loadw temp value (1+ sb!vm:bignum-digits-offset) sb!vm:other-pointer-lowtag)
+       (loadw temp value (1+ bignum-digits-offset) other-pointer-lowtag)
        ;; All zeros, its an (unsigned-byte 32).
        (inst cmpwi temp 0)
        (inst beq yep)
        
        (emit-label single-word)
        ;; Get the single digit.
-       (loadw temp value sb!vm:bignum-digits-offset sb!vm:other-pointer-lowtag)
+       (loadw temp value bignum-digits-offset other-pointer-lowtag)
        (inst cmpwi :cr1 temp 0)
 
        ;; positive implies (unsigned-byte 32).
       (inst beq fixnum)
 
       ;; If not, is it an other pointer?
-      (test-type value temp nope t sb!vm:other-pointer-lowtag)
+      (test-type value nope t (other-pointer-lowtag) :temp temp)
       ;; Get the number of digits.
-      (loadw temp value 0 sb!vm:other-pointer-lowtag)
+      (loadw temp value 0 other-pointer-lowtag)
       ;; Is it one?
-      (inst cmpwi temp (+ (ash 1 sb!vm:n-widetag-bits) sb!vm:bignum-widetag))
+      (inst cmpwi temp (+ (ash 1 n-widetag-bits) bignum-widetag))
       (inst beq single-word)
       ;; If it's other than two, we can't be an (unsigned-byte 32)
-      (inst cmpwi temp (+ (ash 2 sb!vm:n-widetag-bits) sb!vm:bignum-widetag))
+      (inst cmpwi temp (+ (ash 2 n-widetag-bits) bignum-widetag))
       (inst bne nope)
       ;; Get the second digit.
-      (loadw temp value (1+ sb!vm:bignum-digits-offset) sb!vm:other-pointer-lowtag)
+      (loadw temp value (1+ bignum-digits-offset) other-pointer-lowtag)
       ;; All zeros, its an (unsigned-byte 32).
       (inst cmpwi temp 0)
       (inst beq yep)
       
       (emit-label single-word)
       ;; Get the single digit.
-      (loadw temp value sb!vm:bignum-digits-offset sb!vm:other-pointer-lowtag)
+      (loadw temp value bignum-digits-offset other-pointer-lowtag)
       ;; positive implies (unsigned-byte 32).
       (inst cmpwi :cr1 temp 0)
       
           (is-symbol-label (if not-p drop-thru target)))
       (inst cmpw value null-tn)
       (inst beq is-symbol-label)
-      (test-type value temp target not-p sb!vm:symbol-header-widetag)
+      (test-type value target not-p (symbol-header-widetag) :temp temp)
       (emit-label drop-thru))))
 
 (define-vop (check-symbol check-type)
          (error (generate-error-code vop object-not-symbol-error value)))
       (inst cmpw value null-tn)
       (inst beq drop-thru)
-      (test-type value temp error t sb!vm:symbol-header-widetag)
+      (test-type value error t (symbol-header-widetag) :temp temp)
       (emit-label drop-thru)
       (move result value))))
   
           (is-not-cons-label (if not-p target drop-thru)))
       (inst cmpw value null-tn)
       (inst beq is-not-cons-label)
-      (test-type value temp target not-p sb!vm:list-pointer-lowtag)
+      (test-type value target not-p (list-pointer-lowtag) :temp temp)
       (emit-label drop-thru))))
 
 (define-vop (check-cons check-type)
     (let ((error (generate-error-code vop object-not-cons-error value)))
       (inst cmpw value null-tn)
       (inst beq error)
-      (test-type value temp error t sb!vm:list-pointer-lowtag)
+      (test-type value error t (list-pointer-lowtag) :temp temp)
       (move result value))))
 
index 230a13b..9e0efc2 100644 (file)
@@ -28,7 +28,7 @@
   (:temporary (:scs (descriptor-reg)) temp)
   (:generator 20
     (inst mr start csp-tn)
-    (inst addi csp-tn csp-tn (* nvals sb!vm:n-word-bytes))
+    (inst addi csp-tn csp-tn (* nvals n-word-bytes))
     (do ((val vals (tn-ref-across val))
         (i 0 (1+ i)))
        ((null val))
 
       (emit-label loop)
       (inst cmpw list null-tn)
-      (loadw temp list sb!vm:cons-car-slot sb!vm:list-pointer-lowtag)
+      (loadw temp list cons-car-slot list-pointer-lowtag)
       (inst beq done)
-      (loadw list list sb!vm:cons-cdr-slot sb!vm:list-pointer-lowtag)
-      (inst addi csp-tn csp-tn sb!vm:n-word-bytes)
+      (loadw list list cons-cdr-slot list-pointer-lowtag)
+      (inst addi csp-tn csp-tn n-word-bytes)
       (storew temp csp-tn -1)
-      (test-type list ndescr loop nil sb!vm:list-pointer-lowtag)
+      (test-type list loop nil (list-pointer-lowtag) :temp ndescr)
       (error-call vop bogus-arg-to-values-list-error list)
 
       (emit-label done)
index 17c1ddc..a7c2abd 100644 (file)
 ;;; Load-Stack-TN, Store-Stack-TN  --  Interface
 ;;;
 ;;;    Move a stack TN to a register and vice-versa.
-;;;
 (defmacro load-stack-tn (reg stack)
   `(let ((reg ,reg)
         (stack ,stack))
         ((control-stack)
          (storew reg cfp-tn offset))))))
 
-
-;;; MAYBE-LOAD-STACK-TN  --  Interface
-;;;
 (defmacro maybe-load-stack-tn (reg reg-or-stack)
   "Move the TN Reg-Or-Stack into Reg if it isn't already there."
   (once-only ((n-reg reg)
 
 \f
 ;;;; Storage allocation:
-
 (defmacro with-fixed-allocation ((result-tn temp-tn type-code size)
                                 &body body)
   "Do stuff to allocate an other-pointer object of fixed Size with a single
 
 \f
 ;;;; Error Code
-
-(defvar *adjustable-vectors* nil)
-
-(defmacro with-adjustable-vector ((var) &rest body)
-  `(let ((,var (or (pop *adjustable-vectors*)
-                  (make-array 16
-                              :element-type '(unsigned-byte 8)
-                              :fill-pointer 0
-                              :adjustable t))))
-     (declare (type (vector (unsigned-byte 8) 16) ,var))
-     (setf (fill-pointer ,var) 0)
-     (unwind-protect
-        (progn
-          ,@body)
-       (push ,var *adjustable-vectors*))))
-
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
        ;; The C code needs to process this correctly and fixup alloc-tn.
        (inst t :ne pseudo-atomic-trap)))))
 
-;;; FIXME: test typing macros. Should(?) be in type-vops.lisp, except
-;;; that they're also used in subprim.lisp
-
-(defun cost-to-test-types (type-codes)
-  (+ (* 2 (length type-codes))
-     (if (> (apply #'max type-codes) lowtag-limit) 7 2)))
-
-(defparameter *immediate-types*
-  (list base-char-widetag unbound-marker-widetag))
-
-(defparameter *fun-header-widetags*
-  (list funcallable-instance-header-widetag
-       simple-fun-header-widetag
-       closure-fun-header-widetag
-       closure-header-widetag))
-
-(defun gen-range-test (reg target not-target not-p min seperation max values)
-  (let ((tests nil)
-       (start nil)
-       (end nil)
-       (insts nil))
-    (multiple-value-bind (equal less-or-equal greater-or-equal label)
-       (if not-p
-           (values :ne :gt :lt not-target)
-           (values :eq :le :ge target))
-      (flet ((emit-test ()
-              (if (= start end)
-                  (push start tests)
-                  (push (cons start end) tests))))
-       (dolist (value values)
-         (cond ((< value min)
-                (error "~S is less than the specified minimum of ~S"
-                       value min))
-               ((> value max)
-                (error "~S is greater than the specified maximum of ~S"
-                       value max))
-               ((not (zerop (rem (- value min) seperation)))
-                (error "~S isn't an even multiple of ~S from ~S"
-                       value seperation min))
-               ((null start)
-                (setf start value))
-               ((> value (+ end seperation))
-                (emit-test)
-                (setf start value)))
-         (setf end value))
-       (emit-test))
-      (macrolet ((inst (name &rest args)
-                  `(push (list 'inst ',name ,@args) insts)))
-       (do ((remaining (nreverse tests) (cdr remaining)))
-           ((null remaining))
-         (let ((test (car remaining))
-               (last (null (cdr remaining))))
-           (if (atom test)
-               (progn
-                 (inst cmp reg test)
-                 (if last
-                     (inst b equal target)
-                     (inst b :eq label)))
-               (let ((start (car test))
-                     (end (cdr test)))
-                 (cond ((and (= start min) (= end max))
-                        (warn "The values ~S cover the entire range from ~
-                        ~S to ~S [step ~S]."
-                              values min max seperation)
-                        (push `(unless ,not-p (inst b ,target)) insts))
-                       ((= start min)
-                        (inst cmp reg end)
-                        (if last
-                            (inst b less-or-equal target)
-                            (inst b :le label)))
-                       ((= end max)
-                        (inst cmp reg start)
-                        (if last
-                            (inst b greater-or-equal target)
-                            (inst b :ge label)))
-                       (t
-                        (inst cmp reg start)
-                        (inst b :lt (if not-p target not-target))
-                        (inst cmp reg end)
-                        (if last
-                            (inst b less-or-equal target)
-                            (inst b :le label))))))))))
-    (nreverse insts)))
-
-(defun gen-other-immediate-test (reg target not-target not-p values)
-  (gen-range-test reg target not-target not-p
-                 (+ other-immediate-0-lowtag lowtag-limit)
-                 (- other-immediate-1-lowtag other-immediate-0-lowtag)
-                 (ash 1 n-widetag-bits)
-                 values))
-
-(defun test-type-aux (reg temp target not-target not-p lowtags immed hdrs
-                     function-p)
-  (let* ((fixnump (and (member even-fixnum-lowtag lowtags :test #'eql)
-                      (member odd-fixnum-lowtag lowtags :test #'eql)))
-        (lowtags (sort (if fixnump
-                           (delete even-fixnum-lowtag
-                                   (remove odd-fixnum-lowtag lowtags
-                                           :test #'eql)
-                                   :test #'eql)
-                           (copy-list lowtags))
-                       #'<))
-        (lowtag (if function-p
-                    fun-pointer-lowtag
-                    other-pointer-lowtag))
-        (hdrs (sort (copy-list hdrs) #'<))
-        (immed (sort (copy-list immed) #'<)))
-    (append
-     (when immed
-       `((inst and ,temp ,reg widetag-mask)
-        ,@(if (or fixnump lowtags hdrs)
-              (let ((fall-through (gensym)))
-                `((let (,fall-through (gen-label))
-                    ,@(gen-other-immediate-test
-                       temp (if not-p not-target target)
-                       fall-through nil immed)
-                    (emit-label ,fall-through))))
-              (gen-other-immediate-test temp target not-target not-p immed))))
-     (when fixnump
-       `((inst andcc zero-tn ,reg fixnum-tag-mask)
-        ,(if (or lowtags hdrs)
-             `(if (member :sparc-v9 *backend-subfeatures*)
-                  (inst b :eq ,(if not-p not-target target) ,(if not-p :pn :pt))
-                  (inst b :eq ,(if not-p not-target target)))
-             `(if (member :sparc-v9 *backend-subfeatures*)
-                  (inst b ,(if not-p :ne :eq) ,target ,(if not-p :pn :pt))
-                  (inst b ,(if not-p :ne :eq) ,target)))))
-     (when (or lowtags hdrs)
-       `((inst and ,temp ,reg lowtag-mask)))
-     (when lowtags
-       (if hdrs
-          (let ((fall-through (gensym)))
-            `((let ((,fall-through (gen-label)))
-                ,@(gen-range-test temp (if not-p not-target target)
-                                  fall-through nil
-                                  0 1 (1- lowtag-limit) lowtags)
-                (emit-label ,fall-through))))
-          (gen-range-test temp target not-target not-p 0 1
-                          (1- lowtag-limit) lowtags)))
-     (when hdrs
-       `((inst cmp ,temp ,lowtag)
-        (if (member :sparc-v9 *backend-subfeatures*)
-            (inst b :ne ,(if not-p target not-target) ,(if not-p :pn :pt))
-            (inst b :ne ,(if not-p target not-target)))
-        (inst nop)
-        (load-type ,temp ,reg (- ,lowtag))
-        ,@(gen-other-immediate-test temp target not-target not-p hdrs))))))
-
-(defmacro test-type (register temp target not-p &rest type-codes)
-  (let* ((type-codes (mapcar #'eval type-codes))
-        (lowtags (remove lowtag-limit type-codes :test #'<))
-        (extended (remove lowtag-limit type-codes :test #'>))
-        (immediates (intersection extended *immediate-types* :test #'eql))
-        (headers (set-difference extended *immediate-types* :test #'eql))
-        (function-p nil))
-    (unless type-codes
-      (error "Must supply at least on type for test-type."))
-    (when (and headers (member other-pointer-lowtag lowtags))
-      (warn "OTHER-POINTER-TYPE supersedes the use of ~S" headers)
-      (setf headers nil))
-    (when (and immediates
-              (or (member other-immediate-0-lowtag lowtags)
-                  (member other-immediate-1-lowtag lowtags)))
-      (warn "OTHER-IMMEDIATE-n-TYPE supersedes the use of ~S" immediates)
-      (setf immediates nil))
-    (when (intersection headers *fun-header-widetags*)
-      (unless (subsetp headers *fun-header-widetags*)
-       (error "Can't test for mix of function subtypes and normal ~
-               header types."))
-      (setq function-p t))
-    
-    (let ((n-reg (gensym))
-         (n-temp (gensym))
-         (n-target (gensym))
-         (not-target (gensym)))
-      `(let ((,n-reg ,register)
-            (,n-temp ,temp)
-            (,n-target ,target)
-            (,not-target (gen-label)))
-       (declare (ignorable ,n-temp))
-       ,@(if (constantp not-p)
-             (test-type-aux n-reg n-temp n-target not-target
-                            (eval not-p) lowtags immediates headers
-                            function-p)
-             `((cond (,not-p
-                      ,@(test-type-aux n-reg n-temp n-target not-target t
-                                       lowtags immediates headers
-                                       function-p))
-                     (t
-                      ,@(test-type-aux n-reg n-temp n-target not-target nil
-                                       lowtags immediates headers
-                                       function-p)))))
-       (inst nop)
-       (emit-label ,not-target)))))
index 4ff2127..37b2edc 100644 (file)
       (inst b :eq done)
       (inst nop)
 
-      (test-type ptr temp not-list t list-pointer-lowtag)
+      ;; FIXME: Maybe rewrite this to remove this TEST-TYPE (and the
+      ;; one below) to put it in line with all other architectures
+      ;; (apart from PPC)?
+      (test-type ptr not-list t (list-pointer-lowtag) :temp temp)
 
       (loadw ptr ptr cons-cdr-slot list-pointer-lowtag)
       (inst add count count (fixnumize 1))
-      (test-type ptr temp loop nil list-pointer-lowtag)
+      (test-type ptr loop nil (list-pointer-lowtag) :temp temp)
 
       (cerror-call vop done object-not-list-error ptr)
 
index e9de8df..3185d8e 100644 (file)
 
 (in-package "SB!VM")
 \f
+
+(defun %test-fixnum (value target not-p &key temp)
+  (declare (ignore temp))
+  (assemble ()
+    (inst andcc zero-tn value fixnum-tag-mask)
+    (if (member :sparc-v9 *backend-subfeatures*)
+       (inst b (if not-p :ne :eq) target (if not-p :pn :pt))
+       (inst b (if not-p :ne :eq) target))
+    (inst nop)))
+
+(defun %test-fixnum-and-headers (value target not-p headers
+                                &key temp)
+  (let ((drop-through (gen-label)))
+    (assemble ()
+      (inst andcc zero-tn value fixnum-tag-mask)
+      (inst b :eq (if not-p drop-through target)))
+    (%test-headers value target not-p nil headers
+                  :drop-through drop-through
+                  :temp temp)))
+
+(defun %test-immediate (value target not-p immediate &key temp)
+  (assemble ()
+    (inst and temp value widetag-mask)
+    (inst cmp temp immediate)
+    ;; FIXME: include SPARC-V9 magic
+    (inst b (if not-p :ne :eq) target)
+    (inst nop)))
+
+(defun %test-lowtag (value target not-p lowtag
+                    &key temp skip-nop)
+  (assemble ()
+    (inst and temp value lowtag-mask)
+    (inst cmp temp lowtag)
+    ;; FIXME: include SPARC-V9 magic
+    (inst b (if not-p :ne :eq) target)
+    (unless skip-nop
+      (inst nop))))
+
+(defun %test-lowtag-and-headers (value target not-p lowtag function-p headers
+                                &key temp)
+  (let ((drop-through (gen-label)))
+    (%test-lowtag value (if not-p drop-through target) not-p lowtag
+                 :temp temp :skip-nop t)
+    (%test-headers value target not-p function-p headers
+                  :temp temp :drop-through drop-through)))
+
+(defun %test-headers (value target not-p function-p headers
+                     &key temp (drop-through (gen-label)))
+  (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag)))
+    (multiple-value-bind (when-true when-false)
+       (if not-p
+           (values drop-through target)
+           (values target drop-through))
+      (assemble ()
+       (%test-lowtag value when-false t lowtag :temp temp)
+       (load-type temp value (- lowtag))
+       (do ((remaining headers (cdr remaining)))
+           ((null remaining))
+         (let ((header (car remaining))
+               (last (null (cdr remaining))))
+           (cond
+             ((atom header)
+              (inst cmp temp header)
+              (if last
+                  ;; FIXME: Some SPARC-V9 magic might not go amiss
+                  ;; here, too, if I can figure out what it should
+                  ;; be.
+                  (inst b (if not-p :ne :eq) target)
+                  (inst b :eq when-true)))
+             (t
+              (let ((start (car header))
+                    (end (cdr header)))
+                ;; FIXME: BIGNUM-WIDETAG here actually means (MIN
+                ;; <widetags>).
+                (unless (= start bignum-widetag)
+                  (inst cmp temp start)
+                  (inst b :lt when-false))
+                ;; FIXME: conceivably, it might be worth having a
+                ;; (MAX <widetags>) here too.
+                (inst cmp temp end)
+                (if last
+                    (inst b (if not-p :gt :le) target)
+                    (inst b :le when-true)))))))
+       (inst nop)
+       (emit-label drop-through)))))
+
 ;;;; Simple type checking and testing:
 ;;;
 ;;; These types are represented by a single type code, so are easily
   (:policy :fast-safe)
   (:temporary (:scs (non-descriptor-reg)) temp))
 
-;;; moved to macros. FIXME.
-;;;(defun cost-to-test-types (type-codes)
-;;;  (+ (* 2 (length type-codes))
-;;;     (if (> (apply #'max type-codes) lowtag-limit) 7 2)))
-;;;
-;;;(defparameter immediate-types
-;;;  (list base-char-type unbound-marker-type))
-;;;
-;;;(defparameter function-header-types
-;;;  (list funcallable-instance-header-type
-;;;        byte-code-function-type byte-code-closure-type
-;;;        function-header-type closure-function-header-type
-;;;        closure-header-type))
-;;;
-;; FIXME: there's a canonicalize-headers in alpha/ and x86/
+(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)
-  ;;; FIXME: #+sb-xc-host?
+(defmacro !define-type-vops (pred-name check-name ptype error-code
+                        (&rest type-codes)
+                        &key &allow-other-keys)
   (let ((cost (cost-to-test-types (mapcar #'eval type-codes))))
     `(progn
       ,@(when pred-name
           `((define-vop (,pred-name type-predicate)
               (:translate ,pred-name)
               (:generator ,cost
-                (test-type value temp target not-p ,@type-codes)))))
-       ,@(when check-name
+                (test-type value target not-p (,@type-codes)
+                           :temp temp)))))
+      ,@(when check-name
           `((define-vop (,check-name check-type)
               (:generator ,cost
                 (let ((err-lab
                        (generate-error-code vop ,error-code value)))
-                  (test-type value temp err-lab t ,@type-codes)
+                  (test-type value err-lab t (,@type-codes)
+                             :temp temp)
                   (move result value))))))
        ,@(when ptype
           `((primitive-type-vop ,check-name (:check) ,ptype))))))
 
-;;; This is a direct translation of the code in CMUCL
-;;; compiler/sparc/macros.lisp. Don't blame me if it doesn't work.
-
-;;; moved test-type back to macros.lisp, as other bits of code use it
-;;; too. FIXME.
-
-
-
-
-  
-;; Don't use this because it uses the deprecated taddcctv instruction.
-#+ignore
-(progn
-  (def-type-vops fixnump nil nil nil even-fixnum-lowtag odd-fixnum-lowtag)
-  (define-vop (check-fixnum check-type)
-      (:ignore temp)
-    (:generator 1
-               (inst taddcctv result value zero-tn)))
-  (primitive-type-vop check-fixnum (:check) fixnum))
-  
-;; This avoids the taddcctv instruction
-(def-type-vops fixnump check-fixnum fixnum object-not-fixnum-error
-              even-fixnum-lowtag odd-fixnum-lowtag)
-(def-type-vops functionp check-fun function
-              object-not-fun-error fun-pointer-lowtag)
-  
-  ;; The following encode the error type and register in the trap
-  ;; instruction, however this breaks on the later sparc Ultra.
-  #+ignore
-  (progn
-    (def-type-vops listp nil nil nil list-pointer-lowtag)
-    (define-vop (check-list check-type)
-       (:generator 3
-                   (inst and temp value lowtag-mask)
-                   (inst cmp temp list-pointer-lowtag)
-                   (inst t :ne (logior (ash (tn-offset value) 8) object-not-list-trap))
-                   (move result value)))
-    (primitive-type-vop check-list (:check) list)
-    
-    (def-type-vops %instancep nil nil nil instance-pointer-lowtag)
-    (define-vop (check-instance check-type)
-       (:generator 3
-                   (inst and temp value lowtag-mask)
-                   (inst cmp temp instance-pointer-lowtag)
-                   (inst t :ne (logior (ash (tn-offset value) 8) object-not-instance-trap))
-                   (move result value)))
-    (primitive-type-vop check-instance (:check) instance))
-
-  ;; These avoid the trap instruction.
-  (def-type-vops listp check-list list object-not-list-error
-  list-pointer-lowtag)
-  (def-type-vops %instancep check-instance instance object-not-instance-error
-  instance-pointer-lowtag)
-      
-  (def-type-vops bignump check-bignum bignum
-  object-not-bignum-error bignum-widetag)
-      
-  (def-type-vops ratiop check-ratio ratio
-  object-not-ratio-error ratio-widetag)
-      
-  (def-type-vops complexp check-complex complex object-not-complex-error
-  complex-widetag complex-single-float-widetag
-  complex-double-float-widetag #!+long-float complex-long-float-widetag)
-
-  (def-type-vops complex-rational-p check-complex-rational nil
-  object-not-complex-rational-error complex-widetag)
-
-  (def-type-vops complex-float-p check-complex-float nil
-  object-not-complex-float-error
-  complex-single-float-widetag complex-double-float-widetag
-  #!+long-float complex-long-float-widetag)
-
-  (def-type-vops complex-single-float-p check-complex-single-float
-  complex-single-float object-not-complex-single-float-error
-  complex-single-float-widetag)
-
-  (def-type-vops complex-double-float-p check-complex-double-float
-  complex-double-float object-not-complex-double-float-error
-  complex-double-float-widetag)
-
-  #!+long-float
-  (def-type-vops complex-long-float-p check-complex-long-float
-  complex-long-float object-not-complex-long-float-error
-  complex-long-float-widetag)
-
-  (def-type-vops single-float-p check-single-float single-float
-  object-not-single-float-error single-float-widetag)
-
-  (def-type-vops double-float-p check-double-float double-float
-  object-not-double-float-error double-float-widetag)
-
-  #!+long-float
-  (def-type-vops long-float-p check-long-float long-float
-  object-not-long-float-error long-float-widetag)
-
-  (def-type-vops simple-string-p check-simple-string simple-string
-  object-not-simple-string-error simple-string-widetag)
-
-  (def-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
-  object-not-simple-bit-vector-error simple-bit-vector-widetag)
-      
-  (def-type-vops simple-vector-p check-simple-vector simple-vector
-  object-not-simple-vector-error simple-vector-widetag)
-      
-  (def-type-vops simple-array-unsigned-byte-2-p
-  check-simple-array-unsigned-byte-2
-  simple-array-unsigned-byte-2
-  object-not-simple-array-unsigned-byte-2-error
-  simple-array-unsigned-byte-2-widetag)
-      
-  (def-type-vops simple-array-unsigned-byte-4-p
-  check-simple-array-unsigned-byte-4
-  simple-array-unsigned-byte-4
-  object-not-simple-array-unsigned-byte-4-error
-  simple-array-unsigned-byte-4-widetag)
-
-  (def-type-vops simple-array-unsigned-byte-8-p
-  check-simple-array-unsigned-byte-8
-  simple-array-unsigned-byte-8
-  object-not-simple-array-unsigned-byte-8-error
-  simple-array-unsigned-byte-8-widetag)
-
-  (def-type-vops simple-array-unsigned-byte-16-p
-  check-simple-array-unsigned-byte-16
-  simple-array-unsigned-byte-16
-  object-not-simple-array-unsigned-byte-16-error
-  simple-array-unsigned-byte-16-widetag)
-
-  (def-type-vops simple-array-unsigned-byte-32-p
-  check-simple-array-unsigned-byte-32
-  simple-array-unsigned-byte-32
-  object-not-simple-array-unsigned-byte-32-error
-  simple-array-unsigned-byte-32-widetag)
-
-  (def-type-vops simple-array-signed-byte-8-p
-  check-simple-array-signed-byte-8
-  simple-array-signed-byte-8
-  object-not-simple-array-signed-byte-8-error
-  simple-array-signed-byte-8-widetag)
-
-  (def-type-vops simple-array-signed-byte-16-p
-  check-simple-array-signed-byte-16
-  simple-array-signed-byte-16
-  object-not-simple-array-signed-byte-16-error
-  simple-array-signed-byte-16-widetag)
-
-  (def-type-vops simple-array-signed-byte-30-p
-  check-simple-array-signed-byte-30
-  simple-array-signed-byte-30
-  object-not-simple-array-signed-byte-30-error
-  simple-array-signed-byte-30-widetag)
-
-  (def-type-vops simple-array-signed-byte-32-p
-  check-simple-array-signed-byte-32
-  simple-array-signed-byte-32
-  object-not-simple-array-signed-byte-32-error
-  simple-array-signed-byte-32-widetag)
-      
-  (def-type-vops simple-array-single-float-p check-simple-array-single-float
-  simple-array-single-float object-not-simple-array-single-float-error
-  simple-array-single-float-widetag)
-
-  (def-type-vops simple-array-double-float-p check-simple-array-double-float
-  simple-array-double-float object-not-simple-array-double-float-error
-  simple-array-double-float-widetag)
-
-  #!+long-float
-  (def-type-vops simple-array-long-float-p check-simple-array-long-float
-  simple-array-long-float object-not-simple-array-long-float-error
-  simple-array-long-float-widetag)
-      
-  (def-type-vops simple-array-complex-single-float-p
-  check-simple-array-complex-single-float
-  simple-array-complex-single-float
-  object-not-simple-array-complex-single-float-error
-  simple-array-complex-single-float-widetag)
-      
-  (def-type-vops simple-array-complex-double-float-p
-  check-simple-array-complex-double-float
-  simple-array-complex-double-float
-  object-not-simple-array-complex-double-float-error
-  simple-array-complex-double-float-widetag)
-      
-  #!+long-float
-  (def-type-vops simple-array-complex-long-float-p
-  check-simple-array-complex-long-float
-  simple-array-complex-long-float
-  object-not-simple-array-complex-long-float-error
-  simple-array-complex-long-float-widetag)
-
-  (def-type-vops base-char-p check-base-char base-char
-  object-not-base-char-error base-char-widetag)
-      
-  (def-type-vops system-area-pointer-p check-system-area-pointer
-  system-area-pointer object-not-sap-error sap-widetag)
-      
-  (def-type-vops weak-pointer-p check-weak-pointer weak-pointer
-  object-not-weak-pointer-error weak-pointer-widetag)
-  ;; FIXME
-#|       
-  (def-type-vops scavenger-hook-p nil nil nil
-  0)
-|#
-  (def-type-vops code-component-p nil nil nil
-  code-header-widetag)
-      
-  (def-type-vops lra-p nil nil nil
-  return-pc-header-widetag)
-
-  (def-type-vops fdefn-p nil nil nil
-  fdefn-widetag)
-
-  (def-type-vops funcallable-instance-p nil nil nil
-  funcallable-instance-header-widetag)
-      
-  (def-type-vops array-header-p nil nil nil
-  simple-array-widetag complex-string-widetag complex-bit-vector-widetag
-  complex-vector-widetag complex-array-widetag)
-
-  ;; This appears to have disappeared. FIXME -- CSR
-  (def-type-vops nil check-fun-or-symbol nil object-not-fun-or-symbol-error
-  fun-pointer-lowtag symbol-header-widetag)
-      
-  (def-type-vops stringp check-string nil object-not-string-error
-  simple-string-widetag complex-string-widetag)
-      
-  (def-type-vops bit-vector-p check-bit-vector nil object-not-bit-vector-error
-  simple-bit-vector-widetag complex-bit-vector-widetag)
-
-  (def-type-vops vectorp check-vector nil object-not-vector-error
-  simple-string-widetag simple-bit-vector-widetag simple-vector-widetag
-  simple-array-unsigned-byte-2-widetag simple-array-unsigned-byte-4-widetag
-  simple-array-unsigned-byte-8-widetag simple-array-unsigned-byte-16-widetag
-  simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  #!+long-float simple-array-long-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  #!+long-float simple-array-complex-long-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag)
-
-(def-type-vops complex-vector-p check-complex-vector nil object-not-complex-vector-error
-  complex-vector-widetag)
-
-  (def-type-vops simple-array-p check-simple-array nil object-not-simple-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  #!+long-float simple-array-long-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  #!+long-float simple-array-complex-long-float-widetag)
-      
-  (def-type-vops arrayp check-array nil object-not-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  #!+long-float simple-array-long-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  #!+long-float simple-array-complex-long-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag
-  complex-array-widetag)
-      
-  (def-type-vops numberp check-number nil object-not-number-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag ratio-widetag
-  single-float-widetag double-float-widetag #!+long-float long-float-widetag
-  complex-widetag complex-single-float-widetag complex-double-float-widetag
-  #!+long-float complex-long-float-widetag)
-      
-  (def-type-vops rationalp check-rational nil object-not-rational-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag)
-      
-  (def-type-vops integerp check-integer nil object-not-integer-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag)
-      
-  (def-type-vops floatp check-float nil object-not-float-error
-  single-float-widetag double-float-widetag #!+long-float long-float-widetag)
-      
-  (def-type-vops realp check-real nil object-not-real-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag
-  single-float-widetag double-float-widetag #!+long-float long-float-widetag)
-
-  \f
+\f
 ;;;; Other integer ranges.
 
   ;; A (signed-byte 32) can be represented with either fixnum or a
   ;; bignum with exactly one digit.
 
-  (define-vop (signed-byte-32-p type-predicate)
+(define-vop (signed-byte-32-p type-predicate)
   (:translate signed-byte-32-p)
   (:generator 45
              (let ((not-target (gen-label)))
                        (values target not-target))
                  (inst andcc zero-tn value #x3)
                  (inst b :eq yep)
-                 (test-type value temp nope t other-pointer-lowtag)
+                 (test-type value nope t (other-pointer-lowtag) :temp temp)
                  (loadw temp value 0 other-pointer-lowtag)
                  (inst cmp temp (+ (ash 1 n-widetag-bits)
                                    bignum-widetag))
                  (inst nop)
                  (emit-label not-target)))))
 
-  (define-vop (check-signed-byte-32 check-type)
+(define-vop (check-signed-byte-32 check-type)
   (:generator 45
              (let ((nope (generate-error-code vop object-not-signed-byte-32-error value))
                    (yep (gen-label)))
                (inst andcc temp value #x3)
                (inst b :eq yep)
-               (test-type value temp nope t other-pointer-lowtag)
+               (test-type value nope t (other-pointer-lowtag) :temp temp)
                (loadw temp value 0 other-pointer-lowtag)
                (inst cmp temp (+ (ash 1 n-widetag-bits) bignum-widetag))
                (inst b :ne nope)
   ;; a bignum with exactly two digits and the second digit all
   ;; zeros.
 
-  (define-vop (unsigned-byte-32-p type-predicate)
+(define-vop (unsigned-byte-32-p type-predicate)
   (:translate unsigned-byte-32-p)
   (:generator 45
              (let ((not-target (gen-label))
                  (inst cmp value)
 
                  ;; If not, is it an other pointer?
-                 (test-type value temp nope t other-pointer-lowtag)
+                 (test-type value nope t (other-pointer-lowtag) :temp temp)
                  ;; Get the header.
                  (loadw temp value 0 other-pointer-lowtag)
                  ;; Is it one?
                        
                  (emit-label not-target)))))     
 
-  (define-vop (check-unsigned-byte-32 check-type)
+(define-vop (check-unsigned-byte-32 check-type)
   (:generator 45
              (let ((nope
                     (generate-error-code vop object-not-unsigned-byte-32-error value))
                (inst cmp value)
                        
                ;; If not, is it an other pointer?
-               (test-type value temp nope t other-pointer-lowtag)
+               (test-type value nope t (other-pointer-lowtag) :temp temp)
                ;; Get the number of digits.
                (loadw temp value 0 other-pointer-lowtag)
                ;; Is it one?
   ;; symbolp (or symbol (eq nil))
   ;; consp (and list (not (eq nil)))
       
-  (define-vop (symbolp type-predicate)
+(define-vop (symbolp type-predicate)
   (:translate symbolp)
   (:generator 12
              (let* ((drop-thru (gen-label))
                     (is-symbol-label (if not-p drop-thru target)))
                (inst cmp value null-tn)
                (inst b :eq is-symbol-label)
-               (test-type value temp target not-p symbol-header-widetag)
+               (test-type value target not-p (symbol-header-widetag) :temp temp)
                (emit-label drop-thru))))
       
-  (define-vop (check-symbol check-type)
+(define-vop (check-symbol check-type)
   (:generator 12
              (let ((drop-thru (gen-label))
                    (error (generate-error-code vop object-not-symbol-error value)))
                (inst cmp value null-tn)
                (inst b :eq drop-thru)
-               (test-type value temp error t symbol-header-widetag)
+               (test-type value error t (symbol-header-widetag) :temp temp)
                (emit-label drop-thru)
                (move result value))))
       
-  (define-vop (consp type-predicate)
+(define-vop (consp type-predicate)
   (:translate consp)
   (:generator 8
              (let* ((drop-thru (gen-label))
                     (is-not-cons-label (if not-p target drop-thru)))
                (inst cmp value null-tn)
                (inst b :eq is-not-cons-label)
-               (test-type value temp target not-p list-pointer-lowtag)
+               (test-type value target not-p (list-pointer-lowtag) :temp temp)
                (emit-label drop-thru))))
       
-  (define-vop (check-cons check-type)
+(define-vop (check-cons check-type)
   (:generator 8
              (let ((error (generate-error-code vop object-not-cons-error value)))
                (inst cmp value null-tn)
                (inst b :eq error)
-               (test-type value temp error t list-pointer-lowtag)
+               (test-type value error t (list-pointer-lowtag) :temp temp)
                (move result value))))
index 1a83482..b9db246 100644 (file)
@@ -74,7 +74,7 @@
       (loadw list list cons-cdr-slot list-pointer-lowtag)
       (inst add csp-tn csp-tn n-word-bytes)
       (storew temp csp-tn -1)
-      (test-type list ndescr loop nil list-pointer-lowtag)
+      (test-type list loop nil (list-pointer-lowtag) :temp ndescr)
       (error-call vop bogus-arg-to-values-list-error list)
 
       (emit-label done)
index ca4519c..af03663 100644 (file)
     ,@forms))
 \f
 ;;;; error code
-
-(defvar *adjustable-vectors* nil)
-
-(defmacro with-adjustable-vector ((var) &rest body)
-  `(let ((,var (or (pop *adjustable-vectors*)
-                  (make-array 16
-                              :element-type '(unsigned-byte 8)
-                              :fill-pointer 0
-                              :adjustable t))))
-     (declare (type (vector (unsigned-byte 8) 16) ,var))
-     (setf (fill-pointer ,var) 0)
-     (unwind-protect
-        (progn
-          ,@body)
-       (push ,var *adjustable-vectors*))))
-
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
index 62f09a3..43617fd 100644 (file)
 \f
 ;;;; test generation utilities
 
-(eval-when (:compile-toplevel :execute)
-
-(defparameter *immediate-types*
-  (list unbound-marker-widetag base-char-widetag))
-
-(defparameter *fun-header-widetags*
-  (list funcallable-instance-header-widetag
-       simple-fun-header-widetag
-       closure-fun-header-widetag
-       closure-header-widetag))
-
-(defun canonicalize-headers (headers)
-  (collect ((results))
-    (let ((start nil)
-         (prev nil)
-         (delta (- other-immediate-1-lowtag other-immediate-0-lowtag)))
-      (flet ((emit-test ()
-              (results (if (= start prev)
-                           start
-                           (cons start prev)))))
-       (dolist (header (sort headers #'<))
-         (cond ((null start)
-                (setf start header)
-                (setf prev header))
-               ((= header (+ prev delta))
-                (setf prev header))
-               (t
-                (emit-test)
-                (setf start header)
-                (setf prev header))))
-       (emit-test)))
-    (results)))
-
-) ; EVAL-WHEN
-
-(macrolet ((test-type (value target not-p &rest type-codes)
-  ;; Determine what interesting combinations we need to test for.
-  (let* ((type-codes (mapcar #'eval type-codes))
-        (fixnump (and (member even-fixnum-lowtag type-codes)
-                      (member odd-fixnum-lowtag type-codes)
-                      t))
-        (lowtags (remove lowtag-limit type-codes :test #'<))
-        (extended (remove lowtag-limit type-codes :test #'>))
-        (immediates (intersection extended *immediate-types* :test #'eql))
-        (headers (set-difference extended *immediate-types* :test #'eql))
-        (function-p (if (intersection headers *fun-header-widetags*)
-                        (if (subsetp headers *fun-header-widetags*)
-                            t
-                            (error "can't test for mix of function subtypes ~
-                                    and normal header types"))
-                        nil)))
-    (unless type-codes
-      (error "At least one type must be supplied for TEST-TYPE."))
-    (cond
-     (fixnump
-      (when (remove-if (lambda (x)
-                        (or (= x even-fixnum-lowtag)
-                            (= x odd-fixnum-lowtag)))
-                      lowtags)
-       (error "can't mix fixnum testing with other lowtags"))
-      (when function-p
-       (error "can't mix fixnum testing with function subtype testing"))
-      (when immediates
-       (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)))
-     (immediates
-      (when headers
-       (error "can't mix testing of immediates with testing of headers"))
-      (when lowtags
-       (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)))
-     (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))))
-     (headers
-      `(%test-headers ,value ,target ,not-p ,function-p
-                     ',(canonicalize-headers headers)))
-     (t
-      (error "nothing to test?"))))))
-
 ;;; Emit the most compact form of the test immediate instruction,
 ;;; using an 8 bit test when the immediate is only 8 bits and the
 ;;; value is one of the four low registers (eax, ebx, ecx, edx) or the
                   (inst jmp :be when-true))))))) ; was :le
       (emit-label drop-through))))
 
-;; pw -- based on RISC version. Not sure extra hair is needed yet.
-;; difference is that this one uses SUB which overwrites operand
-;; both cmp and sub take 2 cycles so maybe its a wash
-#+nil
-(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)))
-    (multiple-value-bind (equal less-or-equal when-true when-false)
-       ;; EQUAL and LESS-OR-EQUAL are the conditions for branching to TARGET.
-       ;; 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 :ne :a drop-through target)
-           (values :e :na target drop-through))
-      (%test-lowtag value when-false t lowtag al-loaded)
-      (inst mov al-tn (make-ea :byte :base value :disp (- lowtag)))
-      (let ((delta 0))
-       (do ((remaining headers (cdr remaining)))
-           ((null remaining))
-         (let ((header (car remaining))
-               (last (null (cdr remaining))))
-           (cond
-             ((atom header)
-              (inst sub al-tn (- header delta))
-              (setf delta header)
-              (if last
-                  (inst jmp equal target)
-                  (inst jmp :e when-true)))
-             (t
-              (let ((start (car header))
-                    (end (cdr header)))
-                (unless (= start bignum-widetag)
-                  (inst sub al-tn (- start delta))
-                  (setf delta start)
-                  (inst jmp :l when-false))
-                (inst sub al-tn (- end delta))
-                (setf delta end)
-                (if last
-                    (inst jmp less-or-equal target)
-                    (inst jmp :le when-true))))))))
-      (emit-label drop-through))))
 \f
 ;;;; type checking and testing
 
   (:info target not-p)
   (:policy :fast-safe))
 
-(eval-when (:compile-toplevel :execute)
-
 (defun cost-to-test-types (type-codes)
   (+ (* 2 (length type-codes))
      (if (> (apply #'max type-codes) lowtag-limit) 7 2)))
 
-); EVAL-WHEN
-
-;;; 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.
-
-(defmacro def-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 type-predicate)
-              (:translate ,pred-name)
-              (:generator ,cost
-                (test-type value target not-p ,@type-codes)))))
-       ,@(when check-name
-          `((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)
-                  (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))))
+(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 simple-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 simple-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)
+                  (test-type value err-lab t (,@type-codes))
                   (move result value))))))
        ,@(when ptype
           `((primitive-type-vop ,check-name (:check) ,ptype))))))
-
-(def-simple-type-vops fixnump check-fixnum fixnum object-not-fixnum-error
-  even-fixnum-lowtag odd-fixnum-lowtag)
-
-(def-type-vops functionp check-fun function
-  object-not-fun-error fun-pointer-lowtag)
-
-(def-type-vops listp check-list list object-not-list-error
-  list-pointer-lowtag)
-
-(def-type-vops %instancep check-instance instance object-not-instance-error
-  instance-pointer-lowtag)
-
-(def-type-vops bignump check-bignum bignum
-  object-not-bignum-error bignum-widetag)
-
-(def-type-vops ratiop check-ratio ratio
-  object-not-ratio-error ratio-widetag)
-
-(def-type-vops complexp check-complex complex object-not-complex-error
-  complex-widetag complex-single-float-widetag complex-double-float-widetag
-  #!+long-float complex-long-float-widetag)
-
-(def-type-vops complex-rational-p check-complex-rational nil
-  object-not-complex-rational-error complex-widetag)
-
-(def-type-vops complex-float-p check-complex-float nil
-  object-not-complex-float-error
-  complex-single-float-widetag complex-double-float-widetag
-  #!+long-float complex-long-float-widetag)
-
-(def-type-vops complex-single-float-p check-complex-single-float
-  complex-single-float object-not-complex-single-float-error
-  complex-single-float-widetag)
-
-(def-type-vops complex-double-float-p check-complex-double-float
-  complex-double-float object-not-complex-double-float-error
-  complex-double-float-widetag)
-
-#!+long-float
-(def-type-vops complex-long-float-p check-complex-long-float
-  complex-long-float object-not-complex-long-float-error
-  complex-long-float-widetag)
-
-(def-type-vops single-float-p check-single-float single-float
-  object-not-single-float-error single-float-widetag)
-
-(def-type-vops double-float-p check-double-float double-float
-  object-not-double-float-error double-float-widetag)
-
-#!+long-float
-(def-type-vops long-float-p check-long-float long-float
-  object-not-long-float-error long-float-widetag)
-
-(def-type-vops simple-string-p check-simple-string simple-string
-  object-not-simple-string-error simple-string-widetag)
-
-(def-type-vops simple-bit-vector-p check-simple-bit-vector simple-bit-vector
-  object-not-simple-bit-vector-error simple-bit-vector-widetag)
-
-(def-type-vops simple-vector-p check-simple-vector simple-vector
-  object-not-simple-vector-error simple-vector-widetag)
-
-(def-type-vops simple-array-unsigned-byte-2-p
-  check-simple-array-unsigned-byte-2
-  simple-array-unsigned-byte-2
-  object-not-simple-array-unsigned-byte-2-error
-  simple-array-unsigned-byte-2-widetag)
-
-(def-type-vops simple-array-unsigned-byte-4-p
-  check-simple-array-unsigned-byte-4
-  simple-array-unsigned-byte-4
-  object-not-simple-array-unsigned-byte-4-error
-  simple-array-unsigned-byte-4-widetag)
-
-(def-type-vops simple-array-unsigned-byte-8-p
-  check-simple-array-unsigned-byte-8
-  simple-array-unsigned-byte-8
-  object-not-simple-array-unsigned-byte-8-error
-  simple-array-unsigned-byte-8-widetag)
-
-(def-type-vops simple-array-unsigned-byte-16-p
-  check-simple-array-unsigned-byte-16
-  simple-array-unsigned-byte-16
-  object-not-simple-array-unsigned-byte-16-error
-  simple-array-unsigned-byte-16-widetag)
-
-(def-type-vops simple-array-unsigned-byte-32-p
-  check-simple-array-unsigned-byte-32
-  simple-array-unsigned-byte-32
-  object-not-simple-array-unsigned-byte-32-error
-  simple-array-unsigned-byte-32-widetag)
-
-(def-type-vops simple-array-signed-byte-8-p
-  check-simple-array-signed-byte-8
-  simple-array-signed-byte-8
-  object-not-simple-array-signed-byte-8-error
-  simple-array-signed-byte-8-widetag)
-
-(def-type-vops simple-array-signed-byte-16-p
-  check-simple-array-signed-byte-16
-  simple-array-signed-byte-16
-  object-not-simple-array-signed-byte-16-error
-  simple-array-signed-byte-16-widetag)
-
-(def-type-vops simple-array-signed-byte-30-p
-  check-simple-array-signed-byte-30
-  simple-array-signed-byte-30
-  object-not-simple-array-signed-byte-30-error
-  simple-array-signed-byte-30-widetag)
-
-(def-type-vops simple-array-signed-byte-32-p
-  check-simple-array-signed-byte-32
-  simple-array-signed-byte-32
-  object-not-simple-array-signed-byte-32-error
-  simple-array-signed-byte-32-widetag)
-
-(def-type-vops simple-array-single-float-p check-simple-array-single-float
-  simple-array-single-float object-not-simple-array-single-float-error
-  simple-array-single-float-widetag)
-
-(def-type-vops simple-array-double-float-p check-simple-array-double-float
-  simple-array-double-float object-not-simple-array-double-float-error
-  simple-array-double-float-widetag)
-
-#!+long-float
-(def-type-vops simple-array-long-float-p check-simple-array-long-float
-  simple-array-long-float object-not-simple-array-long-float-error
-  simple-array-long-float-widetag)
-
-(def-type-vops simple-array-complex-single-float-p
-  check-simple-array-complex-single-float
-  simple-array-complex-single-float
-  object-not-simple-array-complex-single-float-error
-  simple-array-complex-single-float-widetag)
-
-(def-type-vops simple-array-complex-double-float-p
-  check-simple-array-complex-double-float
-  simple-array-complex-double-float
-  object-not-simple-array-complex-double-float-error
-  simple-array-complex-double-float-widetag)
-
-#!+long-float
-(def-type-vops simple-array-complex-long-float-p
-  check-simple-array-complex-long-float
-  simple-array-complex-long-float
-  object-not-simple-array-complex-long-float-error
-  simple-array-complex-long-float-widetag)
-
-(def-type-vops base-char-p check-base-char base-char
-  object-not-base-char-error base-char-widetag)
-
-(def-type-vops system-area-pointer-p check-system-area-pointer
-  system-area-pointer object-not-sap-error sap-widetag)
-
-(def-type-vops weak-pointer-p check-weak-pointer weak-pointer
-  object-not-weak-pointer-error weak-pointer-widetag)
-
-(def-type-vops code-component-p nil nil nil
-  code-header-widetag)
-
-(def-type-vops lra-p nil nil nil
-  return-pc-header-widetag)
-
-(def-type-vops fdefn-p nil nil nil
-  fdefn-widetag)
-
-(def-type-vops funcallable-instance-p nil nil nil
-  funcallable-instance-header-widetag)
-
-(def-type-vops array-header-p nil nil nil
-  simple-array-widetag complex-string-widetag complex-bit-vector-widetag
-  complex-vector-widetag complex-array-widetag)
-
-(def-type-vops stringp check-string nil object-not-string-error
-  simple-string-widetag complex-string-widetag)
-
-(def-type-vops bit-vector-p check-bit-vector nil object-not-bit-vector-error
-  simple-bit-vector-widetag complex-bit-vector-widetag)
-
-(def-type-vops vectorp check-vector nil object-not-vector-error
-  simple-string-widetag simple-bit-vector-widetag simple-vector-widetag
-  simple-array-unsigned-byte-2-widetag simple-array-unsigned-byte-4-widetag
-  simple-array-unsigned-byte-8-widetag simple-array-unsigned-byte-16-widetag
-  simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  #!+long-float simple-array-long-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  #!+long-float simple-array-complex-long-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag)
-
-;;; Note that this "type VOP" is sort of an oddball; it doesn't so
-;;; much test for a Lisp-level type as just expose a low-level type
-;;; code at the Lisp level. It is used as a building block to help us
-;;; to express things like the test for (TYPEP FOO '(VECTOR T))
-;;; efficiently in Lisp code, but it doesn't correspond to any type
-;;; expression which would actually occur in reasonable application
-;;; code. (Common Lisp doesn't have any natural way of expressing this
-;;; type.) Thus, there's no point in building up the full machinery of
-;;; associated backend type predicates and so forth as we do for
-;;; ordinary type VOPs.
-(def-type-vops complex-vector-p check-complex-vector nil object-not-complex-vector-error
-  complex-vector-widetag)
-
-(def-type-vops simple-array-p check-simple-array nil object-not-simple-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  #!+long-float simple-array-long-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  #!+long-float simple-array-complex-long-float-widetag)
-
-(def-type-vops arrayp check-array nil object-not-array-error
-  simple-array-widetag simple-string-widetag simple-bit-vector-widetag
-  simple-vector-widetag simple-array-unsigned-byte-2-widetag
-  simple-array-unsigned-byte-4-widetag simple-array-unsigned-byte-8-widetag
-  simple-array-unsigned-byte-16-widetag simple-array-unsigned-byte-32-widetag
-  simple-array-signed-byte-8-widetag simple-array-signed-byte-16-widetag
-  simple-array-signed-byte-30-widetag simple-array-signed-byte-32-widetag
-  simple-array-single-float-widetag simple-array-double-float-widetag
-  #!+long-float simple-array-long-float-widetag
-  simple-array-complex-single-float-widetag
-  simple-array-complex-double-float-widetag
-  #!+long-float simple-array-complex-long-float-widetag
-  complex-string-widetag complex-bit-vector-widetag complex-vector-widetag
-  complex-array-widetag)
-
-(def-type-vops numberp check-number nil object-not-number-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag ratio-widetag
-  single-float-widetag double-float-widetag
-  #!+long-float long-float-widetag
-  complex-widetag complex-single-float-widetag complex-double-float-widetag
-  #!+long-float complex-long-float-widetag)
-
-(def-type-vops rationalp check-rational nil object-not-rational-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag)
-
-(def-type-vops integerp check-integer nil object-not-integer-error
-  even-fixnum-lowtag odd-fixnum-lowtag bignum-widetag)
-
-(def-type-vops floatp check-float nil object-not-float-error
-  single-float-widetag double-float-widetag #!+long-float long-float-widetag)
-
-(def-type-vops realp check-real nil object-not-real-error
-  even-fixnum-lowtag odd-fixnum-lowtag ratio-widetag bignum-widetag
-  single-float-widetag double-float-widetag #!+long-float long-float-widetag)
 \f
 ;;;; other integer ranges
 
     (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))))
-\f
-) ; MACROLET
index 21303f6..7d3465a 100644 (file)
@@ -18,4 +18,4 @@
 ;;; internal versions off the main CVS branch, it gets hairier, e.g.
 ;;; "0.pre7.14.flaky4.13".)
 
-"0.7.7.22"
+"0.7.7.23"