for accessing such arrays.
   * optimization: passing NIL as the environment argument to TYPEP no longer
     inhibits optimizing it. (lp#309788)
+  * optimization: more efficient register usage when handling single-float
+    arguments on x86-64. (thanks to Lutz Euler)
   * optimization: ADJUST-ARRAY and STABLE-SORT on vectors no longer use
     pre-allocated temporary vectors. (lp#496249)
   * bug fix: Fix compiler error involving MAKE-ARRAY and IF forms
 
   (double-reg) (descriptor-reg))
 
 ;;; Move from a descriptor to a float register.
-(define-vop (move-to-single)
+(define-vop (move-to-single-reg)
+   (:args (x :scs (descriptor-reg) :target tmp
+             :load-if (not (sc-is x control-stack))))
+   (:temporary (:sc unsigned-reg :from :argument :to :result) tmp)
+   (:results (y :scs (single-reg)))
+   (:note "pointer to float coercion")
+   (:generator 2
+     (sc-case x
+       (descriptor-reg
+        (move tmp x)
+        (inst shr tmp 32)
+        (inst movd y tmp))
+       (control-stack
+        ;; When the single-float descriptor is in memory, the untagging
+        ;; is done in the target XMM register. This is faster than going
+        ;; through a general-purpose register and the code is smaller.
+        (inst movq y x)
+        (inst shufps y y #4r3331)))))
+(define-move-vop move-to-single-reg :move (descriptor-reg) (single-reg))
+
+;;; Move from a descriptor to a float stack.
+(define-vop (move-to-single-stack)
   (:args (x :scs (descriptor-reg) :target tmp))
-  (:temporary (:sc unsigned-reg) tmp)
-  (:results (y :scs (single-reg single-stack)))
+  (:temporary (:sc unsigned-reg :from :argument :to :result) tmp)
+  (:results (y :scs (single-stack)))
   (:note "pointer to float coercion")
   (:generator 2
     (move tmp x)
     (inst shr tmp 32)
-    (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 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-stack :move (descriptor-reg) (single-stack))
 
 (define-vop (move-to-double)
   (:args (x :scs (descriptor-reg)))
 
 
 (sb!disassem:define-instruction-format (xmm-xmm/mem-imm 24
                                         :default-printer
-                                        '(:name :tab reg ", " reg/mem " " imm))
+                                        '(:name
+                                          :tab reg ", " reg/mem ", " imm))
   (x0f     :field (byte 8 0)    :value #x0f)
   (op      :field (byte 8 8))
   (reg/mem :fields (list (byte 2 22) (byte 3 16))
 
 (sb!disassem:define-instruction-format (rex-xmm-xmm/mem-imm 32
                                         :default-printer
-                                        '(:name :tab reg ", " reg/mem " " imm))
+                                        '(:name
+                                          :tab reg ", " reg/mem ", " imm))
   (rex     :field (byte 4 4)    :value #b0100)
   (wrxb    :field (byte 4 0)    :type 'wrxb)
   (x0f     :field (byte 8 8)    :value #x0f)
 
 (sb!disassem:define-instruction-format (ext-xmm-xmm/mem-imm 32
                                         :default-printer
-                                        '(:name :tab reg ", " reg/mem " " imm))
+                                        '(:name
+                                          :tab reg ", " reg/mem ", " imm))
   (prefix  :field (byte 8 0))
   (x0f     :field (byte 8 8)    :value #x0f)
   (op      :field (byte 8 16))
 
 (sb!disassem:define-instruction-format (ext-rex-xmm-xmm/mem-imm 40
                                         :default-printer
-                                        '(:name :tab reg ", " reg/mem " " imm))
+                                        '(:name
+                                          :tab reg ", " reg/mem ", " imm))
   (prefix  :field (byte 8 0))
   (rex     :field (byte 4 12)   :value #b0100)
   (wrxb    :field (byte 4 8)    :type 'wrxb)
 
 ;;; 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.36.30"
+"1.0.36.31"