From: Ramana Radhakrishnan <Ramana.Radhakrishnan@arm.com>
To: Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>,
gcc Patches <gcc-patches@gcc.gnu.org>,
Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>
Cc: nd <nd@arm.com>
Subject: Re: [ARM] Implement division using vrecpe, vrecps
Date: Mon, 05 Nov 2018 13:52:00 -0000 [thread overview]
Message-ID: <7864ec3e-3bc3-383d-7632-a043fbf95adc@arm.com> (raw)
In-Reply-To: <CAAgBjMkZheX1ZczGwg9dZy21YfdNg64n4uvXA=PQZrdV_MxDNw@mail.gmail.com>
On 26/10/2018 06:04, Prathamesh Kulkarni wrote:
> Hi,
> This is a rebased version of patch that adds a pattern to neon.md for
> implementing division with multiplication by reciprocal using
> vrecpe/vrecps with -funsafe-math-optimizations excluding -Os.
> The newly added test-cases are not vectorized on armeb target with
> -O2. I posted the analysis for that here:
> https://gcc.gnu.org/ml/gcc-patches/2016-05/msg01765.html
>
> Briefly, the difference between little and big-endian vectorizer is in
> arm_builtin_support_vector_misalignment() which calls
> default_builtin_support_vector_misalignment() for big-endian case, and
> that returns false because
> movmisalign_optab does not exist for V2SF mode. This isn't observed
> with -O3 because loop peeling for alignment gets enabled.
>
> It seems that the test cases in patch appear unsupported on armeb,
> after r221677 thus this patch requires no changes to
> target-supports.exp to adjust for armeb (unlike last time which
> stalled the patch).
>
> Bootstrap+tested on arm-linux-gnueabihf.
> Cross-tested on arm*-*-* variants.
> OK for trunk ?
>
> Thanks,
> Prathamesh
>
>
> tcwg-319-3.txt
>
> 2018-10-26 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.
>
> diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
> index 5aeee4b08c1..25ed45d381a 100644
> --- a/gcc/config/arm/neon.md
> +++ b/gcc/config/arm/neon.md
> @@ -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_unsafe_math_optimizations && flag_reciprocal_math"
I would prefer this to be more granular than
flag_unsafe_math_optimization && flag_reciprocal_math which really is
flag_reciprocal_math as it is turned on by default with
funsafe-math-optimizations.
I think this should really be just flag_reciprocal_math.
Otherwise ok.
regards
Ramana
> + {
> + 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")
> 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
> index 00000000000..50d04b4175b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon-vect-div-1.c
> @@ -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
> index 00000000000..606f54b4e0e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon-vect-div-2.c
> @@ -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" } } */
>
next prev parent reply other threads:[~2018-11-05 13:52 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-26 6:36 Prathamesh Kulkarni
2018-11-02 9:39 ` Prathamesh Kulkarni
2018-11-05 13:52 ` Ramana Radhakrishnan [this message]
2018-11-09 6:44 ` Prathamesh Kulkarni
2018-11-02 13:38 Wilco Dijkstra
2018-11-05 4:55 ` Prathamesh Kulkarni
2018-11-05 13:35 ` Wilco Dijkstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7864ec3e-3bc3-383d-7632-a043fbf95adc@arm.com \
--to=ramana.radhakrishnan@arm.com \
--cc=Kyrylo.Tkachov@arm.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=nd@arm.com \
--cc=prathamesh.kulkarni@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).