1.0.35.17: micro-optimize x86-64 MOVE-TO-SINGLE
authorNathan Froyd <froydnj@cs.rice.edu>
Tue, 16 Feb 2010 04:45:25 +0000 (04:45 +0000)
committerNathan Froyd <froydnj@cs.rice.edu>
Tue, 16 Feb 2010 04:45:25 +0000 (04:45 +0000)
Sometimes we move a descriptor -> float -> stack.  Teach MOVE-TO-SINGLE
how to do descriptor -> stack in one step.

src/compiler/x86-64/float.lisp
version.lisp-expr

index 6943574..6f0a27f 100644 (file)
 (define-vop (move-to-single)
   (:args (x :scs (descriptor-reg) :target tmp))
   (:temporary (:sc unsigned-reg) tmp)
-  (:results (y :scs (single-reg)))
+  (:results (y :scs (single-reg single-stack)))
   (:note "pointer to float coercion")
   (:generator 2
     (move tmp x)
     (inst shr tmp 32)
-    (inst movd y tmp)))
+    (sc-case y
+      (single-reg
+       (inst movd y tmp))
+      (single-stack
+       (let ((slot (make-ea :dword :base rbp-tn
+                            :disp (frame-byte-offset (tn-offset y)))))
+         (inst mov slot (reg-in-size tmp :dword)))))))
 
-(define-move-vop move-to-single :move (descriptor-reg) (single-reg))
+(define-move-vop move-to-single :move (descriptor-reg) (single-reg single-stack))
 
 (define-vop (move-to-double)
   (:args (x :scs (descriptor-reg)))
index 63e68dd..725a600 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.35.16"
+"1.0.35.17"