diff options
author | Renlin Li <Renlin.Li@arm.com> | 2015-01-13 16:25:00 +0000 |
---|---|---|
committer | Renlin Li <Renlin.Li@arm.com> | 2015-01-13 16:25:00 +0000 |
commit | 31393f2c26a390670f3ca4802389d172ff5d30d1 (patch) | |
tree | 4c3541a83d48e1bfa463f4ffdf038a106619bb35 | |
parent | dc5f6abf57cb101ab090b25eebbe31f87052777b (diff) |
[AArch64] Implement <su><maxmin>v2di3 pattern
Backport from mainline
2014-11-19 Renlin Li <renlin.li@arm.com>
gcc/:
PR target/63424
* config/aarch64/aarch64-simd.md (<su><maxmin>v2di3): New.
gcc/testsuite/:
PR target/63424
* gcc.target/aarch64/pr63424.c: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@219540 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-simd.md | 35 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr63424.c | 39 |
4 files changed, 90 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a423921f108..50c4127f91d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-01-13 Renlin Li <renlin.li@arm.com> + + Backport from mainline: + 2014-11-19 Renlin Li <renlin.li@arm.com> + + PR target/63424 + * config/aarch64/aarch64-simd.md (<su><maxmin>v2di3): New. + 2015-01-13 Oleg Endo <olegendo@gcc.gnu.org> Backport form mainline diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 30e9f60e92f..7626ed31fd6 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -934,6 +934,41 @@ [(set_attr "type" "neon_minmax<q>")] ) +(define_expand "<su><maxmin>v2di3" + [(parallel [ + (set (match_operand:V2DI 0 "register_operand" "") + (MAXMIN:V2DI (match_operand:V2DI 1 "register_operand" "") + (match_operand:V2DI 2 "register_operand" ""))) + (clobber (reg:CC CC_REGNUM))])] + "TARGET_SIMD" +{ + enum rtx_code cmp_operator; + rtx cmp_fmt; + + switch (<CODE>) + { + case UMIN: + cmp_operator = LTU; + break; + case SMIN: + cmp_operator = LT; + break; + case UMAX: + cmp_operator = GTU; + break; + case SMAX: + cmp_operator = GT; + break; + default: + gcc_unreachable (); + } + + cmp_fmt = gen_rtx_fmt_ee (cmp_operator, V2DImode, operands[1], operands[2]); + emit_insn (gen_aarch64_vcond_internalv2div2di (operands[0], operands[1], + operands[2], cmp_fmt, operands[1], operands[2])); + DONE; +}) + ;; vec_concat gives a new vector with the low elements from operand 1, and ;; the high elements from operand 2. That is to say, given op1 = { a, b } ;; op2 = { c, d }, vec_concat (op1, op2) = { a, b, c, d }. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 45452775847..b97410f22d4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-01-13 Renlin Li <renlin.li@arm.com> + + Backported from mainline + 2014-11-19 Renlin Li <renlin.li@arm.com> + + PR target/63424 + * gcc.target/aarch64/pr63424.c: New Test. + 2015-01-12 Janus Weil <janus@gcc.gnu.org> Backport from mainline diff --git a/gcc/testsuite/gcc.target/aarch64/pr63424.c b/gcc/testsuite/gcc.target/aarch64/pr63424.c new file mode 100644 index 00000000000..c6bd7626f82 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr63424.c @@ -0,0 +1,39 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +#include <stdint.h> + +uint32_t +truncate_int (const unsigned long long value) +{ + if ( value < 0 ) + { + return 0; + } + else if ( value > UINT32_MAX ) + { + return UINT32_MAX; + } + else + return (uint32_t)value; +} + +uint32_t +mul (const unsigned long long x, const unsigned long long y) +{ + uint32_t value = truncate_int (x * y); + return value; +} + +uint32_t * +test(unsigned size, uint32_t *a, uint32_t s) +{ + unsigned i; + + for (i = 0; i < size; i++) + { + a[i] = mul (a[i], s); + } + + return a; +} |