From 2753f2f8b4a4534ab364595ba4b8a913cc7254a7 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Tue, 9 Jun 2020 15:32:52 -0500 Subject: [PATCH] PowerPC: Add future hwcap2 bits This patch adds support for the two new HWCAP2 fields used by the __builtin_cpu_supports function. It adds support in the target_clones attribute for -mcpu=future. The two new __builtin_cpu_supports tests are: __builtin_cpu_supports ("isa_3_1") __builtin_cpu_supports ("mma") The bits used are the bits that the Linux kernel engineers will be using for these new features. testsuite/ 2020-06-05 Michael Meissner * gcc.target/powerpc/clone3.c: New test for using 'future' with the target_clones attribute. --- gcc/testsuite/gcc.target/powerpc/clone3.c | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 gcc/testsuite/gcc.target/powerpc/clone3.c diff --git a/gcc/testsuite/gcc.target/powerpc/clone3.c b/gcc/testsuite/gcc.target/powerpc/clone3.c new file mode 100644 index 0000000..93ee41d --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/clone3.c @@ -0,0 +1,33 @@ +/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */ +/* { dg-options "-mdejagnu-cpu=power8 -O2" } */ +/* { dg-require-effective-target powerpc_pcrel } */ +/* { 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. + + FUTURE has pc-relative instructions to access static values, while earlier + systems used TOC addressing. + + Restrict ourselves to Linux, since IFUNC might not be supported in other + operating systems. */ + +static long s; +long *p = &s; + +__attribute__((target_clones("cpu=future,cpu=power9,default"))) +long mod_func (long a, long b) +{ + return (a % b) + s; +} + +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} 2 } } */ +/* { dg-final { scan-assembler-times {\mpld\M} 1 } } */ -- 2.7.4