On 11/07/2024 19:31, Richard Sandiford wrote: > These tests used to generate: > > bl swap > ldr r2, [sp, #4] > mov r0, r2 @ __fp16 > > but g:9d20529d94b23275885f380d155fe8671ab5353a means that we can > load directly into r0: > > bl swap > ldrh r0, [sp, #4] @ __fp16 > > This patch updates the tests to "defend" this change. > > While there, the scans include: > > mov\tr1, r[03]} > > But if the spill of r2 occurs first, there's no real reason why > r2 couldn't be used as the temporary, instead r3. > > The patch tries to update the scans while preserving the spirit > of the originals. > > Spot-checked with armv8l-unknown-linux-gnueabihf. OK to install? > > Richard
OK. I'm not sure that these tests are really doing very much; it would probably be better if they could be rewritten using the gcc.target/arm/aapcs framework. But that's for another day. R. > > > gcc/testsuite/ > * gcc.target/arm/fp16-aapcs-2.c: Expect the return value to be > loaded directly from the stack. Test that the swap generates > two moves out of r0/r1 and two moves in. > * gcc.target/arm/fp16-aapcs-4.c: Likewise. > --- > gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c | 8 +++++--- > gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c | 8 +++++--- > 2 files changed, 10 insertions(+), 6 deletions(-) > > diff --git a/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c > b/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c > index c34387f5782..12d20560f53 100644 > --- a/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c > +++ b/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c > @@ -16,6 +16,8 @@ F (__fp16 a, __fp16 b, __fp16 c) > return c; > } > > -/* { dg-final { scan-assembler-times {mov\tr[0-9]+, r[0-2]} 3 } } */ > -/* { dg-final { scan-assembler-times {mov\tr1, r[03]} 1 } } */ > -/* { dg-final { scan-assembler-times {mov\tr0, r[0-9]+} 2 } } */ > +/* The swap must include two moves out of r0/r1 and two moves in. */ > +/* { dg-final { scan-assembler-times {mov\tr[0-9]+, r[01]} 2 } } */ > +/* { dg-final { scan-assembler-times {mov\tr[01], r[0-9]+} 2 } } */ > +/* c should be spilled around the call. */ > +/* { dg-final { scan-assembler {str\tr2, ([^\n]*).*ldrh\tr0, \1} { target > arm_little_endian } } } */ > diff --git a/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c > b/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c > index daac29137ae..09fa64aa494 100644 > --- a/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c > +++ b/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c > @@ -16,6 +16,8 @@ F (__fp16 a, __fp16 b, __fp16 c) > return c; > } > > -/* { dg-final { scan-assembler-times {mov\tr[0-9]+, r[0-2]} 3 } } */ > -/* { dg-final { scan-assembler-times {mov\tr1, r[03]} 1 } } */ > -/* { dg-final { scan-assembler-times {mov\tr0, r[0-9]+} 2 } } */ > +/* The swap must include two moves out of r0/r1 and two moves in. */ > +/* { dg-final { scan-assembler-times {mov\tr[0-9]+, r[01]} 2 } } */ > +/* { dg-final { scan-assembler-times {mov\tr[01], r[0-9]+} 2 } } */ > +/* c should be spilled around the call. */ > +/* { dg-final { scan-assembler {str\tr2, ([^\n]*).*ldrh\tr0, \1} { target > arm_little_endian } } } */