neon.md (div<mode>3): New pattern.
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
This commit is contained in:
parent
41f8d1fc01
commit
536ecfc44b
5 changed files with 73 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -620,6 +620,38 @@
|
|||
(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")
|
||||
|
|
|
@ -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.
|
||||
|
|
16
gcc/testsuite/gcc.target/arm/neon-vect-div-1.c
Normal file
16
gcc/testsuite/gcc.target/arm/neon-vect-div-1.c
Normal file
|
@ -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" } } */
|
16
gcc/testsuite/gcc.target/arm/neon-vect-div-2.c
Normal file
16
gcc/testsuite/gcc.target/arm/neon-vect-div-2.c
Normal file
|
@ -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" } } */
|
Loading…
Add table
Reference in a new issue