0.9.8.28:
[sbcl.git] / src / compiler / x86-64 / type-vops.lisp
index 09efe21..f3b540f 100644 (file)
     (inst shr tmp 61)
     (inst jmp (if not-p :nz :z) target)))
 
-(define-vop (signed-byte-32-p type-predicate)
-  (:translate signed-byte-32-p)
-  (:generator 7
-    ;; (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 sar rax-tn (+ 32 3 -1))
-    (if not-p
-        (progn
-          (inst jmp :nz MAYBE)
-          (inst jmp NOT-TARGET))
-        (inst jmp :z target))
-    MAYBE
-    (inst cmp rax-tn -1)
-    (inst jmp (if not-p :ne :eq) target)
-    NOT-TARGET))
+;;; A (SIGNED-BYTE 64) can be represented with either fixnum or a bignum with
+;;; exactly one digit.
 
-(define-vop (check-signed-byte-32 check-type)
-  (:generator 8
-    (let ((nope (generate-error-code vop
-                                     object-not-signed-byte-32-error
-                                     value))
-          (ok (gen-label)))
+(define-vop (signed-byte-64-p type-predicate)
+  (:translate signed-byte-64-p)
+  (:generator 45
+    (multiple-value-bind (yep nope)
+        (if not-p
+            (values not-target target)
+            (values target not-target))
+      (generate-fixnum-test value)
+      (inst jmp :e yep)
       (move rax-tn value)
-      (inst test rax-tn 7)
+      (inst and al-tn lowtag-mask)
+      (inst cmp al-tn other-pointer-lowtag)
       (inst jmp :ne nope)
-      (inst sar rax-tn (+ 32 3 -1))
-      (inst jmp :z ok)
-      (inst cmp rax-tn -1)
-      (inst jmp :ne nope)
-      (emit-label ok)
-      (move result value))))
-
-
-(define-vop (unsigned-byte-32-p type-predicate)
-  (:translate unsigned-byte-32-p)
-  (:generator 7
-    ;; (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 shr rax-tn (+ 32 sb!vm::n-fixnum-tag-bits))
-    (inst jmp (if not-p :nz :z) target)
+      (loadw rax-tn value 0 other-pointer-lowtag)
+      (inst cmp rax-tn (+ (ash 1 n-widetag-bits) bignum-widetag))
+      (inst jmp (if not-p :ne :e) target))
     NOT-TARGET))
 
-(define-vop (check-unsigned-byte-32 check-type)
-  (:generator 8
-    (let ((nope
-           (generate-error-code vop object-not-unsigned-byte-32-error value)))
+(define-vop (check-signed-byte-64 check-type)
+  (:generator 45
+    (let ((nope (generate-error-code vop
+                                     object-not-signed-byte-64-error
+                                     value)))
+      (generate-fixnum-test value)
+      (inst jmp :e yep)
       (move rax-tn value)
-      (inst test rax-tn 7)
+      (inst and al-tn lowtag-mask)
+      (inst cmp al-tn other-pointer-lowtag)
       (inst jmp :ne nope)
-      (inst shr rax-tn (+ 32 sb!vm::n-fixnum-tag-bits))
-      (inst jmp :nz nope)
-      (move result value))))
+      (loadw rax-tn value 0 other-pointer-lowtag)
+      (inst cmp rax-tn (+ (ash 1 n-widetag-bits) bignum-widetag))
+      (inst jmp :ne nope))
+    YEP
+    (move result value)))
 
 ;;; An (unsigned-byte 64) can be represented with either a positive
 ;;; fixnum, a bignum with exactly one positive digit, or a bignum with