]> git.ipfire.org Git - thirdparty/gcc.git/blob - libatomic/config/linux/aarch64/host-config.h
ac4d922ca5c03988184df06e2f871b5165013846
[thirdparty/gcc.git] / libatomic / config / linux / aarch64 / host-config.h
1 /* Copyright (C) 2017-2023 Free Software Foundation, Inc.
2
3 This file is part of the GNU Atomic Library (libatomic).
4
5 Libatomic is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 more details.
14
15 Under Section 7 of GPL version 3, you are granted additional
16 permissions described in the GCC Runtime Library Exception, version
17 3.1, as published by the Free Software Foundation.
18
19 You should have received a copy of the GNU General Public License and
20 a copy of the GCC Runtime Library Exception along with this program;
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 <http://www.gnu.org/licenses/>. */
23
24 #if HAVE_IFUNC
25 #include <sys/auxv.h>
26
27 #ifdef HWCAP_USCAT
28 # if N == 16
29 # define IFUNC_COND_1 ifunc1 (hwcap)
30 # else
31 # define IFUNC_COND_1 (hwcap & HWCAP_ATOMICS)
32 # endif
33 #else
34 # define IFUNC_COND_1 (false)
35 #endif
36 #define IFUNC_NCOND(N) (1)
37
38 #endif /* HAVE_IFUNC */
39
40 /* All 128-bit atomic functions are defined in aarch64/atomic_16.S. */
41 #if N == 16
42 # define DONE 1
43 #endif
44
45 #ifdef HWCAP_USCAT
46
47 #define MIDR_IMPLEMENTOR(midr) (((midr) >> 24) & 255)
48 #define MIDR_PARTNUM(midr) (((midr) >> 4) & 0xfff)
49
50 static inline bool
51 ifunc1 (unsigned long hwcap)
52 {
53 if (hwcap & HWCAP_USCAT)
54 return true;
55 if (!(hwcap & HWCAP_CPUID))
56 return false;
57
58 unsigned long midr;
59 asm volatile ("mrs %0, midr_el1" : "=r" (midr));
60
61 /* Neoverse N1 supports atomic 128-bit load/store. */
62 if (MIDR_IMPLEMENTOR (midr) == 'A' && MIDR_PARTNUM (midr) == 0xd0c)
63 return true;
64
65 return false;
66 }
67 #endif
68
69 #include_next <host-config.h>