Micro-optimize move-immediate on x86-64.
authorStas Boukarev <stassats@gmail.com>
Mon, 9 Sep 2013 15:54:05 +0000 (19:54 +0400)
committerStas Boukarev <stassats@gmail.com>
Mon, 9 Sep 2013 15:54:05 +0000 (19:54 +0400)
Use XOR X, X when the immediate is 0.

src/compiler/x86-64/move.lisp
src/compiler/x86-64/static-fn.lisp

index dbf58ed..f10a953 100644 (file)
         (let ((val (tn-value x)))
           (etypecase val
             (integer
-             (if (and (zerop val) (sc-is y any-reg descriptor-reg))
-                 (zeroize y)
-                 (move-immediate y (fixnumize val) temp)))
+             (move-immediate y (fixnumize val) temp))
             (symbol
              (inst mov y (+ nil-value (static-symbol-offset val))))
             (character
     ;; If target is a register, we can just mov it there directly
     ((and (tn-p target)
           (sc-is target signed-reg unsigned-reg descriptor-reg any-reg))
-     (inst mov target val))
+     (if (zerop val)
+         (zeroize target)
+         (inst mov target val)))
     ;; Likewise if the value is small enough.
     ((typep val '(signed-byte 32))
      (inst mov target val))
index ec4809a..1f0c370 100644 (file)
@@ -91,7 +91,7 @@
                 (inst enter n-word-bytes)))
 
          ,(if (zerop num-args)
-              '(inst xor ecx ecx)
+              '(zeroize ecx)
               `(inst mov ecx ,(fixnumize num-args)))
 
          (note-this-location vop :call-site)