Micro-optimize DOUBLE-FLOAT-LOW-BITS on x68-64.
[sbcl.git] / src / compiler / x86-64 / float.lisp
index 0a03d50..397ffdf 100644 (file)
   (:policy :fast-safe)
   (:vop-var vop)
   (:generator 5
-     (sc-case float
-       (double-reg
-        (inst movsd temp float)
-        (move lo-bits temp))
-       (double-stack
-        (loadw lo-bits ebp-tn (frame-word-offset (tn-offset float))))
-       (descriptor-reg
-        (loadw lo-bits float double-float-value-slot
-               other-pointer-lowtag)))
-     (inst shl lo-bits 32)
-     (inst shr lo-bits 32)))
+     (let ((dword-lo-bits (reg-in-size lo-bits :dword)))
+       (sc-case float
+        (double-reg
+         (inst movsd temp float)
+         (inst mov dword-lo-bits
+               (make-ea :dword :base rbp-tn
+                        :disp (frame-byte-offset (tn-offset temp)))))
+        (double-stack
+         (inst mov dword-lo-bits
+               (make-ea :dword :base rbp-tn
+                        :disp (frame-byte-offset (tn-offset float)))))
+        (descriptor-reg
+         (inst mov dword-lo-bits
+               (make-ea-for-object-slot-half float double-float-value-slot
+                                             other-pointer-lowtag)))))))
 
 \f