0.9.0.6:
[sbcl.git] / src / compiler / x86-64 / type-vops.lisp
index 6dbaaab..2ba4b7e 100644 (file)
     (inst jmp :z (if not-p drop-through target))
     (%test-headers value target not-p nil headers drop-through)))
 
-(defun %test-immediate (value target not-p immediate)
+(defun %test-fixnum-and-immediate (value target not-p immediate)
+  (let ((drop-through (gen-label)))
+    (generate-fixnum-test value)
+    (inst jmp :z (if not-p drop-through target))
+    (%test-immediate value target not-p immediate drop-through)))
+
+(defun %test-fixnum-immediate-and-headers (value target not-p immediate
+                                          headers)
+  (let ((drop-through (gen-label)))
+    (generate-fixnum-test value)
+    (inst jmp :z (if not-p drop-through target))
+    (%test-immediate-and-headers value target not-p immediate headers
+                                drop-through)))
+
+(defun %test-immediate (value target not-p immediate
+                       &optional (drop-through (gen-label)))
   ;; Code a single instruction byte test if possible.
   (cond ((sc-is value any-reg descriptor-reg)
         (inst cmp (make-byte-tn value) immediate))
        (t
         (move rax-tn value)
         (inst cmp al-tn immediate)))
-  (inst jmp (if not-p :ne :e) target))
+  (inst jmp (if not-p :ne :e) target)  
+  (emit-label drop-through))  
+
+(defun %test-immediate-and-headers (value target not-p immediate headers
+                                   &optional (drop-through (gen-label)))
+  ;; Code a single instruction byte test if possible.
+  (cond ((sc-is value any-reg descriptor-reg)
+        (inst cmp (make-byte-tn value) immediate))
+       (t
+        (move rax-tn value)
+        (inst cmp al-tn immediate)))
+  (inst jmp :e (if not-p drop-through target))
+  (%test-headers value target not-p nil headers drop-through))
 
 (defun %test-lowtag (value target not-p lowtag)
   (move rax-tn value)
     ;; (and (fixnum) (or (no bits set >31) (all bits set >31))
     (move rax-tn value)
     (inst test rax-tn 7)
-    (inst jmp :ne (if not-p target not-target))
+    (inst jmp :ne (if not-p target NOT-TARGET))
     (inst sar rax-tn (+ 32 3 -1))
     (if not-p
        (progn
-         (inst jmp :nz maybe)
-         (inst jmp not-target))
+         (inst jmp :nz MAYBE)
+         (inst jmp NOT-TARGET))
        (inst jmp :z target))
     MAYBE
     (inst cmp rax-tn -1)
       (inst jmp :z ok)
       (inst cmp rax-tn -1)
       (inst jmp :ne nope)
-      (emit-label OK)
+      (emit-label ok)
       (move result value))))
 
 
     ;; (and (fixnum) (no bits set >31))
     (move rax-tn value)
     (inst test rax-tn 7)
-    (inst jmp :ne (if not-p target not-target))
+    (inst jmp :ne (if not-p target NOT-TARGET))
     (inst shr rax-tn (+ 32 sb!vm::n-fixnum-tag-bits))
     (inst jmp (if not-p :nz :z) target)
     NOT-TARGET))
 (define-vop (symbolp type-predicate)
   (:translate symbolp)
   (:generator 12
-    (let ((is-symbol-label (if not-p drop-thru target)))
+    (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)))
   (:generator 12
     (let ((error (generate-error-code vop object-not-symbol-error value)))
       (inst cmp value nil-value)
-      (inst jmp :e drop-thru)
+      (inst jmp :e DROP-THRU)
       (test-type value error t (symbol-header-widetag)))
     DROP-THRU
     (move result value)))
 (define-vop (consp type-predicate)
   (:translate consp)
   (:generator 8
-    (let ((is-not-cons-label (if not-p target drop-thru)))
+    (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)))