diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2016-02-19 10:34:12 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2016-02-19 10:34:12 +0000 |
commit | d0a859e621fad9894d5d29b8afd639d777c0626a (patch) | |
tree | dde2741f8e23153d07cb53d29cbbdc1540978313 | |
parent | 9e4eb6439435259b7cf5c7e2ea39d402f8028c7c (diff) | |
download | gcc-d0a859e621fad9894d5d29b8afd639d777c0626a.zip gcc-d0a859e621fad9894d5d29b8afd639d777c0626a.tar.gz gcc-d0a859e621fad9894d5d29b8afd639d777c0626a.tar.bz2 |
S/390: z13 fix mode in vcond expansion
For floating point vector compares the target mode is an integer mode
which accidently was used as register mode when forcing the compare
operands into regs.
gcc/ChangeLog:
* config/s390/s390.c (s390_expand_vcond): Use the compare operand
mode.
gcc/testsuite/ChangeLog:
* gcc.target/s390/vector/vec-vcond-1.c: New test.
From-SVN: r233552
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c | 23 |
4 files changed, 34 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6c0aa9..1378f5b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2016-02-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + * config/s390/s390.c (s390_expand_vcond): Use the compare operand + mode. + +2016-02-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + * config/s390/s390-protos.h: Add s390_expand_vec_movstr prototype. * config/s390/s390.c (s390_expand_vec_movstr): New function. * config/s390/s390.md ("movstr<P:mode>"): Call diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index da05a04..cd53b15 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -6329,10 +6329,10 @@ s390_expand_vcond (rtx target, rtx then, rtx els, can be handled by the optimization above but not by the following code. Hence, force them into registers here. */ if (!REG_P (cmp_op1)) - cmp_op1 = force_reg (target_mode, cmp_op1); + cmp_op1 = force_reg (GET_MODE (cmp_op1), cmp_op1); if (!REG_P (cmp_op2)) - cmp_op2 = force_reg (target_mode, cmp_op2); + cmp_op2 = force_reg (GET_MODE (cmp_op2), cmp_op2); s390_expand_vec_compare (result_target, cond, cmp_op1, cmp_op2); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2c1567a..abb2ed6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2016-02-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + * gcc.target/s390/vector/vec-vcond-1.c: New test. + +2016-02-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + * gcc.target/s390/md/movstr-1.c: Allow also the z13 strings instruction pattern name to prevent the testcase from failing with -march=z13. diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c b/gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c new file mode 100644 index 0000000..ec65c6f --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c @@ -0,0 +1,23 @@ +/* A const vector operand is forced into a register in + s390_expand_vcond. + This testcase once failed because the target mode (v2di) was picked + for the reg instead of the mode of the other comparison + operand. */ + +/* { dg-do compile { target { s390*-*-* } } } */ +/* { dg-options "-O3 -mzarch -march=z13" } */ + +typedef __attribute__((vector_size(16))) long v2di; +typedef __attribute__((vector_size(16))) double v2df; + +v2di +foo (v2df a) +{ + return a == (v2df){ 0.0, 0.0 }; +} + +v2di +bar (v2df a) +{ + return (v2df){ 1.0, 1.0 } == (v2df){ 0.0, 0.0 }; +} |