On Wed, Mar 26, 2025 at 9:23 AM Jakub Jelinek <ja...@redhat.com> wrote: > > Hi! > > In r15-4289 H.J. fixed up the pr55583.c testcase to use unsigned long long > or long long instead of unsigned long or long. That change looks correct to > me because the > void test64r () { b = ((u64)b >> n) | (a << (64 - n)); } > etc. functions otherwise aren't really 64-bit rotates, but something that > triggers UB all the time (at least one of the shifts is out of bounds). > I assume that change fixed the FAILs on -mx32, but it caused > FAIL: gcc.target/i386/pr55583.c scan-assembler-times (?n)shldl?[\\\\t > ]*\\\\\$2 1 > FAIL: gcc.target/i386/pr55583.c scan-assembler-times (?n)shrdl?[\\\\t > ]*\\\\\$2 2 > regression on i686-linux (but just for -m32 without defaulting to SSE2 or > what). The difference is that for say -m32 -march=x86-64 the stv pass > handles some of the rotates in SSE and so we get different sh[rl]dl > instruction counts from the case when SSE isn't enabled and stv pass isn't > done. > > The following patch fixes that by disabling SSE for ia32 and always testing > for the same number of instructions.
Yes, in the testsuite we (mostly) assume that ia32 lacks MMX and SSE by default. > Bootstrapped/regtested on x86_64-linux and i686-linux and tested with all of > make check-gcc > RUNTESTFLAGS='--target_board=unix\{-m32/-march=x86-64,-m32/-march=i686,-mx32,-m64\} > i386.exp=pr55583.c' > ok for trunk? > > 2025-03-26 Jakub Jelinek <ja...@redhat.com> > > PR target/55583 > PR target/119465 > * gcc.target/i386/pr55583.c: Add -mno-sse -mno-mmx to > dg-additional-options. Expect 4 shrdl and 2 shldl instructions on > ia32. OK. Thanks, Uros. > --- gcc/testsuite/gcc.target/i386/pr55583.c.jj 2024-10-12 13:47:21.966350407 > +0200 > +++ gcc/testsuite/gcc.target/i386/pr55583.c 2025-03-25 16:36:46.320986804 > +0100 > @@ -1,9 +1,8 @@ > /* { dg-do compile } */ > /* { dg-options "-O2 -Wno-shift-count-overflow" } */ > -/* { dg-final { scan-assembler-times {(?n)shrd[ql]?[\t ]*\$2} 4 { target { ! > ia32 } } } } */ > -/* { dg-final { scan-assembler-times {(?n)shrdl?[\t ]*\$2} 2 { target ia32 } > } } */ > -/* { dg-final { scan-assembler-times {(?n)shldl?[\t ]*\$2} 1 { target ia32 } > } } */ > -/* { dg-final { scan-assembler-times {(?n)shld[ql]?[\t ]*\$2} 2 { target { ! > ia32 } } } } */ > +/* { dg-additional-options "-mno-sse -mno-mmx" { target ia32 } } */ > +/* { dg-final { scan-assembler-times {(?n)shrd[ql]?[\t ]*\$2} 4 } } */ > +/* { dg-final { scan-assembler-times {(?n)shld[ql]?[\t ]*\$2} 2 } } */ > > typedef unsigned long long u64; > typedef unsigned int u32; > > Jakub >