arm.md (f_minmaxs, f_minmaxd): New types.
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Wed, 19 Dec 2012 15:51:24 +0000 (15:51 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Wed, 19 Dec 2012 15:51:24 +0000 (15:51 +0000)
gcc/

2012-12-19  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

* config/arm/arm.md (f_minmaxs, f_minmaxd): New types.
* config/arm/vfp.md (smax<mode>3): New pattern.
(smin<mode>3): Likewise.

gcc/testsuite/

2012-12-19  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

* gcc.target/arm/vmaxnmdf.c: New test.
* gcc.target/arm/vmaxnmsf.c: Likewise.
* gcc.target/arm/vminnmsf.c: Likewise.
* gcc.target/arm/vminnmdf.c: Likewise.

From-SVN: r194612

gcc/ChangeLog
gcc/config/arm/arm.md
gcc/config/arm/vfp.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/vmaxnmdf.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/vmaxnmsf.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/vminnmdf.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/vminnmsf.c [new file with mode: 0644]

index 59eb8bbb09a669d9fa7fd91d9ae1b63e56db41a7..e60c4d902e57cb33955b78889a76407b52b069c8 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-19  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/arm/arm.md (f_minmaxs, f_minmaxd): New types.
+       * config/arm/vfp.md (smax<mode>3): New pattern.
+       (smin<mode>3): Likewise.
+
 2012-12-19  Richard Biener  <rguenther@suse.de>
 
        * targhooks.h (default_canonicalize_comparison): Fix prototype.
index 9add9e56becd1cf8057f10a8ce48322b07115716..385a58dd65219172bfcf7a9946c3a239e9eed20d 100644 (file)
   fmacd,\
   f_rints,\
   f_rintd,\
+  f_minmaxs,\
+  f_minmaxd,\
   f_flag,\
   f_loads,\
   f_loadd,\
index a5c461df36f9dd6613a03d5d68d58dab851252ba..3f2975ff546bbe6fad9e7b4750174220eef91758 100644 (file)
    (set_attr "type" "f_rint<vfp_type>")]
 )
 
+;; MIN_EXPR and MAX_EXPR eventually map to 'smin' and 'smax' in RTL.
+;; The 'smax' and 'smin' RTL standard pattern names do not specify which
+;; operand will be returned when both operands are zero (i.e. they may not
+;; honour signed zeroes), or when either operand is NaN.  Therefore GCC
+;; only introduces MIN_EXPR/MAX_EXPR in fast math mode or when not honouring
+;; NaNs.
+
+(define_insn "smax<mode>3"
+  [(set (match_operand:SDF 0 "register_operand" "=<F_constraint>")
+        (smax:SDF (match_operand:SDF 1 "register_operand" "<F_constraint>")
+                 (match_operand:SDF 2 "register_operand" "<F_constraint>")))]
+  "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 <vfp_double_cond>"
+  "vmaxnm.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
+  [(set_attr "type" "f_minmax<vfp_type>")]
+)
+
+(define_insn "smin<mode>3"
+  [(set (match_operand:SDF 0 "register_operand" "=<F_constraint>")
+        (smin:SDF (match_operand:SDF 1 "register_operand" "<F_constraint>")
+                 (match_operand:SDF 2 "register_operand" "<F_constraint>")))]
+  "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 <vfp_double_cond>"
+  "vminnm.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
+  [(set_attr "type" "f_minmax<vfp_type>")]
+)
+
 ;; Unimplemented insns:
 ;; fldm*
 ;; fstm*
index 1f2b9eaf7015e2b66b3cf574c5bc293bec9b9bce..8e1e53ccb6df42003d54d4df6faefbcf3ac78e2e 100644 (file)
@@ -1,3 +1,10 @@
+2012-12-19  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * gcc.target/arm/vmaxnmdf.c: New test.
+       * gcc.target/arm/vmaxnmsf.c: Likewise.
+       * gcc.target/arm/vminnmsf.c: Likewise.
+       * gcc.target/arm/vminnmdf.c: Likewise.
+
 2012-12-19  Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.dg/gomp/use_intrinsic_1.f90: Moved
diff --git a/gcc/testsuite/gcc.target/arm/vmaxnmdf.c b/gcc/testsuite/gcc.target/arm/vmaxnmdf.c
new file mode 100644 (file)
index 0000000..1a172b8
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_v8_vfp_ok } */
+/* { dg-options "-ffast-math" } */
+/* { dg-add-options arm_v8_vfp } */
+
+double
+foo (double x, double y)
+{
+  return __builtin_fmax (x, y);
+}
+
+/* { dg-final { scan-assembler-times "vmaxnm.f64\td\[0-9\]+" 1 } } */
diff --git a/gcc/testsuite/gcc.target/arm/vmaxnmsf.c b/gcc/testsuite/gcc.target/arm/vmaxnmsf.c
new file mode 100644 (file)
index 0000000..bc23261
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_v8_vfp_ok } */
+/* { dg-options "-ffast-math" } */
+/* { dg-add-options arm_v8_vfp } */
+
+float
+foo (float x, float y)
+{
+  return __builtin_fmaxf (x, y);
+}
+
+/* { dg-final { scan-assembler-times "vmaxnm.f32\ts\[0-9\]+" 1 } } */
diff --git a/gcc/testsuite/gcc.target/arm/vminnmdf.c b/gcc/testsuite/gcc.target/arm/vminnmdf.c
new file mode 100644 (file)
index 0000000..c2a6915
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_v8_vfp_ok } */
+/* { dg-options "-ffast-math" } */
+/* { dg-add-options arm_v8_vfp } */
+
+double
+foo (double x, double y)
+{
+  return __builtin_fmin (x, y);
+}
+
+/* { dg-final { scan-assembler-times "vminnm.f64\td\[0-9\]+" 1 } } */
diff --git a/gcc/testsuite/gcc.target/arm/vminnmsf.c b/gcc/testsuite/gcc.target/arm/vminnmsf.c
new file mode 100644 (file)
index 0000000..eee43bc
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_v8_vfp_ok } */
+/* { dg-options "-ffast-math" } */
+/* { dg-add-options arm_v8_vfp } */
+
+float
+foo (float x, float y)
+{
+  return __builtin_fminf (x, y);
+}
+
+/* { dg-final { scan-assembler-times "vminnm.f32\ts\[0-9\]+" 1 } } */