1.0.3.30: More compact typechecks on x86-64
authorJuho Snellman <jsnell@iki.fi>
Mon, 5 Mar 2007 00:57:52 +0000 (00:57 +0000)
committerJuho Snellman <jsnell@iki.fi>
Mon, 5 Mar 2007 00:57:52 +0000 (00:57 +0000)
        * Patch by Lutz Euler

NEWS
src/compiler/x86-64/type-vops.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index c29650c..2f5f147 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,7 @@ changes in sbcl-1.0.4 relative to sbcl-1.0.3:
     platforms.
   * optimization: code using alien values with undeclared types is much faster.
   * optimization: the compiler is now able to open code SEARCH in more cases.
+  * optimization: more compact (thanks to Lutz Euler)
   * bug fix: >= and <= gave wrong results when used with NaNs.
   * bug fix: the #= and ## reader macros now interact reasonably with
     funcallable instances.
@@ -18,6 +19,8 @@ changes in sbcl-1.0.4 relative to sbcl-1.0.3:
     by the spec (thanks to Eric Marsden)
   * bug fix: fixed GC safety issues when foreign functions are called with
     non-base strings as arguments
+  * bug fix: more consistent error output for fatal-compiler-warnings, like
+    reader errors
 
 changes in sbcl-1.0.3 relative to sbcl-1.0.2:
   * new platform: NetBSD/PPC.  (thanks to Aymeric Vincent)
index c052211..a68121f 100644 (file)
                   :sc (sc-or-lose 'byte-reg)
                   :offset (tn-offset tn)))
 
+(defun make-dword-tn (tn)
+  (aver (sc-is tn any-reg descriptor-reg unsigned-reg signed-reg))
+  (make-random-tn :kind :normal
+                  :sc (sc-or-lose 'dword-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
index 8c34311..6d0880f 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.3.29"
+"1.0.3.30"