]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PowerPC: Add power10 hwcap2 bits
authorMichael Meissner <meissner@linux.ibm.com>
Wed, 1 Jul 2020 19:42:21 +0000 (14:42 -0500)
committerPeter Bergner <bergner@linux.ibm.com>
Thu, 2 Jul 2020 17:29:07 +0000 (12:29 -0500)
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=power10.

The two new __builtin_cpu_supports tests are:
__builtin_cpu_supports ("arch_3_1")
__builtin_cpu_supports ("mma")

The bits used are the bits that the Linux kernel engineers will be using for
these new features.

2020-06-05  Michael Meissner  <meissner@linux.ibm.com>

gcc/
* config/rs6000/ppc-auxv.h (PPC_PLATFORM_POWER10): Allocate
'power10' PowerPC platform.
(PPC_FEATURE2_ARCH_3_1): New HWCAP2 bit for ARCH 3.1.
(PPC_FEATURE2_MMA): New HWCAP2 bit for MMA.
* config/rs6000/rs6000-call.c (cpu_supports_info): Add ARCH 3.1 and
MMA HWCAP2 bits.

gcc/testsuite/
* gcc.target/powerpc/clone3.c: New test for using 'power10' with
the target_clones attribute.

(cherry picked from commit 2753f2f8b4a4534ab364595ba4b8a913cc7254a7)
(cherry picked from commit 7ba33e898fa4a097c0f2b4d9cae35041a5933f9c)

gcc/config/rs6000/ppc-auxv.h
gcc/config/rs6000/rs6000-call.c
gcc/testsuite/gcc.target/powerpc/clone3.c [new file with mode: 0644]

index 323293178e71681ab6c78e65acfc2d791d23ff5e..7a5ba0ebd47a4c9a8f7e29499be343f06075ef8b 100644 (file)
@@ -48,6 +48,9 @@
 #define PPC_PLATFORM_POWER8            13
 #define PPC_PLATFORM_POWER9            14
 
+/* This is not yet official.  */
+#define PPC_PLATFORM_POWER10           15
+
 /* AT_HWCAP bits.  These must match the values defined in the Linux kernel.  */
 #define PPC_FEATURE_32              0x80000000
 #define PPC_FEATURE_64              0x40000000
@@ -93,6 +96,9 @@
 #define PPC_FEATURE2_SCV            0x00100000
 #define PPC_FEATURE2_HTM_NO_SUSPEND 0x00080000
 
+/* These are not yet official.  */
+#define PPC_FEATURE2_ARCH_3_1       0x00040000
+#define PPC_FEATURE2_MMA            0x00020000
 
 /* Thread Control Block (TCB) offsets of the AT_PLATFORM, AT_HWCAP and
    AT_HWCAP2 values.  These must match the values defined in GLIBC.  */
index e0ea0e748bde34610217c0df399dc44261c059c0..8266335b67af067d6d427626c50afd2ad3fdb7f1 100644 (file)
@@ -172,7 +172,9 @@ static const struct
   { "arch_3_00",       PPC_FEATURE2_ARCH_3_00,         1 },
   { "ieee128",         PPC_FEATURE2_HAS_IEEE128,       1 },
   { "darn",            PPC_FEATURE2_DARN,              1 },
-  { "scv",             PPC_FEATURE2_SCV,               1 }
+  { "scv",             PPC_FEATURE2_SCV,               1 },
+  { "arch_3_1",                PPC_FEATURE2_ARCH_3_1,          1 },
+  { "mma",             PPC_FEATURE2_MMA,               1 },
 };
 
 static void altivec_init_builtins (void);
diff --git a/gcc/testsuite/gcc.target/powerpc/clone3.c b/gcc/testsuite/gcc.target/powerpc/clone3.c
new file mode 100644 (file)
index 0000000..ba6edbe
--- /dev/null
@@ -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.
+
+   POWER10 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=power10,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 } } */