authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-11-21 12:43:20-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-11-21 17:17:02-07:00
log58430ae6d14a0fa266b9afc892b7057dda638aed
treee40ea602beeb77d01f331fc3cf63202a6ce56a5b
parent95ee8ab77da6b76729beee6fc6ffccb07c9a2167

outline atomics: ret instead of jump to ret

After this, the machine code generated by zig matches identically to gcc's after the differences in loading the have_lse flag.

2 files changed, 726 insertions(+), 793 deletions(-)

lib/compiler_rt/lse_atomics.zig+700-740
......@@ -10,13 +10,12 @@ const always_has_lse = std.Target.aarch64.featureSetHas(builtin.cpu.features, .l
1010/// which ARM is concerned would have too much overhead.
1111var __aarch64_have_lse_atomics: u8 = @boolToInt(always_has_lse);
1212
13fn __aarch64_cas1_relax(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
13fn __aarch64_cas1_relax() align(16) callconv(.Naked) void {
1414 @setRuntimeSafety(false);
15 return asm volatile (
15 asm volatile (
1616 \\ cbz w16, 8f
1717 \\ .inst 0x08a07c41 + 0x00000000 + 0x000000
18 \\
19 \\ cbz wzr, 1f
18 \\ ret
2019 \\8:
2120 \\ uxtb w16, w0
2221 \\0:
......@@ -26,20 +25,19 @@ fn __aarch64_cas1_relax(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
2625 \\ stxrb w17, w1, [x2]
2726 \\ cbnz w17, 0b
2827 \\1:
29 : [ret] "={w0}" (-> u8),
30 : [expected] "{w0}" (expected),
31 [desired] "{w1}" (desired),
32 [ptr] "{x2}" (ptr),
33 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
28 \\ ret
29 :
30 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
3431 : "w15", "w16", "w17", "memory"
3532 );
33 unreachable;
3634}
37fn __aarch64_swp1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
35fn __aarch64_swp1_relax() align(16) callconv(.Naked) void {
3836 @setRuntimeSafety(false);
39 return asm volatile (
37 asm volatile (
4038 \\ cbz w16, 8f
4139 \\ .inst 0x38208020 + 0x00000000 + 0x000000
42 \\ cbz wzr, 1f
40 \\ ret
4341 \\8:
4442 \\ mov w16, w0
4543 \\0:
......@@ -47,19 +45,19 @@ fn __aarch64_swp1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
4745 \\ stxrb w17, w16, [x1]
4846 \\ cbnz w17, 0b
4947 \\1:
50 : [ret] "={w0}" (-> u8),
51 : [val] "{w0}" (val),
52 [ptr] "{x1}" (ptr),
53 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
48 \\ ret
49 :
50 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
5451 : "w15", "w16", "w17", "memory"
5552 );
53 unreachable;
5654}
57fn __aarch64_ldadd1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
55fn __aarch64_ldadd1_relax() align(16) callconv(.Naked) void {
5856 @setRuntimeSafety(false);
59 return asm volatile (
57 asm volatile (
6058 \\ cbz w16, 8f
6159 \\ .inst 0x38200020 + 0x0000 + 0x00000000 + 0x000000
62 \\ cbz wzr, 1f
60 \\ ret
6361 \\8:
6462 \\ mov w16, w0
6563 \\0:
......@@ -68,19 +66,19 @@ fn __aarch64_ldadd1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
6866 \\ stxrb w15, w17, [x1]
6967 \\ cbnz w15, 0b
7068 \\1:
71 : [ret] "={w0}" (-> u8),
72 : [val] "{w0}" (val),
73 [ptr] "{x1}" (ptr),
74 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
69 \\ ret
70 :
71 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
7572 : "w15", "w16", "w17", "memory"
7673 );
74 unreachable;
7775}
78fn __aarch64_ldclr1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
76fn __aarch64_ldclr1_relax() align(16) callconv(.Naked) void {
7977 @setRuntimeSafety(false);
80 return asm volatile (
78 asm volatile (
8179 \\ cbz w16, 8f
8280 \\ .inst 0x38200020 + 0x1000 + 0x00000000 + 0x000000
83 \\ cbz wzr, 1f
81 \\ ret
8482 \\8:
8583 \\ mov w16, w0
8684 \\0:
......@@ -89,19 +87,19 @@ fn __aarch64_ldclr1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
8987 \\ stxrb w15, w17, [x1]
9088 \\ cbnz w15, 0b
9189 \\1:
92 : [ret] "={w0}" (-> u8),
93 : [val] "{w0}" (val),
94 [ptr] "{x1}" (ptr),
95 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
90 \\ ret
91 :
92 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
9693 : "w15", "w16", "w17", "memory"
9794 );
95 unreachable;
9896}
99fn __aarch64_ldeor1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
97fn __aarch64_ldeor1_relax() align(16) callconv(.Naked) void {
10098 @setRuntimeSafety(false);
101 return asm volatile (
99 asm volatile (
102100 \\ cbz w16, 8f
103101 \\ .inst 0x38200020 + 0x2000 + 0x00000000 + 0x000000
104 \\ cbz wzr, 1f
102 \\ ret
105103 \\8:
106104 \\ mov w16, w0
107105 \\0:
......@@ -110,19 +108,19 @@ fn __aarch64_ldeor1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
110108 \\ stxrb w15, w17, [x1]
111109 \\ cbnz w15, 0b
112110 \\1:
113 : [ret] "={w0}" (-> u8),
114 : [val] "{w0}" (val),
115 [ptr] "{x1}" (ptr),
116 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
111 \\ ret
112 :
113 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
117114 : "w15", "w16", "w17", "memory"
118115 );
116 unreachable;
119117}
120fn __aarch64_ldset1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
118fn __aarch64_ldset1_relax() align(16) callconv(.Naked) void {
121119 @setRuntimeSafety(false);
122 return asm volatile (
120 asm volatile (
123121 \\ cbz w16, 8f
124122 \\ .inst 0x38200020 + 0x3000 + 0x00000000 + 0x000000
125 \\ cbz wzr, 1f
123 \\ ret
126124 \\8:
127125 \\ mov w16, w0
128126 \\0:
......@@ -131,20 +129,19 @@ fn __aarch64_ldset1_relax(val: u8, ptr: *u8) callconv(.C) u8 {
131129 \\ stxrb w15, w17, [x1]
132130 \\ cbnz w15, 0b
133131 \\1:
134 : [ret] "={w0}" (-> u8),
135 : [val] "{w0}" (val),
136 [ptr] "{x1}" (ptr),
137 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
132 \\ ret
133 :
134 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
138135 : "w15", "w16", "w17", "memory"
139136 );
137 unreachable;
140138}
141fn __aarch64_cas1_acq(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
139fn __aarch64_cas1_acq() align(16) callconv(.Naked) void {
142140 @setRuntimeSafety(false);
143 return asm volatile (
141 asm volatile (
144142 \\ cbz w16, 8f
145143 \\ .inst 0x08a07c41 + 0x00000000 + 0x400000
146 \\
147 \\ cbz wzr, 1f
144 \\ ret
148145 \\8:
149146 \\ uxtb w16, w0
150147 \\0:
......@@ -154,20 +151,19 @@ fn __aarch64_cas1_acq(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
154151 \\ stxrb w17, w1, [x2]
155152 \\ cbnz w17, 0b
156153 \\1:
157 : [ret] "={w0}" (-> u8),
158 : [expected] "{w0}" (expected),
159 [desired] "{w1}" (desired),
160 [ptr] "{x2}" (ptr),
161 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
154 \\ ret
155 :
156 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
162157 : "w15", "w16", "w17", "memory"
163158 );
159 unreachable;
164160}
165fn __aarch64_swp1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
161fn __aarch64_swp1_acq() align(16) callconv(.Naked) void {
166162 @setRuntimeSafety(false);
167 return asm volatile (
163 asm volatile (
168164 \\ cbz w16, 8f
169165 \\ .inst 0x38208020 + 0x00000000 + 0x800000
170 \\ cbz wzr, 1f
166 \\ ret
171167 \\8:
172168 \\ mov w16, w0
173169 \\0:
......@@ -175,19 +171,19 @@ fn __aarch64_swp1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
175171 \\ stxrb w17, w16, [x1]
176172 \\ cbnz w17, 0b
177173 \\1:
178 : [ret] "={w0}" (-> u8),
179 : [val] "{w0}" (val),
180 [ptr] "{x1}" (ptr),
181 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
174 \\ ret
175 :
176 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
182177 : "w15", "w16", "w17", "memory"
183178 );
179 unreachable;
184180}
185fn __aarch64_ldadd1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
181fn __aarch64_ldadd1_acq() align(16) callconv(.Naked) void {
186182 @setRuntimeSafety(false);
187 return asm volatile (
183 asm volatile (
188184 \\ cbz w16, 8f
189185 \\ .inst 0x38200020 + 0x0000 + 0x00000000 + 0x800000
190 \\ cbz wzr, 1f
186 \\ ret
191187 \\8:
192188 \\ mov w16, w0
193189 \\0:
......@@ -196,19 +192,19 @@ fn __aarch64_ldadd1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
196192 \\ stxrb w15, w17, [x1]
197193 \\ cbnz w15, 0b
198194 \\1:
199 : [ret] "={w0}" (-> u8),
200 : [val] "{w0}" (val),
201 [ptr] "{x1}" (ptr),
202 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
195 \\ ret
196 :
197 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
203198 : "w15", "w16", "w17", "memory"
204199 );
200 unreachable;
205201}
206fn __aarch64_ldclr1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
202fn __aarch64_ldclr1_acq() align(16) callconv(.Naked) void {
207203 @setRuntimeSafety(false);
208 return asm volatile (
204 asm volatile (
209205 \\ cbz w16, 8f
210206 \\ .inst 0x38200020 + 0x1000 + 0x00000000 + 0x800000
211 \\ cbz wzr, 1f
207 \\ ret
212208 \\8:
213209 \\ mov w16, w0
214210 \\0:
......@@ -217,19 +213,19 @@ fn __aarch64_ldclr1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
217213 \\ stxrb w15, w17, [x1]
218214 \\ cbnz w15, 0b
219215 \\1:
220 : [ret] "={w0}" (-> u8),
221 : [val] "{w0}" (val),
222 [ptr] "{x1}" (ptr),
223 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
216 \\ ret
217 :
218 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
224219 : "w15", "w16", "w17", "memory"
225220 );
221 unreachable;
226222}
227fn __aarch64_ldeor1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
223fn __aarch64_ldeor1_acq() align(16) callconv(.Naked) void {
228224 @setRuntimeSafety(false);
229 return asm volatile (
225 asm volatile (
230226 \\ cbz w16, 8f
231227 \\ .inst 0x38200020 + 0x2000 + 0x00000000 + 0x800000
232 \\ cbz wzr, 1f
228 \\ ret
233229 \\8:
234230 \\ mov w16, w0
235231 \\0:
......@@ -238,19 +234,19 @@ fn __aarch64_ldeor1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
238234 \\ stxrb w15, w17, [x1]
239235 \\ cbnz w15, 0b
240236 \\1:
241 : [ret] "={w0}" (-> u8),
242 : [val] "{w0}" (val),
243 [ptr] "{x1}" (ptr),
244 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
237 \\ ret
238 :
239 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
245240 : "w15", "w16", "w17", "memory"
246241 );
242 unreachable;
247243}
248fn __aarch64_ldset1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
244fn __aarch64_ldset1_acq() align(16) callconv(.Naked) void {
249245 @setRuntimeSafety(false);
250 return asm volatile (
246 asm volatile (
251247 \\ cbz w16, 8f
252248 \\ .inst 0x38200020 + 0x3000 + 0x00000000 + 0x800000
253 \\ cbz wzr, 1f
249 \\ ret
254250 \\8:
255251 \\ mov w16, w0
256252 \\0:
......@@ -259,20 +255,19 @@ fn __aarch64_ldset1_acq(val: u8, ptr: *u8) callconv(.C) u8 {
259255 \\ stxrb w15, w17, [x1]
260256 \\ cbnz w15, 0b
261257 \\1:
262 : [ret] "={w0}" (-> u8),
263 : [val] "{w0}" (val),
264 [ptr] "{x1}" (ptr),
265 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
258 \\ ret
259 :
260 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
266261 : "w15", "w16", "w17", "memory"
267262 );
263 unreachable;
268264}
269fn __aarch64_cas1_rel(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
265fn __aarch64_cas1_rel() align(16) callconv(.Naked) void {
270266 @setRuntimeSafety(false);
271 return asm volatile (
267 asm volatile (
272268 \\ cbz w16, 8f
273269 \\ .inst 0x08a07c41 + 0x00000000 + 0x008000
274 \\
275 \\ cbz wzr, 1f
270 \\ ret
276271 \\8:
277272 \\ uxtb w16, w0
278273 \\0:
......@@ -282,20 +277,19 @@ fn __aarch64_cas1_rel(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
282277 \\ stlxrb w17, w1, [x2]
283278 \\ cbnz w17, 0b
284279 \\1:
285 : [ret] "={w0}" (-> u8),
286 : [expected] "{w0}" (expected),
287 [desired] "{w1}" (desired),
288 [ptr] "{x2}" (ptr),
289 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
280 \\ ret
281 :
282 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
290283 : "w15", "w16", "w17", "memory"
291284 );
285 unreachable;
292286}
293fn __aarch64_swp1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
287fn __aarch64_swp1_rel() align(16) callconv(.Naked) void {
294288 @setRuntimeSafety(false);
295 return asm volatile (
289 asm volatile (
296290 \\ cbz w16, 8f
297291 \\ .inst 0x38208020 + 0x00000000 + 0x400000
298 \\ cbz wzr, 1f
292 \\ ret
299293 \\8:
300294 \\ mov w16, w0
301295 \\0:
......@@ -303,19 +297,19 @@ fn __aarch64_swp1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
303297 \\ stlxrb w17, w16, [x1]
304298 \\ cbnz w17, 0b
305299 \\1:
306 : [ret] "={w0}" (-> u8),
307 : [val] "{w0}" (val),
308 [ptr] "{x1}" (ptr),
309 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
300 \\ ret
301 :
302 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
310303 : "w15", "w16", "w17", "memory"
311304 );
305 unreachable;
312306}
313fn __aarch64_ldadd1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
307fn __aarch64_ldadd1_rel() align(16) callconv(.Naked) void {
314308 @setRuntimeSafety(false);
315 return asm volatile (
309 asm volatile (
316310 \\ cbz w16, 8f
317311 \\ .inst 0x38200020 + 0x0000 + 0x00000000 + 0x400000
318 \\ cbz wzr, 1f
312 \\ ret
319313 \\8:
320314 \\ mov w16, w0
321315 \\0:
......@@ -324,19 +318,19 @@ fn __aarch64_ldadd1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
324318 \\ stlxrb w15, w17, [x1]
325319 \\ cbnz w15, 0b
326320 \\1:
327 : [ret] "={w0}" (-> u8),
328 : [val] "{w0}" (val),
329 [ptr] "{x1}" (ptr),
330 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
321 \\ ret
322 :
323 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
331324 : "w15", "w16", "w17", "memory"
332325 );
326 unreachable;
333327}
334fn __aarch64_ldclr1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
328fn __aarch64_ldclr1_rel() align(16) callconv(.Naked) void {
335329 @setRuntimeSafety(false);
336 return asm volatile (
330 asm volatile (
337331 \\ cbz w16, 8f
338332 \\ .inst 0x38200020 + 0x1000 + 0x00000000 + 0x400000
339 \\ cbz wzr, 1f
333 \\ ret
340334 \\8:
341335 \\ mov w16, w0
342336 \\0:
......@@ -345,19 +339,19 @@ fn __aarch64_ldclr1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
345339 \\ stlxrb w15, w17, [x1]
346340 \\ cbnz w15, 0b
347341 \\1:
348 : [ret] "={w0}" (-> u8),
349 : [val] "{w0}" (val),
350 [ptr] "{x1}" (ptr),
351 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
342 \\ ret
343 :
344 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
352345 : "w15", "w16", "w17", "memory"
353346 );
347 unreachable;
354348}
355fn __aarch64_ldeor1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
349fn __aarch64_ldeor1_rel() align(16) callconv(.Naked) void {
356350 @setRuntimeSafety(false);
357 return asm volatile (
351 asm volatile (
358352 \\ cbz w16, 8f
359353 \\ .inst 0x38200020 + 0x2000 + 0x00000000 + 0x400000
360 \\ cbz wzr, 1f
354 \\ ret
361355 \\8:
362356 \\ mov w16, w0
363357 \\0:
......@@ -366,19 +360,19 @@ fn __aarch64_ldeor1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
366360 \\ stlxrb w15, w17, [x1]
367361 \\ cbnz w15, 0b
368362 \\1:
369 : [ret] "={w0}" (-> u8),
370 : [val] "{w0}" (val),
371 [ptr] "{x1}" (ptr),
372 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
363 \\ ret
364 :
365 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
373366 : "w15", "w16", "w17", "memory"
374367 );
368 unreachable;
375369}
376fn __aarch64_ldset1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
370fn __aarch64_ldset1_rel() align(16) callconv(.Naked) void {
377371 @setRuntimeSafety(false);
378 return asm volatile (
372 asm volatile (
379373 \\ cbz w16, 8f
380374 \\ .inst 0x38200020 + 0x3000 + 0x00000000 + 0x400000
381 \\ cbz wzr, 1f
375 \\ ret
382376 \\8:
383377 \\ mov w16, w0
384378 \\0:
......@@ -387,20 +381,19 @@ fn __aarch64_ldset1_rel(val: u8, ptr: *u8) callconv(.C) u8 {
387381 \\ stlxrb w15, w17, [x1]
388382 \\ cbnz w15, 0b
389383 \\1:
390 : [ret] "={w0}" (-> u8),
391 : [val] "{w0}" (val),
392 [ptr] "{x1}" (ptr),
393 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
384 \\ ret
385 :
386 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
394387 : "w15", "w16", "w17", "memory"
395388 );
389 unreachable;
396390}
397fn __aarch64_cas1_acq_rel(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
391fn __aarch64_cas1_acq_rel() align(16) callconv(.Naked) void {
398392 @setRuntimeSafety(false);
399 return asm volatile (
393 asm volatile (
400394 \\ cbz w16, 8f
401395 \\ .inst 0x08a07c41 + 0x00000000 + 0x408000
402 \\
403 \\ cbz wzr, 1f
396 \\ ret
404397 \\8:
405398 \\ uxtb w16, w0
406399 \\0:
......@@ -410,20 +403,19 @@ fn __aarch64_cas1_acq_rel(expected: u8, desired: u8, ptr: *u8) callconv(.C) u8 {
410403 \\ stlxrb w17, w1, [x2]
411404 \\ cbnz w17, 0b
412405 \\1:
413 : [ret] "={w0}" (-> u8),
414 : [expected] "{w0}" (expected),
415 [desired] "{w1}" (desired),
416 [ptr] "{x2}" (ptr),
417 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
406 \\ ret
407 :
408 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
418409 : "w15", "w16", "w17", "memory"
419410 );
411 unreachable;
420412}
421fn __aarch64_swp1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
413fn __aarch64_swp1_acq_rel() align(16) callconv(.Naked) void {
422414 @setRuntimeSafety(false);
423 return asm volatile (
415 asm volatile (
424416 \\ cbz w16, 8f
425417 \\ .inst 0x38208020 + 0x00000000 + 0xc00000
426 \\ cbz wzr, 1f
418 \\ ret
427419 \\8:
428420 \\ mov w16, w0
429421 \\0:
......@@ -431,19 +423,19 @@ fn __aarch64_swp1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
431423 \\ stlxrb w17, w16, [x1]
432424 \\ cbnz w17, 0b
433425 \\1:
434 : [ret] "={w0}" (-> u8),
435 : [val] "{w0}" (val),
436 [ptr] "{x1}" (ptr),
437 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
426 \\ ret
427 :
428 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
438429 : "w15", "w16", "w17", "memory"
439430 );
431 unreachable;
440432}
441fn __aarch64_ldadd1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
433fn __aarch64_ldadd1_acq_rel() align(16) callconv(.Naked) void {
442434 @setRuntimeSafety(false);
443 return asm volatile (
435 asm volatile (
444436 \\ cbz w16, 8f
445437 \\ .inst 0x38200020 + 0x0000 + 0x00000000 + 0xc00000
446 \\ cbz wzr, 1f
438 \\ ret
447439 \\8:
448440 \\ mov w16, w0
449441 \\0:
......@@ -452,19 +444,19 @@ fn __aarch64_ldadd1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
452444 \\ stlxrb w15, w17, [x1]
453445 \\ cbnz w15, 0b
454446 \\1:
455 : [ret] "={w0}" (-> u8),
456 : [val] "{w0}" (val),
457 [ptr] "{x1}" (ptr),
458 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
447 \\ ret
448 :
449 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
459450 : "w15", "w16", "w17", "memory"
460451 );
452 unreachable;
461453}
462fn __aarch64_ldclr1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
454fn __aarch64_ldclr1_acq_rel() align(16) callconv(.Naked) void {
463455 @setRuntimeSafety(false);
464 return asm volatile (
456 asm volatile (
465457 \\ cbz w16, 8f
466458 \\ .inst 0x38200020 + 0x1000 + 0x00000000 + 0xc00000
467 \\ cbz wzr, 1f
459 \\ ret
468460 \\8:
469461 \\ mov w16, w0
470462 \\0:
......@@ -473,19 +465,19 @@ fn __aarch64_ldclr1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
473465 \\ stlxrb w15, w17, [x1]
474466 \\ cbnz w15, 0b
475467 \\1:
476 : [ret] "={w0}" (-> u8),
477 : [val] "{w0}" (val),
478 [ptr] "{x1}" (ptr),
479 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
468 \\ ret
469 :
470 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
480471 : "w15", "w16", "w17", "memory"
481472 );
473 unreachable;
482474}
483fn __aarch64_ldeor1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
475fn __aarch64_ldeor1_acq_rel() align(16) callconv(.Naked) void {
484476 @setRuntimeSafety(false);
485 return asm volatile (
477 asm volatile (
486478 \\ cbz w16, 8f
487479 \\ .inst 0x38200020 + 0x2000 + 0x00000000 + 0xc00000
488 \\ cbz wzr, 1f
480 \\ ret
489481 \\8:
490482 \\ mov w16, w0
491483 \\0:
......@@ -494,19 +486,19 @@ fn __aarch64_ldeor1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
494486 \\ stlxrb w15, w17, [x1]
495487 \\ cbnz w15, 0b
496488 \\1:
497 : [ret] "={w0}" (-> u8),
498 : [val] "{w0}" (val),
499 [ptr] "{x1}" (ptr),
500 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
489 \\ ret
490 :
491 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
501492 : "w15", "w16", "w17", "memory"
502493 );
494 unreachable;
503495}
504fn __aarch64_ldset1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
496fn __aarch64_ldset1_acq_rel() align(16) callconv(.Naked) void {
505497 @setRuntimeSafety(false);
506 return asm volatile (
498 asm volatile (
507499 \\ cbz w16, 8f
508500 \\ .inst 0x38200020 + 0x3000 + 0x00000000 + 0xc00000
509 \\ cbz wzr, 1f
501 \\ ret
510502 \\8:
511503 \\ mov w16, w0
512504 \\0:
......@@ -515,20 +507,19 @@ fn __aarch64_ldset1_acq_rel(val: u8, ptr: *u8) callconv(.C) u8 {
515507 \\ stlxrb w15, w17, [x1]
516508 \\ cbnz w15, 0b
517509 \\1:
518 : [ret] "={w0}" (-> u8),
519 : [val] "{w0}" (val),
520 [ptr] "{x1}" (ptr),
521 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
510 \\ ret
511 :
512 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
522513 : "w15", "w16", "w17", "memory"
523514 );
515 unreachable;
524516}
525fn __aarch64_cas2_relax(expected: u16, desired: u16, ptr: *u16) callconv(.C) u16 {
517fn __aarch64_cas2_relax() align(16) callconv(.Naked) void {
526518 @setRuntimeSafety(false);
527 return asm volatile (
519 asm volatile (
528520 \\ cbz w16, 8f
529521 \\ .inst 0x08a07c41 + 0x40000000 + 0x000000
530 \\
531 \\ cbz wzr, 1f
522 \\ ret
532523 \\8:
533524 \\ uxth w16, w0
534525 \\0:
......@@ -538,20 +529,19 @@ fn __aarch64_cas2_relax(expected: u16, desired: u16, ptr: *u16) callconv(.C) u16
538529 \\ stxrh w17, w1, [x2]
539530 \\ cbnz w17, 0b
540531 \\1:
541 : [ret] "={w0}" (-> u16),
542 : [expected] "{w0}" (expected),
543 [desired] "{w1}" (desired),
544 [ptr] "{x2}" (ptr),
545 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
532 \\ ret
533 :
534 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
546535 : "w15", "w16", "w17", "memory"
547536 );
537 unreachable;
548538}
549fn __aarch64_swp2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
539fn __aarch64_swp2_relax() align(16) callconv(.Naked) void {
550540 @setRuntimeSafety(false);
551 return asm volatile (
541 asm volatile (
552542 \\ cbz w16, 8f
553543 \\ .inst 0x38208020 + 0x40000000 + 0x000000
554 \\ cbz wzr, 1f
544 \\ ret
555545 \\8:
556546 \\ mov w16, w0
557547 \\0:
......@@ -559,19 +549,19 @@ fn __aarch64_swp2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
559549 \\ stxrh w17, w16, [x1]
560550 \\ cbnz w17, 0b
561551 \\1:
562 : [ret] "={w0}" (-> u16),
563 : [val] "{w0}" (val),
564 [ptr] "{x1}" (ptr),
565 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
552 \\ ret
553 :
554 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
566555 : "w15", "w16", "w17", "memory"
567556 );
557 unreachable;
568558}
569fn __aarch64_ldadd2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
559fn __aarch64_ldadd2_relax() align(16) callconv(.Naked) void {
570560 @setRuntimeSafety(false);
571 return asm volatile (
561 asm volatile (
572562 \\ cbz w16, 8f
573563 \\ .inst 0x38200020 + 0x0000 + 0x40000000 + 0x000000
574 \\ cbz wzr, 1f
564 \\ ret
575565 \\8:
576566 \\ mov w16, w0
577567 \\0:
......@@ -580,19 +570,19 @@ fn __aarch64_ldadd2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
580570 \\ stxrh w15, w17, [x1]
581571 \\ cbnz w15, 0b
582572 \\1:
583 : [ret] "={w0}" (-> u16),
584 : [val] "{w0}" (val),
585 [ptr] "{x1}" (ptr),
586 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
573 \\ ret
574 :
575 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
587576 : "w15", "w16", "w17", "memory"
588577 );
578 unreachable;
589579}
590fn __aarch64_ldclr2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
580fn __aarch64_ldclr2_relax() align(16) callconv(.Naked) void {
591581 @setRuntimeSafety(false);
592 return asm volatile (
582 asm volatile (
593583 \\ cbz w16, 8f
594584 \\ .inst 0x38200020 + 0x1000 + 0x40000000 + 0x000000
595 \\ cbz wzr, 1f
585 \\ ret
596586 \\8:
597587 \\ mov w16, w0
598588 \\0:
......@@ -601,19 +591,19 @@ fn __aarch64_ldclr2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
601591 \\ stxrh w15, w17, [x1]
602592 \\ cbnz w15, 0b
603593 \\1:
604 : [ret] "={w0}" (-> u16),
605 : [val] "{w0}" (val),
606 [ptr] "{x1}" (ptr),
607 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
594 \\ ret
595 :
596 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
608597 : "w15", "w16", "w17", "memory"
609598 );
599 unreachable;
610600}
611fn __aarch64_ldeor2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
601fn __aarch64_ldeor2_relax() align(16) callconv(.Naked) void {
612602 @setRuntimeSafety(false);
613 return asm volatile (
603 asm volatile (
614604 \\ cbz w16, 8f
615605 \\ .inst 0x38200020 + 0x2000 + 0x40000000 + 0x000000
616 \\ cbz wzr, 1f
606 \\ ret
617607 \\8:
618608 \\ mov w16, w0
619609 \\0:
......@@ -622,19 +612,19 @@ fn __aarch64_ldeor2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
622612 \\ stxrh w15, w17, [x1]
623613 \\ cbnz w15, 0b
624614 \\1:
625 : [ret] "={w0}" (-> u16),
626 : [val] "{w0}" (val),
627 [ptr] "{x1}" (ptr),
628 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
615 \\ ret
616 :
617 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
629618 : "w15", "w16", "w17", "memory"
630619 );
620 unreachable;
631621}
632fn __aarch64_ldset2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
622fn __aarch64_ldset2_relax() align(16) callconv(.Naked) void {
633623 @setRuntimeSafety(false);
634 return asm volatile (
624 asm volatile (
635625 \\ cbz w16, 8f
636626 \\ .inst 0x38200020 + 0x3000 + 0x40000000 + 0x000000
637 \\ cbz wzr, 1f
627 \\ ret
638628 \\8:
639629 \\ mov w16, w0
640630 \\0:
......@@ -643,20 +633,19 @@ fn __aarch64_ldset2_relax(val: u16, ptr: *u16) callconv(.C) u16 {
643633 \\ stxrh w15, w17, [x1]
644634 \\ cbnz w15, 0b
645635 \\1:
646 : [ret] "={w0}" (-> u16),
647 : [val] "{w0}" (val),
648 [ptr] "{x1}" (ptr),
649 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
636 \\ ret
637 :
638 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
650639 : "w15", "w16", "w17", "memory"
651640 );
641 unreachable;
652642}
653fn __aarch64_cas2_acq(expected: u16, desired: u16, ptr: *u16) callconv(.C) u16 {
643fn __aarch64_cas2_acq() align(16) callconv(.Naked) void {
654644 @setRuntimeSafety(false);
655 return asm volatile (
645 asm volatile (
656646 \\ cbz w16, 8f
657647 \\ .inst 0x08a07c41 + 0x40000000 + 0x400000
658 \\
659 \\ cbz wzr, 1f
648 \\ ret
660649 \\8:
661650 \\ uxth w16, w0
662651 \\0:
......@@ -666,20 +655,19 @@ fn __aarch64_cas2_acq(expected: u16, desired: u16, ptr: *u16) callconv(.C) u16 {
666655 \\ stxrh w17, w1, [x2]
667656 \\ cbnz w17, 0b
668657 \\1:
669 : [ret] "={w0}" (-> u16),
670 : [expected] "{w0}" (expected),
671 [desired] "{w1}" (desired),
672 [ptr] "{x2}" (ptr),
673 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
658 \\ ret
659 :
660 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
674661 : "w15", "w16", "w17", "memory"
675662 );
663 unreachable;
676664}
677fn __aarch64_swp2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
665fn __aarch64_swp2_acq() align(16) callconv(.Naked) void {
678666 @setRuntimeSafety(false);
679 return asm volatile (
667 asm volatile (
680668 \\ cbz w16, 8f
681669 \\ .inst 0x38208020 + 0x40000000 + 0x800000
682 \\ cbz wzr, 1f
670 \\ ret
683671 \\8:
684672 \\ mov w16, w0
685673 \\0:
......@@ -687,19 +675,19 @@ fn __aarch64_swp2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
687675 \\ stxrh w17, w16, [x1]
688676 \\ cbnz w17, 0b
689677 \\1:
690 : [ret] "={w0}" (-> u16),
691 : [val] "{w0}" (val),
692 [ptr] "{x1}" (ptr),
693 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
678 \\ ret
679 :
680 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
694681 : "w15", "w16", "w17", "memory"
695682 );
683 unreachable;
696684}
697fn __aarch64_ldadd2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
685fn __aarch64_ldadd2_acq() align(16) callconv(.Naked) void {
698686 @setRuntimeSafety(false);
699 return asm volatile (
687 asm volatile (
700688 \\ cbz w16, 8f
701689 \\ .inst 0x38200020 + 0x0000 + 0x40000000 + 0x800000
702 \\ cbz wzr, 1f
690 \\ ret
703691 \\8:
704692 \\ mov w16, w0
705693 \\0:
......@@ -708,19 +696,19 @@ fn __aarch64_ldadd2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
708696 \\ stxrh w15, w17, [x1]
709697 \\ cbnz w15, 0b
710698 \\1:
711 : [ret] "={w0}" (-> u16),
712 : [val] "{w0}" (val),
713 [ptr] "{x1}" (ptr),
714 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
699 \\ ret
700 :
701 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
715702 : "w15", "w16", "w17", "memory"
716703 );
704 unreachable;
717705}
718fn __aarch64_ldclr2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
706fn __aarch64_ldclr2_acq() align(16) callconv(.Naked) void {
719707 @setRuntimeSafety(false);
720 return asm volatile (
708 asm volatile (
721709 \\ cbz w16, 8f
722710 \\ .inst 0x38200020 + 0x1000 + 0x40000000 + 0x800000
723 \\ cbz wzr, 1f
711 \\ ret
724712 \\8:
725713 \\ mov w16, w0
726714 \\0:
......@@ -729,19 +717,19 @@ fn __aarch64_ldclr2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
729717 \\ stxrh w15, w17, [x1]
730718 \\ cbnz w15, 0b
731719 \\1:
732 : [ret] "={w0}" (-> u16),
733 : [val] "{w0}" (val),
734 [ptr] "{x1}" (ptr),
735 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
720 \\ ret
721 :
722 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
736723 : "w15", "w16", "w17", "memory"
737724 );
725 unreachable;
738726}
739fn __aarch64_ldeor2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
727fn __aarch64_ldeor2_acq() align(16) callconv(.Naked) void {
740728 @setRuntimeSafety(false);
741 return asm volatile (
729 asm volatile (
742730 \\ cbz w16, 8f
743731 \\ .inst 0x38200020 + 0x2000 + 0x40000000 + 0x800000
744 \\ cbz wzr, 1f
732 \\ ret
745733 \\8:
746734 \\ mov w16, w0
747735 \\0:
......@@ -750,19 +738,19 @@ fn __aarch64_ldeor2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
750738 \\ stxrh w15, w17, [x1]
751739 \\ cbnz w15, 0b
752740 \\1:
753 : [ret] "={w0}" (-> u16),
754 : [val] "{w0}" (val),
755 [ptr] "{x1}" (ptr),
756 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
741 \\ ret
742 :
743 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
757744 : "w15", "w16", "w17", "memory"
758745 );
746 unreachable;
759747}
760fn __aarch64_ldset2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
748fn __aarch64_ldset2_acq() align(16) callconv(.Naked) void {
761749 @setRuntimeSafety(false);
762 return asm volatile (
750 asm volatile (
763751 \\ cbz w16, 8f
764752 \\ .inst 0x38200020 + 0x3000 + 0x40000000 + 0x800000
765 \\ cbz wzr, 1f
753 \\ ret
766754 \\8:
767755 \\ mov w16, w0
768756 \\0:
......@@ -771,20 +759,19 @@ fn __aarch64_ldset2_acq(val: u16, ptr: *u16) callconv(.C) u16 {
771759 \\ stxrh w15, w17, [x1]
772760 \\ cbnz w15, 0b
773761 \\1:
774 : [ret] "={w0}" (-> u16),
775 : [val] "{w0}" (val),
776 [ptr] "{x1}" (ptr),
777 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
762 \\ ret
763 :
764 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
778765 : "w15", "w16", "w17", "memory"
779766 );
767 unreachable;
780768}
781fn __aarch64_cas2_rel(expected: u16, desired: u16, ptr: *u16) callconv(.C) u16 {
769fn __aarch64_cas2_rel() align(16) callconv(.Naked) void {
782770 @setRuntimeSafety(false);
783 return asm volatile (
771 asm volatile (
784772 \\ cbz w16, 8f
785773 \\ .inst 0x08a07c41 + 0x40000000 + 0x008000
786 \\
787 \\ cbz wzr, 1f
774 \\ ret
788775 \\8:
789776 \\ uxth w16, w0
790777 \\0:
......@@ -794,20 +781,19 @@ fn __aarch64_cas2_rel(expected: u16, desired: u16, ptr: *u16) callconv(.C) u16 {
794781 \\ stlxrh w17, w1, [x2]
795782 \\ cbnz w17, 0b
796783 \\1:
797 : [ret] "={w0}" (-> u16),
798 : [expected] "{w0}" (expected),
799 [desired] "{w1}" (desired),
800 [ptr] "{x2}" (ptr),
801 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
784 \\ ret
785 :
786 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
802787 : "w15", "w16", "w17", "memory"
803788 );
789 unreachable;
804790}
805fn __aarch64_swp2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
791fn __aarch64_swp2_rel() align(16) callconv(.Naked) void {
806792 @setRuntimeSafety(false);
807 return asm volatile (
793 asm volatile (
808794 \\ cbz w16, 8f
809795 \\ .inst 0x38208020 + 0x40000000 + 0x400000
810 \\ cbz wzr, 1f
796 \\ ret
811797 \\8:
812798 \\ mov w16, w0
813799 \\0:
......@@ -815,19 +801,19 @@ fn __aarch64_swp2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
815801 \\ stlxrh w17, w16, [x1]
816802 \\ cbnz w17, 0b
817803 \\1:
818 : [ret] "={w0}" (-> u16),
819 : [val] "{w0}" (val),
820 [ptr] "{x1}" (ptr),
821 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
804 \\ ret
805 :
806 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
822807 : "w15", "w16", "w17", "memory"
823808 );
809 unreachable;
824810}
825fn __aarch64_ldadd2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
811fn __aarch64_ldadd2_rel() align(16) callconv(.Naked) void {
826812 @setRuntimeSafety(false);
827 return asm volatile (
813 asm volatile (
828814 \\ cbz w16, 8f
829815 \\ .inst 0x38200020 + 0x0000 + 0x40000000 + 0x400000
830 \\ cbz wzr, 1f
816 \\ ret
831817 \\8:
832818 \\ mov w16, w0
833819 \\0:
......@@ -836,19 +822,19 @@ fn __aarch64_ldadd2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
836822 \\ stlxrh w15, w17, [x1]
837823 \\ cbnz w15, 0b
838824 \\1:
839 : [ret] "={w0}" (-> u16),
840 : [val] "{w0}" (val),
841 [ptr] "{x1}" (ptr),
842 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
825 \\ ret
826 :
827 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
843828 : "w15", "w16", "w17", "memory"
844829 );
830 unreachable;
845831}
846fn __aarch64_ldclr2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
832fn __aarch64_ldclr2_rel() align(16) callconv(.Naked) void {
847833 @setRuntimeSafety(false);
848 return asm volatile (
834 asm volatile (
849835 \\ cbz w16, 8f
850836 \\ .inst 0x38200020 + 0x1000 + 0x40000000 + 0x400000
851 \\ cbz wzr, 1f
837 \\ ret
852838 \\8:
853839 \\ mov w16, w0
854840 \\0:
......@@ -857,19 +843,19 @@ fn __aarch64_ldclr2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
857843 \\ stlxrh w15, w17, [x1]
858844 \\ cbnz w15, 0b
859845 \\1:
860 : [ret] "={w0}" (-> u16),
861 : [val] "{w0}" (val),
862 [ptr] "{x1}" (ptr),
863 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
846 \\ ret
847 :
848 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
864849 : "w15", "w16", "w17", "memory"
865850 );
851 unreachable;
866852}
867fn __aarch64_ldeor2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
853fn __aarch64_ldeor2_rel() align(16) callconv(.Naked) void {
868854 @setRuntimeSafety(false);
869 return asm volatile (
855 asm volatile (
870856 \\ cbz w16, 8f
871857 \\ .inst 0x38200020 + 0x2000 + 0x40000000 + 0x400000
872 \\ cbz wzr, 1f
858 \\ ret
873859 \\8:
874860 \\ mov w16, w0
875861 \\0:
......@@ -878,19 +864,19 @@ fn __aarch64_ldeor2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
878864 \\ stlxrh w15, w17, [x1]
879865 \\ cbnz w15, 0b
880866 \\1:
881 : [ret] "={w0}" (-> u16),
882 : [val] "{w0}" (val),
883 [ptr] "{x1}" (ptr),
884 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
867 \\ ret
868 :
869 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
885870 : "w15", "w16", "w17", "memory"
886871 );
872 unreachable;
887873}
888fn __aarch64_ldset2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
874fn __aarch64_ldset2_rel() align(16) callconv(.Naked) void {
889875 @setRuntimeSafety(false);
890 return asm volatile (
876 asm volatile (
891877 \\ cbz w16, 8f
892878 \\ .inst 0x38200020 + 0x3000 + 0x40000000 + 0x400000
893 \\ cbz wzr, 1f
879 \\ ret
894880 \\8:
895881 \\ mov w16, w0
896882 \\0:
......@@ -899,20 +885,19 @@ fn __aarch64_ldset2_rel(val: u16, ptr: *u16) callconv(.C) u16 {
899885 \\ stlxrh w15, w17, [x1]
900886 \\ cbnz w15, 0b
901887 \\1:
902 : [ret] "={w0}" (-> u16),
903 : [val] "{w0}" (val),
904 [ptr] "{x1}" (ptr),
905 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
888 \\ ret
889 :
890 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
906891 : "w15", "w16", "w17", "memory"
907892 );
893 unreachable;
908894}
909fn __aarch64_cas2_acq_rel(expected: u16, desired: u16, ptr: *u16) callconv(.C) u16 {
895fn __aarch64_cas2_acq_rel() align(16) callconv(.Naked) void {
910896 @setRuntimeSafety(false);
911 return asm volatile (
897 asm volatile (
912898 \\ cbz w16, 8f
913899 \\ .inst 0x08a07c41 + 0x40000000 + 0x408000
914 \\
915 \\ cbz wzr, 1f
900 \\ ret
916901 \\8:
917902 \\ uxth w16, w0
918903 \\0:
......@@ -922,20 +907,19 @@ fn __aarch64_cas2_acq_rel(expected: u16, desired: u16, ptr: *u16) callconv(.C) u
922907 \\ stlxrh w17, w1, [x2]
923908 \\ cbnz w17, 0b
924909 \\1:
925 : [ret] "={w0}" (-> u16),
926 : [expected] "{w0}" (expected),
927 [desired] "{w1}" (desired),
928 [ptr] "{x2}" (ptr),
929 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
910 \\ ret
911 :
912 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
930913 : "w15", "w16", "w17", "memory"
931914 );
915 unreachable;
932916}
933fn __aarch64_swp2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
917fn __aarch64_swp2_acq_rel() align(16) callconv(.Naked) void {
934918 @setRuntimeSafety(false);
935 return asm volatile (
919 asm volatile (
936920 \\ cbz w16, 8f
937921 \\ .inst 0x38208020 + 0x40000000 + 0xc00000
938 \\ cbz wzr, 1f
922 \\ ret
939923 \\8:
940924 \\ mov w16, w0
941925 \\0:
......@@ -943,19 +927,19 @@ fn __aarch64_swp2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
943927 \\ stlxrh w17, w16, [x1]
944928 \\ cbnz w17, 0b
945929 \\1:
946 : [ret] "={w0}" (-> u16),
947 : [val] "{w0}" (val),
948 [ptr] "{x1}" (ptr),
949 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
930 \\ ret
931 :
932 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
950933 : "w15", "w16", "w17", "memory"
951934 );
935 unreachable;
952936}
953fn __aarch64_ldadd2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
937fn __aarch64_ldadd2_acq_rel() align(16) callconv(.Naked) void {
954938 @setRuntimeSafety(false);
955 return asm volatile (
939 asm volatile (
956940 \\ cbz w16, 8f
957941 \\ .inst 0x38200020 + 0x0000 + 0x40000000 + 0xc00000
958 \\ cbz wzr, 1f
942 \\ ret
959943 \\8:
960944 \\ mov w16, w0
961945 \\0:
......@@ -964,19 +948,19 @@ fn __aarch64_ldadd2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
964948 \\ stlxrh w15, w17, [x1]
965949 \\ cbnz w15, 0b
966950 \\1:
967 : [ret] "={w0}" (-> u16),
968 : [val] "{w0}" (val),
969 [ptr] "{x1}" (ptr),
970 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
951 \\ ret
952 :
953 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
971954 : "w15", "w16", "w17", "memory"
972955 );
956 unreachable;
973957}
974fn __aarch64_ldclr2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
958fn __aarch64_ldclr2_acq_rel() align(16) callconv(.Naked) void {
975959 @setRuntimeSafety(false);
976 return asm volatile (
960 asm volatile (
977961 \\ cbz w16, 8f
978962 \\ .inst 0x38200020 + 0x1000 + 0x40000000 + 0xc00000
979 \\ cbz wzr, 1f
963 \\ ret
980964 \\8:
981965 \\ mov w16, w0
982966 \\0:
......@@ -985,19 +969,19 @@ fn __aarch64_ldclr2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
985969 \\ stlxrh w15, w17, [x1]
986970 \\ cbnz w15, 0b
987971 \\1:
988 : [ret] "={w0}" (-> u16),
989 : [val] "{w0}" (val),
990 [ptr] "{x1}" (ptr),
991 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
972 \\ ret
973 :
974 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
992975 : "w15", "w16", "w17", "memory"
993976 );
977 unreachable;
994978}
995fn __aarch64_ldeor2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
979fn __aarch64_ldeor2_acq_rel() align(16) callconv(.Naked) void {
996980 @setRuntimeSafety(false);
997 return asm volatile (
981 asm volatile (
998982 \\ cbz w16, 8f
999983 \\ .inst 0x38200020 + 0x2000 + 0x40000000 + 0xc00000
1000 \\ cbz wzr, 1f
984 \\ ret
1001985 \\8:
1002986 \\ mov w16, w0
1003987 \\0:
......@@ -1006,19 +990,19 @@ fn __aarch64_ldeor2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
1006990 \\ stlxrh w15, w17, [x1]
1007991 \\ cbnz w15, 0b
1008992 \\1:
1009 : [ret] "={w0}" (-> u16),
1010 : [val] "{w0}" (val),
1011 [ptr] "{x1}" (ptr),
1012 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
993 \\ ret
994 :
995 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1013996 : "w15", "w16", "w17", "memory"
1014997 );
998 unreachable;
1015999}
1016fn __aarch64_ldset2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
1000fn __aarch64_ldset2_acq_rel() align(16) callconv(.Naked) void {
10171001 @setRuntimeSafety(false);
1018 return asm volatile (
1002 asm volatile (
10191003 \\ cbz w16, 8f
10201004 \\ .inst 0x38200020 + 0x3000 + 0x40000000 + 0xc00000
1021 \\ cbz wzr, 1f
1005 \\ ret
10221006 \\8:
10231007 \\ mov w16, w0
10241008 \\0:
......@@ -1027,20 +1011,19 @@ fn __aarch64_ldset2_acq_rel(val: u16, ptr: *u16) callconv(.C) u16 {
10271011 \\ stlxrh w15, w17, [x1]
10281012 \\ cbnz w15, 0b
10291013 \\1:
1030 : [ret] "={w0}" (-> u16),
1031 : [val] "{w0}" (val),
1032 [ptr] "{x1}" (ptr),
1033 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1014 \\ ret
1015 :
1016 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
10341017 : "w15", "w16", "w17", "memory"
10351018 );
1019 unreachable;
10361020}
1037fn __aarch64_cas4_relax(expected: u32, desired: u32, ptr: *u32) callconv(.C) u32 {
1021fn __aarch64_cas4_relax() align(16) callconv(.Naked) void {
10381022 @setRuntimeSafety(false);
1039 return asm volatile (
1023 asm volatile (
10401024 \\ cbz w16, 8f
10411025 \\ .inst 0x08a07c41 + 0x80000000 + 0x000000
1042 \\
1043 \\ cbz wzr, 1f
1026 \\ ret
10441027 \\8:
10451028 \\ mov w16, w0
10461029 \\0:
......@@ -1050,20 +1033,19 @@ fn __aarch64_cas4_relax(expected: u32, desired: u32, ptr: *u32) callconv(.C) u32
10501033 \\ stxr w17, w1, [x2]
10511034 \\ cbnz w17, 0b
10521035 \\1:
1053 : [ret] "={w0}" (-> u32),
1054 : [expected] "{w0}" (expected),
1055 [desired] "{w1}" (desired),
1056 [ptr] "{x2}" (ptr),
1057 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1036 \\ ret
1037 :
1038 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
10581039 : "w15", "w16", "w17", "memory"
10591040 );
1041 unreachable;
10601042}
1061fn __aarch64_swp4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
1043fn __aarch64_swp4_relax() align(16) callconv(.Naked) void {
10621044 @setRuntimeSafety(false);
1063 return asm volatile (
1045 asm volatile (
10641046 \\ cbz w16, 8f
10651047 \\ .inst 0x38208020 + 0x80000000 + 0x000000
1066 \\ cbz wzr, 1f
1048 \\ ret
10671049 \\8:
10681050 \\ mov w16, w0
10691051 \\0:
......@@ -1071,19 +1053,19 @@ fn __aarch64_swp4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
10711053 \\ stxr w17, w16, [x1]
10721054 \\ cbnz w17, 0b
10731055 \\1:
1074 : [ret] "={w0}" (-> u32),
1075 : [val] "{w0}" (val),
1076 [ptr] "{x1}" (ptr),
1077 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1056 \\ ret
1057 :
1058 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
10781059 : "w15", "w16", "w17", "memory"
10791060 );
1061 unreachable;
10801062}
1081fn __aarch64_ldadd4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
1063fn __aarch64_ldadd4_relax() align(16) callconv(.Naked) void {
10821064 @setRuntimeSafety(false);
1083 return asm volatile (
1065 asm volatile (
10841066 \\ cbz w16, 8f
10851067 \\ .inst 0x38200020 + 0x0000 + 0x80000000 + 0x000000
1086 \\ cbz wzr, 1f
1068 \\ ret
10871069 \\8:
10881070 \\ mov w16, w0
10891071 \\0:
......@@ -1092,19 +1074,19 @@ fn __aarch64_ldadd4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
10921074 \\ stxr w15, w17, [x1]
10931075 \\ cbnz w15, 0b
10941076 \\1:
1095 : [ret] "={w0}" (-> u32),
1096 : [val] "{w0}" (val),
1097 [ptr] "{x1}" (ptr),
1098 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1077 \\ ret
1078 :
1079 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
10991080 : "w15", "w16", "w17", "memory"
11001081 );
1082 unreachable;
11011083}
1102fn __aarch64_ldclr4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
1084fn __aarch64_ldclr4_relax() align(16) callconv(.Naked) void {
11031085 @setRuntimeSafety(false);
1104 return asm volatile (
1086 asm volatile (
11051087 \\ cbz w16, 8f
11061088 \\ .inst 0x38200020 + 0x1000 + 0x80000000 + 0x000000
1107 \\ cbz wzr, 1f
1089 \\ ret
11081090 \\8:
11091091 \\ mov w16, w0
11101092 \\0:
......@@ -1113,19 +1095,19 @@ fn __aarch64_ldclr4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
11131095 \\ stxr w15, w17, [x1]
11141096 \\ cbnz w15, 0b
11151097 \\1:
1116 : [ret] "={w0}" (-> u32),
1117 : [val] "{w0}" (val),
1118 [ptr] "{x1}" (ptr),
1119 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1098 \\ ret
1099 :
1100 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
11201101 : "w15", "w16", "w17", "memory"
11211102 );
1103 unreachable;
11221104}
1123fn __aarch64_ldeor4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
1105fn __aarch64_ldeor4_relax() align(16) callconv(.Naked) void {
11241106 @setRuntimeSafety(false);
1125 return asm volatile (
1107 asm volatile (
11261108 \\ cbz w16, 8f
11271109 \\ .inst 0x38200020 + 0x2000 + 0x80000000 + 0x000000
1128 \\ cbz wzr, 1f
1110 \\ ret
11291111 \\8:
11301112 \\ mov w16, w0
11311113 \\0:
......@@ -1134,19 +1116,19 @@ fn __aarch64_ldeor4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
11341116 \\ stxr w15, w17, [x1]
11351117 \\ cbnz w15, 0b
11361118 \\1:
1137 : [ret] "={w0}" (-> u32),
1138 : [val] "{w0}" (val),
1139 [ptr] "{x1}" (ptr),
1140 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1119 \\ ret
1120 :
1121 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
11411122 : "w15", "w16", "w17", "memory"
11421123 );
1124 unreachable;
11431125}
1144fn __aarch64_ldset4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
1126fn __aarch64_ldset4_relax() align(16) callconv(.Naked) void {
11451127 @setRuntimeSafety(false);
1146 return asm volatile (
1128 asm volatile (
11471129 \\ cbz w16, 8f
11481130 \\ .inst 0x38200020 + 0x3000 + 0x80000000 + 0x000000
1149 \\ cbz wzr, 1f
1131 \\ ret
11501132 \\8:
11511133 \\ mov w16, w0
11521134 \\0:
......@@ -1155,20 +1137,19 @@ fn __aarch64_ldset4_relax(val: u32, ptr: *u32) callconv(.C) u32 {
11551137 \\ stxr w15, w17, [x1]
11561138 \\ cbnz w15, 0b
11571139 \\1:
1158 : [ret] "={w0}" (-> u32),
1159 : [val] "{w0}" (val),
1160 [ptr] "{x1}" (ptr),
1161 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1140 \\ ret
1141 :
1142 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
11621143 : "w15", "w16", "w17", "memory"
11631144 );
1145 unreachable;
11641146}
1165fn __aarch64_cas4_acq(expected: u32, desired: u32, ptr: *u32) callconv(.C) u32 {
1147fn __aarch64_cas4_acq() align(16) callconv(.Naked) void {
11661148 @setRuntimeSafety(false);
1167 return asm volatile (
1149 asm volatile (
11681150 \\ cbz w16, 8f
11691151 \\ .inst 0x08a07c41 + 0x80000000 + 0x400000
1170 \\
1171 \\ cbz wzr, 1f
1152 \\ ret
11721153 \\8:
11731154 \\ mov w16, w0
11741155 \\0:
......@@ -1178,20 +1159,19 @@ fn __aarch64_cas4_acq(expected: u32, desired: u32, ptr: *u32) callconv(.C) u32 {
11781159 \\ stxr w17, w1, [x2]
11791160 \\ cbnz w17, 0b
11801161 \\1:
1181 : [ret] "={w0}" (-> u32),
1182 : [expected] "{w0}" (expected),
1183 [desired] "{w1}" (desired),
1184 [ptr] "{x2}" (ptr),
1185 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1162 \\ ret
1163 :
1164 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
11861165 : "w15", "w16", "w17", "memory"
11871166 );
1167 unreachable;
11881168}
1189fn __aarch64_swp4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
1169fn __aarch64_swp4_acq() align(16) callconv(.Naked) void {
11901170 @setRuntimeSafety(false);
1191 return asm volatile (
1171 asm volatile (
11921172 \\ cbz w16, 8f
11931173 \\ .inst 0x38208020 + 0x80000000 + 0x800000
1194 \\ cbz wzr, 1f
1174 \\ ret
11951175 \\8:
11961176 \\ mov w16, w0
11971177 \\0:
......@@ -1199,19 +1179,19 @@ fn __aarch64_swp4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
11991179 \\ stxr w17, w16, [x1]
12001180 \\ cbnz w17, 0b
12011181 \\1:
1202 : [ret] "={w0}" (-> u32),
1203 : [val] "{w0}" (val),
1204 [ptr] "{x1}" (ptr),
1205 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1182 \\ ret
1183 :
1184 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
12061185 : "w15", "w16", "w17", "memory"
12071186 );
1187 unreachable;
12081188}
1209fn __aarch64_ldadd4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
1189fn __aarch64_ldadd4_acq() align(16) callconv(.Naked) void {
12101190 @setRuntimeSafety(false);
1211 return asm volatile (
1191 asm volatile (
12121192 \\ cbz w16, 8f
12131193 \\ .inst 0x38200020 + 0x0000 + 0x80000000 + 0x800000
1214 \\ cbz wzr, 1f
1194 \\ ret
12151195 \\8:
12161196 \\ mov w16, w0
12171197 \\0:
......@@ -1220,19 +1200,19 @@ fn __aarch64_ldadd4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
12201200 \\ stxr w15, w17, [x1]
12211201 \\ cbnz w15, 0b
12221202 \\1:
1223 : [ret] "={w0}" (-> u32),
1224 : [val] "{w0}" (val),
1225 [ptr] "{x1}" (ptr),
1226 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1203 \\ ret
1204 :
1205 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
12271206 : "w15", "w16", "w17", "memory"
12281207 );
1208 unreachable;
12291209}
1230fn __aarch64_ldclr4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
1210fn __aarch64_ldclr4_acq() align(16) callconv(.Naked) void {
12311211 @setRuntimeSafety(false);
1232 return asm volatile (
1212 asm volatile (
12331213 \\ cbz w16, 8f
12341214 \\ .inst 0x38200020 + 0x1000 + 0x80000000 + 0x800000
1235 \\ cbz wzr, 1f
1215 \\ ret
12361216 \\8:
12371217 \\ mov w16, w0
12381218 \\0:
......@@ -1241,19 +1221,19 @@ fn __aarch64_ldclr4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
12411221 \\ stxr w15, w17, [x1]
12421222 \\ cbnz w15, 0b
12431223 \\1:
1244 : [ret] "={w0}" (-> u32),
1245 : [val] "{w0}" (val),
1246 [ptr] "{x1}" (ptr),
1247 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1224 \\ ret
1225 :
1226 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
12481227 : "w15", "w16", "w17", "memory"
12491228 );
1229 unreachable;
12501230}
1251fn __aarch64_ldeor4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
1231fn __aarch64_ldeor4_acq() align(16) callconv(.Naked) void {
12521232 @setRuntimeSafety(false);
1253 return asm volatile (
1233 asm volatile (
12541234 \\ cbz w16, 8f
12551235 \\ .inst 0x38200020 + 0x2000 + 0x80000000 + 0x800000
1256 \\ cbz wzr, 1f
1236 \\ ret
12571237 \\8:
12581238 \\ mov w16, w0
12591239 \\0:
......@@ -1262,19 +1242,19 @@ fn __aarch64_ldeor4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
12621242 \\ stxr w15, w17, [x1]
12631243 \\ cbnz w15, 0b
12641244 \\1:
1265 : [ret] "={w0}" (-> u32),
1266 : [val] "{w0}" (val),
1267 [ptr] "{x1}" (ptr),
1268 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1245 \\ ret
1246 :
1247 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
12691248 : "w15", "w16", "w17", "memory"
12701249 );
1250 unreachable;
12711251}
1272fn __aarch64_ldset4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
1252fn __aarch64_ldset4_acq() align(16) callconv(.Naked) void {
12731253 @setRuntimeSafety(false);
1274 return asm volatile (
1254 asm volatile (
12751255 \\ cbz w16, 8f
12761256 \\ .inst 0x38200020 + 0x3000 + 0x80000000 + 0x800000
1277 \\ cbz wzr, 1f
1257 \\ ret
12781258 \\8:
12791259 \\ mov w16, w0
12801260 \\0:
......@@ -1283,20 +1263,19 @@ fn __aarch64_ldset4_acq(val: u32, ptr: *u32) callconv(.C) u32 {
12831263 \\ stxr w15, w17, [x1]
12841264 \\ cbnz w15, 0b
12851265 \\1:
1286 : [ret] "={w0}" (-> u32),
1287 : [val] "{w0}" (val),
1288 [ptr] "{x1}" (ptr),
1289 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1266 \\ ret
1267 :
1268 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
12901269 : "w15", "w16", "w17", "memory"
12911270 );
1271 unreachable;
12921272}
1293fn __aarch64_cas4_rel(expected: u32, desired: u32, ptr: *u32) callconv(.C) u32 {
1273fn __aarch64_cas4_rel() align(16) callconv(.Naked) void {
12941274 @setRuntimeSafety(false);
1295 return asm volatile (
1275 asm volatile (
12961276 \\ cbz w16, 8f
12971277 \\ .inst 0x08a07c41 + 0x80000000 + 0x008000
1298 \\
1299 \\ cbz wzr, 1f
1278 \\ ret
13001279 \\8:
13011280 \\ mov w16, w0
13021281 \\0:
......@@ -1306,20 +1285,19 @@ fn __aarch64_cas4_rel(expected: u32, desired: u32, ptr: *u32) callconv(.C) u32 {
13061285 \\ stlxr w17, w1, [x2]
13071286 \\ cbnz w17, 0b
13081287 \\1:
1309 : [ret] "={w0}" (-> u32),
1310 : [expected] "{w0}" (expected),
1311 [desired] "{w1}" (desired),
1312 [ptr] "{x2}" (ptr),
1313 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1288 \\ ret
1289 :
1290 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
13141291 : "w15", "w16", "w17", "memory"
13151292 );
1293 unreachable;
13161294}
1317fn __aarch64_swp4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1295fn __aarch64_swp4_rel() align(16) callconv(.Naked) void {
13181296 @setRuntimeSafety(false);
1319 return asm volatile (
1297 asm volatile (
13201298 \\ cbz w16, 8f
13211299 \\ .inst 0x38208020 + 0x80000000 + 0x400000
1322 \\ cbz wzr, 1f
1300 \\ ret
13231301 \\8:
13241302 \\ mov w16, w0
13251303 \\0:
......@@ -1327,19 +1305,19 @@ fn __aarch64_swp4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
13271305 \\ stlxr w17, w16, [x1]
13281306 \\ cbnz w17, 0b
13291307 \\1:
1330 : [ret] "={w0}" (-> u32),
1331 : [val] "{w0}" (val),
1332 [ptr] "{x1}" (ptr),
1333 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1308 \\ ret
1309 :
1310 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
13341311 : "w15", "w16", "w17", "memory"
13351312 );
1313 unreachable;
13361314}
1337fn __aarch64_ldadd4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1315fn __aarch64_ldadd4_rel() align(16) callconv(.Naked) void {
13381316 @setRuntimeSafety(false);
1339 return asm volatile (
1317 asm volatile (
13401318 \\ cbz w16, 8f
13411319 \\ .inst 0x38200020 + 0x0000 + 0x80000000 + 0x400000
1342 \\ cbz wzr, 1f
1320 \\ ret
13431321 \\8:
13441322 \\ mov w16, w0
13451323 \\0:
......@@ -1348,19 +1326,19 @@ fn __aarch64_ldadd4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
13481326 \\ stlxr w15, w17, [x1]
13491327 \\ cbnz w15, 0b
13501328 \\1:
1351 : [ret] "={w0}" (-> u32),
1352 : [val] "{w0}" (val),
1353 [ptr] "{x1}" (ptr),
1354 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1329 \\ ret
1330 :
1331 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
13551332 : "w15", "w16", "w17", "memory"
13561333 );
1334 unreachable;
13571335}
1358fn __aarch64_ldclr4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1336fn __aarch64_ldclr4_rel() align(16) callconv(.Naked) void {
13591337 @setRuntimeSafety(false);
1360 return asm volatile (
1338 asm volatile (
13611339 \\ cbz w16, 8f
13621340 \\ .inst 0x38200020 + 0x1000 + 0x80000000 + 0x400000
1363 \\ cbz wzr, 1f
1341 \\ ret
13641342 \\8:
13651343 \\ mov w16, w0
13661344 \\0:
......@@ -1369,19 +1347,19 @@ fn __aarch64_ldclr4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
13691347 \\ stlxr w15, w17, [x1]
13701348 \\ cbnz w15, 0b
13711349 \\1:
1372 : [ret] "={w0}" (-> u32),
1373 : [val] "{w0}" (val),
1374 [ptr] "{x1}" (ptr),
1375 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1350 \\ ret
1351 :
1352 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
13761353 : "w15", "w16", "w17", "memory"
13771354 );
1355 unreachable;
13781356}
1379fn __aarch64_ldeor4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1357fn __aarch64_ldeor4_rel() align(16) callconv(.Naked) void {
13801358 @setRuntimeSafety(false);
1381 return asm volatile (
1359 asm volatile (
13821360 \\ cbz w16, 8f
13831361 \\ .inst 0x38200020 + 0x2000 + 0x80000000 + 0x400000
1384 \\ cbz wzr, 1f
1362 \\ ret
13851363 \\8:
13861364 \\ mov w16, w0
13871365 \\0:
......@@ -1390,19 +1368,19 @@ fn __aarch64_ldeor4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
13901368 \\ stlxr w15, w17, [x1]
13911369 \\ cbnz w15, 0b
13921370 \\1:
1393 : [ret] "={w0}" (-> u32),
1394 : [val] "{w0}" (val),
1395 [ptr] "{x1}" (ptr),
1396 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1371 \\ ret
1372 :
1373 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
13971374 : "w15", "w16", "w17", "memory"
13981375 );
1376 unreachable;
13991377}
1400fn __aarch64_ldset4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1378fn __aarch64_ldset4_rel() align(16) callconv(.Naked) void {
14011379 @setRuntimeSafety(false);
1402 return asm volatile (
1380 asm volatile (
14031381 \\ cbz w16, 8f
14041382 \\ .inst 0x38200020 + 0x3000 + 0x80000000 + 0x400000
1405 \\ cbz wzr, 1f
1383 \\ ret
14061384 \\8:
14071385 \\ mov w16, w0
14081386 \\0:
......@@ -1411,20 +1389,19 @@ fn __aarch64_ldset4_rel(val: u32, ptr: *u32) callconv(.C) u32 {
14111389 \\ stlxr w15, w17, [x1]
14121390 \\ cbnz w15, 0b
14131391 \\1:
1414 : [ret] "={w0}" (-> u32),
1415 : [val] "{w0}" (val),
1416 [ptr] "{x1}" (ptr),
1417 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1392 \\ ret
1393 :
1394 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
14181395 : "w15", "w16", "w17", "memory"
14191396 );
1397 unreachable;
14201398}
1421fn __aarch64_cas4_acq_rel(expected: u32, desired: u32, ptr: *u32) callconv(.C) u32 {
1399fn __aarch64_cas4_acq_rel() align(16) callconv(.Naked) void {
14221400 @setRuntimeSafety(false);
1423 return asm volatile (
1401 asm volatile (
14241402 \\ cbz w16, 8f
14251403 \\ .inst 0x08a07c41 + 0x80000000 + 0x408000
1426 \\
1427 \\ cbz wzr, 1f
1404 \\ ret
14281405 \\8:
14291406 \\ mov w16, w0
14301407 \\0:
......@@ -1434,20 +1411,19 @@ fn __aarch64_cas4_acq_rel(expected: u32, desired: u32, ptr: *u32) callconv(.C) u
14341411 \\ stlxr w17, w1, [x2]
14351412 \\ cbnz w17, 0b
14361413 \\1:
1437 : [ret] "={w0}" (-> u32),
1438 : [expected] "{w0}" (expected),
1439 [desired] "{w1}" (desired),
1440 [ptr] "{x2}" (ptr),
1441 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1414 \\ ret
1415 :
1416 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
14421417 : "w15", "w16", "w17", "memory"
14431418 );
1419 unreachable;
14441420}
1445fn __aarch64_swp4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1421fn __aarch64_swp4_acq_rel() align(16) callconv(.Naked) void {
14461422 @setRuntimeSafety(false);
1447 return asm volatile (
1423 asm volatile (
14481424 \\ cbz w16, 8f
14491425 \\ .inst 0x38208020 + 0x80000000 + 0xc00000
1450 \\ cbz wzr, 1f
1426 \\ ret
14511427 \\8:
14521428 \\ mov w16, w0
14531429 \\0:
......@@ -1455,19 +1431,19 @@ fn __aarch64_swp4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
14551431 \\ stlxr w17, w16, [x1]
14561432 \\ cbnz w17, 0b
14571433 \\1:
1458 : [ret] "={w0}" (-> u32),
1459 : [val] "{w0}" (val),
1460 [ptr] "{x1}" (ptr),
1461 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1434 \\ ret
1435 :
1436 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
14621437 : "w15", "w16", "w17", "memory"
14631438 );
1439 unreachable;
14641440}
1465fn __aarch64_ldadd4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1441fn __aarch64_ldadd4_acq_rel() align(16) callconv(.Naked) void {
14661442 @setRuntimeSafety(false);
1467 return asm volatile (
1443 asm volatile (
14681444 \\ cbz w16, 8f
14691445 \\ .inst 0x38200020 + 0x0000 + 0x80000000 + 0xc00000
1470 \\ cbz wzr, 1f
1446 \\ ret
14711447 \\8:
14721448 \\ mov w16, w0
14731449 \\0:
......@@ -1476,19 +1452,19 @@ fn __aarch64_ldadd4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
14761452 \\ stlxr w15, w17, [x1]
14771453 \\ cbnz w15, 0b
14781454 \\1:
1479 : [ret] "={w0}" (-> u32),
1480 : [val] "{w0}" (val),
1481 [ptr] "{x1}" (ptr),
1482 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1455 \\ ret
1456 :
1457 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
14831458 : "w15", "w16", "w17", "memory"
14841459 );
1460 unreachable;
14851461}
1486fn __aarch64_ldclr4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1462fn __aarch64_ldclr4_acq_rel() align(16) callconv(.Naked) void {
14871463 @setRuntimeSafety(false);
1488 return asm volatile (
1464 asm volatile (
14891465 \\ cbz w16, 8f
14901466 \\ .inst 0x38200020 + 0x1000 + 0x80000000 + 0xc00000
1491 \\ cbz wzr, 1f
1467 \\ ret
14921468 \\8:
14931469 \\ mov w16, w0
14941470 \\0:
......@@ -1497,19 +1473,19 @@ fn __aarch64_ldclr4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
14971473 \\ stlxr w15, w17, [x1]
14981474 \\ cbnz w15, 0b
14991475 \\1:
1500 : [ret] "={w0}" (-> u32),
1501 : [val] "{w0}" (val),
1502 [ptr] "{x1}" (ptr),
1503 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1476 \\ ret
1477 :
1478 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
15041479 : "w15", "w16", "w17", "memory"
15051480 );
1481 unreachable;
15061482}
1507fn __aarch64_ldeor4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1483fn __aarch64_ldeor4_acq_rel() align(16) callconv(.Naked) void {
15081484 @setRuntimeSafety(false);
1509 return asm volatile (
1485 asm volatile (
15101486 \\ cbz w16, 8f
15111487 \\ .inst 0x38200020 + 0x2000 + 0x80000000 + 0xc00000
1512 \\ cbz wzr, 1f
1488 \\ ret
15131489 \\8:
15141490 \\ mov w16, w0
15151491 \\0:
......@@ -1518,19 +1494,19 @@ fn __aarch64_ldeor4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
15181494 \\ stlxr w15, w17, [x1]
15191495 \\ cbnz w15, 0b
15201496 \\1:
1521 : [ret] "={w0}" (-> u32),
1522 : [val] "{w0}" (val),
1523 [ptr] "{x1}" (ptr),
1524 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1497 \\ ret
1498 :
1499 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
15251500 : "w15", "w16", "w17", "memory"
15261501 );
1502 unreachable;
15271503}
1528fn __aarch64_ldset4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
1504fn __aarch64_ldset4_acq_rel() align(16) callconv(.Naked) void {
15291505 @setRuntimeSafety(false);
1530 return asm volatile (
1506 asm volatile (
15311507 \\ cbz w16, 8f
15321508 \\ .inst 0x38200020 + 0x3000 + 0x80000000 + 0xc00000
1533 \\ cbz wzr, 1f
1509 \\ ret
15341510 \\8:
15351511 \\ mov w16, w0
15361512 \\0:
......@@ -1539,20 +1515,19 @@ fn __aarch64_ldset4_acq_rel(val: u32, ptr: *u32) callconv(.C) u32 {
15391515 \\ stlxr w15, w17, [x1]
15401516 \\ cbnz w15, 0b
15411517 \\1:
1542 : [ret] "={w0}" (-> u32),
1543 : [val] "{w0}" (val),
1544 [ptr] "{x1}" (ptr),
1545 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1518 \\ ret
1519 :
1520 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
15461521 : "w15", "w16", "w17", "memory"
15471522 );
1523 unreachable;
15481524}
1549fn __aarch64_cas8_relax(expected: u64, desired: u64, ptr: *u64) callconv(.C) u64 {
1525fn __aarch64_cas8_relax() align(16) callconv(.Naked) void {
15501526 @setRuntimeSafety(false);
1551 return asm volatile (
1527 asm volatile (
15521528 \\ cbz w16, 8f
15531529 \\ .inst 0x08a07c41 + 0xc0000000 + 0x000000
1554 \\
1555 \\ cbz wzr, 1f
1530 \\ ret
15561531 \\8:
15571532 \\ mov x16, x0
15581533 \\0:
......@@ -1562,20 +1537,19 @@ fn __aarch64_cas8_relax(expected: u64, desired: u64, ptr: *u64) callconv(.C) u64
15621537 \\ stxr w17, x1, [x2]
15631538 \\ cbnz w17, 0b
15641539 \\1:
1565 : [ret] "={x0}" (-> u64),
1566 : [expected] "{x0}" (expected),
1567 [desired] "{x1}" (desired),
1568 [ptr] "{x2}" (ptr),
1569 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1540 \\ ret
1541 :
1542 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
15701543 : "w15", "w16", "w17", "memory"
15711544 );
1545 unreachable;
15721546}
1573fn __aarch64_swp8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
1547fn __aarch64_swp8_relax() align(16) callconv(.Naked) void {
15741548 @setRuntimeSafety(false);
1575 return asm volatile (
1549 asm volatile (
15761550 \\ cbz w16, 8f
15771551 \\ .inst 0x38208020 + 0xc0000000 + 0x000000
1578 \\ cbz wzr, 1f
1552 \\ ret
15791553 \\8:
15801554 \\ mov x16, x0
15811555 \\0:
......@@ -1583,19 +1557,19 @@ fn __aarch64_swp8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
15831557 \\ stxr w17, x16, [x1]
15841558 \\ cbnz w17, 0b
15851559 \\1:
1586 : [ret] "={x0}" (-> u64),
1587 : [val] "{x0}" (val),
1588 [ptr] "{x1}" (ptr),
1589 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1560 \\ ret
1561 :
1562 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
15901563 : "w15", "w16", "w17", "memory"
15911564 );
1565 unreachable;
15921566}
1593fn __aarch64_ldadd8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
1567fn __aarch64_ldadd8_relax() align(16) callconv(.Naked) void {
15941568 @setRuntimeSafety(false);
1595 return asm volatile (
1569 asm volatile (
15961570 \\ cbz w16, 8f
15971571 \\ .inst 0x38200020 + 0x0000 + 0xc0000000 + 0x000000
1598 \\ cbz wzr, 1f
1572 \\ ret
15991573 \\8:
16001574 \\ mov x16, x0
16011575 \\0:
......@@ -1604,19 +1578,19 @@ fn __aarch64_ldadd8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
16041578 \\ stxr w15, x17, [x1]
16051579 \\ cbnz w15, 0b
16061580 \\1:
1607 : [ret] "={x0}" (-> u64),
1608 : [val] "{x0}" (val),
1609 [ptr] "{x1}" (ptr),
1610 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1581 \\ ret
1582 :
1583 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
16111584 : "w15", "w16", "w17", "memory"
16121585 );
1586 unreachable;
16131587}
1614fn __aarch64_ldclr8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
1588fn __aarch64_ldclr8_relax() align(16) callconv(.Naked) void {
16151589 @setRuntimeSafety(false);
1616 return asm volatile (
1590 asm volatile (
16171591 \\ cbz w16, 8f
16181592 \\ .inst 0x38200020 + 0x1000 + 0xc0000000 + 0x000000
1619 \\ cbz wzr, 1f
1593 \\ ret
16201594 \\8:
16211595 \\ mov x16, x0
16221596 \\0:
......@@ -1625,19 +1599,19 @@ fn __aarch64_ldclr8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
16251599 \\ stxr w15, x17, [x1]
16261600 \\ cbnz w15, 0b
16271601 \\1:
1628 : [ret] "={x0}" (-> u64),
1629 : [val] "{x0}" (val),
1630 [ptr] "{x1}" (ptr),
1631 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1602 \\ ret
1603 :
1604 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
16321605 : "w15", "w16", "w17", "memory"
16331606 );
1607 unreachable;
16341608}
1635fn __aarch64_ldeor8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
1609fn __aarch64_ldeor8_relax() align(16) callconv(.Naked) void {
16361610 @setRuntimeSafety(false);
1637 return asm volatile (
1611 asm volatile (
16381612 \\ cbz w16, 8f
16391613 \\ .inst 0x38200020 + 0x2000 + 0xc0000000 + 0x000000
1640 \\ cbz wzr, 1f
1614 \\ ret
16411615 \\8:
16421616 \\ mov x16, x0
16431617 \\0:
......@@ -1646,19 +1620,19 @@ fn __aarch64_ldeor8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
16461620 \\ stxr w15, x17, [x1]
16471621 \\ cbnz w15, 0b
16481622 \\1:
1649 : [ret] "={x0}" (-> u64),
1650 : [val] "{x0}" (val),
1651 [ptr] "{x1}" (ptr),
1652 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1623 \\ ret
1624 :
1625 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
16531626 : "w15", "w16", "w17", "memory"
16541627 );
1628 unreachable;
16551629}
1656fn __aarch64_ldset8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
1630fn __aarch64_ldset8_relax() align(16) callconv(.Naked) void {
16571631 @setRuntimeSafety(false);
1658 return asm volatile (
1632 asm volatile (
16591633 \\ cbz w16, 8f
16601634 \\ .inst 0x38200020 + 0x3000 + 0xc0000000 + 0x000000
1661 \\ cbz wzr, 1f
1635 \\ ret
16621636 \\8:
16631637 \\ mov x16, x0
16641638 \\0:
......@@ -1667,20 +1641,19 @@ fn __aarch64_ldset8_relax(val: u64, ptr: *u64) callconv(.C) u64 {
16671641 \\ stxr w15, x17, [x1]
16681642 \\ cbnz w15, 0b
16691643 \\1:
1670 : [ret] "={x0}" (-> u64),
1671 : [val] "{x0}" (val),
1672 [ptr] "{x1}" (ptr),
1673 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1644 \\ ret
1645 :
1646 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
16741647 : "w15", "w16", "w17", "memory"
16751648 );
1649 unreachable;
16761650}
1677fn __aarch64_cas8_acq(expected: u64, desired: u64, ptr: *u64) callconv(.C) u64 {
1651fn __aarch64_cas8_acq() align(16) callconv(.Naked) void {
16781652 @setRuntimeSafety(false);
1679 return asm volatile (
1653 asm volatile (
16801654 \\ cbz w16, 8f
16811655 \\ .inst 0x08a07c41 + 0xc0000000 + 0x400000
1682 \\
1683 \\ cbz wzr, 1f
1656 \\ ret
16841657 \\8:
16851658 \\ mov x16, x0
16861659 \\0:
......@@ -1690,20 +1663,19 @@ fn __aarch64_cas8_acq(expected: u64, desired: u64, ptr: *u64) callconv(.C) u64 {
16901663 \\ stxr w17, x1, [x2]
16911664 \\ cbnz w17, 0b
16921665 \\1:
1693 : [ret] "={x0}" (-> u64),
1694 : [expected] "{x0}" (expected),
1695 [desired] "{x1}" (desired),
1696 [ptr] "{x2}" (ptr),
1697 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1666 \\ ret
1667 :
1668 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
16981669 : "w15", "w16", "w17", "memory"
16991670 );
1671 unreachable;
17001672}
1701fn __aarch64_swp8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
1673fn __aarch64_swp8_acq() align(16) callconv(.Naked) void {
17021674 @setRuntimeSafety(false);
1703 return asm volatile (
1675 asm volatile (
17041676 \\ cbz w16, 8f
17051677 \\ .inst 0x38208020 + 0xc0000000 + 0x800000
1706 \\ cbz wzr, 1f
1678 \\ ret
17071679 \\8:
17081680 \\ mov x16, x0
17091681 \\0:
......@@ -1711,19 +1683,19 @@ fn __aarch64_swp8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
17111683 \\ stxr w17, x16, [x1]
17121684 \\ cbnz w17, 0b
17131685 \\1:
1714 : [ret] "={x0}" (-> u64),
1715 : [val] "{x0}" (val),
1716 [ptr] "{x1}" (ptr),
1717 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1686 \\ ret
1687 :
1688 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
17181689 : "w15", "w16", "w17", "memory"
17191690 );
1691 unreachable;
17201692}
1721fn __aarch64_ldadd8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
1693fn __aarch64_ldadd8_acq() align(16) callconv(.Naked) void {
17221694 @setRuntimeSafety(false);
1723 return asm volatile (
1695 asm volatile (
17241696 \\ cbz w16, 8f
17251697 \\ .inst 0x38200020 + 0x0000 + 0xc0000000 + 0x800000
1726 \\ cbz wzr, 1f
1698 \\ ret
17271699 \\8:
17281700 \\ mov x16, x0
17291701 \\0:
......@@ -1732,19 +1704,19 @@ fn __aarch64_ldadd8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
17321704 \\ stxr w15, x17, [x1]
17331705 \\ cbnz w15, 0b
17341706 \\1:
1735 : [ret] "={x0}" (-> u64),
1736 : [val] "{x0}" (val),
1737 [ptr] "{x1}" (ptr),
1738 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1707 \\ ret
1708 :
1709 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
17391710 : "w15", "w16", "w17", "memory"
17401711 );
1712 unreachable;
17411713}
1742fn __aarch64_ldclr8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
1714fn __aarch64_ldclr8_acq() align(16) callconv(.Naked) void {
17431715 @setRuntimeSafety(false);
1744 return asm volatile (
1716 asm volatile (
17451717 \\ cbz w16, 8f
17461718 \\ .inst 0x38200020 + 0x1000 + 0xc0000000 + 0x800000
1747 \\ cbz wzr, 1f
1719 \\ ret
17481720 \\8:
17491721 \\ mov x16, x0
17501722 \\0:
......@@ -1753,19 +1725,19 @@ fn __aarch64_ldclr8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
17531725 \\ stxr w15, x17, [x1]
17541726 \\ cbnz w15, 0b
17551727 \\1:
1756 : [ret] "={x0}" (-> u64),
1757 : [val] "{x0}" (val),
1758 [ptr] "{x1}" (ptr),
1759 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1728 \\ ret
1729 :
1730 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
17601731 : "w15", "w16", "w17", "memory"
17611732 );
1733 unreachable;
17621734}
1763fn __aarch64_ldeor8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
1735fn __aarch64_ldeor8_acq() align(16) callconv(.Naked) void {
17641736 @setRuntimeSafety(false);
1765 return asm volatile (
1737 asm volatile (
17661738 \\ cbz w16, 8f
17671739 \\ .inst 0x38200020 + 0x2000 + 0xc0000000 + 0x800000
1768 \\ cbz wzr, 1f
1740 \\ ret
17691741 \\8:
17701742 \\ mov x16, x0
17711743 \\0:
......@@ -1774,19 +1746,19 @@ fn __aarch64_ldeor8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
17741746 \\ stxr w15, x17, [x1]
17751747 \\ cbnz w15, 0b
17761748 \\1:
1777 : [ret] "={x0}" (-> u64),
1778 : [val] "{x0}" (val),
1779 [ptr] "{x1}" (ptr),
1780 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1749 \\ ret
1750 :
1751 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
17811752 : "w15", "w16", "w17", "memory"
17821753 );
1754 unreachable;
17831755}
1784fn __aarch64_ldset8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
1756fn __aarch64_ldset8_acq() align(16) callconv(.Naked) void {
17851757 @setRuntimeSafety(false);
1786 return asm volatile (
1758 asm volatile (
17871759 \\ cbz w16, 8f
17881760 \\ .inst 0x38200020 + 0x3000 + 0xc0000000 + 0x800000
1789 \\ cbz wzr, 1f
1761 \\ ret
17901762 \\8:
17911763 \\ mov x16, x0
17921764 \\0:
......@@ -1795,20 +1767,19 @@ fn __aarch64_ldset8_acq(val: u64, ptr: *u64) callconv(.C) u64 {
17951767 \\ stxr w15, x17, [x1]
17961768 \\ cbnz w15, 0b
17971769 \\1:
1798 : [ret] "={x0}" (-> u64),
1799 : [val] "{x0}" (val),
1800 [ptr] "{x1}" (ptr),
1801 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1770 \\ ret
1771 :
1772 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
18021773 : "w15", "w16", "w17", "memory"
18031774 );
1775 unreachable;
18041776}
1805fn __aarch64_cas8_rel(expected: u64, desired: u64, ptr: *u64) callconv(.C) u64 {
1777fn __aarch64_cas8_rel() align(16) callconv(.Naked) void {
18061778 @setRuntimeSafety(false);
1807 return asm volatile (
1779 asm volatile (
18081780 \\ cbz w16, 8f
18091781 \\ .inst 0x08a07c41 + 0xc0000000 + 0x008000
1810 \\
1811 \\ cbz wzr, 1f
1782 \\ ret
18121783 \\8:
18131784 \\ mov x16, x0
18141785 \\0:
......@@ -1818,20 +1789,19 @@ fn __aarch64_cas8_rel(expected: u64, desired: u64, ptr: *u64) callconv(.C) u64 {
18181789 \\ stlxr w17, x1, [x2]
18191790 \\ cbnz w17, 0b
18201791 \\1:
1821 : [ret] "={x0}" (-> u64),
1822 : [expected] "{x0}" (expected),
1823 [desired] "{x1}" (desired),
1824 [ptr] "{x2}" (ptr),
1825 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1792 \\ ret
1793 :
1794 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
18261795 : "w15", "w16", "w17", "memory"
18271796 );
1797 unreachable;
18281798}
1829fn __aarch64_swp8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1799fn __aarch64_swp8_rel() align(16) callconv(.Naked) void {
18301800 @setRuntimeSafety(false);
1831 return asm volatile (
1801 asm volatile (
18321802 \\ cbz w16, 8f
18331803 \\ .inst 0x38208020 + 0xc0000000 + 0x400000
1834 \\ cbz wzr, 1f
1804 \\ ret
18351805 \\8:
18361806 \\ mov x16, x0
18371807 \\0:
......@@ -1839,19 +1809,19 @@ fn __aarch64_swp8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
18391809 \\ stlxr w17, x16, [x1]
18401810 \\ cbnz w17, 0b
18411811 \\1:
1842 : [ret] "={x0}" (-> u64),
1843 : [val] "{x0}" (val),
1844 [ptr] "{x1}" (ptr),
1845 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1812 \\ ret
1813 :
1814 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
18461815 : "w15", "w16", "w17", "memory"
18471816 );
1817 unreachable;
18481818}
1849fn __aarch64_ldadd8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1819fn __aarch64_ldadd8_rel() align(16) callconv(.Naked) void {
18501820 @setRuntimeSafety(false);
1851 return asm volatile (
1821 asm volatile (
18521822 \\ cbz w16, 8f
18531823 \\ .inst 0x38200020 + 0x0000 + 0xc0000000 + 0x400000
1854 \\ cbz wzr, 1f
1824 \\ ret
18551825 \\8:
18561826 \\ mov x16, x0
18571827 \\0:
......@@ -1860,19 +1830,19 @@ fn __aarch64_ldadd8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
18601830 \\ stlxr w15, x17, [x1]
18611831 \\ cbnz w15, 0b
18621832 \\1:
1863 : [ret] "={x0}" (-> u64),
1864 : [val] "{x0}" (val),
1865 [ptr] "{x1}" (ptr),
1866 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1833 \\ ret
1834 :
1835 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
18671836 : "w15", "w16", "w17", "memory"
18681837 );
1838 unreachable;
18691839}
1870fn __aarch64_ldclr8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1840fn __aarch64_ldclr8_rel() align(16) callconv(.Naked) void {
18711841 @setRuntimeSafety(false);
1872 return asm volatile (
1842 asm volatile (
18731843 \\ cbz w16, 8f
18741844 \\ .inst 0x38200020 + 0x1000 + 0xc0000000 + 0x400000
1875 \\ cbz wzr, 1f
1845 \\ ret
18761846 \\8:
18771847 \\ mov x16, x0
18781848 \\0:
......@@ -1881,19 +1851,19 @@ fn __aarch64_ldclr8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
18811851 \\ stlxr w15, x17, [x1]
18821852 \\ cbnz w15, 0b
18831853 \\1:
1884 : [ret] "={x0}" (-> u64),
1885 : [val] "{x0}" (val),
1886 [ptr] "{x1}" (ptr),
1887 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1854 \\ ret
1855 :
1856 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
18881857 : "w15", "w16", "w17", "memory"
18891858 );
1859 unreachable;
18901860}
1891fn __aarch64_ldeor8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1861fn __aarch64_ldeor8_rel() align(16) callconv(.Naked) void {
18921862 @setRuntimeSafety(false);
1893 return asm volatile (
1863 asm volatile (
18941864 \\ cbz w16, 8f
18951865 \\ .inst 0x38200020 + 0x2000 + 0xc0000000 + 0x400000
1896 \\ cbz wzr, 1f
1866 \\ ret
18971867 \\8:
18981868 \\ mov x16, x0
18991869 \\0:
......@@ -1902,19 +1872,19 @@ fn __aarch64_ldeor8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
19021872 \\ stlxr w15, x17, [x1]
19031873 \\ cbnz w15, 0b
19041874 \\1:
1905 : [ret] "={x0}" (-> u64),
1906 : [val] "{x0}" (val),
1907 [ptr] "{x1}" (ptr),
1908 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1875 \\ ret
1876 :
1877 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
19091878 : "w15", "w16", "w17", "memory"
19101879 );
1880 unreachable;
19111881}
1912fn __aarch64_ldset8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1882fn __aarch64_ldset8_rel() align(16) callconv(.Naked) void {
19131883 @setRuntimeSafety(false);
1914 return asm volatile (
1884 asm volatile (
19151885 \\ cbz w16, 8f
19161886 \\ .inst 0x38200020 + 0x3000 + 0xc0000000 + 0x400000
1917 \\ cbz wzr, 1f
1887 \\ ret
19181888 \\8:
19191889 \\ mov x16, x0
19201890 \\0:
......@@ -1923,20 +1893,19 @@ fn __aarch64_ldset8_rel(val: u64, ptr: *u64) callconv(.C) u64 {
19231893 \\ stlxr w15, x17, [x1]
19241894 \\ cbnz w15, 0b
19251895 \\1:
1926 : [ret] "={x0}" (-> u64),
1927 : [val] "{x0}" (val),
1928 [ptr] "{x1}" (ptr),
1929 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1896 \\ ret
1897 :
1898 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
19301899 : "w15", "w16", "w17", "memory"
19311900 );
1901 unreachable;
19321902}
1933fn __aarch64_cas8_acq_rel(expected: u64, desired: u64, ptr: *u64) callconv(.C) u64 {
1903fn __aarch64_cas8_acq_rel() align(16) callconv(.Naked) void {
19341904 @setRuntimeSafety(false);
1935 return asm volatile (
1905 asm volatile (
19361906 \\ cbz w16, 8f
19371907 \\ .inst 0x08a07c41 + 0xc0000000 + 0x408000
1938 \\
1939 \\ cbz wzr, 1f
1908 \\ ret
19401909 \\8:
19411910 \\ mov x16, x0
19421911 \\0:
......@@ -1946,20 +1915,19 @@ fn __aarch64_cas8_acq_rel(expected: u64, desired: u64, ptr: *u64) callconv(.C) u
19461915 \\ stlxr w17, x1, [x2]
19471916 \\ cbnz w17, 0b
19481917 \\1:
1949 : [ret] "={x0}" (-> u64),
1950 : [expected] "{x0}" (expected),
1951 [desired] "{x1}" (desired),
1952 [ptr] "{x2}" (ptr),
1953 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1918 \\ ret
1919 :
1920 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
19541921 : "w15", "w16", "w17", "memory"
19551922 );
1923 unreachable;
19561924}
1957fn __aarch64_swp8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1925fn __aarch64_swp8_acq_rel() align(16) callconv(.Naked) void {
19581926 @setRuntimeSafety(false);
1959 return asm volatile (
1927 asm volatile (
19601928 \\ cbz w16, 8f
19611929 \\ .inst 0x38208020 + 0xc0000000 + 0xc00000
1962 \\ cbz wzr, 1f
1930 \\ ret
19631931 \\8:
19641932 \\ mov x16, x0
19651933 \\0:
......@@ -1967,19 +1935,19 @@ fn __aarch64_swp8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
19671935 \\ stlxr w17, x16, [x1]
19681936 \\ cbnz w17, 0b
19691937 \\1:
1970 : [ret] "={x0}" (-> u64),
1971 : [val] "{x0}" (val),
1972 [ptr] "{x1}" (ptr),
1973 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1938 \\ ret
1939 :
1940 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
19741941 : "w15", "w16", "w17", "memory"
19751942 );
1943 unreachable;
19761944}
1977fn __aarch64_ldadd8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1945fn __aarch64_ldadd8_acq_rel() align(16) callconv(.Naked) void {
19781946 @setRuntimeSafety(false);
1979 return asm volatile (
1947 asm volatile (
19801948 \\ cbz w16, 8f
19811949 \\ .inst 0x38200020 + 0x0000 + 0xc0000000 + 0xc00000
1982 \\ cbz wzr, 1f
1950 \\ ret
19831951 \\8:
19841952 \\ mov x16, x0
19851953 \\0:
......@@ -1988,19 +1956,19 @@ fn __aarch64_ldadd8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
19881956 \\ stlxr w15, x17, [x1]
19891957 \\ cbnz w15, 0b
19901958 \\1:
1991 : [ret] "={x0}" (-> u64),
1992 : [val] "{x0}" (val),
1993 [ptr] "{x1}" (ptr),
1994 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1959 \\ ret
1960 :
1961 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
19951962 : "w15", "w16", "w17", "memory"
19961963 );
1964 unreachable;
19971965}
1998fn __aarch64_ldclr8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1966fn __aarch64_ldclr8_acq_rel() align(16) callconv(.Naked) void {
19991967 @setRuntimeSafety(false);
2000 return asm volatile (
1968 asm volatile (
20011969 \\ cbz w16, 8f
20021970 \\ .inst 0x38200020 + 0x1000 + 0xc0000000 + 0xc00000
2003 \\ cbz wzr, 1f
1971 \\ ret
20041972 \\8:
20051973 \\ mov x16, x0
20061974 \\0:
......@@ -2009,19 +1977,19 @@ fn __aarch64_ldclr8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
20091977 \\ stlxr w15, x17, [x1]
20101978 \\ cbnz w15, 0b
20111979 \\1:
2012 : [ret] "={x0}" (-> u64),
2013 : [val] "{x0}" (val),
2014 [ptr] "{x1}" (ptr),
2015 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1980 \\ ret
1981 :
1982 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
20161983 : "w15", "w16", "w17", "memory"
20171984 );
1985 unreachable;
20181986}
2019fn __aarch64_ldeor8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
1987fn __aarch64_ldeor8_acq_rel() align(16) callconv(.Naked) void {
20201988 @setRuntimeSafety(false);
2021 return asm volatile (
1989 asm volatile (
20221990 \\ cbz w16, 8f
20231991 \\ .inst 0x38200020 + 0x2000 + 0xc0000000 + 0xc00000
2024 \\ cbz wzr, 1f
1992 \\ ret
20251993 \\8:
20261994 \\ mov x16, x0
20271995 \\0:
......@@ -2030,19 +1998,19 @@ fn __aarch64_ldeor8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
20301998 \\ stlxr w15, x17, [x1]
20311999 \\ cbnz w15, 0b
20322000 \\1:
2033 : [ret] "={x0}" (-> u64),
2034 : [val] "{x0}" (val),
2035 [ptr] "{x1}" (ptr),
2036 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2001 \\ ret
2002 :
2003 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
20372004 : "w15", "w16", "w17", "memory"
20382005 );
2006 unreachable;
20392007}
2040fn __aarch64_ldset8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
2008fn __aarch64_ldset8_acq_rel() align(16) callconv(.Naked) void {
20412009 @setRuntimeSafety(false);
2042 return asm volatile (
2010 asm volatile (
20432011 \\ cbz w16, 8f
20442012 \\ .inst 0x38200020 + 0x3000 + 0xc0000000 + 0xc00000
2045 \\ cbz wzr, 1f
2013 \\ ret
20462014 \\8:
20472015 \\ mov x16, x0
20482016 \\0:
......@@ -2051,20 +2019,19 @@ fn __aarch64_ldset8_acq_rel(val: u64, ptr: *u64) callconv(.C) u64 {
20512019 \\ stlxr w15, x17, [x1]
20522020 \\ cbnz w15, 0b
20532021 \\1:
2054 : [ret] "={x0}" (-> u64),
2055 : [val] "{x0}" (val),
2056 [ptr] "{x1}" (ptr),
2057 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2022 \\ ret
2023 :
2024 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
20582025 : "w15", "w16", "w17", "memory"
20592026 );
2027 unreachable;
20602028}
2061fn __aarch64_cas16_relax(expected: u128, desired: u128, ptr: *u128) callconv(.C) u128 {
2029fn __aarch64_cas16_relax() align(16) callconv(.Naked) void {
20622030 @setRuntimeSafety(false);
2063 return asm volatile (
2031 asm volatile (
20642032 \\ cbz w16, 8f
20652033 \\ .inst 0x48207c82 + 0x000000
2066 \\
2067 \\ cbz wzr, 1f
2034 \\ ret
20682035 \\8:
20692036 \\ mov x16, x0
20702037 \\ mov x17, x1
......@@ -2076,21 +2043,19 @@ fn __aarch64_cas16_relax(expected: u128, desired: u128, ptr: *u128) callconv(.C)
20762043 \\ stxp w15, x2, x3, [x4]
20772044 \\ cbnz w15, 0b
20782045 \\1:
2079 : [ret] "={x0}" (-> u128),
2080 : [expected] "{x0}" (expected),
2081 [desired] "{x1}" (desired),
2082 [ptr] "{x2}" (ptr),
2083 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2046 \\ ret
2047 :
2048 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
20842049 : "w15", "w16", "w17", "memory"
20852050 );
2051 unreachable;
20862052}
2087fn __aarch64_cas16_acq(expected: u128, desired: u128, ptr: *u128) callconv(.C) u128 {
2053fn __aarch64_cas16_acq() align(16) callconv(.Naked) void {
20882054 @setRuntimeSafety(false);
2089 return asm volatile (
2055 asm volatile (
20902056 \\ cbz w16, 8f
20912057 \\ .inst 0x48207c82 + 0x400000
2092 \\
2093 \\ cbz wzr, 1f
2058 \\ ret
20942059 \\8:
20952060 \\ mov x16, x0
20962061 \\ mov x17, x1
......@@ -2102,21 +2067,19 @@ fn __aarch64_cas16_acq(expected: u128, desired: u128, ptr: *u128) callconv(.C) u
21022067 \\ stxp w15, x2, x3, [x4]
21032068 \\ cbnz w15, 0b
21042069 \\1:
2105 : [ret] "={x0}" (-> u128),
2106 : [expected] "{x0}" (expected),
2107 [desired] "{x1}" (desired),
2108 [ptr] "{x2}" (ptr),
2109 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2070 \\ ret
2071 :
2072 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
21102073 : "w15", "w16", "w17", "memory"
21112074 );
2075 unreachable;
21122076}
2113fn __aarch64_cas16_rel(expected: u128, desired: u128, ptr: *u128) callconv(.C) u128 {
2077fn __aarch64_cas16_rel() align(16) callconv(.Naked) void {
21142078 @setRuntimeSafety(false);
2115 return asm volatile (
2079 asm volatile (
21162080 \\ cbz w16, 8f
21172081 \\ .inst 0x48207c82 + 0x008000
2118 \\
2119 \\ cbz wzr, 1f
2082 \\ ret
21202083 \\8:
21212084 \\ mov x16, x0
21222085 \\ mov x17, x1
......@@ -2128,21 +2091,19 @@ fn __aarch64_cas16_rel(expected: u128, desired: u128, ptr: *u128) callconv(.C) u
21282091 \\ stlxp w15, x2, x3, [x4]
21292092 \\ cbnz w15, 0b
21302093 \\1:
2131 : [ret] "={x0}" (-> u128),
2132 : [expected] "{x0}" (expected),
2133 [desired] "{x1}" (desired),
2134 [ptr] "{x2}" (ptr),
2135 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2094 \\ ret
2095 :
2096 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
21362097 : "w15", "w16", "w17", "memory"
21372098 );
2099 unreachable;
21382100}
2139fn __aarch64_cas16_acq_rel(expected: u128, desired: u128, ptr: *u128) callconv(.C) u128 {
2101fn __aarch64_cas16_acq_rel() align(16) callconv(.Naked) void {
21402102 @setRuntimeSafety(false);
2141 return asm volatile (
2103 asm volatile (
21422104 \\ cbz w16, 8f
21432105 \\ .inst 0x48207c82 + 0x408000
2144 \\
2145 \\ cbz wzr, 1f
2106 \\ ret
21462107 \\8:
21472108 \\ mov x16, x0
21482109 \\ mov x17, x1
......@@ -2154,13 +2115,12 @@ fn __aarch64_cas16_acq_rel(expected: u128, desired: u128, ptr: *u128) callconv(.
21542115 \\ stlxp w15, x2, x3, [x4]
21552116 \\ cbnz w15, 0b
21562117 \\1:
2157 : [ret] "={x0}" (-> u128),
2158 : [expected] "{x0}" (expected),
2159 [desired] "{x1}" (desired),
2160 [ptr] "{x2}" (ptr),
2161 [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2118 \\ ret
2119 :
2120 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
21622121 : "w15", "w16", "w17", "memory"
21632122 );
2123 unreachable;
21642124}
21652125
21662126comptime {
tools/gen_outline_atomics.zig+26-53
......@@ -76,21 +76,16 @@ fn writeFunction(
7676 .ldeor => try generateLd(arena, n, order, .ldeor),
7777 .ldset => try generateLd(arena, n, order, .ldset),
7878 };
79 const fn_sig = if (op != .cas)
80 try std.fmt.allocPrint(arena, "fn {[name]s}(val: u{[n]d}, ptr: *u{[n]d}) callconv(.C) u{[n]d} {{", .{
81 .name = name,
82 .n = n.toBits(),
83 })
84 else
85 try std.fmt.allocPrint(arena, "fn {[name]s}(expected: u{[n]d}, desired: u{[n]d}, ptr: *u{[n]d}) callconv(.C) u{[n]d} {{", .{
86 .name = name,
87 .n = n.toBits(),
88 });
79 const fn_sig = try std.fmt.allocPrint(
80 arena,
81 "fn {[name]s}() align(16) callconv(.Naked) void {{",
82 .{ .name = name },
83 );
8984 try w.writeAll(fn_sig);
9085 try w.writeAll(
9186 \\
9287 \\ @setRuntimeSafety(false);
93 \\ return asm volatile (
88 \\ asm volatile (
9489 \\
9590 );
9691 var iter = std.mem.split(u8, body, "\n");
......@@ -99,32 +94,15 @@ fn writeFunction(
9994 try w.writeAll(line);
10095 try w.writeAll("\n");
10196 }
102 const constraints = if (op != .cas)
103 try std.fmt.allocPrint(arena,
104 \\ : [ret] "={{{[reg]s}0}}" (-> u{[ty]d}),
105 \\ : [val] "{{{[reg]s}0}}" (val),
106 \\ [ptr] "{{x1}}" (ptr),
107 \\ [__aarch64_have_lse_atomics] "{{w16}}" (__aarch64_have_lse_atomics),
108 \\ : "w15", "w16", "w17", "memory"
109 \\
110 , .{ .reg = n.register(), .ty = n.toBits() })
111 else
112 try std.fmt.allocPrint(arena,
113 \\ : [ret] "={{{[reg]s}0}}" (-> u{[ty]d}),
114 \\ : [expected] "{{{[reg]s}0}}" (expected),
115 \\ [desired] "{{{[reg]s}1}}" (desired),
116 \\ [ptr] "{{x2}}" (ptr),
117 \\ [__aarch64_have_lse_atomics] "{{w16}}" (__aarch64_have_lse_atomics),
118 \\ : "w15", "w16", "w17", "memory"
119 \\
120 , .{ .reg = n.register(), .ty = n.toBits() });
121
122 try w.writeAll(constraints);
12397 try w.writeAll(
98 \\ :
99 \\ : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
100 \\ : "w15", "w16", "w17", "memory"
124101 \\ );
102 \\ unreachable;
103 \\}
125104 \\
126105 );
127 try w.writeAll("}\n");
128106}
129107
130108const N = enum(u8) {
......@@ -185,11 +163,11 @@ const Ordering = enum {
185163 acq_rel,
186164
187165 const Defines = struct {
188 suff: [:0]const u8,
189 a: [:0]const u8,
190 l: [:0]const u8,
191 m: [:0]const u8,
192 n: [:0]const u8,
166 suff: []const u8,
167 a: []const u8,
168 l: []const u8,
169 m: []const u8,
170 n: []const u8,
193171 };
194172 fn defines(self: @This()) Defines {
195173 const suff = switch (self) {
......@@ -224,15 +202,6 @@ const Ordering = enum {
224202 };
225203 return .{ .suff = suff, .a = a, .l = l, .m = m, .n = n };
226204 }
227
228 fn capName(self: @This()) [:0]const u8 {
229 return switch (self) {
230 .relax => "Relax",
231 .acq => "Acq",
232 .rel => "Rel",
233 .acq_rel => "AcqRel",
234 };
235 }
236205};
237206
238207const LdName = enum { ldadd, ldclr, ldeor, ldset };
......@@ -244,14 +213,14 @@ fn generateCas(arena: Allocator, n: N, order: Ordering) ![]const u8 {
244213 const reg = n.register();
245214
246215 if (@enumToInt(n) < 16) {
247 const cas = try std.fmt.allocPrint(arena, ".inst 0x08a07c41 + {s} + {s}\n", .{ s_def.b, o_def.m });
216 const cas = try std.fmt.allocPrint(arena, ".inst 0x08a07c41 + {s} + {s}", .{ s_def.b, o_def.m });
248217 const ldxr = try std.fmt.allocPrint(arena, "ld{s}xr{s}", .{ o_def.a, s_def.s });
249218 const stxr = try std.fmt.allocPrint(arena, "st{s}xr{s}", .{ o_def.l, s_def.s });
250219
251220 return try std.fmt.allocPrint(arena,
252221 \\ cbz w16, 8f
253222 \\ {[cas]s}
254 \\ cbz wzr, 1f
223 \\ ret
255224 \\8:
256225 \\ {[uxt]s} {[reg]s}16, {[reg]s}0
257226 \\0:
......@@ -261,6 +230,7 @@ fn generateCas(arena: Allocator, n: N, order: Ordering) ![]const u8 {
261230 \\ {[stxr]s} w17, {[reg]s}1, [x2]
262231 \\ cbnz w17, 0b
263232 \\1:
233 \\ ret
264234 , .{
265235 .cas = cas,
266236 .uxt = s_def.uxt,
......@@ -269,14 +239,14 @@ fn generateCas(arena: Allocator, n: N, order: Ordering) ![]const u8 {
269239 .reg = reg,
270240 });
271241 } else {
272 const casp = try std.fmt.allocPrint(arena, ".inst 0x48207c82 + {s}\n", .{o_def.m});
242 const casp = try std.fmt.allocPrint(arena, ".inst 0x48207c82 + {s}", .{o_def.m});
273243 const ldxp = try std.fmt.allocPrint(arena, "ld{s}xp", .{o_def.a});
274244 const stxp = try std.fmt.allocPrint(arena, "st{s}xp", .{o_def.l});
275245
276246 return try std.fmt.allocPrint(arena,
277247 \\ cbz w16, 8f
278248 \\ {[casp]s}
279 \\ cbz wzr, 1f
249 \\ ret
280250 \\8:
281251 \\ mov x16, x0
282252 \\ mov x17, x1
......@@ -288,6 +258,7 @@ fn generateCas(arena: Allocator, n: N, order: Ordering) ![]const u8 {
288258 \\ {[stxp]s} w15, x2, x3, [x4]
289259 \\ cbnz w15, 0b
290260 \\1:
261 \\ ret
291262 , .{
292263 .casp = casp,
293264 .ldxp = ldxp,
......@@ -304,7 +275,7 @@ fn generateSwp(arena: Allocator, n: N, order: Ordering) ![]const u8 {
304275 return try std.fmt.allocPrint(arena,
305276 \\ cbz w16, 8f
306277 \\ .inst 0x38208020 + {[b]s} + {[n]s}
307 \\ cbz wzr, 1f
278 \\ ret
308279 \\8:
309280 \\ mov {[reg]s}16, {[reg]s}0
310281 \\0:
......@@ -312,6 +283,7 @@ fn generateSwp(arena: Allocator, n: N, order: Ordering) ![]const u8 {
312283 \\ st{[l]s}xr{[s]s} w17, {[reg]s}16, [x1]
313284 \\ cbnz w17, 0b
314285 \\1:
286 \\ ret
315287 , .{
316288 .b = s_def.b,
317289 .n = o_def.n,
......@@ -343,7 +315,7 @@ fn generateLd(arena: Allocator, n: N, order: Ordering, ld: LdName) ![]const u8 {
343315 return try std.fmt.allocPrint(arena,
344316 \\ cbz w16, 8f
345317 \\ .inst 0x38200020 + {[op_n]s} + {[b]s} + {[n]s}
346 \\ cbz wzr, 1f
318 \\ ret
347319 \\8:
348320 \\ mov {[reg]s}16, {[reg]s}0
349321 \\0:
......@@ -352,6 +324,7 @@ fn generateLd(arena: Allocator, n: N, order: Ordering, ld: LdName) ![]const u8 {
352324 \\ st{[l]s}xr{[s]s} w15, {[reg]s}17, [x1]
353325 \\ cbnz w15, 0b
354326 \\1:
327 \\ ret
355328 , .{
356329 .op_n = op_n,
357330 .b = s_def.b,