1 ; RUN: llc -march=aarch64 -verify-machineinstrs < %s | FileCheck %s
8 define i8 @test_atomic_load_add_i8(i8 %offset) nounwind {
9 ; CHECK: test_atomic_load_add_i8:
10 %old = atomicrmw add i8* @var8, i8 %offset seq_cst
12 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
13 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
15 ; CHECK: .LBB{{[0-9]+}}_1:
16 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
17 ; w0 below is a reasonable guess but could change: it certainly comes into the
19 ; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
20 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
21 ; CHECK-NEXT: cmp [[STATUS]], #0
22 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
25 ; CHECK: mov x0, x[[OLD]]
29 define i16 @test_atomic_load_add_i16(i16 %offset) nounwind {
30 ; CHECK: test_atomic_load_add_i16:
31 %old = atomicrmw add i16* @var16, i16 %offset seq_cst
33 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
34 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
36 ; CHECK: .LBB{{[0-9]+}}_1:
37 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
38 ; w0 below is a reasonable guess but could change: it certainly comes into the
40 ; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
41 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
42 ; CHECK-NEXT: cmp [[STATUS]], #0
43 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
46 ; CHECK: mov x0, x[[OLD]]
50 define i32 @test_atomic_load_add_i32(i32 %offset) nounwind {
51 ; CHECK: test_atomic_load_add_i32:
52 %old = atomicrmw add i32* @var32, i32 %offset seq_cst
54 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
55 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
57 ; CHECK: .LBB{{[0-9]+}}_1:
58 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
59 ; w0 below is a reasonable guess but could change: it certainly comes into the
61 ; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
62 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
63 ; CHECK-NEXT: cmp [[STATUS]], #0
64 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
67 ; CHECK: mov x0, x[[OLD]]
71 define i64 @test_atomic_load_add_i64(i64 %offset) nounwind {
72 ; CHECK: test_atomic_load_add_i64:
73 %old = atomicrmw add i64* @var64, i64 %offset seq_cst
75 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
76 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
78 ; CHECK: .LBB{{[0-9]+}}_1:
79 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
80 ; x0 below is a reasonable guess but could change: it certainly comes into the
82 ; CHECK-NEXT: add [[NEW:x[0-9]+]], x[[OLD]], x0
83 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
84 ; CHECK-NEXT: cmp [[STATUS]], #0
85 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
88 ; CHECK: mov x0, x[[OLD]]
92 define i8 @test_atomic_load_sub_i8(i8 %offset) nounwind {
93 ; CHECK: test_atomic_load_sub_i8:
94 %old = atomicrmw sub i8* @var8, i8 %offset seq_cst
96 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
97 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
99 ; CHECK: .LBB{{[0-9]+}}_1:
100 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
101 ; w0 below is a reasonable guess but could change: it certainly comes into the
103 ; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
104 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
105 ; CHECK-NEXT: cmp [[STATUS]], #0
106 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
109 ; CHECK: mov x0, x[[OLD]]
113 define i16 @test_atomic_load_sub_i16(i16 %offset) nounwind {
114 ; CHECK: test_atomic_load_sub_i16:
115 %old = atomicrmw sub i16* @var16, i16 %offset seq_cst
117 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
118 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
120 ; CHECK: .LBB{{[0-9]+}}_1:
121 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
122 ; w0 below is a reasonable guess but could change: it certainly comes into the
124 ; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
125 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
126 ; CHECK-NEXT: cmp [[STATUS]], #0
127 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
130 ; CHECK: mov x0, x[[OLD]]
134 define i32 @test_atomic_load_sub_i32(i32 %offset) nounwind {
135 ; CHECK: test_atomic_load_sub_i32:
136 %old = atomicrmw sub i32* @var32, i32 %offset seq_cst
138 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
139 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
141 ; CHECK: .LBB{{[0-9]+}}_1:
142 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
143 ; w0 below is a reasonable guess but could change: it certainly comes into the
145 ; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
146 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
147 ; CHECK-NEXT: cmp [[STATUS]], #0
148 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
151 ; CHECK: mov x0, x[[OLD]]
155 define i64 @test_atomic_load_sub_i64(i64 %offset) nounwind {
156 ; CHECK: test_atomic_load_sub_i64:
157 %old = atomicrmw sub i64* @var64, i64 %offset seq_cst
159 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
160 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
162 ; CHECK: .LBB{{[0-9]+}}_1:
163 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
164 ; x0 below is a reasonable guess but could change: it certainly comes into the
166 ; CHECK-NEXT: sub [[NEW:x[0-9]+]], x[[OLD]], x0
167 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
168 ; CHECK-NEXT: cmp [[STATUS]], #0
169 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
172 ; CHECK: mov x0, x[[OLD]]
176 define i8 @test_atomic_load_and_i8(i8 %offset) nounwind {
177 ; CHECK: test_atomic_load_and_i8:
178 %old = atomicrmw and i8* @var8, i8 %offset seq_cst
180 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
181 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
183 ; CHECK: .LBB{{[0-9]+}}_1:
184 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
185 ; w0 below is a reasonable guess but could change: it certainly comes into the
187 ; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
188 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
189 ; CHECK-NEXT: cmp [[STATUS]], #0
190 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
193 ; CHECK: mov x0, x[[OLD]]
197 define i16 @test_atomic_load_and_i16(i16 %offset) nounwind {
198 ; CHECK: test_atomic_load_and_i16:
199 %old = atomicrmw and i16* @var16, i16 %offset seq_cst
201 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
202 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
204 ; CHECK: .LBB{{[0-9]+}}_1:
205 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
206 ; w0 below is a reasonable guess but could change: it certainly comes into the
208 ; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
209 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
210 ; CHECK-NEXT: cmp [[STATUS]], #0
211 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
214 ; CHECK: mov x0, x[[OLD]]
218 define i32 @test_atomic_load_and_i32(i32 %offset) nounwind {
219 ; CHECK: test_atomic_load_and_i32:
220 %old = atomicrmw and i32* @var32, i32 %offset seq_cst
222 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
223 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
225 ; CHECK: .LBB{{[0-9]+}}_1:
226 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
227 ; w0 below is a reasonable guess but could change: it certainly comes into the
229 ; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
230 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
231 ; CHECK-NEXT: cmp [[STATUS]], #0
232 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
235 ; CHECK: mov x0, x[[OLD]]
239 define i64 @test_atomic_load_and_i64(i64 %offset) nounwind {
240 ; CHECK: test_atomic_load_and_i64:
241 %old = atomicrmw and i64* @var64, i64 %offset seq_cst
243 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
244 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
246 ; CHECK: .LBB{{[0-9]+}}_1:
247 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
248 ; x0 below is a reasonable guess but could change: it certainly comes into the
250 ; CHECK-NEXT: and [[NEW:x[0-9]+]], x[[OLD]], x0
251 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
252 ; CHECK-NEXT: cmp [[STATUS]], #0
253 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
256 ; CHECK: mov x0, x[[OLD]]
260 define i8 @test_atomic_load_or_i8(i8 %offset) nounwind {
261 ; CHECK: test_atomic_load_or_i8:
262 %old = atomicrmw or i8* @var8, i8 %offset seq_cst
264 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
265 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
267 ; CHECK: .LBB{{[0-9]+}}_1:
268 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
269 ; w0 below is a reasonable guess but could change: it certainly comes into the
271 ; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
272 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
273 ; CHECK-NEXT: cmp [[STATUS]], #0
274 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
277 ; CHECK: mov x0, x[[OLD]]
281 define i16 @test_atomic_load_or_i16(i16 %offset) nounwind {
282 ; CHECK: test_atomic_load_or_i16:
283 %old = atomicrmw or i16* @var16, i16 %offset seq_cst
285 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
286 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
288 ; CHECK: .LBB{{[0-9]+}}_1:
289 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
290 ; w0 below is a reasonable guess but could change: it certainly comes into the
292 ; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
293 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
294 ; CHECK-NEXT: cmp [[STATUS]], #0
295 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
298 ; CHECK: mov x0, x[[OLD]]
302 define i32 @test_atomic_load_or_i32(i32 %offset) nounwind {
303 ; CHECK: test_atomic_load_or_i32:
304 %old = atomicrmw or i32* @var32, i32 %offset seq_cst
306 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
307 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
309 ; CHECK: .LBB{{[0-9]+}}_1:
310 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
311 ; w0 below is a reasonable guess but could change: it certainly comes into the
313 ; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
314 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
315 ; CHECK-NEXT: cmp [[STATUS]], #0
316 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
319 ; CHECK: mov x0, x[[OLD]]
323 define i64 @test_atomic_load_or_i64(i64 %offset) nounwind {
324 ; CHECK: test_atomic_load_or_i64:
325 %old = atomicrmw or i64* @var64, i64 %offset seq_cst
327 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
328 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
330 ; CHECK: .LBB{{[0-9]+}}_1:
331 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
332 ; x0 below is a reasonable guess but could change: it certainly comes into the
334 ; CHECK-NEXT: orr [[NEW:x[0-9]+]], x[[OLD]], x0
335 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
336 ; CHECK-NEXT: cmp [[STATUS]], #0
337 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
340 ; CHECK: mov x0, x[[OLD]]
344 define i8 @test_atomic_load_xor_i8(i8 %offset) nounwind {
345 ; CHECK: test_atomic_load_xor_i8:
346 %old = atomicrmw xor i8* @var8, i8 %offset seq_cst
348 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
349 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
351 ; CHECK: .LBB{{[0-9]+}}_1:
352 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
353 ; w0 below is a reasonable guess but could change: it certainly comes into the
355 ; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
356 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
357 ; CHECK-NEXT: cmp [[STATUS]], #0
358 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
361 ; CHECK: mov x0, x[[OLD]]
365 define i16 @test_atomic_load_xor_i16(i16 %offset) nounwind {
366 ; CHECK: test_atomic_load_xor_i16:
367 %old = atomicrmw xor i16* @var16, i16 %offset seq_cst
369 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
370 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
372 ; CHECK: .LBB{{[0-9]+}}_1:
373 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
374 ; w0 below is a reasonable guess but could change: it certainly comes into the
376 ; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
377 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
378 ; CHECK-NEXT: cmp [[STATUS]], #0
379 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
382 ; CHECK: mov x0, x[[OLD]]
386 define i32 @test_atomic_load_xor_i32(i32 %offset) nounwind {
387 ; CHECK: test_atomic_load_xor_i32:
388 %old = atomicrmw xor i32* @var32, i32 %offset seq_cst
390 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
391 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
393 ; CHECK: .LBB{{[0-9]+}}_1:
394 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
395 ; w0 below is a reasonable guess but could change: it certainly comes into the
397 ; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
398 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
399 ; CHECK-NEXT: cmp [[STATUS]], #0
400 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
403 ; CHECK: mov x0, x[[OLD]]
407 define i64 @test_atomic_load_xor_i64(i64 %offset) nounwind {
408 ; CHECK: test_atomic_load_xor_i64:
409 %old = atomicrmw xor i64* @var64, i64 %offset seq_cst
411 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
412 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
414 ; CHECK: .LBB{{[0-9]+}}_1:
415 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
416 ; x0 below is a reasonable guess but could change: it certainly comes into the
418 ; CHECK-NEXT: eor [[NEW:x[0-9]+]], x[[OLD]], x0
419 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
420 ; CHECK-NEXT: cmp [[STATUS]], #0
421 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
424 ; CHECK: mov x0, x[[OLD]]
428 define i8 @test_atomic_load_xchg_i8(i8 %offset) nounwind {
429 ; CHECK: test_atomic_load_xchg_i8:
430 %old = atomicrmw xchg i8* @var8, i8 %offset seq_cst
432 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
433 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
435 ; CHECK: .LBB{{[0-9]+}}_1:
436 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
437 ; w0 below is a reasonable guess but could change: it certainly comes into the
439 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
440 ; CHECK-NEXT: cmp [[STATUS]], #0
441 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
444 ; CHECK: mov x0, x[[OLD]]
448 define i16 @test_atomic_load_xchg_i16(i16 %offset) nounwind {
449 ; CHECK: test_atomic_load_xchg_i16:
450 %old = atomicrmw xchg i16* @var16, i16 %offset seq_cst
452 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
453 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
455 ; CHECK: .LBB{{[0-9]+}}_1:
456 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
457 ; w0 below is a reasonable guess but could change: it certainly comes into the
459 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
460 ; CHECK-NEXT: cmp [[STATUS]], #0
461 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
464 ; CHECK: mov x0, x[[OLD]]
468 define i32 @test_atomic_load_xchg_i32(i32 %offset) nounwind {
469 ; CHECK: test_atomic_load_xchg_i32:
470 %old = atomicrmw xchg i32* @var32, i32 %offset seq_cst
472 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
473 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
475 ; CHECK: .LBB{{[0-9]+}}_1:
476 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
477 ; w0 below is a reasonable guess but could change: it certainly comes into the
479 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
480 ; CHECK-NEXT: cmp [[STATUS]], #0
481 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
484 ; CHECK: mov x0, x[[OLD]]
488 define i64 @test_atomic_load_xchg_i64(i64 %offset) nounwind {
489 ; CHECK: test_atomic_load_xchg_i64:
490 %old = atomicrmw xchg i64* @var64, i64 %offset seq_cst
492 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
493 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
495 ; CHECK: .LBB{{[0-9]+}}_1:
496 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
497 ; x0 below is a reasonable guess but could change: it certainly comes into the
499 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], x0, [x[[ADDR]]]
500 ; CHECK-NEXT: cmp [[STATUS]], #0
501 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
504 ; CHECK: mov x0, x[[OLD]]
509 define i8 @test_atomic_load_min_i8(i8 %offset) nounwind {
510 ; CHECK: test_atomic_load_min_i8:
511 %old = atomicrmw min i8* @var8, i8 %offset seq_cst
513 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
514 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
516 ; CHECK: .LBB{{[0-9]+}}_1:
517 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
518 ; w0 below is a reasonable guess but could change: it certainly comes into the
520 ; CHECK-NEXT: cmp w0, w[[OLD]], sxtb
521 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
522 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
523 ; CHECK-NEXT: cmp [[STATUS]], #0
524 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
527 ; CHECK: mov x0, x[[OLD]]
531 define i16 @test_atomic_load_min_i16(i16 %offset) nounwind {
532 ; CHECK: test_atomic_load_min_i16:
533 %old = atomicrmw min i16* @var16, i16 %offset seq_cst
535 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
536 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
538 ; CHECK: .LBB{{[0-9]+}}_1:
539 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
540 ; w0 below is a reasonable guess but could change: it certainly comes into the
542 ; CHECK-NEXT: cmp w0, w[[OLD]], sxth
543 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
544 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
545 ; CHECK-NEXT: cmp [[STATUS]], #0
546 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
549 ; CHECK: mov x0, x[[OLD]]
553 define i32 @test_atomic_load_min_i32(i32 %offset) nounwind {
554 ; CHECK: test_atomic_load_min_i32:
555 %old = atomicrmw min i32* @var32, i32 %offset seq_cst
557 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
558 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
560 ; CHECK: .LBB{{[0-9]+}}_1:
561 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
562 ; w0 below is a reasonable guess but could change: it certainly comes into the
564 ; CHECK-NEXT: cmp w0, w[[OLD]]
565 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
566 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
567 ; CHECK-NEXT: cmp [[STATUS]], #0
568 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
571 ; CHECK: mov x0, x[[OLD]]
575 define i64 @test_atomic_load_min_i64(i64 %offset) nounwind {
576 ; CHECK: test_atomic_load_min_i64:
577 %old = atomicrmw min i64* @var64, i64 %offset seq_cst
579 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
580 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
582 ; CHECK: .LBB{{[0-9]+}}_1:
583 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
584 ; x0 below is a reasonable guess but could change: it certainly comes into the
586 ; CHECK-NEXT: cmp x0, x[[OLD]]
587 ; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, gt
588 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
589 ; CHECK-NEXT: cmp [[STATUS]], #0
590 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
593 ; CHECK: mov x0, x[[OLD]]
597 define i8 @test_atomic_load_max_i8(i8 %offset) nounwind {
598 ; CHECK: test_atomic_load_max_i8:
599 %old = atomicrmw max i8* @var8, i8 %offset seq_cst
601 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
602 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
604 ; CHECK: .LBB{{[0-9]+}}_1:
605 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
606 ; w0 below is a reasonable guess but could change: it certainly comes into the
608 ; CHECK-NEXT: cmp w0, w[[OLD]], sxtb
609 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
610 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
611 ; CHECK-NEXT: cmp [[STATUS]], #0
612 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
615 ; CHECK: mov x0, x[[OLD]]
619 define i16 @test_atomic_load_max_i16(i16 %offset) nounwind {
620 ; CHECK: test_atomic_load_max_i16:
621 %old = atomicrmw max i16* @var16, i16 %offset seq_cst
623 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
624 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
626 ; CHECK: .LBB{{[0-9]+}}_1:
627 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
628 ; w0 below is a reasonable guess but could change: it certainly comes into the
630 ; CHECK-NEXT: cmp w0, w[[OLD]], sxth
631 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
632 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
633 ; CHECK-NEXT: cmp [[STATUS]], #0
634 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
637 ; CHECK: mov x0, x[[OLD]]
641 define i32 @test_atomic_load_max_i32(i32 %offset) nounwind {
642 ; CHECK: test_atomic_load_max_i32:
643 %old = atomicrmw max i32* @var32, i32 %offset seq_cst
645 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
646 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
648 ; CHECK: .LBB{{[0-9]+}}_1:
649 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
650 ; w0 below is a reasonable guess but could change: it certainly comes into the
652 ; CHECK-NEXT: cmp w0, w[[OLD]]
653 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
654 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
655 ; CHECK-NEXT: cmp [[STATUS]], #0
656 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
659 ; CHECK: mov x0, x[[OLD]]
663 define i64 @test_atomic_load_max_i64(i64 %offset) nounwind {
664 ; CHECK: test_atomic_load_max_i64:
665 %old = atomicrmw max i64* @var64, i64 %offset seq_cst
667 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
668 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
670 ; CHECK: .LBB{{[0-9]+}}_1:
671 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
672 ; x0 below is a reasonable guess but could change: it certainly comes into the
674 ; CHECK-NEXT: cmp x0, x[[OLD]]
675 ; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lt
676 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
677 ; CHECK-NEXT: cmp [[STATUS]], #0
678 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
681 ; CHECK: mov x0, x[[OLD]]
685 define i8 @test_atomic_load_umin_i8(i8 %offset) nounwind {
686 ; CHECK: test_atomic_load_umin_i8:
687 %old = atomicrmw umin i8* @var8, i8 %offset seq_cst
689 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
690 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
692 ; CHECK: .LBB{{[0-9]+}}_1:
693 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
694 ; w0 below is a reasonable guess but could change: it certainly comes into the
696 ; CHECK-NEXT: cmp w0, w[[OLD]], uxtb
697 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
698 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
699 ; CHECK-NEXT: cmp [[STATUS]], #0
700 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
703 ; CHECK: mov x0, x[[OLD]]
707 define i16 @test_atomic_load_umin_i16(i16 %offset) nounwind {
708 ; CHECK: test_atomic_load_umin_i16:
709 %old = atomicrmw umin i16* @var16, i16 %offset seq_cst
711 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
712 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
714 ; CHECK: .LBB{{[0-9]+}}_1:
715 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
716 ; w0 below is a reasonable guess but could change: it certainly comes into the
718 ; CHECK-NEXT: cmp w0, w[[OLD]], uxth
719 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
720 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
721 ; CHECK-NEXT: cmp [[STATUS]], #0
722 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
725 ; CHECK: mov x0, x[[OLD]]
729 define i32 @test_atomic_load_umin_i32(i32 %offset) nounwind {
730 ; CHECK: test_atomic_load_umin_i32:
731 %old = atomicrmw umin i32* @var32, i32 %offset seq_cst
733 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
734 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
736 ; CHECK: .LBB{{[0-9]+}}_1:
737 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
738 ; w0 below is a reasonable guess but could change: it certainly comes into the
740 ; CHECK-NEXT: cmp w0, w[[OLD]]
741 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
742 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
743 ; CHECK-NEXT: cmp [[STATUS]], #0
744 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
747 ; CHECK: mov x0, x[[OLD]]
751 define i64 @test_atomic_load_umin_i64(i64 %offset) nounwind {
752 ; CHECK: test_atomic_load_umin_i64:
753 %old = atomicrmw umin i64* @var64, i64 %offset seq_cst
755 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
756 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
758 ; CHECK: .LBB{{[0-9]+}}_1:
759 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
760 ; x0 below is a reasonable guess but could change: it certainly comes into the
762 ; CHECK-NEXT: cmp x0, x[[OLD]]
763 ; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, hi
764 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
765 ; CHECK-NEXT: cmp [[STATUS]], #0
766 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
769 ; CHECK: mov x0, x[[OLD]]
773 define i8 @test_atomic_load_umax_i8(i8 %offset) nounwind {
774 ; CHECK: test_atomic_load_umax_i8:
775 %old = atomicrmw umax i8* @var8, i8 %offset seq_cst
777 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
778 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
780 ; CHECK: .LBB{{[0-9]+}}_1:
781 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
782 ; w0 below is a reasonable guess but could change: it certainly comes into the
784 ; CHECK-NEXT: cmp w0, w[[OLD]], uxtb
785 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
786 ; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
787 ; CHECK-NEXT: cmp [[STATUS]], #0
788 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
791 ; CHECK: mov x0, x[[OLD]]
795 define i16 @test_atomic_load_umax_i16(i16 %offset) nounwind {
796 ; CHECK: test_atomic_load_umax_i16:
797 %old = atomicrmw umax i16* @var16, i16 %offset seq_cst
799 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
800 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
802 ; CHECK: .LBB{{[0-9]+}}_1:
803 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
804 ; w0 below is a reasonable guess but could change: it certainly comes into the
806 ; CHECK-NEXT: cmp w0, w[[OLD]], uxth
807 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
808 ; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
809 ; CHECK-NEXT: cmp [[STATUS]], #0
810 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
813 ; CHECK: mov x0, x[[OLD]]
817 define i32 @test_atomic_load_umax_i32(i32 %offset) nounwind {
818 ; CHECK: test_atomic_load_umax_i32:
819 %old = atomicrmw umax i32* @var32, i32 %offset seq_cst
821 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
822 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
824 ; CHECK: .LBB{{[0-9]+}}_1:
825 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
826 ; w0 below is a reasonable guess but could change: it certainly comes into the
828 ; CHECK-NEXT: cmp w0, w[[OLD]]
829 ; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
830 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
831 ; CHECK-NEXT: cmp [[STATUS]], #0
832 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
835 ; CHECK: mov x0, x[[OLD]]
839 define i64 @test_atomic_load_umax_i64(i64 %offset) nounwind {
840 ; CHECK: test_atomic_load_umax_i64:
841 %old = atomicrmw umax i64* @var64, i64 %offset seq_cst
843 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
844 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
846 ; CHECK: .LBB{{[0-9]+}}_1:
847 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
848 ; x0 below is a reasonable guess but could change: it certainly comes into the
850 ; CHECK-NEXT: cmp x0, x[[OLD]]
851 ; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lo
852 ; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
853 ; CHECK-NEXT: cmp [[STATUS]], #0
854 ; CHECK-NEXT: b.ne .LBB{{[0-9]+}}_1
857 ; CHECK: mov x0, x[[OLD]]
861 define i8 @test_atomic_cmpxchg_i8(i8 %wanted, i8 %new) nounwind {
862 ; CHECK: test_atomic_cmpxchg_i8:
863 %old = cmpxchg i8* @var8, i8 %wanted, i8 %new seq_cst
865 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
866 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
868 ; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
869 ; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
870 ; w0 below is a reasonable guess but could change: it certainly comes into the
872 ; CHECK-NEXT: cmp w[[OLD]], w0
873 ; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
874 ; As above, w1 is a reasonable guess.
875 ; CHECK: stxrb [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
876 ; CHECK-NEXT: cmp [[STATUS]], #0
877 ; CHECK-NEXT: b.ne [[STARTAGAIN]]
880 ; CHECK: mov x0, x[[OLD]]
884 define i16 @test_atomic_cmpxchg_i16(i16 %wanted, i16 %new) nounwind {
885 ; CHECK: test_atomic_cmpxchg_i16:
886 %old = cmpxchg i16* @var16, i16 %wanted, i16 %new seq_cst
888 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
889 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
891 ; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
892 ; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
893 ; w0 below is a reasonable guess but could change: it certainly comes into the
895 ; CHECK-NEXT: cmp w[[OLD]], w0
896 ; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
897 ; As above, w1 is a reasonable guess.
898 ; CHECK: stxrh [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
899 ; CHECK-NEXT: cmp [[STATUS]], #0
900 ; CHECK-NEXT: b.ne [[STARTAGAIN]]
903 ; CHECK: mov x0, x[[OLD]]
907 define i32 @test_atomic_cmpxchg_i32(i32 %wanted, i32 %new) nounwind {
908 ; CHECK: test_atomic_cmpxchg_i32:
909 %old = cmpxchg i32* @var32, i32 %wanted, i32 %new seq_cst
911 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
912 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
914 ; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
915 ; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
916 ; w0 below is a reasonable guess but could change: it certainly comes into the
918 ; CHECK-NEXT: cmp w[[OLD]], w0
919 ; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
920 ; As above, w1 is a reasonable guess.
921 ; CHECK: stxr [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
922 ; CHECK-NEXT: cmp [[STATUS]], #0
923 ; CHECK-NEXT: b.ne [[STARTAGAIN]]
926 ; CHECK: mov x0, x[[OLD]]
930 define i64 @test_atomic_cmpxchg_i64(i64 %wanted, i64 %new) nounwind {
931 ; CHECK: test_atomic_cmpxchg_i64:
932 %old = cmpxchg i64* @var64, i64 %wanted, i64 %new seq_cst
934 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
935 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
937 ; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
938 ; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
939 ; w0 below is a reasonable guess but could change: it certainly comes into the
941 ; CHECK-NEXT: cmp x[[OLD]], x0
942 ; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
943 ; As above, w1 is a reasonable guess.
944 ; CHECK: stxr [[STATUS:w[0-9]+]], x1, [x[[ADDR]]]
945 ; CHECK-NEXT: cmp [[STATUS]], #0
946 ; CHECK-NEXT: b.ne [[STARTAGAIN]]
949 ; CHECK: mov x0, x[[OLD]]
953 define i8 @test_atomic_load_monotonic_i8() nounwind {
954 ; CHECK: test_atomic_load_monotonic_i8:
955 %val = load atomic i8* @var8 monotonic, align 1
957 ; CHECK: adrp x[[HIADDR:[0-9]+]], var8
958 ; CHECK: ldrb w0, [x[[HIADDR]], #:lo12:var8]
964 define i8 @test_atomic_load_monotonic_regoff_i8(i64 %base, i64 %off) nounwind {
965 ; CHECK: test_atomic_load_monotonic_regoff_i8:
966 %addr_int = add i64 %base, %off
967 %addr = inttoptr i64 %addr_int to i8*
969 %val = load atomic i8* %addr monotonic, align 1
971 ; CHECK: ldrb w0, [x0, x1]
977 define i8 @test_atomic_load_acquire_i8() nounwind {
978 ; CHECK: test_atomic_load_acquire_i8:
979 %val = load atomic i8* @var8 acquire, align 1
980 ; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
981 ; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
983 ; CHECK: ldarb w0, [x[[ADDR]]]
987 define i8 @test_atomic_load_seq_cst_i8() nounwind {
988 ; CHECK: test_atomic_load_seq_cst_i8:
989 %val = load atomic i8* @var8 seq_cst, align 1
990 ; CHECK: adrp x[[HIADDR:[0-9]+]], var8
991 ; CHECK: ldrb w0, [x[[HIADDR]], #:lo12:var8]
996 define i16 @test_atomic_load_monotonic_i16() nounwind {
997 ; CHECK: test_atomic_load_monotonic_i16:
998 %val = load atomic i16* @var16 monotonic, align 2
1000 ; CHECK: adrp x[[HIADDR:[0-9]+]], var16
1001 ; CHECK: ldrh w0, [x[[HIADDR]], #:lo12:var16]
1007 define i32 @test_atomic_load_monotonic_regoff_i32(i64 %base, i64 %off) nounwind {
1008 ; CHECK: test_atomic_load_monotonic_regoff_i32:
1009 %addr_int = add i64 %base, %off
1010 %addr = inttoptr i64 %addr_int to i32*
1012 %val = load atomic i32* %addr monotonic, align 4
1014 ; CHECK: ldr w0, [x0, x1]
1020 define i64 @test_atomic_load_seq_cst_i64() nounwind {
1021 ; CHECK: test_atomic_load_seq_cst_i64:
1022 %val = load atomic i64* @var64 seq_cst, align 8
1023 ; CHECK: adrp x[[HIADDR:[0-9]+]], var64
1024 ; CHECK: ldr x0, [x[[HIADDR]], #:lo12:var64]
1029 define void @test_atomic_store_monotonic_i8(i8 %val) nounwind {
1030 ; CHECK: test_atomic_store_monotonic_i8:
1031 store atomic i8 %val, i8* @var8 monotonic, align 1
1032 ; CHECK: adrp x[[HIADDR:[0-9]+]], var8
1033 ; CHECK: strb w0, [x[[HIADDR]], #:lo12:var8]
1038 define void @test_atomic_store_monotonic_regoff_i8(i64 %base, i64 %off, i8 %val) nounwind {
1039 ; CHECK: test_atomic_store_monotonic_regoff_i8:
1041 %addr_int = add i64 %base, %off
1042 %addr = inttoptr i64 %addr_int to i8*
1044 store atomic i8 %val, i8* %addr monotonic, align 1
1045 ; CHECK: strb w2, [x0, x1]
1049 define void @test_atomic_store_release_i8(i8 %val) nounwind {
1050 ; CHECK: test_atomic_store_release_i8:
1051 store atomic i8 %val, i8* @var8 release, align 1
1052 ; CHECK: adrp [[HIADDR:x[0-9]+]], var8
1053 ; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
1054 ; CHECK: stlrb w0, [x[[ADDR]]]
1059 define void @test_atomic_store_seq_cst_i8(i8 %val) nounwind {
1060 ; CHECK: test_atomic_store_seq_cst_i8:
1061 store atomic i8 %val, i8* @var8 seq_cst, align 1
1062 ; CHECK: adrp [[HIADDR:x[0-9]+]], var8
1063 ; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
1064 ; CHECK: stlrb w0, [x[[ADDR]]]
1070 define void @test_atomic_store_monotonic_i16(i16 %val) nounwind {
1071 ; CHECK: test_atomic_store_monotonic_i16:
1072 store atomic i16 %val, i16* @var16 monotonic, align 2
1073 ; CHECK: adrp x[[HIADDR:[0-9]+]], var16
1074 ; CHECK: strh w0, [x[[HIADDR]], #:lo12:var16]
1079 define void @test_atomic_store_monotonic_regoff_i32(i64 %base, i64 %off, i32 %val) nounwind {
1080 ; CHECK: test_atomic_store_monotonic_regoff_i32:
1082 %addr_int = add i64 %base, %off
1083 %addr = inttoptr i64 %addr_int to i32*
1085 store atomic i32 %val, i32* %addr monotonic, align 4
1086 ; CHECK: str w2, [x0, x1]
1091 define void @test_atomic_store_release_i64(i64 %val) nounwind {
1092 ; CHECK: test_atomic_store_release_i64:
1093 store atomic i64 %val, i64* @var64 release, align 8
1094 ; CHECK: adrp [[HIADDR:x[0-9]+]], var64
1095 ; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var64
1096 ; CHECK: stlr x0, [x[[ADDR]]]