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
This commit is contained in:
Andreas Krebbel 2016-02-19 10:34:12 +00:00 committed by Andreas Krebbel
parent 9e4eb64394
commit d0a859e621
4 changed files with 34 additions and 2 deletions

View File

@ -1,3 +1,8 @@
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.

View File

@ -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);

View File

@ -1,3 +1,7 @@
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

View File

@ -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 };
}