On Wed, Jun 27, 2012 at 02:36:14PM -0700, Richard Henderson wrote: > As noticed by Igor Zamyatin. Committed.
> PR target/53749 > * config/i386/i386.c (ix86_rtx_costs): Fix typo vs UNITS_PER_WORD > in 2012-06-23 change. Adjust two other DImode tests as well. This change broke cost computation for vector PLUS/MINUS/AND/IOR/XOR, the vector modes are all wider than word, but they are now all handled as double word integer arithmetics. > --- > gcc/ChangeLog | 6 ++++++ > gcc/config/i386/i386.c | 8 +++----- > 2 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index edfc649..aae8a4d 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c ... > @@ -32441,7 +32440,7 @@ ix86_rtx_costs (rtx x, int code_i, int outer_code_i, > int opno, int *total, > case AND: > case IOR: > case XOR: > - if (!TARGET_64BIT && mode == DImode) > + if (GET_MODE_SIZE (mode) > UNITS_PER_WORD) > { > *total = (cost->add * 2 > + (rtx_cost (XEXP (x, 0), outer_code, opno, speed) Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2012-09-18 Jakub Jelinek <ja...@redhat.com> PR target/54592 * config/i386/i386.c (ix86_rtx_costs): Limit > UNITS_PER_WORD AND/IOR/XOR cost calculation to MODE_INT class modes. * gcc.target/i386/pr54592.c: New test. --- gcc/config/i386/i386.c.jj 2012-09-13 18:29:08.000000000 +0200 +++ gcc/config/i386/i386.c 2012-09-18 08:55:08.747028184 +0200 @@ -32792,7 +32792,8 @@ ix86_rtx_costs (rtx x, int code_i, int o case AND: case IOR: case XOR: - if (GET_MODE_SIZE (mode) > UNITS_PER_WORD) + if (GET_MODE_CLASS (mode) == MODE_INT + && GET_MODE_SIZE (mode) > UNITS_PER_WORD) { *total = (cost->add * 2 + (rtx_cost (XEXP (x, 0), outer_code, opno, speed) --- gcc/testsuite/gcc.target/i386/pr54592.c.jj 2012-09-18 09:06:09.399013382 +0200 +++ gcc/testsuite/gcc.target/i386/pr54592.c 2012-09-18 09:13:04.482914236 +0200 @@ -0,0 +1,17 @@ +/* PR target/54592 */ +/* { dg-do compile } */ +/* { dg-options "-Os -msse2" } */ +/* { dg-require-effective-target sse2 } */ + +#include <emmintrin.h> + +void +func (__m128i * foo, size_t a, size_t b, int *dst) +{ + __m128i x = foo[a]; + __m128i y = foo[b]; + __m128i sum = _mm_add_epi32 (x, y); + *dst = _mm_cvtsi128_si32 (sum); +} + +/* { dg-final { scan-assembler "paddd\[^\n\r\]*(\\(\[^\n\r\]*\\)|XMMWORD PTR)" } } */ Jakub