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