> I am seeing a few regressions with respect to trunk of a recent vintage.

Thanks, they are not there on arm-elf but I could indeed reproduce them
with arm-linux-gnueabi.  Here is a patch which I am committing to
cond-optab branch.

Paolo
2009-04-09  Paolo Bonzini  <bonz...@gnu.org>

        * optabs.c (prepare_cmp_insn): Simplify flow for libcall case,
        recurse on integer case too.

Index: gcc/optabs.c
===================================================================
--- gcc/optabs.c        (branch cond-optab)
+++ gcc/optabs.c        (working copy)
@@ -4150,12 +4150,14 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx
   if (methods != OPTAB_LIB_WIDEN)
     goto fail;
 
-  /* Handle a lib call just for the mode we are using.  */
-  libfunc = optab_libfunc (cmp_optab, mode);
-  if (libfunc && !SCALAR_FLOAT_MODE_P (mode))
+  if (!SCALAR_FLOAT_MODE_P (mode))
     {
       rtx result;
 
+      /* Handle a lib call just for the mode we are using.  */
+      libfunc = optab_libfunc (cmp_optab, mode);
+      gcc_assert (libfunc);
+
       /* If we want unsigned, and this mode has a distinct unsigned
         comparison routine, use that.  */
       if (unsignedp)
@@ -4188,13 +4190,13 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx
            y = const0_rtx;
        }
 
-      *ptest = gen_rtx_fmt_ee (comparison, word_mode, x, y);
       *pmode = word_mode;
-      return;
+      prepare_cmp_insn (x, y, comparison, NULL_RTX, unsignedp, methods,
+                       ptest, pmode);
     }
+  else 
+    prepare_float_lib_cmp (x, y, comparison, ptest, pmode);
 
-  gcc_assert (SCALAR_FLOAT_MODE_P (mode));
-  prepare_float_lib_cmp (x, y, comparison, ptest, pmode);
   return;
 
  fail:

Reply via email to