From: Bill Schmidt Date: Wed, 5 Feb 2014 20:15:57 +0000 (+0000) Subject: altivec.md (altivec_vsum2sws): Adjust code generation for -maltivec=be. X-Git-Tag: releases/gcc-4.9.0~1073 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7b1cd42745480867c3cea144595b76914eca7d6a;p=thirdparty%2Fgcc.git altivec.md (altivec_vsum2sws): Adjust code generation for -maltivec=be. gcc: 2014-02-05 Bill Schmidt * config/rs6000/altivec.md (altivec_vsum2sws): Adjust code generation for -maltivec=be. (altivec_vsumsws): Simplify redundant test. gcc/testsuite: 2014-02-05 Bill Schmidt * gcc.dg/vmx/sum2s.c: New. * gcc.dg/vmx/sum2s-be-order.c: New. From-SVN: r207521 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d11ae492499..8bfc47abedab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-02-05 Bill Schmidt + + * config/rs6000/altivec.md (altivec_vsum2sws): Adjust code + generation for -maltivec=be. + (altivec_vsumsws): Simplify redundant test. + 2014-02-05 Bill Schmidt * altivec.md (UNSPEC_VPACK_UNS_UNS_MOD_DIRECT): New unspec. diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 6d7898884a4e..c6d5eaec655e 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -1605,15 +1605,29 @@ "vsum4ss %0,%1,%2" [(set_attr "type" "veccomplex")]) +;; FIXME: For the following two patterns, the scratch should only be +;; allocated for !VECTOR_ELT_ORDER_BIG, and the instructions should +;; be emitted separately. (define_insn "altivec_vsum2sws" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v") (match_operand:V4SI 2 "register_operand" "v")] UNSPEC_VSUM2SWS)) - (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))] + (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR)) + (clobber (match_scratch:V4SI 3 "=v"))] "TARGET_ALTIVEC" - "vsum2sws %0,%1,%2" - [(set_attr "type" "veccomplex")]) +{ + if (VECTOR_ELT_ORDER_BIG) + return "vsum2sws %0,%1,%2"; + else + return "vsldoi %3,%2,%2,12\n\tvsum2sws %3,%1,%3\n\tvsldoi %0,%3,%3,4"; +} + [(set_attr "type" "veccomplex") + (set (attr "length") + (if_then_else + (match_test "VECTOR_ELT_ORDER_BIG") + (const_string "4") + (const_string "12")))]) (define_insn "altivec_vsumsws" [(set (match_operand:V4SI 0 "register_operand" "=v") @@ -1624,7 +1638,7 @@ (clobber (match_scratch:V4SI 3 "=v"))] "TARGET_ALTIVEC" { - if (BYTES_BIG_ENDIAN || VECTOR_ELT_ORDER_BIG) + if (VECTOR_ELT_ORDER_BIG) return "vsumsws %0,%1,%2"; else return "vspltw %3,%2,0\n\tvsumsws %3,%1,%3\n\tvspltw %0,%3,3"; @@ -1632,7 +1646,7 @@ [(set_attr "type" "veccomplex") (set (attr "length") (if_then_else - (match_test "(BYTES_BIG_ENDIAN || VECTOR_ELT_ORDER_BIG)") + (match_test "(VECTOR_ELT_ORDER_BIG)") (const_string "4") (const_string "12")))]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7a57477f950b..c81a00dfbaab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-05 Bill Schmidt + + * gcc.dg/vmx/sum2s.c: New. + * gcc.dg/vmx/sum2s-be-order.c: New. + 2014-02-05 Bill Schmidt * gcc.dg/vmx/pack.c: New. diff --git a/gcc/testsuite/gcc.dg/vmx/sum2s-be-order.c b/gcc/testsuite/gcc.dg/vmx/sum2s-be-order.c new file mode 100644 index 000000000000..0981cc1d52b7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vmx/sum2s-be-order.c @@ -0,0 +1,19 @@ +/* { dg-options "-maltivec=be -mabi=altivec -std=gnu99 -mno-vsx" } */ + +#include "harness.h" + +static void test() +{ + vector signed int vsia = {-10,1,2,3}; + vector signed int vsib = {100,101,102,-103}; + vector signed int vsir; +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + vector signed int vsier = {91,0,107,0}; +#else + vector signed int vsier = {0,92,0,-98}; +#endif + + vsir = vec_sum2s (vsia, vsib); + + check (vec_all_eq (vsir, vsier), "vsir"); +} diff --git a/gcc/testsuite/gcc.dg/vmx/sum2s.c b/gcc/testsuite/gcc.dg/vmx/sum2s.c new file mode 100644 index 000000000000..ded05be849cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/vmx/sum2s.c @@ -0,0 +1,13 @@ +#include "harness.h" + +static void test() +{ + vector signed int vsia = {-10,1,2,3}; + vector signed int vsib = {100,101,102,-103}; + vector signed int vsir; + vector signed int vsier = {0,92,0,-98}; + + vsir = vec_sum2s (vsia, vsib); + + check (vec_all_eq (vsir, vsier), "vsir"); +}