optabs.c (prepare_cmp_insn): Try harder to emit a direct comparison instead of a...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 9 Feb 2018 12:33:40 +0000 (12:33 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 9 Feb 2018 12:33:40 +0000 (12:33 +0000)
* optabs.c (prepare_cmp_insn): Try harder to emit a direct comparison
instead of a libcall for UNORDERED.

From-SVN: r257525

gcc/ChangeLog
gcc/optabs.c

index b112b8105c7f62bdb92a1cc657deba9677143092..858ad9dd9db135b10ace442b45a12dfb9e8935e1 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * optabs.c (prepare_cmp_insn): Try harder to emit a direct comparison
+       instead of a libcall for UNORDERED.
+
 2018-02-09  Tamar Christina  <tamar.christina@arm.com>
 
        PR target/82641
index daac5457223232dcae76565b973ec1b9bbc7e52d..5f61e4e9521b58b9cdb7f8207d69fa8e042feecf 100644 (file)
@@ -3935,7 +3935,20 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
   if (methods != OPTAB_LIB_WIDEN)
     goto fail;
 
-  if (!SCALAR_FLOAT_MODE_P (mode))
+  if (SCALAR_FLOAT_MODE_P (mode))
+    {
+      /* Small trick if UNORDERED isn't implemented by the hardware.  */
+      if (comparison == UNORDERED && rtx_equal_p (x, y))
+       {
+         prepare_cmp_insn (x, y, UNLT, NULL_RTX, unsignedp, OPTAB_WIDEN,
+                           ptest, pmode);
+         if (*ptest)
+           return;
+       }
+
+      prepare_float_lib_cmp (x, y, comparison, ptest, pmode);
+    }
+  else
     {
       rtx result;
       machine_mode ret_mode;
@@ -3982,8 +3995,6 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
       prepare_cmp_insn (x, y, comparison, NULL_RTX, unsignedp, methods,
                        ptest, pmode);
     }
-  else
-    prepare_float_lib_cmp (x, y, comparison, ptest, pmode);
 
   return;