/* { dg-require-effective-target int128 } */ /* { dg-require-effective-target power10_ok } */ /* { dg-options "-mdejagnu-cpu=power10 -O2" } */ /* PR target/104694 involved GCC generating vextsd2q to convent long long to __int128_t when the long long value was in the GPR register. This test verifies that if the result is in the Altivec registers, we still want to generate vextsd2q. We use __int128_t to indicate that we want the result of the conversion to be in an Altivec register. */ void do_div_1 (__int128_t *p, __int128_t *q, long long r) { *p = *q / r; /* mtvsrdd, vextsd2q, vdivsq. */ } /* Test the optimization in vsx.md to use lxvrdx instead of ld and mtvsrdd if the value is coming from memory. */ void do_div_2 (__int128_t *p, __int128_t *q, long long *r) { *p = *q / r[2]; /* lxvrdx, vextsd2q, vdivsq. */ } /* { dg-final { scan-assembler-not {\mld\M} } } */ /* { dg-final { scan-assembler-not {\mmfvsrd\M} } } */ /* { dg-final { scan-assembler-not {\mmfvsrld\M} } } */ /* { dg-final { scan-assembler-not {\msradi\M} } } */ /* { dg-final { scan-assembler-times {\mlxv\M} 2 } } */ /* { dg-final { scan-assembler-times {\mlxvrdx\M} 1 } } */ /* { dg-final { scan-assembler-times {\mmtvsrdd\M} 1 } } */ /* { dg-final { scan-assembler-times {\mstxv\M} 2 } } */ /* { dg-final { scan-assembler-times {\mvdivsq\M} 2 } } */ /* { dg-final { scan-assembler-times {\mvextsd2q\M} 2 } } */