]> gcc.gnu.org Git - gcc.git/commitdiff
neon.md (div<mode>3): New pattern.
authorPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Fri, 9 Nov 2018 06:39:25 +0000 (06:39 +0000)
committerPrathamesh Kulkarni <prathamesh3492@gcc.gnu.org>
Fri, 9 Nov 2018 06:39:25 +0000 (06:39 +0000)
2018-11-09  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>

* config/arm/neon.md (div<mode>3): New pattern.

testsuite/
* gcc.target/arm/neon-vect-div-1.c: New test.
* gcc.target/arm/neon-vect-div-2.c: Likewise.

From-SVN: r265948

gcc/ChangeLog
gcc/config/arm/neon.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/neon-vect-div-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/neon-vect-div-2.c [new file with mode: 0644]

index 8961e8034e351cd75712bbdccfd08a673f792ce8..800a115aaf94a65c96e772d1cfcb2363df259168 100644 (file)
@@ -1,3 +1,7 @@
+2018-11-09  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       * config/arm/neon.md (div<mode>3): New pattern.
+
 2018-11-08  Andi Kleen  <ak@linux.intel.com>
 
        * common/config/i386/i386-common.c (OPTION_MASK_ISA_PTWRITE_SET): New.
index 5aeee4b08c168c5060d2156edfcba40cb25b5f6f..07572e4e62c32194b8867798ff45b6055a3617d3 100644 (file)
                     (const_string "neon_mul_<V_elem_ch><q>")))]
 )
 
+/* Perform division using multiply-by-reciprocal.
+   Reciprocal is calculated using Newton-Raphson method.
+   Enabled with -funsafe-math-optimizations -freciprocal-math
+   and disabled for -Os since it increases code size .  */
+
+(define_expand "div<mode>3"
+  [(set (match_operand:VCVTF 0 "s_register_operand" "=w")
+        (div:VCVTF (match_operand:VCVTF 1 "s_register_operand" "w")
+                 (match_operand:VCVTF 2 "s_register_operand" "w")))]
+  "TARGET_NEON && !optimize_size
+   && flag_reciprocal_math"
+  {
+    rtx rec = gen_reg_rtx (<MODE>mode);
+    rtx vrecps_temp = gen_reg_rtx (<MODE>mode);
+
+    /* Reciprocal estimate.  */
+    emit_insn (gen_neon_vrecpe<mode> (rec, operands[2]));
+
+    /* Perform 2 iterations of newton-raphson method.  */
+    for (int i = 0; i < 2; i++)
+      {
+       emit_insn (gen_neon_vrecps<mode> (vrecps_temp, rec, operands[2]));
+       emit_insn (gen_mul<mode>3 (rec, rec, vrecps_temp));
+      }
+
+    /* We now have reciprocal in rec, perform operands[0] = operands[1] * rec.  */
+    emit_insn (gen_mul<mode>3 (operands[0], operands[1], rec));
+    DONE;
+  }
+)
+
+
 (define_insn "mul<mode>3add<mode>_neon"
   [(set (match_operand:VDQW 0 "s_register_operand" "=w")
         (plus:VDQW (mult:VDQW (match_operand:VDQW 2 "s_register_operand" "w")
index e5641fe5a89aa834695b4c294f6678b40186849b..aa7984789eef0c1723606f57c609512281db03d3 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-09  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       * gcc.target/arm/neon-vect-div-1.c: New test.
+       * gcc.target/arm/neon-vect-div-2.c: Likewise.
+
 2018-11-08  Andi Kleen  <ak@linux.intel.com>
 
        * gcc.target/i386/ptwrite1.c: New test.
diff --git a/gcc/testsuite/gcc.target/arm/neon-vect-div-1.c b/gcc/testsuite/gcc.target/arm/neon-vect-div-1.c
new file mode 100644 (file)
index 0000000..50d04b4
--- /dev/null
@@ -0,0 +1,16 @@
+/* Test pattern div<mode>3.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-require-effective-target vect_hw_misalign } */
+/* { dg-options "-O2 -ftree-vectorize -funsafe-math-optimizations -fdump-tree-vect-details" } */
+/* { dg-add-options arm_neon } */
+
+void
+foo (int len, float * __restrict p, float *__restrict x)
+{
+  len = len & ~31;
+  for (int i = 0; i < len; i++)
+    p[i] = p[i] / x[i];
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
diff --git a/gcc/testsuite/gcc.target/arm/neon-vect-div-2.c b/gcc/testsuite/gcc.target/arm/neon-vect-div-2.c
new file mode 100644 (file)
index 0000000..606f54b
--- /dev/null
@@ -0,0 +1,16 @@
+/* Test pattern div<mode>3.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-require-effective-target vect_hw_misalign } */
+/* { dg-options "-O3 -ftree-vectorize -funsafe-math-optimizations -fdump-tree-vect-details -fno-reciprocal-math" } */
+/* { dg-add-options arm_neon } */
+
+void
+foo (int len, float * __restrict p, float *__restrict x)
+{
+  len = len & ~31;
+  for (int i = 0; i < len; i++)
+    p[i] = p[i] / x[i];
+}
+
+/* { dg-final { scan-tree-dump-not "vectorized 1 loops" "vect" } } */
This page took 0.132513 seconds and 5 git commands to generate.