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:
parent
9e4eb64394
commit
d0a859e621
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
23
gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c
Normal file
23
gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c
Normal 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 };
|
||||
}
|
Loading…
Reference in New Issue
Block a user