On 27/12/2024 17:01, Torbjörn SVENSSON wrote: > Ok for trunk? > > -- > > This change will enforce that the expected instructions are generated > per function rather than allowing some other function to use the > expected instructions. > > gcc/testsuite/ChangeLog: > > * gcc.target/arm/armv8_2-fp16-conv-1.c: Convert > scan-assembler-times to check-function-bodies. > > Signed-off-by: Torbjörn SVENSSON <torbjorn.svens...@foss.st.com>
I'd recommend that you also add "-fno-schedule-insns -fno-schedule-insns2" to dg-options to avoid the risk of the scheduler moving code around and breaking the sequences. OK with that change. R. > --- > .../gcc.target/arm/armv8_2-fp16-conv-1.c | 99 ++++++++++++++++--- > 1 file changed, 83 insertions(+), 16 deletions(-) > > diff --git a/gcc/testsuite/gcc.target/arm/armv8_2-fp16-conv-1.c > b/gcc/testsuite/gcc.target/arm/armv8_2-fp16-conv-1.c > index c9639a542ae..279aafbc7b4 100644 > --- a/gcc/testsuite/gcc.target/arm/armv8_2-fp16-conv-1.c > +++ b/gcc/testsuite/gcc.target/arm/armv8_2-fp16-conv-1.c > @@ -2,100 +2,167 @@ > /* { dg-require-effective-target arm_v8_2a_fp16_scalar_ok } */ > /* { dg-options "-O2" } */ > /* { dg-add-options arm_v8_2a_fp16_scalar } */ > +/* { dg-final { check-function-bodies "**" "" } } */ > > /* Test ARMv8.2 FP16 conversions. */ > #include <arm_fp16.h> > > +/* > +** f16_to_f32: > +** ... > +** vcvtb\.f32\.f16 (s[0-9]+), \1 > +** ... > +*/ > float > f16_to_f32 (__fp16 a) > { > return (float)a; > } > > +/* > +** f16_to_pf32: > +** ... > +** vcvtb\.f32\.f16 (s[0-9]+), \1 > +** ... > +*/ > float > f16_to_pf32 (__fp16* a) > { > return (float)*a; > } > > +/* > +** f16_to_s16: > +** ... > +** vcvtb\.f32\.f16 (s[0-9]+), \1 > +** vcvt\.s32\.f32 \1, \1 > +** ... > +*/ > short > f16_to_s16 (__fp16 a) > { > return (short)a; > } > > +/* > +** pf16_to_s16: > +** ... > +** vcvtb\.f32\.f16 (s[0-9]+), \1 > +** vcvt\.s32\.f32 \1, \1 > +** ... > +*/ > short > pf16_to_s16 (__fp16* a) > { > return (short)*a; > } > > -/* { dg-final { scan-assembler-times {vcvtb\.f32\.f16\ts[0-9]+, s[0-9]+} 4 } > } */ > - > +/* > +** f32_to_f16: > +** ... > +** vcvtb\.f16\.f32 (s[0-9]+), \1 > +** ... > +*/ > __fp16 > f32_to_f16 (float a) > { > return (__fp16)a; > } > > +/* > +** f32_to_pf16: > +** ... > +** vcvtb\.f16\.f32 (s[0-9]+), \1 > +** ... > +*/ > void > f32_to_pf16 (__fp16* x, float a) > { > *x = (__fp16)a; > } > > +/* > +** s16_to_f16: > +** ... > +** vcvt\.f32\.s32 (s[0-9]+), \1 > +** vcvtb\.f16\.f32 \1, \1 > +** ... > +*/ > __fp16 > s16_to_f16 (short a) > { > return (__fp16)a; > } > > +/* > +** s16_to_pf16: > +** ... > +** vcvt\.f32\.s32 (s[0-9]+), \1 > +** vcvtb\.f16\.f32 \1, \1 > +** ... > +*/ > void > s16_to_pf16 (__fp16* x, short a) > { > *x = (__fp16)a; > } > > -/* { dg-final { scan-assembler-times {vcvtb\.f16\.f32\ts[0-9]+, s[0-9]+} 4 } > } */ > - > +/* > +** s16_to_f32: > +** ... > +** vcvt\.f32\.s32 (s[0-9]+), \1 > +** ... > +*/ > float > s16_to_f32 (short a) > { > return (float)a; > } > > -/* { dg-final { scan-assembler-times {vcvt\.f32\.s32\ts[0-9]+, s[0-9]+} 3 } > } */ > - > +/* > +** f32_to_s16: > +** ... > +** vcvt\.s32\.f32 (s[0-9]+), \1 > +** ... > +*/ > short > f32_to_s16 (float a) > { > return (short)a; > } > > -/* { dg-final { scan-assembler-times {vcvt\.s32\.f32\ts[0-9]+, s[0-9]+} 3 } > } */ > - > +/* > +** f32_to_u16: > +** ... > +** vcvt\.u32\.f32 (s[0-9]+), \1 > +** ... > +*/ > unsigned short > f32_to_u16 (float a) > { > return (unsigned short)a; > } > > -/* { dg-final { scan-assembler-times {vcvt\.u32\.f32\ts[0-9]+, s[0-9]+} 1 } > } */ > - > +/* > +** f64_to_s16: > +** ... > +** vcvt\.s32\.f64 s[0-9]+, d[0-9]+ > +** ... > +*/ > short > f64_to_s16 (double a) > { > return (short)a; > } > > -/* { dg-final { scan-assembler-times {vcvt\.s32\.f64\ts[0-9]+, d[0-9]+} 1 } > } */ > - > +/* > +** f64_to_s16: > +** ... > +** vcvt\.s32\.f64 s[0-9]+, d[0-9]+ > +** ... > +*/ > unsigned short > f64_to_u16 (double a) > { > return (unsigned short)a; > } > - > -/* { dg-final { scan-assembler-times {vcvt\.s32\.f64\ts[0-9]+, d[0-9]+} 1 } > } */ > - > -