X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fmove.lisp;h=4caf11f995520e210952ca20d8714a204a8c3321;hb=c9b36f04557bd6c7208863e73bae7b1bc6e64842;hp=a9a7ec5023dd24b6c126258233ebe5ead0d27207;hpb=0d871fd7a98fc4af92a8b942a1154761466ad8c9;p=sbcl.git diff --git a/src/compiler/x86-64/move.lisp b/src/compiler/x86-64/move.lisp index a9a7ec5..4caf11f 100644 --- a/src/compiler/x86-64/move.lisp +++ b/src/compiler/x86-64/move.lisp @@ -1,4 +1,4 @@ -;;;; the x86 VM definition of operand loading/saving and the MOVE vop +;;;; the x86-64 VM definition of operand loading/saving and the MOVE vop ;;;; This software is part of the SBCL system. See the README file for ;;;; more information. @@ -28,7 +28,10 @@ (define-move-fun (load-number 1) (vop x y) ((immediate) (signed-reg unsigned-reg)) - (inst mov y (tn-value x))) + (let ((val (tn-value x))) + (if (zerop val) + (inst xor y y) + (inst mov y val)))) (define-move-fun (load-character 1) (vop x y) ((immediate) (character-reg)) @@ -279,12 +282,15 @@ (aver (not (location= x y))) (let ((bignum (gen-label)) (done (gen-label))) - (inst mov y x) - (inst shl y 1) - (inst jmp :o bignum) - (inst shl y 1) - (inst jmp :o bignum) - (inst shl y 1) + ;; We can't do the overflow check with SHL Y, 3, since the + ;; state of the overflow flag is only reliably set when + ;; shifting by 1. There used to be code here for doing "shift + ;; by one, check whether it overflowed" three times. But on all + ;; x86-64 processors IMUL is a reasonably fast instruction, so + ;; we can just do a straight multiply instead of trying to + ;; optimize it to a shift. This is both faster and smaller. + ;; -- JES, 2006-07-08 + (inst imul y x (ash 1 n-fixnum-tag-bits)) (inst jmp :o bignum) (emit-label done)