match.pd: Convert fminf<N>...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Mon, 13 Nov 2017 19:06:49 +0000 (19:06 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Mon, 13 Nov 2017 19:06:49 +0000 (19:06 +0000)
[gcc]
2017-11-13  Michael Meissner  <meissner@linux.vnet.ibm.com>

* match.pd: Convert fminf<N>, fminf<N>x, fmax<N>, and fmax<N>x
into the min/max operations for _Float<N> and _Float<N>X types.

[gcc/testsuite]
2017-11-13  Michael Meissner  <meissner@linux.vnet.ibm.com>

* gcc.target/powerpc/float128-minmax.c: New test.

From-SVN: r254702

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/float128-minmax.c [new file with mode: 0644]

index 543a8e1..fee8dca 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-13  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       * match.pd: Convert fminf<N>, fminf<N>x, fmax<N>, and fmax<N>x
+       into the min/max operations for _Float<N> and _Float<N>X types.
+
 2017-11-13  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR lto/81351
index 4d56847..2557f08 100644 (file)
@@ -1803,7 +1803,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 
 /* Simplifications of MIN_EXPR, MAX_EXPR, fmin() and fmax().  */
 
-(for minmax (min max FMIN FMAX)
+(for minmax (min max FMIN FMIN_FN FMAX FMAX_FN)
  (simplify
   (minmax @0 @0)
   @0))
@@ -1881,7 +1881,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (type))
    (minmax @1 (convert @2)))))
 
-(for minmax (FMIN FMAX)
+(for minmax (FMIN FMIN_FN FMAX FMAX_FN)
  /* If either argument is NaN, return the other one.  Avoid the
     transformation if we get (and honor) a signalling NaN.  */
  (simplify
@@ -1899,11 +1899,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (FMIN @0 @1)
   (min @0 @1))
  (simplify
+  (FMIN_FN @0 @1)
+  (min @0 @1))
+ (simplify
   (FMAX @0 @1)
+  (max @0 @1))
+ (simplify
+  (FMAX_FN @0 @1)
   (max @0 @1)))
 /* min (-A, -B) -> -max (A, B)  */
-(for minmax (min max FMIN FMAX)
-     maxmin (max min FMAX FMIN)
+(for minmax (min max FMIN FMIN_FN FMAX FMAX_FN)
+     maxmin (max min FMAX FMAX_FN FMIN FMAX_FN)
  (simplify
   (minmax (negate:s@2 @0) (negate:s@3 @1))
   (if (FLOAT_TYPE_P (TREE_TYPE (@0))
index 85e71b3..413d7e5 100644 (file)
@@ -1,3 +1,7 @@
+2017-11-13  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       * gcc.target/powerpc/float128-minmax.c: New test.
+
 2017-11-13  Christophe Lyon  <christophe.lyon@linaro.org>
 
        * gcc.target/arm/pr67989.C: Add -Wno-return-type to
diff --git a/gcc/testsuite/gcc.target/powerpc/float128-minmax.c b/gcc/testsuite/gcc.target/powerpc/float128-minmax.c
new file mode 100644 (file)
index 0000000..f8b025d
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-mpower9-vector -O2 -ffast-math" } */
+
+#ifndef TYPE
+#define TYPE _Float128
+#endif
+
+/* Test that the fminf128/fmaxf128 functions generate if/then/else and not a
+   call.  */
+TYPE f128_min (TYPE a, TYPE b) { return __builtin_fminf128 (a, b); }
+TYPE f128_max (TYPE a, TYPE b) { return __builtin_fmaxf128 (a, b); }
+
+/* { dg-final { scan-assembler     {\mxscmpuqp\M} } } */
+/* { dg-final { scan-assembler-not {\mbl\M}       } } */