Index: /trunk/source/compiler/ARM/arm2.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm2.lisp	(revision 15057)
+++ /trunk/source/compiler/ARM/arm2.lisp	(revision 15058)
@@ -4693,4 +4693,5 @@
       
 (defun arm2-branch (seg xfer crf &optional cr-bit true-p)
+  (declare (notinline arm2-branch))
   (let* ((*arm2-vstack* *arm2-vstack*)
          (*arm2-top-vstack-lcell* *arm2-top-vstack-lcell*))
@@ -4703,8 +4704,8 @@
           (arm2-set-nargs seg 1)))
       (if (neq 0 xfer)
-        (if (eq xfer $backend-return)    ;; xfer : RETURN ==> popj
+        (if (eq xfer $backend-return);; xfer : RETURN ==> popj
           (arm2-do-return seg)
           (if (not (arm2-cd-compound-p xfer))
-            (-> xfer)  ;; xfer : label# ==> BRA label#
+            (-> xfer);; xfer : label# ==> BRA label#
             ;; cd is compound : (<true> / <false>)
             (let* ((truebranch (arm2-cd-true xfer))
@@ -4721,6 +4722,6 @@
               (if (and tn0 tnret nn0 nnret)
                 (progn
-                  (! cbranch-true tlabel crf cr-bit )    ;; (label# /  label#)
-                  (-> nbranch)))
+                  (! cbranch-true tlabel crf cr-bit );; (label# /  label#)
+                  (-> nbranch))
                 (if (and nnret tnret)
                   (if nn0
@@ -4733,5 +4734,5 @@
                       (! cbranch-false auxl crf cr-bit))
                     (arm2-do-return seg)
-                    (@ aux-label))))))))))
+                    (@ aux-label)))))))))))
 
 (defun arm2-cd-merge (cd label)
@@ -6094,5 +6095,6 @@
           (arm2-two-targeted-reg-forms seg  form1 ($ arm::arg_y) form2 ($ arm::arg_z)))
         (let* ((out-of-line (backend-get-next-label))
-               (done (backend-get-next-label)))
+               (done (backend-get-next-label))
+               (continue (backend-get-next-label)))
           (if otherform
             (unless (acode-fixnum-form-p otherform)
@@ -6104,9 +6106,12 @@
                 (! branch-unless-both-args-fixnums ($ arm::arg_y) ($ arm::arg_z) (aref *backend-labels* out-of-line)))))
           (with-crf-target () crf
-          (if otherform
-            (! compare-immediate crf ($ arm::arg_z) 0)
-            (! compare crf ($ arm::arg_y) ($ arm::arg_z)))
-          (! cond->boolean ($ arm::arg_z) (if true-p cr-bit (logxor cr-bit 1))))
-          (-> done)
+                           (if otherform
+                             (! compare-immediate crf ($ arm::arg_z) 0)
+                             (! compare crf ($ arm::arg_y) ($ arm::arg_z)))
+                           (if (and vreg (eql (hard-regspec-class vreg) hard-reg-class-crf))
+                             (arm2-branch seg (arm2-cd-merge xfer continue) crf cr-bit true-p)
+                             (progn
+                               (! cond->boolean ($ arm::arg_z) (if true-p cr-bit (logxor cr-bit 1)))
+                               (-> done))))
           (@ out-of-line)
           (if otherform
@@ -6117,5 +6122,6 @@
           (@ done)
           (<- ($ arm::arg_z))
-          (^))))))
+          (^)
+          (@ continue))))))
     
 (defarm2 arm2-%word-to-int %word-to-int (seg vreg xfer form)
