]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libatomic: Improve ifunc selection on AArch64
authorWilco Dijkstra <wilco.dijkstra@arm.com>
Fri, 10 Nov 2023 14:06:50 +0000 (14:06 +0000)
committerWilco Dijkstra <wilco.dijkstra@arm.com>
Fri, 10 Nov 2023 14:19:59 +0000 (14:19 +0000)
Add support for ifunc selection based on CPUID register.  Neoverse N1 supports
atomic 128-bit load/store, so use the FEAT_USCAT ifunc like newer Neoverse
cores.

Reviewed-by: Kyrylo.Tkachov@arm.com
libatomic:
* config/linux/aarch64/host-config.h (ifunc1): Use CPUID in ifunc
selection.

libatomic/config/linux/aarch64/host-config.h

index bea26825b4f75bb8ff348ab4b5fc45f4a5bd561e..9747accd88f5881d0496f9f8104149e74bbbe268 100644 (file)
@@ -26,7 +26,7 @@
 
 #ifdef HWCAP_USCAT
 # if N == 16
-#  define IFUNC_COND_1 (hwcap & HWCAP_USCAT)
+#  define IFUNC_COND_1 ifunc1 (hwcap)
 # else
 #  define IFUNC_COND_1 (hwcap & HWCAP_ATOMICS)
 # endif
 
 #endif /* HAVE_IFUNC */
 
+#ifdef HWCAP_USCAT
+
+#define MIDR_IMPLEMENTOR(midr) (((midr) >> 24) & 255)
+#define MIDR_PARTNUM(midr)     (((midr) >> 4) & 0xfff)
+
+static inline bool
+ifunc1 (unsigned long hwcap)
+{
+  if (hwcap & HWCAP_USCAT)
+    return true;
+  if (!(hwcap & HWCAP_CPUID))
+    return false;
+
+  unsigned long midr;
+  asm volatile ("mrs %0, midr_el1" : "=r" (midr));
+
+  /* Neoverse N1 supports atomic 128-bit load/store.  */
+  if (MIDR_IMPLEMENTOR (midr) == 'A' && MIDR_PARTNUM (midr) == 0xd0c)
+    return true;
+
+  return false;
+}
+#endif
+
 #include_next <host-config.h>