Index: /trunk/source/compiler/ARM/arm-vinsns.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 15421)
+++ /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 15422)
@@ -3292,4 +3292,13 @@
      ())
   (fcpys dest arm::single-float-zero))
+
+(define-arm-vinsn (load-single-float-constant-from-data :predicatable)
+    (((dest :double-float))
+     ((val :u32const)))
+  (flds dest (:= :x))
+  (:data)
+  :x
+  (:word val)
+  :code)
 
 (define-arm-vinsn (load-double-float-constant-from-data :predicatable)
Index: /trunk/source/compiler/ARM/arm2.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm2.lisp	(revision 15421)
+++ /trunk/source/compiler/ARM/arm2.lisp	(revision 15422)
@@ -1389,7 +1389,5 @@
           (if (typep form 'short-float)
             (let* ((bits (arm2-single-float-bits form)))
-              (with-imm-temps () ((bitsreg :u32))
-                (! lri bitsreg bits)
-                (! load-single-float-constant vreg bitsreg)))
+              (! load-single-float-constant-from-data vreg bits))
             (multiple-value-bind (high low) (arm2-double-float-bits form)
               (declare (integer high low))
@@ -3040,25 +3038,30 @@
 	       (elide-vinsn push-vinsn)
 	       (elide-vinsn pop-vinsn))
-	      ((and (eql (hard-regspec-class pushed-reg) hard-reg-class-fpr)
-		    (eql (get-regspec-mode pushed-reg)
-			 hard-reg-class-fpr-mode-double))
-	       ;; If we're pushing a double-float register that gets
-	       ;; set by the intervening vinsns, try to copy it to and
-	       ;; from a free FPR instead.
-	       (multiple-value-bind (used-gprs used-fprs)
+	      ((eql (hard-regspec-class pushed-reg) hard-reg-class-fpr)
+               (let* ((mode (get-regspec-mode pushed-reg))
+                      (double-p (eql mode hard-reg-class-fpr-mode-double)))
+                 ;; If we're pushing float register that gets
+                 ;; set by the intervening vinsns, try to copy it to and
+                 ;; from a free FPR instead.
+                 (multiple-value-bind (used-gprs used-fprs)
 		   (regs-set-in-vinsn-sequence push-vinsn pop-vinsn)
 		 (declare (ignore used-gprs))
-                 ;; We have 16 non-volatile single-floats or 8
-                 ;; non-volatile double-floats
-		 (let* ((nfprs 7)
+                 ;; We have 14 volatile single-floats or 7
+                 ;; volatile double-floats
+		 (let* ((nfprs (if double-p 7 14))
 			(free-fpr
 			 (dotimes (r nfprs nil)
-			   (unless (logtest (target-fpr-mask r :double-float)
+			   (unless (logtest (target-fpr-mask
+                                             r (if double-p :double-float :single-float))
 					    used-fprs)
 			     (return r)))))
 		   (when free-fpr
-		     (let* ((reg ($ free-fpr :class :fpr :mode :double-float))
-			    (save (! double-to-double reg pushed-reg))
-			    (restore (! double-to-double popped-reg reg)))
+		     (let* ((reg ($ free-fpr :class :fpr :mode mode))
+			    (save (if double-p
+                                    (! double-to-double reg pushed-reg)
+                                    (! single-to-single reg pushed-reg)))
+			    (restore (if double-p
+                                       (! double-to-double popped-reg reg)
+                                       (! single-to-single popped-reg reg))))
 		       (remove-dll-node save)
 		       (insert-dll-node-after save push-vinsn)
@@ -3066,5 +3069,5 @@
 		       (insert-dll-node-before restore pop-vinsn)
 		       (elide-vinsn push-vinsn)
-		       (elide-vinsn pop-vinsn))))))))))
+		       (elide-vinsn pop-vinsn)))))))))))
       (when (and (vinsn-attribute-p push-vinsn :vsp))
         (unless (or
@@ -6572,10 +6575,14 @@
              (null (cdr refs)))
       (when (do* ((next (dll-node-succ branch) (dll-node-succ next))
+                  (count 0 (1+ count))
                   (vinsn-p nil))
                  ((eq next lab) (return vinsn-p))
+              (declare (fixnum count))
               (if (typep next 'vinsn-label)
                 (unless (typep (vinsn-label-id next) 'vinsn-note)
                   (return))
                 (progn
+                  (when (= count 2)
+                    (return))
                   (unless (and (typep next 'vinsn)
                                (null (vinsn-annotation next))
