xref: /llvm-project/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-v8_1a.ll (revision 7ece560a50d09686bb384b309b8b05d8f63111e5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"
2; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
3; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+v8.1a -O0 | FileCheck %s --check-prefixes=CHECK,-O0
4; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+v8.1a -O1 | FileCheck %s --check-prefixes=CHECK,-O1
5
6define dso_local i8 @atomicrmw_xchg_i8_aligned_monotonic(ptr %ptr, i8 %value) {
7; CHECK-LABEL: atomicrmw_xchg_i8_aligned_monotonic:
8; CHECK:    swpb w1, w0, [x0]
9    %r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1
10    ret i8 %r
11}
12
13define dso_local i8 @atomicrmw_xchg_i8_aligned_acquire(ptr %ptr, i8 %value) {
14; CHECK-LABEL: atomicrmw_xchg_i8_aligned_acquire:
15; CHECK:    swpab w1, w0, [x0]
16    %r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1
17    ret i8 %r
18}
19
20define dso_local i8 @atomicrmw_xchg_i8_aligned_release(ptr %ptr, i8 %value) {
21; CHECK-LABEL: atomicrmw_xchg_i8_aligned_release:
22; CHECK:    swplb w1, w0, [x0]
23    %r = atomicrmw xchg ptr %ptr, i8 %value release, align 1
24    ret i8 %r
25}
26
27define dso_local i8 @atomicrmw_xchg_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
28; CHECK-LABEL: atomicrmw_xchg_i8_aligned_acq_rel:
29; CHECK:    swpalb w1, w0, [x0]
30    %r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1
31    ret i8 %r
32}
33
34define dso_local i8 @atomicrmw_xchg_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
35; CHECK-LABEL: atomicrmw_xchg_i8_aligned_seq_cst:
36; CHECK:    swpalb w1, w0, [x0]
37    %r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1
38    ret i8 %r
39}
40
41define dso_local i16 @atomicrmw_xchg_i16_aligned_monotonic(ptr %ptr, i16 %value) {
42; CHECK-LABEL: atomicrmw_xchg_i16_aligned_monotonic:
43; CHECK:    swph w1, w0, [x0]
44    %r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 2
45    ret i16 %r
46}
47
48define dso_local i16 @atomicrmw_xchg_i16_aligned_acquire(ptr %ptr, i16 %value) {
49; CHECK-LABEL: atomicrmw_xchg_i16_aligned_acquire:
50; CHECK:    swpah w1, w0, [x0]
51    %r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 2
52    ret i16 %r
53}
54
55define dso_local i16 @atomicrmw_xchg_i16_aligned_release(ptr %ptr, i16 %value) {
56; CHECK-LABEL: atomicrmw_xchg_i16_aligned_release:
57; CHECK:    swplh w1, w0, [x0]
58    %r = atomicrmw xchg ptr %ptr, i16 %value release, align 2
59    ret i16 %r
60}
61
62define dso_local i16 @atomicrmw_xchg_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
63; CHECK-LABEL: atomicrmw_xchg_i16_aligned_acq_rel:
64; CHECK:    swpalh w1, w0, [x0]
65    %r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 2
66    ret i16 %r
67}
68
69define dso_local i16 @atomicrmw_xchg_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
70; CHECK-LABEL: atomicrmw_xchg_i16_aligned_seq_cst:
71; CHECK:    swpalh w1, w0, [x0]
72    %r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 2
73    ret i16 %r
74}
75
76define dso_local i32 @atomicrmw_xchg_i32_aligned_monotonic(ptr %ptr, i32 %value) {
77; CHECK-LABEL: atomicrmw_xchg_i32_aligned_monotonic:
78; CHECK:    swp w1, w0, [x0]
79    %r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 4
80    ret i32 %r
81}
82
83define dso_local i32 @atomicrmw_xchg_i32_aligned_acquire(ptr %ptr, i32 %value) {
84; CHECK-LABEL: atomicrmw_xchg_i32_aligned_acquire:
85; CHECK:    swpa w1, w0, [x0]
86    %r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 4
87    ret i32 %r
88}
89
90define dso_local i32 @atomicrmw_xchg_i32_aligned_release(ptr %ptr, i32 %value) {
91; CHECK-LABEL: atomicrmw_xchg_i32_aligned_release:
92; CHECK:    swpl w1, w0, [x0]
93    %r = atomicrmw xchg ptr %ptr, i32 %value release, align 4
94    ret i32 %r
95}
96
97define dso_local i32 @atomicrmw_xchg_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
98; CHECK-LABEL: atomicrmw_xchg_i32_aligned_acq_rel:
99; CHECK:    swpal w1, w0, [x0]
100    %r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 4
101    ret i32 %r
102}
103
104define dso_local i32 @atomicrmw_xchg_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
105; CHECK-LABEL: atomicrmw_xchg_i32_aligned_seq_cst:
106; CHECK:    swpal w1, w0, [x0]
107    %r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 4
108    ret i32 %r
109}
110
111define dso_local i64 @atomicrmw_xchg_i64_aligned_monotonic(ptr %ptr, i64 %value) {
112; CHECK-LABEL: atomicrmw_xchg_i64_aligned_monotonic:
113; CHECK:    swp x1, x0, [x0]
114    %r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 8
115    ret i64 %r
116}
117
118define dso_local i64 @atomicrmw_xchg_i64_aligned_acquire(ptr %ptr, i64 %value) {
119; CHECK-LABEL: atomicrmw_xchg_i64_aligned_acquire:
120; CHECK:    swpa x1, x0, [x0]
121    %r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 8
122    ret i64 %r
123}
124
125define dso_local i64 @atomicrmw_xchg_i64_aligned_release(ptr %ptr, i64 %value) {
126; CHECK-LABEL: atomicrmw_xchg_i64_aligned_release:
127; CHECK:    swpl x1, x0, [x0]
128    %r = atomicrmw xchg ptr %ptr, i64 %value release, align 8
129    ret i64 %r
130}
131
132define dso_local i64 @atomicrmw_xchg_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
133; CHECK-LABEL: atomicrmw_xchg_i64_aligned_acq_rel:
134; CHECK:    swpal x1, x0, [x0]
135    %r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 8
136    ret i64 %r
137}
138
139define dso_local i64 @atomicrmw_xchg_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
140; CHECK-LABEL: atomicrmw_xchg_i64_aligned_seq_cst:
141; CHECK:    swpal x1, x0, [x0]
142    %r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 8
143    ret i64 %r
144}
145
146define dso_local i128 @atomicrmw_xchg_i128_aligned_monotonic(ptr %ptr, i128 %value) {
147; -O0-LABEL: atomicrmw_xchg_i128_aligned_monotonic:
148; -O0:    casp x0, x1, x2, x3, [x8]
149; -O0:    eor x8, x10, x8
150; -O0:    eor x11, x9, x11
151; -O0:    orr x8, x8, x11
152; -O0:    subs x8, x8, #0
153;
154; -O1-LABEL: atomicrmw_xchg_i128_aligned_monotonic:
155; -O1:    ldp x4, x5, [x0]
156; -O1:    casp x4, x5, x2, x3, [x0]
157; -O1:    cmp x5, x7
158; -O1:    ccmp x4, x6, #0, eq
159    %r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 16
160    ret i128 %r
161}
162
163define dso_local i128 @atomicrmw_xchg_i128_aligned_acquire(ptr %ptr, i128 %value) {
164; -O0-LABEL: atomicrmw_xchg_i128_aligned_acquire:
165; -O0:    caspa x0, x1, x2, x3, [x8]
166; -O0:    eor x8, x10, x8
167; -O0:    eor x11, x9, x11
168; -O0:    orr x8, x8, x11
169; -O0:    subs x8, x8, #0
170;
171; -O1-LABEL: atomicrmw_xchg_i128_aligned_acquire:
172; -O1:    ldp x4, x5, [x0]
173; -O1:    caspa x4, x5, x2, x3, [x0]
174; -O1:    cmp x5, x7
175; -O1:    ccmp x4, x6, #0, eq
176    %r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 16
177    ret i128 %r
178}
179
180define dso_local i128 @atomicrmw_xchg_i128_aligned_release(ptr %ptr, i128 %value) {
181; -O0-LABEL: atomicrmw_xchg_i128_aligned_release:
182; -O0:    caspl x0, x1, x2, x3, [x8]
183; -O0:    eor x8, x10, x8
184; -O0:    eor x11, x9, x11
185; -O0:    orr x8, x8, x11
186; -O0:    subs x8, x8, #0
187;
188; -O1-LABEL: atomicrmw_xchg_i128_aligned_release:
189; -O1:    ldp x4, x5, [x0]
190; -O1:    caspl x4, x5, x2, x3, [x0]
191; -O1:    cmp x5, x7
192; -O1:    ccmp x4, x6, #0, eq
193    %r = atomicrmw xchg ptr %ptr, i128 %value release, align 16
194    ret i128 %r
195}
196
197define dso_local i128 @atomicrmw_xchg_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
198; -O0-LABEL: atomicrmw_xchg_i128_aligned_acq_rel:
199; -O0:    caspal x0, x1, x2, x3, [x8]
200; -O0:    eor x8, x10, x8
201; -O0:    eor x11, x9, x11
202; -O0:    orr x8, x8, x11
203; -O0:    subs x8, x8, #0
204;
205; -O1-LABEL: atomicrmw_xchg_i128_aligned_acq_rel:
206; -O1:    ldp x4, x5, [x0]
207; -O1:    caspal x4, x5, x2, x3, [x0]
208; -O1:    cmp x5, x7
209; -O1:    ccmp x4, x6, #0, eq
210    %r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 16
211    ret i128 %r
212}
213
214define dso_local i128 @atomicrmw_xchg_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
215; -O0-LABEL: atomicrmw_xchg_i128_aligned_seq_cst:
216; -O0:    caspal x0, x1, x2, x3, [x8]
217; -O0:    eor x8, x10, x8
218; -O0:    eor x11, x9, x11
219; -O0:    orr x8, x8, x11
220; -O0:    subs x8, x8, #0
221;
222; -O1-LABEL: atomicrmw_xchg_i128_aligned_seq_cst:
223; -O1:    ldp x4, x5, [x0]
224; -O1:    caspal x4, x5, x2, x3, [x0]
225; -O1:    cmp x5, x7
226; -O1:    ccmp x4, x6, #0, eq
227    %r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 16
228    ret i128 %r
229}
230
231define dso_local i8 @atomicrmw_xchg_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
232; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_monotonic:
233; CHECK:    swpb w1, w0, [x0]
234    %r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1
235    ret i8 %r
236}
237
238define dso_local i8 @atomicrmw_xchg_i8_unaligned_acquire(ptr %ptr, i8 %value) {
239; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_acquire:
240; CHECK:    swpab w1, w0, [x0]
241    %r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1
242    ret i8 %r
243}
244
245define dso_local i8 @atomicrmw_xchg_i8_unaligned_release(ptr %ptr, i8 %value) {
246; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_release:
247; CHECK:    swplb w1, w0, [x0]
248    %r = atomicrmw xchg ptr %ptr, i8 %value release, align 1
249    ret i8 %r
250}
251
252define dso_local i8 @atomicrmw_xchg_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
253; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_acq_rel:
254; CHECK:    swpalb w1, w0, [x0]
255    %r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1
256    ret i8 %r
257}
258
259define dso_local i8 @atomicrmw_xchg_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
260; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_seq_cst:
261; CHECK:    swpalb w1, w0, [x0]
262    %r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1
263    ret i8 %r
264}
265
266define dso_local i16 @atomicrmw_xchg_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
267; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_monotonic:
268; CHECK:    bl __atomic_exchange
269    %r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 1
270    ret i16 %r
271}
272
273define dso_local i16 @atomicrmw_xchg_i16_unaligned_acquire(ptr %ptr, i16 %value) {
274; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acquire:
275; CHECK:    bl __atomic_exchange
276    %r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 1
277    ret i16 %r
278}
279
280define dso_local i16 @atomicrmw_xchg_i16_unaligned_release(ptr %ptr, i16 %value) {
281; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_release:
282; CHECK:    bl __atomic_exchange
283    %r = atomicrmw xchg ptr %ptr, i16 %value release, align 1
284    ret i16 %r
285}
286
287define dso_local i16 @atomicrmw_xchg_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
288; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acq_rel:
289; CHECK:    bl __atomic_exchange
290    %r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 1
291    ret i16 %r
292}
293
294define dso_local i16 @atomicrmw_xchg_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
295; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_seq_cst:
296; CHECK:    bl __atomic_exchange
297    %r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 1
298    ret i16 %r
299}
300
301define dso_local i32 @atomicrmw_xchg_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
302; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_monotonic:
303; CHECK:    bl __atomic_exchange
304    %r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 1
305    ret i32 %r
306}
307
308define dso_local i32 @atomicrmw_xchg_i32_unaligned_acquire(ptr %ptr, i32 %value) {
309; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acquire:
310; CHECK:    bl __atomic_exchange
311    %r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 1
312    ret i32 %r
313}
314
315define dso_local i32 @atomicrmw_xchg_i32_unaligned_release(ptr %ptr, i32 %value) {
316; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_release:
317; CHECK:    bl __atomic_exchange
318    %r = atomicrmw xchg ptr %ptr, i32 %value release, align 1
319    ret i32 %r
320}
321
322define dso_local i32 @atomicrmw_xchg_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
323; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acq_rel:
324; CHECK:    bl __atomic_exchange
325    %r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 1
326    ret i32 %r
327}
328
329define dso_local i32 @atomicrmw_xchg_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
330; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_seq_cst:
331; CHECK:    bl __atomic_exchange
332    %r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 1
333    ret i32 %r
334}
335
336define dso_local i64 @atomicrmw_xchg_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
337; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_monotonic:
338; CHECK:    bl __atomic_exchange
339    %r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 1
340    ret i64 %r
341}
342
343define dso_local i64 @atomicrmw_xchg_i64_unaligned_acquire(ptr %ptr, i64 %value) {
344; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acquire:
345; CHECK:    bl __atomic_exchange
346    %r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 1
347    ret i64 %r
348}
349
350define dso_local i64 @atomicrmw_xchg_i64_unaligned_release(ptr %ptr, i64 %value) {
351; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_release:
352; CHECK:    bl __atomic_exchange
353    %r = atomicrmw xchg ptr %ptr, i64 %value release, align 1
354    ret i64 %r
355}
356
357define dso_local i64 @atomicrmw_xchg_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
358; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acq_rel:
359; CHECK:    bl __atomic_exchange
360    %r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 1
361    ret i64 %r
362}
363
364define dso_local i64 @atomicrmw_xchg_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
365; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_seq_cst:
366; CHECK:    bl __atomic_exchange
367    %r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 1
368    ret i64 %r
369}
370
371define dso_local i128 @atomicrmw_xchg_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
372; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_monotonic:
373; CHECK:    bl __atomic_exchange
374    %r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 1
375    ret i128 %r
376}
377
378define dso_local i128 @atomicrmw_xchg_i128_unaligned_acquire(ptr %ptr, i128 %value) {
379; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acquire:
380; CHECK:    bl __atomic_exchange
381    %r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 1
382    ret i128 %r
383}
384
385define dso_local i128 @atomicrmw_xchg_i128_unaligned_release(ptr %ptr, i128 %value) {
386; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_release:
387; CHECK:    bl __atomic_exchange
388    %r = atomicrmw xchg ptr %ptr, i128 %value release, align 1
389    ret i128 %r
390}
391
392define dso_local i128 @atomicrmw_xchg_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
393; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acq_rel:
394; CHECK:    bl __atomic_exchange
395    %r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 1
396    ret i128 %r
397}
398
399define dso_local i128 @atomicrmw_xchg_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
400; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_seq_cst:
401; CHECK:    bl __atomic_exchange
402    %r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 1
403    ret i128 %r
404}
405
406define dso_local i8 @atomicrmw_add_i8_aligned_monotonic(ptr %ptr, i8 %value) {
407; CHECK-LABEL: atomicrmw_add_i8_aligned_monotonic:
408; CHECK:    ldaddb w1, w0, [x0]
409    %r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1
410    ret i8 %r
411}
412
413define dso_local i8 @atomicrmw_add_i8_aligned_acquire(ptr %ptr, i8 %value) {
414; CHECK-LABEL: atomicrmw_add_i8_aligned_acquire:
415; CHECK:    ldaddab w1, w0, [x0]
416    %r = atomicrmw add ptr %ptr, i8 %value acquire, align 1
417    ret i8 %r
418}
419
420define dso_local i8 @atomicrmw_add_i8_aligned_release(ptr %ptr, i8 %value) {
421; CHECK-LABEL: atomicrmw_add_i8_aligned_release:
422; CHECK:    ldaddlb w1, w0, [x0]
423    %r = atomicrmw add ptr %ptr, i8 %value release, align 1
424    ret i8 %r
425}
426
427define dso_local i8 @atomicrmw_add_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
428; CHECK-LABEL: atomicrmw_add_i8_aligned_acq_rel:
429; CHECK:    ldaddalb w1, w0, [x0]
430    %r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1
431    ret i8 %r
432}
433
434define dso_local i8 @atomicrmw_add_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
435; CHECK-LABEL: atomicrmw_add_i8_aligned_seq_cst:
436; CHECK:    ldaddalb w1, w0, [x0]
437    %r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1
438    ret i8 %r
439}
440
441define dso_local i16 @atomicrmw_add_i16_aligned_monotonic(ptr %ptr, i16 %value) {
442; CHECK-LABEL: atomicrmw_add_i16_aligned_monotonic:
443; CHECK:    ldaddh w1, w0, [x0]
444    %r = atomicrmw add ptr %ptr, i16 %value monotonic, align 2
445    ret i16 %r
446}
447
448define dso_local i16 @atomicrmw_add_i16_aligned_acquire(ptr %ptr, i16 %value) {
449; CHECK-LABEL: atomicrmw_add_i16_aligned_acquire:
450; CHECK:    ldaddah w1, w0, [x0]
451    %r = atomicrmw add ptr %ptr, i16 %value acquire, align 2
452    ret i16 %r
453}
454
455define dso_local i16 @atomicrmw_add_i16_aligned_release(ptr %ptr, i16 %value) {
456; CHECK-LABEL: atomicrmw_add_i16_aligned_release:
457; CHECK:    ldaddlh w1, w0, [x0]
458    %r = atomicrmw add ptr %ptr, i16 %value release, align 2
459    ret i16 %r
460}
461
462define dso_local i16 @atomicrmw_add_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
463; CHECK-LABEL: atomicrmw_add_i16_aligned_acq_rel:
464; CHECK:    ldaddalh w1, w0, [x0]
465    %r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 2
466    ret i16 %r
467}
468
469define dso_local i16 @atomicrmw_add_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
470; CHECK-LABEL: atomicrmw_add_i16_aligned_seq_cst:
471; CHECK:    ldaddalh w1, w0, [x0]
472    %r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 2
473    ret i16 %r
474}
475
476define dso_local i32 @atomicrmw_add_i32_aligned_monotonic(ptr %ptr, i32 %value) {
477; CHECK-LABEL: atomicrmw_add_i32_aligned_monotonic:
478; CHECK:    ldadd w1, w0, [x0]
479    %r = atomicrmw add ptr %ptr, i32 %value monotonic, align 4
480    ret i32 %r
481}
482
483define dso_local i32 @atomicrmw_add_i32_aligned_acquire(ptr %ptr, i32 %value) {
484; CHECK-LABEL: atomicrmw_add_i32_aligned_acquire:
485; CHECK:    ldadda w1, w0, [x0]
486    %r = atomicrmw add ptr %ptr, i32 %value acquire, align 4
487    ret i32 %r
488}
489
490define dso_local i32 @atomicrmw_add_i32_aligned_release(ptr %ptr, i32 %value) {
491; CHECK-LABEL: atomicrmw_add_i32_aligned_release:
492; CHECK:    ldaddl w1, w0, [x0]
493    %r = atomicrmw add ptr %ptr, i32 %value release, align 4
494    ret i32 %r
495}
496
497define dso_local i32 @atomicrmw_add_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
498; CHECK-LABEL: atomicrmw_add_i32_aligned_acq_rel:
499; CHECK:    ldaddal w1, w0, [x0]
500    %r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 4
501    ret i32 %r
502}
503
504define dso_local i32 @atomicrmw_add_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
505; CHECK-LABEL: atomicrmw_add_i32_aligned_seq_cst:
506; CHECK:    ldaddal w1, w0, [x0]
507    %r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 4
508    ret i32 %r
509}
510
511define dso_local i64 @atomicrmw_add_i64_aligned_monotonic(ptr %ptr, i64 %value) {
512; CHECK-LABEL: atomicrmw_add_i64_aligned_monotonic:
513; CHECK:    ldadd x1, x0, [x0]
514    %r = atomicrmw add ptr %ptr, i64 %value monotonic, align 8
515    ret i64 %r
516}
517
518define dso_local i64 @atomicrmw_add_i64_aligned_acquire(ptr %ptr, i64 %value) {
519; CHECK-LABEL: atomicrmw_add_i64_aligned_acquire:
520; CHECK:    ldadda x1, x0, [x0]
521    %r = atomicrmw add ptr %ptr, i64 %value acquire, align 8
522    ret i64 %r
523}
524
525define dso_local i64 @atomicrmw_add_i64_aligned_release(ptr %ptr, i64 %value) {
526; CHECK-LABEL: atomicrmw_add_i64_aligned_release:
527; CHECK:    ldaddl x1, x0, [x0]
528    %r = atomicrmw add ptr %ptr, i64 %value release, align 8
529    ret i64 %r
530}
531
532define dso_local i64 @atomicrmw_add_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
533; CHECK-LABEL: atomicrmw_add_i64_aligned_acq_rel:
534; CHECK:    ldaddal x1, x0, [x0]
535    %r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 8
536    ret i64 %r
537}
538
539define dso_local i64 @atomicrmw_add_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
540; CHECK-LABEL: atomicrmw_add_i64_aligned_seq_cst:
541; CHECK:    ldaddal x1, x0, [x0]
542    %r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 8
543    ret i64 %r
544}
545
546define dso_local i128 @atomicrmw_add_i128_aligned_monotonic(ptr %ptr, i128 %value) {
547; -O0-LABEL: atomicrmw_add_i128_aligned_monotonic:
548; -O0:    adds x2, x9, x11
549; -O0:    subs w11, w11, #1
550; -O0:    casp x0, x1, x2, x3, [x8]
551; -O0:    eor x8, x10, x8
552; -O0:    eor x11, x9, x11
553; -O0:    orr x8, x8, x11
554; -O0:    subs x8, x8, #0
555;
556; -O1-LABEL: atomicrmw_add_i128_aligned_monotonic:
557; -O1:    ldp x4, x5, [x0]
558; -O1:    adds x8, x4, x2
559; -O1:    casp x4, x5, x8, x9, [x0]
560; -O1:    cmp x5, x7
561; -O1:    ccmp x4, x6, #0, eq
562    %r = atomicrmw add ptr %ptr, i128 %value monotonic, align 16
563    ret i128 %r
564}
565
566define dso_local i128 @atomicrmw_add_i128_aligned_acquire(ptr %ptr, i128 %value) {
567; -O0-LABEL: atomicrmw_add_i128_aligned_acquire:
568; -O0:    adds x2, x9, x11
569; -O0:    subs w11, w11, #1
570; -O0:    caspa x0, x1, x2, x3, [x8]
571; -O0:    eor x8, x10, x8
572; -O0:    eor x11, x9, x11
573; -O0:    orr x8, x8, x11
574; -O0:    subs x8, x8, #0
575;
576; -O1-LABEL: atomicrmw_add_i128_aligned_acquire:
577; -O1:    ldp x4, x5, [x0]
578; -O1:    adds x8, x4, x2
579; -O1:    caspa x4, x5, x8, x9, [x0]
580; -O1:    cmp x5, x7
581; -O1:    ccmp x4, x6, #0, eq
582    %r = atomicrmw add ptr %ptr, i128 %value acquire, align 16
583    ret i128 %r
584}
585
586define dso_local i128 @atomicrmw_add_i128_aligned_release(ptr %ptr, i128 %value) {
587; -O0-LABEL: atomicrmw_add_i128_aligned_release:
588; -O0:    adds x2, x9, x11
589; -O0:    subs w11, w11, #1
590; -O0:    caspl x0, x1, x2, x3, [x8]
591; -O0:    eor x8, x10, x8
592; -O0:    eor x11, x9, x11
593; -O0:    orr x8, x8, x11
594; -O0:    subs x8, x8, #0
595;
596; -O1-LABEL: atomicrmw_add_i128_aligned_release:
597; -O1:    ldp x4, x5, [x0]
598; -O1:    adds x8, x4, x2
599; -O1:    caspl x4, x5, x8, x9, [x0]
600; -O1:    cmp x5, x7
601; -O1:    ccmp x4, x6, #0, eq
602    %r = atomicrmw add ptr %ptr, i128 %value release, align 16
603    ret i128 %r
604}
605
606define dso_local i128 @atomicrmw_add_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
607; -O0-LABEL: atomicrmw_add_i128_aligned_acq_rel:
608; -O0:    adds x2, x9, x11
609; -O0:    subs w11, w11, #1
610; -O0:    caspal x0, x1, x2, x3, [x8]
611; -O0:    eor x8, x10, x8
612; -O0:    eor x11, x9, x11
613; -O0:    orr x8, x8, x11
614; -O0:    subs x8, x8, #0
615;
616; -O1-LABEL: atomicrmw_add_i128_aligned_acq_rel:
617; -O1:    ldp x4, x5, [x0]
618; -O1:    adds x8, x4, x2
619; -O1:    caspal x4, x5, x8, x9, [x0]
620; -O1:    cmp x5, x7
621; -O1:    ccmp x4, x6, #0, eq
622    %r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 16
623    ret i128 %r
624}
625
626define dso_local i128 @atomicrmw_add_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
627; -O0-LABEL: atomicrmw_add_i128_aligned_seq_cst:
628; -O0:    adds x2, x9, x11
629; -O0:    subs w11, w11, #1
630; -O0:    caspal x0, x1, x2, x3, [x8]
631; -O0:    eor x8, x10, x8
632; -O0:    eor x11, x9, x11
633; -O0:    orr x8, x8, x11
634; -O0:    subs x8, x8, #0
635;
636; -O1-LABEL: atomicrmw_add_i128_aligned_seq_cst:
637; -O1:    ldp x4, x5, [x0]
638; -O1:    adds x8, x4, x2
639; -O1:    caspal x4, x5, x8, x9, [x0]
640; -O1:    cmp x5, x7
641; -O1:    ccmp x4, x6, #0, eq
642    %r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 16
643    ret i128 %r
644}
645
646define dso_local i8 @atomicrmw_add_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
647; CHECK-LABEL: atomicrmw_add_i8_unaligned_monotonic:
648; CHECK:    ldaddb w1, w0, [x0]
649    %r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1
650    ret i8 %r
651}
652
653define dso_local i8 @atomicrmw_add_i8_unaligned_acquire(ptr %ptr, i8 %value) {
654; CHECK-LABEL: atomicrmw_add_i8_unaligned_acquire:
655; CHECK:    ldaddab w1, w0, [x0]
656    %r = atomicrmw add ptr %ptr, i8 %value acquire, align 1
657    ret i8 %r
658}
659
660define dso_local i8 @atomicrmw_add_i8_unaligned_release(ptr %ptr, i8 %value) {
661; CHECK-LABEL: atomicrmw_add_i8_unaligned_release:
662; CHECK:    ldaddlb w1, w0, [x0]
663    %r = atomicrmw add ptr %ptr, i8 %value release, align 1
664    ret i8 %r
665}
666
667define dso_local i8 @atomicrmw_add_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
668; CHECK-LABEL: atomicrmw_add_i8_unaligned_acq_rel:
669; CHECK:    ldaddalb w1, w0, [x0]
670    %r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1
671    ret i8 %r
672}
673
674define dso_local i8 @atomicrmw_add_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
675; CHECK-LABEL: atomicrmw_add_i8_unaligned_seq_cst:
676; CHECK:    ldaddalb w1, w0, [x0]
677    %r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1
678    ret i8 %r
679}
680
681define dso_local i16 @atomicrmw_add_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
682; -O0-LABEL: atomicrmw_add_i16_unaligned_monotonic:
683; -O0:    add w8, w8, w9, uxth
684; -O0:    bl __atomic_compare_exchange
685;
686; -O1-LABEL: atomicrmw_add_i16_unaligned_monotonic:
687; -O1:    add w8, w0, w20
688; -O1:    bl __atomic_compare_exchange
689    %r = atomicrmw add ptr %ptr, i16 %value monotonic, align 1
690    ret i16 %r
691}
692
693define dso_local i16 @atomicrmw_add_i16_unaligned_acquire(ptr %ptr, i16 %value) {
694; -O0-LABEL: atomicrmw_add_i16_unaligned_acquire:
695; -O0:    add w8, w8, w9, uxth
696; -O0:    bl __atomic_compare_exchange
697;
698; -O1-LABEL: atomicrmw_add_i16_unaligned_acquire:
699; -O1:    add w8, w0, w20
700; -O1:    bl __atomic_compare_exchange
701    %r = atomicrmw add ptr %ptr, i16 %value acquire, align 1
702    ret i16 %r
703}
704
705define dso_local i16 @atomicrmw_add_i16_unaligned_release(ptr %ptr, i16 %value) {
706; -O0-LABEL: atomicrmw_add_i16_unaligned_release:
707; -O0:    add w8, w8, w9, uxth
708; -O0:    bl __atomic_compare_exchange
709;
710; -O1-LABEL: atomicrmw_add_i16_unaligned_release:
711; -O1:    add w8, w0, w20
712; -O1:    bl __atomic_compare_exchange
713    %r = atomicrmw add ptr %ptr, i16 %value release, align 1
714    ret i16 %r
715}
716
717define dso_local i16 @atomicrmw_add_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
718; -O0-LABEL: atomicrmw_add_i16_unaligned_acq_rel:
719; -O0:    add w8, w8, w9, uxth
720; -O0:    bl __atomic_compare_exchange
721;
722; -O1-LABEL: atomicrmw_add_i16_unaligned_acq_rel:
723; -O1:    add w8, w0, w20
724; -O1:    bl __atomic_compare_exchange
725    %r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 1
726    ret i16 %r
727}
728
729define dso_local i16 @atomicrmw_add_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
730; -O0-LABEL: atomicrmw_add_i16_unaligned_seq_cst:
731; -O0:    add w8, w8, w9, uxth
732; -O0:    bl __atomic_compare_exchange
733;
734; -O1-LABEL: atomicrmw_add_i16_unaligned_seq_cst:
735; -O1:    add w8, w0, w20
736; -O1:    bl __atomic_compare_exchange
737    %r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 1
738    ret i16 %r
739}
740
741define dso_local i32 @atomicrmw_add_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
742; -O0-LABEL: atomicrmw_add_i32_unaligned_monotonic:
743; -O0:    add w8, w9, w8
744; -O0:    bl __atomic_compare_exchange
745;
746; -O1-LABEL: atomicrmw_add_i32_unaligned_monotonic:
747; -O1:    add w8, w0, w20
748; -O1:    bl __atomic_compare_exchange
749    %r = atomicrmw add ptr %ptr, i32 %value monotonic, align 1
750    ret i32 %r
751}
752
753define dso_local i32 @atomicrmw_add_i32_unaligned_acquire(ptr %ptr, i32 %value) {
754; -O0-LABEL: atomicrmw_add_i32_unaligned_acquire:
755; -O0:    add w8, w9, w8
756; -O0:    bl __atomic_compare_exchange
757;
758; -O1-LABEL: atomicrmw_add_i32_unaligned_acquire:
759; -O1:    add w8, w0, w20
760; -O1:    bl __atomic_compare_exchange
761    %r = atomicrmw add ptr %ptr, i32 %value acquire, align 1
762    ret i32 %r
763}
764
765define dso_local i32 @atomicrmw_add_i32_unaligned_release(ptr %ptr, i32 %value) {
766; -O0-LABEL: atomicrmw_add_i32_unaligned_release:
767; -O0:    add w8, w9, w8
768; -O0:    bl __atomic_compare_exchange
769;
770; -O1-LABEL: atomicrmw_add_i32_unaligned_release:
771; -O1:    add w8, w0, w20
772; -O1:    bl __atomic_compare_exchange
773    %r = atomicrmw add ptr %ptr, i32 %value release, align 1
774    ret i32 %r
775}
776
777define dso_local i32 @atomicrmw_add_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
778; -O0-LABEL: atomicrmw_add_i32_unaligned_acq_rel:
779; -O0:    add w8, w9, w8
780; -O0:    bl __atomic_compare_exchange
781;
782; -O1-LABEL: atomicrmw_add_i32_unaligned_acq_rel:
783; -O1:    add w8, w0, w20
784; -O1:    bl __atomic_compare_exchange
785    %r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 1
786    ret i32 %r
787}
788
789define dso_local i32 @atomicrmw_add_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
790; -O0-LABEL: atomicrmw_add_i32_unaligned_seq_cst:
791; -O0:    add w8, w9, w8
792; -O0:    bl __atomic_compare_exchange
793;
794; -O1-LABEL: atomicrmw_add_i32_unaligned_seq_cst:
795; -O1:    add w8, w0, w20
796; -O1:    bl __atomic_compare_exchange
797    %r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 1
798    ret i32 %r
799}
800
801define dso_local i64 @atomicrmw_add_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
802; -O0-LABEL: atomicrmw_add_i64_unaligned_monotonic:
803; -O0:    add x8, x9, x8
804; -O0:    bl __atomic_compare_exchange
805;
806; -O1-LABEL: atomicrmw_add_i64_unaligned_monotonic:
807; -O1:    add x8, x0, x20
808; -O1:    bl __atomic_compare_exchange
809    %r = atomicrmw add ptr %ptr, i64 %value monotonic, align 1
810    ret i64 %r
811}
812
813define dso_local i64 @atomicrmw_add_i64_unaligned_acquire(ptr %ptr, i64 %value) {
814; -O0-LABEL: atomicrmw_add_i64_unaligned_acquire:
815; -O0:    add x8, x9, x8
816; -O0:    bl __atomic_compare_exchange
817;
818; -O1-LABEL: atomicrmw_add_i64_unaligned_acquire:
819; -O1:    add x8, x0, x20
820; -O1:    bl __atomic_compare_exchange
821    %r = atomicrmw add ptr %ptr, i64 %value acquire, align 1
822    ret i64 %r
823}
824
825define dso_local i64 @atomicrmw_add_i64_unaligned_release(ptr %ptr, i64 %value) {
826; -O0-LABEL: atomicrmw_add_i64_unaligned_release:
827; -O0:    add x8, x9, x8
828; -O0:    bl __atomic_compare_exchange
829;
830; -O1-LABEL: atomicrmw_add_i64_unaligned_release:
831; -O1:    add x8, x0, x20
832; -O1:    bl __atomic_compare_exchange
833    %r = atomicrmw add ptr %ptr, i64 %value release, align 1
834    ret i64 %r
835}
836
837define dso_local i64 @atomicrmw_add_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
838; -O0-LABEL: atomicrmw_add_i64_unaligned_acq_rel:
839; -O0:    add x8, x9, x8
840; -O0:    bl __atomic_compare_exchange
841;
842; -O1-LABEL: atomicrmw_add_i64_unaligned_acq_rel:
843; -O1:    add x8, x0, x20
844; -O1:    bl __atomic_compare_exchange
845    %r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 1
846    ret i64 %r
847}
848
849define dso_local i64 @atomicrmw_add_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
850; -O0-LABEL: atomicrmw_add_i64_unaligned_seq_cst:
851; -O0:    add x8, x9, x8
852; -O0:    bl __atomic_compare_exchange
853;
854; -O1-LABEL: atomicrmw_add_i64_unaligned_seq_cst:
855; -O1:    add x8, x0, x20
856; -O1:    bl __atomic_compare_exchange
857    %r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 1
858    ret i64 %r
859}
860
861define dso_local i128 @atomicrmw_add_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
862; -O0-LABEL: atomicrmw_add_i128_unaligned_monotonic:
863; -O0:    adds x9, x8, x9
864; -O0:    subs w11, w11, #1
865; -O0:    bl __atomic_compare_exchange
866;
867; -O1-LABEL: atomicrmw_add_i128_unaligned_monotonic:
868; -O1:    ldp x0, x1, [x0]
869; -O1:    adds x8, x0, x21
870; -O1:    bl __atomic_compare_exchange
871    %r = atomicrmw add ptr %ptr, i128 %value monotonic, align 1
872    ret i128 %r
873}
874
875define dso_local i128 @atomicrmw_add_i128_unaligned_acquire(ptr %ptr, i128 %value) {
876; -O0-LABEL: atomicrmw_add_i128_unaligned_acquire:
877; -O0:    adds x9, x8, x9
878; -O0:    subs w11, w11, #1
879; -O0:    bl __atomic_compare_exchange
880;
881; -O1-LABEL: atomicrmw_add_i128_unaligned_acquire:
882; -O1:    ldp x0, x1, [x0]
883; -O1:    adds x8, x0, x21
884; -O1:    bl __atomic_compare_exchange
885    %r = atomicrmw add ptr %ptr, i128 %value acquire, align 1
886    ret i128 %r
887}
888
889define dso_local i128 @atomicrmw_add_i128_unaligned_release(ptr %ptr, i128 %value) {
890; -O0-LABEL: atomicrmw_add_i128_unaligned_release:
891; -O0:    adds x9, x8, x9
892; -O0:    subs w11, w11, #1
893; -O0:    bl __atomic_compare_exchange
894;
895; -O1-LABEL: atomicrmw_add_i128_unaligned_release:
896; -O1:    ldp x0, x1, [x0]
897; -O1:    adds x8, x0, x21
898; -O1:    bl __atomic_compare_exchange
899    %r = atomicrmw add ptr %ptr, i128 %value release, align 1
900    ret i128 %r
901}
902
903define dso_local i128 @atomicrmw_add_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
904; -O0-LABEL: atomicrmw_add_i128_unaligned_acq_rel:
905; -O0:    adds x9, x8, x9
906; -O0:    subs w11, w11, #1
907; -O0:    bl __atomic_compare_exchange
908;
909; -O1-LABEL: atomicrmw_add_i128_unaligned_acq_rel:
910; -O1:    ldp x0, x1, [x0]
911; -O1:    adds x8, x0, x21
912; -O1:    bl __atomic_compare_exchange
913    %r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 1
914    ret i128 %r
915}
916
917define dso_local i128 @atomicrmw_add_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
918; -O0-LABEL: atomicrmw_add_i128_unaligned_seq_cst:
919; -O0:    adds x9, x8, x9
920; -O0:    subs w11, w11, #1
921; -O0:    bl __atomic_compare_exchange
922;
923; -O1-LABEL: atomicrmw_add_i128_unaligned_seq_cst:
924; -O1:    ldp x0, x1, [x0]
925; -O1:    adds x8, x0, x21
926; -O1:    bl __atomic_compare_exchange
927    %r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 1
928    ret i128 %r
929}
930
931define dso_local i8 @atomicrmw_sub_i8_aligned_monotonic(ptr %ptr, i8 %value) {
932; CHECK-LABEL: atomicrmw_sub_i8_aligned_monotonic:
933; CHECK:    ldaddb w8, w0, [x0]
934    %r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1
935    ret i8 %r
936}
937
938define dso_local i8 @atomicrmw_sub_i8_aligned_acquire(ptr %ptr, i8 %value) {
939; CHECK-LABEL: atomicrmw_sub_i8_aligned_acquire:
940; CHECK:    ldaddab w8, w0, [x0]
941    %r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1
942    ret i8 %r
943}
944
945define dso_local i8 @atomicrmw_sub_i8_aligned_release(ptr %ptr, i8 %value) {
946; CHECK-LABEL: atomicrmw_sub_i8_aligned_release:
947; CHECK:    ldaddlb w8, w0, [x0]
948    %r = atomicrmw sub ptr %ptr, i8 %value release, align 1
949    ret i8 %r
950}
951
952define dso_local i8 @atomicrmw_sub_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
953; CHECK-LABEL: atomicrmw_sub_i8_aligned_acq_rel:
954; CHECK:    ldaddalb w8, w0, [x0]
955    %r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1
956    ret i8 %r
957}
958
959define dso_local i8 @atomicrmw_sub_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
960; CHECK-LABEL: atomicrmw_sub_i8_aligned_seq_cst:
961; CHECK:    ldaddalb w8, w0, [x0]
962    %r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1
963    ret i8 %r
964}
965
966define dso_local i16 @atomicrmw_sub_i16_aligned_monotonic(ptr %ptr, i16 %value) {
967; CHECK-LABEL: atomicrmw_sub_i16_aligned_monotonic:
968; CHECK:    ldaddh w8, w0, [x0]
969    %r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 2
970    ret i16 %r
971}
972
973define dso_local i16 @atomicrmw_sub_i16_aligned_acquire(ptr %ptr, i16 %value) {
974; CHECK-LABEL: atomicrmw_sub_i16_aligned_acquire:
975; CHECK:    ldaddah w8, w0, [x0]
976    %r = atomicrmw sub ptr %ptr, i16 %value acquire, align 2
977    ret i16 %r
978}
979
980define dso_local i16 @atomicrmw_sub_i16_aligned_release(ptr %ptr, i16 %value) {
981; CHECK-LABEL: atomicrmw_sub_i16_aligned_release:
982; CHECK:    ldaddlh w8, w0, [x0]
983    %r = atomicrmw sub ptr %ptr, i16 %value release, align 2
984    ret i16 %r
985}
986
987define dso_local i16 @atomicrmw_sub_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
988; CHECK-LABEL: atomicrmw_sub_i16_aligned_acq_rel:
989; CHECK:    ldaddalh w8, w0, [x0]
990    %r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 2
991    ret i16 %r
992}
993
994define dso_local i16 @atomicrmw_sub_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
995; CHECK-LABEL: atomicrmw_sub_i16_aligned_seq_cst:
996; CHECK:    ldaddalh w8, w0, [x0]
997    %r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 2
998    ret i16 %r
999}
1000
1001define dso_local i32 @atomicrmw_sub_i32_aligned_monotonic(ptr %ptr, i32 %value) {
1002; CHECK-LABEL: atomicrmw_sub_i32_aligned_monotonic:
1003; CHECK:    ldadd w8, w0, [x0]
1004    %r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 4
1005    ret i32 %r
1006}
1007
1008define dso_local i32 @atomicrmw_sub_i32_aligned_acquire(ptr %ptr, i32 %value) {
1009; CHECK-LABEL: atomicrmw_sub_i32_aligned_acquire:
1010; CHECK:    ldadda w8, w0, [x0]
1011    %r = atomicrmw sub ptr %ptr, i32 %value acquire, align 4
1012    ret i32 %r
1013}
1014
1015define dso_local i32 @atomicrmw_sub_i32_aligned_release(ptr %ptr, i32 %value) {
1016; CHECK-LABEL: atomicrmw_sub_i32_aligned_release:
1017; CHECK:    ldaddl w8, w0, [x0]
1018    %r = atomicrmw sub ptr %ptr, i32 %value release, align 4
1019    ret i32 %r
1020}
1021
1022define dso_local i32 @atomicrmw_sub_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
1023; CHECK-LABEL: atomicrmw_sub_i32_aligned_acq_rel:
1024; CHECK:    ldaddal w8, w0, [x0]
1025    %r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 4
1026    ret i32 %r
1027}
1028
1029define dso_local i32 @atomicrmw_sub_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
1030; CHECK-LABEL: atomicrmw_sub_i32_aligned_seq_cst:
1031; CHECK:    ldaddal w8, w0, [x0]
1032    %r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 4
1033    ret i32 %r
1034}
1035
1036define dso_local i64 @atomicrmw_sub_i64_aligned_monotonic(ptr %ptr, i64 %value) {
1037; CHECK-LABEL: atomicrmw_sub_i64_aligned_monotonic:
1038; CHECK:    ldadd x8, x0, [x0]
1039    %r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 8
1040    ret i64 %r
1041}
1042
1043define dso_local i64 @atomicrmw_sub_i64_aligned_acquire(ptr %ptr, i64 %value) {
1044; CHECK-LABEL: atomicrmw_sub_i64_aligned_acquire:
1045; CHECK:    ldadda x8, x0, [x0]
1046    %r = atomicrmw sub ptr %ptr, i64 %value acquire, align 8
1047    ret i64 %r
1048}
1049
1050define dso_local i64 @atomicrmw_sub_i64_aligned_release(ptr %ptr, i64 %value) {
1051; CHECK-LABEL: atomicrmw_sub_i64_aligned_release:
1052; CHECK:    ldaddl x8, x0, [x0]
1053    %r = atomicrmw sub ptr %ptr, i64 %value release, align 8
1054    ret i64 %r
1055}
1056
1057define dso_local i64 @atomicrmw_sub_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
1058; CHECK-LABEL: atomicrmw_sub_i64_aligned_acq_rel:
1059; CHECK:    ldaddal x8, x0, [x0]
1060    %r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 8
1061    ret i64 %r
1062}
1063
1064define dso_local i64 @atomicrmw_sub_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
1065; CHECK-LABEL: atomicrmw_sub_i64_aligned_seq_cst:
1066; CHECK:    ldaddal x8, x0, [x0]
1067    %r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 8
1068    ret i64 %r
1069}
1070
1071define dso_local i128 @atomicrmw_sub_i128_aligned_monotonic(ptr %ptr, i128 %value) {
1072; -O0-LABEL: atomicrmw_sub_i128_aligned_monotonic:
1073; -O0:    subs x2, x9, x11
1074; -O0:    casp x0, x1, x2, x3, [x8]
1075; -O0:    eor x8, x10, x8
1076; -O0:    eor x11, x9, x11
1077; -O0:    orr x8, x8, x11
1078; -O0:    subs x8, x8, #0
1079;
1080; -O1-LABEL: atomicrmw_sub_i128_aligned_monotonic:
1081; -O1:    ldp x4, x5, [x0]
1082; -O1:    subs x8, x4, x2
1083; -O1:    casp x4, x5, x8, x9, [x0]
1084; -O1:    cmp x5, x7
1085; -O1:    ccmp x4, x6, #0, eq
1086    %r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 16
1087    ret i128 %r
1088}
1089
1090define dso_local i128 @atomicrmw_sub_i128_aligned_acquire(ptr %ptr, i128 %value) {
1091; -O0-LABEL: atomicrmw_sub_i128_aligned_acquire:
1092; -O0:    subs x2, x9, x11
1093; -O0:    caspa x0, x1, x2, x3, [x8]
1094; -O0:    eor x8, x10, x8
1095; -O0:    eor x11, x9, x11
1096; -O0:    orr x8, x8, x11
1097; -O0:    subs x8, x8, #0
1098;
1099; -O1-LABEL: atomicrmw_sub_i128_aligned_acquire:
1100; -O1:    ldp x4, x5, [x0]
1101; -O1:    subs x8, x4, x2
1102; -O1:    caspa x4, x5, x8, x9, [x0]
1103; -O1:    cmp x5, x7
1104; -O1:    ccmp x4, x6, #0, eq
1105    %r = atomicrmw sub ptr %ptr, i128 %value acquire, align 16
1106    ret i128 %r
1107}
1108
1109define dso_local i128 @atomicrmw_sub_i128_aligned_release(ptr %ptr, i128 %value) {
1110; -O0-LABEL: atomicrmw_sub_i128_aligned_release:
1111; -O0:    subs x2, x9, x11
1112; -O0:    caspl x0, x1, x2, x3, [x8]
1113; -O0:    eor x8, x10, x8
1114; -O0:    eor x11, x9, x11
1115; -O0:    orr x8, x8, x11
1116; -O0:    subs x8, x8, #0
1117;
1118; -O1-LABEL: atomicrmw_sub_i128_aligned_release:
1119; -O1:    ldp x4, x5, [x0]
1120; -O1:    subs x8, x4, x2
1121; -O1:    caspl x4, x5, x8, x9, [x0]
1122; -O1:    cmp x5, x7
1123; -O1:    ccmp x4, x6, #0, eq
1124    %r = atomicrmw sub ptr %ptr, i128 %value release, align 16
1125    ret i128 %r
1126}
1127
1128define dso_local i128 @atomicrmw_sub_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
1129; -O0-LABEL: atomicrmw_sub_i128_aligned_acq_rel:
1130; -O0:    subs x2, x9, x11
1131; -O0:    caspal x0, x1, x2, x3, [x8]
1132; -O0:    eor x8, x10, x8
1133; -O0:    eor x11, x9, x11
1134; -O0:    orr x8, x8, x11
1135; -O0:    subs x8, x8, #0
1136;
1137; -O1-LABEL: atomicrmw_sub_i128_aligned_acq_rel:
1138; -O1:    ldp x4, x5, [x0]
1139; -O1:    subs x8, x4, x2
1140; -O1:    caspal x4, x5, x8, x9, [x0]
1141; -O1:    cmp x5, x7
1142; -O1:    ccmp x4, x6, #0, eq
1143    %r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 16
1144    ret i128 %r
1145}
1146
1147define dso_local i128 @atomicrmw_sub_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
1148; -O0-LABEL: atomicrmw_sub_i128_aligned_seq_cst:
1149; -O0:    subs x2, x9, x11
1150; -O0:    caspal x0, x1, x2, x3, [x8]
1151; -O0:    eor x8, x10, x8
1152; -O0:    eor x11, x9, x11
1153; -O0:    orr x8, x8, x11
1154; -O0:    subs x8, x8, #0
1155;
1156; -O1-LABEL: atomicrmw_sub_i128_aligned_seq_cst:
1157; -O1:    ldp x4, x5, [x0]
1158; -O1:    subs x8, x4, x2
1159; -O1:    caspal x4, x5, x8, x9, [x0]
1160; -O1:    cmp x5, x7
1161; -O1:    ccmp x4, x6, #0, eq
1162    %r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 16
1163    ret i128 %r
1164}
1165
1166define dso_local i8 @atomicrmw_sub_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
1167; CHECK-LABEL: atomicrmw_sub_i8_unaligned_monotonic:
1168; CHECK:    ldaddb w8, w0, [x0]
1169    %r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1
1170    ret i8 %r
1171}
1172
1173define dso_local i8 @atomicrmw_sub_i8_unaligned_acquire(ptr %ptr, i8 %value) {
1174; CHECK-LABEL: atomicrmw_sub_i8_unaligned_acquire:
1175; CHECK:    ldaddab w8, w0, [x0]
1176    %r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1
1177    ret i8 %r
1178}
1179
1180define dso_local i8 @atomicrmw_sub_i8_unaligned_release(ptr %ptr, i8 %value) {
1181; CHECK-LABEL: atomicrmw_sub_i8_unaligned_release:
1182; CHECK:    ldaddlb w8, w0, [x0]
1183    %r = atomicrmw sub ptr %ptr, i8 %value release, align 1
1184    ret i8 %r
1185}
1186
1187define dso_local i8 @atomicrmw_sub_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
1188; CHECK-LABEL: atomicrmw_sub_i8_unaligned_acq_rel:
1189; CHECK:    ldaddalb w8, w0, [x0]
1190    %r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1
1191    ret i8 %r
1192}
1193
1194define dso_local i8 @atomicrmw_sub_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
1195; CHECK-LABEL: atomicrmw_sub_i8_unaligned_seq_cst:
1196; CHECK:    ldaddalb w8, w0, [x0]
1197    %r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1
1198    ret i8 %r
1199}
1200
1201define dso_local i16 @atomicrmw_sub_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
1202; -O0-LABEL: atomicrmw_sub_i16_unaligned_monotonic:
1203; -O0:    subs w8, w9, w8
1204; -O0:    bl __atomic_compare_exchange
1205;
1206; -O1-LABEL: atomicrmw_sub_i16_unaligned_monotonic:
1207; -O1:    sub w8, w0, w20
1208; -O1:    bl __atomic_compare_exchange
1209    %r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 1
1210    ret i16 %r
1211}
1212
1213define dso_local i16 @atomicrmw_sub_i16_unaligned_acquire(ptr %ptr, i16 %value) {
1214; -O0-LABEL: atomicrmw_sub_i16_unaligned_acquire:
1215; -O0:    subs w8, w9, w8
1216; -O0:    bl __atomic_compare_exchange
1217;
1218; -O1-LABEL: atomicrmw_sub_i16_unaligned_acquire:
1219; -O1:    sub w8, w0, w20
1220; -O1:    bl __atomic_compare_exchange
1221    %r = atomicrmw sub ptr %ptr, i16 %value acquire, align 1
1222    ret i16 %r
1223}
1224
1225define dso_local i16 @atomicrmw_sub_i16_unaligned_release(ptr %ptr, i16 %value) {
1226; -O0-LABEL: atomicrmw_sub_i16_unaligned_release:
1227; -O0:    subs w8, w9, w8
1228; -O0:    bl __atomic_compare_exchange
1229;
1230; -O1-LABEL: atomicrmw_sub_i16_unaligned_release:
1231; -O1:    sub w8, w0, w20
1232; -O1:    bl __atomic_compare_exchange
1233    %r = atomicrmw sub ptr %ptr, i16 %value release, align 1
1234    ret i16 %r
1235}
1236
1237define dso_local i16 @atomicrmw_sub_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
1238; -O0-LABEL: atomicrmw_sub_i16_unaligned_acq_rel:
1239; -O0:    subs w8, w9, w8
1240; -O0:    bl __atomic_compare_exchange
1241;
1242; -O1-LABEL: atomicrmw_sub_i16_unaligned_acq_rel:
1243; -O1:    sub w8, w0, w20
1244; -O1:    bl __atomic_compare_exchange
1245    %r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 1
1246    ret i16 %r
1247}
1248
1249define dso_local i16 @atomicrmw_sub_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
1250; -O0-LABEL: atomicrmw_sub_i16_unaligned_seq_cst:
1251; -O0:    subs w8, w9, w8
1252; -O0:    bl __atomic_compare_exchange
1253;
1254; -O1-LABEL: atomicrmw_sub_i16_unaligned_seq_cst:
1255; -O1:    sub w8, w0, w20
1256; -O1:    bl __atomic_compare_exchange
1257    %r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 1
1258    ret i16 %r
1259}
1260
1261define dso_local i32 @atomicrmw_sub_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
1262; -O0-LABEL: atomicrmw_sub_i32_unaligned_monotonic:
1263; -O0:    subs w8, w9, w8
1264; -O0:    bl __atomic_compare_exchange
1265;
1266; -O1-LABEL: atomicrmw_sub_i32_unaligned_monotonic:
1267; -O1:    sub w8, w0, w20
1268; -O1:    bl __atomic_compare_exchange
1269    %r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 1
1270    ret i32 %r
1271}
1272
1273define dso_local i32 @atomicrmw_sub_i32_unaligned_acquire(ptr %ptr, i32 %value) {
1274; -O0-LABEL: atomicrmw_sub_i32_unaligned_acquire:
1275; -O0:    subs w8, w9, w8
1276; -O0:    bl __atomic_compare_exchange
1277;
1278; -O1-LABEL: atomicrmw_sub_i32_unaligned_acquire:
1279; -O1:    sub w8, w0, w20
1280; -O1:    bl __atomic_compare_exchange
1281    %r = atomicrmw sub ptr %ptr, i32 %value acquire, align 1
1282    ret i32 %r
1283}
1284
1285define dso_local i32 @atomicrmw_sub_i32_unaligned_release(ptr %ptr, i32 %value) {
1286; -O0-LABEL: atomicrmw_sub_i32_unaligned_release:
1287; -O0:    subs w8, w9, w8
1288; -O0:    bl __atomic_compare_exchange
1289;
1290; -O1-LABEL: atomicrmw_sub_i32_unaligned_release:
1291; -O1:    sub w8, w0, w20
1292; -O1:    bl __atomic_compare_exchange
1293    %r = atomicrmw sub ptr %ptr, i32 %value release, align 1
1294    ret i32 %r
1295}
1296
1297define dso_local i32 @atomicrmw_sub_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
1298; -O0-LABEL: atomicrmw_sub_i32_unaligned_acq_rel:
1299; -O0:    subs w8, w9, w8
1300; -O0:    bl __atomic_compare_exchange
1301;
1302; -O1-LABEL: atomicrmw_sub_i32_unaligned_acq_rel:
1303; -O1:    sub w8, w0, w20
1304; -O1:    bl __atomic_compare_exchange
1305    %r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 1
1306    ret i32 %r
1307}
1308
1309define dso_local i32 @atomicrmw_sub_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
1310; -O0-LABEL: atomicrmw_sub_i32_unaligned_seq_cst:
1311; -O0:    subs w8, w9, w8
1312; -O0:    bl __atomic_compare_exchange
1313;
1314; -O1-LABEL: atomicrmw_sub_i32_unaligned_seq_cst:
1315; -O1:    sub w8, w0, w20
1316; -O1:    bl __atomic_compare_exchange
1317    %r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 1
1318    ret i32 %r
1319}
1320
1321define dso_local i64 @atomicrmw_sub_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
1322; -O0-LABEL: atomicrmw_sub_i64_unaligned_monotonic:
1323; -O0:    subs x8, x9, x8
1324; -O0:    bl __atomic_compare_exchange
1325;
1326; -O1-LABEL: atomicrmw_sub_i64_unaligned_monotonic:
1327; -O1:    sub x8, x0, x20
1328; -O1:    bl __atomic_compare_exchange
1329    %r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 1
1330    ret i64 %r
1331}
1332
1333define dso_local i64 @atomicrmw_sub_i64_unaligned_acquire(ptr %ptr, i64 %value) {
1334; -O0-LABEL: atomicrmw_sub_i64_unaligned_acquire:
1335; -O0:    subs x8, x9, x8
1336; -O0:    bl __atomic_compare_exchange
1337;
1338; -O1-LABEL: atomicrmw_sub_i64_unaligned_acquire:
1339; -O1:    sub x8, x0, x20
1340; -O1:    bl __atomic_compare_exchange
1341    %r = atomicrmw sub ptr %ptr, i64 %value acquire, align 1
1342    ret i64 %r
1343}
1344
1345define dso_local i64 @atomicrmw_sub_i64_unaligned_release(ptr %ptr, i64 %value) {
1346; -O0-LABEL: atomicrmw_sub_i64_unaligned_release:
1347; -O0:    subs x8, x9, x8
1348; -O0:    bl __atomic_compare_exchange
1349;
1350; -O1-LABEL: atomicrmw_sub_i64_unaligned_release:
1351; -O1:    sub x8, x0, x20
1352; -O1:    bl __atomic_compare_exchange
1353    %r = atomicrmw sub ptr %ptr, i64 %value release, align 1
1354    ret i64 %r
1355}
1356
1357define dso_local i64 @atomicrmw_sub_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
1358; -O0-LABEL: atomicrmw_sub_i64_unaligned_acq_rel:
1359; -O0:    subs x8, x9, x8
1360; -O0:    bl __atomic_compare_exchange
1361;
1362; -O1-LABEL: atomicrmw_sub_i64_unaligned_acq_rel:
1363; -O1:    sub x8, x0, x20
1364; -O1:    bl __atomic_compare_exchange
1365    %r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 1
1366    ret i64 %r
1367}
1368
1369define dso_local i64 @atomicrmw_sub_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
1370; -O0-LABEL: atomicrmw_sub_i64_unaligned_seq_cst:
1371; -O0:    subs x8, x9, x8
1372; -O0:    bl __atomic_compare_exchange
1373;
1374; -O1-LABEL: atomicrmw_sub_i64_unaligned_seq_cst:
1375; -O1:    sub x8, x0, x20
1376; -O1:    bl __atomic_compare_exchange
1377    %r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 1
1378    ret i64 %r
1379}
1380
1381define dso_local i128 @atomicrmw_sub_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
1382; -O0-LABEL: atomicrmw_sub_i128_unaligned_monotonic:
1383; -O0:    subs x9, x8, x9
1384; -O0:    bl __atomic_compare_exchange
1385;
1386; -O1-LABEL: atomicrmw_sub_i128_unaligned_monotonic:
1387; -O1:    ldp x0, x1, [x0]
1388; -O1:    subs x8, x0, x21
1389; -O1:    bl __atomic_compare_exchange
1390    %r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 1
1391    ret i128 %r
1392}
1393
1394define dso_local i128 @atomicrmw_sub_i128_unaligned_acquire(ptr %ptr, i128 %value) {
1395; -O0-LABEL: atomicrmw_sub_i128_unaligned_acquire:
1396; -O0:    subs x9, x8, x9
1397; -O0:    bl __atomic_compare_exchange
1398;
1399; -O1-LABEL: atomicrmw_sub_i128_unaligned_acquire:
1400; -O1:    ldp x0, x1, [x0]
1401; -O1:    subs x8, x0, x21
1402; -O1:    bl __atomic_compare_exchange
1403    %r = atomicrmw sub ptr %ptr, i128 %value acquire, align 1
1404    ret i128 %r
1405}
1406
1407define dso_local i128 @atomicrmw_sub_i128_unaligned_release(ptr %ptr, i128 %value) {
1408; -O0-LABEL: atomicrmw_sub_i128_unaligned_release:
1409; -O0:    subs x9, x8, x9
1410; -O0:    bl __atomic_compare_exchange
1411;
1412; -O1-LABEL: atomicrmw_sub_i128_unaligned_release:
1413; -O1:    ldp x0, x1, [x0]
1414; -O1:    subs x8, x0, x21
1415; -O1:    bl __atomic_compare_exchange
1416    %r = atomicrmw sub ptr %ptr, i128 %value release, align 1
1417    ret i128 %r
1418}
1419
1420define dso_local i128 @atomicrmw_sub_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
1421; -O0-LABEL: atomicrmw_sub_i128_unaligned_acq_rel:
1422; -O0:    subs x9, x8, x9
1423; -O0:    bl __atomic_compare_exchange
1424;
1425; -O1-LABEL: atomicrmw_sub_i128_unaligned_acq_rel:
1426; -O1:    ldp x0, x1, [x0]
1427; -O1:    subs x8, x0, x21
1428; -O1:    bl __atomic_compare_exchange
1429    %r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 1
1430    ret i128 %r
1431}
1432
1433define dso_local i128 @atomicrmw_sub_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
1434; -O0-LABEL: atomicrmw_sub_i128_unaligned_seq_cst:
1435; -O0:    subs x9, x8, x9
1436; -O0:    bl __atomic_compare_exchange
1437;
1438; -O1-LABEL: atomicrmw_sub_i128_unaligned_seq_cst:
1439; -O1:    ldp x0, x1, [x0]
1440; -O1:    subs x8, x0, x21
1441; -O1:    bl __atomic_compare_exchange
1442    %r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 1
1443    ret i128 %r
1444}
1445
1446define dso_local i8 @atomicrmw_and_i8_aligned_monotonic(ptr %ptr, i8 %value) {
1447; CHECK-LABEL: atomicrmw_and_i8_aligned_monotonic:
1448; CHECK:    mvn w8, w1
1449; CHECK:    ldclrb w8, w0, [x0]
1450    %r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1
1451    ret i8 %r
1452}
1453
1454define dso_local i8 @atomicrmw_and_i8_aligned_acquire(ptr %ptr, i8 %value) {
1455; CHECK-LABEL: atomicrmw_and_i8_aligned_acquire:
1456; CHECK:    mvn w8, w1
1457; CHECK:    ldclrab w8, w0, [x0]
1458    %r = atomicrmw and ptr %ptr, i8 %value acquire, align 1
1459    ret i8 %r
1460}
1461
1462define dso_local i8 @atomicrmw_and_i8_aligned_release(ptr %ptr, i8 %value) {
1463; CHECK-LABEL: atomicrmw_and_i8_aligned_release:
1464; CHECK:    mvn w8, w1
1465; CHECK:    ldclrlb w8, w0, [x0]
1466    %r = atomicrmw and ptr %ptr, i8 %value release, align 1
1467    ret i8 %r
1468}
1469
1470define dso_local i8 @atomicrmw_and_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
1471; CHECK-LABEL: atomicrmw_and_i8_aligned_acq_rel:
1472; CHECK:    mvn w8, w1
1473; CHECK:    ldclralb w8, w0, [x0]
1474    %r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1
1475    ret i8 %r
1476}
1477
1478define dso_local i8 @atomicrmw_and_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
1479; CHECK-LABEL: atomicrmw_and_i8_aligned_seq_cst:
1480; CHECK:    mvn w8, w1
1481; CHECK:    ldclralb w8, w0, [x0]
1482    %r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1
1483    ret i8 %r
1484}
1485
1486define dso_local i16 @atomicrmw_and_i16_aligned_monotonic(ptr %ptr, i16 %value) {
1487; CHECK-LABEL: atomicrmw_and_i16_aligned_monotonic:
1488; CHECK:    mvn w8, w1
1489; CHECK:    ldclrh w8, w0, [x0]
1490    %r = atomicrmw and ptr %ptr, i16 %value monotonic, align 2
1491    ret i16 %r
1492}
1493
1494define dso_local i16 @atomicrmw_and_i16_aligned_acquire(ptr %ptr, i16 %value) {
1495; CHECK-LABEL: atomicrmw_and_i16_aligned_acquire:
1496; CHECK:    mvn w8, w1
1497; CHECK:    ldclrah w8, w0, [x0]
1498    %r = atomicrmw and ptr %ptr, i16 %value acquire, align 2
1499    ret i16 %r
1500}
1501
1502define dso_local i16 @atomicrmw_and_i16_aligned_release(ptr %ptr, i16 %value) {
1503; CHECK-LABEL: atomicrmw_and_i16_aligned_release:
1504; CHECK:    mvn w8, w1
1505; CHECK:    ldclrlh w8, w0, [x0]
1506    %r = atomicrmw and ptr %ptr, i16 %value release, align 2
1507    ret i16 %r
1508}
1509
1510define dso_local i16 @atomicrmw_and_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
1511; CHECK-LABEL: atomicrmw_and_i16_aligned_acq_rel:
1512; CHECK:    mvn w8, w1
1513; CHECK:    ldclralh w8, w0, [x0]
1514    %r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 2
1515    ret i16 %r
1516}
1517
1518define dso_local i16 @atomicrmw_and_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
1519; CHECK-LABEL: atomicrmw_and_i16_aligned_seq_cst:
1520; CHECK:    mvn w8, w1
1521; CHECK:    ldclralh w8, w0, [x0]
1522    %r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 2
1523    ret i16 %r
1524}
1525
1526define dso_local i32 @atomicrmw_and_i32_aligned_monotonic(ptr %ptr, i32 %value) {
1527; CHECK-LABEL: atomicrmw_and_i32_aligned_monotonic:
1528; CHECK:    mvn w8, w1
1529; CHECK:    ldclr w8, w0, [x0]
1530    %r = atomicrmw and ptr %ptr, i32 %value monotonic, align 4
1531    ret i32 %r
1532}
1533
1534define dso_local i32 @atomicrmw_and_i32_aligned_acquire(ptr %ptr, i32 %value) {
1535; CHECK-LABEL: atomicrmw_and_i32_aligned_acquire:
1536; CHECK:    mvn w8, w1
1537; CHECK:    ldclra w8, w0, [x0]
1538    %r = atomicrmw and ptr %ptr, i32 %value acquire, align 4
1539    ret i32 %r
1540}
1541
1542define dso_local i32 @atomicrmw_and_i32_aligned_release(ptr %ptr, i32 %value) {
1543; CHECK-LABEL: atomicrmw_and_i32_aligned_release:
1544; CHECK:    mvn w8, w1
1545; CHECK:    ldclrl w8, w0, [x0]
1546    %r = atomicrmw and ptr %ptr, i32 %value release, align 4
1547    ret i32 %r
1548}
1549
1550define dso_local i32 @atomicrmw_and_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
1551; CHECK-LABEL: atomicrmw_and_i32_aligned_acq_rel:
1552; CHECK:    mvn w8, w1
1553; CHECK:    ldclral w8, w0, [x0]
1554    %r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 4
1555    ret i32 %r
1556}
1557
1558define dso_local i32 @atomicrmw_and_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
1559; CHECK-LABEL: atomicrmw_and_i32_aligned_seq_cst:
1560; CHECK:    mvn w8, w1
1561; CHECK:    ldclral w8, w0, [x0]
1562    %r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 4
1563    ret i32 %r
1564}
1565
1566define dso_local i64 @atomicrmw_and_i64_aligned_monotonic(ptr %ptr, i64 %value) {
1567; CHECK-LABEL: atomicrmw_and_i64_aligned_monotonic:
1568; CHECK:    mvn x8, x1
1569; CHECK:    ldclr x8, x0, [x0]
1570    %r = atomicrmw and ptr %ptr, i64 %value monotonic, align 8
1571    ret i64 %r
1572}
1573
1574define dso_local i64 @atomicrmw_and_i64_aligned_acquire(ptr %ptr, i64 %value) {
1575; CHECK-LABEL: atomicrmw_and_i64_aligned_acquire:
1576; CHECK:    mvn x8, x1
1577; CHECK:    ldclra x8, x0, [x0]
1578    %r = atomicrmw and ptr %ptr, i64 %value acquire, align 8
1579    ret i64 %r
1580}
1581
1582define dso_local i64 @atomicrmw_and_i64_aligned_release(ptr %ptr, i64 %value) {
1583; CHECK-LABEL: atomicrmw_and_i64_aligned_release:
1584; CHECK:    mvn x8, x1
1585; CHECK:    ldclrl x8, x0, [x0]
1586    %r = atomicrmw and ptr %ptr, i64 %value release, align 8
1587    ret i64 %r
1588}
1589
1590define dso_local i64 @atomicrmw_and_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
1591; CHECK-LABEL: atomicrmw_and_i64_aligned_acq_rel:
1592; CHECK:    mvn x8, x1
1593; CHECK:    ldclral x8, x0, [x0]
1594    %r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 8
1595    ret i64 %r
1596}
1597
1598define dso_local i64 @atomicrmw_and_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
1599; CHECK-LABEL: atomicrmw_and_i64_aligned_seq_cst:
1600; CHECK:    mvn x8, x1
1601; CHECK:    ldclral x8, x0, [x0]
1602    %r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 8
1603    ret i64 %r
1604}
1605
1606define dso_local i128 @atomicrmw_and_i128_aligned_monotonic(ptr %ptr, i128 %value) {
1607; -O0-LABEL: atomicrmw_and_i128_aligned_monotonic:
1608; -O0:    and x2, x9, x11
1609; -O0:    and x9, x9, x10
1610; -O0:    casp x0, x1, x2, x3, [x8]
1611; -O0:    eor x8, x10, x8
1612; -O0:    eor x11, x9, x11
1613; -O0:    orr x8, x8, x11
1614; -O0:    subs x8, x8, #0
1615;
1616; -O1-LABEL: atomicrmw_and_i128_aligned_monotonic:
1617; -O1:    ldp x4, x5, [x0]
1618; -O1:    and x8, x4, x2
1619; -O1:    and x9, x7, x3
1620; -O1:    casp x4, x5, x8, x9, [x0]
1621; -O1:    cmp x5, x7
1622; -O1:    ccmp x4, x6, #0, eq
1623    %r = atomicrmw and ptr %ptr, i128 %value monotonic, align 16
1624    ret i128 %r
1625}
1626
1627define dso_local i128 @atomicrmw_and_i128_aligned_acquire(ptr %ptr, i128 %value) {
1628; -O0-LABEL: atomicrmw_and_i128_aligned_acquire:
1629; -O0:    and x2, x9, x11
1630; -O0:    and x9, x9, x10
1631; -O0:    caspa x0, x1, x2, x3, [x8]
1632; -O0:    eor x8, x10, x8
1633; -O0:    eor x11, x9, x11
1634; -O0:    orr x8, x8, x11
1635; -O0:    subs x8, x8, #0
1636;
1637; -O1-LABEL: atomicrmw_and_i128_aligned_acquire:
1638; -O1:    ldp x4, x5, [x0]
1639; -O1:    and x8, x4, x2
1640; -O1:    and x9, x7, x3
1641; -O1:    caspa x4, x5, x8, x9, [x0]
1642; -O1:    cmp x5, x7
1643; -O1:    ccmp x4, x6, #0, eq
1644    %r = atomicrmw and ptr %ptr, i128 %value acquire, align 16
1645    ret i128 %r
1646}
1647
1648define dso_local i128 @atomicrmw_and_i128_aligned_release(ptr %ptr, i128 %value) {
1649; -O0-LABEL: atomicrmw_and_i128_aligned_release:
1650; -O0:    and x2, x9, x11
1651; -O0:    and x9, x9, x10
1652; -O0:    caspl x0, x1, x2, x3, [x8]
1653; -O0:    eor x8, x10, x8
1654; -O0:    eor x11, x9, x11
1655; -O0:    orr x8, x8, x11
1656; -O0:    subs x8, x8, #0
1657;
1658; -O1-LABEL: atomicrmw_and_i128_aligned_release:
1659; -O1:    ldp x4, x5, [x0]
1660; -O1:    and x8, x4, x2
1661; -O1:    and x9, x7, x3
1662; -O1:    caspl x4, x5, x8, x9, [x0]
1663; -O1:    cmp x5, x7
1664; -O1:    ccmp x4, x6, #0, eq
1665    %r = atomicrmw and ptr %ptr, i128 %value release, align 16
1666    ret i128 %r
1667}
1668
1669define dso_local i128 @atomicrmw_and_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
1670; -O0-LABEL: atomicrmw_and_i128_aligned_acq_rel:
1671; -O0:    and x2, x9, x11
1672; -O0:    and x9, x9, x10
1673; -O0:    caspal x0, x1, x2, x3, [x8]
1674; -O0:    eor x8, x10, x8
1675; -O0:    eor x11, x9, x11
1676; -O0:    orr x8, x8, x11
1677; -O0:    subs x8, x8, #0
1678;
1679; -O1-LABEL: atomicrmw_and_i128_aligned_acq_rel:
1680; -O1:    ldp x4, x5, [x0]
1681; -O1:    and x8, x4, x2
1682; -O1:    and x9, x7, x3
1683; -O1:    caspal x4, x5, x8, x9, [x0]
1684; -O1:    cmp x5, x7
1685; -O1:    ccmp x4, x6, #0, eq
1686    %r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 16
1687    ret i128 %r
1688}
1689
1690define dso_local i128 @atomicrmw_and_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
1691; -O0-LABEL: atomicrmw_and_i128_aligned_seq_cst:
1692; -O0:    and x2, x9, x11
1693; -O0:    and x9, x9, x10
1694; -O0:    caspal x0, x1, x2, x3, [x8]
1695; -O0:    eor x8, x10, x8
1696; -O0:    eor x11, x9, x11
1697; -O0:    orr x8, x8, x11
1698; -O0:    subs x8, x8, #0
1699;
1700; -O1-LABEL: atomicrmw_and_i128_aligned_seq_cst:
1701; -O1:    ldp x4, x5, [x0]
1702; -O1:    and x8, x4, x2
1703; -O1:    and x9, x7, x3
1704; -O1:    caspal x4, x5, x8, x9, [x0]
1705; -O1:    cmp x5, x7
1706; -O1:    ccmp x4, x6, #0, eq
1707    %r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 16
1708    ret i128 %r
1709}
1710
1711define dso_local i8 @atomicrmw_and_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
1712; CHECK-LABEL: atomicrmw_and_i8_unaligned_monotonic:
1713; CHECK:    mvn w8, w1
1714; CHECK:    ldclrb w8, w0, [x0]
1715    %r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1
1716    ret i8 %r
1717}
1718
1719define dso_local i8 @atomicrmw_and_i8_unaligned_acquire(ptr %ptr, i8 %value) {
1720; CHECK-LABEL: atomicrmw_and_i8_unaligned_acquire:
1721; CHECK:    mvn w8, w1
1722; CHECK:    ldclrab w8, w0, [x0]
1723    %r = atomicrmw and ptr %ptr, i8 %value acquire, align 1
1724    ret i8 %r
1725}
1726
1727define dso_local i8 @atomicrmw_and_i8_unaligned_release(ptr %ptr, i8 %value) {
1728; CHECK-LABEL: atomicrmw_and_i8_unaligned_release:
1729; CHECK:    mvn w8, w1
1730; CHECK:    ldclrlb w8, w0, [x0]
1731    %r = atomicrmw and ptr %ptr, i8 %value release, align 1
1732    ret i8 %r
1733}
1734
1735define dso_local i8 @atomicrmw_and_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
1736; CHECK-LABEL: atomicrmw_and_i8_unaligned_acq_rel:
1737; CHECK:    mvn w8, w1
1738; CHECK:    ldclralb w8, w0, [x0]
1739    %r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1
1740    ret i8 %r
1741}
1742
1743define dso_local i8 @atomicrmw_and_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
1744; CHECK-LABEL: atomicrmw_and_i8_unaligned_seq_cst:
1745; CHECK:    mvn w8, w1
1746; CHECK:    ldclralb w8, w0, [x0]
1747    %r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1
1748    ret i8 %r
1749}
1750
1751define dso_local i16 @atomicrmw_and_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
1752; -O0-LABEL: atomicrmw_and_i16_unaligned_monotonic:
1753; -O0:    and w8, w9, w8
1754; -O0:    bl __atomic_compare_exchange
1755;
1756; -O1-LABEL: atomicrmw_and_i16_unaligned_monotonic:
1757; -O1:    and w8, w0, w20
1758; -O1:    bl __atomic_compare_exchange
1759    %r = atomicrmw and ptr %ptr, i16 %value monotonic, align 1
1760    ret i16 %r
1761}
1762
1763define dso_local i16 @atomicrmw_and_i16_unaligned_acquire(ptr %ptr, i16 %value) {
1764; -O0-LABEL: atomicrmw_and_i16_unaligned_acquire:
1765; -O0:    and w8, w9, w8
1766; -O0:    bl __atomic_compare_exchange
1767;
1768; -O1-LABEL: atomicrmw_and_i16_unaligned_acquire:
1769; -O1:    and w8, w0, w20
1770; -O1:    bl __atomic_compare_exchange
1771    %r = atomicrmw and ptr %ptr, i16 %value acquire, align 1
1772    ret i16 %r
1773}
1774
1775define dso_local i16 @atomicrmw_and_i16_unaligned_release(ptr %ptr, i16 %value) {
1776; -O0-LABEL: atomicrmw_and_i16_unaligned_release:
1777; -O0:    and w8, w9, w8
1778; -O0:    bl __atomic_compare_exchange
1779;
1780; -O1-LABEL: atomicrmw_and_i16_unaligned_release:
1781; -O1:    and w8, w0, w20
1782; -O1:    bl __atomic_compare_exchange
1783    %r = atomicrmw and ptr %ptr, i16 %value release, align 1
1784    ret i16 %r
1785}
1786
1787define dso_local i16 @atomicrmw_and_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
1788; -O0-LABEL: atomicrmw_and_i16_unaligned_acq_rel:
1789; -O0:    and w8, w9, w8
1790; -O0:    bl __atomic_compare_exchange
1791;
1792; -O1-LABEL: atomicrmw_and_i16_unaligned_acq_rel:
1793; -O1:    and w8, w0, w20
1794; -O1:    bl __atomic_compare_exchange
1795    %r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 1
1796    ret i16 %r
1797}
1798
1799define dso_local i16 @atomicrmw_and_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
1800; -O0-LABEL: atomicrmw_and_i16_unaligned_seq_cst:
1801; -O0:    and w8, w9, w8
1802; -O0:    bl __atomic_compare_exchange
1803;
1804; -O1-LABEL: atomicrmw_and_i16_unaligned_seq_cst:
1805; -O1:    and w8, w0, w20
1806; -O1:    bl __atomic_compare_exchange
1807    %r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 1
1808    ret i16 %r
1809}
1810
1811define dso_local i32 @atomicrmw_and_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
1812; -O0-LABEL: atomicrmw_and_i32_unaligned_monotonic:
1813; -O0:    and w8, w9, w8
1814; -O0:    bl __atomic_compare_exchange
1815;
1816; -O1-LABEL: atomicrmw_and_i32_unaligned_monotonic:
1817; -O1:    and w8, w0, w20
1818; -O1:    bl __atomic_compare_exchange
1819    %r = atomicrmw and ptr %ptr, i32 %value monotonic, align 1
1820    ret i32 %r
1821}
1822
1823define dso_local i32 @atomicrmw_and_i32_unaligned_acquire(ptr %ptr, i32 %value) {
1824; -O0-LABEL: atomicrmw_and_i32_unaligned_acquire:
1825; -O0:    and w8, w9, w8
1826; -O0:    bl __atomic_compare_exchange
1827;
1828; -O1-LABEL: atomicrmw_and_i32_unaligned_acquire:
1829; -O1:    and w8, w0, w20
1830; -O1:    bl __atomic_compare_exchange
1831    %r = atomicrmw and ptr %ptr, i32 %value acquire, align 1
1832    ret i32 %r
1833}
1834
1835define dso_local i32 @atomicrmw_and_i32_unaligned_release(ptr %ptr, i32 %value) {
1836; -O0-LABEL: atomicrmw_and_i32_unaligned_release:
1837; -O0:    and w8, w9, w8
1838; -O0:    bl __atomic_compare_exchange
1839;
1840; -O1-LABEL: atomicrmw_and_i32_unaligned_release:
1841; -O1:    and w8, w0, w20
1842; -O1:    bl __atomic_compare_exchange
1843    %r = atomicrmw and ptr %ptr, i32 %value release, align 1
1844    ret i32 %r
1845}
1846
1847define dso_local i32 @atomicrmw_and_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
1848; -O0-LABEL: atomicrmw_and_i32_unaligned_acq_rel:
1849; -O0:    and w8, w9, w8
1850; -O0:    bl __atomic_compare_exchange
1851;
1852; -O1-LABEL: atomicrmw_and_i32_unaligned_acq_rel:
1853; -O1:    and w8, w0, w20
1854; -O1:    bl __atomic_compare_exchange
1855    %r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 1
1856    ret i32 %r
1857}
1858
1859define dso_local i32 @atomicrmw_and_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
1860; -O0-LABEL: atomicrmw_and_i32_unaligned_seq_cst:
1861; -O0:    and w8, w9, w8
1862; -O0:    bl __atomic_compare_exchange
1863;
1864; -O1-LABEL: atomicrmw_and_i32_unaligned_seq_cst:
1865; -O1:    and w8, w0, w20
1866; -O1:    bl __atomic_compare_exchange
1867    %r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 1
1868    ret i32 %r
1869}
1870
1871define dso_local i64 @atomicrmw_and_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
1872; -O0-LABEL: atomicrmw_and_i64_unaligned_monotonic:
1873; -O0:    and x8, x9, x8
1874; -O0:    bl __atomic_compare_exchange
1875;
1876; -O1-LABEL: atomicrmw_and_i64_unaligned_monotonic:
1877; -O1:    and x8, x0, x20
1878; -O1:    bl __atomic_compare_exchange
1879    %r = atomicrmw and ptr %ptr, i64 %value monotonic, align 1
1880    ret i64 %r
1881}
1882
1883define dso_local i64 @atomicrmw_and_i64_unaligned_acquire(ptr %ptr, i64 %value) {
1884; -O0-LABEL: atomicrmw_and_i64_unaligned_acquire:
1885; -O0:    and x8, x9, x8
1886; -O0:    bl __atomic_compare_exchange
1887;
1888; -O1-LABEL: atomicrmw_and_i64_unaligned_acquire:
1889; -O1:    and x8, x0, x20
1890; -O1:    bl __atomic_compare_exchange
1891    %r = atomicrmw and ptr %ptr, i64 %value acquire, align 1
1892    ret i64 %r
1893}
1894
1895define dso_local i64 @atomicrmw_and_i64_unaligned_release(ptr %ptr, i64 %value) {
1896; -O0-LABEL: atomicrmw_and_i64_unaligned_release:
1897; -O0:    and x8, x9, x8
1898; -O0:    bl __atomic_compare_exchange
1899;
1900; -O1-LABEL: atomicrmw_and_i64_unaligned_release:
1901; -O1:    and x8, x0, x20
1902; -O1:    bl __atomic_compare_exchange
1903    %r = atomicrmw and ptr %ptr, i64 %value release, align 1
1904    ret i64 %r
1905}
1906
1907define dso_local i64 @atomicrmw_and_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
1908; -O0-LABEL: atomicrmw_and_i64_unaligned_acq_rel:
1909; -O0:    and x8, x9, x8
1910; -O0:    bl __atomic_compare_exchange
1911;
1912; -O1-LABEL: atomicrmw_and_i64_unaligned_acq_rel:
1913; -O1:    and x8, x0, x20
1914; -O1:    bl __atomic_compare_exchange
1915    %r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 1
1916    ret i64 %r
1917}
1918
1919define dso_local i64 @atomicrmw_and_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
1920; -O0-LABEL: atomicrmw_and_i64_unaligned_seq_cst:
1921; -O0:    and x8, x9, x8
1922; -O0:    bl __atomic_compare_exchange
1923;
1924; -O1-LABEL: atomicrmw_and_i64_unaligned_seq_cst:
1925; -O1:    and x8, x0, x20
1926; -O1:    bl __atomic_compare_exchange
1927    %r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 1
1928    ret i64 %r
1929}
1930
1931define dso_local i128 @atomicrmw_and_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
1932; -O0-LABEL: atomicrmw_and_i128_unaligned_monotonic:
1933; -O0:    and x9, x8, x9
1934; -O0:    and x8, x8, x10
1935; -O0:    bl __atomic_compare_exchange
1936;
1937; -O1-LABEL: atomicrmw_and_i128_unaligned_monotonic:
1938; -O1:    ldp x0, x1, [x0]
1939; -O1:    and x8, x1, x19
1940; -O1:    and x9, x0, x21
1941; -O1:    bl __atomic_compare_exchange
1942    %r = atomicrmw and ptr %ptr, i128 %value monotonic, align 1
1943    ret i128 %r
1944}
1945
1946define dso_local i128 @atomicrmw_and_i128_unaligned_acquire(ptr %ptr, i128 %value) {
1947; -O0-LABEL: atomicrmw_and_i128_unaligned_acquire:
1948; -O0:    and x9, x8, x9
1949; -O0:    and x8, x8, x10
1950; -O0:    bl __atomic_compare_exchange
1951;
1952; -O1-LABEL: atomicrmw_and_i128_unaligned_acquire:
1953; -O1:    ldp x0, x1, [x0]
1954; -O1:    and x8, x1, x19
1955; -O1:    and x9, x0, x21
1956; -O1:    bl __atomic_compare_exchange
1957    %r = atomicrmw and ptr %ptr, i128 %value acquire, align 1
1958    ret i128 %r
1959}
1960
1961define dso_local i128 @atomicrmw_and_i128_unaligned_release(ptr %ptr, i128 %value) {
1962; -O0-LABEL: atomicrmw_and_i128_unaligned_release:
1963; -O0:    and x9, x8, x9
1964; -O0:    and x8, x8, x10
1965; -O0:    bl __atomic_compare_exchange
1966;
1967; -O1-LABEL: atomicrmw_and_i128_unaligned_release:
1968; -O1:    ldp x0, x1, [x0]
1969; -O1:    and x8, x1, x19
1970; -O1:    and x9, x0, x21
1971; -O1:    bl __atomic_compare_exchange
1972    %r = atomicrmw and ptr %ptr, i128 %value release, align 1
1973    ret i128 %r
1974}
1975
1976define dso_local i128 @atomicrmw_and_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
1977; -O0-LABEL: atomicrmw_and_i128_unaligned_acq_rel:
1978; -O0:    and x9, x8, x9
1979; -O0:    and x8, x8, x10
1980; -O0:    bl __atomic_compare_exchange
1981;
1982; -O1-LABEL: atomicrmw_and_i128_unaligned_acq_rel:
1983; -O1:    ldp x0, x1, [x0]
1984; -O1:    and x8, x1, x19
1985; -O1:    and x9, x0, x21
1986; -O1:    bl __atomic_compare_exchange
1987    %r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 1
1988    ret i128 %r
1989}
1990
1991define dso_local i128 @atomicrmw_and_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
1992; -O0-LABEL: atomicrmw_and_i128_unaligned_seq_cst:
1993; -O0:    and x9, x8, x9
1994; -O0:    and x8, x8, x10
1995; -O0:    bl __atomic_compare_exchange
1996;
1997; -O1-LABEL: atomicrmw_and_i128_unaligned_seq_cst:
1998; -O1:    ldp x0, x1, [x0]
1999; -O1:    and x8, x1, x19
2000; -O1:    and x9, x0, x21
2001; -O1:    bl __atomic_compare_exchange
2002    %r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 1
2003    ret i128 %r
2004}
2005
2006define dso_local i8 @atomicrmw_nand_i8_aligned_monotonic(ptr %ptr, i8 %value) {
2007; -O0-LABEL: atomicrmw_nand_i8_aligned_monotonic:
2008; -O0:    and w8, w10, w8
2009; -O0:    mvn w8, w8
2010; -O0:    casb w9, w8, [x11]
2011; -O0:    and w8, w9, #0xff
2012; -O0:    subs w8, w8, w10, uxtb
2013;
2014; -O1-LABEL: atomicrmw_nand_i8_aligned_monotonic:
2015; -O1:    and w10, w8, w1
2016; -O1:    mvn w10, w10
2017; -O1:    casb w9, w10, [x0]
2018; -O1:    cmp w9, w8, uxtb
2019    %r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1
2020    ret i8 %r
2021}
2022
2023define dso_local i8 @atomicrmw_nand_i8_aligned_acquire(ptr %ptr, i8 %value) {
2024; -O0-LABEL: atomicrmw_nand_i8_aligned_acquire:
2025; -O0:    and w8, w10, w8
2026; -O0:    mvn w8, w8
2027; -O0:    casab w9, w8, [x11]
2028; -O0:    and w8, w9, #0xff
2029; -O0:    subs w8, w8, w10, uxtb
2030;
2031; -O1-LABEL: atomicrmw_nand_i8_aligned_acquire:
2032; -O1:    and w10, w8, w1
2033; -O1:    mvn w10, w10
2034; -O1:    casab w9, w10, [x0]
2035; -O1:    cmp w9, w8, uxtb
2036    %r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1
2037    ret i8 %r
2038}
2039
2040define dso_local i8 @atomicrmw_nand_i8_aligned_release(ptr %ptr, i8 %value) {
2041; -O0-LABEL: atomicrmw_nand_i8_aligned_release:
2042; -O0:    and w8, w10, w8
2043; -O0:    mvn w8, w8
2044; -O0:    caslb w9, w8, [x11]
2045; -O0:    and w8, w9, #0xff
2046; -O0:    subs w8, w8, w10, uxtb
2047;
2048; -O1-LABEL: atomicrmw_nand_i8_aligned_release:
2049; -O1:    and w10, w8, w1
2050; -O1:    mvn w10, w10
2051; -O1:    caslb w9, w10, [x0]
2052; -O1:    cmp w9, w8, uxtb
2053    %r = atomicrmw nand ptr %ptr, i8 %value release, align 1
2054    ret i8 %r
2055}
2056
2057define dso_local i8 @atomicrmw_nand_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
2058; -O0-LABEL: atomicrmw_nand_i8_aligned_acq_rel:
2059; -O0:    and w8, w10, w8
2060; -O0:    mvn w8, w8
2061; -O0:    casalb w9, w8, [x11]
2062; -O0:    and w8, w9, #0xff
2063; -O0:    subs w8, w8, w10, uxtb
2064;
2065; -O1-LABEL: atomicrmw_nand_i8_aligned_acq_rel:
2066; -O1:    and w10, w8, w1
2067; -O1:    mvn w10, w10
2068; -O1:    casalb w9, w10, [x0]
2069; -O1:    cmp w9, w8, uxtb
2070    %r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1
2071    ret i8 %r
2072}
2073
2074define dso_local i8 @atomicrmw_nand_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
2075; -O0-LABEL: atomicrmw_nand_i8_aligned_seq_cst:
2076; -O0:    and w8, w10, w8
2077; -O0:    mvn w8, w8
2078; -O0:    casalb w9, w8, [x11]
2079; -O0:    and w8, w9, #0xff
2080; -O0:    subs w8, w8, w10, uxtb
2081;
2082; -O1-LABEL: atomicrmw_nand_i8_aligned_seq_cst:
2083; -O1:    and w10, w8, w1
2084; -O1:    mvn w10, w10
2085; -O1:    casalb w9, w10, [x0]
2086; -O1:    cmp w9, w8, uxtb
2087    %r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1
2088    ret i8 %r
2089}
2090
2091define dso_local i16 @atomicrmw_nand_i16_aligned_monotonic(ptr %ptr, i16 %value) {
2092; -O0-LABEL: atomicrmw_nand_i16_aligned_monotonic:
2093; -O0:    and w9, w8, w9
2094; -O0:    mvn w10, w9
2095; -O0:    cash w9, w10, [x11]
2096; -O0:    subs w8, w8, w9, uxth
2097;
2098; -O1-LABEL: atomicrmw_nand_i16_aligned_monotonic:
2099; -O1:    and w10, w8, w1
2100; -O1:    mvn w10, w10
2101; -O1:    cash w9, w10, [x0]
2102; -O1:    cmp w9, w8, uxth
2103    %r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 2
2104    ret i16 %r
2105}
2106
2107define dso_local i16 @atomicrmw_nand_i16_aligned_acquire(ptr %ptr, i16 %value) {
2108; -O0-LABEL: atomicrmw_nand_i16_aligned_acquire:
2109; -O0:    and w9, w8, w9
2110; -O0:    mvn w10, w9
2111; -O0:    casah w9, w10, [x11]
2112; -O0:    subs w8, w8, w9, uxth
2113;
2114; -O1-LABEL: atomicrmw_nand_i16_aligned_acquire:
2115; -O1:    and w10, w8, w1
2116; -O1:    mvn w10, w10
2117; -O1:    casah w9, w10, [x0]
2118; -O1:    cmp w9, w8, uxth
2119    %r = atomicrmw nand ptr %ptr, i16 %value acquire, align 2
2120    ret i16 %r
2121}
2122
2123define dso_local i16 @atomicrmw_nand_i16_aligned_release(ptr %ptr, i16 %value) {
2124; -O0-LABEL: atomicrmw_nand_i16_aligned_release:
2125; -O0:    and w9, w8, w9
2126; -O0:    mvn w10, w9
2127; -O0:    caslh w9, w10, [x11]
2128; -O0:    subs w8, w8, w9, uxth
2129;
2130; -O1-LABEL: atomicrmw_nand_i16_aligned_release:
2131; -O1:    and w10, w8, w1
2132; -O1:    mvn w10, w10
2133; -O1:    caslh w9, w10, [x0]
2134; -O1:    cmp w9, w8, uxth
2135    %r = atomicrmw nand ptr %ptr, i16 %value release, align 2
2136    ret i16 %r
2137}
2138
2139define dso_local i16 @atomicrmw_nand_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
2140; -O0-LABEL: atomicrmw_nand_i16_aligned_acq_rel:
2141; -O0:    and w9, w8, w9
2142; -O0:    mvn w10, w9
2143; -O0:    casalh w9, w10, [x11]
2144; -O0:    subs w8, w8, w9, uxth
2145;
2146; -O1-LABEL: atomicrmw_nand_i16_aligned_acq_rel:
2147; -O1:    and w10, w8, w1
2148; -O1:    mvn w10, w10
2149; -O1:    casalh w9, w10, [x0]
2150; -O1:    cmp w9, w8, uxth
2151    %r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 2
2152    ret i16 %r
2153}
2154
2155define dso_local i16 @atomicrmw_nand_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
2156; -O0-LABEL: atomicrmw_nand_i16_aligned_seq_cst:
2157; -O0:    and w9, w8, w9
2158; -O0:    mvn w10, w9
2159; -O0:    casalh w9, w10, [x11]
2160; -O0:    subs w8, w8, w9, uxth
2161;
2162; -O1-LABEL: atomicrmw_nand_i16_aligned_seq_cst:
2163; -O1:    and w10, w8, w1
2164; -O1:    mvn w10, w10
2165; -O1:    casalh w9, w10, [x0]
2166; -O1:    cmp w9, w8, uxth
2167    %r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 2
2168    ret i16 %r
2169}
2170
2171define dso_local i32 @atomicrmw_nand_i32_aligned_monotonic(ptr %ptr, i32 %value) {
2172; -O0-LABEL: atomicrmw_nand_i32_aligned_monotonic:
2173; -O0:    and w9, w8, w9
2174; -O0:    mvn w10, w9
2175; -O0:    cas w9, w10, [x11]
2176; -O0:    subs w8, w9, w8
2177;
2178; -O1-LABEL: atomicrmw_nand_i32_aligned_monotonic:
2179; -O1:    and w10, w8, w1
2180; -O1:    mvn w10, w10
2181; -O1:    cas w9, w10, [x0]
2182; -O1:    cmp w9, w8
2183    %r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 4
2184    ret i32 %r
2185}
2186
2187define dso_local i32 @atomicrmw_nand_i32_aligned_acquire(ptr %ptr, i32 %value) {
2188; -O0-LABEL: atomicrmw_nand_i32_aligned_acquire:
2189; -O0:    and w9, w8, w9
2190; -O0:    mvn w10, w9
2191; -O0:    casa w9, w10, [x11]
2192; -O0:    subs w8, w9, w8
2193;
2194; -O1-LABEL: atomicrmw_nand_i32_aligned_acquire:
2195; -O1:    and w10, w8, w1
2196; -O1:    mvn w10, w10
2197; -O1:    casa w9, w10, [x0]
2198; -O1:    cmp w9, w8
2199    %r = atomicrmw nand ptr %ptr, i32 %value acquire, align 4
2200    ret i32 %r
2201}
2202
2203define dso_local i32 @atomicrmw_nand_i32_aligned_release(ptr %ptr, i32 %value) {
2204; -O0-LABEL: atomicrmw_nand_i32_aligned_release:
2205; -O0:    and w9, w8, w9
2206; -O0:    mvn w10, w9
2207; -O0:    casl w9, w10, [x11]
2208; -O0:    subs w8, w9, w8
2209;
2210; -O1-LABEL: atomicrmw_nand_i32_aligned_release:
2211; -O1:    and w10, w8, w1
2212; -O1:    mvn w10, w10
2213; -O1:    casl w9, w10, [x0]
2214; -O1:    cmp w9, w8
2215    %r = atomicrmw nand ptr %ptr, i32 %value release, align 4
2216    ret i32 %r
2217}
2218
2219define dso_local i32 @atomicrmw_nand_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
2220; -O0-LABEL: atomicrmw_nand_i32_aligned_acq_rel:
2221; -O0:    and w9, w8, w9
2222; -O0:    mvn w10, w9
2223; -O0:    casal w9, w10, [x11]
2224; -O0:    subs w8, w9, w8
2225;
2226; -O1-LABEL: atomicrmw_nand_i32_aligned_acq_rel:
2227; -O1:    and w10, w8, w1
2228; -O1:    mvn w10, w10
2229; -O1:    casal w9, w10, [x0]
2230; -O1:    cmp w9, w8
2231    %r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 4
2232    ret i32 %r
2233}
2234
2235define dso_local i32 @atomicrmw_nand_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
2236; -O0-LABEL: atomicrmw_nand_i32_aligned_seq_cst:
2237; -O0:    and w9, w8, w9
2238; -O0:    mvn w10, w9
2239; -O0:    casal w9, w10, [x11]
2240; -O0:    subs w8, w9, w8
2241;
2242; -O1-LABEL: atomicrmw_nand_i32_aligned_seq_cst:
2243; -O1:    and w10, w8, w1
2244; -O1:    mvn w10, w10
2245; -O1:    casal w9, w10, [x0]
2246; -O1:    cmp w9, w8
2247    %r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 4
2248    ret i32 %r
2249}
2250
2251define dso_local i64 @atomicrmw_nand_i64_aligned_monotonic(ptr %ptr, i64 %value) {
2252; -O0-LABEL: atomicrmw_nand_i64_aligned_monotonic:
2253; -O0:    and x9, x8, x9
2254; -O0:    mvn x10, x9
2255; -O0:    cas x9, x10, [x11]
2256; -O0:    subs x8, x9, x8
2257;
2258; -O1-LABEL: atomicrmw_nand_i64_aligned_monotonic:
2259; -O1:    and x10, x8, x1
2260; -O1:    mvn x10, x10
2261; -O1:    cas x9, x10, [x0]
2262; -O1:    cmp x9, x8
2263    %r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 8
2264    ret i64 %r
2265}
2266
2267define dso_local i64 @atomicrmw_nand_i64_aligned_acquire(ptr %ptr, i64 %value) {
2268; -O0-LABEL: atomicrmw_nand_i64_aligned_acquire:
2269; -O0:    and x9, x8, x9
2270; -O0:    mvn x10, x9
2271; -O0:    casa x9, x10, [x11]
2272; -O0:    subs x8, x9, x8
2273;
2274; -O1-LABEL: atomicrmw_nand_i64_aligned_acquire:
2275; -O1:    and x10, x8, x1
2276; -O1:    mvn x10, x10
2277; -O1:    casa x9, x10, [x0]
2278; -O1:    cmp x9, x8
2279    %r = atomicrmw nand ptr %ptr, i64 %value acquire, align 8
2280    ret i64 %r
2281}
2282
2283define dso_local i64 @atomicrmw_nand_i64_aligned_release(ptr %ptr, i64 %value) {
2284; -O0-LABEL: atomicrmw_nand_i64_aligned_release:
2285; -O0:    and x9, x8, x9
2286; -O0:    mvn x10, x9
2287; -O0:    casl x9, x10, [x11]
2288; -O0:    subs x8, x9, x8
2289;
2290; -O1-LABEL: atomicrmw_nand_i64_aligned_release:
2291; -O1:    and x10, x8, x1
2292; -O1:    mvn x10, x10
2293; -O1:    casl x9, x10, [x0]
2294; -O1:    cmp x9, x8
2295    %r = atomicrmw nand ptr %ptr, i64 %value release, align 8
2296    ret i64 %r
2297}
2298
2299define dso_local i64 @atomicrmw_nand_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
2300; -O0-LABEL: atomicrmw_nand_i64_aligned_acq_rel:
2301; -O0:    and x9, x8, x9
2302; -O0:    mvn x10, x9
2303; -O0:    casal x9, x10, [x11]
2304; -O0:    subs x8, x9, x8
2305;
2306; -O1-LABEL: atomicrmw_nand_i64_aligned_acq_rel:
2307; -O1:    and x10, x8, x1
2308; -O1:    mvn x10, x10
2309; -O1:    casal x9, x10, [x0]
2310; -O1:    cmp x9, x8
2311    %r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 8
2312    ret i64 %r
2313}
2314
2315define dso_local i64 @atomicrmw_nand_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
2316; -O0-LABEL: atomicrmw_nand_i64_aligned_seq_cst:
2317; -O0:    and x9, x8, x9
2318; -O0:    mvn x10, x9
2319; -O0:    casal x9, x10, [x11]
2320; -O0:    subs x8, x9, x8
2321;
2322; -O1-LABEL: atomicrmw_nand_i64_aligned_seq_cst:
2323; -O1:    and x10, x8, x1
2324; -O1:    mvn x10, x10
2325; -O1:    casal x9, x10, [x0]
2326; -O1:    cmp x9, x8
2327    %r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 8
2328    ret i64 %r
2329}
2330
2331define dso_local i128 @atomicrmw_nand_i128_aligned_monotonic(ptr %ptr, i128 %value) {
2332; -O0-LABEL: atomicrmw_nand_i128_aligned_monotonic:
2333; -O0:    and x10, x9, x10
2334; -O0:    and x9, x9, x11
2335; -O0:    mvn x2, x10
2336; -O0:    mvn x9, x9
2337; -O0:    casp x0, x1, x2, x3, [x8]
2338; -O0:    eor x8, x10, x8
2339; -O0:    eor x11, x9, x11
2340; -O0:    orr x8, x8, x11
2341; -O0:    subs x8, x8, #0
2342;
2343; -O1-LABEL: atomicrmw_nand_i128_aligned_monotonic:
2344; -O1:    ldp x4, x5, [x0]
2345; -O1:    and x8, x4, x2
2346; -O1:    and x9, x7, x3
2347; -O1:    mvn x10, x8
2348; -O1:    mvn x11, x9
2349; -O1:    casp x4, x5, x10, x11, [x0]
2350; -O1:    cmp x5, x7
2351; -O1:    ccmp x4, x6, #0, eq
2352    %r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 16
2353    ret i128 %r
2354}
2355
2356define dso_local i128 @atomicrmw_nand_i128_aligned_acquire(ptr %ptr, i128 %value) {
2357; -O0-LABEL: atomicrmw_nand_i128_aligned_acquire:
2358; -O0:    and x10, x9, x10
2359; -O0:    and x9, x9, x11
2360; -O0:    mvn x2, x10
2361; -O0:    mvn x9, x9
2362; -O0:    caspa x0, x1, x2, x3, [x8]
2363; -O0:    eor x8, x10, x8
2364; -O0:    eor x11, x9, x11
2365; -O0:    orr x8, x8, x11
2366; -O0:    subs x8, x8, #0
2367;
2368; -O1-LABEL: atomicrmw_nand_i128_aligned_acquire:
2369; -O1:    ldp x4, x5, [x0]
2370; -O1:    and x8, x4, x2
2371; -O1:    and x9, x7, x3
2372; -O1:    mvn x10, x8
2373; -O1:    mvn x11, x9
2374; -O1:    caspa x4, x5, x10, x11, [x0]
2375; -O1:    cmp x5, x7
2376; -O1:    ccmp x4, x6, #0, eq
2377    %r = atomicrmw nand ptr %ptr, i128 %value acquire, align 16
2378    ret i128 %r
2379}
2380
2381define dso_local i128 @atomicrmw_nand_i128_aligned_release(ptr %ptr, i128 %value) {
2382; -O0-LABEL: atomicrmw_nand_i128_aligned_release:
2383; -O0:    and x10, x9, x10
2384; -O0:    and x9, x9, x11
2385; -O0:    mvn x2, x10
2386; -O0:    mvn x9, x9
2387; -O0:    caspl x0, x1, x2, x3, [x8]
2388; -O0:    eor x8, x10, x8
2389; -O0:    eor x11, x9, x11
2390; -O0:    orr x8, x8, x11
2391; -O0:    subs x8, x8, #0
2392;
2393; -O1-LABEL: atomicrmw_nand_i128_aligned_release:
2394; -O1:    ldp x4, x5, [x0]
2395; -O1:    and x8, x4, x2
2396; -O1:    and x9, x7, x3
2397; -O1:    mvn x10, x8
2398; -O1:    mvn x11, x9
2399; -O1:    caspl x4, x5, x10, x11, [x0]
2400; -O1:    cmp x5, x7
2401; -O1:    ccmp x4, x6, #0, eq
2402    %r = atomicrmw nand ptr %ptr, i128 %value release, align 16
2403    ret i128 %r
2404}
2405
2406define dso_local i128 @atomicrmw_nand_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
2407; -O0-LABEL: atomicrmw_nand_i128_aligned_acq_rel:
2408; -O0:    and x10, x9, x10
2409; -O0:    and x9, x9, x11
2410; -O0:    mvn x2, x10
2411; -O0:    mvn x9, x9
2412; -O0:    caspal x0, x1, x2, x3, [x8]
2413; -O0:    eor x8, x10, x8
2414; -O0:    eor x11, x9, x11
2415; -O0:    orr x8, x8, x11
2416; -O0:    subs x8, x8, #0
2417;
2418; -O1-LABEL: atomicrmw_nand_i128_aligned_acq_rel:
2419; -O1:    ldp x4, x5, [x0]
2420; -O1:    and x8, x4, x2
2421; -O1:    and x9, x7, x3
2422; -O1:    mvn x10, x8
2423; -O1:    mvn x11, x9
2424; -O1:    caspal x4, x5, x10, x11, [x0]
2425; -O1:    cmp x5, x7
2426; -O1:    ccmp x4, x6, #0, eq
2427    %r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 16
2428    ret i128 %r
2429}
2430
2431define dso_local i128 @atomicrmw_nand_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
2432; -O0-LABEL: atomicrmw_nand_i128_aligned_seq_cst:
2433; -O0:    and x10, x9, x10
2434; -O0:    and x9, x9, x11
2435; -O0:    mvn x2, x10
2436; -O0:    mvn x9, x9
2437; -O0:    caspal x0, x1, x2, x3, [x8]
2438; -O0:    eor x8, x10, x8
2439; -O0:    eor x11, x9, x11
2440; -O0:    orr x8, x8, x11
2441; -O0:    subs x8, x8, #0
2442;
2443; -O1-LABEL: atomicrmw_nand_i128_aligned_seq_cst:
2444; -O1:    ldp x4, x5, [x0]
2445; -O1:    and x8, x4, x2
2446; -O1:    and x9, x7, x3
2447; -O1:    mvn x10, x8
2448; -O1:    mvn x11, x9
2449; -O1:    caspal x4, x5, x10, x11, [x0]
2450; -O1:    cmp x5, x7
2451; -O1:    ccmp x4, x6, #0, eq
2452    %r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 16
2453    ret i128 %r
2454}
2455
2456define dso_local i8 @atomicrmw_nand_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
2457; -O0-LABEL: atomicrmw_nand_i8_unaligned_monotonic:
2458; -O0:    and w8, w10, w8
2459; -O0:    mvn w8, w8
2460; -O0:    casb w9, w8, [x11]
2461; -O0:    and w8, w9, #0xff
2462; -O0:    subs w8, w8, w10, uxtb
2463;
2464; -O1-LABEL: atomicrmw_nand_i8_unaligned_monotonic:
2465; -O1:    and w10, w8, w1
2466; -O1:    mvn w10, w10
2467; -O1:    casb w9, w10, [x0]
2468; -O1:    cmp w9, w8, uxtb
2469    %r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1
2470    ret i8 %r
2471}
2472
2473define dso_local i8 @atomicrmw_nand_i8_unaligned_acquire(ptr %ptr, i8 %value) {
2474; -O0-LABEL: atomicrmw_nand_i8_unaligned_acquire:
2475; -O0:    and w8, w10, w8
2476; -O0:    mvn w8, w8
2477; -O0:    casab w9, w8, [x11]
2478; -O0:    and w8, w9, #0xff
2479; -O0:    subs w8, w8, w10, uxtb
2480;
2481; -O1-LABEL: atomicrmw_nand_i8_unaligned_acquire:
2482; -O1:    and w10, w8, w1
2483; -O1:    mvn w10, w10
2484; -O1:    casab w9, w10, [x0]
2485; -O1:    cmp w9, w8, uxtb
2486    %r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1
2487    ret i8 %r
2488}
2489
2490define dso_local i8 @atomicrmw_nand_i8_unaligned_release(ptr %ptr, i8 %value) {
2491; -O0-LABEL: atomicrmw_nand_i8_unaligned_release:
2492; -O0:    and w8, w10, w8
2493; -O0:    mvn w8, w8
2494; -O0:    caslb w9, w8, [x11]
2495; -O0:    and w8, w9, #0xff
2496; -O0:    subs w8, w8, w10, uxtb
2497;
2498; -O1-LABEL: atomicrmw_nand_i8_unaligned_release:
2499; -O1:    and w10, w8, w1
2500; -O1:    mvn w10, w10
2501; -O1:    caslb w9, w10, [x0]
2502; -O1:    cmp w9, w8, uxtb
2503    %r = atomicrmw nand ptr %ptr, i8 %value release, align 1
2504    ret i8 %r
2505}
2506
2507define dso_local i8 @atomicrmw_nand_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
2508; -O0-LABEL: atomicrmw_nand_i8_unaligned_acq_rel:
2509; -O0:    and w8, w10, w8
2510; -O0:    mvn w8, w8
2511; -O0:    casalb w9, w8, [x11]
2512; -O0:    and w8, w9, #0xff
2513; -O0:    subs w8, w8, w10, uxtb
2514;
2515; -O1-LABEL: atomicrmw_nand_i8_unaligned_acq_rel:
2516; -O1:    and w10, w8, w1
2517; -O1:    mvn w10, w10
2518; -O1:    casalb w9, w10, [x0]
2519; -O1:    cmp w9, w8, uxtb
2520    %r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1
2521    ret i8 %r
2522}
2523
2524define dso_local i8 @atomicrmw_nand_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
2525; -O0-LABEL: atomicrmw_nand_i8_unaligned_seq_cst:
2526; -O0:    and w8, w10, w8
2527; -O0:    mvn w8, w8
2528; -O0:    casalb w9, w8, [x11]
2529; -O0:    and w8, w9, #0xff
2530; -O0:    subs w8, w8, w10, uxtb
2531;
2532; -O1-LABEL: atomicrmw_nand_i8_unaligned_seq_cst:
2533; -O1:    and w10, w8, w1
2534; -O1:    mvn w10, w10
2535; -O1:    casalb w9, w10, [x0]
2536; -O1:    cmp w9, w8, uxtb
2537    %r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1
2538    ret i8 %r
2539}
2540
2541define dso_local i16 @atomicrmw_nand_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
2542; -O0-LABEL: atomicrmw_nand_i16_unaligned_monotonic:
2543; -O0:    and w8, w9, w8
2544; -O0:    mvn w8, w8
2545; -O0:    bl __atomic_compare_exchange
2546;
2547; -O1-LABEL: atomicrmw_nand_i16_unaligned_monotonic:
2548; -O1:    and w8, w0, w20
2549; -O1:    mvn w8, w8
2550; -O1:    bl __atomic_compare_exchange
2551    %r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 1
2552    ret i16 %r
2553}
2554
2555define dso_local i16 @atomicrmw_nand_i16_unaligned_acquire(ptr %ptr, i16 %value) {
2556; -O0-LABEL: atomicrmw_nand_i16_unaligned_acquire:
2557; -O0:    and w8, w9, w8
2558; -O0:    mvn w8, w8
2559; -O0:    bl __atomic_compare_exchange
2560;
2561; -O1-LABEL: atomicrmw_nand_i16_unaligned_acquire:
2562; -O1:    and w8, w0, w20
2563; -O1:    mvn w8, w8
2564; -O1:    bl __atomic_compare_exchange
2565    %r = atomicrmw nand ptr %ptr, i16 %value acquire, align 1
2566    ret i16 %r
2567}
2568
2569define dso_local i16 @atomicrmw_nand_i16_unaligned_release(ptr %ptr, i16 %value) {
2570; -O0-LABEL: atomicrmw_nand_i16_unaligned_release:
2571; -O0:    and w8, w9, w8
2572; -O0:    mvn w8, w8
2573; -O0:    bl __atomic_compare_exchange
2574;
2575; -O1-LABEL: atomicrmw_nand_i16_unaligned_release:
2576; -O1:    and w8, w0, w20
2577; -O1:    mvn w8, w8
2578; -O1:    bl __atomic_compare_exchange
2579    %r = atomicrmw nand ptr %ptr, i16 %value release, align 1
2580    ret i16 %r
2581}
2582
2583define dso_local i16 @atomicrmw_nand_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
2584; -O0-LABEL: atomicrmw_nand_i16_unaligned_acq_rel:
2585; -O0:    and w8, w9, w8
2586; -O0:    mvn w8, w8
2587; -O0:    bl __atomic_compare_exchange
2588;
2589; -O1-LABEL: atomicrmw_nand_i16_unaligned_acq_rel:
2590; -O1:    and w8, w0, w20
2591; -O1:    mvn w8, w8
2592; -O1:    bl __atomic_compare_exchange
2593    %r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 1
2594    ret i16 %r
2595}
2596
2597define dso_local i16 @atomicrmw_nand_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
2598; -O0-LABEL: atomicrmw_nand_i16_unaligned_seq_cst:
2599; -O0:    and w8, w9, w8
2600; -O0:    mvn w8, w8
2601; -O0:    bl __atomic_compare_exchange
2602;
2603; -O1-LABEL: atomicrmw_nand_i16_unaligned_seq_cst:
2604; -O1:    and w8, w0, w20
2605; -O1:    mvn w8, w8
2606; -O1:    bl __atomic_compare_exchange
2607    %r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 1
2608    ret i16 %r
2609}
2610
2611define dso_local i32 @atomicrmw_nand_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
2612; -O0-LABEL: atomicrmw_nand_i32_unaligned_monotonic:
2613; -O0:    and w8, w9, w8
2614; -O0:    mvn w8, w8
2615; -O0:    bl __atomic_compare_exchange
2616;
2617; -O1-LABEL: atomicrmw_nand_i32_unaligned_monotonic:
2618; -O1:    and w8, w0, w20
2619; -O1:    mvn w8, w8
2620; -O1:    bl __atomic_compare_exchange
2621    %r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 1
2622    ret i32 %r
2623}
2624
2625define dso_local i32 @atomicrmw_nand_i32_unaligned_acquire(ptr %ptr, i32 %value) {
2626; -O0-LABEL: atomicrmw_nand_i32_unaligned_acquire:
2627; -O0:    and w8, w9, w8
2628; -O0:    mvn w8, w8
2629; -O0:    bl __atomic_compare_exchange
2630;
2631; -O1-LABEL: atomicrmw_nand_i32_unaligned_acquire:
2632; -O1:    and w8, w0, w20
2633; -O1:    mvn w8, w8
2634; -O1:    bl __atomic_compare_exchange
2635    %r = atomicrmw nand ptr %ptr, i32 %value acquire, align 1
2636    ret i32 %r
2637}
2638
2639define dso_local i32 @atomicrmw_nand_i32_unaligned_release(ptr %ptr, i32 %value) {
2640; -O0-LABEL: atomicrmw_nand_i32_unaligned_release:
2641; -O0:    and w8, w9, w8
2642; -O0:    mvn w8, w8
2643; -O0:    bl __atomic_compare_exchange
2644;
2645; -O1-LABEL: atomicrmw_nand_i32_unaligned_release:
2646; -O1:    and w8, w0, w20
2647; -O1:    mvn w8, w8
2648; -O1:    bl __atomic_compare_exchange
2649    %r = atomicrmw nand ptr %ptr, i32 %value release, align 1
2650    ret i32 %r
2651}
2652
2653define dso_local i32 @atomicrmw_nand_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
2654; -O0-LABEL: atomicrmw_nand_i32_unaligned_acq_rel:
2655; -O0:    and w8, w9, w8
2656; -O0:    mvn w8, w8
2657; -O0:    bl __atomic_compare_exchange
2658;
2659; -O1-LABEL: atomicrmw_nand_i32_unaligned_acq_rel:
2660; -O1:    and w8, w0, w20
2661; -O1:    mvn w8, w8
2662; -O1:    bl __atomic_compare_exchange
2663    %r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 1
2664    ret i32 %r
2665}
2666
2667define dso_local i32 @atomicrmw_nand_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
2668; -O0-LABEL: atomicrmw_nand_i32_unaligned_seq_cst:
2669; -O0:    and w8, w9, w8
2670; -O0:    mvn w8, w8
2671; -O0:    bl __atomic_compare_exchange
2672;
2673; -O1-LABEL: atomicrmw_nand_i32_unaligned_seq_cst:
2674; -O1:    and w8, w0, w20
2675; -O1:    mvn w8, w8
2676; -O1:    bl __atomic_compare_exchange
2677    %r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 1
2678    ret i32 %r
2679}
2680
2681define dso_local i64 @atomicrmw_nand_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
2682; -O0-LABEL: atomicrmw_nand_i64_unaligned_monotonic:
2683; -O0:    and x8, x9, x8
2684; -O0:    mvn x8, x8
2685; -O0:    bl __atomic_compare_exchange
2686;
2687; -O1-LABEL: atomicrmw_nand_i64_unaligned_monotonic:
2688; -O1:    and x8, x0, x20
2689; -O1:    mvn x8, x8
2690; -O1:    bl __atomic_compare_exchange
2691    %r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 1
2692    ret i64 %r
2693}
2694
2695define dso_local i64 @atomicrmw_nand_i64_unaligned_acquire(ptr %ptr, i64 %value) {
2696; -O0-LABEL: atomicrmw_nand_i64_unaligned_acquire:
2697; -O0:    and x8, x9, x8
2698; -O0:    mvn x8, x8
2699; -O0:    bl __atomic_compare_exchange
2700;
2701; -O1-LABEL: atomicrmw_nand_i64_unaligned_acquire:
2702; -O1:    and x8, x0, x20
2703; -O1:    mvn x8, x8
2704; -O1:    bl __atomic_compare_exchange
2705    %r = atomicrmw nand ptr %ptr, i64 %value acquire, align 1
2706    ret i64 %r
2707}
2708
2709define dso_local i64 @atomicrmw_nand_i64_unaligned_release(ptr %ptr, i64 %value) {
2710; -O0-LABEL: atomicrmw_nand_i64_unaligned_release:
2711; -O0:    and x8, x9, x8
2712; -O0:    mvn x8, x8
2713; -O0:    bl __atomic_compare_exchange
2714;
2715; -O1-LABEL: atomicrmw_nand_i64_unaligned_release:
2716; -O1:    and x8, x0, x20
2717; -O1:    mvn x8, x8
2718; -O1:    bl __atomic_compare_exchange
2719    %r = atomicrmw nand ptr %ptr, i64 %value release, align 1
2720    ret i64 %r
2721}
2722
2723define dso_local i64 @atomicrmw_nand_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
2724; -O0-LABEL: atomicrmw_nand_i64_unaligned_acq_rel:
2725; -O0:    and x8, x9, x8
2726; -O0:    mvn x8, x8
2727; -O0:    bl __atomic_compare_exchange
2728;
2729; -O1-LABEL: atomicrmw_nand_i64_unaligned_acq_rel:
2730; -O1:    and x8, x0, x20
2731; -O1:    mvn x8, x8
2732; -O1:    bl __atomic_compare_exchange
2733    %r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 1
2734    ret i64 %r
2735}
2736
2737define dso_local i64 @atomicrmw_nand_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
2738; -O0-LABEL: atomicrmw_nand_i64_unaligned_seq_cst:
2739; -O0:    and x8, x9, x8
2740; -O0:    mvn x8, x8
2741; -O0:    bl __atomic_compare_exchange
2742;
2743; -O1-LABEL: atomicrmw_nand_i64_unaligned_seq_cst:
2744; -O1:    and x8, x0, x20
2745; -O1:    mvn x8, x8
2746; -O1:    bl __atomic_compare_exchange
2747    %r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 1
2748    ret i64 %r
2749}
2750
2751define dso_local i128 @atomicrmw_nand_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
2752; -O0-LABEL: atomicrmw_nand_i128_unaligned_monotonic:
2753; -O0:    and x9, x8, x9
2754; -O0:    and x8, x8, x10
2755; -O0:    mvn x9, x9
2756; -O0:    mvn x8, x8
2757; -O0:    bl __atomic_compare_exchange
2758;
2759; -O1-LABEL: atomicrmw_nand_i128_unaligned_monotonic:
2760; -O1:    ldp x0, x1, [x0]
2761; -O1:    and x8, x1, x19
2762; -O1:    and x9, x0, x21
2763; -O1:    mvn x8, x8
2764; -O1:    mvn x9, x9
2765; -O1:    bl __atomic_compare_exchange
2766    %r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 1
2767    ret i128 %r
2768}
2769
2770define dso_local i128 @atomicrmw_nand_i128_unaligned_acquire(ptr %ptr, i128 %value) {
2771; -O0-LABEL: atomicrmw_nand_i128_unaligned_acquire:
2772; -O0:    and x9, x8, x9
2773; -O0:    and x8, x8, x10
2774; -O0:    mvn x9, x9
2775; -O0:    mvn x8, x8
2776; -O0:    bl __atomic_compare_exchange
2777;
2778; -O1-LABEL: atomicrmw_nand_i128_unaligned_acquire:
2779; -O1:    ldp x0, x1, [x0]
2780; -O1:    and x8, x1, x19
2781; -O1:    and x9, x0, x21
2782; -O1:    mvn x8, x8
2783; -O1:    mvn x9, x9
2784; -O1:    bl __atomic_compare_exchange
2785    %r = atomicrmw nand ptr %ptr, i128 %value acquire, align 1
2786    ret i128 %r
2787}
2788
2789define dso_local i128 @atomicrmw_nand_i128_unaligned_release(ptr %ptr, i128 %value) {
2790; -O0-LABEL: atomicrmw_nand_i128_unaligned_release:
2791; -O0:    and x9, x8, x9
2792; -O0:    and x8, x8, x10
2793; -O0:    mvn x9, x9
2794; -O0:    mvn x8, x8
2795; -O0:    bl __atomic_compare_exchange
2796;
2797; -O1-LABEL: atomicrmw_nand_i128_unaligned_release:
2798; -O1:    ldp x0, x1, [x0]
2799; -O1:    and x8, x1, x19
2800; -O1:    and x9, x0, x21
2801; -O1:    mvn x8, x8
2802; -O1:    mvn x9, x9
2803; -O1:    bl __atomic_compare_exchange
2804    %r = atomicrmw nand ptr %ptr, i128 %value release, align 1
2805    ret i128 %r
2806}
2807
2808define dso_local i128 @atomicrmw_nand_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
2809; -O0-LABEL: atomicrmw_nand_i128_unaligned_acq_rel:
2810; -O0:    and x9, x8, x9
2811; -O0:    and x8, x8, x10
2812; -O0:    mvn x9, x9
2813; -O0:    mvn x8, x8
2814; -O0:    bl __atomic_compare_exchange
2815;
2816; -O1-LABEL: atomicrmw_nand_i128_unaligned_acq_rel:
2817; -O1:    ldp x0, x1, [x0]
2818; -O1:    and x8, x1, x19
2819; -O1:    and x9, x0, x21
2820; -O1:    mvn x8, x8
2821; -O1:    mvn x9, x9
2822; -O1:    bl __atomic_compare_exchange
2823    %r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 1
2824    ret i128 %r
2825}
2826
2827define dso_local i128 @atomicrmw_nand_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
2828; -O0-LABEL: atomicrmw_nand_i128_unaligned_seq_cst:
2829; -O0:    and x9, x8, x9
2830; -O0:    and x8, x8, x10
2831; -O0:    mvn x9, x9
2832; -O0:    mvn x8, x8
2833; -O0:    bl __atomic_compare_exchange
2834;
2835; -O1-LABEL: atomicrmw_nand_i128_unaligned_seq_cst:
2836; -O1:    ldp x0, x1, [x0]
2837; -O1:    and x8, x1, x19
2838; -O1:    and x9, x0, x21
2839; -O1:    mvn x8, x8
2840; -O1:    mvn x9, x9
2841; -O1:    bl __atomic_compare_exchange
2842    %r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 1
2843    ret i128 %r
2844}
2845
2846define dso_local i8 @atomicrmw_or_i8_aligned_monotonic(ptr %ptr, i8 %value) {
2847; CHECK-LABEL: atomicrmw_or_i8_aligned_monotonic:
2848; CHECK:    ldsetb w1, w0, [x0]
2849    %r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1
2850    ret i8 %r
2851}
2852
2853define dso_local i8 @atomicrmw_or_i8_aligned_acquire(ptr %ptr, i8 %value) {
2854; CHECK-LABEL: atomicrmw_or_i8_aligned_acquire:
2855; CHECK:    ldsetab w1, w0, [x0]
2856    %r = atomicrmw or ptr %ptr, i8 %value acquire, align 1
2857    ret i8 %r
2858}
2859
2860define dso_local i8 @atomicrmw_or_i8_aligned_release(ptr %ptr, i8 %value) {
2861; CHECK-LABEL: atomicrmw_or_i8_aligned_release:
2862; CHECK:    ldsetlb w1, w0, [x0]
2863    %r = atomicrmw or ptr %ptr, i8 %value release, align 1
2864    ret i8 %r
2865}
2866
2867define dso_local i8 @atomicrmw_or_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
2868; CHECK-LABEL: atomicrmw_or_i8_aligned_acq_rel:
2869; CHECK:    ldsetalb w1, w0, [x0]
2870    %r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1
2871    ret i8 %r
2872}
2873
2874define dso_local i8 @atomicrmw_or_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
2875; CHECK-LABEL: atomicrmw_or_i8_aligned_seq_cst:
2876; CHECK:    ldsetalb w1, w0, [x0]
2877    %r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1
2878    ret i8 %r
2879}
2880
2881define dso_local i16 @atomicrmw_or_i16_aligned_monotonic(ptr %ptr, i16 %value) {
2882; CHECK-LABEL: atomicrmw_or_i16_aligned_monotonic:
2883; CHECK:    ldseth w1, w0, [x0]
2884    %r = atomicrmw or ptr %ptr, i16 %value monotonic, align 2
2885    ret i16 %r
2886}
2887
2888define dso_local i16 @atomicrmw_or_i16_aligned_acquire(ptr %ptr, i16 %value) {
2889; CHECK-LABEL: atomicrmw_or_i16_aligned_acquire:
2890; CHECK:    ldsetah w1, w0, [x0]
2891    %r = atomicrmw or ptr %ptr, i16 %value acquire, align 2
2892    ret i16 %r
2893}
2894
2895define dso_local i16 @atomicrmw_or_i16_aligned_release(ptr %ptr, i16 %value) {
2896; CHECK-LABEL: atomicrmw_or_i16_aligned_release:
2897; CHECK:    ldsetlh w1, w0, [x0]
2898    %r = atomicrmw or ptr %ptr, i16 %value release, align 2
2899    ret i16 %r
2900}
2901
2902define dso_local i16 @atomicrmw_or_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
2903; CHECK-LABEL: atomicrmw_or_i16_aligned_acq_rel:
2904; CHECK:    ldsetalh w1, w0, [x0]
2905    %r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 2
2906    ret i16 %r
2907}
2908
2909define dso_local i16 @atomicrmw_or_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
2910; CHECK-LABEL: atomicrmw_or_i16_aligned_seq_cst:
2911; CHECK:    ldsetalh w1, w0, [x0]
2912    %r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 2
2913    ret i16 %r
2914}
2915
2916define dso_local i32 @atomicrmw_or_i32_aligned_monotonic(ptr %ptr, i32 %value) {
2917; CHECK-LABEL: atomicrmw_or_i32_aligned_monotonic:
2918; CHECK:    ldset w1, w0, [x0]
2919    %r = atomicrmw or ptr %ptr, i32 %value monotonic, align 4
2920    ret i32 %r
2921}
2922
2923define dso_local i32 @atomicrmw_or_i32_aligned_acquire(ptr %ptr, i32 %value) {
2924; CHECK-LABEL: atomicrmw_or_i32_aligned_acquire:
2925; CHECK:    ldseta w1, w0, [x0]
2926    %r = atomicrmw or ptr %ptr, i32 %value acquire, align 4
2927    ret i32 %r
2928}
2929
2930define dso_local i32 @atomicrmw_or_i32_aligned_release(ptr %ptr, i32 %value) {
2931; CHECK-LABEL: atomicrmw_or_i32_aligned_release:
2932; CHECK:    ldsetl w1, w0, [x0]
2933    %r = atomicrmw or ptr %ptr, i32 %value release, align 4
2934    ret i32 %r
2935}
2936
2937define dso_local i32 @atomicrmw_or_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
2938; CHECK-LABEL: atomicrmw_or_i32_aligned_acq_rel:
2939; CHECK:    ldsetal w1, w0, [x0]
2940    %r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 4
2941    ret i32 %r
2942}
2943
2944define dso_local i32 @atomicrmw_or_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
2945; CHECK-LABEL: atomicrmw_or_i32_aligned_seq_cst:
2946; CHECK:    ldsetal w1, w0, [x0]
2947    %r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 4
2948    ret i32 %r
2949}
2950
2951define dso_local i64 @atomicrmw_or_i64_aligned_monotonic(ptr %ptr, i64 %value) {
2952; CHECK-LABEL: atomicrmw_or_i64_aligned_monotonic:
2953; CHECK:    ldset x1, x0, [x0]
2954    %r = atomicrmw or ptr %ptr, i64 %value monotonic, align 8
2955    ret i64 %r
2956}
2957
2958define dso_local i64 @atomicrmw_or_i64_aligned_acquire(ptr %ptr, i64 %value) {
2959; CHECK-LABEL: atomicrmw_or_i64_aligned_acquire:
2960; CHECK:    ldseta x1, x0, [x0]
2961    %r = atomicrmw or ptr %ptr, i64 %value acquire, align 8
2962    ret i64 %r
2963}
2964
2965define dso_local i64 @atomicrmw_or_i64_aligned_release(ptr %ptr, i64 %value) {
2966; CHECK-LABEL: atomicrmw_or_i64_aligned_release:
2967; CHECK:    ldsetl x1, x0, [x0]
2968    %r = atomicrmw or ptr %ptr, i64 %value release, align 8
2969    ret i64 %r
2970}
2971
2972define dso_local i64 @atomicrmw_or_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
2973; CHECK-LABEL: atomicrmw_or_i64_aligned_acq_rel:
2974; CHECK:    ldsetal x1, x0, [x0]
2975    %r = atomicrmw or ptr %ptr, i64 %value acq_rel, align 8
2976    ret i64 %r
2977}
2978
2979define dso_local i64 @atomicrmw_or_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
2980; CHECK-LABEL: atomicrmw_or_i64_aligned_seq_cst:
2981; CHECK:    ldsetal x1, x0, [x0]
2982    %r = atomicrmw or ptr %ptr, i64 %value seq_cst, align 8
2983    ret i64 %r
2984}
2985
2986define dso_local i128 @atomicrmw_or_i128_aligned_monotonic(ptr %ptr, i128 %value) {
2987; -O0-LABEL: atomicrmw_or_i128_aligned_monotonic:
2988; -O0:    orr x2, x9, x11
2989; -O0:    orr x9, x9, x10
2990; -O0:    casp x0, x1, x2, x3, [x8]
2991; -O0:    eor x8, x10, x8
2992; -O0:    eor x11, x9, x11
2993; -O0:    orr x8, x8, x11
2994; -O0:    subs x8, x8, #0
2995;
2996; -O1-LABEL: atomicrmw_or_i128_aligned_monotonic:
2997; -O1:    ldp x4, x5, [x0]
2998; -O1:    orr x8, x4, x2
2999; -O1:    orr x9, x7, x3
3000; -O1:    casp x4, x5, x8, x9, [x0]
3001; -O1:    cmp x5, x7
3002; -O1:    ccmp x4, x6, #0, eq
3003    %r = atomicrmw or ptr %ptr, i128 %value monotonic, align 16
3004    ret i128 %r
3005}
3006
3007define dso_local i128 @atomicrmw_or_i128_aligned_acquire(ptr %ptr, i128 %value) {
3008; -O0-LABEL: atomicrmw_or_i128_aligned_acquire:
3009; -O0:    orr x2, x9, x11
3010; -O0:    orr x9, x9, x10
3011; -O0:    caspa x0, x1, x2, x3, [x8]
3012; -O0:    eor x8, x10, x8
3013; -O0:    eor x11, x9, x11
3014; -O0:    orr x8, x8, x11
3015; -O0:    subs x8, x8, #0
3016;
3017; -O1-LABEL: atomicrmw_or_i128_aligned_acquire:
3018; -O1:    ldp x4, x5, [x0]
3019; -O1:    orr x8, x4, x2
3020; -O1:    orr x9, x7, x3
3021; -O1:    caspa x4, x5, x8, x9, [x0]
3022; -O1:    cmp x5, x7
3023; -O1:    ccmp x4, x6, #0, eq
3024    %r = atomicrmw or ptr %ptr, i128 %value acquire, align 16
3025    ret i128 %r
3026}
3027
3028define dso_local i128 @atomicrmw_or_i128_aligned_release(ptr %ptr, i128 %value) {
3029; -O0-LABEL: atomicrmw_or_i128_aligned_release:
3030; -O0:    orr x2, x9, x11
3031; -O0:    orr x9, x9, x10
3032; -O0:    caspl x0, x1, x2, x3, [x8]
3033; -O0:    eor x8, x10, x8
3034; -O0:    eor x11, x9, x11
3035; -O0:    orr x8, x8, x11
3036; -O0:    subs x8, x8, #0
3037;
3038; -O1-LABEL: atomicrmw_or_i128_aligned_release:
3039; -O1:    ldp x4, x5, [x0]
3040; -O1:    orr x8, x4, x2
3041; -O1:    orr x9, x7, x3
3042; -O1:    caspl x4, x5, x8, x9, [x0]
3043; -O1:    cmp x5, x7
3044; -O1:    ccmp x4, x6, #0, eq
3045    %r = atomicrmw or ptr %ptr, i128 %value release, align 16
3046    ret i128 %r
3047}
3048
3049define dso_local i128 @atomicrmw_or_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
3050; -O0-LABEL: atomicrmw_or_i128_aligned_acq_rel:
3051; -O0:    orr x2, x9, x11
3052; -O0:    orr x9, x9, x10
3053; -O0:    caspal x0, x1, x2, x3, [x8]
3054; -O0:    eor x8, x10, x8
3055; -O0:    eor x11, x9, x11
3056; -O0:    orr x8, x8, x11
3057; -O0:    subs x8, x8, #0
3058;
3059; -O1-LABEL: atomicrmw_or_i128_aligned_acq_rel:
3060; -O1:    ldp x4, x5, [x0]
3061; -O1:    orr x8, x4, x2
3062; -O1:    orr x9, x7, x3
3063; -O1:    caspal x4, x5, x8, x9, [x0]
3064; -O1:    cmp x5, x7
3065; -O1:    ccmp x4, x6, #0, eq
3066    %r = atomicrmw or ptr %ptr, i128 %value acq_rel, align 16
3067    ret i128 %r
3068}
3069
3070define dso_local i128 @atomicrmw_or_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
3071; -O0-LABEL: atomicrmw_or_i128_aligned_seq_cst:
3072; -O0:    orr x2, x9, x11
3073; -O0:    orr x9, x9, x10
3074; -O0:    caspal x0, x1, x2, x3, [x8]
3075; -O0:    eor x8, x10, x8
3076; -O0:    eor x11, x9, x11
3077; -O0:    orr x8, x8, x11
3078; -O0:    subs x8, x8, #0
3079;
3080; -O1-LABEL: atomicrmw_or_i128_aligned_seq_cst:
3081; -O1:    ldp x4, x5, [x0]
3082; -O1:    orr x8, x4, x2
3083; -O1:    orr x9, x7, x3
3084; -O1:    caspal x4, x5, x8, x9, [x0]
3085; -O1:    cmp x5, x7
3086; -O1:    ccmp x4, x6, #0, eq
3087    %r = atomicrmw or ptr %ptr, i128 %value seq_cst, align 16
3088    ret i128 %r
3089}
3090
3091define dso_local i8 @atomicrmw_or_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
3092; CHECK-LABEL: atomicrmw_or_i8_unaligned_monotonic:
3093; CHECK:    ldsetb w1, w0, [x0]
3094    %r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1
3095    ret i8 %r
3096}
3097
3098define dso_local i8 @atomicrmw_or_i8_unaligned_acquire(ptr %ptr, i8 %value) {
3099; CHECK-LABEL: atomicrmw_or_i8_unaligned_acquire:
3100; CHECK:    ldsetab w1, w0, [x0]
3101    %r = atomicrmw or ptr %ptr, i8 %value acquire, align 1
3102    ret i8 %r
3103}
3104
3105define dso_local i8 @atomicrmw_or_i8_unaligned_release(ptr %ptr, i8 %value) {
3106; CHECK-LABEL: atomicrmw_or_i8_unaligned_release:
3107; CHECK:    ldsetlb w1, w0, [x0]
3108    %r = atomicrmw or ptr %ptr, i8 %value release, align 1
3109    ret i8 %r
3110}
3111
3112define dso_local i8 @atomicrmw_or_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
3113; CHECK-LABEL: atomicrmw_or_i8_unaligned_acq_rel:
3114; CHECK:    ldsetalb w1, w0, [x0]
3115    %r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1
3116    ret i8 %r
3117}
3118
3119define dso_local i8 @atomicrmw_or_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
3120; CHECK-LABEL: atomicrmw_or_i8_unaligned_seq_cst:
3121; CHECK:    ldsetalb w1, w0, [x0]
3122    %r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1
3123    ret i8 %r
3124}
3125
3126define dso_local i16 @atomicrmw_or_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
3127; -O0-LABEL: atomicrmw_or_i16_unaligned_monotonic:
3128; -O0:    orr w8, w9, w8
3129; -O0:    bl __atomic_compare_exchange
3130;
3131; -O1-LABEL: atomicrmw_or_i16_unaligned_monotonic:
3132; -O1:    orr w8, w0, w20
3133; -O1:    bl __atomic_compare_exchange
3134    %r = atomicrmw or ptr %ptr, i16 %value monotonic, align 1
3135    ret i16 %r
3136}
3137
3138define dso_local i16 @atomicrmw_or_i16_unaligned_acquire(ptr %ptr, i16 %value) {
3139; -O0-LABEL: atomicrmw_or_i16_unaligned_acquire:
3140; -O0:    orr w8, w9, w8
3141; -O0:    bl __atomic_compare_exchange
3142;
3143; -O1-LABEL: atomicrmw_or_i16_unaligned_acquire:
3144; -O1:    orr w8, w0, w20
3145; -O1:    bl __atomic_compare_exchange
3146    %r = atomicrmw or ptr %ptr, i16 %value acquire, align 1
3147    ret i16 %r
3148}
3149
3150define dso_local i16 @atomicrmw_or_i16_unaligned_release(ptr %ptr, i16 %value) {
3151; -O0-LABEL: atomicrmw_or_i16_unaligned_release:
3152; -O0:    orr w8, w9, w8
3153; -O0:    bl __atomic_compare_exchange
3154;
3155; -O1-LABEL: atomicrmw_or_i16_unaligned_release:
3156; -O1:    orr w8, w0, w20
3157; -O1:    bl __atomic_compare_exchange
3158    %r = atomicrmw or ptr %ptr, i16 %value release, align 1
3159    ret i16 %r
3160}
3161
3162define dso_local i16 @atomicrmw_or_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
3163; -O0-LABEL: atomicrmw_or_i16_unaligned_acq_rel:
3164; -O0:    orr w8, w9, w8
3165; -O0:    bl __atomic_compare_exchange
3166;
3167; -O1-LABEL: atomicrmw_or_i16_unaligned_acq_rel:
3168; -O1:    orr w8, w0, w20
3169; -O1:    bl __atomic_compare_exchange
3170    %r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 1
3171    ret i16 %r
3172}
3173
3174define dso_local i16 @atomicrmw_or_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
3175; -O0-LABEL: atomicrmw_or_i16_unaligned_seq_cst:
3176; -O0:    orr w8, w9, w8
3177; -O0:    bl __atomic_compare_exchange
3178;
3179; -O1-LABEL: atomicrmw_or_i16_unaligned_seq_cst:
3180; -O1:    orr w8, w0, w20
3181; -O1:    bl __atomic_compare_exchange
3182    %r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 1
3183    ret i16 %r
3184}
3185
3186define dso_local i32 @atomicrmw_or_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
3187; -O0-LABEL: atomicrmw_or_i32_unaligned_monotonic:
3188; -O0:    orr w8, w9, w8
3189; -O0:    bl __atomic_compare_exchange
3190;
3191; -O1-LABEL: atomicrmw_or_i32_unaligned_monotonic:
3192; -O1:    orr w8, w0, w20
3193; -O1:    bl __atomic_compare_exchange
3194    %r = atomicrmw or ptr %ptr, i32 %value monotonic, align 1
3195    ret i32 %r
3196}
3197
3198define dso_local i32 @atomicrmw_or_i32_unaligned_acquire(ptr %ptr, i32 %value) {
3199; -O0-LABEL: atomicrmw_or_i32_unaligned_acquire:
3200; -O0:    orr w8, w9, w8
3201; -O0:    bl __atomic_compare_exchange
3202;
3203; -O1-LABEL: atomicrmw_or_i32_unaligned_acquire:
3204; -O1:    orr w8, w0, w20
3205; -O1:    bl __atomic_compare_exchange
3206    %r = atomicrmw or ptr %ptr, i32 %value acquire, align 1
3207    ret i32 %r
3208}
3209
3210define dso_local i32 @atomicrmw_or_i32_unaligned_release(ptr %ptr, i32 %value) {
3211; -O0-LABEL: atomicrmw_or_i32_unaligned_release:
3212; -O0:    orr w8, w9, w8
3213; -O0:    bl __atomic_compare_exchange
3214;
3215; -O1-LABEL: atomicrmw_or_i32_unaligned_release:
3216; -O1:    orr w8, w0, w20
3217; -O1:    bl __atomic_compare_exchange
3218    %r = atomicrmw or ptr %ptr, i32 %value release, align 1
3219    ret i32 %r
3220}
3221
3222define dso_local i32 @atomicrmw_or_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
3223; -O0-LABEL: atomicrmw_or_i32_unaligned_acq_rel:
3224; -O0:    orr w8, w9, w8
3225; -O0:    bl __atomic_compare_exchange
3226;
3227; -O1-LABEL: atomicrmw_or_i32_unaligned_acq_rel:
3228; -O1:    orr w8, w0, w20
3229; -O1:    bl __atomic_compare_exchange
3230    %r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 1
3231    ret i32 %r
3232}
3233
3234define dso_local i32 @atomicrmw_or_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
3235; -O0-LABEL: atomicrmw_or_i32_unaligned_seq_cst:
3236; -O0:    orr w8, w9, w8
3237; -O0:    bl __atomic_compare_exchange
3238;
3239; -O1-LABEL: atomicrmw_or_i32_unaligned_seq_cst:
3240; -O1:    orr w8, w0, w20
3241; -O1:    bl __atomic_compare_exchange
3242    %r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 1
3243    ret i32 %r
3244}
3245
3246define dso_local i64 @atomicrmw_or_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
3247; -O0-LABEL: atomicrmw_or_i64_unaligned_monotonic:
3248; -O0:    orr x8, x9, x8
3249; -O0:    bl __atomic_compare_exchange
3250;
3251; -O1-LABEL: atomicrmw_or_i64_unaligned_monotonic:
3252; -O1:    orr x8, x0, x20
3253; -O1:    bl __atomic_compare_exchange
3254    %r = atomicrmw or ptr %ptr, i64 %value monotonic, align 1
3255    ret i64 %r
3256}
3257
3258define dso_local i64 @atomicrmw_or_i64_unaligned_acquire(ptr %ptr, i64 %value) {
3259; -O0-LABEL: atomicrmw_or_i64_unaligned_acquire:
3260; -O0:    orr x8, x9, x8
3261; -O0:    bl __atomic_compare_exchange
3262;
3263; -O1-LABEL: atomicrmw_or_i64_unaligned_acquire:
3264; -O1:    orr x8, x0, x20
3265; -O1:    bl __atomic_compare_exchange
3266    %r = atomicrmw or ptr %ptr, i64 %value acquire, align 1
3267    ret i64 %r
3268}
3269
3270define dso_local i64 @atomicrmw_or_i64_unaligned_release(ptr %ptr, i64 %value) {
3271; -O0-LABEL: atomicrmw_or_i64_unaligned_release:
3272; -O0:    orr x8, x9, x8
3273; -O0:    bl __atomic_compare_exchange
3274;
3275; -O1-LABEL: atomicrmw_or_i64_unaligned_release:
3276; -O1:    orr x8, x0, x20
3277; -O1:    bl __atomic_compare_exchange
3278    %r = atomicrmw or ptr %ptr, i64 %value release, align 1
3279    ret i64 %r
3280}
3281
3282define dso_local i64 @atomicrmw_or_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
3283; -O0-LABEL: atomicrmw_or_i64_unaligned_acq_rel:
3284; -O0:    orr x8, x9, x8
3285; -O0:    bl __atomic_compare_exchange
3286;
3287; -O1-LABEL: atomicrmw_or_i64_unaligned_acq_rel:
3288; -O1:    orr x8, x0, x20
3289; -O1:    bl __atomic_compare_exchange
3290    %r = atomicrmw or ptr %ptr, i64 %value acq_rel, align 1
3291    ret i64 %r
3292}
3293
3294define dso_local i64 @atomicrmw_or_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
3295; -O0-LABEL: atomicrmw_or_i64_unaligned_seq_cst:
3296; -O0:    orr x8, x9, x8
3297; -O0:    bl __atomic_compare_exchange
3298;
3299; -O1-LABEL: atomicrmw_or_i64_unaligned_seq_cst:
3300; -O1:    orr x8, x0, x20
3301; -O1:    bl __atomic_compare_exchange
3302    %r = atomicrmw or ptr %ptr, i64 %value seq_cst, align 1
3303    ret i64 %r
3304}
3305
3306define dso_local i128 @atomicrmw_or_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
3307; -O0-LABEL: atomicrmw_or_i128_unaligned_monotonic:
3308; -O0:    orr x9, x8, x9
3309; -O0:    orr x8, x8, x10
3310; -O0:    bl __atomic_compare_exchange
3311;
3312; -O1-LABEL: atomicrmw_or_i128_unaligned_monotonic:
3313; -O1:    ldp x0, x1, [x0]
3314; -O1:    orr x8, x1, x19
3315; -O1:    orr x9, x0, x21
3316; -O1:    bl __atomic_compare_exchange
3317    %r = atomicrmw or ptr %ptr, i128 %value monotonic, align 1
3318    ret i128 %r
3319}
3320
3321define dso_local i128 @atomicrmw_or_i128_unaligned_acquire(ptr %ptr, i128 %value) {
3322; -O0-LABEL: atomicrmw_or_i128_unaligned_acquire:
3323; -O0:    orr x9, x8, x9
3324; -O0:    orr x8, x8, x10
3325; -O0:    bl __atomic_compare_exchange
3326;
3327; -O1-LABEL: atomicrmw_or_i128_unaligned_acquire:
3328; -O1:    ldp x0, x1, [x0]
3329; -O1:    orr x8, x1, x19
3330; -O1:    orr x9, x0, x21
3331; -O1:    bl __atomic_compare_exchange
3332    %r = atomicrmw or ptr %ptr, i128 %value acquire, align 1
3333    ret i128 %r
3334}
3335
3336define dso_local i128 @atomicrmw_or_i128_unaligned_release(ptr %ptr, i128 %value) {
3337; -O0-LABEL: atomicrmw_or_i128_unaligned_release:
3338; -O0:    orr x9, x8, x9
3339; -O0:    orr x8, x8, x10
3340; -O0:    bl __atomic_compare_exchange
3341;
3342; -O1-LABEL: atomicrmw_or_i128_unaligned_release:
3343; -O1:    ldp x0, x1, [x0]
3344; -O1:    orr x8, x1, x19
3345; -O1:    orr x9, x0, x21
3346; -O1:    bl __atomic_compare_exchange
3347    %r = atomicrmw or ptr %ptr, i128 %value release, align 1
3348    ret i128 %r
3349}
3350
3351define dso_local i128 @atomicrmw_or_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
3352; -O0-LABEL: atomicrmw_or_i128_unaligned_acq_rel:
3353; -O0:    orr x9, x8, x9
3354; -O0:    orr x8, x8, x10
3355; -O0:    bl __atomic_compare_exchange
3356;
3357; -O1-LABEL: atomicrmw_or_i128_unaligned_acq_rel:
3358; -O1:    ldp x0, x1, [x0]
3359; -O1:    orr x8, x1, x19
3360; -O1:    orr x9, x0, x21
3361; -O1:    bl __atomic_compare_exchange
3362    %r = atomicrmw or ptr %ptr, i128 %value acq_rel, align 1
3363    ret i128 %r
3364}
3365
3366define dso_local i128 @atomicrmw_or_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
3367; -O0-LABEL: atomicrmw_or_i128_unaligned_seq_cst:
3368; -O0:    orr x9, x8, x9
3369; -O0:    orr x8, x8, x10
3370; -O0:    bl __atomic_compare_exchange
3371;
3372; -O1-LABEL: atomicrmw_or_i128_unaligned_seq_cst:
3373; -O1:    ldp x0, x1, [x0]
3374; -O1:    orr x8, x1, x19
3375; -O1:    orr x9, x0, x21
3376; -O1:    bl __atomic_compare_exchange
3377    %r = atomicrmw or ptr %ptr, i128 %value seq_cst, align 1
3378    ret i128 %r
3379}
3380
3381define dso_local i8 @atomicrmw_xor_i8_aligned_monotonic(ptr %ptr, i8 %value) {
3382; CHECK-LABEL: atomicrmw_xor_i8_aligned_monotonic:
3383; CHECK:    ldeorb w1, w0, [x0]
3384    %r = atomicrmw xor ptr %ptr, i8 %value monotonic, align 1
3385    ret i8 %r
3386}
3387
3388define dso_local i8 @atomicrmw_xor_i8_aligned_acquire(ptr %ptr, i8 %value) {
3389; CHECK-LABEL: atomicrmw_xor_i8_aligned_acquire:
3390; CHECK:    ldeorab w1, w0, [x0]
3391    %r = atomicrmw xor ptr %ptr, i8 %value acquire, align 1
3392    ret i8 %r
3393}
3394
3395define dso_local i8 @atomicrmw_xor_i8_aligned_release(ptr %ptr, i8 %value) {
3396; CHECK-LABEL: atomicrmw_xor_i8_aligned_release:
3397; CHECK:    ldeorlb w1, w0, [x0]
3398    %r = atomicrmw xor ptr %ptr, i8 %value release, align 1
3399    ret i8 %r
3400}
3401
3402define dso_local i8 @atomicrmw_xor_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
3403; CHECK-LABEL: atomicrmw_xor_i8_aligned_acq_rel:
3404; CHECK:    ldeoralb w1, w0, [x0]
3405    %r = atomicrmw xor ptr %ptr, i8 %value acq_rel, align 1
3406    ret i8 %r
3407}
3408
3409define dso_local i8 @atomicrmw_xor_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
3410; CHECK-LABEL: atomicrmw_xor_i8_aligned_seq_cst:
3411; CHECK:    ldeoralb w1, w0, [x0]
3412    %r = atomicrmw xor ptr %ptr, i8 %value seq_cst, align 1
3413    ret i8 %r
3414}
3415
3416define dso_local i16 @atomicrmw_xor_i16_aligned_monotonic(ptr %ptr, i16 %value) {
3417; CHECK-LABEL: atomicrmw_xor_i16_aligned_monotonic:
3418; CHECK:    ldeorh w1, w0, [x0]
3419    %r = atomicrmw xor ptr %ptr, i16 %value monotonic, align 2
3420    ret i16 %r
3421}
3422
3423define dso_local i16 @atomicrmw_xor_i16_aligned_acquire(ptr %ptr, i16 %value) {
3424; CHECK-LABEL: atomicrmw_xor_i16_aligned_acquire:
3425; CHECK:    ldeorah w1, w0, [x0]
3426    %r = atomicrmw xor ptr %ptr, i16 %value acquire, align 2
3427    ret i16 %r
3428}
3429
3430define dso_local i16 @atomicrmw_xor_i16_aligned_release(ptr %ptr, i16 %value) {
3431; CHECK-LABEL: atomicrmw_xor_i16_aligned_release:
3432; CHECK:    ldeorlh w1, w0, [x0]
3433    %r = atomicrmw xor ptr %ptr, i16 %value release, align 2
3434    ret i16 %r
3435}
3436
3437define dso_local i16 @atomicrmw_xor_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
3438; CHECK-LABEL: atomicrmw_xor_i16_aligned_acq_rel:
3439; CHECK:    ldeoralh w1, w0, [x0]
3440    %r = atomicrmw xor ptr %ptr, i16 %value acq_rel, align 2
3441    ret i16 %r
3442}
3443
3444define dso_local i16 @atomicrmw_xor_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
3445; CHECK-LABEL: atomicrmw_xor_i16_aligned_seq_cst:
3446; CHECK:    ldeoralh w1, w0, [x0]
3447    %r = atomicrmw xor ptr %ptr, i16 %value seq_cst, align 2
3448    ret i16 %r
3449}
3450
3451define dso_local i32 @atomicrmw_xor_i32_aligned_monotonic(ptr %ptr, i32 %value) {
3452; CHECK-LABEL: atomicrmw_xor_i32_aligned_monotonic:
3453; CHECK:    ldeor w1, w0, [x0]
3454    %r = atomicrmw xor ptr %ptr, i32 %value monotonic, align 4
3455    ret i32 %r
3456}
3457
3458define dso_local i32 @atomicrmw_xor_i32_aligned_acquire(ptr %ptr, i32 %value) {
3459; CHECK-LABEL: atomicrmw_xor_i32_aligned_acquire:
3460; CHECK:    ldeora w1, w0, [x0]
3461    %r = atomicrmw xor ptr %ptr, i32 %value acquire, align 4
3462    ret i32 %r
3463}
3464
3465define dso_local i32 @atomicrmw_xor_i32_aligned_release(ptr %ptr, i32 %value) {
3466; CHECK-LABEL: atomicrmw_xor_i32_aligned_release:
3467; CHECK:    ldeorl w1, w0, [x0]
3468    %r = atomicrmw xor ptr %ptr, i32 %value release, align 4
3469    ret i32 %r
3470}
3471
3472define dso_local i32 @atomicrmw_xor_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
3473; CHECK-LABEL: atomicrmw_xor_i32_aligned_acq_rel:
3474; CHECK:    ldeoral w1, w0, [x0]
3475    %r = atomicrmw xor ptr %ptr, i32 %value acq_rel, align 4
3476    ret i32 %r
3477}
3478
3479define dso_local i32 @atomicrmw_xor_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
3480; CHECK-LABEL: atomicrmw_xor_i32_aligned_seq_cst:
3481; CHECK:    ldeoral w1, w0, [x0]
3482    %r = atomicrmw xor ptr %ptr, i32 %value seq_cst, align 4
3483    ret i32 %r
3484}
3485
3486define dso_local i64 @atomicrmw_xor_i64_aligned_monotonic(ptr %ptr, i64 %value) {
3487; CHECK-LABEL: atomicrmw_xor_i64_aligned_monotonic:
3488; CHECK:    ldeor x1, x0, [x0]
3489    %r = atomicrmw xor ptr %ptr, i64 %value monotonic, align 8
3490    ret i64 %r
3491}
3492
3493define dso_local i64 @atomicrmw_xor_i64_aligned_acquire(ptr %ptr, i64 %value) {
3494; CHECK-LABEL: atomicrmw_xor_i64_aligned_acquire:
3495; CHECK:    ldeora x1, x0, [x0]
3496    %r = atomicrmw xor ptr %ptr, i64 %value acquire, align 8
3497    ret i64 %r
3498}
3499
3500define dso_local i64 @atomicrmw_xor_i64_aligned_release(ptr %ptr, i64 %value) {
3501; CHECK-LABEL: atomicrmw_xor_i64_aligned_release:
3502; CHECK:    ldeorl x1, x0, [x0]
3503    %r = atomicrmw xor ptr %ptr, i64 %value release, align 8
3504    ret i64 %r
3505}
3506
3507define dso_local i64 @atomicrmw_xor_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
3508; CHECK-LABEL: atomicrmw_xor_i64_aligned_acq_rel:
3509; CHECK:    ldeoral x1, x0, [x0]
3510    %r = atomicrmw xor ptr %ptr, i64 %value acq_rel, align 8
3511    ret i64 %r
3512}
3513
3514define dso_local i64 @atomicrmw_xor_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
3515; CHECK-LABEL: atomicrmw_xor_i64_aligned_seq_cst:
3516; CHECK:    ldeoral x1, x0, [x0]
3517    %r = atomicrmw xor ptr %ptr, i64 %value seq_cst, align 8
3518    ret i64 %r
3519}
3520
3521define dso_local i128 @atomicrmw_xor_i128_aligned_monotonic(ptr %ptr, i128 %value) {
3522; -O0-LABEL: atomicrmw_xor_i128_aligned_monotonic:
3523; -O0:    eor x2, x9, x11
3524; -O0:    eor x9, x9, x10
3525; -O0:    casp x0, x1, x2, x3, [x8]
3526; -O0:    eor x8, x10, x8
3527; -O0:    eor x11, x9, x11
3528; -O0:    orr x8, x8, x11
3529; -O0:    subs x8, x8, #0
3530;
3531; -O1-LABEL: atomicrmw_xor_i128_aligned_monotonic:
3532; -O1:    ldp x4, x5, [x0]
3533; -O1:    eor x8, x4, x2
3534; -O1:    eor x9, x7, x3
3535; -O1:    casp x4, x5, x8, x9, [x0]
3536; -O1:    cmp x5, x7
3537; -O1:    ccmp x4, x6, #0, eq
3538    %r = atomicrmw xor ptr %ptr, i128 %value monotonic, align 16
3539    ret i128 %r
3540}
3541
3542define dso_local i128 @atomicrmw_xor_i128_aligned_acquire(ptr %ptr, i128 %value) {
3543; -O0-LABEL: atomicrmw_xor_i128_aligned_acquire:
3544; -O0:    eor x2, x9, x11
3545; -O0:    eor x9, x9, x10
3546; -O0:    caspa x0, x1, x2, x3, [x8]
3547; -O0:    eor x8, x10, x8
3548; -O0:    eor x11, x9, x11
3549; -O0:    orr x8, x8, x11
3550; -O0:    subs x8, x8, #0
3551;
3552; -O1-LABEL: atomicrmw_xor_i128_aligned_acquire:
3553; -O1:    ldp x4, x5, [x0]
3554; -O1:    eor x8, x4, x2
3555; -O1:    eor x9, x7, x3
3556; -O1:    caspa x4, x5, x8, x9, [x0]
3557; -O1:    cmp x5, x7
3558; -O1:    ccmp x4, x6, #0, eq
3559    %r = atomicrmw xor ptr %ptr, i128 %value acquire, align 16
3560    ret i128 %r
3561}
3562
3563define dso_local i128 @atomicrmw_xor_i128_aligned_release(ptr %ptr, i128 %value) {
3564; -O0-LABEL: atomicrmw_xor_i128_aligned_release:
3565; -O0:    eor x2, x9, x11
3566; -O0:    eor x9, x9, x10
3567; -O0:    caspl x0, x1, x2, x3, [x8]
3568; -O0:    eor x8, x10, x8
3569; -O0:    eor x11, x9, x11
3570; -O0:    orr x8, x8, x11
3571; -O0:    subs x8, x8, #0
3572;
3573; -O1-LABEL: atomicrmw_xor_i128_aligned_release:
3574; -O1:    ldp x4, x5, [x0]
3575; -O1:    eor x8, x4, x2
3576; -O1:    eor x9, x7, x3
3577; -O1:    caspl x4, x5, x8, x9, [x0]
3578; -O1:    cmp x5, x7
3579; -O1:    ccmp x4, x6, #0, eq
3580    %r = atomicrmw xor ptr %ptr, i128 %value release, align 16
3581    ret i128 %r
3582}
3583
3584define dso_local i128 @atomicrmw_xor_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
3585; -O0-LABEL: atomicrmw_xor_i128_aligned_acq_rel:
3586; -O0:    eor x2, x9, x11
3587; -O0:    eor x9, x9, x10
3588; -O0:    caspal x0, x1, x2, x3, [x8]
3589; -O0:    eor x8, x10, x8
3590; -O0:    eor x11, x9, x11
3591; -O0:    orr x8, x8, x11
3592; -O0:    subs x8, x8, #0
3593;
3594; -O1-LABEL: atomicrmw_xor_i128_aligned_acq_rel:
3595; -O1:    ldp x4, x5, [x0]
3596; -O1:    eor x8, x4, x2
3597; -O1:    eor x9, x7, x3
3598; -O1:    caspal x4, x5, x8, x9, [x0]
3599; -O1:    cmp x5, x7
3600; -O1:    ccmp x4, x6, #0, eq
3601    %r = atomicrmw xor ptr %ptr, i128 %value acq_rel, align 16
3602    ret i128 %r
3603}
3604
3605define dso_local i128 @atomicrmw_xor_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
3606; -O0-LABEL: atomicrmw_xor_i128_aligned_seq_cst:
3607; -O0:    eor x2, x9, x11
3608; -O0:    eor x9, x9, x10
3609; -O0:    caspal x0, x1, x2, x3, [x8]
3610; -O0:    eor x8, x10, x8
3611; -O0:    eor x11, x9, x11
3612; -O0:    orr x8, x8, x11
3613; -O0:    subs x8, x8, #0
3614;
3615; -O1-LABEL: atomicrmw_xor_i128_aligned_seq_cst:
3616; -O1:    ldp x4, x5, [x0]
3617; -O1:    eor x8, x4, x2
3618; -O1:    eor x9, x7, x3
3619; -O1:    caspal x4, x5, x8, x9, [x0]
3620; -O1:    cmp x5, x7
3621; -O1:    ccmp x4, x6, #0, eq
3622    %r = atomicrmw xor ptr %ptr, i128 %value seq_cst, align 16
3623    ret i128 %r
3624}
3625
3626define dso_local i8 @atomicrmw_xor_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
3627; CHECK-LABEL: atomicrmw_xor_i8_unaligned_monotonic:
3628; CHECK:    ldeorb w1, w0, [x0]
3629    %r = atomicrmw xor ptr %ptr, i8 %value monotonic, align 1
3630    ret i8 %r
3631}
3632
3633define dso_local i8 @atomicrmw_xor_i8_unaligned_acquire(ptr %ptr, i8 %value) {
3634; CHECK-LABEL: atomicrmw_xor_i8_unaligned_acquire:
3635; CHECK:    ldeorab w1, w0, [x0]
3636    %r = atomicrmw xor ptr %ptr, i8 %value acquire, align 1
3637    ret i8 %r
3638}
3639
3640define dso_local i8 @atomicrmw_xor_i8_unaligned_release(ptr %ptr, i8 %value) {
3641; CHECK-LABEL: atomicrmw_xor_i8_unaligned_release:
3642; CHECK:    ldeorlb w1, w0, [x0]
3643    %r = atomicrmw xor ptr %ptr, i8 %value release, align 1
3644    ret i8 %r
3645}
3646
3647define dso_local i8 @atomicrmw_xor_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
3648; CHECK-LABEL: atomicrmw_xor_i8_unaligned_acq_rel:
3649; CHECK:    ldeoralb w1, w0, [x0]
3650    %r = atomicrmw xor ptr %ptr, i8 %value acq_rel, align 1
3651    ret i8 %r
3652}
3653
3654define dso_local i8 @atomicrmw_xor_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
3655; CHECK-LABEL: atomicrmw_xor_i8_unaligned_seq_cst:
3656; CHECK:    ldeoralb w1, w0, [x0]
3657    %r = atomicrmw xor ptr %ptr, i8 %value seq_cst, align 1
3658    ret i8 %r
3659}
3660
3661define dso_local i16 @atomicrmw_xor_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
3662; -O0-LABEL: atomicrmw_xor_i16_unaligned_monotonic:
3663; -O0:    eor w8, w9, w8
3664; -O0:    bl __atomic_compare_exchange
3665;
3666; -O1-LABEL: atomicrmw_xor_i16_unaligned_monotonic:
3667; -O1:    eor w8, w0, w20
3668; -O1:    bl __atomic_compare_exchange
3669    %r = atomicrmw xor ptr %ptr, i16 %value monotonic, align 1
3670    ret i16 %r
3671}
3672
3673define dso_local i16 @atomicrmw_xor_i16_unaligned_acquire(ptr %ptr, i16 %value) {
3674; -O0-LABEL: atomicrmw_xor_i16_unaligned_acquire:
3675; -O0:    eor w8, w9, w8
3676; -O0:    bl __atomic_compare_exchange
3677;
3678; -O1-LABEL: atomicrmw_xor_i16_unaligned_acquire:
3679; -O1:    eor w8, w0, w20
3680; -O1:    bl __atomic_compare_exchange
3681    %r = atomicrmw xor ptr %ptr, i16 %value acquire, align 1
3682    ret i16 %r
3683}
3684
3685define dso_local i16 @atomicrmw_xor_i16_unaligned_release(ptr %ptr, i16 %value) {
3686; -O0-LABEL: atomicrmw_xor_i16_unaligned_release:
3687; -O0:    eor w8, w9, w8
3688; -O0:    bl __atomic_compare_exchange
3689;
3690; -O1-LABEL: atomicrmw_xor_i16_unaligned_release:
3691; -O1:    eor w8, w0, w20
3692; -O1:    bl __atomic_compare_exchange
3693    %r = atomicrmw xor ptr %ptr, i16 %value release, align 1
3694    ret i16 %r
3695}
3696
3697define dso_local i16 @atomicrmw_xor_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
3698; -O0-LABEL: atomicrmw_xor_i16_unaligned_acq_rel:
3699; -O0:    eor w8, w9, w8
3700; -O0:    bl __atomic_compare_exchange
3701;
3702; -O1-LABEL: atomicrmw_xor_i16_unaligned_acq_rel:
3703; -O1:    eor w8, w0, w20
3704; -O1:    bl __atomic_compare_exchange
3705    %r = atomicrmw xor ptr %ptr, i16 %value acq_rel, align 1
3706    ret i16 %r
3707}
3708
3709define dso_local i16 @atomicrmw_xor_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
3710; -O0-LABEL: atomicrmw_xor_i16_unaligned_seq_cst:
3711; -O0:    eor w8, w9, w8
3712; -O0:    bl __atomic_compare_exchange
3713;
3714; -O1-LABEL: atomicrmw_xor_i16_unaligned_seq_cst:
3715; -O1:    eor w8, w0, w20
3716; -O1:    bl __atomic_compare_exchange
3717    %r = atomicrmw xor ptr %ptr, i16 %value seq_cst, align 1
3718    ret i16 %r
3719}
3720
3721define dso_local i32 @atomicrmw_xor_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
3722; -O0-LABEL: atomicrmw_xor_i32_unaligned_monotonic:
3723; -O0:    eor w8, w9, w8
3724; -O0:    bl __atomic_compare_exchange
3725;
3726; -O1-LABEL: atomicrmw_xor_i32_unaligned_monotonic:
3727; -O1:    eor w8, w0, w20
3728; -O1:    bl __atomic_compare_exchange
3729    %r = atomicrmw xor ptr %ptr, i32 %value monotonic, align 1
3730    ret i32 %r
3731}
3732
3733define dso_local i32 @atomicrmw_xor_i32_unaligned_acquire(ptr %ptr, i32 %value) {
3734; -O0-LABEL: atomicrmw_xor_i32_unaligned_acquire:
3735; -O0:    eor w8, w9, w8
3736; -O0:    bl __atomic_compare_exchange
3737;
3738; -O1-LABEL: atomicrmw_xor_i32_unaligned_acquire:
3739; -O1:    eor w8, w0, w20
3740; -O1:    bl __atomic_compare_exchange
3741    %r = atomicrmw xor ptr %ptr, i32 %value acquire, align 1
3742    ret i32 %r
3743}
3744
3745define dso_local i32 @atomicrmw_xor_i32_unaligned_release(ptr %ptr, i32 %value) {
3746; -O0-LABEL: atomicrmw_xor_i32_unaligned_release:
3747; -O0:    eor w8, w9, w8
3748; -O0:    bl __atomic_compare_exchange
3749;
3750; -O1-LABEL: atomicrmw_xor_i32_unaligned_release:
3751; -O1:    eor w8, w0, w20
3752; -O1:    bl __atomic_compare_exchange
3753    %r = atomicrmw xor ptr %ptr, i32 %value release, align 1
3754    ret i32 %r
3755}
3756
3757define dso_local i32 @atomicrmw_xor_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
3758; -O0-LABEL: atomicrmw_xor_i32_unaligned_acq_rel:
3759; -O0:    eor w8, w9, w8
3760; -O0:    bl __atomic_compare_exchange
3761;
3762; -O1-LABEL: atomicrmw_xor_i32_unaligned_acq_rel:
3763; -O1:    eor w8, w0, w20
3764; -O1:    bl __atomic_compare_exchange
3765    %r = atomicrmw xor ptr %ptr, i32 %value acq_rel, align 1
3766    ret i32 %r
3767}
3768
3769define dso_local i32 @atomicrmw_xor_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
3770; -O0-LABEL: atomicrmw_xor_i32_unaligned_seq_cst:
3771; -O0:    eor w8, w9, w8
3772; -O0:    bl __atomic_compare_exchange
3773;
3774; -O1-LABEL: atomicrmw_xor_i32_unaligned_seq_cst:
3775; -O1:    eor w8, w0, w20
3776; -O1:    bl __atomic_compare_exchange
3777    %r = atomicrmw xor ptr %ptr, i32 %value seq_cst, align 1
3778    ret i32 %r
3779}
3780
3781define dso_local i64 @atomicrmw_xor_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
3782; -O0-LABEL: atomicrmw_xor_i64_unaligned_monotonic:
3783; -O0:    eor x8, x9, x8
3784; -O0:    bl __atomic_compare_exchange
3785;
3786; -O1-LABEL: atomicrmw_xor_i64_unaligned_monotonic:
3787; -O1:    eor x8, x0, x20
3788; -O1:    bl __atomic_compare_exchange
3789    %r = atomicrmw xor ptr %ptr, i64 %value monotonic, align 1
3790    ret i64 %r
3791}
3792
3793define dso_local i64 @atomicrmw_xor_i64_unaligned_acquire(ptr %ptr, i64 %value) {
3794; -O0-LABEL: atomicrmw_xor_i64_unaligned_acquire:
3795; -O0:    eor x8, x9, x8
3796; -O0:    bl __atomic_compare_exchange
3797;
3798; -O1-LABEL: atomicrmw_xor_i64_unaligned_acquire:
3799; -O1:    eor x8, x0, x20
3800; -O1:    bl __atomic_compare_exchange
3801    %r = atomicrmw xor ptr %ptr, i64 %value acquire, align 1
3802    ret i64 %r
3803}
3804
3805define dso_local i64 @atomicrmw_xor_i64_unaligned_release(ptr %ptr, i64 %value) {
3806; -O0-LABEL: atomicrmw_xor_i64_unaligned_release:
3807; -O0:    eor x8, x9, x8
3808; -O0:    bl __atomic_compare_exchange
3809;
3810; -O1-LABEL: atomicrmw_xor_i64_unaligned_release:
3811; -O1:    eor x8, x0, x20
3812; -O1:    bl __atomic_compare_exchange
3813    %r = atomicrmw xor ptr %ptr, i64 %value release, align 1
3814    ret i64 %r
3815}
3816
3817define dso_local i64 @atomicrmw_xor_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
3818; -O0-LABEL: atomicrmw_xor_i64_unaligned_acq_rel:
3819; -O0:    eor x8, x9, x8
3820; -O0:    bl __atomic_compare_exchange
3821;
3822; -O1-LABEL: atomicrmw_xor_i64_unaligned_acq_rel:
3823; -O1:    eor x8, x0, x20
3824; -O1:    bl __atomic_compare_exchange
3825    %r = atomicrmw xor ptr %ptr, i64 %value acq_rel, align 1
3826    ret i64 %r
3827}
3828
3829define dso_local i64 @atomicrmw_xor_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
3830; -O0-LABEL: atomicrmw_xor_i64_unaligned_seq_cst:
3831; -O0:    eor x8, x9, x8
3832; -O0:    bl __atomic_compare_exchange
3833;
3834; -O1-LABEL: atomicrmw_xor_i64_unaligned_seq_cst:
3835; -O1:    eor x8, x0, x20
3836; -O1:    bl __atomic_compare_exchange
3837    %r = atomicrmw xor ptr %ptr, i64 %value seq_cst, align 1
3838    ret i64 %r
3839}
3840
3841define dso_local i128 @atomicrmw_xor_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
3842; -O0-LABEL: atomicrmw_xor_i128_unaligned_monotonic:
3843; -O0:    eor x9, x8, x9
3844; -O0:    eor x8, x8, x10
3845; -O0:    bl __atomic_compare_exchange
3846;
3847; -O1-LABEL: atomicrmw_xor_i128_unaligned_monotonic:
3848; -O1:    ldp x0, x1, [x0]
3849; -O1:    eor x8, x1, x19
3850; -O1:    eor x9, x0, x21
3851; -O1:    bl __atomic_compare_exchange
3852    %r = atomicrmw xor ptr %ptr, i128 %value monotonic, align 1
3853    ret i128 %r
3854}
3855
3856define dso_local i128 @atomicrmw_xor_i128_unaligned_acquire(ptr %ptr, i128 %value) {
3857; -O0-LABEL: atomicrmw_xor_i128_unaligned_acquire:
3858; -O0:    eor x9, x8, x9
3859; -O0:    eor x8, x8, x10
3860; -O0:    bl __atomic_compare_exchange
3861;
3862; -O1-LABEL: atomicrmw_xor_i128_unaligned_acquire:
3863; -O1:    ldp x0, x1, [x0]
3864; -O1:    eor x8, x1, x19
3865; -O1:    eor x9, x0, x21
3866; -O1:    bl __atomic_compare_exchange
3867    %r = atomicrmw xor ptr %ptr, i128 %value acquire, align 1
3868    ret i128 %r
3869}
3870
3871define dso_local i128 @atomicrmw_xor_i128_unaligned_release(ptr %ptr, i128 %value) {
3872; -O0-LABEL: atomicrmw_xor_i128_unaligned_release:
3873; -O0:    eor x9, x8, x9
3874; -O0:    eor x8, x8, x10
3875; -O0:    bl __atomic_compare_exchange
3876;
3877; -O1-LABEL: atomicrmw_xor_i128_unaligned_release:
3878; -O1:    ldp x0, x1, [x0]
3879; -O1:    eor x8, x1, x19
3880; -O1:    eor x9, x0, x21
3881; -O1:    bl __atomic_compare_exchange
3882    %r = atomicrmw xor ptr %ptr, i128 %value release, align 1
3883    ret i128 %r
3884}
3885
3886define dso_local i128 @atomicrmw_xor_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
3887; -O0-LABEL: atomicrmw_xor_i128_unaligned_acq_rel:
3888; -O0:    eor x9, x8, x9
3889; -O0:    eor x8, x8, x10
3890; -O0:    bl __atomic_compare_exchange
3891;
3892; -O1-LABEL: atomicrmw_xor_i128_unaligned_acq_rel:
3893; -O1:    ldp x0, x1, [x0]
3894; -O1:    eor x8, x1, x19
3895; -O1:    eor x9, x0, x21
3896; -O1:    bl __atomic_compare_exchange
3897    %r = atomicrmw xor ptr %ptr, i128 %value acq_rel, align 1
3898    ret i128 %r
3899}
3900
3901define dso_local i128 @atomicrmw_xor_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
3902; -O0-LABEL: atomicrmw_xor_i128_unaligned_seq_cst:
3903; -O0:    eor x9, x8, x9
3904; -O0:    eor x8, x8, x10
3905; -O0:    bl __atomic_compare_exchange
3906;
3907; -O1-LABEL: atomicrmw_xor_i128_unaligned_seq_cst:
3908; -O1:    ldp x0, x1, [x0]
3909; -O1:    eor x8, x1, x19
3910; -O1:    eor x9, x0, x21
3911; -O1:    bl __atomic_compare_exchange
3912    %r = atomicrmw xor ptr %ptr, i128 %value seq_cst, align 1
3913    ret i128 %r
3914}
3915
3916define dso_local i8 @atomicrmw_max_i8_aligned_monotonic(ptr %ptr, i8 %value) {
3917; CHECK-LABEL: atomicrmw_max_i8_aligned_monotonic:
3918; CHECK:    ldsmaxb w1, w0, [x0]
3919    %r = atomicrmw max ptr %ptr, i8 %value monotonic, align 1
3920    ret i8 %r
3921}
3922
3923define dso_local i8 @atomicrmw_max_i8_aligned_acquire(ptr %ptr, i8 %value) {
3924; CHECK-LABEL: atomicrmw_max_i8_aligned_acquire:
3925; CHECK:    ldsmaxab w1, w0, [x0]
3926    %r = atomicrmw max ptr %ptr, i8 %value acquire, align 1
3927    ret i8 %r
3928}
3929
3930define dso_local i8 @atomicrmw_max_i8_aligned_release(ptr %ptr, i8 %value) {
3931; CHECK-LABEL: atomicrmw_max_i8_aligned_release:
3932; CHECK:    ldsmaxlb w1, w0, [x0]
3933    %r = atomicrmw max ptr %ptr, i8 %value release, align 1
3934    ret i8 %r
3935}
3936
3937define dso_local i8 @atomicrmw_max_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
3938; CHECK-LABEL: atomicrmw_max_i8_aligned_acq_rel:
3939; CHECK:    ldsmaxalb w1, w0, [x0]
3940    %r = atomicrmw max ptr %ptr, i8 %value acq_rel, align 1
3941    ret i8 %r
3942}
3943
3944define dso_local i8 @atomicrmw_max_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
3945; CHECK-LABEL: atomicrmw_max_i8_aligned_seq_cst:
3946; CHECK:    ldsmaxalb w1, w0, [x0]
3947    %r = atomicrmw max ptr %ptr, i8 %value seq_cst, align 1
3948    ret i8 %r
3949}
3950
3951define dso_local i16 @atomicrmw_max_i16_aligned_monotonic(ptr %ptr, i16 %value) {
3952; CHECK-LABEL: atomicrmw_max_i16_aligned_monotonic:
3953; CHECK:    ldsmaxh w1, w0, [x0]
3954    %r = atomicrmw max ptr %ptr, i16 %value monotonic, align 2
3955    ret i16 %r
3956}
3957
3958define dso_local i16 @atomicrmw_max_i16_aligned_acquire(ptr %ptr, i16 %value) {
3959; CHECK-LABEL: atomicrmw_max_i16_aligned_acquire:
3960; CHECK:    ldsmaxah w1, w0, [x0]
3961    %r = atomicrmw max ptr %ptr, i16 %value acquire, align 2
3962    ret i16 %r
3963}
3964
3965define dso_local i16 @atomicrmw_max_i16_aligned_release(ptr %ptr, i16 %value) {
3966; CHECK-LABEL: atomicrmw_max_i16_aligned_release:
3967; CHECK:    ldsmaxlh w1, w0, [x0]
3968    %r = atomicrmw max ptr %ptr, i16 %value release, align 2
3969    ret i16 %r
3970}
3971
3972define dso_local i16 @atomicrmw_max_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
3973; CHECK-LABEL: atomicrmw_max_i16_aligned_acq_rel:
3974; CHECK:    ldsmaxalh w1, w0, [x0]
3975    %r = atomicrmw max ptr %ptr, i16 %value acq_rel, align 2
3976    ret i16 %r
3977}
3978
3979define dso_local i16 @atomicrmw_max_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
3980; CHECK-LABEL: atomicrmw_max_i16_aligned_seq_cst:
3981; CHECK:    ldsmaxalh w1, w0, [x0]
3982    %r = atomicrmw max ptr %ptr, i16 %value seq_cst, align 2
3983    ret i16 %r
3984}
3985
3986define dso_local i32 @atomicrmw_max_i32_aligned_monotonic(ptr %ptr, i32 %value) {
3987; CHECK-LABEL: atomicrmw_max_i32_aligned_monotonic:
3988; CHECK:    ldsmax w1, w0, [x0]
3989    %r = atomicrmw max ptr %ptr, i32 %value monotonic, align 4
3990    ret i32 %r
3991}
3992
3993define dso_local i32 @atomicrmw_max_i32_aligned_acquire(ptr %ptr, i32 %value) {
3994; CHECK-LABEL: atomicrmw_max_i32_aligned_acquire:
3995; CHECK:    ldsmaxa w1, w0, [x0]
3996    %r = atomicrmw max ptr %ptr, i32 %value acquire, align 4
3997    ret i32 %r
3998}
3999
4000define dso_local i32 @atomicrmw_max_i32_aligned_release(ptr %ptr, i32 %value) {
4001; CHECK-LABEL: atomicrmw_max_i32_aligned_release:
4002; CHECK:    ldsmaxl w1, w0, [x0]
4003    %r = atomicrmw max ptr %ptr, i32 %value release, align 4
4004    ret i32 %r
4005}
4006
4007define dso_local i32 @atomicrmw_max_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
4008; CHECK-LABEL: atomicrmw_max_i32_aligned_acq_rel:
4009; CHECK:    ldsmaxal w1, w0, [x0]
4010    %r = atomicrmw max ptr %ptr, i32 %value acq_rel, align 4
4011    ret i32 %r
4012}
4013
4014define dso_local i32 @atomicrmw_max_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
4015; CHECK-LABEL: atomicrmw_max_i32_aligned_seq_cst:
4016; CHECK:    ldsmaxal w1, w0, [x0]
4017    %r = atomicrmw max ptr %ptr, i32 %value seq_cst, align 4
4018    ret i32 %r
4019}
4020
4021define dso_local i64 @atomicrmw_max_i64_aligned_monotonic(ptr %ptr, i64 %value) {
4022; CHECK-LABEL: atomicrmw_max_i64_aligned_monotonic:
4023; CHECK:    ldsmax x1, x0, [x0]
4024    %r = atomicrmw max ptr %ptr, i64 %value monotonic, align 8
4025    ret i64 %r
4026}
4027
4028define dso_local i64 @atomicrmw_max_i64_aligned_acquire(ptr %ptr, i64 %value) {
4029; CHECK-LABEL: atomicrmw_max_i64_aligned_acquire:
4030; CHECK:    ldsmaxa x1, x0, [x0]
4031    %r = atomicrmw max ptr %ptr, i64 %value acquire, align 8
4032    ret i64 %r
4033}
4034
4035define dso_local i64 @atomicrmw_max_i64_aligned_release(ptr %ptr, i64 %value) {
4036; CHECK-LABEL: atomicrmw_max_i64_aligned_release:
4037; CHECK:    ldsmaxl x1, x0, [x0]
4038    %r = atomicrmw max ptr %ptr, i64 %value release, align 8
4039    ret i64 %r
4040}
4041
4042define dso_local i64 @atomicrmw_max_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
4043; CHECK-LABEL: atomicrmw_max_i64_aligned_acq_rel:
4044; CHECK:    ldsmaxal x1, x0, [x0]
4045    %r = atomicrmw max ptr %ptr, i64 %value acq_rel, align 8
4046    ret i64 %r
4047}
4048
4049define dso_local i64 @atomicrmw_max_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
4050; CHECK-LABEL: atomicrmw_max_i64_aligned_seq_cst:
4051; CHECK:    ldsmaxal x1, x0, [x0]
4052    %r = atomicrmw max ptr %ptr, i64 %value seq_cst, align 8
4053    ret i64 %r
4054}
4055
4056define dso_local i128 @atomicrmw_max_i128_aligned_monotonic(ptr %ptr, i128 %value) {
4057; -O0-LABEL: atomicrmw_max_i128_aligned_monotonic:
4058; -O0:    subs x9, x9, x12
4059; -O0:    subs x11, x11, x10
4060; -O0:    subs x13, x13, x10
4061; -O0:    csel w11, w9, w11, eq
4062; -O0:    ands w13, w11, #0x1
4063; -O0:    csel x2, x9, x12, ne
4064; -O0:    ands w11, w11, #0x1
4065; -O0:    csel x9, x9, x10, ne
4066; -O0:    casp x0, x1, x2, x3, [x8]
4067; -O0:    eor x8, x10, x8
4068; -O0:    eor x11, x9, x11
4069; -O0:    orr x8, x8, x11
4070; -O0:    subs x8, x8, #0
4071;
4072; -O1-LABEL: atomicrmw_max_i128_aligned_monotonic:
4073; -O1:    ldp x4, x5, [x0]
4074; -O1:    cmp x2, x4
4075; -O1:    csel x9, x7, x3, lt
4076; -O1:    csel x8, x4, x2, lt
4077; -O1:    casp x4, x5, x8, x9, [x0]
4078; -O1:    cmp x5, x7
4079; -O1:    ccmp x4, x6, #0, eq
4080    %r = atomicrmw max ptr %ptr, i128 %value monotonic, align 16
4081    ret i128 %r
4082}
4083
4084define dso_local i128 @atomicrmw_max_i128_aligned_acquire(ptr %ptr, i128 %value) {
4085; -O0-LABEL: atomicrmw_max_i128_aligned_acquire:
4086; -O0:    subs x9, x9, x12
4087; -O0:    subs x11, x11, x10
4088; -O0:    subs x13, x13, x10
4089; -O0:    csel w11, w9, w11, eq
4090; -O0:    ands w13, w11, #0x1
4091; -O0:    csel x2, x9, x12, ne
4092; -O0:    ands w11, w11, #0x1
4093; -O0:    csel x9, x9, x10, ne
4094; -O0:    caspa x0, x1, x2, x3, [x8]
4095; -O0:    eor x8, x10, x8
4096; -O0:    eor x11, x9, x11
4097; -O0:    orr x8, x8, x11
4098; -O0:    subs x8, x8, #0
4099;
4100; -O1-LABEL: atomicrmw_max_i128_aligned_acquire:
4101; -O1:    ldp x4, x5, [x0]
4102; -O1:    cmp x2, x4
4103; -O1:    csel x9, x7, x3, lt
4104; -O1:    csel x8, x4, x2, lt
4105; -O1:    caspa x4, x5, x8, x9, [x0]
4106; -O1:    cmp x5, x7
4107; -O1:    ccmp x4, x6, #0, eq
4108    %r = atomicrmw max ptr %ptr, i128 %value acquire, align 16
4109    ret i128 %r
4110}
4111
4112define dso_local i128 @atomicrmw_max_i128_aligned_release(ptr %ptr, i128 %value) {
4113; -O0-LABEL: atomicrmw_max_i128_aligned_release:
4114; -O0:    subs x9, x9, x12
4115; -O0:    subs x11, x11, x10
4116; -O0:    subs x13, x13, x10
4117; -O0:    csel w11, w9, w11, eq
4118; -O0:    ands w13, w11, #0x1
4119; -O0:    csel x2, x9, x12, ne
4120; -O0:    ands w11, w11, #0x1
4121; -O0:    csel x9, x9, x10, ne
4122; -O0:    caspl x0, x1, x2, x3, [x8]
4123; -O0:    eor x8, x10, x8
4124; -O0:    eor x11, x9, x11
4125; -O0:    orr x8, x8, x11
4126; -O0:    subs x8, x8, #0
4127;
4128; -O1-LABEL: atomicrmw_max_i128_aligned_release:
4129; -O1:    ldp x4, x5, [x0]
4130; -O1:    cmp x2, x4
4131; -O1:    csel x9, x7, x3, lt
4132; -O1:    csel x8, x4, x2, lt
4133; -O1:    caspl x4, x5, x8, x9, [x0]
4134; -O1:    cmp x5, x7
4135; -O1:    ccmp x4, x6, #0, eq
4136    %r = atomicrmw max ptr %ptr, i128 %value release, align 16
4137    ret i128 %r
4138}
4139
4140define dso_local i128 @atomicrmw_max_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
4141; -O0-LABEL: atomicrmw_max_i128_aligned_acq_rel:
4142; -O0:    subs x9, x9, x12
4143; -O0:    subs x11, x11, x10
4144; -O0:    subs x13, x13, x10
4145; -O0:    csel w11, w9, w11, eq
4146; -O0:    ands w13, w11, #0x1
4147; -O0:    csel x2, x9, x12, ne
4148; -O0:    ands w11, w11, #0x1
4149; -O0:    csel x9, x9, x10, ne
4150; -O0:    caspal x0, x1, x2, x3, [x8]
4151; -O0:    eor x8, x10, x8
4152; -O0:    eor x11, x9, x11
4153; -O0:    orr x8, x8, x11
4154; -O0:    subs x8, x8, #0
4155;
4156; -O1-LABEL: atomicrmw_max_i128_aligned_acq_rel:
4157; -O1:    ldp x4, x5, [x0]
4158; -O1:    cmp x2, x4
4159; -O1:    csel x9, x7, x3, lt
4160; -O1:    csel x8, x4, x2, lt
4161; -O1:    caspal x4, x5, x8, x9, [x0]
4162; -O1:    cmp x5, x7
4163; -O1:    ccmp x4, x6, #0, eq
4164    %r = atomicrmw max ptr %ptr, i128 %value acq_rel, align 16
4165    ret i128 %r
4166}
4167
4168define dso_local i128 @atomicrmw_max_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
4169; -O0-LABEL: atomicrmw_max_i128_aligned_seq_cst:
4170; -O0:    subs x9, x9, x12
4171; -O0:    subs x11, x11, x10
4172; -O0:    subs x13, x13, x10
4173; -O0:    csel w11, w9, w11, eq
4174; -O0:    ands w13, w11, #0x1
4175; -O0:    csel x2, x9, x12, ne
4176; -O0:    ands w11, w11, #0x1
4177; -O0:    csel x9, x9, x10, ne
4178; -O0:    caspal x0, x1, x2, x3, [x8]
4179; -O0:    eor x8, x10, x8
4180; -O0:    eor x11, x9, x11
4181; -O0:    orr x8, x8, x11
4182; -O0:    subs x8, x8, #0
4183;
4184; -O1-LABEL: atomicrmw_max_i128_aligned_seq_cst:
4185; -O1:    ldp x4, x5, [x0]
4186; -O1:    cmp x2, x4
4187; -O1:    csel x9, x7, x3, lt
4188; -O1:    csel x8, x4, x2, lt
4189; -O1:    caspal x4, x5, x8, x9, [x0]
4190; -O1:    cmp x5, x7
4191; -O1:    ccmp x4, x6, #0, eq
4192    %r = atomicrmw max ptr %ptr, i128 %value seq_cst, align 16
4193    ret i128 %r
4194}
4195
4196define dso_local i8 @atomicrmw_max_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
4197; CHECK-LABEL: atomicrmw_max_i8_unaligned_monotonic:
4198; CHECK:    ldsmaxb w1, w0, [x0]
4199    %r = atomicrmw max ptr %ptr, i8 %value monotonic, align 1
4200    ret i8 %r
4201}
4202
4203define dso_local i8 @atomicrmw_max_i8_unaligned_acquire(ptr %ptr, i8 %value) {
4204; CHECK-LABEL: atomicrmw_max_i8_unaligned_acquire:
4205; CHECK:    ldsmaxab w1, w0, [x0]
4206    %r = atomicrmw max ptr %ptr, i8 %value acquire, align 1
4207    ret i8 %r
4208}
4209
4210define dso_local i8 @atomicrmw_max_i8_unaligned_release(ptr %ptr, i8 %value) {
4211; CHECK-LABEL: atomicrmw_max_i8_unaligned_release:
4212; CHECK:    ldsmaxlb w1, w0, [x0]
4213    %r = atomicrmw max ptr %ptr, i8 %value release, align 1
4214    ret i8 %r
4215}
4216
4217define dso_local i8 @atomicrmw_max_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
4218; CHECK-LABEL: atomicrmw_max_i8_unaligned_acq_rel:
4219; CHECK:    ldsmaxalb w1, w0, [x0]
4220    %r = atomicrmw max ptr %ptr, i8 %value acq_rel, align 1
4221    ret i8 %r
4222}
4223
4224define dso_local i8 @atomicrmw_max_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
4225; CHECK-LABEL: atomicrmw_max_i8_unaligned_seq_cst:
4226; CHECK:    ldsmaxalb w1, w0, [x0]
4227    %r = atomicrmw max ptr %ptr, i8 %value seq_cst, align 1
4228    ret i8 %r
4229}
4230
4231define dso_local i16 @atomicrmw_max_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
4232; -O0-LABEL: atomicrmw_max_i16_unaligned_monotonic:
4233; -O0:    sxth w10, w9
4234; -O0:    subs w10, w10, w8, sxth
4235; -O0:    csel w8, w9, w8, gt
4236; -O0:    bl __atomic_compare_exchange
4237;
4238; -O1-LABEL: atomicrmw_max_i16_unaligned_monotonic:
4239; -O1:    sxth w8, w0
4240; -O1:    cmp w8, w20, sxth
4241; -O1:    csel w8, w0, w20, gt
4242; -O1:    bl __atomic_compare_exchange
4243    %r = atomicrmw max ptr %ptr, i16 %value monotonic, align 1
4244    ret i16 %r
4245}
4246
4247define dso_local i16 @atomicrmw_max_i16_unaligned_acquire(ptr %ptr, i16 %value) {
4248; -O0-LABEL: atomicrmw_max_i16_unaligned_acquire:
4249; -O0:    sxth w10, w9
4250; -O0:    subs w10, w10, w8, sxth
4251; -O0:    csel w8, w9, w8, gt
4252; -O0:    bl __atomic_compare_exchange
4253;
4254; -O1-LABEL: atomicrmw_max_i16_unaligned_acquire:
4255; -O1:    sxth w8, w0
4256; -O1:    cmp w8, w20, sxth
4257; -O1:    csel w8, w0, w20, gt
4258; -O1:    bl __atomic_compare_exchange
4259    %r = atomicrmw max ptr %ptr, i16 %value acquire, align 1
4260    ret i16 %r
4261}
4262
4263define dso_local i16 @atomicrmw_max_i16_unaligned_release(ptr %ptr, i16 %value) {
4264; -O0-LABEL: atomicrmw_max_i16_unaligned_release:
4265; -O0:    sxth w10, w9
4266; -O0:    subs w10, w10, w8, sxth
4267; -O0:    csel w8, w9, w8, gt
4268; -O0:    bl __atomic_compare_exchange
4269;
4270; -O1-LABEL: atomicrmw_max_i16_unaligned_release:
4271; -O1:    sxth w8, w0
4272; -O1:    cmp w8, w20, sxth
4273; -O1:    csel w8, w0, w20, gt
4274; -O1:    bl __atomic_compare_exchange
4275    %r = atomicrmw max ptr %ptr, i16 %value release, align 1
4276    ret i16 %r
4277}
4278
4279define dso_local i16 @atomicrmw_max_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
4280; -O0-LABEL: atomicrmw_max_i16_unaligned_acq_rel:
4281; -O0:    sxth w10, w9
4282; -O0:    subs w10, w10, w8, sxth
4283; -O0:    csel w8, w9, w8, gt
4284; -O0:    bl __atomic_compare_exchange
4285;
4286; -O1-LABEL: atomicrmw_max_i16_unaligned_acq_rel:
4287; -O1:    sxth w8, w0
4288; -O1:    cmp w8, w20, sxth
4289; -O1:    csel w8, w0, w20, gt
4290; -O1:    bl __atomic_compare_exchange
4291    %r = atomicrmw max ptr %ptr, i16 %value acq_rel, align 1
4292    ret i16 %r
4293}
4294
4295define dso_local i16 @atomicrmw_max_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
4296; -O0-LABEL: atomicrmw_max_i16_unaligned_seq_cst:
4297; -O0:    sxth w10, w9
4298; -O0:    subs w10, w10, w8, sxth
4299; -O0:    csel w8, w9, w8, gt
4300; -O0:    bl __atomic_compare_exchange
4301;
4302; -O1-LABEL: atomicrmw_max_i16_unaligned_seq_cst:
4303; -O1:    sxth w8, w0
4304; -O1:    cmp w8, w20, sxth
4305; -O1:    csel w8, w0, w20, gt
4306; -O1:    bl __atomic_compare_exchange
4307    %r = atomicrmw max ptr %ptr, i16 %value seq_cst, align 1
4308    ret i16 %r
4309}
4310
4311define dso_local i32 @atomicrmw_max_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
4312; -O0-LABEL: atomicrmw_max_i32_unaligned_monotonic:
4313; -O0:    subs w10, w9, w8
4314; -O0:    csel w8, w9, w8, gt
4315; -O0:    bl __atomic_compare_exchange
4316;
4317; -O1-LABEL: atomicrmw_max_i32_unaligned_monotonic:
4318; -O1:    cmp w0, w20
4319; -O1:    csel w8, w0, w20, gt
4320; -O1:    bl __atomic_compare_exchange
4321    %r = atomicrmw max ptr %ptr, i32 %value monotonic, align 1
4322    ret i32 %r
4323}
4324
4325define dso_local i32 @atomicrmw_max_i32_unaligned_acquire(ptr %ptr, i32 %value) {
4326; -O0-LABEL: atomicrmw_max_i32_unaligned_acquire:
4327; -O0:    subs w10, w9, w8
4328; -O0:    csel w8, w9, w8, gt
4329; -O0:    bl __atomic_compare_exchange
4330;
4331; -O1-LABEL: atomicrmw_max_i32_unaligned_acquire:
4332; -O1:    cmp w0, w20
4333; -O1:    csel w8, w0, w20, gt
4334; -O1:    bl __atomic_compare_exchange
4335    %r = atomicrmw max ptr %ptr, i32 %value acquire, align 1
4336    ret i32 %r
4337}
4338
4339define dso_local i32 @atomicrmw_max_i32_unaligned_release(ptr %ptr, i32 %value) {
4340; -O0-LABEL: atomicrmw_max_i32_unaligned_release:
4341; -O0:    subs w10, w9, w8
4342; -O0:    csel w8, w9, w8, gt
4343; -O0:    bl __atomic_compare_exchange
4344;
4345; -O1-LABEL: atomicrmw_max_i32_unaligned_release:
4346; -O1:    cmp w0, w20
4347; -O1:    csel w8, w0, w20, gt
4348; -O1:    bl __atomic_compare_exchange
4349    %r = atomicrmw max ptr %ptr, i32 %value release, align 1
4350    ret i32 %r
4351}
4352
4353define dso_local i32 @atomicrmw_max_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
4354; -O0-LABEL: atomicrmw_max_i32_unaligned_acq_rel:
4355; -O0:    subs w10, w9, w8
4356; -O0:    csel w8, w9, w8, gt
4357; -O0:    bl __atomic_compare_exchange
4358;
4359; -O1-LABEL: atomicrmw_max_i32_unaligned_acq_rel:
4360; -O1:    cmp w0, w20
4361; -O1:    csel w8, w0, w20, gt
4362; -O1:    bl __atomic_compare_exchange
4363    %r = atomicrmw max ptr %ptr, i32 %value acq_rel, align 1
4364    ret i32 %r
4365}
4366
4367define dso_local i32 @atomicrmw_max_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
4368; -O0-LABEL: atomicrmw_max_i32_unaligned_seq_cst:
4369; -O0:    subs w10, w9, w8
4370; -O0:    csel w8, w9, w8, gt
4371; -O0:    bl __atomic_compare_exchange
4372;
4373; -O1-LABEL: atomicrmw_max_i32_unaligned_seq_cst:
4374; -O1:    cmp w0, w20
4375; -O1:    csel w8, w0, w20, gt
4376; -O1:    bl __atomic_compare_exchange
4377    %r = atomicrmw max ptr %ptr, i32 %value seq_cst, align 1
4378    ret i32 %r
4379}
4380
4381define dso_local i64 @atomicrmw_max_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
4382; -O0-LABEL: atomicrmw_max_i64_unaligned_monotonic:
4383; -O0:    subs x10, x9, x8
4384; -O0:    csel x8, x9, x8, gt
4385; -O0:    bl __atomic_compare_exchange
4386;
4387; -O1-LABEL: atomicrmw_max_i64_unaligned_monotonic:
4388; -O1:    cmp x0, x20
4389; -O1:    csel x8, x0, x20, gt
4390; -O1:    bl __atomic_compare_exchange
4391    %r = atomicrmw max ptr %ptr, i64 %value monotonic, align 1
4392    ret i64 %r
4393}
4394
4395define dso_local i64 @atomicrmw_max_i64_unaligned_acquire(ptr %ptr, i64 %value) {
4396; -O0-LABEL: atomicrmw_max_i64_unaligned_acquire:
4397; -O0:    subs x10, x9, x8
4398; -O0:    csel x8, x9, x8, gt
4399; -O0:    bl __atomic_compare_exchange
4400;
4401; -O1-LABEL: atomicrmw_max_i64_unaligned_acquire:
4402; -O1:    cmp x0, x20
4403; -O1:    csel x8, x0, x20, gt
4404; -O1:    bl __atomic_compare_exchange
4405    %r = atomicrmw max ptr %ptr, i64 %value acquire, align 1
4406    ret i64 %r
4407}
4408
4409define dso_local i64 @atomicrmw_max_i64_unaligned_release(ptr %ptr, i64 %value) {
4410; -O0-LABEL: atomicrmw_max_i64_unaligned_release:
4411; -O0:    subs x10, x9, x8
4412; -O0:    csel x8, x9, x8, gt
4413; -O0:    bl __atomic_compare_exchange
4414;
4415; -O1-LABEL: atomicrmw_max_i64_unaligned_release:
4416; -O1:    cmp x0, x20
4417; -O1:    csel x8, x0, x20, gt
4418; -O1:    bl __atomic_compare_exchange
4419    %r = atomicrmw max ptr %ptr, i64 %value release, align 1
4420    ret i64 %r
4421}
4422
4423define dso_local i64 @atomicrmw_max_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
4424; -O0-LABEL: atomicrmw_max_i64_unaligned_acq_rel:
4425; -O0:    subs x10, x9, x8
4426; -O0:    csel x8, x9, x8, gt
4427; -O0:    bl __atomic_compare_exchange
4428;
4429; -O1-LABEL: atomicrmw_max_i64_unaligned_acq_rel:
4430; -O1:    cmp x0, x20
4431; -O1:    csel x8, x0, x20, gt
4432; -O1:    bl __atomic_compare_exchange
4433    %r = atomicrmw max ptr %ptr, i64 %value acq_rel, align 1
4434    ret i64 %r
4435}
4436
4437define dso_local i64 @atomicrmw_max_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
4438; -O0-LABEL: atomicrmw_max_i64_unaligned_seq_cst:
4439; -O0:    subs x10, x9, x8
4440; -O0:    csel x8, x9, x8, gt
4441; -O0:    bl __atomic_compare_exchange
4442;
4443; -O1-LABEL: atomicrmw_max_i64_unaligned_seq_cst:
4444; -O1:    cmp x0, x20
4445; -O1:    csel x8, x0, x20, gt
4446; -O1:    bl __atomic_compare_exchange
4447    %r = atomicrmw max ptr %ptr, i64 %value seq_cst, align 1
4448    ret i64 %r
4449}
4450
4451define dso_local i128 @atomicrmw_max_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
4452; -O0-LABEL: atomicrmw_max_i128_unaligned_monotonic:
4453; -O0:    subs x8, x8, x9
4454; -O0:    subs x11, x11, x10
4455; -O0:    subs x12, x12, x10
4456; -O0:    csel w11, w8, w11, eq
4457; -O0:    ands w12, w11, #0x1
4458; -O0:    csel x9, x8, x9, ne
4459; -O0:    ands w11, w11, #0x1
4460; -O0:    csel x8, x8, x10, ne
4461; -O0:    bl __atomic_compare_exchange
4462;
4463; -O1-LABEL: atomicrmw_max_i128_unaligned_monotonic:
4464; -O1:    ldp x0, x1, [x0]
4465; -O1:    cmp x21, x0
4466; -O1:    csel x8, x1, x19, lt
4467; -O1:    csel x9, x0, x21, lt
4468; -O1:    bl __atomic_compare_exchange
4469    %r = atomicrmw max ptr %ptr, i128 %value monotonic, align 1
4470    ret i128 %r
4471}
4472
4473define dso_local i128 @atomicrmw_max_i128_unaligned_acquire(ptr %ptr, i128 %value) {
4474; -O0-LABEL: atomicrmw_max_i128_unaligned_acquire:
4475; -O0:    subs x8, x8, x9
4476; -O0:    subs x11, x11, x10
4477; -O0:    subs x12, x12, x10
4478; -O0:    csel w11, w8, w11, eq
4479; -O0:    ands w12, w11, #0x1
4480; -O0:    csel x9, x8, x9, ne
4481; -O0:    ands w11, w11, #0x1
4482; -O0:    csel x8, x8, x10, ne
4483; -O0:    bl __atomic_compare_exchange
4484;
4485; -O1-LABEL: atomicrmw_max_i128_unaligned_acquire:
4486; -O1:    ldp x0, x1, [x0]
4487; -O1:    cmp x21, x0
4488; -O1:    csel x8, x1, x19, lt
4489; -O1:    csel x9, x0, x21, lt
4490; -O1:    bl __atomic_compare_exchange
4491    %r = atomicrmw max ptr %ptr, i128 %value acquire, align 1
4492    ret i128 %r
4493}
4494
4495define dso_local i128 @atomicrmw_max_i128_unaligned_release(ptr %ptr, i128 %value) {
4496; -O0-LABEL: atomicrmw_max_i128_unaligned_release:
4497; -O0:    subs x8, x8, x9
4498; -O0:    subs x11, x11, x10
4499; -O0:    subs x12, x12, x10
4500; -O0:    csel w11, w8, w11, eq
4501; -O0:    ands w12, w11, #0x1
4502; -O0:    csel x9, x8, x9, ne
4503; -O0:    ands w11, w11, #0x1
4504; -O0:    csel x8, x8, x10, ne
4505; -O0:    bl __atomic_compare_exchange
4506;
4507; -O1-LABEL: atomicrmw_max_i128_unaligned_release:
4508; -O1:    ldp x0, x1, [x0]
4509; -O1:    cmp x21, x0
4510; -O1:    csel x8, x1, x19, lt
4511; -O1:    csel x9, x0, x21, lt
4512; -O1:    bl __atomic_compare_exchange
4513    %r = atomicrmw max ptr %ptr, i128 %value release, align 1
4514    ret i128 %r
4515}
4516
4517define dso_local i128 @atomicrmw_max_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
4518; -O0-LABEL: atomicrmw_max_i128_unaligned_acq_rel:
4519; -O0:    subs x8, x8, x9
4520; -O0:    subs x11, x11, x10
4521; -O0:    subs x12, x12, x10
4522; -O0:    csel w11, w8, w11, eq
4523; -O0:    ands w12, w11, #0x1
4524; -O0:    csel x9, x8, x9, ne
4525; -O0:    ands w11, w11, #0x1
4526; -O0:    csel x8, x8, x10, ne
4527; -O0:    bl __atomic_compare_exchange
4528;
4529; -O1-LABEL: atomicrmw_max_i128_unaligned_acq_rel:
4530; -O1:    ldp x0, x1, [x0]
4531; -O1:    cmp x21, x0
4532; -O1:    csel x8, x1, x19, lt
4533; -O1:    csel x9, x0, x21, lt
4534; -O1:    bl __atomic_compare_exchange
4535    %r = atomicrmw max ptr %ptr, i128 %value acq_rel, align 1
4536    ret i128 %r
4537}
4538
4539define dso_local i128 @atomicrmw_max_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
4540; -O0-LABEL: atomicrmw_max_i128_unaligned_seq_cst:
4541; -O0:    subs x8, x8, x9
4542; -O0:    subs x11, x11, x10
4543; -O0:    subs x12, x12, x10
4544; -O0:    csel w11, w8, w11, eq
4545; -O0:    ands w12, w11, #0x1
4546; -O0:    csel x9, x8, x9, ne
4547; -O0:    ands w11, w11, #0x1
4548; -O0:    csel x8, x8, x10, ne
4549; -O0:    bl __atomic_compare_exchange
4550;
4551; -O1-LABEL: atomicrmw_max_i128_unaligned_seq_cst:
4552; -O1:    ldp x0, x1, [x0]
4553; -O1:    cmp x21, x0
4554; -O1:    csel x8, x1, x19, lt
4555; -O1:    csel x9, x0, x21, lt
4556; -O1:    bl __atomic_compare_exchange
4557    %r = atomicrmw max ptr %ptr, i128 %value seq_cst, align 1
4558    ret i128 %r
4559}
4560
4561define dso_local i8 @atomicrmw_min_i8_aligned_monotonic(ptr %ptr, i8 %value) {
4562; CHECK-LABEL: atomicrmw_min_i8_aligned_monotonic:
4563; CHECK:    ldsminb w1, w0, [x0]
4564    %r = atomicrmw min ptr %ptr, i8 %value monotonic, align 1
4565    ret i8 %r
4566}
4567
4568define dso_local i8 @atomicrmw_min_i8_aligned_acquire(ptr %ptr, i8 %value) {
4569; CHECK-LABEL: atomicrmw_min_i8_aligned_acquire:
4570; CHECK:    ldsminab w1, w0, [x0]
4571    %r = atomicrmw min ptr %ptr, i8 %value acquire, align 1
4572    ret i8 %r
4573}
4574
4575define dso_local i8 @atomicrmw_min_i8_aligned_release(ptr %ptr, i8 %value) {
4576; CHECK-LABEL: atomicrmw_min_i8_aligned_release:
4577; CHECK:    ldsminlb w1, w0, [x0]
4578    %r = atomicrmw min ptr %ptr, i8 %value release, align 1
4579    ret i8 %r
4580}
4581
4582define dso_local i8 @atomicrmw_min_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
4583; CHECK-LABEL: atomicrmw_min_i8_aligned_acq_rel:
4584; CHECK:    ldsminalb w1, w0, [x0]
4585    %r = atomicrmw min ptr %ptr, i8 %value acq_rel, align 1
4586    ret i8 %r
4587}
4588
4589define dso_local i8 @atomicrmw_min_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
4590; CHECK-LABEL: atomicrmw_min_i8_aligned_seq_cst:
4591; CHECK:    ldsminalb w1, w0, [x0]
4592    %r = atomicrmw min ptr %ptr, i8 %value seq_cst, align 1
4593    ret i8 %r
4594}
4595
4596define dso_local i16 @atomicrmw_min_i16_aligned_monotonic(ptr %ptr, i16 %value) {
4597; CHECK-LABEL: atomicrmw_min_i16_aligned_monotonic:
4598; CHECK:    ldsminh w1, w0, [x0]
4599    %r = atomicrmw min ptr %ptr, i16 %value monotonic, align 2
4600    ret i16 %r
4601}
4602
4603define dso_local i16 @atomicrmw_min_i16_aligned_acquire(ptr %ptr, i16 %value) {
4604; CHECK-LABEL: atomicrmw_min_i16_aligned_acquire:
4605; CHECK:    ldsminah w1, w0, [x0]
4606    %r = atomicrmw min ptr %ptr, i16 %value acquire, align 2
4607    ret i16 %r
4608}
4609
4610define dso_local i16 @atomicrmw_min_i16_aligned_release(ptr %ptr, i16 %value) {
4611; CHECK-LABEL: atomicrmw_min_i16_aligned_release:
4612; CHECK:    ldsminlh w1, w0, [x0]
4613    %r = atomicrmw min ptr %ptr, i16 %value release, align 2
4614    ret i16 %r
4615}
4616
4617define dso_local i16 @atomicrmw_min_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
4618; CHECK-LABEL: atomicrmw_min_i16_aligned_acq_rel:
4619; CHECK:    ldsminalh w1, w0, [x0]
4620    %r = atomicrmw min ptr %ptr, i16 %value acq_rel, align 2
4621    ret i16 %r
4622}
4623
4624define dso_local i16 @atomicrmw_min_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
4625; CHECK-LABEL: atomicrmw_min_i16_aligned_seq_cst:
4626; CHECK:    ldsminalh w1, w0, [x0]
4627    %r = atomicrmw min ptr %ptr, i16 %value seq_cst, align 2
4628    ret i16 %r
4629}
4630
4631define dso_local i32 @atomicrmw_min_i32_aligned_monotonic(ptr %ptr, i32 %value) {
4632; CHECK-LABEL: atomicrmw_min_i32_aligned_monotonic:
4633; CHECK:    ldsmin w1, w0, [x0]
4634    %r = atomicrmw min ptr %ptr, i32 %value monotonic, align 4
4635    ret i32 %r
4636}
4637
4638define dso_local i32 @atomicrmw_min_i32_aligned_acquire(ptr %ptr, i32 %value) {
4639; CHECK-LABEL: atomicrmw_min_i32_aligned_acquire:
4640; CHECK:    ldsmina w1, w0, [x0]
4641    %r = atomicrmw min ptr %ptr, i32 %value acquire, align 4
4642    ret i32 %r
4643}
4644
4645define dso_local i32 @atomicrmw_min_i32_aligned_release(ptr %ptr, i32 %value) {
4646; CHECK-LABEL: atomicrmw_min_i32_aligned_release:
4647; CHECK:    ldsminl w1, w0, [x0]
4648    %r = atomicrmw min ptr %ptr, i32 %value release, align 4
4649    ret i32 %r
4650}
4651
4652define dso_local i32 @atomicrmw_min_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
4653; CHECK-LABEL: atomicrmw_min_i32_aligned_acq_rel:
4654; CHECK:    ldsminal w1, w0, [x0]
4655    %r = atomicrmw min ptr %ptr, i32 %value acq_rel, align 4
4656    ret i32 %r
4657}
4658
4659define dso_local i32 @atomicrmw_min_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
4660; CHECK-LABEL: atomicrmw_min_i32_aligned_seq_cst:
4661; CHECK:    ldsminal w1, w0, [x0]
4662    %r = atomicrmw min ptr %ptr, i32 %value seq_cst, align 4
4663    ret i32 %r
4664}
4665
4666define dso_local i64 @atomicrmw_min_i64_aligned_monotonic(ptr %ptr, i64 %value) {
4667; CHECK-LABEL: atomicrmw_min_i64_aligned_monotonic:
4668; CHECK:    ldsmin x1, x0, [x0]
4669    %r = atomicrmw min ptr %ptr, i64 %value monotonic, align 8
4670    ret i64 %r
4671}
4672
4673define dso_local i64 @atomicrmw_min_i64_aligned_acquire(ptr %ptr, i64 %value) {
4674; CHECK-LABEL: atomicrmw_min_i64_aligned_acquire:
4675; CHECK:    ldsmina x1, x0, [x0]
4676    %r = atomicrmw min ptr %ptr, i64 %value acquire, align 8
4677    ret i64 %r
4678}
4679
4680define dso_local i64 @atomicrmw_min_i64_aligned_release(ptr %ptr, i64 %value) {
4681; CHECK-LABEL: atomicrmw_min_i64_aligned_release:
4682; CHECK:    ldsminl x1, x0, [x0]
4683    %r = atomicrmw min ptr %ptr, i64 %value release, align 8
4684    ret i64 %r
4685}
4686
4687define dso_local i64 @atomicrmw_min_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
4688; CHECK-LABEL: atomicrmw_min_i64_aligned_acq_rel:
4689; CHECK:    ldsminal x1, x0, [x0]
4690    %r = atomicrmw min ptr %ptr, i64 %value acq_rel, align 8
4691    ret i64 %r
4692}
4693
4694define dso_local i64 @atomicrmw_min_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
4695; CHECK-LABEL: atomicrmw_min_i64_aligned_seq_cst:
4696; CHECK:    ldsminal x1, x0, [x0]
4697    %r = atomicrmw min ptr %ptr, i64 %value seq_cst, align 8
4698    ret i64 %r
4699}
4700
4701define dso_local i128 @atomicrmw_min_i128_aligned_monotonic(ptr %ptr, i128 %value) {
4702; -O0-LABEL: atomicrmw_min_i128_aligned_monotonic:
4703; -O0:    subs x9, x9, x12
4704; -O0:    subs x11, x11, x10
4705; -O0:    subs x13, x13, x10
4706; -O0:    csel w11, w9, w11, eq
4707; -O0:    ands w13, w11, #0x1
4708; -O0:    csel x2, x9, x12, ne
4709; -O0:    ands w11, w11, #0x1
4710; -O0:    csel x9, x9, x10, ne
4711; -O0:    casp x0, x1, x2, x3, [x8]
4712; -O0:    eor x8, x10, x8
4713; -O0:    eor x11, x9, x11
4714; -O0:    orr x8, x8, x11
4715; -O0:    subs x8, x8, #0
4716;
4717; -O1-LABEL: atomicrmw_min_i128_aligned_monotonic:
4718; -O1:    ldp x4, x5, [x0]
4719; -O1:    cmp x2, x4
4720; -O1:    csel x9, x7, x3, ge
4721; -O1:    csel x8, x4, x2, ge
4722; -O1:    casp x4, x5, x8, x9, [x0]
4723; -O1:    cmp x5, x7
4724; -O1:    ccmp x4, x6, #0, eq
4725    %r = atomicrmw min ptr %ptr, i128 %value monotonic, align 16
4726    ret i128 %r
4727}
4728
4729define dso_local i128 @atomicrmw_min_i128_aligned_acquire(ptr %ptr, i128 %value) {
4730; -O0-LABEL: atomicrmw_min_i128_aligned_acquire:
4731; -O0:    subs x9, x9, x12
4732; -O0:    subs x11, x11, x10
4733; -O0:    subs x13, x13, x10
4734; -O0:    csel w11, w9, w11, eq
4735; -O0:    ands w13, w11, #0x1
4736; -O0:    csel x2, x9, x12, ne
4737; -O0:    ands w11, w11, #0x1
4738; -O0:    csel x9, x9, x10, ne
4739; -O0:    caspa x0, x1, x2, x3, [x8]
4740; -O0:    eor x8, x10, x8
4741; -O0:    eor x11, x9, x11
4742; -O0:    orr x8, x8, x11
4743; -O0:    subs x8, x8, #0
4744;
4745; -O1-LABEL: atomicrmw_min_i128_aligned_acquire:
4746; -O1:    ldp x4, x5, [x0]
4747; -O1:    cmp x2, x4
4748; -O1:    csel x9, x7, x3, ge
4749; -O1:    csel x8, x4, x2, ge
4750; -O1:    caspa x4, x5, x8, x9, [x0]
4751; -O1:    cmp x5, x7
4752; -O1:    ccmp x4, x6, #0, eq
4753    %r = atomicrmw min ptr %ptr, i128 %value acquire, align 16
4754    ret i128 %r
4755}
4756
4757define dso_local i128 @atomicrmw_min_i128_aligned_release(ptr %ptr, i128 %value) {
4758; -O0-LABEL: atomicrmw_min_i128_aligned_release:
4759; -O0:    subs x9, x9, x12
4760; -O0:    subs x11, x11, x10
4761; -O0:    subs x13, x13, x10
4762; -O0:    csel w11, w9, w11, eq
4763; -O0:    ands w13, w11, #0x1
4764; -O0:    csel x2, x9, x12, ne
4765; -O0:    ands w11, w11, #0x1
4766; -O0:    csel x9, x9, x10, ne
4767; -O0:    caspl x0, x1, x2, x3, [x8]
4768; -O0:    eor x8, x10, x8
4769; -O0:    eor x11, x9, x11
4770; -O0:    orr x8, x8, x11
4771; -O0:    subs x8, x8, #0
4772;
4773; -O1-LABEL: atomicrmw_min_i128_aligned_release:
4774; -O1:    ldp x4, x5, [x0]
4775; -O1:    cmp x2, x4
4776; -O1:    csel x9, x7, x3, ge
4777; -O1:    csel x8, x4, x2, ge
4778; -O1:    caspl x4, x5, x8, x9, [x0]
4779; -O1:    cmp x5, x7
4780; -O1:    ccmp x4, x6, #0, eq
4781    %r = atomicrmw min ptr %ptr, i128 %value release, align 16
4782    ret i128 %r
4783}
4784
4785define dso_local i128 @atomicrmw_min_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
4786; -O0-LABEL: atomicrmw_min_i128_aligned_acq_rel:
4787; -O0:    subs x9, x9, x12
4788; -O0:    subs x11, x11, x10
4789; -O0:    subs x13, x13, x10
4790; -O0:    csel w11, w9, w11, eq
4791; -O0:    ands w13, w11, #0x1
4792; -O0:    csel x2, x9, x12, ne
4793; -O0:    ands w11, w11, #0x1
4794; -O0:    csel x9, x9, x10, ne
4795; -O0:    caspal x0, x1, x2, x3, [x8]
4796; -O0:    eor x8, x10, x8
4797; -O0:    eor x11, x9, x11
4798; -O0:    orr x8, x8, x11
4799; -O0:    subs x8, x8, #0
4800;
4801; -O1-LABEL: atomicrmw_min_i128_aligned_acq_rel:
4802; -O1:    ldp x4, x5, [x0]
4803; -O1:    cmp x2, x4
4804; -O1:    csel x9, x7, x3, ge
4805; -O1:    csel x8, x4, x2, ge
4806; -O1:    caspal x4, x5, x8, x9, [x0]
4807; -O1:    cmp x5, x7
4808; -O1:    ccmp x4, x6, #0, eq
4809    %r = atomicrmw min ptr %ptr, i128 %value acq_rel, align 16
4810    ret i128 %r
4811}
4812
4813define dso_local i128 @atomicrmw_min_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
4814; -O0-LABEL: atomicrmw_min_i128_aligned_seq_cst:
4815; -O0:    subs x9, x9, x12
4816; -O0:    subs x11, x11, x10
4817; -O0:    subs x13, x13, x10
4818; -O0:    csel w11, w9, w11, eq
4819; -O0:    ands w13, w11, #0x1
4820; -O0:    csel x2, x9, x12, ne
4821; -O0:    ands w11, w11, #0x1
4822; -O0:    csel x9, x9, x10, ne
4823; -O0:    caspal x0, x1, x2, x3, [x8]
4824; -O0:    eor x8, x10, x8
4825; -O0:    eor x11, x9, x11
4826; -O0:    orr x8, x8, x11
4827; -O0:    subs x8, x8, #0
4828;
4829; -O1-LABEL: atomicrmw_min_i128_aligned_seq_cst:
4830; -O1:    ldp x4, x5, [x0]
4831; -O1:    cmp x2, x4
4832; -O1:    csel x9, x7, x3, ge
4833; -O1:    csel x8, x4, x2, ge
4834; -O1:    caspal x4, x5, x8, x9, [x0]
4835; -O1:    cmp x5, x7
4836; -O1:    ccmp x4, x6, #0, eq
4837    %r = atomicrmw min ptr %ptr, i128 %value seq_cst, align 16
4838    ret i128 %r
4839}
4840
4841define dso_local i8 @atomicrmw_min_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
4842; CHECK-LABEL: atomicrmw_min_i8_unaligned_monotonic:
4843; CHECK:    ldsminb w1, w0, [x0]
4844    %r = atomicrmw min ptr %ptr, i8 %value monotonic, align 1
4845    ret i8 %r
4846}
4847
4848define dso_local i8 @atomicrmw_min_i8_unaligned_acquire(ptr %ptr, i8 %value) {
4849; CHECK-LABEL: atomicrmw_min_i8_unaligned_acquire:
4850; CHECK:    ldsminab w1, w0, [x0]
4851    %r = atomicrmw min ptr %ptr, i8 %value acquire, align 1
4852    ret i8 %r
4853}
4854
4855define dso_local i8 @atomicrmw_min_i8_unaligned_release(ptr %ptr, i8 %value) {
4856; CHECK-LABEL: atomicrmw_min_i8_unaligned_release:
4857; CHECK:    ldsminlb w1, w0, [x0]
4858    %r = atomicrmw min ptr %ptr, i8 %value release, align 1
4859    ret i8 %r
4860}
4861
4862define dso_local i8 @atomicrmw_min_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
4863; CHECK-LABEL: atomicrmw_min_i8_unaligned_acq_rel:
4864; CHECK:    ldsminalb w1, w0, [x0]
4865    %r = atomicrmw min ptr %ptr, i8 %value acq_rel, align 1
4866    ret i8 %r
4867}
4868
4869define dso_local i8 @atomicrmw_min_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
4870; CHECK-LABEL: atomicrmw_min_i8_unaligned_seq_cst:
4871; CHECK:    ldsminalb w1, w0, [x0]
4872    %r = atomicrmw min ptr %ptr, i8 %value seq_cst, align 1
4873    ret i8 %r
4874}
4875
4876define dso_local i16 @atomicrmw_min_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
4877; -O0-LABEL: atomicrmw_min_i16_unaligned_monotonic:
4878; -O0:    sxth w10, w9
4879; -O0:    subs w10, w10, w8, sxth
4880; -O0:    csel w8, w9, w8, le
4881; -O0:    bl __atomic_compare_exchange
4882;
4883; -O1-LABEL: atomicrmw_min_i16_unaligned_monotonic:
4884; -O1:    sxth w8, w0
4885; -O1:    cmp w8, w20, sxth
4886; -O1:    csel w8, w0, w20, le
4887; -O1:    bl __atomic_compare_exchange
4888    %r = atomicrmw min ptr %ptr, i16 %value monotonic, align 1
4889    ret i16 %r
4890}
4891
4892define dso_local i16 @atomicrmw_min_i16_unaligned_acquire(ptr %ptr, i16 %value) {
4893; -O0-LABEL: atomicrmw_min_i16_unaligned_acquire:
4894; -O0:    sxth w10, w9
4895; -O0:    subs w10, w10, w8, sxth
4896; -O0:    csel w8, w9, w8, le
4897; -O0:    bl __atomic_compare_exchange
4898;
4899; -O1-LABEL: atomicrmw_min_i16_unaligned_acquire:
4900; -O1:    sxth w8, w0
4901; -O1:    cmp w8, w20, sxth
4902; -O1:    csel w8, w0, w20, le
4903; -O1:    bl __atomic_compare_exchange
4904    %r = atomicrmw min ptr %ptr, i16 %value acquire, align 1
4905    ret i16 %r
4906}
4907
4908define dso_local i16 @atomicrmw_min_i16_unaligned_release(ptr %ptr, i16 %value) {
4909; -O0-LABEL: atomicrmw_min_i16_unaligned_release:
4910; -O0:    sxth w10, w9
4911; -O0:    subs w10, w10, w8, sxth
4912; -O0:    csel w8, w9, w8, le
4913; -O0:    bl __atomic_compare_exchange
4914;
4915; -O1-LABEL: atomicrmw_min_i16_unaligned_release:
4916; -O1:    sxth w8, w0
4917; -O1:    cmp w8, w20, sxth
4918; -O1:    csel w8, w0, w20, le
4919; -O1:    bl __atomic_compare_exchange
4920    %r = atomicrmw min ptr %ptr, i16 %value release, align 1
4921    ret i16 %r
4922}
4923
4924define dso_local i16 @atomicrmw_min_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
4925; -O0-LABEL: atomicrmw_min_i16_unaligned_acq_rel:
4926; -O0:    sxth w10, w9
4927; -O0:    subs w10, w10, w8, sxth
4928; -O0:    csel w8, w9, w8, le
4929; -O0:    bl __atomic_compare_exchange
4930;
4931; -O1-LABEL: atomicrmw_min_i16_unaligned_acq_rel:
4932; -O1:    sxth w8, w0
4933; -O1:    cmp w8, w20, sxth
4934; -O1:    csel w8, w0, w20, le
4935; -O1:    bl __atomic_compare_exchange
4936    %r = atomicrmw min ptr %ptr, i16 %value acq_rel, align 1
4937    ret i16 %r
4938}
4939
4940define dso_local i16 @atomicrmw_min_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
4941; -O0-LABEL: atomicrmw_min_i16_unaligned_seq_cst:
4942; -O0:    sxth w10, w9
4943; -O0:    subs w10, w10, w8, sxth
4944; -O0:    csel w8, w9, w8, le
4945; -O0:    bl __atomic_compare_exchange
4946;
4947; -O1-LABEL: atomicrmw_min_i16_unaligned_seq_cst:
4948; -O1:    sxth w8, w0
4949; -O1:    cmp w8, w20, sxth
4950; -O1:    csel w8, w0, w20, le
4951; -O1:    bl __atomic_compare_exchange
4952    %r = atomicrmw min ptr %ptr, i16 %value seq_cst, align 1
4953    ret i16 %r
4954}
4955
4956define dso_local i32 @atomicrmw_min_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
4957; -O0-LABEL: atomicrmw_min_i32_unaligned_monotonic:
4958; -O0:    subs w10, w9, w8
4959; -O0:    csel w8, w9, w8, le
4960; -O0:    bl __atomic_compare_exchange
4961;
4962; -O1-LABEL: atomicrmw_min_i32_unaligned_monotonic:
4963; -O1:    cmp w0, w20
4964; -O1:    csel w8, w0, w20, le
4965; -O1:    bl __atomic_compare_exchange
4966    %r = atomicrmw min ptr %ptr, i32 %value monotonic, align 1
4967    ret i32 %r
4968}
4969
4970define dso_local i32 @atomicrmw_min_i32_unaligned_acquire(ptr %ptr, i32 %value) {
4971; -O0-LABEL: atomicrmw_min_i32_unaligned_acquire:
4972; -O0:    subs w10, w9, w8
4973; -O0:    csel w8, w9, w8, le
4974; -O0:    bl __atomic_compare_exchange
4975;
4976; -O1-LABEL: atomicrmw_min_i32_unaligned_acquire:
4977; -O1:    cmp w0, w20
4978; -O1:    csel w8, w0, w20, le
4979; -O1:    bl __atomic_compare_exchange
4980    %r = atomicrmw min ptr %ptr, i32 %value acquire, align 1
4981    ret i32 %r
4982}
4983
4984define dso_local i32 @atomicrmw_min_i32_unaligned_release(ptr %ptr, i32 %value) {
4985; -O0-LABEL: atomicrmw_min_i32_unaligned_release:
4986; -O0:    subs w10, w9, w8
4987; -O0:    csel w8, w9, w8, le
4988; -O0:    bl __atomic_compare_exchange
4989;
4990; -O1-LABEL: atomicrmw_min_i32_unaligned_release:
4991; -O1:    cmp w0, w20
4992; -O1:    csel w8, w0, w20, le
4993; -O1:    bl __atomic_compare_exchange
4994    %r = atomicrmw min ptr %ptr, i32 %value release, align 1
4995    ret i32 %r
4996}
4997
4998define dso_local i32 @atomicrmw_min_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
4999; -O0-LABEL: atomicrmw_min_i32_unaligned_acq_rel:
5000; -O0:    subs w10, w9, w8
5001; -O0:    csel w8, w9, w8, le
5002; -O0:    bl __atomic_compare_exchange
5003;
5004; -O1-LABEL: atomicrmw_min_i32_unaligned_acq_rel:
5005; -O1:    cmp w0, w20
5006; -O1:    csel w8, w0, w20, le
5007; -O1:    bl __atomic_compare_exchange
5008    %r = atomicrmw min ptr %ptr, i32 %value acq_rel, align 1
5009    ret i32 %r
5010}
5011
5012define dso_local i32 @atomicrmw_min_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
5013; -O0-LABEL: atomicrmw_min_i32_unaligned_seq_cst:
5014; -O0:    subs w10, w9, w8
5015; -O0:    csel w8, w9, w8, le
5016; -O0:    bl __atomic_compare_exchange
5017;
5018; -O1-LABEL: atomicrmw_min_i32_unaligned_seq_cst:
5019; -O1:    cmp w0, w20
5020; -O1:    csel w8, w0, w20, le
5021; -O1:    bl __atomic_compare_exchange
5022    %r = atomicrmw min ptr %ptr, i32 %value seq_cst, align 1
5023    ret i32 %r
5024}
5025
5026define dso_local i64 @atomicrmw_min_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
5027; -O0-LABEL: atomicrmw_min_i64_unaligned_monotonic:
5028; -O0:    subs x10, x9, x8
5029; -O0:    csel x8, x9, x8, le
5030; -O0:    bl __atomic_compare_exchange
5031;
5032; -O1-LABEL: atomicrmw_min_i64_unaligned_monotonic:
5033; -O1:    cmp x0, x20
5034; -O1:    csel x8, x0, x20, le
5035; -O1:    bl __atomic_compare_exchange
5036    %r = atomicrmw min ptr %ptr, i64 %value monotonic, align 1
5037    ret i64 %r
5038}
5039
5040define dso_local i64 @atomicrmw_min_i64_unaligned_acquire(ptr %ptr, i64 %value) {
5041; -O0-LABEL: atomicrmw_min_i64_unaligned_acquire:
5042; -O0:    subs x10, x9, x8
5043; -O0:    csel x8, x9, x8, le
5044; -O0:    bl __atomic_compare_exchange
5045;
5046; -O1-LABEL: atomicrmw_min_i64_unaligned_acquire:
5047; -O1:    cmp x0, x20
5048; -O1:    csel x8, x0, x20, le
5049; -O1:    bl __atomic_compare_exchange
5050    %r = atomicrmw min ptr %ptr, i64 %value acquire, align 1
5051    ret i64 %r
5052}
5053
5054define dso_local i64 @atomicrmw_min_i64_unaligned_release(ptr %ptr, i64 %value) {
5055; -O0-LABEL: atomicrmw_min_i64_unaligned_release:
5056; -O0:    subs x10, x9, x8
5057; -O0:    csel x8, x9, x8, le
5058; -O0:    bl __atomic_compare_exchange
5059;
5060; -O1-LABEL: atomicrmw_min_i64_unaligned_release:
5061; -O1:    cmp x0, x20
5062; -O1:    csel x8, x0, x20, le
5063; -O1:    bl __atomic_compare_exchange
5064    %r = atomicrmw min ptr %ptr, i64 %value release, align 1
5065    ret i64 %r
5066}
5067
5068define dso_local i64 @atomicrmw_min_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
5069; -O0-LABEL: atomicrmw_min_i64_unaligned_acq_rel:
5070; -O0:    subs x10, x9, x8
5071; -O0:    csel x8, x9, x8, le
5072; -O0:    bl __atomic_compare_exchange
5073;
5074; -O1-LABEL: atomicrmw_min_i64_unaligned_acq_rel:
5075; -O1:    cmp x0, x20
5076; -O1:    csel x8, x0, x20, le
5077; -O1:    bl __atomic_compare_exchange
5078    %r = atomicrmw min ptr %ptr, i64 %value acq_rel, align 1
5079    ret i64 %r
5080}
5081
5082define dso_local i64 @atomicrmw_min_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
5083; -O0-LABEL: atomicrmw_min_i64_unaligned_seq_cst:
5084; -O0:    subs x10, x9, x8
5085; -O0:    csel x8, x9, x8, le
5086; -O0:    bl __atomic_compare_exchange
5087;
5088; -O1-LABEL: atomicrmw_min_i64_unaligned_seq_cst:
5089; -O1:    cmp x0, x20
5090; -O1:    csel x8, x0, x20, le
5091; -O1:    bl __atomic_compare_exchange
5092    %r = atomicrmw min ptr %ptr, i64 %value seq_cst, align 1
5093    ret i64 %r
5094}
5095
5096define dso_local i128 @atomicrmw_min_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
5097; -O0-LABEL: atomicrmw_min_i128_unaligned_monotonic:
5098; -O0:    subs x8, x8, x9
5099; -O0:    subs x11, x11, x10
5100; -O0:    subs x12, x12, x10
5101; -O0:    csel w11, w8, w11, eq
5102; -O0:    ands w12, w11, #0x1
5103; -O0:    csel x9, x8, x9, ne
5104; -O0:    ands w11, w11, #0x1
5105; -O0:    csel x8, x8, x10, ne
5106; -O0:    bl __atomic_compare_exchange
5107;
5108; -O1-LABEL: atomicrmw_min_i128_unaligned_monotonic:
5109; -O1:    ldp x0, x1, [x0]
5110; -O1:    cmp x21, x0
5111; -O1:    csel x8, x1, x19, ge
5112; -O1:    csel x9, x0, x21, ge
5113; -O1:    bl __atomic_compare_exchange
5114    %r = atomicrmw min ptr %ptr, i128 %value monotonic, align 1
5115    ret i128 %r
5116}
5117
5118define dso_local i128 @atomicrmw_min_i128_unaligned_acquire(ptr %ptr, i128 %value) {
5119; -O0-LABEL: atomicrmw_min_i128_unaligned_acquire:
5120; -O0:    subs x8, x8, x9
5121; -O0:    subs x11, x11, x10
5122; -O0:    subs x12, x12, x10
5123; -O0:    csel w11, w8, w11, eq
5124; -O0:    ands w12, w11, #0x1
5125; -O0:    csel x9, x8, x9, ne
5126; -O0:    ands w11, w11, #0x1
5127; -O0:    csel x8, x8, x10, ne
5128; -O0:    bl __atomic_compare_exchange
5129;
5130; -O1-LABEL: atomicrmw_min_i128_unaligned_acquire:
5131; -O1:    ldp x0, x1, [x0]
5132; -O1:    cmp x21, x0
5133; -O1:    csel x8, x1, x19, ge
5134; -O1:    csel x9, x0, x21, ge
5135; -O1:    bl __atomic_compare_exchange
5136    %r = atomicrmw min ptr %ptr, i128 %value acquire, align 1
5137    ret i128 %r
5138}
5139
5140define dso_local i128 @atomicrmw_min_i128_unaligned_release(ptr %ptr, i128 %value) {
5141; -O0-LABEL: atomicrmw_min_i128_unaligned_release:
5142; -O0:    subs x8, x8, x9
5143; -O0:    subs x11, x11, x10
5144; -O0:    subs x12, x12, x10
5145; -O0:    csel w11, w8, w11, eq
5146; -O0:    ands w12, w11, #0x1
5147; -O0:    csel x9, x8, x9, ne
5148; -O0:    ands w11, w11, #0x1
5149; -O0:    csel x8, x8, x10, ne
5150; -O0:    bl __atomic_compare_exchange
5151;
5152; -O1-LABEL: atomicrmw_min_i128_unaligned_release:
5153; -O1:    ldp x0, x1, [x0]
5154; -O1:    cmp x21, x0
5155; -O1:    csel x8, x1, x19, ge
5156; -O1:    csel x9, x0, x21, ge
5157; -O1:    bl __atomic_compare_exchange
5158    %r = atomicrmw min ptr %ptr, i128 %value release, align 1
5159    ret i128 %r
5160}
5161
5162define dso_local i128 @atomicrmw_min_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
5163; -O0-LABEL: atomicrmw_min_i128_unaligned_acq_rel:
5164; -O0:    subs x8, x8, x9
5165; -O0:    subs x11, x11, x10
5166; -O0:    subs x12, x12, x10
5167; -O0:    csel w11, w8, w11, eq
5168; -O0:    ands w12, w11, #0x1
5169; -O0:    csel x9, x8, x9, ne
5170; -O0:    ands w11, w11, #0x1
5171; -O0:    csel x8, x8, x10, ne
5172; -O0:    bl __atomic_compare_exchange
5173;
5174; -O1-LABEL: atomicrmw_min_i128_unaligned_acq_rel:
5175; -O1:    ldp x0, x1, [x0]
5176; -O1:    cmp x21, x0
5177; -O1:    csel x8, x1, x19, ge
5178; -O1:    csel x9, x0, x21, ge
5179; -O1:    bl __atomic_compare_exchange
5180    %r = atomicrmw min ptr %ptr, i128 %value acq_rel, align 1
5181    ret i128 %r
5182}
5183
5184define dso_local i128 @atomicrmw_min_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
5185; -O0-LABEL: atomicrmw_min_i128_unaligned_seq_cst:
5186; -O0:    subs x8, x8, x9
5187; -O0:    subs x11, x11, x10
5188; -O0:    subs x12, x12, x10
5189; -O0:    csel w11, w8, w11, eq
5190; -O0:    ands w12, w11, #0x1
5191; -O0:    csel x9, x8, x9, ne
5192; -O0:    ands w11, w11, #0x1
5193; -O0:    csel x8, x8, x10, ne
5194; -O0:    bl __atomic_compare_exchange
5195;
5196; -O1-LABEL: atomicrmw_min_i128_unaligned_seq_cst:
5197; -O1:    ldp x0, x1, [x0]
5198; -O1:    cmp x21, x0
5199; -O1:    csel x8, x1, x19, ge
5200; -O1:    csel x9, x0, x21, ge
5201; -O1:    bl __atomic_compare_exchange
5202    %r = atomicrmw min ptr %ptr, i128 %value seq_cst, align 1
5203    ret i128 %r
5204}
5205
5206define dso_local i8 @atomicrmw_umax_i8_aligned_monotonic(ptr %ptr, i8 %value) {
5207; CHECK-LABEL: atomicrmw_umax_i8_aligned_monotonic:
5208; CHECK:    ldumaxb w1, w0, [x0]
5209    %r = atomicrmw umax ptr %ptr, i8 %value monotonic, align 1
5210    ret i8 %r
5211}
5212
5213define dso_local i8 @atomicrmw_umax_i8_aligned_acquire(ptr %ptr, i8 %value) {
5214; CHECK-LABEL: atomicrmw_umax_i8_aligned_acquire:
5215; CHECK:    ldumaxab w1, w0, [x0]
5216    %r = atomicrmw umax ptr %ptr, i8 %value acquire, align 1
5217    ret i8 %r
5218}
5219
5220define dso_local i8 @atomicrmw_umax_i8_aligned_release(ptr %ptr, i8 %value) {
5221; CHECK-LABEL: atomicrmw_umax_i8_aligned_release:
5222; CHECK:    ldumaxlb w1, w0, [x0]
5223    %r = atomicrmw umax ptr %ptr, i8 %value release, align 1
5224    ret i8 %r
5225}
5226
5227define dso_local i8 @atomicrmw_umax_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
5228; CHECK-LABEL: atomicrmw_umax_i8_aligned_acq_rel:
5229; CHECK:    ldumaxalb w1, w0, [x0]
5230    %r = atomicrmw umax ptr %ptr, i8 %value acq_rel, align 1
5231    ret i8 %r
5232}
5233
5234define dso_local i8 @atomicrmw_umax_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
5235; CHECK-LABEL: atomicrmw_umax_i8_aligned_seq_cst:
5236; CHECK:    ldumaxalb w1, w0, [x0]
5237    %r = atomicrmw umax ptr %ptr, i8 %value seq_cst, align 1
5238    ret i8 %r
5239}
5240
5241define dso_local i16 @atomicrmw_umax_i16_aligned_monotonic(ptr %ptr, i16 %value) {
5242; CHECK-LABEL: atomicrmw_umax_i16_aligned_monotonic:
5243; CHECK:    ldumaxh w1, w0, [x0]
5244    %r = atomicrmw umax ptr %ptr, i16 %value monotonic, align 2
5245    ret i16 %r
5246}
5247
5248define dso_local i16 @atomicrmw_umax_i16_aligned_acquire(ptr %ptr, i16 %value) {
5249; CHECK-LABEL: atomicrmw_umax_i16_aligned_acquire:
5250; CHECK:    ldumaxah w1, w0, [x0]
5251    %r = atomicrmw umax ptr %ptr, i16 %value acquire, align 2
5252    ret i16 %r
5253}
5254
5255define dso_local i16 @atomicrmw_umax_i16_aligned_release(ptr %ptr, i16 %value) {
5256; CHECK-LABEL: atomicrmw_umax_i16_aligned_release:
5257; CHECK:    ldumaxlh w1, w0, [x0]
5258    %r = atomicrmw umax ptr %ptr, i16 %value release, align 2
5259    ret i16 %r
5260}
5261
5262define dso_local i16 @atomicrmw_umax_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
5263; CHECK-LABEL: atomicrmw_umax_i16_aligned_acq_rel:
5264; CHECK:    ldumaxalh w1, w0, [x0]
5265    %r = atomicrmw umax ptr %ptr, i16 %value acq_rel, align 2
5266    ret i16 %r
5267}
5268
5269define dso_local i16 @atomicrmw_umax_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
5270; CHECK-LABEL: atomicrmw_umax_i16_aligned_seq_cst:
5271; CHECK:    ldumaxalh w1, w0, [x0]
5272    %r = atomicrmw umax ptr %ptr, i16 %value seq_cst, align 2
5273    ret i16 %r
5274}
5275
5276define dso_local i32 @atomicrmw_umax_i32_aligned_monotonic(ptr %ptr, i32 %value) {
5277; CHECK-LABEL: atomicrmw_umax_i32_aligned_monotonic:
5278; CHECK:    ldumax w1, w0, [x0]
5279    %r = atomicrmw umax ptr %ptr, i32 %value monotonic, align 4
5280    ret i32 %r
5281}
5282
5283define dso_local i32 @atomicrmw_umax_i32_aligned_acquire(ptr %ptr, i32 %value) {
5284; CHECK-LABEL: atomicrmw_umax_i32_aligned_acquire:
5285; CHECK:    ldumaxa w1, w0, [x0]
5286    %r = atomicrmw umax ptr %ptr, i32 %value acquire, align 4
5287    ret i32 %r
5288}
5289
5290define dso_local i32 @atomicrmw_umax_i32_aligned_release(ptr %ptr, i32 %value) {
5291; CHECK-LABEL: atomicrmw_umax_i32_aligned_release:
5292; CHECK:    ldumaxl w1, w0, [x0]
5293    %r = atomicrmw umax ptr %ptr, i32 %value release, align 4
5294    ret i32 %r
5295}
5296
5297define dso_local i32 @atomicrmw_umax_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
5298; CHECK-LABEL: atomicrmw_umax_i32_aligned_acq_rel:
5299; CHECK:    ldumaxal w1, w0, [x0]
5300    %r = atomicrmw umax ptr %ptr, i32 %value acq_rel, align 4
5301    ret i32 %r
5302}
5303
5304define dso_local i32 @atomicrmw_umax_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
5305; CHECK-LABEL: atomicrmw_umax_i32_aligned_seq_cst:
5306; CHECK:    ldumaxal w1, w0, [x0]
5307    %r = atomicrmw umax ptr %ptr, i32 %value seq_cst, align 4
5308    ret i32 %r
5309}
5310
5311define dso_local i64 @atomicrmw_umax_i64_aligned_monotonic(ptr %ptr, i64 %value) {
5312; CHECK-LABEL: atomicrmw_umax_i64_aligned_monotonic:
5313; CHECK:    ldumax x1, x0, [x0]
5314    %r = atomicrmw umax ptr %ptr, i64 %value monotonic, align 8
5315    ret i64 %r
5316}
5317
5318define dso_local i64 @atomicrmw_umax_i64_aligned_acquire(ptr %ptr, i64 %value) {
5319; CHECK-LABEL: atomicrmw_umax_i64_aligned_acquire:
5320; CHECK:    ldumaxa x1, x0, [x0]
5321    %r = atomicrmw umax ptr %ptr, i64 %value acquire, align 8
5322    ret i64 %r
5323}
5324
5325define dso_local i64 @atomicrmw_umax_i64_aligned_release(ptr %ptr, i64 %value) {
5326; CHECK-LABEL: atomicrmw_umax_i64_aligned_release:
5327; CHECK:    ldumaxl x1, x0, [x0]
5328    %r = atomicrmw umax ptr %ptr, i64 %value release, align 8
5329    ret i64 %r
5330}
5331
5332define dso_local i64 @atomicrmw_umax_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
5333; CHECK-LABEL: atomicrmw_umax_i64_aligned_acq_rel:
5334; CHECK:    ldumaxal x1, x0, [x0]
5335    %r = atomicrmw umax ptr %ptr, i64 %value acq_rel, align 8
5336    ret i64 %r
5337}
5338
5339define dso_local i64 @atomicrmw_umax_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
5340; CHECK-LABEL: atomicrmw_umax_i64_aligned_seq_cst:
5341; CHECK:    ldumaxal x1, x0, [x0]
5342    %r = atomicrmw umax ptr %ptr, i64 %value seq_cst, align 8
5343    ret i64 %r
5344}
5345
5346define dso_local i128 @atomicrmw_umax_i128_aligned_monotonic(ptr %ptr, i128 %value) {
5347; -O0-LABEL: atomicrmw_umax_i128_aligned_monotonic:
5348; -O0:    subs x9, x9, x12
5349; -O0:    subs x11, x11, x10
5350; -O0:    subs x13, x13, x10
5351; -O0:    csel w11, w9, w11, eq
5352; -O0:    ands w13, w11, #0x1
5353; -O0:    csel x2, x9, x12, ne
5354; -O0:    ands w11, w11, #0x1
5355; -O0:    csel x9, x9, x10, ne
5356; -O0:    casp x0, x1, x2, x3, [x8]
5357; -O0:    eor x8, x10, x8
5358; -O0:    eor x11, x9, x11
5359; -O0:    orr x8, x8, x11
5360; -O0:    subs x8, x8, #0
5361;
5362; -O1-LABEL: atomicrmw_umax_i128_aligned_monotonic:
5363; -O1:    ldp x4, x5, [x0]
5364; -O1:    cmp x2, x4
5365; -O1:    csel x9, x7, x3, lo
5366; -O1:    csel x8, x4, x2, lo
5367; -O1:    casp x4, x5, x8, x9, [x0]
5368; -O1:    cmp x5, x7
5369; -O1:    ccmp x4, x6, #0, eq
5370    %r = atomicrmw umax ptr %ptr, i128 %value monotonic, align 16
5371    ret i128 %r
5372}
5373
5374define dso_local i128 @atomicrmw_umax_i128_aligned_acquire(ptr %ptr, i128 %value) {
5375; -O0-LABEL: atomicrmw_umax_i128_aligned_acquire:
5376; -O0:    subs x9, x9, x12
5377; -O0:    subs x11, x11, x10
5378; -O0:    subs x13, x13, x10
5379; -O0:    csel w11, w9, w11, eq
5380; -O0:    ands w13, w11, #0x1
5381; -O0:    csel x2, x9, x12, ne
5382; -O0:    ands w11, w11, #0x1
5383; -O0:    csel x9, x9, x10, ne
5384; -O0:    caspa x0, x1, x2, x3, [x8]
5385; -O0:    eor x8, x10, x8
5386; -O0:    eor x11, x9, x11
5387; -O0:    orr x8, x8, x11
5388; -O0:    subs x8, x8, #0
5389;
5390; -O1-LABEL: atomicrmw_umax_i128_aligned_acquire:
5391; -O1:    ldp x4, x5, [x0]
5392; -O1:    cmp x2, x4
5393; -O1:    csel x9, x7, x3, lo
5394; -O1:    csel x8, x4, x2, lo
5395; -O1:    caspa x4, x5, x8, x9, [x0]
5396; -O1:    cmp x5, x7
5397; -O1:    ccmp x4, x6, #0, eq
5398    %r = atomicrmw umax ptr %ptr, i128 %value acquire, align 16
5399    ret i128 %r
5400}
5401
5402define dso_local i128 @atomicrmw_umax_i128_aligned_release(ptr %ptr, i128 %value) {
5403; -O0-LABEL: atomicrmw_umax_i128_aligned_release:
5404; -O0:    subs x9, x9, x12
5405; -O0:    subs x11, x11, x10
5406; -O0:    subs x13, x13, x10
5407; -O0:    csel w11, w9, w11, eq
5408; -O0:    ands w13, w11, #0x1
5409; -O0:    csel x2, x9, x12, ne
5410; -O0:    ands w11, w11, #0x1
5411; -O0:    csel x9, x9, x10, ne
5412; -O0:    caspl x0, x1, x2, x3, [x8]
5413; -O0:    eor x8, x10, x8
5414; -O0:    eor x11, x9, x11
5415; -O0:    orr x8, x8, x11
5416; -O0:    subs x8, x8, #0
5417;
5418; -O1-LABEL: atomicrmw_umax_i128_aligned_release:
5419; -O1:    ldp x4, x5, [x0]
5420; -O1:    cmp x2, x4
5421; -O1:    csel x9, x7, x3, lo
5422; -O1:    csel x8, x4, x2, lo
5423; -O1:    caspl x4, x5, x8, x9, [x0]
5424; -O1:    cmp x5, x7
5425; -O1:    ccmp x4, x6, #0, eq
5426    %r = atomicrmw umax ptr %ptr, i128 %value release, align 16
5427    ret i128 %r
5428}
5429
5430define dso_local i128 @atomicrmw_umax_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
5431; -O0-LABEL: atomicrmw_umax_i128_aligned_acq_rel:
5432; -O0:    subs x9, x9, x12
5433; -O0:    subs x11, x11, x10
5434; -O0:    subs x13, x13, x10
5435; -O0:    csel w11, w9, w11, eq
5436; -O0:    ands w13, w11, #0x1
5437; -O0:    csel x2, x9, x12, ne
5438; -O0:    ands w11, w11, #0x1
5439; -O0:    csel x9, x9, x10, ne
5440; -O0:    caspal x0, x1, x2, x3, [x8]
5441; -O0:    eor x8, x10, x8
5442; -O0:    eor x11, x9, x11
5443; -O0:    orr x8, x8, x11
5444; -O0:    subs x8, x8, #0
5445;
5446; -O1-LABEL: atomicrmw_umax_i128_aligned_acq_rel:
5447; -O1:    ldp x4, x5, [x0]
5448; -O1:    cmp x2, x4
5449; -O1:    csel x9, x7, x3, lo
5450; -O1:    csel x8, x4, x2, lo
5451; -O1:    caspal x4, x5, x8, x9, [x0]
5452; -O1:    cmp x5, x7
5453; -O1:    ccmp x4, x6, #0, eq
5454    %r = atomicrmw umax ptr %ptr, i128 %value acq_rel, align 16
5455    ret i128 %r
5456}
5457
5458define dso_local i128 @atomicrmw_umax_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
5459; -O0-LABEL: atomicrmw_umax_i128_aligned_seq_cst:
5460; -O0:    subs x9, x9, x12
5461; -O0:    subs x11, x11, x10
5462; -O0:    subs x13, x13, x10
5463; -O0:    csel w11, w9, w11, eq
5464; -O0:    ands w13, w11, #0x1
5465; -O0:    csel x2, x9, x12, ne
5466; -O0:    ands w11, w11, #0x1
5467; -O0:    csel x9, x9, x10, ne
5468; -O0:    caspal x0, x1, x2, x3, [x8]
5469; -O0:    eor x8, x10, x8
5470; -O0:    eor x11, x9, x11
5471; -O0:    orr x8, x8, x11
5472; -O0:    subs x8, x8, #0
5473;
5474; -O1-LABEL: atomicrmw_umax_i128_aligned_seq_cst:
5475; -O1:    ldp x4, x5, [x0]
5476; -O1:    cmp x2, x4
5477; -O1:    csel x9, x7, x3, lo
5478; -O1:    csel x8, x4, x2, lo
5479; -O1:    caspal x4, x5, x8, x9, [x0]
5480; -O1:    cmp x5, x7
5481; -O1:    ccmp x4, x6, #0, eq
5482    %r = atomicrmw umax ptr %ptr, i128 %value seq_cst, align 16
5483    ret i128 %r
5484}
5485
5486define dso_local i8 @atomicrmw_umax_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
5487; CHECK-LABEL: atomicrmw_umax_i8_unaligned_monotonic:
5488; CHECK:    ldumaxb w1, w0, [x0]
5489    %r = atomicrmw umax ptr %ptr, i8 %value monotonic, align 1
5490    ret i8 %r
5491}
5492
5493define dso_local i8 @atomicrmw_umax_i8_unaligned_acquire(ptr %ptr, i8 %value) {
5494; CHECK-LABEL: atomicrmw_umax_i8_unaligned_acquire:
5495; CHECK:    ldumaxab w1, w0, [x0]
5496    %r = atomicrmw umax ptr %ptr, i8 %value acquire, align 1
5497    ret i8 %r
5498}
5499
5500define dso_local i8 @atomicrmw_umax_i8_unaligned_release(ptr %ptr, i8 %value) {
5501; CHECK-LABEL: atomicrmw_umax_i8_unaligned_release:
5502; CHECK:    ldumaxlb w1, w0, [x0]
5503    %r = atomicrmw umax ptr %ptr, i8 %value release, align 1
5504    ret i8 %r
5505}
5506
5507define dso_local i8 @atomicrmw_umax_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
5508; CHECK-LABEL: atomicrmw_umax_i8_unaligned_acq_rel:
5509; CHECK:    ldumaxalb w1, w0, [x0]
5510    %r = atomicrmw umax ptr %ptr, i8 %value acq_rel, align 1
5511    ret i8 %r
5512}
5513
5514define dso_local i8 @atomicrmw_umax_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
5515; CHECK-LABEL: atomicrmw_umax_i8_unaligned_seq_cst:
5516; CHECK:    ldumaxalb w1, w0, [x0]
5517    %r = atomicrmw umax ptr %ptr, i8 %value seq_cst, align 1
5518    ret i8 %r
5519}
5520
5521define dso_local i16 @atomicrmw_umax_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
5522; -O0-LABEL: atomicrmw_umax_i16_unaligned_monotonic:
5523; -O0:    subs w10, w10, w8, uxth
5524; -O0:    csel w8, w9, w8, hi
5525; -O0:    bl __atomic_compare_exchange
5526;
5527; -O1-LABEL: atomicrmw_umax_i16_unaligned_monotonic:
5528; -O1:    and w8, w0, #0xffff
5529; -O1:    cmp w8, w20, uxth
5530; -O1:    csel w8, w0, w20, hi
5531; -O1:    bl __atomic_compare_exchange
5532    %r = atomicrmw umax ptr %ptr, i16 %value monotonic, align 1
5533    ret i16 %r
5534}
5535
5536define dso_local i16 @atomicrmw_umax_i16_unaligned_acquire(ptr %ptr, i16 %value) {
5537; -O0-LABEL: atomicrmw_umax_i16_unaligned_acquire:
5538; -O0:    subs w10, w10, w8, uxth
5539; -O0:    csel w8, w9, w8, hi
5540; -O0:    bl __atomic_compare_exchange
5541;
5542; -O1-LABEL: atomicrmw_umax_i16_unaligned_acquire:
5543; -O1:    and w8, w0, #0xffff
5544; -O1:    cmp w8, w20, uxth
5545; -O1:    csel w8, w0, w20, hi
5546; -O1:    bl __atomic_compare_exchange
5547    %r = atomicrmw umax ptr %ptr, i16 %value acquire, align 1
5548    ret i16 %r
5549}
5550
5551define dso_local i16 @atomicrmw_umax_i16_unaligned_release(ptr %ptr, i16 %value) {
5552; -O0-LABEL: atomicrmw_umax_i16_unaligned_release:
5553; -O0:    subs w10, w10, w8, uxth
5554; -O0:    csel w8, w9, w8, hi
5555; -O0:    bl __atomic_compare_exchange
5556;
5557; -O1-LABEL: atomicrmw_umax_i16_unaligned_release:
5558; -O1:    and w8, w0, #0xffff
5559; -O1:    cmp w8, w20, uxth
5560; -O1:    csel w8, w0, w20, hi
5561; -O1:    bl __atomic_compare_exchange
5562    %r = atomicrmw umax ptr %ptr, i16 %value release, align 1
5563    ret i16 %r
5564}
5565
5566define dso_local i16 @atomicrmw_umax_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
5567; -O0-LABEL: atomicrmw_umax_i16_unaligned_acq_rel:
5568; -O0:    subs w10, w10, w8, uxth
5569; -O0:    csel w8, w9, w8, hi
5570; -O0:    bl __atomic_compare_exchange
5571;
5572; -O1-LABEL: atomicrmw_umax_i16_unaligned_acq_rel:
5573; -O1:    and w8, w0, #0xffff
5574; -O1:    cmp w8, w20, uxth
5575; -O1:    csel w8, w0, w20, hi
5576; -O1:    bl __atomic_compare_exchange
5577    %r = atomicrmw umax ptr %ptr, i16 %value acq_rel, align 1
5578    ret i16 %r
5579}
5580
5581define dso_local i16 @atomicrmw_umax_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
5582; -O0-LABEL: atomicrmw_umax_i16_unaligned_seq_cst:
5583; -O0:    subs w10, w10, w8, uxth
5584; -O0:    csel w8, w9, w8, hi
5585; -O0:    bl __atomic_compare_exchange
5586;
5587; -O1-LABEL: atomicrmw_umax_i16_unaligned_seq_cst:
5588; -O1:    and w8, w0, #0xffff
5589; -O1:    cmp w8, w20, uxth
5590; -O1:    csel w8, w0, w20, hi
5591; -O1:    bl __atomic_compare_exchange
5592    %r = atomicrmw umax ptr %ptr, i16 %value seq_cst, align 1
5593    ret i16 %r
5594}
5595
5596define dso_local i32 @atomicrmw_umax_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
5597; -O0-LABEL: atomicrmw_umax_i32_unaligned_monotonic:
5598; -O0:    subs w10, w9, w8
5599; -O0:    csel w8, w9, w8, hi
5600; -O0:    bl __atomic_compare_exchange
5601;
5602; -O1-LABEL: atomicrmw_umax_i32_unaligned_monotonic:
5603; -O1:    cmp w0, w20
5604; -O1:    csel w8, w0, w20, hi
5605; -O1:    bl __atomic_compare_exchange
5606    %r = atomicrmw umax ptr %ptr, i32 %value monotonic, align 1
5607    ret i32 %r
5608}
5609
5610define dso_local i32 @atomicrmw_umax_i32_unaligned_acquire(ptr %ptr, i32 %value) {
5611; -O0-LABEL: atomicrmw_umax_i32_unaligned_acquire:
5612; -O0:    subs w10, w9, w8
5613; -O0:    csel w8, w9, w8, hi
5614; -O0:    bl __atomic_compare_exchange
5615;
5616; -O1-LABEL: atomicrmw_umax_i32_unaligned_acquire:
5617; -O1:    cmp w0, w20
5618; -O1:    csel w8, w0, w20, hi
5619; -O1:    bl __atomic_compare_exchange
5620    %r = atomicrmw umax ptr %ptr, i32 %value acquire, align 1
5621    ret i32 %r
5622}
5623
5624define dso_local i32 @atomicrmw_umax_i32_unaligned_release(ptr %ptr, i32 %value) {
5625; -O0-LABEL: atomicrmw_umax_i32_unaligned_release:
5626; -O0:    subs w10, w9, w8
5627; -O0:    csel w8, w9, w8, hi
5628; -O0:    bl __atomic_compare_exchange
5629;
5630; -O1-LABEL: atomicrmw_umax_i32_unaligned_release:
5631; -O1:    cmp w0, w20
5632; -O1:    csel w8, w0, w20, hi
5633; -O1:    bl __atomic_compare_exchange
5634    %r = atomicrmw umax ptr %ptr, i32 %value release, align 1
5635    ret i32 %r
5636}
5637
5638define dso_local i32 @atomicrmw_umax_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
5639; -O0-LABEL: atomicrmw_umax_i32_unaligned_acq_rel:
5640; -O0:    subs w10, w9, w8
5641; -O0:    csel w8, w9, w8, hi
5642; -O0:    bl __atomic_compare_exchange
5643;
5644; -O1-LABEL: atomicrmw_umax_i32_unaligned_acq_rel:
5645; -O1:    cmp w0, w20
5646; -O1:    csel w8, w0, w20, hi
5647; -O1:    bl __atomic_compare_exchange
5648    %r = atomicrmw umax ptr %ptr, i32 %value acq_rel, align 1
5649    ret i32 %r
5650}
5651
5652define dso_local i32 @atomicrmw_umax_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
5653; -O0-LABEL: atomicrmw_umax_i32_unaligned_seq_cst:
5654; -O0:    subs w10, w9, w8
5655; -O0:    csel w8, w9, w8, hi
5656; -O0:    bl __atomic_compare_exchange
5657;
5658; -O1-LABEL: atomicrmw_umax_i32_unaligned_seq_cst:
5659; -O1:    cmp w0, w20
5660; -O1:    csel w8, w0, w20, hi
5661; -O1:    bl __atomic_compare_exchange
5662    %r = atomicrmw umax ptr %ptr, i32 %value seq_cst, align 1
5663    ret i32 %r
5664}
5665
5666define dso_local i64 @atomicrmw_umax_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
5667; -O0-LABEL: atomicrmw_umax_i64_unaligned_monotonic:
5668; -O0:    subs x10, x9, x8
5669; -O0:    csel x8, x9, x8, hi
5670; -O0:    bl __atomic_compare_exchange
5671;
5672; -O1-LABEL: atomicrmw_umax_i64_unaligned_monotonic:
5673; -O1:    cmp x0, x20
5674; -O1:    csel x8, x0, x20, hi
5675; -O1:    bl __atomic_compare_exchange
5676    %r = atomicrmw umax ptr %ptr, i64 %value monotonic, align 1
5677    ret i64 %r
5678}
5679
5680define dso_local i64 @atomicrmw_umax_i64_unaligned_acquire(ptr %ptr, i64 %value) {
5681; -O0-LABEL: atomicrmw_umax_i64_unaligned_acquire:
5682; -O0:    subs x10, x9, x8
5683; -O0:    csel x8, x9, x8, hi
5684; -O0:    bl __atomic_compare_exchange
5685;
5686; -O1-LABEL: atomicrmw_umax_i64_unaligned_acquire:
5687; -O1:    cmp x0, x20
5688; -O1:    csel x8, x0, x20, hi
5689; -O1:    bl __atomic_compare_exchange
5690    %r = atomicrmw umax ptr %ptr, i64 %value acquire, align 1
5691    ret i64 %r
5692}
5693
5694define dso_local i64 @atomicrmw_umax_i64_unaligned_release(ptr %ptr, i64 %value) {
5695; -O0-LABEL: atomicrmw_umax_i64_unaligned_release:
5696; -O0:    subs x10, x9, x8
5697; -O0:    csel x8, x9, x8, hi
5698; -O0:    bl __atomic_compare_exchange
5699;
5700; -O1-LABEL: atomicrmw_umax_i64_unaligned_release:
5701; -O1:    cmp x0, x20
5702; -O1:    csel x8, x0, x20, hi
5703; -O1:    bl __atomic_compare_exchange
5704    %r = atomicrmw umax ptr %ptr, i64 %value release, align 1
5705    ret i64 %r
5706}
5707
5708define dso_local i64 @atomicrmw_umax_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
5709; -O0-LABEL: atomicrmw_umax_i64_unaligned_acq_rel:
5710; -O0:    subs x10, x9, x8
5711; -O0:    csel x8, x9, x8, hi
5712; -O0:    bl __atomic_compare_exchange
5713;
5714; -O1-LABEL: atomicrmw_umax_i64_unaligned_acq_rel:
5715; -O1:    cmp x0, x20
5716; -O1:    csel x8, x0, x20, hi
5717; -O1:    bl __atomic_compare_exchange
5718    %r = atomicrmw umax ptr %ptr, i64 %value acq_rel, align 1
5719    ret i64 %r
5720}
5721
5722define dso_local i64 @atomicrmw_umax_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
5723; -O0-LABEL: atomicrmw_umax_i64_unaligned_seq_cst:
5724; -O0:    subs x10, x9, x8
5725; -O0:    csel x8, x9, x8, hi
5726; -O0:    bl __atomic_compare_exchange
5727;
5728; -O1-LABEL: atomicrmw_umax_i64_unaligned_seq_cst:
5729; -O1:    cmp x0, x20
5730; -O1:    csel x8, x0, x20, hi
5731; -O1:    bl __atomic_compare_exchange
5732    %r = atomicrmw umax ptr %ptr, i64 %value seq_cst, align 1
5733    ret i64 %r
5734}
5735
5736define dso_local i128 @atomicrmw_umax_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
5737; -O0-LABEL: atomicrmw_umax_i128_unaligned_monotonic:
5738; -O0:    subs x8, x8, x9
5739; -O0:    subs x11, x11, x10
5740; -O0:    subs x12, x12, x10
5741; -O0:    csel w11, w8, w11, eq
5742; -O0:    ands w12, w11, #0x1
5743; -O0:    csel x9, x8, x9, ne
5744; -O0:    ands w11, w11, #0x1
5745; -O0:    csel x8, x8, x10, ne
5746; -O0:    bl __atomic_compare_exchange
5747;
5748; -O1-LABEL: atomicrmw_umax_i128_unaligned_monotonic:
5749; -O1:    ldp x0, x1, [x0]
5750; -O1:    cmp x21, x0
5751; -O1:    csel x8, x1, x19, lo
5752; -O1:    csel x9, x0, x21, lo
5753; -O1:    bl __atomic_compare_exchange
5754    %r = atomicrmw umax ptr %ptr, i128 %value monotonic, align 1
5755    ret i128 %r
5756}
5757
5758define dso_local i128 @atomicrmw_umax_i128_unaligned_acquire(ptr %ptr, i128 %value) {
5759; -O0-LABEL: atomicrmw_umax_i128_unaligned_acquire:
5760; -O0:    subs x8, x8, x9
5761; -O0:    subs x11, x11, x10
5762; -O0:    subs x12, x12, x10
5763; -O0:    csel w11, w8, w11, eq
5764; -O0:    ands w12, w11, #0x1
5765; -O0:    csel x9, x8, x9, ne
5766; -O0:    ands w11, w11, #0x1
5767; -O0:    csel x8, x8, x10, ne
5768; -O0:    bl __atomic_compare_exchange
5769;
5770; -O1-LABEL: atomicrmw_umax_i128_unaligned_acquire:
5771; -O1:    ldp x0, x1, [x0]
5772; -O1:    cmp x21, x0
5773; -O1:    csel x8, x1, x19, lo
5774; -O1:    csel x9, x0, x21, lo
5775; -O1:    bl __atomic_compare_exchange
5776    %r = atomicrmw umax ptr %ptr, i128 %value acquire, align 1
5777    ret i128 %r
5778}
5779
5780define dso_local i128 @atomicrmw_umax_i128_unaligned_release(ptr %ptr, i128 %value) {
5781; -O0-LABEL: atomicrmw_umax_i128_unaligned_release:
5782; -O0:    subs x8, x8, x9
5783; -O0:    subs x11, x11, x10
5784; -O0:    subs x12, x12, x10
5785; -O0:    csel w11, w8, w11, eq
5786; -O0:    ands w12, w11, #0x1
5787; -O0:    csel x9, x8, x9, ne
5788; -O0:    ands w11, w11, #0x1
5789; -O0:    csel x8, x8, x10, ne
5790; -O0:    bl __atomic_compare_exchange
5791;
5792; -O1-LABEL: atomicrmw_umax_i128_unaligned_release:
5793; -O1:    ldp x0, x1, [x0]
5794; -O1:    cmp x21, x0
5795; -O1:    csel x8, x1, x19, lo
5796; -O1:    csel x9, x0, x21, lo
5797; -O1:    bl __atomic_compare_exchange
5798    %r = atomicrmw umax ptr %ptr, i128 %value release, align 1
5799    ret i128 %r
5800}
5801
5802define dso_local i128 @atomicrmw_umax_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
5803; -O0-LABEL: atomicrmw_umax_i128_unaligned_acq_rel:
5804; -O0:    subs x8, x8, x9
5805; -O0:    subs x11, x11, x10
5806; -O0:    subs x12, x12, x10
5807; -O0:    csel w11, w8, w11, eq
5808; -O0:    ands w12, w11, #0x1
5809; -O0:    csel x9, x8, x9, ne
5810; -O0:    ands w11, w11, #0x1
5811; -O0:    csel x8, x8, x10, ne
5812; -O0:    bl __atomic_compare_exchange
5813;
5814; -O1-LABEL: atomicrmw_umax_i128_unaligned_acq_rel:
5815; -O1:    ldp x0, x1, [x0]
5816; -O1:    cmp x21, x0
5817; -O1:    csel x8, x1, x19, lo
5818; -O1:    csel x9, x0, x21, lo
5819; -O1:    bl __atomic_compare_exchange
5820    %r = atomicrmw umax ptr %ptr, i128 %value acq_rel, align 1
5821    ret i128 %r
5822}
5823
5824define dso_local i128 @atomicrmw_umax_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
5825; -O0-LABEL: atomicrmw_umax_i128_unaligned_seq_cst:
5826; -O0:    subs x8, x8, x9
5827; -O0:    subs x11, x11, x10
5828; -O0:    subs x12, x12, x10
5829; -O0:    csel w11, w8, w11, eq
5830; -O0:    ands w12, w11, #0x1
5831; -O0:    csel x9, x8, x9, ne
5832; -O0:    ands w11, w11, #0x1
5833; -O0:    csel x8, x8, x10, ne
5834; -O0:    bl __atomic_compare_exchange
5835;
5836; -O1-LABEL: atomicrmw_umax_i128_unaligned_seq_cst:
5837; -O1:    ldp x0, x1, [x0]
5838; -O1:    cmp x21, x0
5839; -O1:    csel x8, x1, x19, lo
5840; -O1:    csel x9, x0, x21, lo
5841; -O1:    bl __atomic_compare_exchange
5842    %r = atomicrmw umax ptr %ptr, i128 %value seq_cst, align 1
5843    ret i128 %r
5844}
5845
5846define dso_local i8 @atomicrmw_umin_i8_aligned_monotonic(ptr %ptr, i8 %value) {
5847; CHECK-LABEL: atomicrmw_umin_i8_aligned_monotonic:
5848; CHECK:    lduminb w1, w0, [x0]
5849    %r = atomicrmw umin ptr %ptr, i8 %value monotonic, align 1
5850    ret i8 %r
5851}
5852
5853define dso_local i8 @atomicrmw_umin_i8_aligned_acquire(ptr %ptr, i8 %value) {
5854; CHECK-LABEL: atomicrmw_umin_i8_aligned_acquire:
5855; CHECK:    lduminab w1, w0, [x0]
5856    %r = atomicrmw umin ptr %ptr, i8 %value acquire, align 1
5857    ret i8 %r
5858}
5859
5860define dso_local i8 @atomicrmw_umin_i8_aligned_release(ptr %ptr, i8 %value) {
5861; CHECK-LABEL: atomicrmw_umin_i8_aligned_release:
5862; CHECK:    lduminlb w1, w0, [x0]
5863    %r = atomicrmw umin ptr %ptr, i8 %value release, align 1
5864    ret i8 %r
5865}
5866
5867define dso_local i8 @atomicrmw_umin_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
5868; CHECK-LABEL: atomicrmw_umin_i8_aligned_acq_rel:
5869; CHECK:    lduminalb w1, w0, [x0]
5870    %r = atomicrmw umin ptr %ptr, i8 %value acq_rel, align 1
5871    ret i8 %r
5872}
5873
5874define dso_local i8 @atomicrmw_umin_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
5875; CHECK-LABEL: atomicrmw_umin_i8_aligned_seq_cst:
5876; CHECK:    lduminalb w1, w0, [x0]
5877    %r = atomicrmw umin ptr %ptr, i8 %value seq_cst, align 1
5878    ret i8 %r
5879}
5880
5881define dso_local i16 @atomicrmw_umin_i16_aligned_monotonic(ptr %ptr, i16 %value) {
5882; CHECK-LABEL: atomicrmw_umin_i16_aligned_monotonic:
5883; CHECK:    lduminh w1, w0, [x0]
5884    %r = atomicrmw umin ptr %ptr, i16 %value monotonic, align 2
5885    ret i16 %r
5886}
5887
5888define dso_local i16 @atomicrmw_umin_i16_aligned_acquire(ptr %ptr, i16 %value) {
5889; CHECK-LABEL: atomicrmw_umin_i16_aligned_acquire:
5890; CHECK:    lduminah w1, w0, [x0]
5891    %r = atomicrmw umin ptr %ptr, i16 %value acquire, align 2
5892    ret i16 %r
5893}
5894
5895define dso_local i16 @atomicrmw_umin_i16_aligned_release(ptr %ptr, i16 %value) {
5896; CHECK-LABEL: atomicrmw_umin_i16_aligned_release:
5897; CHECK:    lduminlh w1, w0, [x0]
5898    %r = atomicrmw umin ptr %ptr, i16 %value release, align 2
5899    ret i16 %r
5900}
5901
5902define dso_local i16 @atomicrmw_umin_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
5903; CHECK-LABEL: atomicrmw_umin_i16_aligned_acq_rel:
5904; CHECK:    lduminalh w1, w0, [x0]
5905    %r = atomicrmw umin ptr %ptr, i16 %value acq_rel, align 2
5906    ret i16 %r
5907}
5908
5909define dso_local i16 @atomicrmw_umin_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
5910; CHECK-LABEL: atomicrmw_umin_i16_aligned_seq_cst:
5911; CHECK:    lduminalh w1, w0, [x0]
5912    %r = atomicrmw umin ptr %ptr, i16 %value seq_cst, align 2
5913    ret i16 %r
5914}
5915
5916define dso_local i32 @atomicrmw_umin_i32_aligned_monotonic(ptr %ptr, i32 %value) {
5917; CHECK-LABEL: atomicrmw_umin_i32_aligned_monotonic:
5918; CHECK:    ldumin w1, w0, [x0]
5919    %r = atomicrmw umin ptr %ptr, i32 %value monotonic, align 4
5920    ret i32 %r
5921}
5922
5923define dso_local i32 @atomicrmw_umin_i32_aligned_acquire(ptr %ptr, i32 %value) {
5924; CHECK-LABEL: atomicrmw_umin_i32_aligned_acquire:
5925; CHECK:    ldumina w1, w0, [x0]
5926    %r = atomicrmw umin ptr %ptr, i32 %value acquire, align 4
5927    ret i32 %r
5928}
5929
5930define dso_local i32 @atomicrmw_umin_i32_aligned_release(ptr %ptr, i32 %value) {
5931; CHECK-LABEL: atomicrmw_umin_i32_aligned_release:
5932; CHECK:    lduminl w1, w0, [x0]
5933    %r = atomicrmw umin ptr %ptr, i32 %value release, align 4
5934    ret i32 %r
5935}
5936
5937define dso_local i32 @atomicrmw_umin_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
5938; CHECK-LABEL: atomicrmw_umin_i32_aligned_acq_rel:
5939; CHECK:    lduminal w1, w0, [x0]
5940    %r = atomicrmw umin ptr %ptr, i32 %value acq_rel, align 4
5941    ret i32 %r
5942}
5943
5944define dso_local i32 @atomicrmw_umin_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
5945; CHECK-LABEL: atomicrmw_umin_i32_aligned_seq_cst:
5946; CHECK:    lduminal w1, w0, [x0]
5947    %r = atomicrmw umin ptr %ptr, i32 %value seq_cst, align 4
5948    ret i32 %r
5949}
5950
5951define dso_local i64 @atomicrmw_umin_i64_aligned_monotonic(ptr %ptr, i64 %value) {
5952; CHECK-LABEL: atomicrmw_umin_i64_aligned_monotonic:
5953; CHECK:    ldumin x1, x0, [x0]
5954    %r = atomicrmw umin ptr %ptr, i64 %value monotonic, align 8
5955    ret i64 %r
5956}
5957
5958define dso_local i64 @atomicrmw_umin_i64_aligned_acquire(ptr %ptr, i64 %value) {
5959; CHECK-LABEL: atomicrmw_umin_i64_aligned_acquire:
5960; CHECK:    ldumina x1, x0, [x0]
5961    %r = atomicrmw umin ptr %ptr, i64 %value acquire, align 8
5962    ret i64 %r
5963}
5964
5965define dso_local i64 @atomicrmw_umin_i64_aligned_release(ptr %ptr, i64 %value) {
5966; CHECK-LABEL: atomicrmw_umin_i64_aligned_release:
5967; CHECK:    lduminl x1, x0, [x0]
5968    %r = atomicrmw umin ptr %ptr, i64 %value release, align 8
5969    ret i64 %r
5970}
5971
5972define dso_local i64 @atomicrmw_umin_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
5973; CHECK-LABEL: atomicrmw_umin_i64_aligned_acq_rel:
5974; CHECK:    lduminal x1, x0, [x0]
5975    %r = atomicrmw umin ptr %ptr, i64 %value acq_rel, align 8
5976    ret i64 %r
5977}
5978
5979define dso_local i64 @atomicrmw_umin_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
5980; CHECK-LABEL: atomicrmw_umin_i64_aligned_seq_cst:
5981; CHECK:    lduminal x1, x0, [x0]
5982    %r = atomicrmw umin ptr %ptr, i64 %value seq_cst, align 8
5983    ret i64 %r
5984}
5985
5986define dso_local i128 @atomicrmw_umin_i128_aligned_monotonic(ptr %ptr, i128 %value) {
5987; -O0-LABEL: atomicrmw_umin_i128_aligned_monotonic:
5988; -O0:    subs x9, x9, x12
5989; -O0:    subs x11, x11, x10
5990; -O0:    subs x13, x13, x10
5991; -O0:    csel w11, w9, w11, eq
5992; -O0:    ands w13, w11, #0x1
5993; -O0:    csel x2, x9, x12, ne
5994; -O0:    ands w11, w11, #0x1
5995; -O0:    csel x9, x9, x10, ne
5996; -O0:    casp x0, x1, x2, x3, [x8]
5997; -O0:    eor x8, x10, x8
5998; -O0:    eor x11, x9, x11
5999; -O0:    orr x8, x8, x11
6000; -O0:    subs x8, x8, #0
6001;
6002; -O1-LABEL: atomicrmw_umin_i128_aligned_monotonic:
6003; -O1:    ldp x4, x5, [x0]
6004; -O1:    cmp x2, x4
6005; -O1:    csel x9, x7, x3, hs
6006; -O1:    csel x8, x4, x2, hs
6007; -O1:    casp x4, x5, x8, x9, [x0]
6008; -O1:    cmp x5, x7
6009; -O1:    ccmp x4, x6, #0, eq
6010    %r = atomicrmw umin ptr %ptr, i128 %value monotonic, align 16
6011    ret i128 %r
6012}
6013
6014define dso_local i128 @atomicrmw_umin_i128_aligned_acquire(ptr %ptr, i128 %value) {
6015; -O0-LABEL: atomicrmw_umin_i128_aligned_acquire:
6016; -O0:    subs x9, x9, x12
6017; -O0:    subs x11, x11, x10
6018; -O0:    subs x13, x13, x10
6019; -O0:    csel w11, w9, w11, eq
6020; -O0:    ands w13, w11, #0x1
6021; -O0:    csel x2, x9, x12, ne
6022; -O0:    ands w11, w11, #0x1
6023; -O0:    csel x9, x9, x10, ne
6024; -O0:    caspa x0, x1, x2, x3, [x8]
6025; -O0:    eor x8, x10, x8
6026; -O0:    eor x11, x9, x11
6027; -O0:    orr x8, x8, x11
6028; -O0:    subs x8, x8, #0
6029;
6030; -O1-LABEL: atomicrmw_umin_i128_aligned_acquire:
6031; -O1:    ldp x4, x5, [x0]
6032; -O1:    cmp x2, x4
6033; -O1:    csel x9, x7, x3, hs
6034; -O1:    csel x8, x4, x2, hs
6035; -O1:    caspa x4, x5, x8, x9, [x0]
6036; -O1:    cmp x5, x7
6037; -O1:    ccmp x4, x6, #0, eq
6038    %r = atomicrmw umin ptr %ptr, i128 %value acquire, align 16
6039    ret i128 %r
6040}
6041
6042define dso_local i128 @atomicrmw_umin_i128_aligned_release(ptr %ptr, i128 %value) {
6043; -O0-LABEL: atomicrmw_umin_i128_aligned_release:
6044; -O0:    subs x9, x9, x12
6045; -O0:    subs x11, x11, x10
6046; -O0:    subs x13, x13, x10
6047; -O0:    csel w11, w9, w11, eq
6048; -O0:    ands w13, w11, #0x1
6049; -O0:    csel x2, x9, x12, ne
6050; -O0:    ands w11, w11, #0x1
6051; -O0:    csel x9, x9, x10, ne
6052; -O0:    caspl x0, x1, x2, x3, [x8]
6053; -O0:    eor x8, x10, x8
6054; -O0:    eor x11, x9, x11
6055; -O0:    orr x8, x8, x11
6056; -O0:    subs x8, x8, #0
6057;
6058; -O1-LABEL: atomicrmw_umin_i128_aligned_release:
6059; -O1:    ldp x4, x5, [x0]
6060; -O1:    cmp x2, x4
6061; -O1:    csel x9, x7, x3, hs
6062; -O1:    csel x8, x4, x2, hs
6063; -O1:    caspl x4, x5, x8, x9, [x0]
6064; -O1:    cmp x5, x7
6065; -O1:    ccmp x4, x6, #0, eq
6066    %r = atomicrmw umin ptr %ptr, i128 %value release, align 16
6067    ret i128 %r
6068}
6069
6070define dso_local i128 @atomicrmw_umin_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
6071; -O0-LABEL: atomicrmw_umin_i128_aligned_acq_rel:
6072; -O0:    subs x9, x9, x12
6073; -O0:    subs x11, x11, x10
6074; -O0:    subs x13, x13, x10
6075; -O0:    csel w11, w9, w11, eq
6076; -O0:    ands w13, w11, #0x1
6077; -O0:    csel x2, x9, x12, ne
6078; -O0:    ands w11, w11, #0x1
6079; -O0:    csel x9, x9, x10, ne
6080; -O0:    caspal x0, x1, x2, x3, [x8]
6081; -O0:    eor x8, x10, x8
6082; -O0:    eor x11, x9, x11
6083; -O0:    orr x8, x8, x11
6084; -O0:    subs x8, x8, #0
6085;
6086; -O1-LABEL: atomicrmw_umin_i128_aligned_acq_rel:
6087; -O1:    ldp x4, x5, [x0]
6088; -O1:    cmp x2, x4
6089; -O1:    csel x9, x7, x3, hs
6090; -O1:    csel x8, x4, x2, hs
6091; -O1:    caspal x4, x5, x8, x9, [x0]
6092; -O1:    cmp x5, x7
6093; -O1:    ccmp x4, x6, #0, eq
6094    %r = atomicrmw umin ptr %ptr, i128 %value acq_rel, align 16
6095    ret i128 %r
6096}
6097
6098define dso_local i128 @atomicrmw_umin_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
6099; -O0-LABEL: atomicrmw_umin_i128_aligned_seq_cst:
6100; -O0:    subs x9, x9, x12
6101; -O0:    subs x11, x11, x10
6102; -O0:    subs x13, x13, x10
6103; -O0:    csel w11, w9, w11, eq
6104; -O0:    ands w13, w11, #0x1
6105; -O0:    csel x2, x9, x12, ne
6106; -O0:    ands w11, w11, #0x1
6107; -O0:    csel x9, x9, x10, ne
6108; -O0:    caspal x0, x1, x2, x3, [x8]
6109; -O0:    eor x8, x10, x8
6110; -O0:    eor x11, x9, x11
6111; -O0:    orr x8, x8, x11
6112; -O0:    subs x8, x8, #0
6113;
6114; -O1-LABEL: atomicrmw_umin_i128_aligned_seq_cst:
6115; -O1:    ldp x4, x5, [x0]
6116; -O1:    cmp x2, x4
6117; -O1:    csel x9, x7, x3, hs
6118; -O1:    csel x8, x4, x2, hs
6119; -O1:    caspal x4, x5, x8, x9, [x0]
6120; -O1:    cmp x5, x7
6121; -O1:    ccmp x4, x6, #0, eq
6122    %r = atomicrmw umin ptr %ptr, i128 %value seq_cst, align 16
6123    ret i128 %r
6124}
6125
6126define dso_local i8 @atomicrmw_umin_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
6127; CHECK-LABEL: atomicrmw_umin_i8_unaligned_monotonic:
6128; CHECK:    lduminb w1, w0, [x0]
6129    %r = atomicrmw umin ptr %ptr, i8 %value monotonic, align 1
6130    ret i8 %r
6131}
6132
6133define dso_local i8 @atomicrmw_umin_i8_unaligned_acquire(ptr %ptr, i8 %value) {
6134; CHECK-LABEL: atomicrmw_umin_i8_unaligned_acquire:
6135; CHECK:    lduminab w1, w0, [x0]
6136    %r = atomicrmw umin ptr %ptr, i8 %value acquire, align 1
6137    ret i8 %r
6138}
6139
6140define dso_local i8 @atomicrmw_umin_i8_unaligned_release(ptr %ptr, i8 %value) {
6141; CHECK-LABEL: atomicrmw_umin_i8_unaligned_release:
6142; CHECK:    lduminlb w1, w0, [x0]
6143    %r = atomicrmw umin ptr %ptr, i8 %value release, align 1
6144    ret i8 %r
6145}
6146
6147define dso_local i8 @atomicrmw_umin_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
6148; CHECK-LABEL: atomicrmw_umin_i8_unaligned_acq_rel:
6149; CHECK:    lduminalb w1, w0, [x0]
6150    %r = atomicrmw umin ptr %ptr, i8 %value acq_rel, align 1
6151    ret i8 %r
6152}
6153
6154define dso_local i8 @atomicrmw_umin_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
6155; CHECK-LABEL: atomicrmw_umin_i8_unaligned_seq_cst:
6156; CHECK:    lduminalb w1, w0, [x0]
6157    %r = atomicrmw umin ptr %ptr, i8 %value seq_cst, align 1
6158    ret i8 %r
6159}
6160
6161define dso_local i16 @atomicrmw_umin_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
6162; -O0-LABEL: atomicrmw_umin_i16_unaligned_monotonic:
6163; -O0:    subs w10, w10, w8, uxth
6164; -O0:    csel w8, w9, w8, ls
6165; -O0:    bl __atomic_compare_exchange
6166;
6167; -O1-LABEL: atomicrmw_umin_i16_unaligned_monotonic:
6168; -O1:    and w8, w0, #0xffff
6169; -O1:    cmp w8, w20, uxth
6170; -O1:    csel w8, w0, w20, ls
6171; -O1:    bl __atomic_compare_exchange
6172    %r = atomicrmw umin ptr %ptr, i16 %value monotonic, align 1
6173    ret i16 %r
6174}
6175
6176define dso_local i16 @atomicrmw_umin_i16_unaligned_acquire(ptr %ptr, i16 %value) {
6177; -O0-LABEL: atomicrmw_umin_i16_unaligned_acquire:
6178; -O0:    subs w10, w10, w8, uxth
6179; -O0:    csel w8, w9, w8, ls
6180; -O0:    bl __atomic_compare_exchange
6181;
6182; -O1-LABEL: atomicrmw_umin_i16_unaligned_acquire:
6183; -O1:    and w8, w0, #0xffff
6184; -O1:    cmp w8, w20, uxth
6185; -O1:    csel w8, w0, w20, ls
6186; -O1:    bl __atomic_compare_exchange
6187    %r = atomicrmw umin ptr %ptr, i16 %value acquire, align 1
6188    ret i16 %r
6189}
6190
6191define dso_local i16 @atomicrmw_umin_i16_unaligned_release(ptr %ptr, i16 %value) {
6192; -O0-LABEL: atomicrmw_umin_i16_unaligned_release:
6193; -O0:    subs w10, w10, w8, uxth
6194; -O0:    csel w8, w9, w8, ls
6195; -O0:    bl __atomic_compare_exchange
6196;
6197; -O1-LABEL: atomicrmw_umin_i16_unaligned_release:
6198; -O1:    and w8, w0, #0xffff
6199; -O1:    cmp w8, w20, uxth
6200; -O1:    csel w8, w0, w20, ls
6201; -O1:    bl __atomic_compare_exchange
6202    %r = atomicrmw umin ptr %ptr, i16 %value release, align 1
6203    ret i16 %r
6204}
6205
6206define dso_local i16 @atomicrmw_umin_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
6207; -O0-LABEL: atomicrmw_umin_i16_unaligned_acq_rel:
6208; -O0:    subs w10, w10, w8, uxth
6209; -O0:    csel w8, w9, w8, ls
6210; -O0:    bl __atomic_compare_exchange
6211;
6212; -O1-LABEL: atomicrmw_umin_i16_unaligned_acq_rel:
6213; -O1:    and w8, w0, #0xffff
6214; -O1:    cmp w8, w20, uxth
6215; -O1:    csel w8, w0, w20, ls
6216; -O1:    bl __atomic_compare_exchange
6217    %r = atomicrmw umin ptr %ptr, i16 %value acq_rel, align 1
6218    ret i16 %r
6219}
6220
6221define dso_local i16 @atomicrmw_umin_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
6222; -O0-LABEL: atomicrmw_umin_i16_unaligned_seq_cst:
6223; -O0:    subs w10, w10, w8, uxth
6224; -O0:    csel w8, w9, w8, ls
6225; -O0:    bl __atomic_compare_exchange
6226;
6227; -O1-LABEL: atomicrmw_umin_i16_unaligned_seq_cst:
6228; -O1:    and w8, w0, #0xffff
6229; -O1:    cmp w8, w20, uxth
6230; -O1:    csel w8, w0, w20, ls
6231; -O1:    bl __atomic_compare_exchange
6232    %r = atomicrmw umin ptr %ptr, i16 %value seq_cst, align 1
6233    ret i16 %r
6234}
6235
6236define dso_local i32 @atomicrmw_umin_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
6237; -O0-LABEL: atomicrmw_umin_i32_unaligned_monotonic:
6238; -O0:    subs w10, w9, w8
6239; -O0:    csel w8, w9, w8, ls
6240; -O0:    bl __atomic_compare_exchange
6241;
6242; -O1-LABEL: atomicrmw_umin_i32_unaligned_monotonic:
6243; -O1:    cmp w0, w20
6244; -O1:    csel w8, w0, w20, ls
6245; -O1:    bl __atomic_compare_exchange
6246    %r = atomicrmw umin ptr %ptr, i32 %value monotonic, align 1
6247    ret i32 %r
6248}
6249
6250define dso_local i32 @atomicrmw_umin_i32_unaligned_acquire(ptr %ptr, i32 %value) {
6251; -O0-LABEL: atomicrmw_umin_i32_unaligned_acquire:
6252; -O0:    subs w10, w9, w8
6253; -O0:    csel w8, w9, w8, ls
6254; -O0:    bl __atomic_compare_exchange
6255;
6256; -O1-LABEL: atomicrmw_umin_i32_unaligned_acquire:
6257; -O1:    cmp w0, w20
6258; -O1:    csel w8, w0, w20, ls
6259; -O1:    bl __atomic_compare_exchange
6260    %r = atomicrmw umin ptr %ptr, i32 %value acquire, align 1
6261    ret i32 %r
6262}
6263
6264define dso_local i32 @atomicrmw_umin_i32_unaligned_release(ptr %ptr, i32 %value) {
6265; -O0-LABEL: atomicrmw_umin_i32_unaligned_release:
6266; -O0:    subs w10, w9, w8
6267; -O0:    csel w8, w9, w8, ls
6268; -O0:    bl __atomic_compare_exchange
6269;
6270; -O1-LABEL: atomicrmw_umin_i32_unaligned_release:
6271; -O1:    cmp w0, w20
6272; -O1:    csel w8, w0, w20, ls
6273; -O1:    bl __atomic_compare_exchange
6274    %r = atomicrmw umin ptr %ptr, i32 %value release, align 1
6275    ret i32 %r
6276}
6277
6278define dso_local i32 @atomicrmw_umin_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
6279; -O0-LABEL: atomicrmw_umin_i32_unaligned_acq_rel:
6280; -O0:    subs w10, w9, w8
6281; -O0:    csel w8, w9, w8, ls
6282; -O0:    bl __atomic_compare_exchange
6283;
6284; -O1-LABEL: atomicrmw_umin_i32_unaligned_acq_rel:
6285; -O1:    cmp w0, w20
6286; -O1:    csel w8, w0, w20, ls
6287; -O1:    bl __atomic_compare_exchange
6288    %r = atomicrmw umin ptr %ptr, i32 %value acq_rel, align 1
6289    ret i32 %r
6290}
6291
6292define dso_local i32 @atomicrmw_umin_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
6293; -O0-LABEL: atomicrmw_umin_i32_unaligned_seq_cst:
6294; -O0:    subs w10, w9, w8
6295; -O0:    csel w8, w9, w8, ls
6296; -O0:    bl __atomic_compare_exchange
6297;
6298; -O1-LABEL: atomicrmw_umin_i32_unaligned_seq_cst:
6299; -O1:    cmp w0, w20
6300; -O1:    csel w8, w0, w20, ls
6301; -O1:    bl __atomic_compare_exchange
6302    %r = atomicrmw umin ptr %ptr, i32 %value seq_cst, align 1
6303    ret i32 %r
6304}
6305
6306define dso_local i64 @atomicrmw_umin_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
6307; -O0-LABEL: atomicrmw_umin_i64_unaligned_monotonic:
6308; -O0:    subs x10, x9, x8
6309; -O0:    csel x8, x9, x8, ls
6310; -O0:    bl __atomic_compare_exchange
6311;
6312; -O1-LABEL: atomicrmw_umin_i64_unaligned_monotonic:
6313; -O1:    cmp x0, x20
6314; -O1:    csel x8, x0, x20, ls
6315; -O1:    bl __atomic_compare_exchange
6316    %r = atomicrmw umin ptr %ptr, i64 %value monotonic, align 1
6317    ret i64 %r
6318}
6319
6320define dso_local i64 @atomicrmw_umin_i64_unaligned_acquire(ptr %ptr, i64 %value) {
6321; -O0-LABEL: atomicrmw_umin_i64_unaligned_acquire:
6322; -O0:    subs x10, x9, x8
6323; -O0:    csel x8, x9, x8, ls
6324; -O0:    bl __atomic_compare_exchange
6325;
6326; -O1-LABEL: atomicrmw_umin_i64_unaligned_acquire:
6327; -O1:    cmp x0, x20
6328; -O1:    csel x8, x0, x20, ls
6329; -O1:    bl __atomic_compare_exchange
6330    %r = atomicrmw umin ptr %ptr, i64 %value acquire, align 1
6331    ret i64 %r
6332}
6333
6334define dso_local i64 @atomicrmw_umin_i64_unaligned_release(ptr %ptr, i64 %value) {
6335; -O0-LABEL: atomicrmw_umin_i64_unaligned_release:
6336; -O0:    subs x10, x9, x8
6337; -O0:    csel x8, x9, x8, ls
6338; -O0:    bl __atomic_compare_exchange
6339;
6340; -O1-LABEL: atomicrmw_umin_i64_unaligned_release:
6341; -O1:    cmp x0, x20
6342; -O1:    csel x8, x0, x20, ls
6343; -O1:    bl __atomic_compare_exchange
6344    %r = atomicrmw umin ptr %ptr, i64 %value release, align 1
6345    ret i64 %r
6346}
6347
6348define dso_local i64 @atomicrmw_umin_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
6349; -O0-LABEL: atomicrmw_umin_i64_unaligned_acq_rel:
6350; -O0:    subs x10, x9, x8
6351; -O0:    csel x8, x9, x8, ls
6352; -O0:    bl __atomic_compare_exchange
6353;
6354; -O1-LABEL: atomicrmw_umin_i64_unaligned_acq_rel:
6355; -O1:    cmp x0, x20
6356; -O1:    csel x8, x0, x20, ls
6357; -O1:    bl __atomic_compare_exchange
6358    %r = atomicrmw umin ptr %ptr, i64 %value acq_rel, align 1
6359    ret i64 %r
6360}
6361
6362define dso_local i64 @atomicrmw_umin_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
6363; -O0-LABEL: atomicrmw_umin_i64_unaligned_seq_cst:
6364; -O0:    subs x10, x9, x8
6365; -O0:    csel x8, x9, x8, ls
6366; -O0:    bl __atomic_compare_exchange
6367;
6368; -O1-LABEL: atomicrmw_umin_i64_unaligned_seq_cst:
6369; -O1:    cmp x0, x20
6370; -O1:    csel x8, x0, x20, ls
6371; -O1:    bl __atomic_compare_exchange
6372    %r = atomicrmw umin ptr %ptr, i64 %value seq_cst, align 1
6373    ret i64 %r
6374}
6375
6376define dso_local i128 @atomicrmw_umin_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
6377; -O0-LABEL: atomicrmw_umin_i128_unaligned_monotonic:
6378; -O0:    subs x8, x8, x9
6379; -O0:    subs x11, x11, x10
6380; -O0:    subs x12, x12, x10
6381; -O0:    csel w11, w8, w11, eq
6382; -O0:    ands w12, w11, #0x1
6383; -O0:    csel x9, x8, x9, ne
6384; -O0:    ands w11, w11, #0x1
6385; -O0:    csel x8, x8, x10, ne
6386; -O0:    bl __atomic_compare_exchange
6387;
6388; -O1-LABEL: atomicrmw_umin_i128_unaligned_monotonic:
6389; -O1:    ldp x0, x1, [x0]
6390; -O1:    cmp x21, x0
6391; -O1:    csel x8, x1, x19, hs
6392; -O1:    csel x9, x0, x21, hs
6393; -O1:    bl __atomic_compare_exchange
6394    %r = atomicrmw umin ptr %ptr, i128 %value monotonic, align 1
6395    ret i128 %r
6396}
6397
6398define dso_local i128 @atomicrmw_umin_i128_unaligned_acquire(ptr %ptr, i128 %value) {
6399; -O0-LABEL: atomicrmw_umin_i128_unaligned_acquire:
6400; -O0:    subs x8, x8, x9
6401; -O0:    subs x11, x11, x10
6402; -O0:    subs x12, x12, x10
6403; -O0:    csel w11, w8, w11, eq
6404; -O0:    ands w12, w11, #0x1
6405; -O0:    csel x9, x8, x9, ne
6406; -O0:    ands w11, w11, #0x1
6407; -O0:    csel x8, x8, x10, ne
6408; -O0:    bl __atomic_compare_exchange
6409;
6410; -O1-LABEL: atomicrmw_umin_i128_unaligned_acquire:
6411; -O1:    ldp x0, x1, [x0]
6412; -O1:    cmp x21, x0
6413; -O1:    csel x8, x1, x19, hs
6414; -O1:    csel x9, x0, x21, hs
6415; -O1:    bl __atomic_compare_exchange
6416    %r = atomicrmw umin ptr %ptr, i128 %value acquire, align 1
6417    ret i128 %r
6418}
6419
6420define dso_local i128 @atomicrmw_umin_i128_unaligned_release(ptr %ptr, i128 %value) {
6421; -O0-LABEL: atomicrmw_umin_i128_unaligned_release:
6422; -O0:    subs x8, x8, x9
6423; -O0:    subs x11, x11, x10
6424; -O0:    subs x12, x12, x10
6425; -O0:    csel w11, w8, w11, eq
6426; -O0:    ands w12, w11, #0x1
6427; -O0:    csel x9, x8, x9, ne
6428; -O0:    ands w11, w11, #0x1
6429; -O0:    csel x8, x8, x10, ne
6430; -O0:    bl __atomic_compare_exchange
6431;
6432; -O1-LABEL: atomicrmw_umin_i128_unaligned_release:
6433; -O1:    ldp x0, x1, [x0]
6434; -O1:    cmp x21, x0
6435; -O1:    csel x8, x1, x19, hs
6436; -O1:    csel x9, x0, x21, hs
6437; -O1:    bl __atomic_compare_exchange
6438    %r = atomicrmw umin ptr %ptr, i128 %value release, align 1
6439    ret i128 %r
6440}
6441
6442define dso_local i128 @atomicrmw_umin_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
6443; -O0-LABEL: atomicrmw_umin_i128_unaligned_acq_rel:
6444; -O0:    subs x8, x8, x9
6445; -O0:    subs x11, x11, x10
6446; -O0:    subs x12, x12, x10
6447; -O0:    csel w11, w8, w11, eq
6448; -O0:    ands w12, w11, #0x1
6449; -O0:    csel x9, x8, x9, ne
6450; -O0:    ands w11, w11, #0x1
6451; -O0:    csel x8, x8, x10, ne
6452; -O0:    bl __atomic_compare_exchange
6453;
6454; -O1-LABEL: atomicrmw_umin_i128_unaligned_acq_rel:
6455; -O1:    ldp x0, x1, [x0]
6456; -O1:    cmp x21, x0
6457; -O1:    csel x8, x1, x19, hs
6458; -O1:    csel x9, x0, x21, hs
6459; -O1:    bl __atomic_compare_exchange
6460    %r = atomicrmw umin ptr %ptr, i128 %value acq_rel, align 1
6461    ret i128 %r
6462}
6463
6464define dso_local i128 @atomicrmw_umin_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
6465; -O0-LABEL: atomicrmw_umin_i128_unaligned_seq_cst:
6466; -O0:    subs x8, x8, x9
6467; -O0:    subs x11, x11, x10
6468; -O0:    subs x12, x12, x10
6469; -O0:    csel w11, w8, w11, eq
6470; -O0:    ands w12, w11, #0x1
6471; -O0:    csel x9, x8, x9, ne
6472; -O0:    ands w11, w11, #0x1
6473; -O0:    csel x8, x8, x10, ne
6474; -O0:    bl __atomic_compare_exchange
6475;
6476; -O1-LABEL: atomicrmw_umin_i128_unaligned_seq_cst:
6477; -O1:    ldp x0, x1, [x0]
6478; -O1:    cmp x21, x0
6479; -O1:    csel x8, x1, x19, hs
6480; -O1:    csel x9, x0, x21, hs
6481; -O1:    bl __atomic_compare_exchange
6482    %r = atomicrmw umin ptr %ptr, i128 %value seq_cst, align 1
6483    ret i128 %r
6484}
6485