| /* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */ |
| /* { dg-options "-mdejagnu-cpu=power8 -O2" } */ |
| /* { dg-require-effective-target powerpc_p9vector_ok } */ |
| /* { dg-require-effective-target ppc_cpu_supports_hw } */ |
| |
| /* Power9 (aka, ISA 3.0) has a MODSD instruction to do modulus, while Power8 |
| (aka, ISA 2.07) has to do modulus with divide and multiply. Make sure |
| both clone functions are generated. |
| |
| Restrict ourselves to Linux, since IFUNC might not be supported in other |
| operating systems. */ |
| |
| __attribute__((target_clones("cpu=power9,default"))) |
| long mod_func (long a, long b) |
| { |
| return a % b; |
| } |
| |
| long mod_func_or (long a, long b, long c) |
| { |
| return mod_func (a, b) | c; |
| } |
| |
| /* { dg-final { scan-assembler-times {\mdivd\M} 1 } } */ |
| /* { dg-final { scan-assembler-times {\mmulld\M} 1 } } */ |
| /* { dg-final { scan-assembler-times {\mmodsd\M} 1 } } */ |