1.0.17.24: refactor handling of constants in the compiler
[sbcl.git] / src / compiler / x86-64 / type-vops.lisp
index c052211..450a6a4 100644 (file)
@@ -1,4 +1,4 @@
-;;;; type testing and checking VOPs for the x86 VM
+;;;; type testing and checking VOPs for the x86-64 VM
 
 ;;;; This software is part of the SBCL system. See the README file for
 ;;;; more information.
 \f
 ;;;; test generation utilities
 
-(defun make-byte-tn (tn)
-  (aver (sc-is tn any-reg descriptor-reg unsigned-reg signed-reg))
-  (make-random-tn :kind :normal
-                  :sc (sc-or-lose 'byte-reg)
-                  :offset (tn-offset tn)))
-
 (defun generate-fixnum-test (value)
   "zero flag set if VALUE is fixnum"
-  (let ((offset (tn-offset value)))
-    ;; The x86 backend uses a pun from E[A-D]X -> [A-D]L for these
-    ;; tests. The Athlon 64 optimization guide says that this is a
-    ;; bad idea, so it's been removed.
-    (cond ((sc-is value control-stack)
-           (inst test (make-ea :byte :base rbp-tn
-                               :disp (- (* (1+ offset) n-word-bytes)))
-                 sb!vm::fixnum-tag-mask))
-          (t
-           (inst test value sb!vm::fixnum-tag-mask)))))
+  (inst test
+        (cond ((sc-is value any-reg descriptor-reg)
+               (make-byte-tn value))
+              ((sc-is value control-stack)
+               (make-ea :byte :base rbp-tn
+                        :disp (- (* (1+ (tn-offset value)) n-word-bytes))))
+              (t
+               value))
+        sb!vm::fixnum-tag-mask))
 
 (defun %test-fixnum (value target not-p)
   (generate-fixnum-test value)
   (%test-headers value target not-p nil headers drop-through))
 
 (defun %test-lowtag (value target not-p lowtag)
-  (move rax-tn value)
-  (inst and rax-tn lowtag-mask)
-  (inst cmp rax-tn lowtag)
+  (if (and (sc-is value any-reg descriptor-reg)
+           (< (tn-offset value) r8-offset))
+      (move eax-tn (make-dword-tn value)) ; shorter encoding (no REX prefix)
+      (move rax-tn value))
+  (inst and al-tn lowtag-mask)
+  (inst cmp al-tn lowtag)
   (inst jmp (if not-p :ne :e) target))
 
 (defun %test-headers (value target not-p function-p headers
            `((define-vop (,check-name ,(intern (concatenate 'string prefix "CHECK-TYPE")))
                (:generator ,cost
                  (let ((err-lab
-                        (generate-error-code vop ,error-code value)))
+                        (generate-error-code vop ',error-code value)))
                    (test-type value err-lab t (,@type-codes))
                    (move result value))))))
        ,@(when ptype
 (define-vop (check-signed-byte-64 check-type)
   (:generator 45
     (let ((nope (generate-error-code vop
-                                     object-not-signed-byte-64-error
+                                     'object-not-signed-byte-64-error
                                      value)))
       (generate-fixnum-test value)
       (inst jmp :e yep)
 (define-vop (check-unsigned-byte-64 check-type)
   (:generator 45
     (let ((nope
-           (generate-error-code vop object-not-unsigned-byte-64-error value))
+           (generate-error-code vop 'object-not-unsigned-byte-64-error value))
           (yep (gen-label))
           (fixnum (gen-label))
           (single-word (gen-label)))
 
 (define-vop (check-symbol check-type)
   (:generator 12
-    (let ((error (generate-error-code vop object-not-symbol-error value)))
+    (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)))
 
 (define-vop (check-cons check-type)
   (:generator 8
-    (let ((error (generate-error-code vop object-not-cons-error value)))
+    (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))