annotate libatomic/config/linux/arm/host-config.h @ 116:367f9f4f266e

fix gimple.h
author mir3636
date Tue, 28 Nov 2017 20:22:01 +0900
parents 04ced10e8804
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Copyright (C) 2012-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
2 Contributed by Richard Henderson <rth@redhat.com>.
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of the GNU Atomic Library (libatomic).
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 Libatomic is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
7 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
8 the Free Software Foundation; either version 3 of the License, or
kono
parents:
diff changeset
9 (at your option) any later version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
kono
parents:
diff changeset
13 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
kono
parents:
diff changeset
14 more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
17 permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
18 3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
21 a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
23 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 #include <config/arm/arm-config.h>
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 /* Kernel helper for 32-bit compare-and-exchange. */
kono
parents:
diff changeset
29 typedef int (__kernel_cmpxchg_t) (UWORD oldval, UWORD newval, UWORD *ptr);
kono
parents:
diff changeset
30 #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 /* Kernel helper for 64-bit compare-and-exchange. */
kono
parents:
diff changeset
33 typedef int (__kernel_cmpxchg64_t) (const U_8 * oldval, const U_8 * newval,
kono
parents:
diff changeset
34 U_8 *ptr);
kono
parents:
diff changeset
35 #define __kernel_cmpxchg64 (*(__kernel_cmpxchg64_t *) 0xffff0f60)
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /* Kernel helper for memory barrier. */
kono
parents:
diff changeset
38 typedef void (__kernel_dmb_t) (void);
kono
parents:
diff changeset
39 #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0)
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 /* Kernel helper page version number. */
kono
parents:
diff changeset
42 #define __kernel_helper_version (*(unsigned int *)0xffff0ffc)
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 #ifndef HAVE_STREX
kono
parents:
diff changeset
46 static inline bool
kono
parents:
diff changeset
47 atomic_compare_exchange_w (UWORD *mptr, UWORD *eptr, UWORD newval,
kono
parents:
diff changeset
48 bool weak_p UNUSED, int sm UNUSED, int fm UNUSED)
kono
parents:
diff changeset
49 {
kono
parents:
diff changeset
50 bool ret = true;
kono
parents:
diff changeset
51 UWORD oldval;
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 oldval = *eptr;
kono
parents:
diff changeset
54 if (__builtin_expect (__kernel_cmpxchg (oldval, newval, mptr) != 0, 0))
kono
parents:
diff changeset
55 {
kono
parents:
diff changeset
56 oldval = *mptr;
kono
parents:
diff changeset
57 ret = false;
kono
parents:
diff changeset
58 }
kono
parents:
diff changeset
59 *eptr = oldval;
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 return ret;
kono
parents:
diff changeset
62 }
kono
parents:
diff changeset
63 # define atomic_compare_exchange_w atomic_compare_exchange_w
kono
parents:
diff changeset
64 # if N == WORDSIZE
kono
parents:
diff changeset
65 # define atomic_compare_exchange_n atomic_compare_exchange_w
kono
parents:
diff changeset
66 # endif
kono
parents:
diff changeset
67 #endif /* HAVE_STREX */
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 #if !defined(HAVE_STREXBHD) && defined(HAVE_KERNEL64) && N == 8
kono
parents:
diff changeset
70 static inline bool
kono
parents:
diff changeset
71 atomic_compare_exchange_n (UTYPE *mptr, UTYPE *eptr, UTYPE newval,
kono
parents:
diff changeset
72 bool weak_p UNUSED, int sm UNUSED, int fm UNUSED)
kono
parents:
diff changeset
73 {
kono
parents:
diff changeset
74 if (__kernel_cmpxchg64 (eptr, &newval, mptr) == 0)
kono
parents:
diff changeset
75 return true;
kono
parents:
diff changeset
76 else
kono
parents:
diff changeset
77 {
kono
parents:
diff changeset
78 *eptr = *mptr;
kono
parents:
diff changeset
79 return false;
kono
parents:
diff changeset
80 }
kono
parents:
diff changeset
81 }
kono
parents:
diff changeset
82 #define atomic_compare_exchange_n atomic_compare_exchange_n
kono
parents:
diff changeset
83 #endif
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 #if !defined(HAVE_DMB) && !defined(HAVE_DMB_MCR)
kono
parents:
diff changeset
86 static inline void
kono
parents:
diff changeset
87 pre_barrier(int model UNUSED)
kono
parents:
diff changeset
88 {
kono
parents:
diff changeset
89 __kernel_dmb ();
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 static inline void
kono
parents:
diff changeset
93 post_barrier(int model UNUSED)
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 __kernel_dmb ();
kono
parents:
diff changeset
96 }
kono
parents:
diff changeset
97 # define pre_post_barrier 1
kono
parents:
diff changeset
98 #endif /* !HAVE_DMB */
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 #if HAVE_IFUNC
kono
parents:
diff changeset
101 extern bool libat_have_strexbhd HIDDEN;
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 # define IFUNC_COND_1 libat_have_strexbhd
kono
parents:
diff changeset
104 # define IFUNC_COND_2 (__kernel_helper_version >= 5)
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 /* Alternative 1 is -march=armv7-a -- we have everything native. */
kono
parents:
diff changeset
107 # if IFUNC_ALT == 1
kono
parents:
diff changeset
108 # undef HAVE_ATOMIC_CAS_1
kono
parents:
diff changeset
109 # undef HAVE_ATOMIC_CAS_2
kono
parents:
diff changeset
110 # undef HAVE_ATOMIC_CAS_4
kono
parents:
diff changeset
111 # undef HAVE_ATOMIC_CAS_8
kono
parents:
diff changeset
112 # undef HAVE_ATOMIC_EXCHANGE_1
kono
parents:
diff changeset
113 # undef HAVE_ATOMIC_EXCHANGE_2
kono
parents:
diff changeset
114 # undef HAVE_ATOMIC_EXCHANGE_4
kono
parents:
diff changeset
115 # undef HAVE_ATOMIC_EXCHANGE_8
kono
parents:
diff changeset
116 # undef HAVE_ATOMIC_LDST_1
kono
parents:
diff changeset
117 # undef HAVE_ATOMIC_LDST_2
kono
parents:
diff changeset
118 # undef HAVE_ATOMIC_LDST_4
kono
parents:
diff changeset
119 # undef HAVE_ATOMIC_LDST_8
kono
parents:
diff changeset
120 # undef HAVE_ATOMIC_FETCH_OP_1
kono
parents:
diff changeset
121 # undef HAVE_ATOMIC_FETCH_OP_2
kono
parents:
diff changeset
122 # undef HAVE_ATOMIC_FETCH_OP_4
kono
parents:
diff changeset
123 # undef HAVE_ATOMIC_FETCH_OP_8
kono
parents:
diff changeset
124 # undef HAVE_ATOMIC_TAS_1
kono
parents:
diff changeset
125 # undef HAVE_ATOMIC_TAS_2
kono
parents:
diff changeset
126 # undef HAVE_ATOMIC_TAS_4
kono
parents:
diff changeset
127 # undef HAVE_ATOMIC_TAS_8
kono
parents:
diff changeset
128 # define HAVE_ATOMIC_CAS_1 1
kono
parents:
diff changeset
129 # define HAVE_ATOMIC_CAS_2 1
kono
parents:
diff changeset
130 # define HAVE_ATOMIC_CAS_4 1
kono
parents:
diff changeset
131 # define HAVE_ATOMIC_CAS_8 1
kono
parents:
diff changeset
132 # define HAVE_ATOMIC_EXCHANGE_1 1
kono
parents:
diff changeset
133 # define HAVE_ATOMIC_EXCHANGE_2 1
kono
parents:
diff changeset
134 # define HAVE_ATOMIC_EXCHANGE_4 1
kono
parents:
diff changeset
135 # define HAVE_ATOMIC_EXCHANGE_8 1
kono
parents:
diff changeset
136 # define HAVE_ATOMIC_LDST_1 1
kono
parents:
diff changeset
137 # define HAVE_ATOMIC_LDST_2 1
kono
parents:
diff changeset
138 # define HAVE_ATOMIC_LDST_4 1
kono
parents:
diff changeset
139 # define HAVE_ATOMIC_LDST_8 1
kono
parents:
diff changeset
140 # define HAVE_ATOMIC_FETCH_OP_1 1
kono
parents:
diff changeset
141 # define HAVE_ATOMIC_FETCH_OP_2 1
kono
parents:
diff changeset
142 # define HAVE_ATOMIC_FETCH_OP_4 1
kono
parents:
diff changeset
143 # define HAVE_ATOMIC_FETCH_OP_8 1
kono
parents:
diff changeset
144 # define HAVE_ATOMIC_TAS_1 1
kono
parents:
diff changeset
145 # define HAVE_ATOMIC_TAS_2 1
kono
parents:
diff changeset
146 # define HAVE_ATOMIC_TAS_4 1
kono
parents:
diff changeset
147 # define HAVE_ATOMIC_TAS_8 1
kono
parents:
diff changeset
148 # endif /* IFUNC_ALT == 1 */
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 # undef MAYBE_HAVE_ATOMIC_CAS_1
kono
parents:
diff changeset
151 # define MAYBE_HAVE_ATOMIC_CAS_1 IFUNC_COND_1
kono
parents:
diff changeset
152 # undef MAYBE_HAVE_ATOMIC_EXCHANGE_1
kono
parents:
diff changeset
153 # define MAYBE_HAVE_ATOMIC_EXCHANGE_1 MAYBE_HAVE_ATOMIC_CAS_1
kono
parents:
diff changeset
154 # undef MAYBE_HAVE_ATOMIC_LDST_1
kono
parents:
diff changeset
155 # define MAYBE_HAVE_ATOMIC_LDST_1 MAYBE_HAVE_ATOMIC_CAS_1
kono
parents:
diff changeset
156 # undef MAYBE_HAVE_ATOMIC_CAS_2
kono
parents:
diff changeset
157 # define MAYBE_HAVE_ATOMIC_CAS_2 IFUNC_COND_1
kono
parents:
diff changeset
158 # undef MAYBE_HAVE_ATOMIC_EXCHANGE_2
kono
parents:
diff changeset
159 # define MAYBE_HAVE_ATOMIC_EXCHANGE_2 MAYBE_HAVE_ATOMIC_CAS_2
kono
parents:
diff changeset
160 # undef MAYBE_HAVE_ATOMIC_LDST_2
kono
parents:
diff changeset
161 # define MAYBE_HAVE_ATOMIC_LDST_2 MAYBE_HAVE_ATOMIC_CAS_2
kono
parents:
diff changeset
162 # undef MAYBE_HAVE_ATOMIC_CAS_4
kono
parents:
diff changeset
163 # define MAYBE_HAVE_ATOMIC_CAS_4 IFUNC_COND_1
kono
parents:
diff changeset
164 # undef MAYBE_HAVE_ATOMIC_EXCHANGE_4
kono
parents:
diff changeset
165 # define MAYBE_HAVE_ATOMIC_EXCHANGE_4 MAYBE_HAVE_ATOMIC_CAS_4
kono
parents:
diff changeset
166 # undef MAYBE_HAVE_ATOMIC_LDST_4
kono
parents:
diff changeset
167 # define MAYBE_HAVE_ATOMIC_LDST_4 MAYBE_HAVE_ATOMIC_CAS_4
kono
parents:
diff changeset
168 # undef MAYBE_HAVE_ATOMIC_CAS_8
kono
parents:
diff changeset
169 # define MAYBE_HAVE_ATOMIC_CAS_8 (IFUNC_COND_1 | IFUNC_COND_2)
kono
parents:
diff changeset
170 # undef MAYBE_HAVE_ATOMIC_EXCHANGE_8
kono
parents:
diff changeset
171 # define MAYBE_HAVE_ATOMIC_EXCHANGE_8 MAYBE_HAVE_ATOMIC_CAS_8
kono
parents:
diff changeset
172 # undef MAYBE_HAVE_ATOMIC_LDST_8
kono
parents:
diff changeset
173 # define MAYBE_HAVE_ATOMIC_LDST_8 MAYBE_HAVE_ATOMIC_CAS_8
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 # define IFUNC_NCOND(N) (N == 8 ? 2 : 1)
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 #endif /* HAVE_IFUNC */
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 #include_next <host-config.h>