Add PR check to suggest alternatives to using undef (#118506)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / Atomics / aarch64_be-atomicrmw-rcpc.ll
blob1bead6d694c65288e918d3eae880c65a4e9d65d2
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=+rcpc -O0 | FileCheck %s --check-prefixes=CHECK,-O0
4 ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+rcpc -O1 | FileCheck %s --check-prefixes=CHECK,-O1
6 define dso_local i8 @atomicrmw_xchg_i8_aligned_monotonic(ptr %ptr, i8 %value) {
7 ; -O0-LABEL: atomicrmw_xchg_i8_aligned_monotonic:
8 ; -O0:    ldaxrb w8, [x11]
9 ; -O0:    cmp w8, w9, uxtb
10 ; -O0:    stlxrb w10, w12, [x11]
11 ; -O0:    subs w9, w8, w9, uxtb
12 ; -O0:    subs w9, w9, #1
14 ; -O1-LABEL: atomicrmw_xchg_i8_aligned_monotonic:
15 ; -O1:    ldxrb w8, [x0]
16 ; -O1:    stxrb w9, w1, [x0]
17     %r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1
18     ret i8 %r
21 define dso_local i8 @atomicrmw_xchg_i8_aligned_acquire(ptr %ptr, i8 %value) {
22 ; -O0-LABEL: atomicrmw_xchg_i8_aligned_acquire:
23 ; -O0:    ldaxrb w8, [x11]
24 ; -O0:    cmp w8, w9, uxtb
25 ; -O0:    stlxrb w10, w12, [x11]
26 ; -O0:    subs w9, w8, w9, uxtb
27 ; -O0:    subs w9, w9, #1
29 ; -O1-LABEL: atomicrmw_xchg_i8_aligned_acquire:
30 ; -O1:    ldaxrb w8, [x0]
31 ; -O1:    stxrb w9, w1, [x0]
32     %r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1
33     ret i8 %r
36 define dso_local i8 @atomicrmw_xchg_i8_aligned_release(ptr %ptr, i8 %value) {
37 ; -O0-LABEL: atomicrmw_xchg_i8_aligned_release:
38 ; -O0:    ldaxrb w8, [x11]
39 ; -O0:    cmp w8, w9, uxtb
40 ; -O0:    stlxrb w10, w12, [x11]
41 ; -O0:    subs w9, w8, w9, uxtb
42 ; -O0:    subs w9, w9, #1
44 ; -O1-LABEL: atomicrmw_xchg_i8_aligned_release:
45 ; -O1:    ldxrb w8, [x0]
46 ; -O1:    stlxrb w9, w1, [x0]
47     %r = atomicrmw xchg ptr %ptr, i8 %value release, align 1
48     ret i8 %r
51 define dso_local i8 @atomicrmw_xchg_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
52 ; -O0-LABEL: atomicrmw_xchg_i8_aligned_acq_rel:
53 ; -O0:    ldaxrb w8, [x11]
54 ; -O0:    cmp w8, w9, uxtb
55 ; -O0:    stlxrb w10, w12, [x11]
56 ; -O0:    subs w9, w8, w9, uxtb
57 ; -O0:    subs w9, w9, #1
59 ; -O1-LABEL: atomicrmw_xchg_i8_aligned_acq_rel:
60 ; -O1:    ldaxrb w8, [x0]
61 ; -O1:    stlxrb w9, w1, [x0]
62     %r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1
63     ret i8 %r
66 define dso_local i8 @atomicrmw_xchg_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
67 ; -O0-LABEL: atomicrmw_xchg_i8_aligned_seq_cst:
68 ; -O0:    ldaxrb w8, [x11]
69 ; -O0:    cmp w8, w9, uxtb
70 ; -O0:    stlxrb w10, w12, [x11]
71 ; -O0:    subs w9, w8, w9, uxtb
72 ; -O0:    subs w9, w9, #1
74 ; -O1-LABEL: atomicrmw_xchg_i8_aligned_seq_cst:
75 ; -O1:    ldaxrb w8, [x0]
76 ; -O1:    stlxrb w9, w1, [x0]
77     %r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1
78     ret i8 %r
81 define dso_local i16 @atomicrmw_xchg_i16_aligned_monotonic(ptr %ptr, i16 %value) {
82 ; -O0-LABEL: atomicrmw_xchg_i16_aligned_monotonic:
83 ; -O0:    ldaxrh w8, [x11]
84 ; -O0:    cmp w8, w9, uxth
85 ; -O0:    stlxrh w10, w12, [x11]
86 ; -O0:    subs w9, w8, w9, uxth
87 ; -O0:    subs w9, w9, #1
89 ; -O1-LABEL: atomicrmw_xchg_i16_aligned_monotonic:
90 ; -O1:    ldxrh w8, [x0]
91 ; -O1:    stxrh w9, w1, [x0]
92     %r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 2
93     ret i16 %r
96 define dso_local i16 @atomicrmw_xchg_i16_aligned_acquire(ptr %ptr, i16 %value) {
97 ; -O0-LABEL: atomicrmw_xchg_i16_aligned_acquire:
98 ; -O0:    ldaxrh w8, [x11]
99 ; -O0:    cmp w8, w9, uxth
100 ; -O0:    stlxrh w10, w12, [x11]
101 ; -O0:    subs w9, w8, w9, uxth
102 ; -O0:    subs w9, w9, #1
104 ; -O1-LABEL: atomicrmw_xchg_i16_aligned_acquire:
105 ; -O1:    ldaxrh w8, [x0]
106 ; -O1:    stxrh w9, w1, [x0]
107     %r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 2
108     ret i16 %r
111 define dso_local i16 @atomicrmw_xchg_i16_aligned_release(ptr %ptr, i16 %value) {
112 ; -O0-LABEL: atomicrmw_xchg_i16_aligned_release:
113 ; -O0:    ldaxrh w8, [x11]
114 ; -O0:    cmp w8, w9, uxth
115 ; -O0:    stlxrh w10, w12, [x11]
116 ; -O0:    subs w9, w8, w9, uxth
117 ; -O0:    subs w9, w9, #1
119 ; -O1-LABEL: atomicrmw_xchg_i16_aligned_release:
120 ; -O1:    ldxrh w8, [x0]
121 ; -O1:    stlxrh w9, w1, [x0]
122     %r = atomicrmw xchg ptr %ptr, i16 %value release, align 2
123     ret i16 %r
126 define dso_local i16 @atomicrmw_xchg_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
127 ; -O0-LABEL: atomicrmw_xchg_i16_aligned_acq_rel:
128 ; -O0:    ldaxrh w8, [x11]
129 ; -O0:    cmp w8, w9, uxth
130 ; -O0:    stlxrh w10, w12, [x11]
131 ; -O0:    subs w9, w8, w9, uxth
132 ; -O0:    subs w9, w9, #1
134 ; -O1-LABEL: atomicrmw_xchg_i16_aligned_acq_rel:
135 ; -O1:    ldaxrh w8, [x0]
136 ; -O1:    stlxrh w9, w1, [x0]
137     %r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 2
138     ret i16 %r
141 define dso_local i16 @atomicrmw_xchg_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
142 ; -O0-LABEL: atomicrmw_xchg_i16_aligned_seq_cst:
143 ; -O0:    ldaxrh w8, [x11]
144 ; -O0:    cmp w8, w9, uxth
145 ; -O0:    stlxrh w10, w12, [x11]
146 ; -O0:    subs w9, w8, w9, uxth
147 ; -O0:    subs w9, w9, #1
149 ; -O1-LABEL: atomicrmw_xchg_i16_aligned_seq_cst:
150 ; -O1:    ldaxrh w8, [x0]
151 ; -O1:    stlxrh w9, w1, [x0]
152     %r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 2
153     ret i16 %r
156 define dso_local i32 @atomicrmw_xchg_i32_aligned_monotonic(ptr %ptr, i32 %value) {
157 ; -O0-LABEL: atomicrmw_xchg_i32_aligned_monotonic:
158 ; -O0:    ldaxr w8, [x11]
159 ; -O0:    cmp w8, w9
160 ; -O0:    stlxr w10, w12, [x11]
161 ; -O0:    subs w9, w8, w9
162 ; -O0:    subs w9, w9, #1
164 ; -O1-LABEL: atomicrmw_xchg_i32_aligned_monotonic:
165 ; -O1:    ldxr w0, [x8]
166 ; -O1:    stxr w9, w1, [x8]
167     %r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 4
168     ret i32 %r
171 define dso_local i32 @atomicrmw_xchg_i32_aligned_acquire(ptr %ptr, i32 %value) {
172 ; -O0-LABEL: atomicrmw_xchg_i32_aligned_acquire:
173 ; -O0:    ldaxr w8, [x11]
174 ; -O0:    cmp w8, w9
175 ; -O0:    stlxr w10, w12, [x11]
176 ; -O0:    subs w9, w8, w9
177 ; -O0:    subs w9, w9, #1
179 ; -O1-LABEL: atomicrmw_xchg_i32_aligned_acquire:
180 ; -O1:    ldaxr w0, [x8]
181 ; -O1:    stxr w9, w1, [x8]
182     %r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 4
183     ret i32 %r
186 define dso_local i32 @atomicrmw_xchg_i32_aligned_release(ptr %ptr, i32 %value) {
187 ; -O0-LABEL: atomicrmw_xchg_i32_aligned_release:
188 ; -O0:    ldaxr w8, [x11]
189 ; -O0:    cmp w8, w9
190 ; -O0:    stlxr w10, w12, [x11]
191 ; -O0:    subs w9, w8, w9
192 ; -O0:    subs w9, w9, #1
194 ; -O1-LABEL: atomicrmw_xchg_i32_aligned_release:
195 ; -O1:    ldxr w0, [x8]
196 ; -O1:    stlxr w9, w1, [x8]
197     %r = atomicrmw xchg ptr %ptr, i32 %value release, align 4
198     ret i32 %r
201 define dso_local i32 @atomicrmw_xchg_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
202 ; -O0-LABEL: atomicrmw_xchg_i32_aligned_acq_rel:
203 ; -O0:    ldaxr w8, [x11]
204 ; -O0:    cmp w8, w9
205 ; -O0:    stlxr w10, w12, [x11]
206 ; -O0:    subs w9, w8, w9
207 ; -O0:    subs w9, w9, #1
209 ; -O1-LABEL: atomicrmw_xchg_i32_aligned_acq_rel:
210 ; -O1:    ldaxr w0, [x8]
211 ; -O1:    stlxr w9, w1, [x8]
212     %r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 4
213     ret i32 %r
216 define dso_local i32 @atomicrmw_xchg_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
217 ; -O0-LABEL: atomicrmw_xchg_i32_aligned_seq_cst:
218 ; -O0:    ldaxr w8, [x11]
219 ; -O0:    cmp w8, w9
220 ; -O0:    stlxr w10, w12, [x11]
221 ; -O0:    subs w9, w8, w9
222 ; -O0:    subs w9, w9, #1
224 ; -O1-LABEL: atomicrmw_xchg_i32_aligned_seq_cst:
225 ; -O1:    ldaxr w0, [x8]
226 ; -O1:    stlxr w9, w1, [x8]
227     %r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 4
228     ret i32 %r
231 define dso_local i64 @atomicrmw_xchg_i64_aligned_monotonic(ptr %ptr, i64 %value) {
232 ; -O0-LABEL: atomicrmw_xchg_i64_aligned_monotonic:
233 ; -O0:    ldaxr x8, [x11]
234 ; -O0:    cmp x8, x9
235 ; -O0:    stlxr w10, x12, [x11]
236 ; -O0:    subs x9, x8, x9
237 ; -O0:    subs w9, w9, #1
239 ; -O1-LABEL: atomicrmw_xchg_i64_aligned_monotonic:
240 ; -O1:    ldxr x0, [x8]
241 ; -O1:    stxr w9, x1, [x8]
242     %r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 8
243     ret i64 %r
246 define dso_local i64 @atomicrmw_xchg_i64_aligned_acquire(ptr %ptr, i64 %value) {
247 ; -O0-LABEL: atomicrmw_xchg_i64_aligned_acquire:
248 ; -O0:    ldaxr x8, [x11]
249 ; -O0:    cmp x8, x9
250 ; -O0:    stlxr w10, x12, [x11]
251 ; -O0:    subs x9, x8, x9
252 ; -O0:    subs w9, w9, #1
254 ; -O1-LABEL: atomicrmw_xchg_i64_aligned_acquire:
255 ; -O1:    ldaxr x0, [x8]
256 ; -O1:    stxr w9, x1, [x8]
257     %r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 8
258     ret i64 %r
261 define dso_local i64 @atomicrmw_xchg_i64_aligned_release(ptr %ptr, i64 %value) {
262 ; -O0-LABEL: atomicrmw_xchg_i64_aligned_release:
263 ; -O0:    ldaxr x8, [x11]
264 ; -O0:    cmp x8, x9
265 ; -O0:    stlxr w10, x12, [x11]
266 ; -O0:    subs x9, x8, x9
267 ; -O0:    subs w9, w9, #1
269 ; -O1-LABEL: atomicrmw_xchg_i64_aligned_release:
270 ; -O1:    ldxr x0, [x8]
271 ; -O1:    stlxr w9, x1, [x8]
272     %r = atomicrmw xchg ptr %ptr, i64 %value release, align 8
273     ret i64 %r
276 define dso_local i64 @atomicrmw_xchg_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
277 ; -O0-LABEL: atomicrmw_xchg_i64_aligned_acq_rel:
278 ; -O0:    ldaxr x8, [x11]
279 ; -O0:    cmp x8, x9
280 ; -O0:    stlxr w10, x12, [x11]
281 ; -O0:    subs x9, x8, x9
282 ; -O0:    subs w9, w9, #1
284 ; -O1-LABEL: atomicrmw_xchg_i64_aligned_acq_rel:
285 ; -O1:    ldaxr x0, [x8]
286 ; -O1:    stlxr w9, x1, [x8]
287     %r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 8
288     ret i64 %r
291 define dso_local i64 @atomicrmw_xchg_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
292 ; -O0-LABEL: atomicrmw_xchg_i64_aligned_seq_cst:
293 ; -O0:    ldaxr x8, [x11]
294 ; -O0:    cmp x8, x9
295 ; -O0:    stlxr w10, x12, [x11]
296 ; -O0:    subs x9, x8, x9
297 ; -O0:    subs w9, w9, #1
299 ; -O1-LABEL: atomicrmw_xchg_i64_aligned_seq_cst:
300 ; -O1:    ldaxr x0, [x8]
301 ; -O1:    stlxr w9, x1, [x8]
302     %r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 8
303     ret i64 %r
306 define dso_local i128 @atomicrmw_xchg_i128_aligned_monotonic(ptr %ptr, i128 %value) {
307 ; -O0-LABEL: atomicrmw_xchg_i128_aligned_monotonic:
308 ; -O0:    ldxp x10, x12, [x9]
309 ; -O0:    cmp x10, x11
310 ; -O0:    cmp x12, x13
311 ; -O0:    stxp w8, x14, x15, [x9]
312 ; -O0:    stxp w8, x10, x12, [x9]
313 ; -O0:    subs x12, x12, x13
314 ; -O0:    ccmp x10, x11, #0, eq
316 ; -O1-LABEL: atomicrmw_xchg_i128_aligned_monotonic:
317 ; -O1:    ldxp x1, x8, [x0]
318 ; -O1:    stxp w9, x3, x2, [x0]
319     %r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 16
320     ret i128 %r
323 define dso_local i128 @atomicrmw_xchg_i128_aligned_acquire(ptr %ptr, i128 %value) {
324 ; -O0-LABEL: atomicrmw_xchg_i128_aligned_acquire:
325 ; -O0:    ldaxp x10, x12, [x9]
326 ; -O0:    cmp x10, x11
327 ; -O0:    cmp x12, x13
328 ; -O0:    stxp w8, x14, x15, [x9]
329 ; -O0:    stxp w8, x10, x12, [x9]
330 ; -O0:    subs x12, x12, x13
331 ; -O0:    ccmp x10, x11, #0, eq
333 ; -O1-LABEL: atomicrmw_xchg_i128_aligned_acquire:
334 ; -O1:    ldaxp x1, x8, [x0]
335 ; -O1:    stxp w9, x3, x2, [x0]
336     %r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 16
337     ret i128 %r
340 define dso_local i128 @atomicrmw_xchg_i128_aligned_release(ptr %ptr, i128 %value) {
341 ; -O0-LABEL: atomicrmw_xchg_i128_aligned_release:
342 ; -O0:    ldxp x10, x12, [x9]
343 ; -O0:    cmp x10, x11
344 ; -O0:    cmp x12, x13
345 ; -O0:    stlxp w8, x14, x15, [x9]
346 ; -O0:    stlxp w8, x10, x12, [x9]
347 ; -O0:    subs x12, x12, x13
348 ; -O0:    ccmp x10, x11, #0, eq
350 ; -O1-LABEL: atomicrmw_xchg_i128_aligned_release:
351 ; -O1:    ldxp x1, x8, [x0]
352 ; -O1:    stlxp w9, x3, x2, [x0]
353     %r = atomicrmw xchg ptr %ptr, i128 %value release, align 16
354     ret i128 %r
357 define dso_local i128 @atomicrmw_xchg_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
358 ; -O0-LABEL: atomicrmw_xchg_i128_aligned_acq_rel:
359 ; -O0:    ldaxp x10, x12, [x9]
360 ; -O0:    cmp x10, x11
361 ; -O0:    cmp x12, x13
362 ; -O0:    stlxp w8, x14, x15, [x9]
363 ; -O0:    stlxp w8, x10, x12, [x9]
364 ; -O0:    subs x12, x12, x13
365 ; -O0:    ccmp x10, x11, #0, eq
367 ; -O1-LABEL: atomicrmw_xchg_i128_aligned_acq_rel:
368 ; -O1:    ldaxp x1, x8, [x0]
369 ; -O1:    stlxp w9, x3, x2, [x0]
370     %r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 16
371     ret i128 %r
374 define dso_local i128 @atomicrmw_xchg_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
375 ; -O0-LABEL: atomicrmw_xchg_i128_aligned_seq_cst:
376 ; -O0:    ldaxp x10, x12, [x9]
377 ; -O0:    cmp x10, x11
378 ; -O0:    cmp x12, x13
379 ; -O0:    stlxp w8, x14, x15, [x9]
380 ; -O0:    stlxp w8, x10, x12, [x9]
381 ; -O0:    subs x12, x12, x13
382 ; -O0:    ccmp x10, x11, #0, eq
384 ; -O1-LABEL: atomicrmw_xchg_i128_aligned_seq_cst:
385 ; -O1:    ldaxp x1, x8, [x0]
386 ; -O1:    stlxp w9, x3, x2, [x0]
387     %r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 16
388     ret i128 %r
391 define dso_local i8 @atomicrmw_xchg_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
392 ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_monotonic:
393 ; -O0:    ldaxrb w8, [x11]
394 ; -O0:    cmp w8, w9, uxtb
395 ; -O0:    stlxrb w10, w12, [x11]
396 ; -O0:    subs w9, w8, w9, uxtb
397 ; -O0:    subs w9, w9, #1
399 ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_monotonic:
400 ; -O1:    ldxrb w8, [x0]
401 ; -O1:    stxrb w9, w1, [x0]
402     %r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1
403     ret i8 %r
406 define dso_local i8 @atomicrmw_xchg_i8_unaligned_acquire(ptr %ptr, i8 %value) {
407 ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_acquire:
408 ; -O0:    ldaxrb w8, [x11]
409 ; -O0:    cmp w8, w9, uxtb
410 ; -O0:    stlxrb w10, w12, [x11]
411 ; -O0:    subs w9, w8, w9, uxtb
412 ; -O0:    subs w9, w9, #1
414 ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_acquire:
415 ; -O1:    ldaxrb w8, [x0]
416 ; -O1:    stxrb w9, w1, [x0]
417     %r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1
418     ret i8 %r
421 define dso_local i8 @atomicrmw_xchg_i8_unaligned_release(ptr %ptr, i8 %value) {
422 ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_release:
423 ; -O0:    ldaxrb w8, [x11]
424 ; -O0:    cmp w8, w9, uxtb
425 ; -O0:    stlxrb w10, w12, [x11]
426 ; -O0:    subs w9, w8, w9, uxtb
427 ; -O0:    subs w9, w9, #1
429 ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_release:
430 ; -O1:    ldxrb w8, [x0]
431 ; -O1:    stlxrb w9, w1, [x0]
432     %r = atomicrmw xchg ptr %ptr, i8 %value release, align 1
433     ret i8 %r
436 define dso_local i8 @atomicrmw_xchg_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
437 ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_acq_rel:
438 ; -O0:    ldaxrb w8, [x11]
439 ; -O0:    cmp w8, w9, uxtb
440 ; -O0:    stlxrb w10, w12, [x11]
441 ; -O0:    subs w9, w8, w9, uxtb
442 ; -O0:    subs w9, w9, #1
444 ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_acq_rel:
445 ; -O1:    ldaxrb w8, [x0]
446 ; -O1:    stlxrb w9, w1, [x0]
447     %r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1
448     ret i8 %r
451 define dso_local i8 @atomicrmw_xchg_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
452 ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_seq_cst:
453 ; -O0:    ldaxrb w8, [x11]
454 ; -O0:    cmp w8, w9, uxtb
455 ; -O0:    stlxrb w10, w12, [x11]
456 ; -O0:    subs w9, w8, w9, uxtb
457 ; -O0:    subs w9, w9, #1
459 ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_seq_cst:
460 ; -O1:    ldaxrb w8, [x0]
461 ; -O1:    stlxrb w9, w1, [x0]
462     %r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1
463     ret i8 %r
466 define dso_local i16 @atomicrmw_xchg_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
467 ; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_monotonic:
468 ; CHECK:    bl __atomic_exchange
469     %r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 1
470     ret i16 %r
473 define dso_local i16 @atomicrmw_xchg_i16_unaligned_acquire(ptr %ptr, i16 %value) {
474 ; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acquire:
475 ; CHECK:    bl __atomic_exchange
476     %r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 1
477     ret i16 %r
480 define dso_local i16 @atomicrmw_xchg_i16_unaligned_release(ptr %ptr, i16 %value) {
481 ; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_release:
482 ; CHECK:    bl __atomic_exchange
483     %r = atomicrmw xchg ptr %ptr, i16 %value release, align 1
484     ret i16 %r
487 define dso_local i16 @atomicrmw_xchg_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
488 ; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acq_rel:
489 ; CHECK:    bl __atomic_exchange
490     %r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 1
491     ret i16 %r
494 define dso_local i16 @atomicrmw_xchg_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
495 ; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_seq_cst:
496 ; CHECK:    bl __atomic_exchange
497     %r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 1
498     ret i16 %r
501 define dso_local i32 @atomicrmw_xchg_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
502 ; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_monotonic:
503 ; CHECK:    bl __atomic_exchange
504     %r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 1
505     ret i32 %r
508 define dso_local i32 @atomicrmw_xchg_i32_unaligned_acquire(ptr %ptr, i32 %value) {
509 ; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acquire:
510 ; CHECK:    bl __atomic_exchange
511     %r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 1
512     ret i32 %r
515 define dso_local i32 @atomicrmw_xchg_i32_unaligned_release(ptr %ptr, i32 %value) {
516 ; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_release:
517 ; CHECK:    bl __atomic_exchange
518     %r = atomicrmw xchg ptr %ptr, i32 %value release, align 1
519     ret i32 %r
522 define dso_local i32 @atomicrmw_xchg_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
523 ; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acq_rel:
524 ; CHECK:    bl __atomic_exchange
525     %r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 1
526     ret i32 %r
529 define dso_local i32 @atomicrmw_xchg_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
530 ; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_seq_cst:
531 ; CHECK:    bl __atomic_exchange
532     %r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 1
533     ret i32 %r
536 define dso_local i64 @atomicrmw_xchg_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
537 ; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_monotonic:
538 ; CHECK:    bl __atomic_exchange
539     %r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 1
540     ret i64 %r
543 define dso_local i64 @atomicrmw_xchg_i64_unaligned_acquire(ptr %ptr, i64 %value) {
544 ; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acquire:
545 ; CHECK:    bl __atomic_exchange
546     %r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 1
547     ret i64 %r
550 define dso_local i64 @atomicrmw_xchg_i64_unaligned_release(ptr %ptr, i64 %value) {
551 ; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_release:
552 ; CHECK:    bl __atomic_exchange
553     %r = atomicrmw xchg ptr %ptr, i64 %value release, align 1
554     ret i64 %r
557 define dso_local i64 @atomicrmw_xchg_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
558 ; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acq_rel:
559 ; CHECK:    bl __atomic_exchange
560     %r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 1
561     ret i64 %r
564 define dso_local i64 @atomicrmw_xchg_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
565 ; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_seq_cst:
566 ; CHECK:    bl __atomic_exchange
567     %r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 1
568     ret i64 %r
571 define dso_local i128 @atomicrmw_xchg_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
572 ; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_monotonic:
573 ; CHECK:    bl __atomic_exchange
574     %r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 1
575     ret i128 %r
578 define dso_local i128 @atomicrmw_xchg_i128_unaligned_acquire(ptr %ptr, i128 %value) {
579 ; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acquire:
580 ; CHECK:    bl __atomic_exchange
581     %r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 1
582     ret i128 %r
585 define dso_local i128 @atomicrmw_xchg_i128_unaligned_release(ptr %ptr, i128 %value) {
586 ; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_release:
587 ; CHECK:    bl __atomic_exchange
588     %r = atomicrmw xchg ptr %ptr, i128 %value release, align 1
589     ret i128 %r
592 define dso_local i128 @atomicrmw_xchg_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
593 ; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acq_rel:
594 ; CHECK:    bl __atomic_exchange
595     %r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 1
596     ret i128 %r
599 define dso_local i128 @atomicrmw_xchg_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
600 ; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_seq_cst:
601 ; CHECK:    bl __atomic_exchange
602     %r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 1
603     ret i128 %r
606 define dso_local i8 @atomicrmw_add_i8_aligned_monotonic(ptr %ptr, i8 %value) {
607 ; -O0-LABEL: atomicrmw_add_i8_aligned_monotonic:
608 ; -O0:    add w12, w9, w8
609 ; -O0:    ldaxrb w8, [x11]
610 ; -O0:    cmp w8, w9, uxtb
611 ; -O0:    stlxrb w10, w12, [x11]
612 ; -O0:    subs w9, w8, w9, uxtb
613 ; -O0:    subs w9, w9, #1
615 ; -O1-LABEL: atomicrmw_add_i8_aligned_monotonic:
616 ; -O1:    ldxrb w8, [x0]
617 ; -O1:    add w9, w8, w1
618 ; -O1:    stxrb w10, w9, [x0]
619     %r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1
620     ret i8 %r
623 define dso_local i8 @atomicrmw_add_i8_aligned_acquire(ptr %ptr, i8 %value) {
624 ; -O0-LABEL: atomicrmw_add_i8_aligned_acquire:
625 ; -O0:    add w12, w9, w8
626 ; -O0:    ldaxrb w8, [x11]
627 ; -O0:    cmp w8, w9, uxtb
628 ; -O0:    stlxrb w10, w12, [x11]
629 ; -O0:    subs w9, w8, w9, uxtb
630 ; -O0:    subs w9, w9, #1
632 ; -O1-LABEL: atomicrmw_add_i8_aligned_acquire:
633 ; -O1:    ldaxrb w8, [x0]
634 ; -O1:    add w9, w8, w1
635 ; -O1:    stxrb w10, w9, [x0]
636     %r = atomicrmw add ptr %ptr, i8 %value acquire, align 1
637     ret i8 %r
640 define dso_local i8 @atomicrmw_add_i8_aligned_release(ptr %ptr, i8 %value) {
641 ; -O0-LABEL: atomicrmw_add_i8_aligned_release:
642 ; -O0:    add w12, w9, w8
643 ; -O0:    ldaxrb w8, [x11]
644 ; -O0:    cmp w8, w9, uxtb
645 ; -O0:    stlxrb w10, w12, [x11]
646 ; -O0:    subs w9, w8, w9, uxtb
647 ; -O0:    subs w9, w9, #1
649 ; -O1-LABEL: atomicrmw_add_i8_aligned_release:
650 ; -O1:    ldxrb w8, [x0]
651 ; -O1:    add w9, w8, w1
652 ; -O1:    stlxrb w10, w9, [x0]
653     %r = atomicrmw add ptr %ptr, i8 %value release, align 1
654     ret i8 %r
657 define dso_local i8 @atomicrmw_add_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
658 ; -O0-LABEL: atomicrmw_add_i8_aligned_acq_rel:
659 ; -O0:    add w12, w9, w8
660 ; -O0:    ldaxrb w8, [x11]
661 ; -O0:    cmp w8, w9, uxtb
662 ; -O0:    stlxrb w10, w12, [x11]
663 ; -O0:    subs w9, w8, w9, uxtb
664 ; -O0:    subs w9, w9, #1
666 ; -O1-LABEL: atomicrmw_add_i8_aligned_acq_rel:
667 ; -O1:    ldaxrb w8, [x0]
668 ; -O1:    add w9, w8, w1
669 ; -O1:    stlxrb w10, w9, [x0]
670     %r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1
671     ret i8 %r
674 define dso_local i8 @atomicrmw_add_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
675 ; -O0-LABEL: atomicrmw_add_i8_aligned_seq_cst:
676 ; -O0:    add w12, w9, w8
677 ; -O0:    ldaxrb w8, [x11]
678 ; -O0:    cmp w8, w9, uxtb
679 ; -O0:    stlxrb w10, w12, [x11]
680 ; -O0:    subs w9, w8, w9, uxtb
681 ; -O0:    subs w9, w9, #1
683 ; -O1-LABEL: atomicrmw_add_i8_aligned_seq_cst:
684 ; -O1:    ldaxrb w8, [x0]
685 ; -O1:    add w9, w8, w1
686 ; -O1:    stlxrb w10, w9, [x0]
687     %r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1
688     ret i8 %r
691 define dso_local i16 @atomicrmw_add_i16_aligned_monotonic(ptr %ptr, i16 %value) {
692 ; -O0-LABEL: atomicrmw_add_i16_aligned_monotonic:
693 ; -O0:    add w12, w9, w8
694 ; -O0:    ldaxrh w8, [x11]
695 ; -O0:    cmp w8, w9, uxth
696 ; -O0:    stlxrh w10, w12, [x11]
697 ; -O0:    subs w9, w8, w9, uxth
698 ; -O0:    subs w9, w9, #1
700 ; -O1-LABEL: atomicrmw_add_i16_aligned_monotonic:
701 ; -O1:    ldxrh w8, [x0]
702 ; -O1:    add w9, w8, w1
703 ; -O1:    stxrh w10, w9, [x0]
704     %r = atomicrmw add ptr %ptr, i16 %value monotonic, align 2
705     ret i16 %r
708 define dso_local i16 @atomicrmw_add_i16_aligned_acquire(ptr %ptr, i16 %value) {
709 ; -O0-LABEL: atomicrmw_add_i16_aligned_acquire:
710 ; -O0:    add w12, w9, w8
711 ; -O0:    ldaxrh w8, [x11]
712 ; -O0:    cmp w8, w9, uxth
713 ; -O0:    stlxrh w10, w12, [x11]
714 ; -O0:    subs w9, w8, w9, uxth
715 ; -O0:    subs w9, w9, #1
717 ; -O1-LABEL: atomicrmw_add_i16_aligned_acquire:
718 ; -O1:    ldaxrh w8, [x0]
719 ; -O1:    add w9, w8, w1
720 ; -O1:    stxrh w10, w9, [x0]
721     %r = atomicrmw add ptr %ptr, i16 %value acquire, align 2
722     ret i16 %r
725 define dso_local i16 @atomicrmw_add_i16_aligned_release(ptr %ptr, i16 %value) {
726 ; -O0-LABEL: atomicrmw_add_i16_aligned_release:
727 ; -O0:    add w12, w9, w8
728 ; -O0:    ldaxrh w8, [x11]
729 ; -O0:    cmp w8, w9, uxth
730 ; -O0:    stlxrh w10, w12, [x11]
731 ; -O0:    subs w9, w8, w9, uxth
732 ; -O0:    subs w9, w9, #1
734 ; -O1-LABEL: atomicrmw_add_i16_aligned_release:
735 ; -O1:    ldxrh w8, [x0]
736 ; -O1:    add w9, w8, w1
737 ; -O1:    stlxrh w10, w9, [x0]
738     %r = atomicrmw add ptr %ptr, i16 %value release, align 2
739     ret i16 %r
742 define dso_local i16 @atomicrmw_add_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
743 ; -O0-LABEL: atomicrmw_add_i16_aligned_acq_rel:
744 ; -O0:    add w12, w9, w8
745 ; -O0:    ldaxrh w8, [x11]
746 ; -O0:    cmp w8, w9, uxth
747 ; -O0:    stlxrh w10, w12, [x11]
748 ; -O0:    subs w9, w8, w9, uxth
749 ; -O0:    subs w9, w9, #1
751 ; -O1-LABEL: atomicrmw_add_i16_aligned_acq_rel:
752 ; -O1:    ldaxrh w8, [x0]
753 ; -O1:    add w9, w8, w1
754 ; -O1:    stlxrh w10, w9, [x0]
755     %r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 2
756     ret i16 %r
759 define dso_local i16 @atomicrmw_add_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
760 ; -O0-LABEL: atomicrmw_add_i16_aligned_seq_cst:
761 ; -O0:    add w12, w9, w8
762 ; -O0:    ldaxrh w8, [x11]
763 ; -O0:    cmp w8, w9, uxth
764 ; -O0:    stlxrh w10, w12, [x11]
765 ; -O0:    subs w9, w8, w9, uxth
766 ; -O0:    subs w9, w9, #1
768 ; -O1-LABEL: atomicrmw_add_i16_aligned_seq_cst:
769 ; -O1:    ldaxrh w8, [x0]
770 ; -O1:    add w9, w8, w1
771 ; -O1:    stlxrh w10, w9, [x0]
772     %r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 2
773     ret i16 %r
776 define dso_local i32 @atomicrmw_add_i32_aligned_monotonic(ptr %ptr, i32 %value) {
777 ; -O0-LABEL: atomicrmw_add_i32_aligned_monotonic:
778 ; -O0:    add w12, w9, w8
779 ; -O0:    ldaxr w8, [x11]
780 ; -O0:    cmp w8, w9
781 ; -O0:    stlxr w10, w12, [x11]
782 ; -O0:    subs w9, w8, w9
783 ; -O0:    subs w9, w9, #1
785 ; -O1-LABEL: atomicrmw_add_i32_aligned_monotonic:
786 ; -O1:    ldxr w8, [x0]
787 ; -O1:    add w9, w8, w1
788 ; -O1:    stxr w10, w9, [x0]
789     %r = atomicrmw add ptr %ptr, i32 %value monotonic, align 4
790     ret i32 %r
793 define dso_local i32 @atomicrmw_add_i32_aligned_acquire(ptr %ptr, i32 %value) {
794 ; -O0-LABEL: atomicrmw_add_i32_aligned_acquire:
795 ; -O0:    add w12, w9, w8
796 ; -O0:    ldaxr w8, [x11]
797 ; -O0:    cmp w8, w9
798 ; -O0:    stlxr w10, w12, [x11]
799 ; -O0:    subs w9, w8, w9
800 ; -O0:    subs w9, w9, #1
802 ; -O1-LABEL: atomicrmw_add_i32_aligned_acquire:
803 ; -O1:    ldaxr w8, [x0]
804 ; -O1:    add w9, w8, w1
805 ; -O1:    stxr w10, w9, [x0]
806     %r = atomicrmw add ptr %ptr, i32 %value acquire, align 4
807     ret i32 %r
810 define dso_local i32 @atomicrmw_add_i32_aligned_release(ptr %ptr, i32 %value) {
811 ; -O0-LABEL: atomicrmw_add_i32_aligned_release:
812 ; -O0:    add w12, w9, w8
813 ; -O0:    ldaxr w8, [x11]
814 ; -O0:    cmp w8, w9
815 ; -O0:    stlxr w10, w12, [x11]
816 ; -O0:    subs w9, w8, w9
817 ; -O0:    subs w9, w9, #1
819 ; -O1-LABEL: atomicrmw_add_i32_aligned_release:
820 ; -O1:    ldxr w8, [x0]
821 ; -O1:    add w9, w8, w1
822 ; -O1:    stlxr w10, w9, [x0]
823     %r = atomicrmw add ptr %ptr, i32 %value release, align 4
824     ret i32 %r
827 define dso_local i32 @atomicrmw_add_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
828 ; -O0-LABEL: atomicrmw_add_i32_aligned_acq_rel:
829 ; -O0:    add w12, w9, w8
830 ; -O0:    ldaxr w8, [x11]
831 ; -O0:    cmp w8, w9
832 ; -O0:    stlxr w10, w12, [x11]
833 ; -O0:    subs w9, w8, w9
834 ; -O0:    subs w9, w9, #1
836 ; -O1-LABEL: atomicrmw_add_i32_aligned_acq_rel:
837 ; -O1:    ldaxr w8, [x0]
838 ; -O1:    add w9, w8, w1
839 ; -O1:    stlxr w10, w9, [x0]
840     %r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 4
841     ret i32 %r
844 define dso_local i32 @atomicrmw_add_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
845 ; -O0-LABEL: atomicrmw_add_i32_aligned_seq_cst:
846 ; -O0:    add w12, w9, w8
847 ; -O0:    ldaxr w8, [x11]
848 ; -O0:    cmp w8, w9
849 ; -O0:    stlxr w10, w12, [x11]
850 ; -O0:    subs w9, w8, w9
851 ; -O0:    subs w9, w9, #1
853 ; -O1-LABEL: atomicrmw_add_i32_aligned_seq_cst:
854 ; -O1:    ldaxr w8, [x0]
855 ; -O1:    add w9, w8, w1
856 ; -O1:    stlxr w10, w9, [x0]
857     %r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 4
858     ret i32 %r
861 define dso_local i64 @atomicrmw_add_i64_aligned_monotonic(ptr %ptr, i64 %value) {
862 ; -O0-LABEL: atomicrmw_add_i64_aligned_monotonic:
863 ; -O0:    add x12, x9, x8
864 ; -O0:    ldaxr x8, [x11]
865 ; -O0:    cmp x8, x9
866 ; -O0:    stlxr w10, x12, [x11]
867 ; -O0:    subs x9, x8, x9
868 ; -O0:    subs w9, w9, #1
870 ; -O1-LABEL: atomicrmw_add_i64_aligned_monotonic:
871 ; -O1:    ldxr x0, [x8]
872 ; -O1:    add x9, x0, x1
873 ; -O1:    stxr w10, x9, [x8]
874     %r = atomicrmw add ptr %ptr, i64 %value monotonic, align 8
875     ret i64 %r
878 define dso_local i64 @atomicrmw_add_i64_aligned_acquire(ptr %ptr, i64 %value) {
879 ; -O0-LABEL: atomicrmw_add_i64_aligned_acquire:
880 ; -O0:    add x12, x9, x8
881 ; -O0:    ldaxr x8, [x11]
882 ; -O0:    cmp x8, x9
883 ; -O0:    stlxr w10, x12, [x11]
884 ; -O0:    subs x9, x8, x9
885 ; -O0:    subs w9, w9, #1
887 ; -O1-LABEL: atomicrmw_add_i64_aligned_acquire:
888 ; -O1:    ldaxr x0, [x8]
889 ; -O1:    add x9, x0, x1
890 ; -O1:    stxr w10, x9, [x8]
891     %r = atomicrmw add ptr %ptr, i64 %value acquire, align 8
892     ret i64 %r
895 define dso_local i64 @atomicrmw_add_i64_aligned_release(ptr %ptr, i64 %value) {
896 ; -O0-LABEL: atomicrmw_add_i64_aligned_release:
897 ; -O0:    add x12, x9, x8
898 ; -O0:    ldaxr x8, [x11]
899 ; -O0:    cmp x8, x9
900 ; -O0:    stlxr w10, x12, [x11]
901 ; -O0:    subs x9, x8, x9
902 ; -O0:    subs w9, w9, #1
904 ; -O1-LABEL: atomicrmw_add_i64_aligned_release:
905 ; -O1:    ldxr x0, [x8]
906 ; -O1:    add x9, x0, x1
907 ; -O1:    stlxr w10, x9, [x8]
908     %r = atomicrmw add ptr %ptr, i64 %value release, align 8
909     ret i64 %r
912 define dso_local i64 @atomicrmw_add_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
913 ; -O0-LABEL: atomicrmw_add_i64_aligned_acq_rel:
914 ; -O0:    add x12, x9, x8
915 ; -O0:    ldaxr x8, [x11]
916 ; -O0:    cmp x8, x9
917 ; -O0:    stlxr w10, x12, [x11]
918 ; -O0:    subs x9, x8, x9
919 ; -O0:    subs w9, w9, #1
921 ; -O1-LABEL: atomicrmw_add_i64_aligned_acq_rel:
922 ; -O1:    ldaxr x0, [x8]
923 ; -O1:    add x9, x0, x1
924 ; -O1:    stlxr w10, x9, [x8]
925     %r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 8
926     ret i64 %r
929 define dso_local i64 @atomicrmw_add_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
930 ; -O0-LABEL: atomicrmw_add_i64_aligned_seq_cst:
931 ; -O0:    add x12, x9, x8
932 ; -O0:    ldaxr x8, [x11]
933 ; -O0:    cmp x8, x9
934 ; -O0:    stlxr w10, x12, [x11]
935 ; -O0:    subs x9, x8, x9
936 ; -O0:    subs w9, w9, #1
938 ; -O1-LABEL: atomicrmw_add_i64_aligned_seq_cst:
939 ; -O1:    ldaxr x0, [x8]
940 ; -O1:    add x9, x0, x1
941 ; -O1:    stlxr w10, x9, [x8]
942     %r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 8
943     ret i64 %r
946 define dso_local i128 @atomicrmw_add_i128_aligned_monotonic(ptr %ptr, i128 %value) {
947 ; -O0-LABEL: atomicrmw_add_i128_aligned_monotonic:
948 ; -O0:    adds x14, x11, x10
949 ; -O0:    ldxp x10, x12, [x9]
950 ; -O0:    cmp x10, x11
951 ; -O0:    cmp x12, x13
952 ; -O0:    stxp w8, x14, x15, [x9]
953 ; -O0:    stxp w8, x10, x12, [x9]
954 ; -O0:    subs x12, x12, x13
955 ; -O0:    ccmp x10, x11, #0, eq
957 ; -O1-LABEL: atomicrmw_add_i128_aligned_monotonic:
958 ; -O1:    ldxp x1, x0, [x8]
959 ; -O1:    adds x9, x1, x3
960 ; -O1:    stxp w11, x9, x10, [x8]
961     %r = atomicrmw add ptr %ptr, i128 %value monotonic, align 16
962     ret i128 %r
965 define dso_local i128 @atomicrmw_add_i128_aligned_acquire(ptr %ptr, i128 %value) {
966 ; -O0-LABEL: atomicrmw_add_i128_aligned_acquire:
967 ; -O0:    adds x14, x11, x10
968 ; -O0:    ldaxp x10, x12, [x9]
969 ; -O0:    cmp x10, x11
970 ; -O0:    cmp x12, x13
971 ; -O0:    stxp w8, x14, x15, [x9]
972 ; -O0:    stxp w8, x10, x12, [x9]
973 ; -O0:    subs x12, x12, x13
974 ; -O0:    ccmp x10, x11, #0, eq
976 ; -O1-LABEL: atomicrmw_add_i128_aligned_acquire:
977 ; -O1:    ldaxp x1, x0, [x8]
978 ; -O1:    adds x9, x1, x3
979 ; -O1:    stxp w11, x9, x10, [x8]
980     %r = atomicrmw add ptr %ptr, i128 %value acquire, align 16
981     ret i128 %r
984 define dso_local i128 @atomicrmw_add_i128_aligned_release(ptr %ptr, i128 %value) {
985 ; -O0-LABEL: atomicrmw_add_i128_aligned_release:
986 ; -O0:    adds x14, x11, x10
987 ; -O0:    ldxp x10, x12, [x9]
988 ; -O0:    cmp x10, x11
989 ; -O0:    cmp x12, x13
990 ; -O0:    stlxp w8, x14, x15, [x9]
991 ; -O0:    stlxp w8, x10, x12, [x9]
992 ; -O0:    subs x12, x12, x13
993 ; -O0:    ccmp x10, x11, #0, eq
995 ; -O1-LABEL: atomicrmw_add_i128_aligned_release:
996 ; -O1:    ldxp x1, x0, [x8]
997 ; -O1:    adds x9, x1, x3
998 ; -O1:    stlxp w11, x9, x10, [x8]
999     %r = atomicrmw add ptr %ptr, i128 %value release, align 16
1000     ret i128 %r
1003 define dso_local i128 @atomicrmw_add_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
1004 ; -O0-LABEL: atomicrmw_add_i128_aligned_acq_rel:
1005 ; -O0:    adds x14, x11, x10
1006 ; -O0:    ldaxp x10, x12, [x9]
1007 ; -O0:    cmp x10, x11
1008 ; -O0:    cmp x12, x13
1009 ; -O0:    stlxp w8, x14, x15, [x9]
1010 ; -O0:    stlxp w8, x10, x12, [x9]
1011 ; -O0:    subs x12, x12, x13
1012 ; -O0:    ccmp x10, x11, #0, eq
1014 ; -O1-LABEL: atomicrmw_add_i128_aligned_acq_rel:
1015 ; -O1:    ldaxp x1, x0, [x8]
1016 ; -O1:    adds x9, x1, x3
1017 ; -O1:    stlxp w11, x9, x10, [x8]
1018     %r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 16
1019     ret i128 %r
1022 define dso_local i128 @atomicrmw_add_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
1023 ; -O0-LABEL: atomicrmw_add_i128_aligned_seq_cst:
1024 ; -O0:    adds x14, x11, x10
1025 ; -O0:    ldaxp x10, x12, [x9]
1026 ; -O0:    cmp x10, x11
1027 ; -O0:    cmp x12, x13
1028 ; -O0:    stlxp w8, x14, x15, [x9]
1029 ; -O0:    stlxp w8, x10, x12, [x9]
1030 ; -O0:    subs x12, x12, x13
1031 ; -O0:    ccmp x10, x11, #0, eq
1033 ; -O1-LABEL: atomicrmw_add_i128_aligned_seq_cst:
1034 ; -O1:    ldaxp x1, x0, [x8]
1035 ; -O1:    adds x9, x1, x3
1036 ; -O1:    stlxp w11, x9, x10, [x8]
1037     %r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 16
1038     ret i128 %r
1041 define dso_local i8 @atomicrmw_add_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
1042 ; -O0-LABEL: atomicrmw_add_i8_unaligned_monotonic:
1043 ; -O0:    add w12, w9, w8
1044 ; -O0:    ldaxrb w8, [x11]
1045 ; -O0:    cmp w8, w9, uxtb
1046 ; -O0:    stlxrb w10, w12, [x11]
1047 ; -O0:    subs w9, w8, w9, uxtb
1048 ; -O0:    subs w9, w9, #1
1050 ; -O1-LABEL: atomicrmw_add_i8_unaligned_monotonic:
1051 ; -O1:    ldxrb w8, [x0]
1052 ; -O1:    add w9, w8, w1
1053 ; -O1:    stxrb w10, w9, [x0]
1054     %r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1
1055     ret i8 %r
1058 define dso_local i8 @atomicrmw_add_i8_unaligned_acquire(ptr %ptr, i8 %value) {
1059 ; -O0-LABEL: atomicrmw_add_i8_unaligned_acquire:
1060 ; -O0:    add w12, w9, w8
1061 ; -O0:    ldaxrb w8, [x11]
1062 ; -O0:    cmp w8, w9, uxtb
1063 ; -O0:    stlxrb w10, w12, [x11]
1064 ; -O0:    subs w9, w8, w9, uxtb
1065 ; -O0:    subs w9, w9, #1
1067 ; -O1-LABEL: atomicrmw_add_i8_unaligned_acquire:
1068 ; -O1:    ldaxrb w8, [x0]
1069 ; -O1:    add w9, w8, w1
1070 ; -O1:    stxrb w10, w9, [x0]
1071     %r = atomicrmw add ptr %ptr, i8 %value acquire, align 1
1072     ret i8 %r
1075 define dso_local i8 @atomicrmw_add_i8_unaligned_release(ptr %ptr, i8 %value) {
1076 ; -O0-LABEL: atomicrmw_add_i8_unaligned_release:
1077 ; -O0:    add w12, w9, w8
1078 ; -O0:    ldaxrb w8, [x11]
1079 ; -O0:    cmp w8, w9, uxtb
1080 ; -O0:    stlxrb w10, w12, [x11]
1081 ; -O0:    subs w9, w8, w9, uxtb
1082 ; -O0:    subs w9, w9, #1
1084 ; -O1-LABEL: atomicrmw_add_i8_unaligned_release:
1085 ; -O1:    ldxrb w8, [x0]
1086 ; -O1:    add w9, w8, w1
1087 ; -O1:    stlxrb w10, w9, [x0]
1088     %r = atomicrmw add ptr %ptr, i8 %value release, align 1
1089     ret i8 %r
1092 define dso_local i8 @atomicrmw_add_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
1093 ; -O0-LABEL: atomicrmw_add_i8_unaligned_acq_rel:
1094 ; -O0:    add w12, w9, w8
1095 ; -O0:    ldaxrb w8, [x11]
1096 ; -O0:    cmp w8, w9, uxtb
1097 ; -O0:    stlxrb w10, w12, [x11]
1098 ; -O0:    subs w9, w8, w9, uxtb
1099 ; -O0:    subs w9, w9, #1
1101 ; -O1-LABEL: atomicrmw_add_i8_unaligned_acq_rel:
1102 ; -O1:    ldaxrb w8, [x0]
1103 ; -O1:    add w9, w8, w1
1104 ; -O1:    stlxrb w10, w9, [x0]
1105     %r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1
1106     ret i8 %r
1109 define dso_local i8 @atomicrmw_add_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
1110 ; -O0-LABEL: atomicrmw_add_i8_unaligned_seq_cst:
1111 ; -O0:    add w12, w9, w8
1112 ; -O0:    ldaxrb w8, [x11]
1113 ; -O0:    cmp w8, w9, uxtb
1114 ; -O0:    stlxrb w10, w12, [x11]
1115 ; -O0:    subs w9, w8, w9, uxtb
1116 ; -O0:    subs w9, w9, #1
1118 ; -O1-LABEL: atomicrmw_add_i8_unaligned_seq_cst:
1119 ; -O1:    ldaxrb w8, [x0]
1120 ; -O1:    add w9, w8, w1
1121 ; -O1:    stlxrb w10, w9, [x0]
1122     %r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1
1123     ret i8 %r
1126 define dso_local i16 @atomicrmw_add_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
1127 ; -O0-LABEL: atomicrmw_add_i16_unaligned_monotonic:
1128 ; -O0:    add w8, w9, w8
1129 ; -O0:    bl __atomic_compare_exchange
1131 ; -O1-LABEL: atomicrmw_add_i16_unaligned_monotonic:
1132 ; -O1:    add w8, w0, w20
1133 ; -O1:    bl __atomic_compare_exchange
1134     %r = atomicrmw add ptr %ptr, i16 %value monotonic, align 1
1135     ret i16 %r
1138 define dso_local i16 @atomicrmw_add_i16_unaligned_acquire(ptr %ptr, i16 %value) {
1139 ; -O0-LABEL: atomicrmw_add_i16_unaligned_acquire:
1140 ; -O0:    add w8, w9, w8
1141 ; -O0:    bl __atomic_compare_exchange
1143 ; -O1-LABEL: atomicrmw_add_i16_unaligned_acquire:
1144 ; -O1:    add w8, w0, w20
1145 ; -O1:    bl __atomic_compare_exchange
1146     %r = atomicrmw add ptr %ptr, i16 %value acquire, align 1
1147     ret i16 %r
1150 define dso_local i16 @atomicrmw_add_i16_unaligned_release(ptr %ptr, i16 %value) {
1151 ; -O0-LABEL: atomicrmw_add_i16_unaligned_release:
1152 ; -O0:    add w8, w9, w8
1153 ; -O0:    bl __atomic_compare_exchange
1155 ; -O1-LABEL: atomicrmw_add_i16_unaligned_release:
1156 ; -O1:    add w8, w0, w20
1157 ; -O1:    bl __atomic_compare_exchange
1158     %r = atomicrmw add ptr %ptr, i16 %value release, align 1
1159     ret i16 %r
1162 define dso_local i16 @atomicrmw_add_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
1163 ; -O0-LABEL: atomicrmw_add_i16_unaligned_acq_rel:
1164 ; -O0:    add w8, w9, w8
1165 ; -O0:    bl __atomic_compare_exchange
1167 ; -O1-LABEL: atomicrmw_add_i16_unaligned_acq_rel:
1168 ; -O1:    add w8, w0, w20
1169 ; -O1:    bl __atomic_compare_exchange
1170     %r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 1
1171     ret i16 %r
1174 define dso_local i16 @atomicrmw_add_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
1175 ; -O0-LABEL: atomicrmw_add_i16_unaligned_seq_cst:
1176 ; -O0:    add w8, w9, w8
1177 ; -O0:    bl __atomic_compare_exchange
1179 ; -O1-LABEL: atomicrmw_add_i16_unaligned_seq_cst:
1180 ; -O1:    add w8, w0, w20
1181 ; -O1:    bl __atomic_compare_exchange
1182     %r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 1
1183     ret i16 %r
1186 define dso_local i32 @atomicrmw_add_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
1187 ; -O0-LABEL: atomicrmw_add_i32_unaligned_monotonic:
1188 ; -O0:    add w8, w9, w8
1189 ; -O0:    bl __atomic_compare_exchange
1191 ; -O1-LABEL: atomicrmw_add_i32_unaligned_monotonic:
1192 ; -O1:    add w8, w0, w20
1193 ; -O1:    bl __atomic_compare_exchange
1194     %r = atomicrmw add ptr %ptr, i32 %value monotonic, align 1
1195     ret i32 %r
1198 define dso_local i32 @atomicrmw_add_i32_unaligned_acquire(ptr %ptr, i32 %value) {
1199 ; -O0-LABEL: atomicrmw_add_i32_unaligned_acquire:
1200 ; -O0:    add w8, w9, w8
1201 ; -O0:    bl __atomic_compare_exchange
1203 ; -O1-LABEL: atomicrmw_add_i32_unaligned_acquire:
1204 ; -O1:    add w8, w0, w20
1205 ; -O1:    bl __atomic_compare_exchange
1206     %r = atomicrmw add ptr %ptr, i32 %value acquire, align 1
1207     ret i32 %r
1210 define dso_local i32 @atomicrmw_add_i32_unaligned_release(ptr %ptr, i32 %value) {
1211 ; -O0-LABEL: atomicrmw_add_i32_unaligned_release:
1212 ; -O0:    add w8, w9, w8
1213 ; -O0:    bl __atomic_compare_exchange
1215 ; -O1-LABEL: atomicrmw_add_i32_unaligned_release:
1216 ; -O1:    add w8, w0, w20
1217 ; -O1:    bl __atomic_compare_exchange
1218     %r = atomicrmw add ptr %ptr, i32 %value release, align 1
1219     ret i32 %r
1222 define dso_local i32 @atomicrmw_add_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
1223 ; -O0-LABEL: atomicrmw_add_i32_unaligned_acq_rel:
1224 ; -O0:    add w8, w9, w8
1225 ; -O0:    bl __atomic_compare_exchange
1227 ; -O1-LABEL: atomicrmw_add_i32_unaligned_acq_rel:
1228 ; -O1:    add w8, w0, w20
1229 ; -O1:    bl __atomic_compare_exchange
1230     %r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 1
1231     ret i32 %r
1234 define dso_local i32 @atomicrmw_add_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
1235 ; -O0-LABEL: atomicrmw_add_i32_unaligned_seq_cst:
1236 ; -O0:    add w8, w9, w8
1237 ; -O0:    bl __atomic_compare_exchange
1239 ; -O1-LABEL: atomicrmw_add_i32_unaligned_seq_cst:
1240 ; -O1:    add w8, w0, w20
1241 ; -O1:    bl __atomic_compare_exchange
1242     %r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 1
1243     ret i32 %r
1246 define dso_local i64 @atomicrmw_add_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
1247 ; -O0-LABEL: atomicrmw_add_i64_unaligned_monotonic:
1248 ; -O0:    add x8, x9, x8
1249 ; -O0:    bl __atomic_compare_exchange
1251 ; -O1-LABEL: atomicrmw_add_i64_unaligned_monotonic:
1252 ; -O1:    add x8, x0, x20
1253 ; -O1:    bl __atomic_compare_exchange
1254     %r = atomicrmw add ptr %ptr, i64 %value monotonic, align 1
1255     ret i64 %r
1258 define dso_local i64 @atomicrmw_add_i64_unaligned_acquire(ptr %ptr, i64 %value) {
1259 ; -O0-LABEL: atomicrmw_add_i64_unaligned_acquire:
1260 ; -O0:    add x8, x9, x8
1261 ; -O0:    bl __atomic_compare_exchange
1263 ; -O1-LABEL: atomicrmw_add_i64_unaligned_acquire:
1264 ; -O1:    add x8, x0, x20
1265 ; -O1:    bl __atomic_compare_exchange
1266     %r = atomicrmw add ptr %ptr, i64 %value acquire, align 1
1267     ret i64 %r
1270 define dso_local i64 @atomicrmw_add_i64_unaligned_release(ptr %ptr, i64 %value) {
1271 ; -O0-LABEL: atomicrmw_add_i64_unaligned_release:
1272 ; -O0:    add x8, x9, x8
1273 ; -O0:    bl __atomic_compare_exchange
1275 ; -O1-LABEL: atomicrmw_add_i64_unaligned_release:
1276 ; -O1:    add x8, x0, x20
1277 ; -O1:    bl __atomic_compare_exchange
1278     %r = atomicrmw add ptr %ptr, i64 %value release, align 1
1279     ret i64 %r
1282 define dso_local i64 @atomicrmw_add_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
1283 ; -O0-LABEL: atomicrmw_add_i64_unaligned_acq_rel:
1284 ; -O0:    add x8, x9, x8
1285 ; -O0:    bl __atomic_compare_exchange
1287 ; -O1-LABEL: atomicrmw_add_i64_unaligned_acq_rel:
1288 ; -O1:    add x8, x0, x20
1289 ; -O1:    bl __atomic_compare_exchange
1290     %r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 1
1291     ret i64 %r
1294 define dso_local i64 @atomicrmw_add_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
1295 ; -O0-LABEL: atomicrmw_add_i64_unaligned_seq_cst:
1296 ; -O0:    add x8, x9, x8
1297 ; -O0:    bl __atomic_compare_exchange
1299 ; -O1-LABEL: atomicrmw_add_i64_unaligned_seq_cst:
1300 ; -O1:    add x8, x0, x20
1301 ; -O1:    bl __atomic_compare_exchange
1302     %r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 1
1303     ret i64 %r
1306 define dso_local i128 @atomicrmw_add_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
1307 ; -O0-LABEL: atomicrmw_add_i128_unaligned_monotonic:
1308 ; -O0:    adds x9, x10, x9
1309 ; -O0:    bl __atomic_compare_exchange
1311 ; -O1-LABEL: atomicrmw_add_i128_unaligned_monotonic:
1312 ; -O1:    ldp x0, x1, [x0]
1313 ; -O1:    adds x8, x1, x19
1314 ; -O1:    bl __atomic_compare_exchange
1315     %r = atomicrmw add ptr %ptr, i128 %value monotonic, align 1
1316     ret i128 %r
1319 define dso_local i128 @atomicrmw_add_i128_unaligned_acquire(ptr %ptr, i128 %value) {
1320 ; -O0-LABEL: atomicrmw_add_i128_unaligned_acquire:
1321 ; -O0:    adds x9, x10, x9
1322 ; -O0:    bl __atomic_compare_exchange
1324 ; -O1-LABEL: atomicrmw_add_i128_unaligned_acquire:
1325 ; -O1:    ldp x0, x1, [x0]
1326 ; -O1:    adds x8, x1, x19
1327 ; -O1:    bl __atomic_compare_exchange
1328     %r = atomicrmw add ptr %ptr, i128 %value acquire, align 1
1329     ret i128 %r
1332 define dso_local i128 @atomicrmw_add_i128_unaligned_release(ptr %ptr, i128 %value) {
1333 ; -O0-LABEL: atomicrmw_add_i128_unaligned_release:
1334 ; -O0:    adds x9, x10, x9
1335 ; -O0:    bl __atomic_compare_exchange
1337 ; -O1-LABEL: atomicrmw_add_i128_unaligned_release:
1338 ; -O1:    ldp x0, x1, [x0]
1339 ; -O1:    adds x8, x1, x19
1340 ; -O1:    bl __atomic_compare_exchange
1341     %r = atomicrmw add ptr %ptr, i128 %value release, align 1
1342     ret i128 %r
1345 define dso_local i128 @atomicrmw_add_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
1346 ; -O0-LABEL: atomicrmw_add_i128_unaligned_acq_rel:
1347 ; -O0:    adds x9, x10, x9
1348 ; -O0:    bl __atomic_compare_exchange
1350 ; -O1-LABEL: atomicrmw_add_i128_unaligned_acq_rel:
1351 ; -O1:    ldp x0, x1, [x0]
1352 ; -O1:    adds x8, x1, x19
1353 ; -O1:    bl __atomic_compare_exchange
1354     %r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 1
1355     ret i128 %r
1358 define dso_local i128 @atomicrmw_add_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
1359 ; -O0-LABEL: atomicrmw_add_i128_unaligned_seq_cst:
1360 ; -O0:    adds x9, x10, x9
1361 ; -O0:    bl __atomic_compare_exchange
1363 ; -O1-LABEL: atomicrmw_add_i128_unaligned_seq_cst:
1364 ; -O1:    ldp x0, x1, [x0]
1365 ; -O1:    adds x8, x1, x19
1366 ; -O1:    bl __atomic_compare_exchange
1367     %r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 1
1368     ret i128 %r
1371 define dso_local i8 @atomicrmw_sub_i8_aligned_monotonic(ptr %ptr, i8 %value) {
1372 ; -O0-LABEL: atomicrmw_sub_i8_aligned_monotonic:
1373 ; -O0:    subs w12, w9, w8
1374 ; -O0:    ldaxrb w8, [x11]
1375 ; -O0:    cmp w8, w9, uxtb
1376 ; -O0:    stlxrb w10, w12, [x11]
1377 ; -O0:    subs w9, w8, w9, uxtb
1378 ; -O0:    subs w9, w9, #1
1380 ; -O1-LABEL: atomicrmw_sub_i8_aligned_monotonic:
1381 ; -O1:    ldxrb w8, [x0]
1382 ; -O1:    sub w9, w8, w1
1383 ; -O1:    stxrb w10, w9, [x0]
1384     %r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1
1385     ret i8 %r
1388 define dso_local i8 @atomicrmw_sub_i8_aligned_acquire(ptr %ptr, i8 %value) {
1389 ; -O0-LABEL: atomicrmw_sub_i8_aligned_acquire:
1390 ; -O0:    subs w12, w9, w8
1391 ; -O0:    ldaxrb w8, [x11]
1392 ; -O0:    cmp w8, w9, uxtb
1393 ; -O0:    stlxrb w10, w12, [x11]
1394 ; -O0:    subs w9, w8, w9, uxtb
1395 ; -O0:    subs w9, w9, #1
1397 ; -O1-LABEL: atomicrmw_sub_i8_aligned_acquire:
1398 ; -O1:    ldaxrb w8, [x0]
1399 ; -O1:    sub w9, w8, w1
1400 ; -O1:    stxrb w10, w9, [x0]
1401     %r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1
1402     ret i8 %r
1405 define dso_local i8 @atomicrmw_sub_i8_aligned_release(ptr %ptr, i8 %value) {
1406 ; -O0-LABEL: atomicrmw_sub_i8_aligned_release:
1407 ; -O0:    subs w12, w9, w8
1408 ; -O0:    ldaxrb w8, [x11]
1409 ; -O0:    cmp w8, w9, uxtb
1410 ; -O0:    stlxrb w10, w12, [x11]
1411 ; -O0:    subs w9, w8, w9, uxtb
1412 ; -O0:    subs w9, w9, #1
1414 ; -O1-LABEL: atomicrmw_sub_i8_aligned_release:
1415 ; -O1:    ldxrb w8, [x0]
1416 ; -O1:    sub w9, w8, w1
1417 ; -O1:    stlxrb w10, w9, [x0]
1418     %r = atomicrmw sub ptr %ptr, i8 %value release, align 1
1419     ret i8 %r
1422 define dso_local i8 @atomicrmw_sub_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
1423 ; -O0-LABEL: atomicrmw_sub_i8_aligned_acq_rel:
1424 ; -O0:    subs w12, w9, w8
1425 ; -O0:    ldaxrb w8, [x11]
1426 ; -O0:    cmp w8, w9, uxtb
1427 ; -O0:    stlxrb w10, w12, [x11]
1428 ; -O0:    subs w9, w8, w9, uxtb
1429 ; -O0:    subs w9, w9, #1
1431 ; -O1-LABEL: atomicrmw_sub_i8_aligned_acq_rel:
1432 ; -O1:    ldaxrb w8, [x0]
1433 ; -O1:    sub w9, w8, w1
1434 ; -O1:    stlxrb w10, w9, [x0]
1435     %r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1
1436     ret i8 %r
1439 define dso_local i8 @atomicrmw_sub_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
1440 ; -O0-LABEL: atomicrmw_sub_i8_aligned_seq_cst:
1441 ; -O0:    subs w12, w9, w8
1442 ; -O0:    ldaxrb w8, [x11]
1443 ; -O0:    cmp w8, w9, uxtb
1444 ; -O0:    stlxrb w10, w12, [x11]
1445 ; -O0:    subs w9, w8, w9, uxtb
1446 ; -O0:    subs w9, w9, #1
1448 ; -O1-LABEL: atomicrmw_sub_i8_aligned_seq_cst:
1449 ; -O1:    ldaxrb w8, [x0]
1450 ; -O1:    sub w9, w8, w1
1451 ; -O1:    stlxrb w10, w9, [x0]
1452     %r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1
1453     ret i8 %r
1456 define dso_local i16 @atomicrmw_sub_i16_aligned_monotonic(ptr %ptr, i16 %value) {
1457 ; -O0-LABEL: atomicrmw_sub_i16_aligned_monotonic:
1458 ; -O0:    subs w12, w9, w8
1459 ; -O0:    ldaxrh w8, [x11]
1460 ; -O0:    cmp w8, w9, uxth
1461 ; -O0:    stlxrh w10, w12, [x11]
1462 ; -O0:    subs w9, w8, w9, uxth
1463 ; -O0:    subs w9, w9, #1
1465 ; -O1-LABEL: atomicrmw_sub_i16_aligned_monotonic:
1466 ; -O1:    ldxrh w8, [x0]
1467 ; -O1:    sub w9, w8, w1
1468 ; -O1:    stxrh w10, w9, [x0]
1469     %r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 2
1470     ret i16 %r
1473 define dso_local i16 @atomicrmw_sub_i16_aligned_acquire(ptr %ptr, i16 %value) {
1474 ; -O0-LABEL: atomicrmw_sub_i16_aligned_acquire:
1475 ; -O0:    subs w12, w9, w8
1476 ; -O0:    ldaxrh w8, [x11]
1477 ; -O0:    cmp w8, w9, uxth
1478 ; -O0:    stlxrh w10, w12, [x11]
1479 ; -O0:    subs w9, w8, w9, uxth
1480 ; -O0:    subs w9, w9, #1
1482 ; -O1-LABEL: atomicrmw_sub_i16_aligned_acquire:
1483 ; -O1:    ldaxrh w8, [x0]
1484 ; -O1:    sub w9, w8, w1
1485 ; -O1:    stxrh w10, w9, [x0]
1486     %r = atomicrmw sub ptr %ptr, i16 %value acquire, align 2
1487     ret i16 %r
1490 define dso_local i16 @atomicrmw_sub_i16_aligned_release(ptr %ptr, i16 %value) {
1491 ; -O0-LABEL: atomicrmw_sub_i16_aligned_release:
1492 ; -O0:    subs w12, w9, w8
1493 ; -O0:    ldaxrh w8, [x11]
1494 ; -O0:    cmp w8, w9, uxth
1495 ; -O0:    stlxrh w10, w12, [x11]
1496 ; -O0:    subs w9, w8, w9, uxth
1497 ; -O0:    subs w9, w9, #1
1499 ; -O1-LABEL: atomicrmw_sub_i16_aligned_release:
1500 ; -O1:    ldxrh w8, [x0]
1501 ; -O1:    sub w9, w8, w1
1502 ; -O1:    stlxrh w10, w9, [x0]
1503     %r = atomicrmw sub ptr %ptr, i16 %value release, align 2
1504     ret i16 %r
1507 define dso_local i16 @atomicrmw_sub_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
1508 ; -O0-LABEL: atomicrmw_sub_i16_aligned_acq_rel:
1509 ; -O0:    subs w12, w9, w8
1510 ; -O0:    ldaxrh w8, [x11]
1511 ; -O0:    cmp w8, w9, uxth
1512 ; -O0:    stlxrh w10, w12, [x11]
1513 ; -O0:    subs w9, w8, w9, uxth
1514 ; -O0:    subs w9, w9, #1
1516 ; -O1-LABEL: atomicrmw_sub_i16_aligned_acq_rel:
1517 ; -O1:    ldaxrh w8, [x0]
1518 ; -O1:    sub w9, w8, w1
1519 ; -O1:    stlxrh w10, w9, [x0]
1520     %r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 2
1521     ret i16 %r
1524 define dso_local i16 @atomicrmw_sub_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
1525 ; -O0-LABEL: atomicrmw_sub_i16_aligned_seq_cst:
1526 ; -O0:    subs w12, w9, w8
1527 ; -O0:    ldaxrh w8, [x11]
1528 ; -O0:    cmp w8, w9, uxth
1529 ; -O0:    stlxrh w10, w12, [x11]
1530 ; -O0:    subs w9, w8, w9, uxth
1531 ; -O0:    subs w9, w9, #1
1533 ; -O1-LABEL: atomicrmw_sub_i16_aligned_seq_cst:
1534 ; -O1:    ldaxrh w8, [x0]
1535 ; -O1:    sub w9, w8, w1
1536 ; -O1:    stlxrh w10, w9, [x0]
1537     %r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 2
1538     ret i16 %r
1541 define dso_local i32 @atomicrmw_sub_i32_aligned_monotonic(ptr %ptr, i32 %value) {
1542 ; -O0-LABEL: atomicrmw_sub_i32_aligned_monotonic:
1543 ; -O0:    subs w12, w9, w8
1544 ; -O0:    ldaxr w8, [x11]
1545 ; -O0:    cmp w8, w9
1546 ; -O0:    stlxr w10, w12, [x11]
1547 ; -O0:    subs w9, w8, w9
1548 ; -O0:    subs w9, w9, #1
1550 ; -O1-LABEL: atomicrmw_sub_i32_aligned_monotonic:
1551 ; -O1:    ldxr w8, [x0]
1552 ; -O1:    sub w9, w8, w1
1553 ; -O1:    stxr w10, w9, [x0]
1554     %r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 4
1555     ret i32 %r
1558 define dso_local i32 @atomicrmw_sub_i32_aligned_acquire(ptr %ptr, i32 %value) {
1559 ; -O0-LABEL: atomicrmw_sub_i32_aligned_acquire:
1560 ; -O0:    subs w12, w9, w8
1561 ; -O0:    ldaxr w8, [x11]
1562 ; -O0:    cmp w8, w9
1563 ; -O0:    stlxr w10, w12, [x11]
1564 ; -O0:    subs w9, w8, w9
1565 ; -O0:    subs w9, w9, #1
1567 ; -O1-LABEL: atomicrmw_sub_i32_aligned_acquire:
1568 ; -O1:    ldaxr w8, [x0]
1569 ; -O1:    sub w9, w8, w1
1570 ; -O1:    stxr w10, w9, [x0]
1571     %r = atomicrmw sub ptr %ptr, i32 %value acquire, align 4
1572     ret i32 %r
1575 define dso_local i32 @atomicrmw_sub_i32_aligned_release(ptr %ptr, i32 %value) {
1576 ; -O0-LABEL: atomicrmw_sub_i32_aligned_release:
1577 ; -O0:    subs w12, w9, w8
1578 ; -O0:    ldaxr w8, [x11]
1579 ; -O0:    cmp w8, w9
1580 ; -O0:    stlxr w10, w12, [x11]
1581 ; -O0:    subs w9, w8, w9
1582 ; -O0:    subs w9, w9, #1
1584 ; -O1-LABEL: atomicrmw_sub_i32_aligned_release:
1585 ; -O1:    ldxr w8, [x0]
1586 ; -O1:    sub w9, w8, w1
1587 ; -O1:    stlxr w10, w9, [x0]
1588     %r = atomicrmw sub ptr %ptr, i32 %value release, align 4
1589     ret i32 %r
1592 define dso_local i32 @atomicrmw_sub_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
1593 ; -O0-LABEL: atomicrmw_sub_i32_aligned_acq_rel:
1594 ; -O0:    subs w12, w9, w8
1595 ; -O0:    ldaxr w8, [x11]
1596 ; -O0:    cmp w8, w9
1597 ; -O0:    stlxr w10, w12, [x11]
1598 ; -O0:    subs w9, w8, w9
1599 ; -O0:    subs w9, w9, #1
1601 ; -O1-LABEL: atomicrmw_sub_i32_aligned_acq_rel:
1602 ; -O1:    ldaxr w8, [x0]
1603 ; -O1:    sub w9, w8, w1
1604 ; -O1:    stlxr w10, w9, [x0]
1605     %r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 4
1606     ret i32 %r
1609 define dso_local i32 @atomicrmw_sub_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
1610 ; -O0-LABEL: atomicrmw_sub_i32_aligned_seq_cst:
1611 ; -O0:    subs w12, w9, w8
1612 ; -O0:    ldaxr w8, [x11]
1613 ; -O0:    cmp w8, w9
1614 ; -O0:    stlxr w10, w12, [x11]
1615 ; -O0:    subs w9, w8, w9
1616 ; -O0:    subs w9, w9, #1
1618 ; -O1-LABEL: atomicrmw_sub_i32_aligned_seq_cst:
1619 ; -O1:    ldaxr w8, [x0]
1620 ; -O1:    sub w9, w8, w1
1621 ; -O1:    stlxr w10, w9, [x0]
1622     %r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 4
1623     ret i32 %r
1626 define dso_local i64 @atomicrmw_sub_i64_aligned_monotonic(ptr %ptr, i64 %value) {
1627 ; -O0-LABEL: atomicrmw_sub_i64_aligned_monotonic:
1628 ; -O0:    subs x12, x9, x8
1629 ; -O0:    ldaxr x8, [x11]
1630 ; -O0:    cmp x8, x9
1631 ; -O0:    stlxr w10, x12, [x11]
1632 ; -O0:    subs x9, x8, x9
1633 ; -O0:    subs w9, w9, #1
1635 ; -O1-LABEL: atomicrmw_sub_i64_aligned_monotonic:
1636 ; -O1:    ldxr x0, [x8]
1637 ; -O1:    sub x9, x0, x1
1638 ; -O1:    stxr w10, x9, [x8]
1639     %r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 8
1640     ret i64 %r
1643 define dso_local i64 @atomicrmw_sub_i64_aligned_acquire(ptr %ptr, i64 %value) {
1644 ; -O0-LABEL: atomicrmw_sub_i64_aligned_acquire:
1645 ; -O0:    subs x12, x9, x8
1646 ; -O0:    ldaxr x8, [x11]
1647 ; -O0:    cmp x8, x9
1648 ; -O0:    stlxr w10, x12, [x11]
1649 ; -O0:    subs x9, x8, x9
1650 ; -O0:    subs w9, w9, #1
1652 ; -O1-LABEL: atomicrmw_sub_i64_aligned_acquire:
1653 ; -O1:    ldaxr x0, [x8]
1654 ; -O1:    sub x9, x0, x1
1655 ; -O1:    stxr w10, x9, [x8]
1656     %r = atomicrmw sub ptr %ptr, i64 %value acquire, align 8
1657     ret i64 %r
1660 define dso_local i64 @atomicrmw_sub_i64_aligned_release(ptr %ptr, i64 %value) {
1661 ; -O0-LABEL: atomicrmw_sub_i64_aligned_release:
1662 ; -O0:    subs x12, x9, x8
1663 ; -O0:    ldaxr x8, [x11]
1664 ; -O0:    cmp x8, x9
1665 ; -O0:    stlxr w10, x12, [x11]
1666 ; -O0:    subs x9, x8, x9
1667 ; -O0:    subs w9, w9, #1
1669 ; -O1-LABEL: atomicrmw_sub_i64_aligned_release:
1670 ; -O1:    ldxr x0, [x8]
1671 ; -O1:    sub x9, x0, x1
1672 ; -O1:    stlxr w10, x9, [x8]
1673     %r = atomicrmw sub ptr %ptr, i64 %value release, align 8
1674     ret i64 %r
1677 define dso_local i64 @atomicrmw_sub_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
1678 ; -O0-LABEL: atomicrmw_sub_i64_aligned_acq_rel:
1679 ; -O0:    subs x12, x9, x8
1680 ; -O0:    ldaxr x8, [x11]
1681 ; -O0:    cmp x8, x9
1682 ; -O0:    stlxr w10, x12, [x11]
1683 ; -O0:    subs x9, x8, x9
1684 ; -O0:    subs w9, w9, #1
1686 ; -O1-LABEL: atomicrmw_sub_i64_aligned_acq_rel:
1687 ; -O1:    ldaxr x0, [x8]
1688 ; -O1:    sub x9, x0, x1
1689 ; -O1:    stlxr w10, x9, [x8]
1690     %r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 8
1691     ret i64 %r
1694 define dso_local i64 @atomicrmw_sub_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
1695 ; -O0-LABEL: atomicrmw_sub_i64_aligned_seq_cst:
1696 ; -O0:    subs x12, x9, x8
1697 ; -O0:    ldaxr x8, [x11]
1698 ; -O0:    cmp x8, x9
1699 ; -O0:    stlxr w10, x12, [x11]
1700 ; -O0:    subs x9, x8, x9
1701 ; -O0:    subs w9, w9, #1
1703 ; -O1-LABEL: atomicrmw_sub_i64_aligned_seq_cst:
1704 ; -O1:    ldaxr x0, [x8]
1705 ; -O1:    sub x9, x0, x1
1706 ; -O1:    stlxr w10, x9, [x8]
1707     %r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 8
1708     ret i64 %r
1711 define dso_local i128 @atomicrmw_sub_i128_aligned_monotonic(ptr %ptr, i128 %value) {
1712 ; -O0-LABEL: atomicrmw_sub_i128_aligned_monotonic:
1713 ; -O0:    subs x14, x11, x10
1714 ; -O0:    ldxp x10, x12, [x9]
1715 ; -O0:    cmp x10, x11
1716 ; -O0:    cmp x12, x13
1717 ; -O0:    stxp w8, x14, x15, [x9]
1718 ; -O0:    stxp w8, x10, x12, [x9]
1719 ; -O0:    subs x12, x12, x13
1720 ; -O0:    ccmp x10, x11, #0, eq
1722 ; -O1-LABEL: atomicrmw_sub_i128_aligned_monotonic:
1723 ; -O1:    ldxp x1, x0, [x8]
1724 ; -O1:    subs x9, x1, x3
1725 ; -O1:    stxp w11, x9, x10, [x8]
1726     %r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 16
1727     ret i128 %r
1730 define dso_local i128 @atomicrmw_sub_i128_aligned_acquire(ptr %ptr, i128 %value) {
1731 ; -O0-LABEL: atomicrmw_sub_i128_aligned_acquire:
1732 ; -O0:    subs x14, x11, x10
1733 ; -O0:    ldaxp x10, x12, [x9]
1734 ; -O0:    cmp x10, x11
1735 ; -O0:    cmp x12, x13
1736 ; -O0:    stxp w8, x14, x15, [x9]
1737 ; -O0:    stxp w8, x10, x12, [x9]
1738 ; -O0:    subs x12, x12, x13
1739 ; -O0:    ccmp x10, x11, #0, eq
1741 ; -O1-LABEL: atomicrmw_sub_i128_aligned_acquire:
1742 ; -O1:    ldaxp x1, x0, [x8]
1743 ; -O1:    subs x9, x1, x3
1744 ; -O1:    stxp w11, x9, x10, [x8]
1745     %r = atomicrmw sub ptr %ptr, i128 %value acquire, align 16
1746     ret i128 %r
1749 define dso_local i128 @atomicrmw_sub_i128_aligned_release(ptr %ptr, i128 %value) {
1750 ; -O0-LABEL: atomicrmw_sub_i128_aligned_release:
1751 ; -O0:    subs x14, x11, x10
1752 ; -O0:    ldxp x10, x12, [x9]
1753 ; -O0:    cmp x10, x11
1754 ; -O0:    cmp x12, x13
1755 ; -O0:    stlxp w8, x14, x15, [x9]
1756 ; -O0:    stlxp w8, x10, x12, [x9]
1757 ; -O0:    subs x12, x12, x13
1758 ; -O0:    ccmp x10, x11, #0, eq
1760 ; -O1-LABEL: atomicrmw_sub_i128_aligned_release:
1761 ; -O1:    ldxp x1, x0, [x8]
1762 ; -O1:    subs x9, x1, x3
1763 ; -O1:    stlxp w11, x9, x10, [x8]
1764     %r = atomicrmw sub ptr %ptr, i128 %value release, align 16
1765     ret i128 %r
1768 define dso_local i128 @atomicrmw_sub_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
1769 ; -O0-LABEL: atomicrmw_sub_i128_aligned_acq_rel:
1770 ; -O0:    subs x14, x11, x10
1771 ; -O0:    ldaxp x10, x12, [x9]
1772 ; -O0:    cmp x10, x11
1773 ; -O0:    cmp x12, x13
1774 ; -O0:    stlxp w8, x14, x15, [x9]
1775 ; -O0:    stlxp w8, x10, x12, [x9]
1776 ; -O0:    subs x12, x12, x13
1777 ; -O0:    ccmp x10, x11, #0, eq
1779 ; -O1-LABEL: atomicrmw_sub_i128_aligned_acq_rel:
1780 ; -O1:    ldaxp x1, x0, [x8]
1781 ; -O1:    subs x9, x1, x3
1782 ; -O1:    stlxp w11, x9, x10, [x8]
1783     %r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 16
1784     ret i128 %r
1787 define dso_local i128 @atomicrmw_sub_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
1788 ; -O0-LABEL: atomicrmw_sub_i128_aligned_seq_cst:
1789 ; -O0:    subs x14, x11, x10
1790 ; -O0:    ldaxp x10, x12, [x9]
1791 ; -O0:    cmp x10, x11
1792 ; -O0:    cmp x12, x13
1793 ; -O0:    stlxp w8, x14, x15, [x9]
1794 ; -O0:    stlxp w8, x10, x12, [x9]
1795 ; -O0:    subs x12, x12, x13
1796 ; -O0:    ccmp x10, x11, #0, eq
1798 ; -O1-LABEL: atomicrmw_sub_i128_aligned_seq_cst:
1799 ; -O1:    ldaxp x1, x0, [x8]
1800 ; -O1:    subs x9, x1, x3
1801 ; -O1:    stlxp w11, x9, x10, [x8]
1802     %r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 16
1803     ret i128 %r
1806 define dso_local i8 @atomicrmw_sub_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
1807 ; -O0-LABEL: atomicrmw_sub_i8_unaligned_monotonic:
1808 ; -O0:    subs w12, w9, w8
1809 ; -O0:    ldaxrb w8, [x11]
1810 ; -O0:    cmp w8, w9, uxtb
1811 ; -O0:    stlxrb w10, w12, [x11]
1812 ; -O0:    subs w9, w8, w9, uxtb
1813 ; -O0:    subs w9, w9, #1
1815 ; -O1-LABEL: atomicrmw_sub_i8_unaligned_monotonic:
1816 ; -O1:    ldxrb w8, [x0]
1817 ; -O1:    sub w9, w8, w1
1818 ; -O1:    stxrb w10, w9, [x0]
1819     %r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1
1820     ret i8 %r
1823 define dso_local i8 @atomicrmw_sub_i8_unaligned_acquire(ptr %ptr, i8 %value) {
1824 ; -O0-LABEL: atomicrmw_sub_i8_unaligned_acquire:
1825 ; -O0:    subs w12, w9, w8
1826 ; -O0:    ldaxrb w8, [x11]
1827 ; -O0:    cmp w8, w9, uxtb
1828 ; -O0:    stlxrb w10, w12, [x11]
1829 ; -O0:    subs w9, w8, w9, uxtb
1830 ; -O0:    subs w9, w9, #1
1832 ; -O1-LABEL: atomicrmw_sub_i8_unaligned_acquire:
1833 ; -O1:    ldaxrb w8, [x0]
1834 ; -O1:    sub w9, w8, w1
1835 ; -O1:    stxrb w10, w9, [x0]
1836     %r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1
1837     ret i8 %r
1840 define dso_local i8 @atomicrmw_sub_i8_unaligned_release(ptr %ptr, i8 %value) {
1841 ; -O0-LABEL: atomicrmw_sub_i8_unaligned_release:
1842 ; -O0:    subs w12, w9, w8
1843 ; -O0:    ldaxrb w8, [x11]
1844 ; -O0:    cmp w8, w9, uxtb
1845 ; -O0:    stlxrb w10, w12, [x11]
1846 ; -O0:    subs w9, w8, w9, uxtb
1847 ; -O0:    subs w9, w9, #1
1849 ; -O1-LABEL: atomicrmw_sub_i8_unaligned_release:
1850 ; -O1:    ldxrb w8, [x0]
1851 ; -O1:    sub w9, w8, w1
1852 ; -O1:    stlxrb w10, w9, [x0]
1853     %r = atomicrmw sub ptr %ptr, i8 %value release, align 1
1854     ret i8 %r
1857 define dso_local i8 @atomicrmw_sub_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
1858 ; -O0-LABEL: atomicrmw_sub_i8_unaligned_acq_rel:
1859 ; -O0:    subs w12, w9, w8
1860 ; -O0:    ldaxrb w8, [x11]
1861 ; -O0:    cmp w8, w9, uxtb
1862 ; -O0:    stlxrb w10, w12, [x11]
1863 ; -O0:    subs w9, w8, w9, uxtb
1864 ; -O0:    subs w9, w9, #1
1866 ; -O1-LABEL: atomicrmw_sub_i8_unaligned_acq_rel:
1867 ; -O1:    ldaxrb w8, [x0]
1868 ; -O1:    sub w9, w8, w1
1869 ; -O1:    stlxrb w10, w9, [x0]
1870     %r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1
1871     ret i8 %r
1874 define dso_local i8 @atomicrmw_sub_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
1875 ; -O0-LABEL: atomicrmw_sub_i8_unaligned_seq_cst:
1876 ; -O0:    subs w12, w9, w8
1877 ; -O0:    ldaxrb w8, [x11]
1878 ; -O0:    cmp w8, w9, uxtb
1879 ; -O0:    stlxrb w10, w12, [x11]
1880 ; -O0:    subs w9, w8, w9, uxtb
1881 ; -O0:    subs w9, w9, #1
1883 ; -O1-LABEL: atomicrmw_sub_i8_unaligned_seq_cst:
1884 ; -O1:    ldaxrb w8, [x0]
1885 ; -O1:    sub w9, w8, w1
1886 ; -O1:    stlxrb w10, w9, [x0]
1887     %r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1
1888     ret i8 %r
1891 define dso_local i16 @atomicrmw_sub_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
1892 ; -O0-LABEL: atomicrmw_sub_i16_unaligned_monotonic:
1893 ; -O0:    subs w8, w9, w8
1894 ; -O0:    bl __atomic_compare_exchange
1896 ; -O1-LABEL: atomicrmw_sub_i16_unaligned_monotonic:
1897 ; -O1:    sub w8, w0, w20
1898 ; -O1:    bl __atomic_compare_exchange
1899     %r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 1
1900     ret i16 %r
1903 define dso_local i16 @atomicrmw_sub_i16_unaligned_acquire(ptr %ptr, i16 %value) {
1904 ; -O0-LABEL: atomicrmw_sub_i16_unaligned_acquire:
1905 ; -O0:    subs w8, w9, w8
1906 ; -O0:    bl __atomic_compare_exchange
1908 ; -O1-LABEL: atomicrmw_sub_i16_unaligned_acquire:
1909 ; -O1:    sub w8, w0, w20
1910 ; -O1:    bl __atomic_compare_exchange
1911     %r = atomicrmw sub ptr %ptr, i16 %value acquire, align 1
1912     ret i16 %r
1915 define dso_local i16 @atomicrmw_sub_i16_unaligned_release(ptr %ptr, i16 %value) {
1916 ; -O0-LABEL: atomicrmw_sub_i16_unaligned_release:
1917 ; -O0:    subs w8, w9, w8
1918 ; -O0:    bl __atomic_compare_exchange
1920 ; -O1-LABEL: atomicrmw_sub_i16_unaligned_release:
1921 ; -O1:    sub w8, w0, w20
1922 ; -O1:    bl __atomic_compare_exchange
1923     %r = atomicrmw sub ptr %ptr, i16 %value release, align 1
1924     ret i16 %r
1927 define dso_local i16 @atomicrmw_sub_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
1928 ; -O0-LABEL: atomicrmw_sub_i16_unaligned_acq_rel:
1929 ; -O0:    subs w8, w9, w8
1930 ; -O0:    bl __atomic_compare_exchange
1932 ; -O1-LABEL: atomicrmw_sub_i16_unaligned_acq_rel:
1933 ; -O1:    sub w8, w0, w20
1934 ; -O1:    bl __atomic_compare_exchange
1935     %r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 1
1936     ret i16 %r
1939 define dso_local i16 @atomicrmw_sub_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
1940 ; -O0-LABEL: atomicrmw_sub_i16_unaligned_seq_cst:
1941 ; -O0:    subs w8, w9, w8
1942 ; -O0:    bl __atomic_compare_exchange
1944 ; -O1-LABEL: atomicrmw_sub_i16_unaligned_seq_cst:
1945 ; -O1:    sub w8, w0, w20
1946 ; -O1:    bl __atomic_compare_exchange
1947     %r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 1
1948     ret i16 %r
1951 define dso_local i32 @atomicrmw_sub_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
1952 ; -O0-LABEL: atomicrmw_sub_i32_unaligned_monotonic:
1953 ; -O0:    subs w8, w9, w8
1954 ; -O0:    bl __atomic_compare_exchange
1956 ; -O1-LABEL: atomicrmw_sub_i32_unaligned_monotonic:
1957 ; -O1:    sub w8, w0, w20
1958 ; -O1:    bl __atomic_compare_exchange
1959     %r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 1
1960     ret i32 %r
1963 define dso_local i32 @atomicrmw_sub_i32_unaligned_acquire(ptr %ptr, i32 %value) {
1964 ; -O0-LABEL: atomicrmw_sub_i32_unaligned_acquire:
1965 ; -O0:    subs w8, w9, w8
1966 ; -O0:    bl __atomic_compare_exchange
1968 ; -O1-LABEL: atomicrmw_sub_i32_unaligned_acquire:
1969 ; -O1:    sub w8, w0, w20
1970 ; -O1:    bl __atomic_compare_exchange
1971     %r = atomicrmw sub ptr %ptr, i32 %value acquire, align 1
1972     ret i32 %r
1975 define dso_local i32 @atomicrmw_sub_i32_unaligned_release(ptr %ptr, i32 %value) {
1976 ; -O0-LABEL: atomicrmw_sub_i32_unaligned_release:
1977 ; -O0:    subs w8, w9, w8
1978 ; -O0:    bl __atomic_compare_exchange
1980 ; -O1-LABEL: atomicrmw_sub_i32_unaligned_release:
1981 ; -O1:    sub w8, w0, w20
1982 ; -O1:    bl __atomic_compare_exchange
1983     %r = atomicrmw sub ptr %ptr, i32 %value release, align 1
1984     ret i32 %r
1987 define dso_local i32 @atomicrmw_sub_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
1988 ; -O0-LABEL: atomicrmw_sub_i32_unaligned_acq_rel:
1989 ; -O0:    subs w8, w9, w8
1990 ; -O0:    bl __atomic_compare_exchange
1992 ; -O1-LABEL: atomicrmw_sub_i32_unaligned_acq_rel:
1993 ; -O1:    sub w8, w0, w20
1994 ; -O1:    bl __atomic_compare_exchange
1995     %r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 1
1996     ret i32 %r
1999 define dso_local i32 @atomicrmw_sub_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
2000 ; -O0-LABEL: atomicrmw_sub_i32_unaligned_seq_cst:
2001 ; -O0:    subs w8, w9, w8
2002 ; -O0:    bl __atomic_compare_exchange
2004 ; -O1-LABEL: atomicrmw_sub_i32_unaligned_seq_cst:
2005 ; -O1:    sub w8, w0, w20
2006 ; -O1:    bl __atomic_compare_exchange
2007     %r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 1
2008     ret i32 %r
2011 define dso_local i64 @atomicrmw_sub_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
2012 ; -O0-LABEL: atomicrmw_sub_i64_unaligned_monotonic:
2013 ; -O0:    subs x8, x9, x8
2014 ; -O0:    bl __atomic_compare_exchange
2016 ; -O1-LABEL: atomicrmw_sub_i64_unaligned_monotonic:
2017 ; -O1:    sub x8, x0, x20
2018 ; -O1:    bl __atomic_compare_exchange
2019     %r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 1
2020     ret i64 %r
2023 define dso_local i64 @atomicrmw_sub_i64_unaligned_acquire(ptr %ptr, i64 %value) {
2024 ; -O0-LABEL: atomicrmw_sub_i64_unaligned_acquire:
2025 ; -O0:    subs x8, x9, x8
2026 ; -O0:    bl __atomic_compare_exchange
2028 ; -O1-LABEL: atomicrmw_sub_i64_unaligned_acquire:
2029 ; -O1:    sub x8, x0, x20
2030 ; -O1:    bl __atomic_compare_exchange
2031     %r = atomicrmw sub ptr %ptr, i64 %value acquire, align 1
2032     ret i64 %r
2035 define dso_local i64 @atomicrmw_sub_i64_unaligned_release(ptr %ptr, i64 %value) {
2036 ; -O0-LABEL: atomicrmw_sub_i64_unaligned_release:
2037 ; -O0:    subs x8, x9, x8
2038 ; -O0:    bl __atomic_compare_exchange
2040 ; -O1-LABEL: atomicrmw_sub_i64_unaligned_release:
2041 ; -O1:    sub x8, x0, x20
2042 ; -O1:    bl __atomic_compare_exchange
2043     %r = atomicrmw sub ptr %ptr, i64 %value release, align 1
2044     ret i64 %r
2047 define dso_local i64 @atomicrmw_sub_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
2048 ; -O0-LABEL: atomicrmw_sub_i64_unaligned_acq_rel:
2049 ; -O0:    subs x8, x9, x8
2050 ; -O0:    bl __atomic_compare_exchange
2052 ; -O1-LABEL: atomicrmw_sub_i64_unaligned_acq_rel:
2053 ; -O1:    sub x8, x0, x20
2054 ; -O1:    bl __atomic_compare_exchange
2055     %r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 1
2056     ret i64 %r
2059 define dso_local i64 @atomicrmw_sub_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
2060 ; -O0-LABEL: atomicrmw_sub_i64_unaligned_seq_cst:
2061 ; -O0:    subs x8, x9, x8
2062 ; -O0:    bl __atomic_compare_exchange
2064 ; -O1-LABEL: atomicrmw_sub_i64_unaligned_seq_cst:
2065 ; -O1:    sub x8, x0, x20
2066 ; -O1:    bl __atomic_compare_exchange
2067     %r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 1
2068     ret i64 %r
2071 define dso_local i128 @atomicrmw_sub_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
2072 ; -O0-LABEL: atomicrmw_sub_i128_unaligned_monotonic:
2073 ; -O0:    subs x9, x10, x9
2074 ; -O0:    bl __atomic_compare_exchange
2076 ; -O1-LABEL: atomicrmw_sub_i128_unaligned_monotonic:
2077 ; -O1:    ldp x0, x1, [x0]
2078 ; -O1:    subs x8, x1, x19
2079 ; -O1:    bl __atomic_compare_exchange
2080     %r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 1
2081     ret i128 %r
2084 define dso_local i128 @atomicrmw_sub_i128_unaligned_acquire(ptr %ptr, i128 %value) {
2085 ; -O0-LABEL: atomicrmw_sub_i128_unaligned_acquire:
2086 ; -O0:    subs x9, x10, x9
2087 ; -O0:    bl __atomic_compare_exchange
2089 ; -O1-LABEL: atomicrmw_sub_i128_unaligned_acquire:
2090 ; -O1:    ldp x0, x1, [x0]
2091 ; -O1:    subs x8, x1, x19
2092 ; -O1:    bl __atomic_compare_exchange
2093     %r = atomicrmw sub ptr %ptr, i128 %value acquire, align 1
2094     ret i128 %r
2097 define dso_local i128 @atomicrmw_sub_i128_unaligned_release(ptr %ptr, i128 %value) {
2098 ; -O0-LABEL: atomicrmw_sub_i128_unaligned_release:
2099 ; -O0:    subs x9, x10, x9
2100 ; -O0:    bl __atomic_compare_exchange
2102 ; -O1-LABEL: atomicrmw_sub_i128_unaligned_release:
2103 ; -O1:    ldp x0, x1, [x0]
2104 ; -O1:    subs x8, x1, x19
2105 ; -O1:    bl __atomic_compare_exchange
2106     %r = atomicrmw sub ptr %ptr, i128 %value release, align 1
2107     ret i128 %r
2110 define dso_local i128 @atomicrmw_sub_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
2111 ; -O0-LABEL: atomicrmw_sub_i128_unaligned_acq_rel:
2112 ; -O0:    subs x9, x10, x9
2113 ; -O0:    bl __atomic_compare_exchange
2115 ; -O1-LABEL: atomicrmw_sub_i128_unaligned_acq_rel:
2116 ; -O1:    ldp x0, x1, [x0]
2117 ; -O1:    subs x8, x1, x19
2118 ; -O1:    bl __atomic_compare_exchange
2119     %r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 1
2120     ret i128 %r
2123 define dso_local i128 @atomicrmw_sub_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
2124 ; -O0-LABEL: atomicrmw_sub_i128_unaligned_seq_cst:
2125 ; -O0:    subs x9, x10, x9
2126 ; -O0:    bl __atomic_compare_exchange
2128 ; -O1-LABEL: atomicrmw_sub_i128_unaligned_seq_cst:
2129 ; -O1:    ldp x0, x1, [x0]
2130 ; -O1:    subs x8, x1, x19
2131 ; -O1:    bl __atomic_compare_exchange
2132     %r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 1
2133     ret i128 %r
2136 define dso_local i8 @atomicrmw_and_i8_aligned_monotonic(ptr %ptr, i8 %value) {
2137 ; -O0-LABEL: atomicrmw_and_i8_aligned_monotonic:
2138 ; -O0:    and w12, w9, w8
2139 ; -O0:    ldaxrb w8, [x11]
2140 ; -O0:    cmp w8, w9, uxtb
2141 ; -O0:    stlxrb w10, w12, [x11]
2142 ; -O0:    subs w9, w8, w9, uxtb
2143 ; -O0:    subs w9, w9, #1
2145 ; -O1-LABEL: atomicrmw_and_i8_aligned_monotonic:
2146 ; -O1:    ldxrb w8, [x0]
2147 ; -O1:    and w9, w8, w1
2148 ; -O1:    stxrb w10, w9, [x0]
2149     %r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1
2150     ret i8 %r
2153 define dso_local i8 @atomicrmw_and_i8_aligned_acquire(ptr %ptr, i8 %value) {
2154 ; -O0-LABEL: atomicrmw_and_i8_aligned_acquire:
2155 ; -O0:    and w12, w9, w8
2156 ; -O0:    ldaxrb w8, [x11]
2157 ; -O0:    cmp w8, w9, uxtb
2158 ; -O0:    stlxrb w10, w12, [x11]
2159 ; -O0:    subs w9, w8, w9, uxtb
2160 ; -O0:    subs w9, w9, #1
2162 ; -O1-LABEL: atomicrmw_and_i8_aligned_acquire:
2163 ; -O1:    ldaxrb w8, [x0]
2164 ; -O1:    and w9, w8, w1
2165 ; -O1:    stxrb w10, w9, [x0]
2166     %r = atomicrmw and ptr %ptr, i8 %value acquire, align 1
2167     ret i8 %r
2170 define dso_local i8 @atomicrmw_and_i8_aligned_release(ptr %ptr, i8 %value) {
2171 ; -O0-LABEL: atomicrmw_and_i8_aligned_release:
2172 ; -O0:    and w12, w9, w8
2173 ; -O0:    ldaxrb w8, [x11]
2174 ; -O0:    cmp w8, w9, uxtb
2175 ; -O0:    stlxrb w10, w12, [x11]
2176 ; -O0:    subs w9, w8, w9, uxtb
2177 ; -O0:    subs w9, w9, #1
2179 ; -O1-LABEL: atomicrmw_and_i8_aligned_release:
2180 ; -O1:    ldxrb w8, [x0]
2181 ; -O1:    and w9, w8, w1
2182 ; -O1:    stlxrb w10, w9, [x0]
2183     %r = atomicrmw and ptr %ptr, i8 %value release, align 1
2184     ret i8 %r
2187 define dso_local i8 @atomicrmw_and_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
2188 ; -O0-LABEL: atomicrmw_and_i8_aligned_acq_rel:
2189 ; -O0:    and w12, w9, w8
2190 ; -O0:    ldaxrb w8, [x11]
2191 ; -O0:    cmp w8, w9, uxtb
2192 ; -O0:    stlxrb w10, w12, [x11]
2193 ; -O0:    subs w9, w8, w9, uxtb
2194 ; -O0:    subs w9, w9, #1
2196 ; -O1-LABEL: atomicrmw_and_i8_aligned_acq_rel:
2197 ; -O1:    ldaxrb w8, [x0]
2198 ; -O1:    and w9, w8, w1
2199 ; -O1:    stlxrb w10, w9, [x0]
2200     %r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1
2201     ret i8 %r
2204 define dso_local i8 @atomicrmw_and_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
2205 ; -O0-LABEL: atomicrmw_and_i8_aligned_seq_cst:
2206 ; -O0:    and w12, w9, w8
2207 ; -O0:    ldaxrb w8, [x11]
2208 ; -O0:    cmp w8, w9, uxtb
2209 ; -O0:    stlxrb w10, w12, [x11]
2210 ; -O0:    subs w9, w8, w9, uxtb
2211 ; -O0:    subs w9, w9, #1
2213 ; -O1-LABEL: atomicrmw_and_i8_aligned_seq_cst:
2214 ; -O1:    ldaxrb w8, [x0]
2215 ; -O1:    and w9, w8, w1
2216 ; -O1:    stlxrb w10, w9, [x0]
2217     %r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1
2218     ret i8 %r
2221 define dso_local i16 @atomicrmw_and_i16_aligned_monotonic(ptr %ptr, i16 %value) {
2222 ; -O0-LABEL: atomicrmw_and_i16_aligned_monotonic:
2223 ; -O0:    and w12, w9, w8
2224 ; -O0:    ldaxrh w8, [x11]
2225 ; -O0:    cmp w8, w9, uxth
2226 ; -O0:    stlxrh w10, w12, [x11]
2227 ; -O0:    subs w9, w8, w9, uxth
2228 ; -O0:    subs w9, w9, #1
2230 ; -O1-LABEL: atomicrmw_and_i16_aligned_monotonic:
2231 ; -O1:    ldxrh w8, [x0]
2232 ; -O1:    and w9, w8, w1
2233 ; -O1:    stxrh w10, w9, [x0]
2234     %r = atomicrmw and ptr %ptr, i16 %value monotonic, align 2
2235     ret i16 %r
2238 define dso_local i16 @atomicrmw_and_i16_aligned_acquire(ptr %ptr, i16 %value) {
2239 ; -O0-LABEL: atomicrmw_and_i16_aligned_acquire:
2240 ; -O0:    and w12, w9, w8
2241 ; -O0:    ldaxrh w8, [x11]
2242 ; -O0:    cmp w8, w9, uxth
2243 ; -O0:    stlxrh w10, w12, [x11]
2244 ; -O0:    subs w9, w8, w9, uxth
2245 ; -O0:    subs w9, w9, #1
2247 ; -O1-LABEL: atomicrmw_and_i16_aligned_acquire:
2248 ; -O1:    ldaxrh w8, [x0]
2249 ; -O1:    and w9, w8, w1
2250 ; -O1:    stxrh w10, w9, [x0]
2251     %r = atomicrmw and ptr %ptr, i16 %value acquire, align 2
2252     ret i16 %r
2255 define dso_local i16 @atomicrmw_and_i16_aligned_release(ptr %ptr, i16 %value) {
2256 ; -O0-LABEL: atomicrmw_and_i16_aligned_release:
2257 ; -O0:    and w12, w9, w8
2258 ; -O0:    ldaxrh w8, [x11]
2259 ; -O0:    cmp w8, w9, uxth
2260 ; -O0:    stlxrh w10, w12, [x11]
2261 ; -O0:    subs w9, w8, w9, uxth
2262 ; -O0:    subs w9, w9, #1
2264 ; -O1-LABEL: atomicrmw_and_i16_aligned_release:
2265 ; -O1:    ldxrh w8, [x0]
2266 ; -O1:    and w9, w8, w1
2267 ; -O1:    stlxrh w10, w9, [x0]
2268     %r = atomicrmw and ptr %ptr, i16 %value release, align 2
2269     ret i16 %r
2272 define dso_local i16 @atomicrmw_and_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
2273 ; -O0-LABEL: atomicrmw_and_i16_aligned_acq_rel:
2274 ; -O0:    and w12, w9, w8
2275 ; -O0:    ldaxrh w8, [x11]
2276 ; -O0:    cmp w8, w9, uxth
2277 ; -O0:    stlxrh w10, w12, [x11]
2278 ; -O0:    subs w9, w8, w9, uxth
2279 ; -O0:    subs w9, w9, #1
2281 ; -O1-LABEL: atomicrmw_and_i16_aligned_acq_rel:
2282 ; -O1:    ldaxrh w8, [x0]
2283 ; -O1:    and w9, w8, w1
2284 ; -O1:    stlxrh w10, w9, [x0]
2285     %r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 2
2286     ret i16 %r
2289 define dso_local i16 @atomicrmw_and_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
2290 ; -O0-LABEL: atomicrmw_and_i16_aligned_seq_cst:
2291 ; -O0:    and w12, w9, w8
2292 ; -O0:    ldaxrh w8, [x11]
2293 ; -O0:    cmp w8, w9, uxth
2294 ; -O0:    stlxrh w10, w12, [x11]
2295 ; -O0:    subs w9, w8, w9, uxth
2296 ; -O0:    subs w9, w9, #1
2298 ; -O1-LABEL: atomicrmw_and_i16_aligned_seq_cst:
2299 ; -O1:    ldaxrh w8, [x0]
2300 ; -O1:    and w9, w8, w1
2301 ; -O1:    stlxrh w10, w9, [x0]
2302     %r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 2
2303     ret i16 %r
2306 define dso_local i32 @atomicrmw_and_i32_aligned_monotonic(ptr %ptr, i32 %value) {
2307 ; -O0-LABEL: atomicrmw_and_i32_aligned_monotonic:
2308 ; -O0:    and w12, w9, w8
2309 ; -O0:    ldaxr w8, [x11]
2310 ; -O0:    cmp w8, w9
2311 ; -O0:    stlxr w10, w12, [x11]
2312 ; -O0:    subs w9, w8, w9
2313 ; -O0:    subs w9, w9, #1
2315 ; -O1-LABEL: atomicrmw_and_i32_aligned_monotonic:
2316 ; -O1:    ldxr w8, [x0]
2317 ; -O1:    and w9, w8, w1
2318 ; -O1:    stxr w10, w9, [x0]
2319     %r = atomicrmw and ptr %ptr, i32 %value monotonic, align 4
2320     ret i32 %r
2323 define dso_local i32 @atomicrmw_and_i32_aligned_acquire(ptr %ptr, i32 %value) {
2324 ; -O0-LABEL: atomicrmw_and_i32_aligned_acquire:
2325 ; -O0:    and w12, w9, w8
2326 ; -O0:    ldaxr w8, [x11]
2327 ; -O0:    cmp w8, w9
2328 ; -O0:    stlxr w10, w12, [x11]
2329 ; -O0:    subs w9, w8, w9
2330 ; -O0:    subs w9, w9, #1
2332 ; -O1-LABEL: atomicrmw_and_i32_aligned_acquire:
2333 ; -O1:    ldaxr w8, [x0]
2334 ; -O1:    and w9, w8, w1
2335 ; -O1:    stxr w10, w9, [x0]
2336     %r = atomicrmw and ptr %ptr, i32 %value acquire, align 4
2337     ret i32 %r
2340 define dso_local i32 @atomicrmw_and_i32_aligned_release(ptr %ptr, i32 %value) {
2341 ; -O0-LABEL: atomicrmw_and_i32_aligned_release:
2342 ; -O0:    and w12, w9, w8
2343 ; -O0:    ldaxr w8, [x11]
2344 ; -O0:    cmp w8, w9
2345 ; -O0:    stlxr w10, w12, [x11]
2346 ; -O0:    subs w9, w8, w9
2347 ; -O0:    subs w9, w9, #1
2349 ; -O1-LABEL: atomicrmw_and_i32_aligned_release:
2350 ; -O1:    ldxr w8, [x0]
2351 ; -O1:    and w9, w8, w1
2352 ; -O1:    stlxr w10, w9, [x0]
2353     %r = atomicrmw and ptr %ptr, i32 %value release, align 4
2354     ret i32 %r
2357 define dso_local i32 @atomicrmw_and_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
2358 ; -O0-LABEL: atomicrmw_and_i32_aligned_acq_rel:
2359 ; -O0:    and w12, w9, w8
2360 ; -O0:    ldaxr w8, [x11]
2361 ; -O0:    cmp w8, w9
2362 ; -O0:    stlxr w10, w12, [x11]
2363 ; -O0:    subs w9, w8, w9
2364 ; -O0:    subs w9, w9, #1
2366 ; -O1-LABEL: atomicrmw_and_i32_aligned_acq_rel:
2367 ; -O1:    ldaxr w8, [x0]
2368 ; -O1:    and w9, w8, w1
2369 ; -O1:    stlxr w10, w9, [x0]
2370     %r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 4
2371     ret i32 %r
2374 define dso_local i32 @atomicrmw_and_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
2375 ; -O0-LABEL: atomicrmw_and_i32_aligned_seq_cst:
2376 ; -O0:    and w12, w9, w8
2377 ; -O0:    ldaxr w8, [x11]
2378 ; -O0:    cmp w8, w9
2379 ; -O0:    stlxr w10, w12, [x11]
2380 ; -O0:    subs w9, w8, w9
2381 ; -O0:    subs w9, w9, #1
2383 ; -O1-LABEL: atomicrmw_and_i32_aligned_seq_cst:
2384 ; -O1:    ldaxr w8, [x0]
2385 ; -O1:    and w9, w8, w1
2386 ; -O1:    stlxr w10, w9, [x0]
2387     %r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 4
2388     ret i32 %r
2391 define dso_local i64 @atomicrmw_and_i64_aligned_monotonic(ptr %ptr, i64 %value) {
2392 ; -O0-LABEL: atomicrmw_and_i64_aligned_monotonic:
2393 ; -O0:    and x12, x9, x8
2394 ; -O0:    ldaxr x8, [x11]
2395 ; -O0:    cmp x8, x9
2396 ; -O0:    stlxr w10, x12, [x11]
2397 ; -O0:    subs x9, x8, x9
2398 ; -O0:    subs w9, w9, #1
2400 ; -O1-LABEL: atomicrmw_and_i64_aligned_monotonic:
2401 ; -O1:    ldxr x0, [x8]
2402 ; -O1:    and x9, x0, x1
2403 ; -O1:    stxr w10, x9, [x8]
2404     %r = atomicrmw and ptr %ptr, i64 %value monotonic, align 8
2405     ret i64 %r
2408 define dso_local i64 @atomicrmw_and_i64_aligned_acquire(ptr %ptr, i64 %value) {
2409 ; -O0-LABEL: atomicrmw_and_i64_aligned_acquire:
2410 ; -O0:    and x12, x9, x8
2411 ; -O0:    ldaxr x8, [x11]
2412 ; -O0:    cmp x8, x9
2413 ; -O0:    stlxr w10, x12, [x11]
2414 ; -O0:    subs x9, x8, x9
2415 ; -O0:    subs w9, w9, #1
2417 ; -O1-LABEL: atomicrmw_and_i64_aligned_acquire:
2418 ; -O1:    ldaxr x0, [x8]
2419 ; -O1:    and x9, x0, x1
2420 ; -O1:    stxr w10, x9, [x8]
2421     %r = atomicrmw and ptr %ptr, i64 %value acquire, align 8
2422     ret i64 %r
2425 define dso_local i64 @atomicrmw_and_i64_aligned_release(ptr %ptr, i64 %value) {
2426 ; -O0-LABEL: atomicrmw_and_i64_aligned_release:
2427 ; -O0:    and x12, x9, x8
2428 ; -O0:    ldaxr x8, [x11]
2429 ; -O0:    cmp x8, x9
2430 ; -O0:    stlxr w10, x12, [x11]
2431 ; -O0:    subs x9, x8, x9
2432 ; -O0:    subs w9, w9, #1
2434 ; -O1-LABEL: atomicrmw_and_i64_aligned_release:
2435 ; -O1:    ldxr x0, [x8]
2436 ; -O1:    and x9, x0, x1
2437 ; -O1:    stlxr w10, x9, [x8]
2438     %r = atomicrmw and ptr %ptr, i64 %value release, align 8
2439     ret i64 %r
2442 define dso_local i64 @atomicrmw_and_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
2443 ; -O0-LABEL: atomicrmw_and_i64_aligned_acq_rel:
2444 ; -O0:    and x12, x9, x8
2445 ; -O0:    ldaxr x8, [x11]
2446 ; -O0:    cmp x8, x9
2447 ; -O0:    stlxr w10, x12, [x11]
2448 ; -O0:    subs x9, x8, x9
2449 ; -O0:    subs w9, w9, #1
2451 ; -O1-LABEL: atomicrmw_and_i64_aligned_acq_rel:
2452 ; -O1:    ldaxr x0, [x8]
2453 ; -O1:    and x9, x0, x1
2454 ; -O1:    stlxr w10, x9, [x8]
2455     %r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 8
2456     ret i64 %r
2459 define dso_local i64 @atomicrmw_and_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
2460 ; -O0-LABEL: atomicrmw_and_i64_aligned_seq_cst:
2461 ; -O0:    and x12, x9, x8
2462 ; -O0:    ldaxr x8, [x11]
2463 ; -O0:    cmp x8, x9
2464 ; -O0:    stlxr w10, x12, [x11]
2465 ; -O0:    subs x9, x8, x9
2466 ; -O0:    subs w9, w9, #1
2468 ; -O1-LABEL: atomicrmw_and_i64_aligned_seq_cst:
2469 ; -O1:    ldaxr x0, [x8]
2470 ; -O1:    and x9, x0, x1
2471 ; -O1:    stlxr w10, x9, [x8]
2472     %r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 8
2473     ret i64 %r
2476 define dso_local i128 @atomicrmw_and_i128_aligned_monotonic(ptr %ptr, i128 %value) {
2477 ; -O0-LABEL: atomicrmw_and_i128_aligned_monotonic:
2478 ; -O0:    and x15, x13, x10
2479 ; -O0:    and x14, x11, x8
2480 ; -O0:    ldxp x10, x12, [x9]
2481 ; -O0:    cmp x10, x11
2482 ; -O0:    cmp x12, x13
2483 ; -O0:    stxp w8, x14, x15, [x9]
2484 ; -O0:    stxp w8, x10, x12, [x9]
2485 ; -O0:    subs x12, x12, x13
2486 ; -O0:    ccmp x10, x11, #0, eq
2488 ; -O1-LABEL: atomicrmw_and_i128_aligned_monotonic:
2489 ; -O1:    ldxp x1, x0, [x8]
2490 ; -O1:    and x9, x0, x2
2491 ; -O1:    and x10, x1, x3
2492 ; -O1:    stxp w11, x10, x9, [x8]
2493     %r = atomicrmw and ptr %ptr, i128 %value monotonic, align 16
2494     ret i128 %r
2497 define dso_local i128 @atomicrmw_and_i128_aligned_acquire(ptr %ptr, i128 %value) {
2498 ; -O0-LABEL: atomicrmw_and_i128_aligned_acquire:
2499 ; -O0:    and x15, x13, x10
2500 ; -O0:    and x14, x11, x8
2501 ; -O0:    ldaxp x10, x12, [x9]
2502 ; -O0:    cmp x10, x11
2503 ; -O0:    cmp x12, x13
2504 ; -O0:    stxp w8, x14, x15, [x9]
2505 ; -O0:    stxp w8, x10, x12, [x9]
2506 ; -O0:    subs x12, x12, x13
2507 ; -O0:    ccmp x10, x11, #0, eq
2509 ; -O1-LABEL: atomicrmw_and_i128_aligned_acquire:
2510 ; -O1:    ldaxp x1, x0, [x8]
2511 ; -O1:    and x9, x0, x2
2512 ; -O1:    and x10, x1, x3
2513 ; -O1:    stxp w11, x10, x9, [x8]
2514     %r = atomicrmw and ptr %ptr, i128 %value acquire, align 16
2515     ret i128 %r
2518 define dso_local i128 @atomicrmw_and_i128_aligned_release(ptr %ptr, i128 %value) {
2519 ; -O0-LABEL: atomicrmw_and_i128_aligned_release:
2520 ; -O0:    and x15, x13, x10
2521 ; -O0:    and x14, x11, x8
2522 ; -O0:    ldxp x10, x12, [x9]
2523 ; -O0:    cmp x10, x11
2524 ; -O0:    cmp x12, x13
2525 ; -O0:    stlxp w8, x14, x15, [x9]
2526 ; -O0:    stlxp w8, x10, x12, [x9]
2527 ; -O0:    subs x12, x12, x13
2528 ; -O0:    ccmp x10, x11, #0, eq
2530 ; -O1-LABEL: atomicrmw_and_i128_aligned_release:
2531 ; -O1:    ldxp x1, x0, [x8]
2532 ; -O1:    and x9, x0, x2
2533 ; -O1:    and x10, x1, x3
2534 ; -O1:    stlxp w11, x10, x9, [x8]
2535     %r = atomicrmw and ptr %ptr, i128 %value release, align 16
2536     ret i128 %r
2539 define dso_local i128 @atomicrmw_and_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
2540 ; -O0-LABEL: atomicrmw_and_i128_aligned_acq_rel:
2541 ; -O0:    and x15, x13, x10
2542 ; -O0:    and x14, x11, x8
2543 ; -O0:    ldaxp x10, x12, [x9]
2544 ; -O0:    cmp x10, x11
2545 ; -O0:    cmp x12, x13
2546 ; -O0:    stlxp w8, x14, x15, [x9]
2547 ; -O0:    stlxp w8, x10, x12, [x9]
2548 ; -O0:    subs x12, x12, x13
2549 ; -O0:    ccmp x10, x11, #0, eq
2551 ; -O1-LABEL: atomicrmw_and_i128_aligned_acq_rel:
2552 ; -O1:    ldaxp x1, x0, [x8]
2553 ; -O1:    and x9, x0, x2
2554 ; -O1:    and x10, x1, x3
2555 ; -O1:    stlxp w11, x10, x9, [x8]
2556     %r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 16
2557     ret i128 %r
2560 define dso_local i128 @atomicrmw_and_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
2561 ; -O0-LABEL: atomicrmw_and_i128_aligned_seq_cst:
2562 ; -O0:    and x15, x13, x10
2563 ; -O0:    and x14, x11, x8
2564 ; -O0:    ldaxp x10, x12, [x9]
2565 ; -O0:    cmp x10, x11
2566 ; -O0:    cmp x12, x13
2567 ; -O0:    stlxp w8, x14, x15, [x9]
2568 ; -O0:    stlxp w8, x10, x12, [x9]
2569 ; -O0:    subs x12, x12, x13
2570 ; -O0:    ccmp x10, x11, #0, eq
2572 ; -O1-LABEL: atomicrmw_and_i128_aligned_seq_cst:
2573 ; -O1:    ldaxp x1, x0, [x8]
2574 ; -O1:    and x9, x0, x2
2575 ; -O1:    and x10, x1, x3
2576 ; -O1:    stlxp w11, x10, x9, [x8]
2577     %r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 16
2578     ret i128 %r
2581 define dso_local i8 @atomicrmw_and_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
2582 ; -O0-LABEL: atomicrmw_and_i8_unaligned_monotonic:
2583 ; -O0:    and w12, w9, w8
2584 ; -O0:    ldaxrb w8, [x11]
2585 ; -O0:    cmp w8, w9, uxtb
2586 ; -O0:    stlxrb w10, w12, [x11]
2587 ; -O0:    subs w9, w8, w9, uxtb
2588 ; -O0:    subs w9, w9, #1
2590 ; -O1-LABEL: atomicrmw_and_i8_unaligned_monotonic:
2591 ; -O1:    ldxrb w8, [x0]
2592 ; -O1:    and w9, w8, w1
2593 ; -O1:    stxrb w10, w9, [x0]
2594     %r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1
2595     ret i8 %r
2598 define dso_local i8 @atomicrmw_and_i8_unaligned_acquire(ptr %ptr, i8 %value) {
2599 ; -O0-LABEL: atomicrmw_and_i8_unaligned_acquire:
2600 ; -O0:    and w12, w9, w8
2601 ; -O0:    ldaxrb w8, [x11]
2602 ; -O0:    cmp w8, w9, uxtb
2603 ; -O0:    stlxrb w10, w12, [x11]
2604 ; -O0:    subs w9, w8, w9, uxtb
2605 ; -O0:    subs w9, w9, #1
2607 ; -O1-LABEL: atomicrmw_and_i8_unaligned_acquire:
2608 ; -O1:    ldaxrb w8, [x0]
2609 ; -O1:    and w9, w8, w1
2610 ; -O1:    stxrb w10, w9, [x0]
2611     %r = atomicrmw and ptr %ptr, i8 %value acquire, align 1
2612     ret i8 %r
2615 define dso_local i8 @atomicrmw_and_i8_unaligned_release(ptr %ptr, i8 %value) {
2616 ; -O0-LABEL: atomicrmw_and_i8_unaligned_release:
2617 ; -O0:    and w12, w9, w8
2618 ; -O0:    ldaxrb w8, [x11]
2619 ; -O0:    cmp w8, w9, uxtb
2620 ; -O0:    stlxrb w10, w12, [x11]
2621 ; -O0:    subs w9, w8, w9, uxtb
2622 ; -O0:    subs w9, w9, #1
2624 ; -O1-LABEL: atomicrmw_and_i8_unaligned_release:
2625 ; -O1:    ldxrb w8, [x0]
2626 ; -O1:    and w9, w8, w1
2627 ; -O1:    stlxrb w10, w9, [x0]
2628     %r = atomicrmw and ptr %ptr, i8 %value release, align 1
2629     ret i8 %r
2632 define dso_local i8 @atomicrmw_and_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
2633 ; -O0-LABEL: atomicrmw_and_i8_unaligned_acq_rel:
2634 ; -O0:    and w12, w9, w8
2635 ; -O0:    ldaxrb w8, [x11]
2636 ; -O0:    cmp w8, w9, uxtb
2637 ; -O0:    stlxrb w10, w12, [x11]
2638 ; -O0:    subs w9, w8, w9, uxtb
2639 ; -O0:    subs w9, w9, #1
2641 ; -O1-LABEL: atomicrmw_and_i8_unaligned_acq_rel:
2642 ; -O1:    ldaxrb w8, [x0]
2643 ; -O1:    and w9, w8, w1
2644 ; -O1:    stlxrb w10, w9, [x0]
2645     %r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1
2646     ret i8 %r
2649 define dso_local i8 @atomicrmw_and_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
2650 ; -O0-LABEL: atomicrmw_and_i8_unaligned_seq_cst:
2651 ; -O0:    and w12, w9, w8
2652 ; -O0:    ldaxrb w8, [x11]
2653 ; -O0:    cmp w8, w9, uxtb
2654 ; -O0:    stlxrb w10, w12, [x11]
2655 ; -O0:    subs w9, w8, w9, uxtb
2656 ; -O0:    subs w9, w9, #1
2658 ; -O1-LABEL: atomicrmw_and_i8_unaligned_seq_cst:
2659 ; -O1:    ldaxrb w8, [x0]
2660 ; -O1:    and w9, w8, w1
2661 ; -O1:    stlxrb w10, w9, [x0]
2662     %r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1
2663     ret i8 %r
2666 define dso_local i16 @atomicrmw_and_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
2667 ; -O0-LABEL: atomicrmw_and_i16_unaligned_monotonic:
2668 ; -O0:    and w8, w9, w8
2669 ; -O0:    bl __atomic_compare_exchange
2671 ; -O1-LABEL: atomicrmw_and_i16_unaligned_monotonic:
2672 ; -O1:    and w8, w0, w20
2673 ; -O1:    bl __atomic_compare_exchange
2674     %r = atomicrmw and ptr %ptr, i16 %value monotonic, align 1
2675     ret i16 %r
2678 define dso_local i16 @atomicrmw_and_i16_unaligned_acquire(ptr %ptr, i16 %value) {
2679 ; -O0-LABEL: atomicrmw_and_i16_unaligned_acquire:
2680 ; -O0:    and w8, w9, w8
2681 ; -O0:    bl __atomic_compare_exchange
2683 ; -O1-LABEL: atomicrmw_and_i16_unaligned_acquire:
2684 ; -O1:    and w8, w0, w20
2685 ; -O1:    bl __atomic_compare_exchange
2686     %r = atomicrmw and ptr %ptr, i16 %value acquire, align 1
2687     ret i16 %r
2690 define dso_local i16 @atomicrmw_and_i16_unaligned_release(ptr %ptr, i16 %value) {
2691 ; -O0-LABEL: atomicrmw_and_i16_unaligned_release:
2692 ; -O0:    and w8, w9, w8
2693 ; -O0:    bl __atomic_compare_exchange
2695 ; -O1-LABEL: atomicrmw_and_i16_unaligned_release:
2696 ; -O1:    and w8, w0, w20
2697 ; -O1:    bl __atomic_compare_exchange
2698     %r = atomicrmw and ptr %ptr, i16 %value release, align 1
2699     ret i16 %r
2702 define dso_local i16 @atomicrmw_and_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
2703 ; -O0-LABEL: atomicrmw_and_i16_unaligned_acq_rel:
2704 ; -O0:    and w8, w9, w8
2705 ; -O0:    bl __atomic_compare_exchange
2707 ; -O1-LABEL: atomicrmw_and_i16_unaligned_acq_rel:
2708 ; -O1:    and w8, w0, w20
2709 ; -O1:    bl __atomic_compare_exchange
2710     %r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 1
2711     ret i16 %r
2714 define dso_local i16 @atomicrmw_and_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
2715 ; -O0-LABEL: atomicrmw_and_i16_unaligned_seq_cst:
2716 ; -O0:    and w8, w9, w8
2717 ; -O0:    bl __atomic_compare_exchange
2719 ; -O1-LABEL: atomicrmw_and_i16_unaligned_seq_cst:
2720 ; -O1:    and w8, w0, w20
2721 ; -O1:    bl __atomic_compare_exchange
2722     %r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 1
2723     ret i16 %r
2726 define dso_local i32 @atomicrmw_and_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
2727 ; -O0-LABEL: atomicrmw_and_i32_unaligned_monotonic:
2728 ; -O0:    and w8, w9, w8
2729 ; -O0:    bl __atomic_compare_exchange
2731 ; -O1-LABEL: atomicrmw_and_i32_unaligned_monotonic:
2732 ; -O1:    and w8, w0, w20
2733 ; -O1:    bl __atomic_compare_exchange
2734     %r = atomicrmw and ptr %ptr, i32 %value monotonic, align 1
2735     ret i32 %r
2738 define dso_local i32 @atomicrmw_and_i32_unaligned_acquire(ptr %ptr, i32 %value) {
2739 ; -O0-LABEL: atomicrmw_and_i32_unaligned_acquire:
2740 ; -O0:    and w8, w9, w8
2741 ; -O0:    bl __atomic_compare_exchange
2743 ; -O1-LABEL: atomicrmw_and_i32_unaligned_acquire:
2744 ; -O1:    and w8, w0, w20
2745 ; -O1:    bl __atomic_compare_exchange
2746     %r = atomicrmw and ptr %ptr, i32 %value acquire, align 1
2747     ret i32 %r
2750 define dso_local i32 @atomicrmw_and_i32_unaligned_release(ptr %ptr, i32 %value) {
2751 ; -O0-LABEL: atomicrmw_and_i32_unaligned_release:
2752 ; -O0:    and w8, w9, w8
2753 ; -O0:    bl __atomic_compare_exchange
2755 ; -O1-LABEL: atomicrmw_and_i32_unaligned_release:
2756 ; -O1:    and w8, w0, w20
2757 ; -O1:    bl __atomic_compare_exchange
2758     %r = atomicrmw and ptr %ptr, i32 %value release, align 1
2759     ret i32 %r
2762 define dso_local i32 @atomicrmw_and_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
2763 ; -O0-LABEL: atomicrmw_and_i32_unaligned_acq_rel:
2764 ; -O0:    and w8, w9, w8
2765 ; -O0:    bl __atomic_compare_exchange
2767 ; -O1-LABEL: atomicrmw_and_i32_unaligned_acq_rel:
2768 ; -O1:    and w8, w0, w20
2769 ; -O1:    bl __atomic_compare_exchange
2770     %r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 1
2771     ret i32 %r
2774 define dso_local i32 @atomicrmw_and_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
2775 ; -O0-LABEL: atomicrmw_and_i32_unaligned_seq_cst:
2776 ; -O0:    and w8, w9, w8
2777 ; -O0:    bl __atomic_compare_exchange
2779 ; -O1-LABEL: atomicrmw_and_i32_unaligned_seq_cst:
2780 ; -O1:    and w8, w0, w20
2781 ; -O1:    bl __atomic_compare_exchange
2782     %r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 1
2783     ret i32 %r
2786 define dso_local i64 @atomicrmw_and_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
2787 ; -O0-LABEL: atomicrmw_and_i64_unaligned_monotonic:
2788 ; -O0:    and x8, x9, x8
2789 ; -O0:    bl __atomic_compare_exchange
2791 ; -O1-LABEL: atomicrmw_and_i64_unaligned_monotonic:
2792 ; -O1:    and x8, x0, x20
2793 ; -O1:    bl __atomic_compare_exchange
2794     %r = atomicrmw and ptr %ptr, i64 %value monotonic, align 1
2795     ret i64 %r
2798 define dso_local i64 @atomicrmw_and_i64_unaligned_acquire(ptr %ptr, i64 %value) {
2799 ; -O0-LABEL: atomicrmw_and_i64_unaligned_acquire:
2800 ; -O0:    and x8, x9, x8
2801 ; -O0:    bl __atomic_compare_exchange
2803 ; -O1-LABEL: atomicrmw_and_i64_unaligned_acquire:
2804 ; -O1:    and x8, x0, x20
2805 ; -O1:    bl __atomic_compare_exchange
2806     %r = atomicrmw and ptr %ptr, i64 %value acquire, align 1
2807     ret i64 %r
2810 define dso_local i64 @atomicrmw_and_i64_unaligned_release(ptr %ptr, i64 %value) {
2811 ; -O0-LABEL: atomicrmw_and_i64_unaligned_release:
2812 ; -O0:    and x8, x9, x8
2813 ; -O0:    bl __atomic_compare_exchange
2815 ; -O1-LABEL: atomicrmw_and_i64_unaligned_release:
2816 ; -O1:    and x8, x0, x20
2817 ; -O1:    bl __atomic_compare_exchange
2818     %r = atomicrmw and ptr %ptr, i64 %value release, align 1
2819     ret i64 %r
2822 define dso_local i64 @atomicrmw_and_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
2823 ; -O0-LABEL: atomicrmw_and_i64_unaligned_acq_rel:
2824 ; -O0:    and x8, x9, x8
2825 ; -O0:    bl __atomic_compare_exchange
2827 ; -O1-LABEL: atomicrmw_and_i64_unaligned_acq_rel:
2828 ; -O1:    and x8, x0, x20
2829 ; -O1:    bl __atomic_compare_exchange
2830     %r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 1
2831     ret i64 %r
2834 define dso_local i64 @atomicrmw_and_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
2835 ; -O0-LABEL: atomicrmw_and_i64_unaligned_seq_cst:
2836 ; -O0:    and x8, x9, x8
2837 ; -O0:    bl __atomic_compare_exchange
2839 ; -O1-LABEL: atomicrmw_and_i64_unaligned_seq_cst:
2840 ; -O1:    and x8, x0, x20
2841 ; -O1:    bl __atomic_compare_exchange
2842     %r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 1
2843     ret i64 %r
2846 define dso_local i128 @atomicrmw_and_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
2847 ; -O0-LABEL: atomicrmw_and_i128_unaligned_monotonic:
2848 ; -O0:    and x8, x11, x8
2849 ; -O0:    and x9, x10, x9
2850 ; -O0:    bl __atomic_compare_exchange
2852 ; -O1-LABEL: atomicrmw_and_i128_unaligned_monotonic:
2853 ; -O1:    ldp x0, x1, [x0]
2854 ; -O1:    and x8, x1, x19
2855 ; -O1:    and x9, x0, x21
2856 ; -O1:    bl __atomic_compare_exchange
2857     %r = atomicrmw and ptr %ptr, i128 %value monotonic, align 1
2858     ret i128 %r
2861 define dso_local i128 @atomicrmw_and_i128_unaligned_acquire(ptr %ptr, i128 %value) {
2862 ; -O0-LABEL: atomicrmw_and_i128_unaligned_acquire:
2863 ; -O0:    and x8, x11, x8
2864 ; -O0:    and x9, x10, x9
2865 ; -O0:    bl __atomic_compare_exchange
2867 ; -O1-LABEL: atomicrmw_and_i128_unaligned_acquire:
2868 ; -O1:    ldp x0, x1, [x0]
2869 ; -O1:    and x8, x1, x19
2870 ; -O1:    and x9, x0, x21
2871 ; -O1:    bl __atomic_compare_exchange
2872     %r = atomicrmw and ptr %ptr, i128 %value acquire, align 1
2873     ret i128 %r
2876 define dso_local i128 @atomicrmw_and_i128_unaligned_release(ptr %ptr, i128 %value) {
2877 ; -O0-LABEL: atomicrmw_and_i128_unaligned_release:
2878 ; -O0:    and x8, x11, x8
2879 ; -O0:    and x9, x10, x9
2880 ; -O0:    bl __atomic_compare_exchange
2882 ; -O1-LABEL: atomicrmw_and_i128_unaligned_release:
2883 ; -O1:    ldp x0, x1, [x0]
2884 ; -O1:    and x8, x1, x19
2885 ; -O1:    and x9, x0, x21
2886 ; -O1:    bl __atomic_compare_exchange
2887     %r = atomicrmw and ptr %ptr, i128 %value release, align 1
2888     ret i128 %r
2891 define dso_local i128 @atomicrmw_and_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
2892 ; -O0-LABEL: atomicrmw_and_i128_unaligned_acq_rel:
2893 ; -O0:    and x8, x11, x8
2894 ; -O0:    and x9, x10, x9
2895 ; -O0:    bl __atomic_compare_exchange
2897 ; -O1-LABEL: atomicrmw_and_i128_unaligned_acq_rel:
2898 ; -O1:    ldp x0, x1, [x0]
2899 ; -O1:    and x8, x1, x19
2900 ; -O1:    and x9, x0, x21
2901 ; -O1:    bl __atomic_compare_exchange
2902     %r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 1
2903     ret i128 %r
2906 define dso_local i128 @atomicrmw_and_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
2907 ; -O0-LABEL: atomicrmw_and_i128_unaligned_seq_cst:
2908 ; -O0:    and x8, x11, x8
2909 ; -O0:    and x9, x10, x9
2910 ; -O0:    bl __atomic_compare_exchange
2912 ; -O1-LABEL: atomicrmw_and_i128_unaligned_seq_cst:
2913 ; -O1:    ldp x0, x1, [x0]
2914 ; -O1:    and x8, x1, x19
2915 ; -O1:    and x9, x0, x21
2916 ; -O1:    bl __atomic_compare_exchange
2917     %r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 1
2918     ret i128 %r
2921 define dso_local i8 @atomicrmw_nand_i8_aligned_monotonic(ptr %ptr, i8 %value) {
2922 ; -O0-LABEL: atomicrmw_nand_i8_aligned_monotonic:
2923 ; -O0:    and w8, w9, w8
2924 ; -O0:    mvn w12, w8
2925 ; -O0:    ldaxrb w8, [x11]
2926 ; -O0:    cmp w8, w9, uxtb
2927 ; -O0:    stlxrb w10, w12, [x11]
2928 ; -O0:    subs w9, w8, w9, uxtb
2929 ; -O0:    subs w9, w9, #1
2931 ; -O1-LABEL: atomicrmw_nand_i8_aligned_monotonic:
2932 ; -O1:    ldxrb w8, [x0]
2933 ; -O1:    and w9, w8, w1
2934 ; -O1:    mvn w9, w9
2935 ; -O1:    stxrb w10, w9, [x0]
2936     %r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1
2937     ret i8 %r
2940 define dso_local i8 @atomicrmw_nand_i8_aligned_acquire(ptr %ptr, i8 %value) {
2941 ; -O0-LABEL: atomicrmw_nand_i8_aligned_acquire:
2942 ; -O0:    and w8, w9, w8
2943 ; -O0:    mvn w12, w8
2944 ; -O0:    ldaxrb w8, [x11]
2945 ; -O0:    cmp w8, w9, uxtb
2946 ; -O0:    stlxrb w10, w12, [x11]
2947 ; -O0:    subs w9, w8, w9, uxtb
2948 ; -O0:    subs w9, w9, #1
2950 ; -O1-LABEL: atomicrmw_nand_i8_aligned_acquire:
2951 ; -O1:    ldaxrb w8, [x0]
2952 ; -O1:    and w9, w8, w1
2953 ; -O1:    mvn w9, w9
2954 ; -O1:    stxrb w10, w9, [x0]
2955     %r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1
2956     ret i8 %r
2959 define dso_local i8 @atomicrmw_nand_i8_aligned_release(ptr %ptr, i8 %value) {
2960 ; -O0-LABEL: atomicrmw_nand_i8_aligned_release:
2961 ; -O0:    and w8, w9, w8
2962 ; -O0:    mvn w12, w8
2963 ; -O0:    ldaxrb w8, [x11]
2964 ; -O0:    cmp w8, w9, uxtb
2965 ; -O0:    stlxrb w10, w12, [x11]
2966 ; -O0:    subs w9, w8, w9, uxtb
2967 ; -O0:    subs w9, w9, #1
2969 ; -O1-LABEL: atomicrmw_nand_i8_aligned_release:
2970 ; -O1:    ldxrb w8, [x0]
2971 ; -O1:    and w9, w8, w1
2972 ; -O1:    mvn w9, w9
2973 ; -O1:    stlxrb w10, w9, [x0]
2974     %r = atomicrmw nand ptr %ptr, i8 %value release, align 1
2975     ret i8 %r
2978 define dso_local i8 @atomicrmw_nand_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
2979 ; -O0-LABEL: atomicrmw_nand_i8_aligned_acq_rel:
2980 ; -O0:    and w8, w9, w8
2981 ; -O0:    mvn w12, w8
2982 ; -O0:    ldaxrb w8, [x11]
2983 ; -O0:    cmp w8, w9, uxtb
2984 ; -O0:    stlxrb w10, w12, [x11]
2985 ; -O0:    subs w9, w8, w9, uxtb
2986 ; -O0:    subs w9, w9, #1
2988 ; -O1-LABEL: atomicrmw_nand_i8_aligned_acq_rel:
2989 ; -O1:    ldaxrb w8, [x0]
2990 ; -O1:    and w9, w8, w1
2991 ; -O1:    mvn w9, w9
2992 ; -O1:    stlxrb w10, w9, [x0]
2993     %r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1
2994     ret i8 %r
2997 define dso_local i8 @atomicrmw_nand_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
2998 ; -O0-LABEL: atomicrmw_nand_i8_aligned_seq_cst:
2999 ; -O0:    and w8, w9, w8
3000 ; -O0:    mvn w12, w8
3001 ; -O0:    ldaxrb w8, [x11]
3002 ; -O0:    cmp w8, w9, uxtb
3003 ; -O0:    stlxrb w10, w12, [x11]
3004 ; -O0:    subs w9, w8, w9, uxtb
3005 ; -O0:    subs w9, w9, #1
3007 ; -O1-LABEL: atomicrmw_nand_i8_aligned_seq_cst:
3008 ; -O1:    ldaxrb w8, [x0]
3009 ; -O1:    and w9, w8, w1
3010 ; -O1:    mvn w9, w9
3011 ; -O1:    stlxrb w10, w9, [x0]
3012     %r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1
3013     ret i8 %r
3016 define dso_local i16 @atomicrmw_nand_i16_aligned_monotonic(ptr %ptr, i16 %value) {
3017 ; -O0-LABEL: atomicrmw_nand_i16_aligned_monotonic:
3018 ; -O0:    and w8, w9, w8
3019 ; -O0:    mvn w12, w8
3020 ; -O0:    ldaxrh w8, [x11]
3021 ; -O0:    cmp w8, w9, uxth
3022 ; -O0:    stlxrh w10, w12, [x11]
3023 ; -O0:    subs w9, w8, w9, uxth
3024 ; -O0:    subs w9, w9, #1
3026 ; -O1-LABEL: atomicrmw_nand_i16_aligned_monotonic:
3027 ; -O1:    ldxrh w8, [x0]
3028 ; -O1:    and w9, w8, w1
3029 ; -O1:    mvn w9, w9
3030 ; -O1:    stxrh w10, w9, [x0]
3031     %r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 2
3032     ret i16 %r
3035 define dso_local i16 @atomicrmw_nand_i16_aligned_acquire(ptr %ptr, i16 %value) {
3036 ; -O0-LABEL: atomicrmw_nand_i16_aligned_acquire:
3037 ; -O0:    and w8, w9, w8
3038 ; -O0:    mvn w12, w8
3039 ; -O0:    ldaxrh w8, [x11]
3040 ; -O0:    cmp w8, w9, uxth
3041 ; -O0:    stlxrh w10, w12, [x11]
3042 ; -O0:    subs w9, w8, w9, uxth
3043 ; -O0:    subs w9, w9, #1
3045 ; -O1-LABEL: atomicrmw_nand_i16_aligned_acquire:
3046 ; -O1:    ldaxrh w8, [x0]
3047 ; -O1:    and w9, w8, w1
3048 ; -O1:    mvn w9, w9
3049 ; -O1:    stxrh w10, w9, [x0]
3050     %r = atomicrmw nand ptr %ptr, i16 %value acquire, align 2
3051     ret i16 %r
3054 define dso_local i16 @atomicrmw_nand_i16_aligned_release(ptr %ptr, i16 %value) {
3055 ; -O0-LABEL: atomicrmw_nand_i16_aligned_release:
3056 ; -O0:    and w8, w9, w8
3057 ; -O0:    mvn w12, w8
3058 ; -O0:    ldaxrh w8, [x11]
3059 ; -O0:    cmp w8, w9, uxth
3060 ; -O0:    stlxrh w10, w12, [x11]
3061 ; -O0:    subs w9, w8, w9, uxth
3062 ; -O0:    subs w9, w9, #1
3064 ; -O1-LABEL: atomicrmw_nand_i16_aligned_release:
3065 ; -O1:    ldxrh w8, [x0]
3066 ; -O1:    and w9, w8, w1
3067 ; -O1:    mvn w9, w9
3068 ; -O1:    stlxrh w10, w9, [x0]
3069     %r = atomicrmw nand ptr %ptr, i16 %value release, align 2
3070     ret i16 %r
3073 define dso_local i16 @atomicrmw_nand_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
3074 ; -O0-LABEL: atomicrmw_nand_i16_aligned_acq_rel:
3075 ; -O0:    and w8, w9, w8
3076 ; -O0:    mvn w12, w8
3077 ; -O0:    ldaxrh w8, [x11]
3078 ; -O0:    cmp w8, w9, uxth
3079 ; -O0:    stlxrh w10, w12, [x11]
3080 ; -O0:    subs w9, w8, w9, uxth
3081 ; -O0:    subs w9, w9, #1
3083 ; -O1-LABEL: atomicrmw_nand_i16_aligned_acq_rel:
3084 ; -O1:    ldaxrh w8, [x0]
3085 ; -O1:    and w9, w8, w1
3086 ; -O1:    mvn w9, w9
3087 ; -O1:    stlxrh w10, w9, [x0]
3088     %r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 2
3089     ret i16 %r
3092 define dso_local i16 @atomicrmw_nand_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
3093 ; -O0-LABEL: atomicrmw_nand_i16_aligned_seq_cst:
3094 ; -O0:    and w8, w9, w8
3095 ; -O0:    mvn w12, w8
3096 ; -O0:    ldaxrh w8, [x11]
3097 ; -O0:    cmp w8, w9, uxth
3098 ; -O0:    stlxrh w10, w12, [x11]
3099 ; -O0:    subs w9, w8, w9, uxth
3100 ; -O0:    subs w9, w9, #1
3102 ; -O1-LABEL: atomicrmw_nand_i16_aligned_seq_cst:
3103 ; -O1:    ldaxrh w8, [x0]
3104 ; -O1:    and w9, w8, w1
3105 ; -O1:    mvn w9, w9
3106 ; -O1:    stlxrh w10, w9, [x0]
3107     %r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 2
3108     ret i16 %r
3111 define dso_local i32 @atomicrmw_nand_i32_aligned_monotonic(ptr %ptr, i32 %value) {
3112 ; -O0-LABEL: atomicrmw_nand_i32_aligned_monotonic:
3113 ; -O0:    and w8, w9, w8
3114 ; -O0:    mvn w12, w8
3115 ; -O0:    ldaxr w8, [x11]
3116 ; -O0:    cmp w8, w9
3117 ; -O0:    stlxr w10, w12, [x11]
3118 ; -O0:    subs w9, w8, w9
3119 ; -O0:    subs w9, w9, #1
3121 ; -O1-LABEL: atomicrmw_nand_i32_aligned_monotonic:
3122 ; -O1:    ldxr w8, [x0]
3123 ; -O1:    and w9, w8, w1
3124 ; -O1:    mvn w9, w9
3125 ; -O1:    stxr w10, w9, [x0]
3126     %r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 4
3127     ret i32 %r
3130 define dso_local i32 @atomicrmw_nand_i32_aligned_acquire(ptr %ptr, i32 %value) {
3131 ; -O0-LABEL: atomicrmw_nand_i32_aligned_acquire:
3132 ; -O0:    and w8, w9, w8
3133 ; -O0:    mvn w12, w8
3134 ; -O0:    ldaxr w8, [x11]
3135 ; -O0:    cmp w8, w9
3136 ; -O0:    stlxr w10, w12, [x11]
3137 ; -O0:    subs w9, w8, w9
3138 ; -O0:    subs w9, w9, #1
3140 ; -O1-LABEL: atomicrmw_nand_i32_aligned_acquire:
3141 ; -O1:    ldaxr w8, [x0]
3142 ; -O1:    and w9, w8, w1
3143 ; -O1:    mvn w9, w9
3144 ; -O1:    stxr w10, w9, [x0]
3145     %r = atomicrmw nand ptr %ptr, i32 %value acquire, align 4
3146     ret i32 %r
3149 define dso_local i32 @atomicrmw_nand_i32_aligned_release(ptr %ptr, i32 %value) {
3150 ; -O0-LABEL: atomicrmw_nand_i32_aligned_release:
3151 ; -O0:    and w8, w9, w8
3152 ; -O0:    mvn w12, w8
3153 ; -O0:    ldaxr w8, [x11]
3154 ; -O0:    cmp w8, w9
3155 ; -O0:    stlxr w10, w12, [x11]
3156 ; -O0:    subs w9, w8, w9
3157 ; -O0:    subs w9, w9, #1
3159 ; -O1-LABEL: atomicrmw_nand_i32_aligned_release:
3160 ; -O1:    ldxr w8, [x0]
3161 ; -O1:    and w9, w8, w1
3162 ; -O1:    mvn w9, w9
3163 ; -O1:    stlxr w10, w9, [x0]
3164     %r = atomicrmw nand ptr %ptr, i32 %value release, align 4
3165     ret i32 %r
3168 define dso_local i32 @atomicrmw_nand_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
3169 ; -O0-LABEL: atomicrmw_nand_i32_aligned_acq_rel:
3170 ; -O0:    and w8, w9, w8
3171 ; -O0:    mvn w12, w8
3172 ; -O0:    ldaxr w8, [x11]
3173 ; -O0:    cmp w8, w9
3174 ; -O0:    stlxr w10, w12, [x11]
3175 ; -O0:    subs w9, w8, w9
3176 ; -O0:    subs w9, w9, #1
3178 ; -O1-LABEL: atomicrmw_nand_i32_aligned_acq_rel:
3179 ; -O1:    ldaxr w8, [x0]
3180 ; -O1:    and w9, w8, w1
3181 ; -O1:    mvn w9, w9
3182 ; -O1:    stlxr w10, w9, [x0]
3183     %r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 4
3184     ret i32 %r
3187 define dso_local i32 @atomicrmw_nand_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
3188 ; -O0-LABEL: atomicrmw_nand_i32_aligned_seq_cst:
3189 ; -O0:    and w8, w9, w8
3190 ; -O0:    mvn w12, w8
3191 ; -O0:    ldaxr w8, [x11]
3192 ; -O0:    cmp w8, w9
3193 ; -O0:    stlxr w10, w12, [x11]
3194 ; -O0:    subs w9, w8, w9
3195 ; -O0:    subs w9, w9, #1
3197 ; -O1-LABEL: atomicrmw_nand_i32_aligned_seq_cst:
3198 ; -O1:    ldaxr w8, [x0]
3199 ; -O1:    and w9, w8, w1
3200 ; -O1:    mvn w9, w9
3201 ; -O1:    stlxr w10, w9, [x0]
3202     %r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 4
3203     ret i32 %r
3206 define dso_local i64 @atomicrmw_nand_i64_aligned_monotonic(ptr %ptr, i64 %value) {
3207 ; -O0-LABEL: atomicrmw_nand_i64_aligned_monotonic:
3208 ; -O0:    and x8, x9, x8
3209 ; -O0:    mvn x12, x8
3210 ; -O0:    ldaxr x8, [x11]
3211 ; -O0:    cmp x8, x9
3212 ; -O0:    stlxr w10, x12, [x11]
3213 ; -O0:    subs x9, x8, x9
3214 ; -O0:    subs w9, w9, #1
3216 ; -O1-LABEL: atomicrmw_nand_i64_aligned_monotonic:
3217 ; -O1:    ldxr x0, [x8]
3218 ; -O1:    and x9, x0, x1
3219 ; -O1:    mvn x9, x9
3220 ; -O1:    stxr w10, x9, [x8]
3221     %r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 8
3222     ret i64 %r
3225 define dso_local i64 @atomicrmw_nand_i64_aligned_acquire(ptr %ptr, i64 %value) {
3226 ; -O0-LABEL: atomicrmw_nand_i64_aligned_acquire:
3227 ; -O0:    and x8, x9, x8
3228 ; -O0:    mvn x12, x8
3229 ; -O0:    ldaxr x8, [x11]
3230 ; -O0:    cmp x8, x9
3231 ; -O0:    stlxr w10, x12, [x11]
3232 ; -O0:    subs x9, x8, x9
3233 ; -O0:    subs w9, w9, #1
3235 ; -O1-LABEL: atomicrmw_nand_i64_aligned_acquire:
3236 ; -O1:    ldaxr x0, [x8]
3237 ; -O1:    and x9, x0, x1
3238 ; -O1:    mvn x9, x9
3239 ; -O1:    stxr w10, x9, [x8]
3240     %r = atomicrmw nand ptr %ptr, i64 %value acquire, align 8
3241     ret i64 %r
3244 define dso_local i64 @atomicrmw_nand_i64_aligned_release(ptr %ptr, i64 %value) {
3245 ; -O0-LABEL: atomicrmw_nand_i64_aligned_release:
3246 ; -O0:    and x8, x9, x8
3247 ; -O0:    mvn x12, x8
3248 ; -O0:    ldaxr x8, [x11]
3249 ; -O0:    cmp x8, x9
3250 ; -O0:    stlxr w10, x12, [x11]
3251 ; -O0:    subs x9, x8, x9
3252 ; -O0:    subs w9, w9, #1
3254 ; -O1-LABEL: atomicrmw_nand_i64_aligned_release:
3255 ; -O1:    ldxr x0, [x8]
3256 ; -O1:    and x9, x0, x1
3257 ; -O1:    mvn x9, x9
3258 ; -O1:    stlxr w10, x9, [x8]
3259     %r = atomicrmw nand ptr %ptr, i64 %value release, align 8
3260     ret i64 %r
3263 define dso_local i64 @atomicrmw_nand_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
3264 ; -O0-LABEL: atomicrmw_nand_i64_aligned_acq_rel:
3265 ; -O0:    and x8, x9, x8
3266 ; -O0:    mvn x12, x8
3267 ; -O0:    ldaxr x8, [x11]
3268 ; -O0:    cmp x8, x9
3269 ; -O0:    stlxr w10, x12, [x11]
3270 ; -O0:    subs x9, x8, x9
3271 ; -O0:    subs w9, w9, #1
3273 ; -O1-LABEL: atomicrmw_nand_i64_aligned_acq_rel:
3274 ; -O1:    ldaxr x0, [x8]
3275 ; -O1:    and x9, x0, x1
3276 ; -O1:    mvn x9, x9
3277 ; -O1:    stlxr w10, x9, [x8]
3278     %r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 8
3279     ret i64 %r
3282 define dso_local i64 @atomicrmw_nand_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
3283 ; -O0-LABEL: atomicrmw_nand_i64_aligned_seq_cst:
3284 ; -O0:    and x8, x9, x8
3285 ; -O0:    mvn x12, x8
3286 ; -O0:    ldaxr x8, [x11]
3287 ; -O0:    cmp x8, x9
3288 ; -O0:    stlxr w10, x12, [x11]
3289 ; -O0:    subs x9, x8, x9
3290 ; -O0:    subs w9, w9, #1
3292 ; -O1-LABEL: atomicrmw_nand_i64_aligned_seq_cst:
3293 ; -O1:    ldaxr x0, [x8]
3294 ; -O1:    and x9, x0, x1
3295 ; -O1:    mvn x9, x9
3296 ; -O1:    stlxr w10, x9, [x8]
3297     %r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 8
3298     ret i64 %r
3301 define dso_local i128 @atomicrmw_nand_i128_aligned_monotonic(ptr %ptr, i128 %value) {
3302 ; -O0-LABEL: atomicrmw_nand_i128_aligned_monotonic:
3303 ; -O0:    and x8, x11, x8
3304 ; -O0:    and x10, x13, x10
3305 ; -O0:    mvn x15, x10
3306 ; -O0:    mvn x14, x8
3307 ; -O0:    ldxp x10, x12, [x9]
3308 ; -O0:    cmp x10, x11
3309 ; -O0:    cmp x12, x13
3310 ; -O0:    stxp w8, x14, x15, [x9]
3311 ; -O0:    stxp w8, x10, x12, [x9]
3312 ; -O0:    subs x12, x12, x13
3313 ; -O0:    ccmp x10, x11, #0, eq
3315 ; -O1-LABEL: atomicrmw_nand_i128_aligned_monotonic:
3316 ; -O1:    ldxp x1, x0, [x8]
3317 ; -O1:    and x9, x1, x3
3318 ; -O1:    and x10, x0, x2
3319 ; -O1:    mvn x10, x10
3320 ; -O1:    mvn x9, x9
3321 ; -O1:    stxp w11, x9, x10, [x8]
3322     %r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 16
3323     ret i128 %r
3326 define dso_local i128 @atomicrmw_nand_i128_aligned_acquire(ptr %ptr, i128 %value) {
3327 ; -O0-LABEL: atomicrmw_nand_i128_aligned_acquire:
3328 ; -O0:    and x8, x11, x8
3329 ; -O0:    and x10, x13, x10
3330 ; -O0:    mvn x15, x10
3331 ; -O0:    mvn x14, x8
3332 ; -O0:    ldaxp x10, x12, [x9]
3333 ; -O0:    cmp x10, x11
3334 ; -O0:    cmp x12, x13
3335 ; -O0:    stxp w8, x14, x15, [x9]
3336 ; -O0:    stxp w8, x10, x12, [x9]
3337 ; -O0:    subs x12, x12, x13
3338 ; -O0:    ccmp x10, x11, #0, eq
3340 ; -O1-LABEL: atomicrmw_nand_i128_aligned_acquire:
3341 ; -O1:    ldaxp x1, x0, [x8]
3342 ; -O1:    and x9, x1, x3
3343 ; -O1:    and x10, x0, x2
3344 ; -O1:    mvn x10, x10
3345 ; -O1:    mvn x9, x9
3346 ; -O1:    stxp w11, x9, x10, [x8]
3347     %r = atomicrmw nand ptr %ptr, i128 %value acquire, align 16
3348     ret i128 %r
3351 define dso_local i128 @atomicrmw_nand_i128_aligned_release(ptr %ptr, i128 %value) {
3352 ; -O0-LABEL: atomicrmw_nand_i128_aligned_release:
3353 ; -O0:    and x8, x11, x8
3354 ; -O0:    and x10, x13, x10
3355 ; -O0:    mvn x15, x10
3356 ; -O0:    mvn x14, x8
3357 ; -O0:    ldxp x10, x12, [x9]
3358 ; -O0:    cmp x10, x11
3359 ; -O0:    cmp x12, x13
3360 ; -O0:    stlxp w8, x14, x15, [x9]
3361 ; -O0:    stlxp w8, x10, x12, [x9]
3362 ; -O0:    subs x12, x12, x13
3363 ; -O0:    ccmp x10, x11, #0, eq
3365 ; -O1-LABEL: atomicrmw_nand_i128_aligned_release:
3366 ; -O1:    ldxp x1, x0, [x8]
3367 ; -O1:    and x9, x1, x3
3368 ; -O1:    and x10, x0, x2
3369 ; -O1:    mvn x10, x10
3370 ; -O1:    mvn x9, x9
3371 ; -O1:    stlxp w11, x9, x10, [x8]
3372     %r = atomicrmw nand ptr %ptr, i128 %value release, align 16
3373     ret i128 %r
3376 define dso_local i128 @atomicrmw_nand_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
3377 ; -O0-LABEL: atomicrmw_nand_i128_aligned_acq_rel:
3378 ; -O0:    and x8, x11, x8
3379 ; -O0:    and x10, x13, x10
3380 ; -O0:    mvn x15, x10
3381 ; -O0:    mvn x14, x8
3382 ; -O0:    ldaxp x10, x12, [x9]
3383 ; -O0:    cmp x10, x11
3384 ; -O0:    cmp x12, x13
3385 ; -O0:    stlxp w8, x14, x15, [x9]
3386 ; -O0:    stlxp w8, x10, x12, [x9]
3387 ; -O0:    subs x12, x12, x13
3388 ; -O0:    ccmp x10, x11, #0, eq
3390 ; -O1-LABEL: atomicrmw_nand_i128_aligned_acq_rel:
3391 ; -O1:    ldaxp x1, x0, [x8]
3392 ; -O1:    and x9, x1, x3
3393 ; -O1:    and x10, x0, x2
3394 ; -O1:    mvn x10, x10
3395 ; -O1:    mvn x9, x9
3396 ; -O1:    stlxp w11, x9, x10, [x8]
3397     %r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 16
3398     ret i128 %r
3401 define dso_local i128 @atomicrmw_nand_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
3402 ; -O0-LABEL: atomicrmw_nand_i128_aligned_seq_cst:
3403 ; -O0:    and x8, x11, x8
3404 ; -O0:    and x10, x13, x10
3405 ; -O0:    mvn x15, x10
3406 ; -O0:    mvn x14, x8
3407 ; -O0:    ldaxp x10, x12, [x9]
3408 ; -O0:    cmp x10, x11
3409 ; -O0:    cmp x12, x13
3410 ; -O0:    stlxp w8, x14, x15, [x9]
3411 ; -O0:    stlxp w8, x10, x12, [x9]
3412 ; -O0:    subs x12, x12, x13
3413 ; -O0:    ccmp x10, x11, #0, eq
3415 ; -O1-LABEL: atomicrmw_nand_i128_aligned_seq_cst:
3416 ; -O1:    ldaxp x1, x0, [x8]
3417 ; -O1:    and x9, x1, x3
3418 ; -O1:    and x10, x0, x2
3419 ; -O1:    mvn x10, x10
3420 ; -O1:    mvn x9, x9
3421 ; -O1:    stlxp w11, x9, x10, [x8]
3422     %r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 16
3423     ret i128 %r
3426 define dso_local i8 @atomicrmw_nand_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
3427 ; -O0-LABEL: atomicrmw_nand_i8_unaligned_monotonic:
3428 ; -O0:    and w8, w9, w8
3429 ; -O0:    mvn w12, w8
3430 ; -O0:    ldaxrb w8, [x11]
3431 ; -O0:    cmp w8, w9, uxtb
3432 ; -O0:    stlxrb w10, w12, [x11]
3433 ; -O0:    subs w9, w8, w9, uxtb
3434 ; -O0:    subs w9, w9, #1
3436 ; -O1-LABEL: atomicrmw_nand_i8_unaligned_monotonic:
3437 ; -O1:    ldxrb w8, [x0]
3438 ; -O1:    and w9, w8, w1
3439 ; -O1:    mvn w9, w9
3440 ; -O1:    stxrb w10, w9, [x0]
3441     %r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1
3442     ret i8 %r
3445 define dso_local i8 @atomicrmw_nand_i8_unaligned_acquire(ptr %ptr, i8 %value) {
3446 ; -O0-LABEL: atomicrmw_nand_i8_unaligned_acquire:
3447 ; -O0:    and w8, w9, w8
3448 ; -O0:    mvn w12, w8
3449 ; -O0:    ldaxrb w8, [x11]
3450 ; -O0:    cmp w8, w9, uxtb
3451 ; -O0:    stlxrb w10, w12, [x11]
3452 ; -O0:    subs w9, w8, w9, uxtb
3453 ; -O0:    subs w9, w9, #1
3455 ; -O1-LABEL: atomicrmw_nand_i8_unaligned_acquire:
3456 ; -O1:    ldaxrb w8, [x0]
3457 ; -O1:    and w9, w8, w1
3458 ; -O1:    mvn w9, w9
3459 ; -O1:    stxrb w10, w9, [x0]
3460     %r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1
3461     ret i8 %r
3464 define dso_local i8 @atomicrmw_nand_i8_unaligned_release(ptr %ptr, i8 %value) {
3465 ; -O0-LABEL: atomicrmw_nand_i8_unaligned_release:
3466 ; -O0:    and w8, w9, w8
3467 ; -O0:    mvn w12, w8
3468 ; -O0:    ldaxrb w8, [x11]
3469 ; -O0:    cmp w8, w9, uxtb
3470 ; -O0:    stlxrb w10, w12, [x11]
3471 ; -O0:    subs w9, w8, w9, uxtb
3472 ; -O0:    subs w9, w9, #1
3474 ; -O1-LABEL: atomicrmw_nand_i8_unaligned_release:
3475 ; -O1:    ldxrb w8, [x0]
3476 ; -O1:    and w9, w8, w1
3477 ; -O1:    mvn w9, w9
3478 ; -O1:    stlxrb w10, w9, [x0]
3479     %r = atomicrmw nand ptr %ptr, i8 %value release, align 1
3480     ret i8 %r
3483 define dso_local i8 @atomicrmw_nand_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
3484 ; -O0-LABEL: atomicrmw_nand_i8_unaligned_acq_rel:
3485 ; -O0:    and w8, w9, w8
3486 ; -O0:    mvn w12, w8
3487 ; -O0:    ldaxrb w8, [x11]
3488 ; -O0:    cmp w8, w9, uxtb
3489 ; -O0:    stlxrb w10, w12, [x11]
3490 ; -O0:    subs w9, w8, w9, uxtb
3491 ; -O0:    subs w9, w9, #1
3493 ; -O1-LABEL: atomicrmw_nand_i8_unaligned_acq_rel:
3494 ; -O1:    ldaxrb w8, [x0]
3495 ; -O1:    and w9, w8, w1
3496 ; -O1:    mvn w9, w9
3497 ; -O1:    stlxrb w10, w9, [x0]
3498     %r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1
3499     ret i8 %r
3502 define dso_local i8 @atomicrmw_nand_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
3503 ; -O0-LABEL: atomicrmw_nand_i8_unaligned_seq_cst:
3504 ; -O0:    and w8, w9, w8
3505 ; -O0:    mvn w12, w8
3506 ; -O0:    ldaxrb w8, [x11]
3507 ; -O0:    cmp w8, w9, uxtb
3508 ; -O0:    stlxrb w10, w12, [x11]
3509 ; -O0:    subs w9, w8, w9, uxtb
3510 ; -O0:    subs w9, w9, #1
3512 ; -O1-LABEL: atomicrmw_nand_i8_unaligned_seq_cst:
3513 ; -O1:    ldaxrb w8, [x0]
3514 ; -O1:    and w9, w8, w1
3515 ; -O1:    mvn w9, w9
3516 ; -O1:    stlxrb w10, w9, [x0]
3517     %r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1
3518     ret i8 %r
3521 define dso_local i16 @atomicrmw_nand_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
3522 ; -O0-LABEL: atomicrmw_nand_i16_unaligned_monotonic:
3523 ; -O0:    and w8, w9, w8
3524 ; -O0:    mvn w8, w8
3525 ; -O0:    bl __atomic_compare_exchange
3527 ; -O1-LABEL: atomicrmw_nand_i16_unaligned_monotonic:
3528 ; -O1:    and w8, w0, w20
3529 ; -O1:    mvn w8, w8
3530 ; -O1:    bl __atomic_compare_exchange
3531     %r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 1
3532     ret i16 %r
3535 define dso_local i16 @atomicrmw_nand_i16_unaligned_acquire(ptr %ptr, i16 %value) {
3536 ; -O0-LABEL: atomicrmw_nand_i16_unaligned_acquire:
3537 ; -O0:    and w8, w9, w8
3538 ; -O0:    mvn w8, w8
3539 ; -O0:    bl __atomic_compare_exchange
3541 ; -O1-LABEL: atomicrmw_nand_i16_unaligned_acquire:
3542 ; -O1:    and w8, w0, w20
3543 ; -O1:    mvn w8, w8
3544 ; -O1:    bl __atomic_compare_exchange
3545     %r = atomicrmw nand ptr %ptr, i16 %value acquire, align 1
3546     ret i16 %r
3549 define dso_local i16 @atomicrmw_nand_i16_unaligned_release(ptr %ptr, i16 %value) {
3550 ; -O0-LABEL: atomicrmw_nand_i16_unaligned_release:
3551 ; -O0:    and w8, w9, w8
3552 ; -O0:    mvn w8, w8
3553 ; -O0:    bl __atomic_compare_exchange
3555 ; -O1-LABEL: atomicrmw_nand_i16_unaligned_release:
3556 ; -O1:    and w8, w0, w20
3557 ; -O1:    mvn w8, w8
3558 ; -O1:    bl __atomic_compare_exchange
3559     %r = atomicrmw nand ptr %ptr, i16 %value release, align 1
3560     ret i16 %r
3563 define dso_local i16 @atomicrmw_nand_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
3564 ; -O0-LABEL: atomicrmw_nand_i16_unaligned_acq_rel:
3565 ; -O0:    and w8, w9, w8
3566 ; -O0:    mvn w8, w8
3567 ; -O0:    bl __atomic_compare_exchange
3569 ; -O1-LABEL: atomicrmw_nand_i16_unaligned_acq_rel:
3570 ; -O1:    and w8, w0, w20
3571 ; -O1:    mvn w8, w8
3572 ; -O1:    bl __atomic_compare_exchange
3573     %r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 1
3574     ret i16 %r
3577 define dso_local i16 @atomicrmw_nand_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
3578 ; -O0-LABEL: atomicrmw_nand_i16_unaligned_seq_cst:
3579 ; -O0:    and w8, w9, w8
3580 ; -O0:    mvn w8, w8
3581 ; -O0:    bl __atomic_compare_exchange
3583 ; -O1-LABEL: atomicrmw_nand_i16_unaligned_seq_cst:
3584 ; -O1:    and w8, w0, w20
3585 ; -O1:    mvn w8, w8
3586 ; -O1:    bl __atomic_compare_exchange
3587     %r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 1
3588     ret i16 %r
3591 define dso_local i32 @atomicrmw_nand_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
3592 ; -O0-LABEL: atomicrmw_nand_i32_unaligned_monotonic:
3593 ; -O0:    and w8, w9, w8
3594 ; -O0:    mvn w8, w8
3595 ; -O0:    bl __atomic_compare_exchange
3597 ; -O1-LABEL: atomicrmw_nand_i32_unaligned_monotonic:
3598 ; -O1:    and w8, w0, w20
3599 ; -O1:    mvn w8, w8
3600 ; -O1:    bl __atomic_compare_exchange
3601     %r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 1
3602     ret i32 %r
3605 define dso_local i32 @atomicrmw_nand_i32_unaligned_acquire(ptr %ptr, i32 %value) {
3606 ; -O0-LABEL: atomicrmw_nand_i32_unaligned_acquire:
3607 ; -O0:    and w8, w9, w8
3608 ; -O0:    mvn w8, w8
3609 ; -O0:    bl __atomic_compare_exchange
3611 ; -O1-LABEL: atomicrmw_nand_i32_unaligned_acquire:
3612 ; -O1:    and w8, w0, w20
3613 ; -O1:    mvn w8, w8
3614 ; -O1:    bl __atomic_compare_exchange
3615     %r = atomicrmw nand ptr %ptr, i32 %value acquire, align 1
3616     ret i32 %r
3619 define dso_local i32 @atomicrmw_nand_i32_unaligned_release(ptr %ptr, i32 %value) {
3620 ; -O0-LABEL: atomicrmw_nand_i32_unaligned_release:
3621 ; -O0:    and w8, w9, w8
3622 ; -O0:    mvn w8, w8
3623 ; -O0:    bl __atomic_compare_exchange
3625 ; -O1-LABEL: atomicrmw_nand_i32_unaligned_release:
3626 ; -O1:    and w8, w0, w20
3627 ; -O1:    mvn w8, w8
3628 ; -O1:    bl __atomic_compare_exchange
3629     %r = atomicrmw nand ptr %ptr, i32 %value release, align 1
3630     ret i32 %r
3633 define dso_local i32 @atomicrmw_nand_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
3634 ; -O0-LABEL: atomicrmw_nand_i32_unaligned_acq_rel:
3635 ; -O0:    and w8, w9, w8
3636 ; -O0:    mvn w8, w8
3637 ; -O0:    bl __atomic_compare_exchange
3639 ; -O1-LABEL: atomicrmw_nand_i32_unaligned_acq_rel:
3640 ; -O1:    and w8, w0, w20
3641 ; -O1:    mvn w8, w8
3642 ; -O1:    bl __atomic_compare_exchange
3643     %r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 1
3644     ret i32 %r
3647 define dso_local i32 @atomicrmw_nand_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
3648 ; -O0-LABEL: atomicrmw_nand_i32_unaligned_seq_cst:
3649 ; -O0:    and w8, w9, w8
3650 ; -O0:    mvn w8, w8
3651 ; -O0:    bl __atomic_compare_exchange
3653 ; -O1-LABEL: atomicrmw_nand_i32_unaligned_seq_cst:
3654 ; -O1:    and w8, w0, w20
3655 ; -O1:    mvn w8, w8
3656 ; -O1:    bl __atomic_compare_exchange
3657     %r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 1
3658     ret i32 %r
3661 define dso_local i64 @atomicrmw_nand_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
3662 ; -O0-LABEL: atomicrmw_nand_i64_unaligned_monotonic:
3663 ; -O0:    and x8, x9, x8
3664 ; -O0:    mvn x8, x8
3665 ; -O0:    bl __atomic_compare_exchange
3667 ; -O1-LABEL: atomicrmw_nand_i64_unaligned_monotonic:
3668 ; -O1:    and x8, x0, x20
3669 ; -O1:    mvn x8, x8
3670 ; -O1:    bl __atomic_compare_exchange
3671     %r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 1
3672     ret i64 %r
3675 define dso_local i64 @atomicrmw_nand_i64_unaligned_acquire(ptr %ptr, i64 %value) {
3676 ; -O0-LABEL: atomicrmw_nand_i64_unaligned_acquire:
3677 ; -O0:    and x8, x9, x8
3678 ; -O0:    mvn x8, x8
3679 ; -O0:    bl __atomic_compare_exchange
3681 ; -O1-LABEL: atomicrmw_nand_i64_unaligned_acquire:
3682 ; -O1:    and x8, x0, x20
3683 ; -O1:    mvn x8, x8
3684 ; -O1:    bl __atomic_compare_exchange
3685     %r = atomicrmw nand ptr %ptr, i64 %value acquire, align 1
3686     ret i64 %r
3689 define dso_local i64 @atomicrmw_nand_i64_unaligned_release(ptr %ptr, i64 %value) {
3690 ; -O0-LABEL: atomicrmw_nand_i64_unaligned_release:
3691 ; -O0:    and x8, x9, x8
3692 ; -O0:    mvn x8, x8
3693 ; -O0:    bl __atomic_compare_exchange
3695 ; -O1-LABEL: atomicrmw_nand_i64_unaligned_release:
3696 ; -O1:    and x8, x0, x20
3697 ; -O1:    mvn x8, x8
3698 ; -O1:    bl __atomic_compare_exchange
3699     %r = atomicrmw nand ptr %ptr, i64 %value release, align 1
3700     ret i64 %r
3703 define dso_local i64 @atomicrmw_nand_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
3704 ; -O0-LABEL: atomicrmw_nand_i64_unaligned_acq_rel:
3705 ; -O0:    and x8, x9, x8
3706 ; -O0:    mvn x8, x8
3707 ; -O0:    bl __atomic_compare_exchange
3709 ; -O1-LABEL: atomicrmw_nand_i64_unaligned_acq_rel:
3710 ; -O1:    and x8, x0, x20
3711 ; -O1:    mvn x8, x8
3712 ; -O1:    bl __atomic_compare_exchange
3713     %r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 1
3714     ret i64 %r
3717 define dso_local i64 @atomicrmw_nand_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
3718 ; -O0-LABEL: atomicrmw_nand_i64_unaligned_seq_cst:
3719 ; -O0:    and x8, x9, x8
3720 ; -O0:    mvn x8, x8
3721 ; -O0:    bl __atomic_compare_exchange
3723 ; -O1-LABEL: atomicrmw_nand_i64_unaligned_seq_cst:
3724 ; -O1:    and x8, x0, x20
3725 ; -O1:    mvn x8, x8
3726 ; -O1:    bl __atomic_compare_exchange
3727     %r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 1
3728     ret i64 %r
3731 define dso_local i128 @atomicrmw_nand_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
3732 ; -O0-LABEL: atomicrmw_nand_i128_unaligned_monotonic:
3733 ; -O0:    and x9, x11, x9
3734 ; -O0:    and x8, x10, x8
3735 ; -O0:    mvn x8, x8
3736 ; -O0:    mvn x9, x9
3737 ; -O0:    bl __atomic_compare_exchange
3739 ; -O1-LABEL: atomicrmw_nand_i128_unaligned_monotonic:
3740 ; -O1:    ldp x0, x1, [x0]
3741 ; -O1:    and x8, x1, x19
3742 ; -O1:    and x9, x0, x21
3743 ; -O1:    mvn x8, x8
3744 ; -O1:    mvn x9, x9
3745 ; -O1:    bl __atomic_compare_exchange
3746     %r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 1
3747     ret i128 %r
3750 define dso_local i128 @atomicrmw_nand_i128_unaligned_acquire(ptr %ptr, i128 %value) {
3751 ; -O0-LABEL: atomicrmw_nand_i128_unaligned_acquire:
3752 ; -O0:    and x9, x11, x9
3753 ; -O0:    and x8, x10, x8
3754 ; -O0:    mvn x8, x8
3755 ; -O0:    mvn x9, x9
3756 ; -O0:    bl __atomic_compare_exchange
3758 ; -O1-LABEL: atomicrmw_nand_i128_unaligned_acquire:
3759 ; -O1:    ldp x0, x1, [x0]
3760 ; -O1:    and x8, x1, x19
3761 ; -O1:    and x9, x0, x21
3762 ; -O1:    mvn x8, x8
3763 ; -O1:    mvn x9, x9
3764 ; -O1:    bl __atomic_compare_exchange
3765     %r = atomicrmw nand ptr %ptr, i128 %value acquire, align 1
3766     ret i128 %r
3769 define dso_local i128 @atomicrmw_nand_i128_unaligned_release(ptr %ptr, i128 %value) {
3770 ; -O0-LABEL: atomicrmw_nand_i128_unaligned_release:
3771 ; -O0:    and x9, x11, x9
3772 ; -O0:    and x8, x10, x8
3773 ; -O0:    mvn x8, x8
3774 ; -O0:    mvn x9, x9
3775 ; -O0:    bl __atomic_compare_exchange
3777 ; -O1-LABEL: atomicrmw_nand_i128_unaligned_release:
3778 ; -O1:    ldp x0, x1, [x0]
3779 ; -O1:    and x8, x1, x19
3780 ; -O1:    and x9, x0, x21
3781 ; -O1:    mvn x8, x8
3782 ; -O1:    mvn x9, x9
3783 ; -O1:    bl __atomic_compare_exchange
3784     %r = atomicrmw nand ptr %ptr, i128 %value release, align 1
3785     ret i128 %r
3788 define dso_local i128 @atomicrmw_nand_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
3789 ; -O0-LABEL: atomicrmw_nand_i128_unaligned_acq_rel:
3790 ; -O0:    and x9, x11, x9
3791 ; -O0:    and x8, x10, x8
3792 ; -O0:    mvn x8, x8
3793 ; -O0:    mvn x9, x9
3794 ; -O0:    bl __atomic_compare_exchange
3796 ; -O1-LABEL: atomicrmw_nand_i128_unaligned_acq_rel:
3797 ; -O1:    ldp x0, x1, [x0]
3798 ; -O1:    and x8, x1, x19
3799 ; -O1:    and x9, x0, x21
3800 ; -O1:    mvn x8, x8
3801 ; -O1:    mvn x9, x9
3802 ; -O1:    bl __atomic_compare_exchange
3803     %r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 1
3804     ret i128 %r
3807 define dso_local i128 @atomicrmw_nand_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
3808 ; -O0-LABEL: atomicrmw_nand_i128_unaligned_seq_cst:
3809 ; -O0:    and x9, x11, x9
3810 ; -O0:    and x8, x10, x8
3811 ; -O0:    mvn x8, x8
3812 ; -O0:    mvn x9, x9
3813 ; -O0:    bl __atomic_compare_exchange
3815 ; -O1-LABEL: atomicrmw_nand_i128_unaligned_seq_cst:
3816 ; -O1:    ldp x0, x1, [x0]
3817 ; -O1:    and x8, x1, x19
3818 ; -O1:    and x9, x0, x21
3819 ; -O1:    mvn x8, x8
3820 ; -O1:    mvn x9, x9
3821 ; -O1:    bl __atomic_compare_exchange
3822     %r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 1
3823     ret i128 %r
3826 define dso_local i8 @atomicrmw_or_i8_aligned_monotonic(ptr %ptr, i8 %value) {
3827 ; -O0-LABEL: atomicrmw_or_i8_aligned_monotonic:
3828 ; -O0:    orr w12, w9, w8
3829 ; -O0:    ldaxrb w8, [x11]
3830 ; -O0:    cmp w8, w9, uxtb
3831 ; -O0:    stlxrb w10, w12, [x11]
3832 ; -O0:    subs w9, w8, w9, uxtb
3833 ; -O0:    subs w9, w9, #1
3835 ; -O1-LABEL: atomicrmw_or_i8_aligned_monotonic:
3836 ; -O1:    ldxrb w8, [x0]
3837 ; -O1:    orr w9, w8, w1
3838 ; -O1:    stxrb w10, w9, [x0]
3839     %r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1
3840     ret i8 %r
3843 define dso_local i8 @atomicrmw_or_i8_aligned_acquire(ptr %ptr, i8 %value) {
3844 ; -O0-LABEL: atomicrmw_or_i8_aligned_acquire:
3845 ; -O0:    orr w12, w9, w8
3846 ; -O0:    ldaxrb w8, [x11]
3847 ; -O0:    cmp w8, w9, uxtb
3848 ; -O0:    stlxrb w10, w12, [x11]
3849 ; -O0:    subs w9, w8, w9, uxtb
3850 ; -O0:    subs w9, w9, #1
3852 ; -O1-LABEL: atomicrmw_or_i8_aligned_acquire:
3853 ; -O1:    ldaxrb w8, [x0]
3854 ; -O1:    orr w9, w8, w1
3855 ; -O1:    stxrb w10, w9, [x0]
3856     %r = atomicrmw or ptr %ptr, i8 %value acquire, align 1
3857     ret i8 %r
3860 define dso_local i8 @atomicrmw_or_i8_aligned_release(ptr %ptr, i8 %value) {
3861 ; -O0-LABEL: atomicrmw_or_i8_aligned_release:
3862 ; -O0:    orr w12, w9, w8
3863 ; -O0:    ldaxrb w8, [x11]
3864 ; -O0:    cmp w8, w9, uxtb
3865 ; -O0:    stlxrb w10, w12, [x11]
3866 ; -O0:    subs w9, w8, w9, uxtb
3867 ; -O0:    subs w9, w9, #1
3869 ; -O1-LABEL: atomicrmw_or_i8_aligned_release:
3870 ; -O1:    ldxrb w8, [x0]
3871 ; -O1:    orr w9, w8, w1
3872 ; -O1:    stlxrb w10, w9, [x0]
3873     %r = atomicrmw or ptr %ptr, i8 %value release, align 1
3874     ret i8 %r
3877 define dso_local i8 @atomicrmw_or_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
3878 ; -O0-LABEL: atomicrmw_or_i8_aligned_acq_rel:
3879 ; -O0:    orr w12, w9, w8
3880 ; -O0:    ldaxrb w8, [x11]
3881 ; -O0:    cmp w8, w9, uxtb
3882 ; -O0:    stlxrb w10, w12, [x11]
3883 ; -O0:    subs w9, w8, w9, uxtb
3884 ; -O0:    subs w9, w9, #1
3886 ; -O1-LABEL: atomicrmw_or_i8_aligned_acq_rel:
3887 ; -O1:    ldaxrb w8, [x0]
3888 ; -O1:    orr w9, w8, w1
3889 ; -O1:    stlxrb w10, w9, [x0]
3890     %r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1
3891     ret i8 %r
3894 define dso_local i8 @atomicrmw_or_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
3895 ; -O0-LABEL: atomicrmw_or_i8_aligned_seq_cst:
3896 ; -O0:    orr w12, w9, w8
3897 ; -O0:    ldaxrb w8, [x11]
3898 ; -O0:    cmp w8, w9, uxtb
3899 ; -O0:    stlxrb w10, w12, [x11]
3900 ; -O0:    subs w9, w8, w9, uxtb
3901 ; -O0:    subs w9, w9, #1
3903 ; -O1-LABEL: atomicrmw_or_i8_aligned_seq_cst:
3904 ; -O1:    ldaxrb w8, [x0]
3905 ; -O1:    orr w9, w8, w1
3906 ; -O1:    stlxrb w10, w9, [x0]
3907     %r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1
3908     ret i8 %r
3911 define dso_local i16 @atomicrmw_or_i16_aligned_monotonic(ptr %ptr, i16 %value) {
3912 ; -O0-LABEL: atomicrmw_or_i16_aligned_monotonic:
3913 ; -O0:    orr w12, w9, w8
3914 ; -O0:    ldaxrh w8, [x11]
3915 ; -O0:    cmp w8, w9, uxth
3916 ; -O0:    stlxrh w10, w12, [x11]
3917 ; -O0:    subs w9, w8, w9, uxth
3918 ; -O0:    subs w9, w9, #1
3920 ; -O1-LABEL: atomicrmw_or_i16_aligned_monotonic:
3921 ; -O1:    ldxrh w8, [x0]
3922 ; -O1:    orr w9, w8, w1
3923 ; -O1:    stxrh w10, w9, [x0]
3924     %r = atomicrmw or ptr %ptr, i16 %value monotonic, align 2
3925     ret i16 %r
3928 define dso_local i16 @atomicrmw_or_i16_aligned_acquire(ptr %ptr, i16 %value) {
3929 ; -O0-LABEL: atomicrmw_or_i16_aligned_acquire:
3930 ; -O0:    orr w12, w9, w8
3931 ; -O0:    ldaxrh w8, [x11]
3932 ; -O0:    cmp w8, w9, uxth
3933 ; -O0:    stlxrh w10, w12, [x11]
3934 ; -O0:    subs w9, w8, w9, uxth
3935 ; -O0:    subs w9, w9, #1
3937 ; -O1-LABEL: atomicrmw_or_i16_aligned_acquire:
3938 ; -O1:    ldaxrh w8, [x0]
3939 ; -O1:    orr w9, w8, w1
3940 ; -O1:    stxrh w10, w9, [x0]
3941     %r = atomicrmw or ptr %ptr, i16 %value acquire, align 2
3942     ret i16 %r
3945 define dso_local i16 @atomicrmw_or_i16_aligned_release(ptr %ptr, i16 %value) {
3946 ; -O0-LABEL: atomicrmw_or_i16_aligned_release:
3947 ; -O0:    orr w12, w9, w8
3948 ; -O0:    ldaxrh w8, [x11]
3949 ; -O0:    cmp w8, w9, uxth
3950 ; -O0:    stlxrh w10, w12, [x11]
3951 ; -O0:    subs w9, w8, w9, uxth
3952 ; -O0:    subs w9, w9, #1
3954 ; -O1-LABEL: atomicrmw_or_i16_aligned_release:
3955 ; -O1:    ldxrh w8, [x0]
3956 ; -O1:    orr w9, w8, w1
3957 ; -O1:    stlxrh w10, w9, [x0]
3958     %r = atomicrmw or ptr %ptr, i16 %value release, align 2
3959     ret i16 %r
3962 define dso_local i16 @atomicrmw_or_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
3963 ; -O0-LABEL: atomicrmw_or_i16_aligned_acq_rel:
3964 ; -O0:    orr w12, w9, w8
3965 ; -O0:    ldaxrh w8, [x11]
3966 ; -O0:    cmp w8, w9, uxth
3967 ; -O0:    stlxrh w10, w12, [x11]
3968 ; -O0:    subs w9, w8, w9, uxth
3969 ; -O0:    subs w9, w9, #1
3971 ; -O1-LABEL: atomicrmw_or_i16_aligned_acq_rel:
3972 ; -O1:    ldaxrh w8, [x0]
3973 ; -O1:    orr w9, w8, w1
3974 ; -O1:    stlxrh w10, w9, [x0]
3975     %r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 2
3976     ret i16 %r
3979 define dso_local i16 @atomicrmw_or_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
3980 ; -O0-LABEL: atomicrmw_or_i16_aligned_seq_cst:
3981 ; -O0:    orr w12, w9, w8
3982 ; -O0:    ldaxrh w8, [x11]
3983 ; -O0:    cmp w8, w9, uxth
3984 ; -O0:    stlxrh w10, w12, [x11]
3985 ; -O0:    subs w9, w8, w9, uxth
3986 ; -O0:    subs w9, w9, #1
3988 ; -O1-LABEL: atomicrmw_or_i16_aligned_seq_cst:
3989 ; -O1:    ldaxrh w8, [x0]
3990 ; -O1:    orr w9, w8, w1
3991 ; -O1:    stlxrh w10, w9, [x0]
3992     %r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 2
3993     ret i16 %r
3996 define dso_local i32 @atomicrmw_or_i32_aligned_monotonic(ptr %ptr, i32 %value) {
3997 ; -O0-LABEL: atomicrmw_or_i32_aligned_monotonic:
3998 ; -O0:    orr w12, w9, w8
3999 ; -O0:    ldaxr w8, [x11]
4000 ; -O0:    cmp w8, w9
4001 ; -O0:    stlxr w10, w12, [x11]
4002 ; -O0:    subs w9, w8, w9
4003 ; -O0:    subs w9, w9, #1
4005 ; -O1-LABEL: atomicrmw_or_i32_aligned_monotonic:
4006 ; -O1:    ldxr w8, [x0]
4007 ; -O1:    orr w9, w8, w1
4008 ; -O1:    stxr w10, w9, [x0]
4009     %r = atomicrmw or ptr %ptr, i32 %value monotonic, align 4
4010     ret i32 %r
4013 define dso_local i32 @atomicrmw_or_i32_aligned_acquire(ptr %ptr, i32 %value) {
4014 ; -O0-LABEL: atomicrmw_or_i32_aligned_acquire:
4015 ; -O0:    orr w12, w9, w8
4016 ; -O0:    ldaxr w8, [x11]
4017 ; -O0:    cmp w8, w9
4018 ; -O0:    stlxr w10, w12, [x11]
4019 ; -O0:    subs w9, w8, w9
4020 ; -O0:    subs w9, w9, #1
4022 ; -O1-LABEL: atomicrmw_or_i32_aligned_acquire:
4023 ; -O1:    ldaxr w8, [x0]
4024 ; -O1:    orr w9, w8, w1
4025 ; -O1:    stxr w10, w9, [x0]
4026     %r = atomicrmw or ptr %ptr, i32 %value acquire, align 4
4027     ret i32 %r
4030 define dso_local i32 @atomicrmw_or_i32_aligned_release(ptr %ptr, i32 %value) {
4031 ; -O0-LABEL: atomicrmw_or_i32_aligned_release:
4032 ; -O0:    orr w12, w9, w8
4033 ; -O0:    ldaxr w8, [x11]
4034 ; -O0:    cmp w8, w9
4035 ; -O0:    stlxr w10, w12, [x11]
4036 ; -O0:    subs w9, w8, w9
4037 ; -O0:    subs w9, w9, #1
4039 ; -O1-LABEL: atomicrmw_or_i32_aligned_release:
4040 ; -O1:    ldxr w8, [x0]
4041 ; -O1:    orr w9, w8, w1
4042 ; -O1:    stlxr w10, w9, [x0]
4043     %r = atomicrmw or ptr %ptr, i32 %value release, align 4
4044     ret i32 %r
4047 define dso_local i32 @atomicrmw_or_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
4048 ; -O0-LABEL: atomicrmw_or_i32_aligned_acq_rel:
4049 ; -O0:    orr w12, w9, w8
4050 ; -O0:    ldaxr w8, [x11]
4051 ; -O0:    cmp w8, w9
4052 ; -O0:    stlxr w10, w12, [x11]
4053 ; -O0:    subs w9, w8, w9
4054 ; -O0:    subs w9, w9, #1
4056 ; -O1-LABEL: atomicrmw_or_i32_aligned_acq_rel:
4057 ; -O1:    ldaxr w8, [x0]
4058 ; -O1:    orr w9, w8, w1
4059 ; -O1:    stlxr w10, w9, [x0]
4060     %r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 4
4061     ret i32 %r
4064 define dso_local i32 @atomicrmw_or_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
4065 ; -O0-LABEL: atomicrmw_or_i32_aligned_seq_cst:
4066 ; -O0:    orr w12, w9, w8
4067 ; -O0:    ldaxr w8, [x11]
4068 ; -O0:    cmp w8, w9
4069 ; -O0:    stlxr w10, w12, [x11]
4070 ; -O0:    subs w9, w8, w9
4071 ; -O0:    subs w9, w9, #1
4073 ; -O1-LABEL: atomicrmw_or_i32_aligned_seq_cst:
4074 ; -O1:    ldaxr w8, [x0]
4075 ; -O1:    orr w9, w8, w1
4076 ; -O1:    stlxr w10, w9, [x0]
4077     %r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 4
4078     ret i32 %r
4081 define dso_local i64 @atomicrmw_or_i64_aligned_monotonic(ptr %ptr, i64 %value) {
4082 ; -O0-LABEL: atomicrmw_or_i64_aligned_monotonic:
4083 ; -O0:    orr x12, x9, x8
4084 ; -O0:    ldaxr x8, [x11]
4085 ; -O0:    cmp x8, x9
4086 ; -O0:    stlxr w10, x12, [x11]
4087 ; -O0:    subs x9, x8, x9
4088 ; -O0:    subs w9, w9, #1
4090 ; -O1-LABEL: atomicrmw_or_i64_aligned_monotonic:
4091 ; -O1:    ldxr x0, [x8]
4092 ; -O1:    orr x9, x0, x1
4093 ; -O1:    stxr w10, x9, [x8]
4094     %r = atomicrmw or ptr %ptr, i64 %value monotonic, align 8
4095     ret i64 %r
4098 define dso_local i64 @atomicrmw_or_i64_aligned_acquire(ptr %ptr, i64 %value) {
4099 ; -O0-LABEL: atomicrmw_or_i64_aligned_acquire:
4100 ; -O0:    orr x12, x9, x8
4101 ; -O0:    ldaxr x8, [x11]
4102 ; -O0:    cmp x8, x9
4103 ; -O0:    stlxr w10, x12, [x11]
4104 ; -O0:    subs x9, x8, x9
4105 ; -O0:    subs w9, w9, #1
4107 ; -O1-LABEL: atomicrmw_or_i64_aligned_acquire:
4108 ; -O1:    ldaxr x0, [x8]
4109 ; -O1:    orr x9, x0, x1
4110 ; -O1:    stxr w10, x9, [x8]
4111     %r = atomicrmw or ptr %ptr, i64 %value acquire, align 8
4112     ret i64 %r
4115 define dso_local i64 @atomicrmw_or_i64_aligned_release(ptr %ptr, i64 %value) {
4116 ; -O0-LABEL: atomicrmw_or_i64_aligned_release:
4117 ; -O0:    orr x12, x9, x8
4118 ; -O0:    ldaxr x8, [x11]
4119 ; -O0:    cmp x8, x9
4120 ; -O0:    stlxr w10, x12, [x11]
4121 ; -O0:    subs x9, x8, x9
4122 ; -O0:    subs w9, w9, #1
4124 ; -O1-LABEL: atomicrmw_or_i64_aligned_release:
4125 ; -O1:    ldxr x0, [x8]
4126 ; -O1:    orr x9, x0, x1
4127 ; -O1:    stlxr w10, x9, [x8]
4128     %r = atomicrmw or ptr %ptr, i64 %value release, align 8
4129     ret i64 %r
4132 define dso_local i64 @atomicrmw_or_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
4133 ; -O0-LABEL: atomicrmw_or_i64_aligned_acq_rel:
4134 ; -O0:    orr x12, x9, x8
4135 ; -O0:    ldaxr x8, [x11]
4136 ; -O0:    cmp x8, x9
4137 ; -O0:    stlxr w10, x12, [x11]
4138 ; -O0:    subs x9, x8, x9
4139 ; -O0:    subs w9, w9, #1
4141 ; -O1-LABEL: atomicrmw_or_i64_aligned_acq_rel:
4142 ; -O1:    ldaxr x0, [x8]
4143 ; -O1:    orr x9, x0, x1
4144 ; -O1:    stlxr w10, x9, [x8]
4145     %r = atomicrmw or ptr %ptr, i64 %value acq_rel, align 8
4146     ret i64 %r
4149 define dso_local i64 @atomicrmw_or_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
4150 ; -O0-LABEL: atomicrmw_or_i64_aligned_seq_cst:
4151 ; -O0:    orr x12, x9, x8
4152 ; -O0:    ldaxr x8, [x11]
4153 ; -O0:    cmp x8, x9
4154 ; -O0:    stlxr w10, x12, [x11]
4155 ; -O0:    subs x9, x8, x9
4156 ; -O0:    subs w9, w9, #1
4158 ; -O1-LABEL: atomicrmw_or_i64_aligned_seq_cst:
4159 ; -O1:    ldaxr x0, [x8]
4160 ; -O1:    orr x9, x0, x1
4161 ; -O1:    stlxr w10, x9, [x8]
4162     %r = atomicrmw or ptr %ptr, i64 %value seq_cst, align 8
4163     ret i64 %r
4166 define dso_local i128 @atomicrmw_or_i128_aligned_monotonic(ptr %ptr, i128 %value) {
4167 ; -O0-LABEL: atomicrmw_or_i128_aligned_monotonic:
4168 ; -O0:    orr x15, x13, x10
4169 ; -O0:    orr x14, x11, x8
4170 ; -O0:    ldxp x10, x12, [x9]
4171 ; -O0:    cmp x10, x11
4172 ; -O0:    cmp x12, x13
4173 ; -O0:    stxp w8, x14, x15, [x9]
4174 ; -O0:    stxp w8, x10, x12, [x9]
4175 ; -O0:    subs x12, x12, x13
4176 ; -O0:    ccmp x10, x11, #0, eq
4178 ; -O1-LABEL: atomicrmw_or_i128_aligned_monotonic:
4179 ; -O1:    ldxp x1, x0, [x8]
4180 ; -O1:    orr x9, x0, x2
4181 ; -O1:    orr x10, x1, x3
4182 ; -O1:    stxp w11, x10, x9, [x8]
4183     %r = atomicrmw or ptr %ptr, i128 %value monotonic, align 16
4184     ret i128 %r
4187 define dso_local i128 @atomicrmw_or_i128_aligned_acquire(ptr %ptr, i128 %value) {
4188 ; -O0-LABEL: atomicrmw_or_i128_aligned_acquire:
4189 ; -O0:    orr x15, x13, x10
4190 ; -O0:    orr x14, x11, x8
4191 ; -O0:    ldaxp x10, x12, [x9]
4192 ; -O0:    cmp x10, x11
4193 ; -O0:    cmp x12, x13
4194 ; -O0:    stxp w8, x14, x15, [x9]
4195 ; -O0:    stxp w8, x10, x12, [x9]
4196 ; -O0:    subs x12, x12, x13
4197 ; -O0:    ccmp x10, x11, #0, eq
4199 ; -O1-LABEL: atomicrmw_or_i128_aligned_acquire:
4200 ; -O1:    ldaxp x1, x0, [x8]
4201 ; -O1:    orr x9, x0, x2
4202 ; -O1:    orr x10, x1, x3
4203 ; -O1:    stxp w11, x10, x9, [x8]
4204     %r = atomicrmw or ptr %ptr, i128 %value acquire, align 16
4205     ret i128 %r
4208 define dso_local i128 @atomicrmw_or_i128_aligned_release(ptr %ptr, i128 %value) {
4209 ; -O0-LABEL: atomicrmw_or_i128_aligned_release:
4210 ; -O0:    orr x15, x13, x10
4211 ; -O0:    orr x14, x11, x8
4212 ; -O0:    ldxp x10, x12, [x9]
4213 ; -O0:    cmp x10, x11
4214 ; -O0:    cmp x12, x13
4215 ; -O0:    stlxp w8, x14, x15, [x9]
4216 ; -O0:    stlxp w8, x10, x12, [x9]
4217 ; -O0:    subs x12, x12, x13
4218 ; -O0:    ccmp x10, x11, #0, eq
4220 ; -O1-LABEL: atomicrmw_or_i128_aligned_release:
4221 ; -O1:    ldxp x1, x0, [x8]
4222 ; -O1:    orr x9, x0, x2
4223 ; -O1:    orr x10, x1, x3
4224 ; -O1:    stlxp w11, x10, x9, [x8]
4225     %r = atomicrmw or ptr %ptr, i128 %value release, align 16
4226     ret i128 %r
4229 define dso_local i128 @atomicrmw_or_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
4230 ; -O0-LABEL: atomicrmw_or_i128_aligned_acq_rel:
4231 ; -O0:    orr x15, x13, x10
4232 ; -O0:    orr x14, x11, x8
4233 ; -O0:    ldaxp x10, x12, [x9]
4234 ; -O0:    cmp x10, x11
4235 ; -O0:    cmp x12, x13
4236 ; -O0:    stlxp w8, x14, x15, [x9]
4237 ; -O0:    stlxp w8, x10, x12, [x9]
4238 ; -O0:    subs x12, x12, x13
4239 ; -O0:    ccmp x10, x11, #0, eq
4241 ; -O1-LABEL: atomicrmw_or_i128_aligned_acq_rel:
4242 ; -O1:    ldaxp x1, x0, [x8]
4243 ; -O1:    orr x9, x0, x2
4244 ; -O1:    orr x10, x1, x3
4245 ; -O1:    stlxp w11, x10, x9, [x8]
4246     %r = atomicrmw or ptr %ptr, i128 %value acq_rel, align 16
4247     ret i128 %r
4250 define dso_local i128 @atomicrmw_or_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
4251 ; -O0-LABEL: atomicrmw_or_i128_aligned_seq_cst:
4252 ; -O0:    orr x15, x13, x10
4253 ; -O0:    orr x14, x11, x8
4254 ; -O0:    ldaxp x10, x12, [x9]
4255 ; -O0:    cmp x10, x11
4256 ; -O0:    cmp x12, x13
4257 ; -O0:    stlxp w8, x14, x15, [x9]
4258 ; -O0:    stlxp w8, x10, x12, [x9]
4259 ; -O0:    subs x12, x12, x13
4260 ; -O0:    ccmp x10, x11, #0, eq
4262 ; -O1-LABEL: atomicrmw_or_i128_aligned_seq_cst:
4263 ; -O1:    ldaxp x1, x0, [x8]
4264 ; -O1:    orr x9, x0, x2
4265 ; -O1:    orr x10, x1, x3
4266 ; -O1:    stlxp w11, x10, x9, [x8]
4267     %r = atomicrmw or ptr %ptr, i128 %value seq_cst, align 16
4268     ret i128 %r
4271 define dso_local i8 @atomicrmw_or_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
4272 ; -O0-LABEL: atomicrmw_or_i8_unaligned_monotonic:
4273 ; -O0:    orr w12, w9, w8
4274 ; -O0:    ldaxrb w8, [x11]
4275 ; -O0:    cmp w8, w9, uxtb
4276 ; -O0:    stlxrb w10, w12, [x11]
4277 ; -O0:    subs w9, w8, w9, uxtb
4278 ; -O0:    subs w9, w9, #1
4280 ; -O1-LABEL: atomicrmw_or_i8_unaligned_monotonic:
4281 ; -O1:    ldxrb w8, [x0]
4282 ; -O1:    orr w9, w8, w1
4283 ; -O1:    stxrb w10, w9, [x0]
4284     %r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1
4285     ret i8 %r
4288 define dso_local i8 @atomicrmw_or_i8_unaligned_acquire(ptr %ptr, i8 %value) {
4289 ; -O0-LABEL: atomicrmw_or_i8_unaligned_acquire:
4290 ; -O0:    orr w12, w9, w8
4291 ; -O0:    ldaxrb w8, [x11]
4292 ; -O0:    cmp w8, w9, uxtb
4293 ; -O0:    stlxrb w10, w12, [x11]
4294 ; -O0:    subs w9, w8, w9, uxtb
4295 ; -O0:    subs w9, w9, #1
4297 ; -O1-LABEL: atomicrmw_or_i8_unaligned_acquire:
4298 ; -O1:    ldaxrb w8, [x0]
4299 ; -O1:    orr w9, w8, w1
4300 ; -O1:    stxrb w10, w9, [x0]
4301     %r = atomicrmw or ptr %ptr, i8 %value acquire, align 1
4302     ret i8 %r
4305 define dso_local i8 @atomicrmw_or_i8_unaligned_release(ptr %ptr, i8 %value) {
4306 ; -O0-LABEL: atomicrmw_or_i8_unaligned_release:
4307 ; -O0:    orr w12, w9, w8
4308 ; -O0:    ldaxrb w8, [x11]
4309 ; -O0:    cmp w8, w9, uxtb
4310 ; -O0:    stlxrb w10, w12, [x11]
4311 ; -O0:    subs w9, w8, w9, uxtb
4312 ; -O0:    subs w9, w9, #1
4314 ; -O1-LABEL: atomicrmw_or_i8_unaligned_release:
4315 ; -O1:    ldxrb w8, [x0]
4316 ; -O1:    orr w9, w8, w1
4317 ; -O1:    stlxrb w10, w9, [x0]
4318     %r = atomicrmw or ptr %ptr, i8 %value release, align 1
4319     ret i8 %r
4322 define dso_local i8 @atomicrmw_or_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
4323 ; -O0-LABEL: atomicrmw_or_i8_unaligned_acq_rel:
4324 ; -O0:    orr w12, w9, w8
4325 ; -O0:    ldaxrb w8, [x11]
4326 ; -O0:    cmp w8, w9, uxtb
4327 ; -O0:    stlxrb w10, w12, [x11]
4328 ; -O0:    subs w9, w8, w9, uxtb
4329 ; -O0:    subs w9, w9, #1
4331 ; -O1-LABEL: atomicrmw_or_i8_unaligned_acq_rel:
4332 ; -O1:    ldaxrb w8, [x0]
4333 ; -O1:    orr w9, w8, w1
4334 ; -O1:    stlxrb w10, w9, [x0]
4335     %r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1
4336     ret i8 %r
4339 define dso_local i8 @atomicrmw_or_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
4340 ; -O0-LABEL: atomicrmw_or_i8_unaligned_seq_cst:
4341 ; -O0:    orr w12, w9, w8
4342 ; -O0:    ldaxrb w8, [x11]
4343 ; -O0:    cmp w8, w9, uxtb
4344 ; -O0:    stlxrb w10, w12, [x11]
4345 ; -O0:    subs w9, w8, w9, uxtb
4346 ; -O0:    subs w9, w9, #1
4348 ; -O1-LABEL: atomicrmw_or_i8_unaligned_seq_cst:
4349 ; -O1:    ldaxrb w8, [x0]
4350 ; -O1:    orr w9, w8, w1
4351 ; -O1:    stlxrb w10, w9, [x0]
4352     %r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1
4353     ret i8 %r
4356 define dso_local i16 @atomicrmw_or_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
4357 ; -O0-LABEL: atomicrmw_or_i16_unaligned_monotonic:
4358 ; -O0:    orr w8, w9, w8
4359 ; -O0:    bl __atomic_compare_exchange
4361 ; -O1-LABEL: atomicrmw_or_i16_unaligned_monotonic:
4362 ; -O1:    orr w8, w0, w20
4363 ; -O1:    bl __atomic_compare_exchange
4364     %r = atomicrmw or ptr %ptr, i16 %value monotonic, align 1
4365     ret i16 %r
4368 define dso_local i16 @atomicrmw_or_i16_unaligned_acquire(ptr %ptr, i16 %value) {
4369 ; -O0-LABEL: atomicrmw_or_i16_unaligned_acquire:
4370 ; -O0:    orr w8, w9, w8
4371 ; -O0:    bl __atomic_compare_exchange
4373 ; -O1-LABEL: atomicrmw_or_i16_unaligned_acquire:
4374 ; -O1:    orr w8, w0, w20
4375 ; -O1:    bl __atomic_compare_exchange
4376     %r = atomicrmw or ptr %ptr, i16 %value acquire, align 1
4377     ret i16 %r
4380 define dso_local i16 @atomicrmw_or_i16_unaligned_release(ptr %ptr, i16 %value) {
4381 ; -O0-LABEL: atomicrmw_or_i16_unaligned_release:
4382 ; -O0:    orr w8, w9, w8
4383 ; -O0:    bl __atomic_compare_exchange
4385 ; -O1-LABEL: atomicrmw_or_i16_unaligned_release:
4386 ; -O1:    orr w8, w0, w20
4387 ; -O1:    bl __atomic_compare_exchange
4388     %r = atomicrmw or ptr %ptr, i16 %value release, align 1
4389     ret i16 %r
4392 define dso_local i16 @atomicrmw_or_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
4393 ; -O0-LABEL: atomicrmw_or_i16_unaligned_acq_rel:
4394 ; -O0:    orr w8, w9, w8
4395 ; -O0:    bl __atomic_compare_exchange
4397 ; -O1-LABEL: atomicrmw_or_i16_unaligned_acq_rel:
4398 ; -O1:    orr w8, w0, w20
4399 ; -O1:    bl __atomic_compare_exchange
4400     %r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 1
4401     ret i16 %r
4404 define dso_local i16 @atomicrmw_or_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
4405 ; -O0-LABEL: atomicrmw_or_i16_unaligned_seq_cst:
4406 ; -O0:    orr w8, w9, w8
4407 ; -O0:    bl __atomic_compare_exchange
4409 ; -O1-LABEL: atomicrmw_or_i16_unaligned_seq_cst:
4410 ; -O1:    orr w8, w0, w20
4411 ; -O1:    bl __atomic_compare_exchange
4412     %r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 1
4413     ret i16 %r
4416 define dso_local i32 @atomicrmw_or_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
4417 ; -O0-LABEL: atomicrmw_or_i32_unaligned_monotonic:
4418 ; -O0:    orr w8, w9, w8
4419 ; -O0:    bl __atomic_compare_exchange
4421 ; -O1-LABEL: atomicrmw_or_i32_unaligned_monotonic:
4422 ; -O1:    orr w8, w0, w20
4423 ; -O1:    bl __atomic_compare_exchange
4424     %r = atomicrmw or ptr %ptr, i32 %value monotonic, align 1
4425     ret i32 %r
4428 define dso_local i32 @atomicrmw_or_i32_unaligned_acquire(ptr %ptr, i32 %value) {
4429 ; -O0-LABEL: atomicrmw_or_i32_unaligned_acquire:
4430 ; -O0:    orr w8, w9, w8
4431 ; -O0:    bl __atomic_compare_exchange
4433 ; -O1-LABEL: atomicrmw_or_i32_unaligned_acquire:
4434 ; -O1:    orr w8, w0, w20
4435 ; -O1:    bl __atomic_compare_exchange
4436     %r = atomicrmw or ptr %ptr, i32 %value acquire, align 1
4437     ret i32 %r
4440 define dso_local i32 @atomicrmw_or_i32_unaligned_release(ptr %ptr, i32 %value) {
4441 ; -O0-LABEL: atomicrmw_or_i32_unaligned_release:
4442 ; -O0:    orr w8, w9, w8
4443 ; -O0:    bl __atomic_compare_exchange
4445 ; -O1-LABEL: atomicrmw_or_i32_unaligned_release:
4446 ; -O1:    orr w8, w0, w20
4447 ; -O1:    bl __atomic_compare_exchange
4448     %r = atomicrmw or ptr %ptr, i32 %value release, align 1
4449     ret i32 %r
4452 define dso_local i32 @atomicrmw_or_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
4453 ; -O0-LABEL: atomicrmw_or_i32_unaligned_acq_rel:
4454 ; -O0:    orr w8, w9, w8
4455 ; -O0:    bl __atomic_compare_exchange
4457 ; -O1-LABEL: atomicrmw_or_i32_unaligned_acq_rel:
4458 ; -O1:    orr w8, w0, w20
4459 ; -O1:    bl __atomic_compare_exchange
4460     %r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 1
4461     ret i32 %r
4464 define dso_local i32 @atomicrmw_or_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
4465 ; -O0-LABEL: atomicrmw_or_i32_unaligned_seq_cst:
4466 ; -O0:    orr w8, w9, w8
4467 ; -O0:    bl __atomic_compare_exchange
4469 ; -O1-LABEL: atomicrmw_or_i32_unaligned_seq_cst:
4470 ; -O1:    orr w8, w0, w20
4471 ; -O1:    bl __atomic_compare_exchange
4472     %r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 1
4473     ret i32 %r
4476 define dso_local i64 @atomicrmw_or_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
4477 ; -O0-LABEL: atomicrmw_or_i64_unaligned_monotonic:
4478 ; -O0:    orr x8, x9, x8
4479 ; -O0:    bl __atomic_compare_exchange
4481 ; -O1-LABEL: atomicrmw_or_i64_unaligned_monotonic:
4482 ; -O1:    orr x8, x0, x20
4483 ; -O1:    bl __atomic_compare_exchange
4484     %r = atomicrmw or ptr %ptr, i64 %value monotonic, align 1
4485     ret i64 %r
4488 define dso_local i64 @atomicrmw_or_i64_unaligned_acquire(ptr %ptr, i64 %value) {
4489 ; -O0-LABEL: atomicrmw_or_i64_unaligned_acquire:
4490 ; -O0:    orr x8, x9, x8
4491 ; -O0:    bl __atomic_compare_exchange
4493 ; -O1-LABEL: atomicrmw_or_i64_unaligned_acquire:
4494 ; -O1:    orr x8, x0, x20
4495 ; -O1:    bl __atomic_compare_exchange
4496     %r = atomicrmw or ptr %ptr, i64 %value acquire, align 1
4497     ret i64 %r
4500 define dso_local i64 @atomicrmw_or_i64_unaligned_release(ptr %ptr, i64 %value) {
4501 ; -O0-LABEL: atomicrmw_or_i64_unaligned_release:
4502 ; -O0:    orr x8, x9, x8
4503 ; -O0:    bl __atomic_compare_exchange
4505 ; -O1-LABEL: atomicrmw_or_i64_unaligned_release:
4506 ; -O1:    orr x8, x0, x20
4507 ; -O1:    bl __atomic_compare_exchange
4508     %r = atomicrmw or ptr %ptr, i64 %value release, align 1
4509     ret i64 %r
4512 define dso_local i64 @atomicrmw_or_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
4513 ; -O0-LABEL: atomicrmw_or_i64_unaligned_acq_rel:
4514 ; -O0:    orr x8, x9, x8
4515 ; -O0:    bl __atomic_compare_exchange
4517 ; -O1-LABEL: atomicrmw_or_i64_unaligned_acq_rel:
4518 ; -O1:    orr x8, x0, x20
4519 ; -O1:    bl __atomic_compare_exchange
4520     %r = atomicrmw or ptr %ptr, i64 %value acq_rel, align 1
4521     ret i64 %r
4524 define dso_local i64 @atomicrmw_or_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
4525 ; -O0-LABEL: atomicrmw_or_i64_unaligned_seq_cst:
4526 ; -O0:    orr x8, x9, x8
4527 ; -O0:    bl __atomic_compare_exchange
4529 ; -O1-LABEL: atomicrmw_or_i64_unaligned_seq_cst:
4530 ; -O1:    orr x8, x0, x20
4531 ; -O1:    bl __atomic_compare_exchange
4532     %r = atomicrmw or ptr %ptr, i64 %value seq_cst, align 1
4533     ret i64 %r
4536 define dso_local i128 @atomicrmw_or_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
4537 ; -O0-LABEL: atomicrmw_or_i128_unaligned_monotonic:
4538 ; -O0:    orr x8, x11, x8
4539 ; -O0:    orr x9, x10, x9
4540 ; -O0:    bl __atomic_compare_exchange
4542 ; -O1-LABEL: atomicrmw_or_i128_unaligned_monotonic:
4543 ; -O1:    ldp x0, x1, [x0]
4544 ; -O1:    orr x8, x1, x19
4545 ; -O1:    orr x9, x0, x21
4546 ; -O1:    bl __atomic_compare_exchange
4547     %r = atomicrmw or ptr %ptr, i128 %value monotonic, align 1
4548     ret i128 %r
4551 define dso_local i128 @atomicrmw_or_i128_unaligned_acquire(ptr %ptr, i128 %value) {
4552 ; -O0-LABEL: atomicrmw_or_i128_unaligned_acquire:
4553 ; -O0:    orr x8, x11, x8
4554 ; -O0:    orr x9, x10, x9
4555 ; -O0:    bl __atomic_compare_exchange
4557 ; -O1-LABEL: atomicrmw_or_i128_unaligned_acquire:
4558 ; -O1:    ldp x0, x1, [x0]
4559 ; -O1:    orr x8, x1, x19
4560 ; -O1:    orr x9, x0, x21
4561 ; -O1:    bl __atomic_compare_exchange
4562     %r = atomicrmw or ptr %ptr, i128 %value acquire, align 1
4563     ret i128 %r
4566 define dso_local i128 @atomicrmw_or_i128_unaligned_release(ptr %ptr, i128 %value) {
4567 ; -O0-LABEL: atomicrmw_or_i128_unaligned_release:
4568 ; -O0:    orr x8, x11, x8
4569 ; -O0:    orr x9, x10, x9
4570 ; -O0:    bl __atomic_compare_exchange
4572 ; -O1-LABEL: atomicrmw_or_i128_unaligned_release:
4573 ; -O1:    ldp x0, x1, [x0]
4574 ; -O1:    orr x8, x1, x19
4575 ; -O1:    orr x9, x0, x21
4576 ; -O1:    bl __atomic_compare_exchange
4577     %r = atomicrmw or ptr %ptr, i128 %value release, align 1
4578     ret i128 %r
4581 define dso_local i128 @atomicrmw_or_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
4582 ; -O0-LABEL: atomicrmw_or_i128_unaligned_acq_rel:
4583 ; -O0:    orr x8, x11, x8
4584 ; -O0:    orr x9, x10, x9
4585 ; -O0:    bl __atomic_compare_exchange
4587 ; -O1-LABEL: atomicrmw_or_i128_unaligned_acq_rel:
4588 ; -O1:    ldp x0, x1, [x0]
4589 ; -O1:    orr x8, x1, x19
4590 ; -O1:    orr x9, x0, x21
4591 ; -O1:    bl __atomic_compare_exchange
4592     %r = atomicrmw or ptr %ptr, i128 %value acq_rel, align 1
4593     ret i128 %r
4596 define dso_local i128 @atomicrmw_or_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
4597 ; -O0-LABEL: atomicrmw_or_i128_unaligned_seq_cst:
4598 ; -O0:    orr x8, x11, x8
4599 ; -O0:    orr x9, x10, x9
4600 ; -O0:    bl __atomic_compare_exchange
4602 ; -O1-LABEL: atomicrmw_or_i128_unaligned_seq_cst:
4603 ; -O1:    ldp x0, x1, [x0]
4604 ; -O1:    orr x8, x1, x19
4605 ; -O1:    orr x9, x0, x21
4606 ; -O1:    bl __atomic_compare_exchange
4607     %r = atomicrmw or ptr %ptr, i128 %value seq_cst, align 1
4608     ret i128 %r
4611 define dso_local i8 @atomicrmw_xor_i8_aligned_monotonic(ptr %ptr, i8 %value) {
4612 ; -O0-LABEL: atomicrmw_xor_i8_aligned_monotonic:
4613 ; -O0:    eor w12, w9, w8
4614 ; -O0:    ldaxrb w8, [x11]
4615 ; -O0:    cmp w8, w9, uxtb
4616 ; -O0:    stlxrb w10, w12, [x11]
4617 ; -O0:    subs w9, w8, w9, uxtb
4618 ; -O0:    subs w9, w9, #1
4620 ; -O1-LABEL: atomicrmw_xor_i8_aligned_monotonic:
4621 ; -O1:    ldxrb w8, [x0]
4622 ; -O1:    eor w9, w8, w1
4623 ; -O1:    stxrb w10, w9, [x0]
4624     %r = atomicrmw xor ptr %ptr, i8 %value monotonic, align 1
4625     ret i8 %r
4628 define dso_local i8 @atomicrmw_xor_i8_aligned_acquire(ptr %ptr, i8 %value) {
4629 ; -O0-LABEL: atomicrmw_xor_i8_aligned_acquire:
4630 ; -O0:    eor w12, w9, w8
4631 ; -O0:    ldaxrb w8, [x11]
4632 ; -O0:    cmp w8, w9, uxtb
4633 ; -O0:    stlxrb w10, w12, [x11]
4634 ; -O0:    subs w9, w8, w9, uxtb
4635 ; -O0:    subs w9, w9, #1
4637 ; -O1-LABEL: atomicrmw_xor_i8_aligned_acquire:
4638 ; -O1:    ldaxrb w8, [x0]
4639 ; -O1:    eor w9, w8, w1
4640 ; -O1:    stxrb w10, w9, [x0]
4641     %r = atomicrmw xor ptr %ptr, i8 %value acquire, align 1
4642     ret i8 %r
4645 define dso_local i8 @atomicrmw_xor_i8_aligned_release(ptr %ptr, i8 %value) {
4646 ; -O0-LABEL: atomicrmw_xor_i8_aligned_release:
4647 ; -O0:    eor w12, w9, w8
4648 ; -O0:    ldaxrb w8, [x11]
4649 ; -O0:    cmp w8, w9, uxtb
4650 ; -O0:    stlxrb w10, w12, [x11]
4651 ; -O0:    subs w9, w8, w9, uxtb
4652 ; -O0:    subs w9, w9, #1
4654 ; -O1-LABEL: atomicrmw_xor_i8_aligned_release:
4655 ; -O1:    ldxrb w8, [x0]
4656 ; -O1:    eor w9, w8, w1
4657 ; -O1:    stlxrb w10, w9, [x0]
4658     %r = atomicrmw xor ptr %ptr, i8 %value release, align 1
4659     ret i8 %r
4662 define dso_local i8 @atomicrmw_xor_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
4663 ; -O0-LABEL: atomicrmw_xor_i8_aligned_acq_rel:
4664 ; -O0:    eor w12, w9, w8
4665 ; -O0:    ldaxrb w8, [x11]
4666 ; -O0:    cmp w8, w9, uxtb
4667 ; -O0:    stlxrb w10, w12, [x11]
4668 ; -O0:    subs w9, w8, w9, uxtb
4669 ; -O0:    subs w9, w9, #1
4671 ; -O1-LABEL: atomicrmw_xor_i8_aligned_acq_rel:
4672 ; -O1:    ldaxrb w8, [x0]
4673 ; -O1:    eor w9, w8, w1
4674 ; -O1:    stlxrb w10, w9, [x0]
4675     %r = atomicrmw xor ptr %ptr, i8 %value acq_rel, align 1
4676     ret i8 %r
4679 define dso_local i8 @atomicrmw_xor_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
4680 ; -O0-LABEL: atomicrmw_xor_i8_aligned_seq_cst:
4681 ; -O0:    eor w12, w9, w8
4682 ; -O0:    ldaxrb w8, [x11]
4683 ; -O0:    cmp w8, w9, uxtb
4684 ; -O0:    stlxrb w10, w12, [x11]
4685 ; -O0:    subs w9, w8, w9, uxtb
4686 ; -O0:    subs w9, w9, #1
4688 ; -O1-LABEL: atomicrmw_xor_i8_aligned_seq_cst:
4689 ; -O1:    ldaxrb w8, [x0]
4690 ; -O1:    eor w9, w8, w1
4691 ; -O1:    stlxrb w10, w9, [x0]
4692     %r = atomicrmw xor ptr %ptr, i8 %value seq_cst, align 1
4693     ret i8 %r
4696 define dso_local i16 @atomicrmw_xor_i16_aligned_monotonic(ptr %ptr, i16 %value) {
4697 ; -O0-LABEL: atomicrmw_xor_i16_aligned_monotonic:
4698 ; -O0:    eor w12, w9, w8
4699 ; -O0:    ldaxrh w8, [x11]
4700 ; -O0:    cmp w8, w9, uxth
4701 ; -O0:    stlxrh w10, w12, [x11]
4702 ; -O0:    subs w9, w8, w9, uxth
4703 ; -O0:    subs w9, w9, #1
4705 ; -O1-LABEL: atomicrmw_xor_i16_aligned_monotonic:
4706 ; -O1:    ldxrh w8, [x0]
4707 ; -O1:    eor w9, w8, w1
4708 ; -O1:    stxrh w10, w9, [x0]
4709     %r = atomicrmw xor ptr %ptr, i16 %value monotonic, align 2
4710     ret i16 %r
4713 define dso_local i16 @atomicrmw_xor_i16_aligned_acquire(ptr %ptr, i16 %value) {
4714 ; -O0-LABEL: atomicrmw_xor_i16_aligned_acquire:
4715 ; -O0:    eor w12, w9, w8
4716 ; -O0:    ldaxrh w8, [x11]
4717 ; -O0:    cmp w8, w9, uxth
4718 ; -O0:    stlxrh w10, w12, [x11]
4719 ; -O0:    subs w9, w8, w9, uxth
4720 ; -O0:    subs w9, w9, #1
4722 ; -O1-LABEL: atomicrmw_xor_i16_aligned_acquire:
4723 ; -O1:    ldaxrh w8, [x0]
4724 ; -O1:    eor w9, w8, w1
4725 ; -O1:    stxrh w10, w9, [x0]
4726     %r = atomicrmw xor ptr %ptr, i16 %value acquire, align 2
4727     ret i16 %r
4730 define dso_local i16 @atomicrmw_xor_i16_aligned_release(ptr %ptr, i16 %value) {
4731 ; -O0-LABEL: atomicrmw_xor_i16_aligned_release:
4732 ; -O0:    eor w12, w9, w8
4733 ; -O0:    ldaxrh w8, [x11]
4734 ; -O0:    cmp w8, w9, uxth
4735 ; -O0:    stlxrh w10, w12, [x11]
4736 ; -O0:    subs w9, w8, w9, uxth
4737 ; -O0:    subs w9, w9, #1
4739 ; -O1-LABEL: atomicrmw_xor_i16_aligned_release:
4740 ; -O1:    ldxrh w8, [x0]
4741 ; -O1:    eor w9, w8, w1
4742 ; -O1:    stlxrh w10, w9, [x0]
4743     %r = atomicrmw xor ptr %ptr, i16 %value release, align 2
4744     ret i16 %r
4747 define dso_local i16 @atomicrmw_xor_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
4748 ; -O0-LABEL: atomicrmw_xor_i16_aligned_acq_rel:
4749 ; -O0:    eor w12, w9, w8
4750 ; -O0:    ldaxrh w8, [x11]
4751 ; -O0:    cmp w8, w9, uxth
4752 ; -O0:    stlxrh w10, w12, [x11]
4753 ; -O0:    subs w9, w8, w9, uxth
4754 ; -O0:    subs w9, w9, #1
4756 ; -O1-LABEL: atomicrmw_xor_i16_aligned_acq_rel:
4757 ; -O1:    ldaxrh w8, [x0]
4758 ; -O1:    eor w9, w8, w1
4759 ; -O1:    stlxrh w10, w9, [x0]
4760     %r = atomicrmw xor ptr %ptr, i16 %value acq_rel, align 2
4761     ret i16 %r
4764 define dso_local i16 @atomicrmw_xor_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
4765 ; -O0-LABEL: atomicrmw_xor_i16_aligned_seq_cst:
4766 ; -O0:    eor w12, w9, w8
4767 ; -O0:    ldaxrh w8, [x11]
4768 ; -O0:    cmp w8, w9, uxth
4769 ; -O0:    stlxrh w10, w12, [x11]
4770 ; -O0:    subs w9, w8, w9, uxth
4771 ; -O0:    subs w9, w9, #1
4773 ; -O1-LABEL: atomicrmw_xor_i16_aligned_seq_cst:
4774 ; -O1:    ldaxrh w8, [x0]
4775 ; -O1:    eor w9, w8, w1
4776 ; -O1:    stlxrh w10, w9, [x0]
4777     %r = atomicrmw xor ptr %ptr, i16 %value seq_cst, align 2
4778     ret i16 %r
4781 define dso_local i32 @atomicrmw_xor_i32_aligned_monotonic(ptr %ptr, i32 %value) {
4782 ; -O0-LABEL: atomicrmw_xor_i32_aligned_monotonic:
4783 ; -O0:    eor w12, w9, w8
4784 ; -O0:    ldaxr w8, [x11]
4785 ; -O0:    cmp w8, w9
4786 ; -O0:    stlxr w10, w12, [x11]
4787 ; -O0:    subs w9, w8, w9
4788 ; -O0:    subs w9, w9, #1
4790 ; -O1-LABEL: atomicrmw_xor_i32_aligned_monotonic:
4791 ; -O1:    ldxr w8, [x0]
4792 ; -O1:    eor w9, w8, w1
4793 ; -O1:    stxr w10, w9, [x0]
4794     %r = atomicrmw xor ptr %ptr, i32 %value monotonic, align 4
4795     ret i32 %r
4798 define dso_local i32 @atomicrmw_xor_i32_aligned_acquire(ptr %ptr, i32 %value) {
4799 ; -O0-LABEL: atomicrmw_xor_i32_aligned_acquire:
4800 ; -O0:    eor w12, w9, w8
4801 ; -O0:    ldaxr w8, [x11]
4802 ; -O0:    cmp w8, w9
4803 ; -O0:    stlxr w10, w12, [x11]
4804 ; -O0:    subs w9, w8, w9
4805 ; -O0:    subs w9, w9, #1
4807 ; -O1-LABEL: atomicrmw_xor_i32_aligned_acquire:
4808 ; -O1:    ldaxr w8, [x0]
4809 ; -O1:    eor w9, w8, w1
4810 ; -O1:    stxr w10, w9, [x0]
4811     %r = atomicrmw xor ptr %ptr, i32 %value acquire, align 4
4812     ret i32 %r
4815 define dso_local i32 @atomicrmw_xor_i32_aligned_release(ptr %ptr, i32 %value) {
4816 ; -O0-LABEL: atomicrmw_xor_i32_aligned_release:
4817 ; -O0:    eor w12, w9, w8
4818 ; -O0:    ldaxr w8, [x11]
4819 ; -O0:    cmp w8, w9
4820 ; -O0:    stlxr w10, w12, [x11]
4821 ; -O0:    subs w9, w8, w9
4822 ; -O0:    subs w9, w9, #1
4824 ; -O1-LABEL: atomicrmw_xor_i32_aligned_release:
4825 ; -O1:    ldxr w8, [x0]
4826 ; -O1:    eor w9, w8, w1
4827 ; -O1:    stlxr w10, w9, [x0]
4828     %r = atomicrmw xor ptr %ptr, i32 %value release, align 4
4829     ret i32 %r
4832 define dso_local i32 @atomicrmw_xor_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
4833 ; -O0-LABEL: atomicrmw_xor_i32_aligned_acq_rel:
4834 ; -O0:    eor w12, w9, w8
4835 ; -O0:    ldaxr w8, [x11]
4836 ; -O0:    cmp w8, w9
4837 ; -O0:    stlxr w10, w12, [x11]
4838 ; -O0:    subs w9, w8, w9
4839 ; -O0:    subs w9, w9, #1
4841 ; -O1-LABEL: atomicrmw_xor_i32_aligned_acq_rel:
4842 ; -O1:    ldaxr w8, [x0]
4843 ; -O1:    eor w9, w8, w1
4844 ; -O1:    stlxr w10, w9, [x0]
4845     %r = atomicrmw xor ptr %ptr, i32 %value acq_rel, align 4
4846     ret i32 %r
4849 define dso_local i32 @atomicrmw_xor_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
4850 ; -O0-LABEL: atomicrmw_xor_i32_aligned_seq_cst:
4851 ; -O0:    eor w12, w9, w8
4852 ; -O0:    ldaxr w8, [x11]
4853 ; -O0:    cmp w8, w9
4854 ; -O0:    stlxr w10, w12, [x11]
4855 ; -O0:    subs w9, w8, w9
4856 ; -O0:    subs w9, w9, #1
4858 ; -O1-LABEL: atomicrmw_xor_i32_aligned_seq_cst:
4859 ; -O1:    ldaxr w8, [x0]
4860 ; -O1:    eor w9, w8, w1
4861 ; -O1:    stlxr w10, w9, [x0]
4862     %r = atomicrmw xor ptr %ptr, i32 %value seq_cst, align 4
4863     ret i32 %r
4866 define dso_local i64 @atomicrmw_xor_i64_aligned_monotonic(ptr %ptr, i64 %value) {
4867 ; -O0-LABEL: atomicrmw_xor_i64_aligned_monotonic:
4868 ; -O0:    eor x12, x9, x8
4869 ; -O0:    ldaxr x8, [x11]
4870 ; -O0:    cmp x8, x9
4871 ; -O0:    stlxr w10, x12, [x11]
4872 ; -O0:    subs x9, x8, x9
4873 ; -O0:    subs w9, w9, #1
4875 ; -O1-LABEL: atomicrmw_xor_i64_aligned_monotonic:
4876 ; -O1:    ldxr x0, [x8]
4877 ; -O1:    eor x9, x0, x1
4878 ; -O1:    stxr w10, x9, [x8]
4879     %r = atomicrmw xor ptr %ptr, i64 %value monotonic, align 8
4880     ret i64 %r
4883 define dso_local i64 @atomicrmw_xor_i64_aligned_acquire(ptr %ptr, i64 %value) {
4884 ; -O0-LABEL: atomicrmw_xor_i64_aligned_acquire:
4885 ; -O0:    eor x12, x9, x8
4886 ; -O0:    ldaxr x8, [x11]
4887 ; -O0:    cmp x8, x9
4888 ; -O0:    stlxr w10, x12, [x11]
4889 ; -O0:    subs x9, x8, x9
4890 ; -O0:    subs w9, w9, #1
4892 ; -O1-LABEL: atomicrmw_xor_i64_aligned_acquire:
4893 ; -O1:    ldaxr x0, [x8]
4894 ; -O1:    eor x9, x0, x1
4895 ; -O1:    stxr w10, x9, [x8]
4896     %r = atomicrmw xor ptr %ptr, i64 %value acquire, align 8
4897     ret i64 %r
4900 define dso_local i64 @atomicrmw_xor_i64_aligned_release(ptr %ptr, i64 %value) {
4901 ; -O0-LABEL: atomicrmw_xor_i64_aligned_release:
4902 ; -O0:    eor x12, x9, x8
4903 ; -O0:    ldaxr x8, [x11]
4904 ; -O0:    cmp x8, x9
4905 ; -O0:    stlxr w10, x12, [x11]
4906 ; -O0:    subs x9, x8, x9
4907 ; -O0:    subs w9, w9, #1
4909 ; -O1-LABEL: atomicrmw_xor_i64_aligned_release:
4910 ; -O1:    ldxr x0, [x8]
4911 ; -O1:    eor x9, x0, x1
4912 ; -O1:    stlxr w10, x9, [x8]
4913     %r = atomicrmw xor ptr %ptr, i64 %value release, align 8
4914     ret i64 %r
4917 define dso_local i64 @atomicrmw_xor_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
4918 ; -O0-LABEL: atomicrmw_xor_i64_aligned_acq_rel:
4919 ; -O0:    eor x12, x9, x8
4920 ; -O0:    ldaxr x8, [x11]
4921 ; -O0:    cmp x8, x9
4922 ; -O0:    stlxr w10, x12, [x11]
4923 ; -O0:    subs x9, x8, x9
4924 ; -O0:    subs w9, w9, #1
4926 ; -O1-LABEL: atomicrmw_xor_i64_aligned_acq_rel:
4927 ; -O1:    ldaxr x0, [x8]
4928 ; -O1:    eor x9, x0, x1
4929 ; -O1:    stlxr w10, x9, [x8]
4930     %r = atomicrmw xor ptr %ptr, i64 %value acq_rel, align 8
4931     ret i64 %r
4934 define dso_local i64 @atomicrmw_xor_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
4935 ; -O0-LABEL: atomicrmw_xor_i64_aligned_seq_cst:
4936 ; -O0:    eor x12, x9, x8
4937 ; -O0:    ldaxr x8, [x11]
4938 ; -O0:    cmp x8, x9
4939 ; -O0:    stlxr w10, x12, [x11]
4940 ; -O0:    subs x9, x8, x9
4941 ; -O0:    subs w9, w9, #1
4943 ; -O1-LABEL: atomicrmw_xor_i64_aligned_seq_cst:
4944 ; -O1:    ldaxr x0, [x8]
4945 ; -O1:    eor x9, x0, x1
4946 ; -O1:    stlxr w10, x9, [x8]
4947     %r = atomicrmw xor ptr %ptr, i64 %value seq_cst, align 8
4948     ret i64 %r
4951 define dso_local i128 @atomicrmw_xor_i128_aligned_monotonic(ptr %ptr, i128 %value) {
4952 ; -O0-LABEL: atomicrmw_xor_i128_aligned_monotonic:
4953 ; -O0:    eor x15, x13, x10
4954 ; -O0:    eor x14, x11, x8
4955 ; -O0:    ldxp x10, x12, [x9]
4956 ; -O0:    cmp x10, x11
4957 ; -O0:    cmp x12, x13
4958 ; -O0:    stxp w8, x14, x15, [x9]
4959 ; -O0:    stxp w8, x10, x12, [x9]
4960 ; -O0:    subs x12, x12, x13
4961 ; -O0:    ccmp x10, x11, #0, eq
4963 ; -O1-LABEL: atomicrmw_xor_i128_aligned_monotonic:
4964 ; -O1:    ldxp x1, x0, [x8]
4965 ; -O1:    eor x9, x0, x2
4966 ; -O1:    eor x10, x1, x3
4967 ; -O1:    stxp w11, x10, x9, [x8]
4968     %r = atomicrmw xor ptr %ptr, i128 %value monotonic, align 16
4969     ret i128 %r
4972 define dso_local i128 @atomicrmw_xor_i128_aligned_acquire(ptr %ptr, i128 %value) {
4973 ; -O0-LABEL: atomicrmw_xor_i128_aligned_acquire:
4974 ; -O0:    eor x15, x13, x10
4975 ; -O0:    eor x14, x11, x8
4976 ; -O0:    ldaxp x10, x12, [x9]
4977 ; -O0:    cmp x10, x11
4978 ; -O0:    cmp x12, x13
4979 ; -O0:    stxp w8, x14, x15, [x9]
4980 ; -O0:    stxp w8, x10, x12, [x9]
4981 ; -O0:    subs x12, x12, x13
4982 ; -O0:    ccmp x10, x11, #0, eq
4984 ; -O1-LABEL: atomicrmw_xor_i128_aligned_acquire:
4985 ; -O1:    ldaxp x1, x0, [x8]
4986 ; -O1:    eor x9, x0, x2
4987 ; -O1:    eor x10, x1, x3
4988 ; -O1:    stxp w11, x10, x9, [x8]
4989     %r = atomicrmw xor ptr %ptr, i128 %value acquire, align 16
4990     ret i128 %r
4993 define dso_local i128 @atomicrmw_xor_i128_aligned_release(ptr %ptr, i128 %value) {
4994 ; -O0-LABEL: atomicrmw_xor_i128_aligned_release:
4995 ; -O0:    eor x15, x13, x10
4996 ; -O0:    eor x14, x11, x8
4997 ; -O0:    ldxp x10, x12, [x9]
4998 ; -O0:    cmp x10, x11
4999 ; -O0:    cmp x12, x13
5000 ; -O0:    stlxp w8, x14, x15, [x9]
5001 ; -O0:    stlxp w8, x10, x12, [x9]
5002 ; -O0:    subs x12, x12, x13
5003 ; -O0:    ccmp x10, x11, #0, eq
5005 ; -O1-LABEL: atomicrmw_xor_i128_aligned_release:
5006 ; -O1:    ldxp x1, x0, [x8]
5007 ; -O1:    eor x9, x0, x2
5008 ; -O1:    eor x10, x1, x3
5009 ; -O1:    stlxp w11, x10, x9, [x8]
5010     %r = atomicrmw xor ptr %ptr, i128 %value release, align 16
5011     ret i128 %r
5014 define dso_local i128 @atomicrmw_xor_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
5015 ; -O0-LABEL: atomicrmw_xor_i128_aligned_acq_rel:
5016 ; -O0:    eor x15, x13, x10
5017 ; -O0:    eor x14, x11, x8
5018 ; -O0:    ldaxp x10, x12, [x9]
5019 ; -O0:    cmp x10, x11
5020 ; -O0:    cmp x12, x13
5021 ; -O0:    stlxp w8, x14, x15, [x9]
5022 ; -O0:    stlxp w8, x10, x12, [x9]
5023 ; -O0:    subs x12, x12, x13
5024 ; -O0:    ccmp x10, x11, #0, eq
5026 ; -O1-LABEL: atomicrmw_xor_i128_aligned_acq_rel:
5027 ; -O1:    ldaxp x1, x0, [x8]
5028 ; -O1:    eor x9, x0, x2
5029 ; -O1:    eor x10, x1, x3
5030 ; -O1:    stlxp w11, x10, x9, [x8]
5031     %r = atomicrmw xor ptr %ptr, i128 %value acq_rel, align 16
5032     ret i128 %r
5035 define dso_local i128 @atomicrmw_xor_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
5036 ; -O0-LABEL: atomicrmw_xor_i128_aligned_seq_cst:
5037 ; -O0:    eor x15, x13, x10
5038 ; -O0:    eor x14, x11, x8
5039 ; -O0:    ldaxp x10, x12, [x9]
5040 ; -O0:    cmp x10, x11
5041 ; -O0:    cmp x12, x13
5042 ; -O0:    stlxp w8, x14, x15, [x9]
5043 ; -O0:    stlxp w8, x10, x12, [x9]
5044 ; -O0:    subs x12, x12, x13
5045 ; -O0:    ccmp x10, x11, #0, eq
5047 ; -O1-LABEL: atomicrmw_xor_i128_aligned_seq_cst:
5048 ; -O1:    ldaxp x1, x0, [x8]
5049 ; -O1:    eor x9, x0, x2
5050 ; -O1:    eor x10, x1, x3
5051 ; -O1:    stlxp w11, x10, x9, [x8]
5052     %r = atomicrmw xor ptr %ptr, i128 %value seq_cst, align 16
5053     ret i128 %r
5056 define dso_local i8 @atomicrmw_xor_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
5057 ; -O0-LABEL: atomicrmw_xor_i8_unaligned_monotonic:
5058 ; -O0:    eor w12, w9, w8
5059 ; -O0:    ldaxrb w8, [x11]
5060 ; -O0:    cmp w8, w9, uxtb
5061 ; -O0:    stlxrb w10, w12, [x11]
5062 ; -O0:    subs w9, w8, w9, uxtb
5063 ; -O0:    subs w9, w9, #1
5065 ; -O1-LABEL: atomicrmw_xor_i8_unaligned_monotonic:
5066 ; -O1:    ldxrb w8, [x0]
5067 ; -O1:    eor w9, w8, w1
5068 ; -O1:    stxrb w10, w9, [x0]
5069     %r = atomicrmw xor ptr %ptr, i8 %value monotonic, align 1
5070     ret i8 %r
5073 define dso_local i8 @atomicrmw_xor_i8_unaligned_acquire(ptr %ptr, i8 %value) {
5074 ; -O0-LABEL: atomicrmw_xor_i8_unaligned_acquire:
5075 ; -O0:    eor w12, w9, w8
5076 ; -O0:    ldaxrb w8, [x11]
5077 ; -O0:    cmp w8, w9, uxtb
5078 ; -O0:    stlxrb w10, w12, [x11]
5079 ; -O0:    subs w9, w8, w9, uxtb
5080 ; -O0:    subs w9, w9, #1
5082 ; -O1-LABEL: atomicrmw_xor_i8_unaligned_acquire:
5083 ; -O1:    ldaxrb w8, [x0]
5084 ; -O1:    eor w9, w8, w1
5085 ; -O1:    stxrb w10, w9, [x0]
5086     %r = atomicrmw xor ptr %ptr, i8 %value acquire, align 1
5087     ret i8 %r
5090 define dso_local i8 @atomicrmw_xor_i8_unaligned_release(ptr %ptr, i8 %value) {
5091 ; -O0-LABEL: atomicrmw_xor_i8_unaligned_release:
5092 ; -O0:    eor w12, w9, w8
5093 ; -O0:    ldaxrb w8, [x11]
5094 ; -O0:    cmp w8, w9, uxtb
5095 ; -O0:    stlxrb w10, w12, [x11]
5096 ; -O0:    subs w9, w8, w9, uxtb
5097 ; -O0:    subs w9, w9, #1
5099 ; -O1-LABEL: atomicrmw_xor_i8_unaligned_release:
5100 ; -O1:    ldxrb w8, [x0]
5101 ; -O1:    eor w9, w8, w1
5102 ; -O1:    stlxrb w10, w9, [x0]
5103     %r = atomicrmw xor ptr %ptr, i8 %value release, align 1
5104     ret i8 %r
5107 define dso_local i8 @atomicrmw_xor_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
5108 ; -O0-LABEL: atomicrmw_xor_i8_unaligned_acq_rel:
5109 ; -O0:    eor w12, w9, w8
5110 ; -O0:    ldaxrb w8, [x11]
5111 ; -O0:    cmp w8, w9, uxtb
5112 ; -O0:    stlxrb w10, w12, [x11]
5113 ; -O0:    subs w9, w8, w9, uxtb
5114 ; -O0:    subs w9, w9, #1
5116 ; -O1-LABEL: atomicrmw_xor_i8_unaligned_acq_rel:
5117 ; -O1:    ldaxrb w8, [x0]
5118 ; -O1:    eor w9, w8, w1
5119 ; -O1:    stlxrb w10, w9, [x0]
5120     %r = atomicrmw xor ptr %ptr, i8 %value acq_rel, align 1
5121     ret i8 %r
5124 define dso_local i8 @atomicrmw_xor_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
5125 ; -O0-LABEL: atomicrmw_xor_i8_unaligned_seq_cst:
5126 ; -O0:    eor w12, w9, w8
5127 ; -O0:    ldaxrb w8, [x11]
5128 ; -O0:    cmp w8, w9, uxtb
5129 ; -O0:    stlxrb w10, w12, [x11]
5130 ; -O0:    subs w9, w8, w9, uxtb
5131 ; -O0:    subs w9, w9, #1
5133 ; -O1-LABEL: atomicrmw_xor_i8_unaligned_seq_cst:
5134 ; -O1:    ldaxrb w8, [x0]
5135 ; -O1:    eor w9, w8, w1
5136 ; -O1:    stlxrb w10, w9, [x0]
5137     %r = atomicrmw xor ptr %ptr, i8 %value seq_cst, align 1
5138     ret i8 %r
5141 define dso_local i16 @atomicrmw_xor_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
5142 ; -O0-LABEL: atomicrmw_xor_i16_unaligned_monotonic:
5143 ; -O0:    eor w8, w9, w8
5144 ; -O0:    bl __atomic_compare_exchange
5146 ; -O1-LABEL: atomicrmw_xor_i16_unaligned_monotonic:
5147 ; -O1:    eor w8, w0, w20
5148 ; -O1:    bl __atomic_compare_exchange
5149     %r = atomicrmw xor ptr %ptr, i16 %value monotonic, align 1
5150     ret i16 %r
5153 define dso_local i16 @atomicrmw_xor_i16_unaligned_acquire(ptr %ptr, i16 %value) {
5154 ; -O0-LABEL: atomicrmw_xor_i16_unaligned_acquire:
5155 ; -O0:    eor w8, w9, w8
5156 ; -O0:    bl __atomic_compare_exchange
5158 ; -O1-LABEL: atomicrmw_xor_i16_unaligned_acquire:
5159 ; -O1:    eor w8, w0, w20
5160 ; -O1:    bl __atomic_compare_exchange
5161     %r = atomicrmw xor ptr %ptr, i16 %value acquire, align 1
5162     ret i16 %r
5165 define dso_local i16 @atomicrmw_xor_i16_unaligned_release(ptr %ptr, i16 %value) {
5166 ; -O0-LABEL: atomicrmw_xor_i16_unaligned_release:
5167 ; -O0:    eor w8, w9, w8
5168 ; -O0:    bl __atomic_compare_exchange
5170 ; -O1-LABEL: atomicrmw_xor_i16_unaligned_release:
5171 ; -O1:    eor w8, w0, w20
5172 ; -O1:    bl __atomic_compare_exchange
5173     %r = atomicrmw xor ptr %ptr, i16 %value release, align 1
5174     ret i16 %r
5177 define dso_local i16 @atomicrmw_xor_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
5178 ; -O0-LABEL: atomicrmw_xor_i16_unaligned_acq_rel:
5179 ; -O0:    eor w8, w9, w8
5180 ; -O0:    bl __atomic_compare_exchange
5182 ; -O1-LABEL: atomicrmw_xor_i16_unaligned_acq_rel:
5183 ; -O1:    eor w8, w0, w20
5184 ; -O1:    bl __atomic_compare_exchange
5185     %r = atomicrmw xor ptr %ptr, i16 %value acq_rel, align 1
5186     ret i16 %r
5189 define dso_local i16 @atomicrmw_xor_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
5190 ; -O0-LABEL: atomicrmw_xor_i16_unaligned_seq_cst:
5191 ; -O0:    eor w8, w9, w8
5192 ; -O0:    bl __atomic_compare_exchange
5194 ; -O1-LABEL: atomicrmw_xor_i16_unaligned_seq_cst:
5195 ; -O1:    eor w8, w0, w20
5196 ; -O1:    bl __atomic_compare_exchange
5197     %r = atomicrmw xor ptr %ptr, i16 %value seq_cst, align 1
5198     ret i16 %r
5201 define dso_local i32 @atomicrmw_xor_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
5202 ; -O0-LABEL: atomicrmw_xor_i32_unaligned_monotonic:
5203 ; -O0:    eor w8, w9, w8
5204 ; -O0:    bl __atomic_compare_exchange
5206 ; -O1-LABEL: atomicrmw_xor_i32_unaligned_monotonic:
5207 ; -O1:    eor w8, w0, w20
5208 ; -O1:    bl __atomic_compare_exchange
5209     %r = atomicrmw xor ptr %ptr, i32 %value monotonic, align 1
5210     ret i32 %r
5213 define dso_local i32 @atomicrmw_xor_i32_unaligned_acquire(ptr %ptr, i32 %value) {
5214 ; -O0-LABEL: atomicrmw_xor_i32_unaligned_acquire:
5215 ; -O0:    eor w8, w9, w8
5216 ; -O0:    bl __atomic_compare_exchange
5218 ; -O1-LABEL: atomicrmw_xor_i32_unaligned_acquire:
5219 ; -O1:    eor w8, w0, w20
5220 ; -O1:    bl __atomic_compare_exchange
5221     %r = atomicrmw xor ptr %ptr, i32 %value acquire, align 1
5222     ret i32 %r
5225 define dso_local i32 @atomicrmw_xor_i32_unaligned_release(ptr %ptr, i32 %value) {
5226 ; -O0-LABEL: atomicrmw_xor_i32_unaligned_release:
5227 ; -O0:    eor w8, w9, w8
5228 ; -O0:    bl __atomic_compare_exchange
5230 ; -O1-LABEL: atomicrmw_xor_i32_unaligned_release:
5231 ; -O1:    eor w8, w0, w20
5232 ; -O1:    bl __atomic_compare_exchange
5233     %r = atomicrmw xor ptr %ptr, i32 %value release, align 1
5234     ret i32 %r
5237 define dso_local i32 @atomicrmw_xor_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
5238 ; -O0-LABEL: atomicrmw_xor_i32_unaligned_acq_rel:
5239 ; -O0:    eor w8, w9, w8
5240 ; -O0:    bl __atomic_compare_exchange
5242 ; -O1-LABEL: atomicrmw_xor_i32_unaligned_acq_rel:
5243 ; -O1:    eor w8, w0, w20
5244 ; -O1:    bl __atomic_compare_exchange
5245     %r = atomicrmw xor ptr %ptr, i32 %value acq_rel, align 1
5246     ret i32 %r
5249 define dso_local i32 @atomicrmw_xor_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
5250 ; -O0-LABEL: atomicrmw_xor_i32_unaligned_seq_cst:
5251 ; -O0:    eor w8, w9, w8
5252 ; -O0:    bl __atomic_compare_exchange
5254 ; -O1-LABEL: atomicrmw_xor_i32_unaligned_seq_cst:
5255 ; -O1:    eor w8, w0, w20
5256 ; -O1:    bl __atomic_compare_exchange
5257     %r = atomicrmw xor ptr %ptr, i32 %value seq_cst, align 1
5258     ret i32 %r
5261 define dso_local i64 @atomicrmw_xor_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
5262 ; -O0-LABEL: atomicrmw_xor_i64_unaligned_monotonic:
5263 ; -O0:    eor x8, x9, x8
5264 ; -O0:    bl __atomic_compare_exchange
5266 ; -O1-LABEL: atomicrmw_xor_i64_unaligned_monotonic:
5267 ; -O1:    eor x8, x0, x20
5268 ; -O1:    bl __atomic_compare_exchange
5269     %r = atomicrmw xor ptr %ptr, i64 %value monotonic, align 1
5270     ret i64 %r
5273 define dso_local i64 @atomicrmw_xor_i64_unaligned_acquire(ptr %ptr, i64 %value) {
5274 ; -O0-LABEL: atomicrmw_xor_i64_unaligned_acquire:
5275 ; -O0:    eor x8, x9, x8
5276 ; -O0:    bl __atomic_compare_exchange
5278 ; -O1-LABEL: atomicrmw_xor_i64_unaligned_acquire:
5279 ; -O1:    eor x8, x0, x20
5280 ; -O1:    bl __atomic_compare_exchange
5281     %r = atomicrmw xor ptr %ptr, i64 %value acquire, align 1
5282     ret i64 %r
5285 define dso_local i64 @atomicrmw_xor_i64_unaligned_release(ptr %ptr, i64 %value) {
5286 ; -O0-LABEL: atomicrmw_xor_i64_unaligned_release:
5287 ; -O0:    eor x8, x9, x8
5288 ; -O0:    bl __atomic_compare_exchange
5290 ; -O1-LABEL: atomicrmw_xor_i64_unaligned_release:
5291 ; -O1:    eor x8, x0, x20
5292 ; -O1:    bl __atomic_compare_exchange
5293     %r = atomicrmw xor ptr %ptr, i64 %value release, align 1
5294     ret i64 %r
5297 define dso_local i64 @atomicrmw_xor_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
5298 ; -O0-LABEL: atomicrmw_xor_i64_unaligned_acq_rel:
5299 ; -O0:    eor x8, x9, x8
5300 ; -O0:    bl __atomic_compare_exchange
5302 ; -O1-LABEL: atomicrmw_xor_i64_unaligned_acq_rel:
5303 ; -O1:    eor x8, x0, x20
5304 ; -O1:    bl __atomic_compare_exchange
5305     %r = atomicrmw xor ptr %ptr, i64 %value acq_rel, align 1
5306     ret i64 %r
5309 define dso_local i64 @atomicrmw_xor_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
5310 ; -O0-LABEL: atomicrmw_xor_i64_unaligned_seq_cst:
5311 ; -O0:    eor x8, x9, x8
5312 ; -O0:    bl __atomic_compare_exchange
5314 ; -O1-LABEL: atomicrmw_xor_i64_unaligned_seq_cst:
5315 ; -O1:    eor x8, x0, x20
5316 ; -O1:    bl __atomic_compare_exchange
5317     %r = atomicrmw xor ptr %ptr, i64 %value seq_cst, align 1
5318     ret i64 %r
5321 define dso_local i128 @atomicrmw_xor_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
5322 ; -O0-LABEL: atomicrmw_xor_i128_unaligned_monotonic:
5323 ; -O0:    eor x8, x11, x8
5324 ; -O0:    eor x9, x10, x9
5325 ; -O0:    bl __atomic_compare_exchange
5327 ; -O1-LABEL: atomicrmw_xor_i128_unaligned_monotonic:
5328 ; -O1:    ldp x0, x1, [x0]
5329 ; -O1:    eor x8, x1, x19
5330 ; -O1:    eor x9, x0, x21
5331 ; -O1:    bl __atomic_compare_exchange
5332     %r = atomicrmw xor ptr %ptr, i128 %value monotonic, align 1
5333     ret i128 %r
5336 define dso_local i128 @atomicrmw_xor_i128_unaligned_acquire(ptr %ptr, i128 %value) {
5337 ; -O0-LABEL: atomicrmw_xor_i128_unaligned_acquire:
5338 ; -O0:    eor x8, x11, x8
5339 ; -O0:    eor x9, x10, x9
5340 ; -O0:    bl __atomic_compare_exchange
5342 ; -O1-LABEL: atomicrmw_xor_i128_unaligned_acquire:
5343 ; -O1:    ldp x0, x1, [x0]
5344 ; -O1:    eor x8, x1, x19
5345 ; -O1:    eor x9, x0, x21
5346 ; -O1:    bl __atomic_compare_exchange
5347     %r = atomicrmw xor ptr %ptr, i128 %value acquire, align 1
5348     ret i128 %r
5351 define dso_local i128 @atomicrmw_xor_i128_unaligned_release(ptr %ptr, i128 %value) {
5352 ; -O0-LABEL: atomicrmw_xor_i128_unaligned_release:
5353 ; -O0:    eor x8, x11, x8
5354 ; -O0:    eor x9, x10, x9
5355 ; -O0:    bl __atomic_compare_exchange
5357 ; -O1-LABEL: atomicrmw_xor_i128_unaligned_release:
5358 ; -O1:    ldp x0, x1, [x0]
5359 ; -O1:    eor x8, x1, x19
5360 ; -O1:    eor x9, x0, x21
5361 ; -O1:    bl __atomic_compare_exchange
5362     %r = atomicrmw xor ptr %ptr, i128 %value release, align 1
5363     ret i128 %r
5366 define dso_local i128 @atomicrmw_xor_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
5367 ; -O0-LABEL: atomicrmw_xor_i128_unaligned_acq_rel:
5368 ; -O0:    eor x8, x11, x8
5369 ; -O0:    eor x9, x10, x9
5370 ; -O0:    bl __atomic_compare_exchange
5372 ; -O1-LABEL: atomicrmw_xor_i128_unaligned_acq_rel:
5373 ; -O1:    ldp x0, x1, [x0]
5374 ; -O1:    eor x8, x1, x19
5375 ; -O1:    eor x9, x0, x21
5376 ; -O1:    bl __atomic_compare_exchange
5377     %r = atomicrmw xor ptr %ptr, i128 %value acq_rel, align 1
5378     ret i128 %r
5381 define dso_local i128 @atomicrmw_xor_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
5382 ; -O0-LABEL: atomicrmw_xor_i128_unaligned_seq_cst:
5383 ; -O0:    eor x8, x11, x8
5384 ; -O0:    eor x9, x10, x9
5385 ; -O0:    bl __atomic_compare_exchange
5387 ; -O1-LABEL: atomicrmw_xor_i128_unaligned_seq_cst:
5388 ; -O1:    ldp x0, x1, [x0]
5389 ; -O1:    eor x8, x1, x19
5390 ; -O1:    eor x9, x0, x21
5391 ; -O1:    bl __atomic_compare_exchange
5392     %r = atomicrmw xor ptr %ptr, i128 %value seq_cst, align 1
5393     ret i128 %r
5396 define dso_local i8 @atomicrmw_max_i8_aligned_monotonic(ptr %ptr, i8 %value) {
5397 ; -O0-LABEL: atomicrmw_max_i8_aligned_monotonic:
5398 ; -O0:    sxtb w10, w9
5399 ; -O0:    subs w10, w10, w8, sxtb
5400 ; -O0:    csel w12, w9, w8, gt
5401 ; -O0:    ldaxrb w8, [x11]
5402 ; -O0:    cmp w8, w9, uxtb
5403 ; -O0:    stlxrb w10, w12, [x11]
5404 ; -O0:    subs w9, w8, w9, uxtb
5405 ; -O0:    subs w9, w9, #1
5407 ; -O1-LABEL: atomicrmw_max_i8_aligned_monotonic:
5408 ; -O1:    ldxrb w9, [x0]
5409 ; -O1:    sxtb w8, w9
5410 ; -O1:    cmp w8, w1, sxtb
5411 ; -O1:    csel w9, w9, w1, gt
5412 ; -O1:    stxrb w10, w9, [x0]
5413     %r = atomicrmw max ptr %ptr, i8 %value monotonic, align 1
5414     ret i8 %r
5417 define dso_local i8 @atomicrmw_max_i8_aligned_acquire(ptr %ptr, i8 %value) {
5418 ; -O0-LABEL: atomicrmw_max_i8_aligned_acquire:
5419 ; -O0:    sxtb w10, w9
5420 ; -O0:    subs w10, w10, w8, sxtb
5421 ; -O0:    csel w12, w9, w8, gt
5422 ; -O0:    ldaxrb w8, [x11]
5423 ; -O0:    cmp w8, w9, uxtb
5424 ; -O0:    stlxrb w10, w12, [x11]
5425 ; -O0:    subs w9, w8, w9, uxtb
5426 ; -O0:    subs w9, w9, #1
5428 ; -O1-LABEL: atomicrmw_max_i8_aligned_acquire:
5429 ; -O1:    ldaxrb w9, [x0]
5430 ; -O1:    sxtb w8, w9
5431 ; -O1:    cmp w8, w1, sxtb
5432 ; -O1:    csel w9, w9, w1, gt
5433 ; -O1:    stxrb w10, w9, [x0]
5434     %r = atomicrmw max ptr %ptr, i8 %value acquire, align 1
5435     ret i8 %r
5438 define dso_local i8 @atomicrmw_max_i8_aligned_release(ptr %ptr, i8 %value) {
5439 ; -O0-LABEL: atomicrmw_max_i8_aligned_release:
5440 ; -O0:    sxtb w10, w9
5441 ; -O0:    subs w10, w10, w8, sxtb
5442 ; -O0:    csel w12, w9, w8, gt
5443 ; -O0:    ldaxrb w8, [x11]
5444 ; -O0:    cmp w8, w9, uxtb
5445 ; -O0:    stlxrb w10, w12, [x11]
5446 ; -O0:    subs w9, w8, w9, uxtb
5447 ; -O0:    subs w9, w9, #1
5449 ; -O1-LABEL: atomicrmw_max_i8_aligned_release:
5450 ; -O1:    ldxrb w9, [x0]
5451 ; -O1:    sxtb w8, w9
5452 ; -O1:    cmp w8, w1, sxtb
5453 ; -O1:    csel w9, w9, w1, gt
5454 ; -O1:    stlxrb w10, w9, [x0]
5455     %r = atomicrmw max ptr %ptr, i8 %value release, align 1
5456     ret i8 %r
5459 define dso_local i8 @atomicrmw_max_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
5460 ; -O0-LABEL: atomicrmw_max_i8_aligned_acq_rel:
5461 ; -O0:    sxtb w10, w9
5462 ; -O0:    subs w10, w10, w8, sxtb
5463 ; -O0:    csel w12, w9, w8, gt
5464 ; -O0:    ldaxrb w8, [x11]
5465 ; -O0:    cmp w8, w9, uxtb
5466 ; -O0:    stlxrb w10, w12, [x11]
5467 ; -O0:    subs w9, w8, w9, uxtb
5468 ; -O0:    subs w9, w9, #1
5470 ; -O1-LABEL: atomicrmw_max_i8_aligned_acq_rel:
5471 ; -O1:    ldaxrb w9, [x0]
5472 ; -O1:    sxtb w8, w9
5473 ; -O1:    cmp w8, w1, sxtb
5474 ; -O1:    csel w9, w9, w1, gt
5475 ; -O1:    stlxrb w10, w9, [x0]
5476     %r = atomicrmw max ptr %ptr, i8 %value acq_rel, align 1
5477     ret i8 %r
5480 define dso_local i8 @atomicrmw_max_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
5481 ; -O0-LABEL: atomicrmw_max_i8_aligned_seq_cst:
5482 ; -O0:    sxtb w10, w9
5483 ; -O0:    subs w10, w10, w8, sxtb
5484 ; -O0:    csel w12, w9, w8, gt
5485 ; -O0:    ldaxrb w8, [x11]
5486 ; -O0:    cmp w8, w9, uxtb
5487 ; -O0:    stlxrb w10, w12, [x11]
5488 ; -O0:    subs w9, w8, w9, uxtb
5489 ; -O0:    subs w9, w9, #1
5491 ; -O1-LABEL: atomicrmw_max_i8_aligned_seq_cst:
5492 ; -O1:    ldaxrb w9, [x0]
5493 ; -O1:    sxtb w8, w9
5494 ; -O1:    cmp w8, w1, sxtb
5495 ; -O1:    csel w9, w9, w1, gt
5496 ; -O1:    stlxrb w10, w9, [x0]
5497     %r = atomicrmw max ptr %ptr, i8 %value seq_cst, align 1
5498     ret i8 %r
5501 define dso_local i16 @atomicrmw_max_i16_aligned_monotonic(ptr %ptr, i16 %value) {
5502 ; -O0-LABEL: atomicrmw_max_i16_aligned_monotonic:
5503 ; -O0:    sxth w10, w9
5504 ; -O0:    subs w10, w10, w8, sxth
5505 ; -O0:    csel w12, w9, w8, gt
5506 ; -O0:    ldaxrh w8, [x11]
5507 ; -O0:    cmp w8, w9, uxth
5508 ; -O0:    stlxrh w10, w12, [x11]
5509 ; -O0:    subs w9, w8, w9, uxth
5510 ; -O0:    subs w9, w9, #1
5512 ; -O1-LABEL: atomicrmw_max_i16_aligned_monotonic:
5513 ; -O1:    ldxrh w9, [x0]
5514 ; -O1:    sxth w8, w9
5515 ; -O1:    cmp w8, w1, sxth
5516 ; -O1:    csel w9, w9, w1, gt
5517 ; -O1:    stxrh w10, w9, [x0]
5518     %r = atomicrmw max ptr %ptr, i16 %value monotonic, align 2
5519     ret i16 %r
5522 define dso_local i16 @atomicrmw_max_i16_aligned_acquire(ptr %ptr, i16 %value) {
5523 ; -O0-LABEL: atomicrmw_max_i16_aligned_acquire:
5524 ; -O0:    sxth w10, w9
5525 ; -O0:    subs w10, w10, w8, sxth
5526 ; -O0:    csel w12, w9, w8, gt
5527 ; -O0:    ldaxrh w8, [x11]
5528 ; -O0:    cmp w8, w9, uxth
5529 ; -O0:    stlxrh w10, w12, [x11]
5530 ; -O0:    subs w9, w8, w9, uxth
5531 ; -O0:    subs w9, w9, #1
5533 ; -O1-LABEL: atomicrmw_max_i16_aligned_acquire:
5534 ; -O1:    ldaxrh w9, [x0]
5535 ; -O1:    sxth w8, w9
5536 ; -O1:    cmp w8, w1, sxth
5537 ; -O1:    csel w9, w9, w1, gt
5538 ; -O1:    stxrh w10, w9, [x0]
5539     %r = atomicrmw max ptr %ptr, i16 %value acquire, align 2
5540     ret i16 %r
5543 define dso_local i16 @atomicrmw_max_i16_aligned_release(ptr %ptr, i16 %value) {
5544 ; -O0-LABEL: atomicrmw_max_i16_aligned_release:
5545 ; -O0:    sxth w10, w9
5546 ; -O0:    subs w10, w10, w8, sxth
5547 ; -O0:    csel w12, w9, w8, gt
5548 ; -O0:    ldaxrh w8, [x11]
5549 ; -O0:    cmp w8, w9, uxth
5550 ; -O0:    stlxrh w10, w12, [x11]
5551 ; -O0:    subs w9, w8, w9, uxth
5552 ; -O0:    subs w9, w9, #1
5554 ; -O1-LABEL: atomicrmw_max_i16_aligned_release:
5555 ; -O1:    ldxrh w9, [x0]
5556 ; -O1:    sxth w8, w9
5557 ; -O1:    cmp w8, w1, sxth
5558 ; -O1:    csel w9, w9, w1, gt
5559 ; -O1:    stlxrh w10, w9, [x0]
5560     %r = atomicrmw max ptr %ptr, i16 %value release, align 2
5561     ret i16 %r
5564 define dso_local i16 @atomicrmw_max_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
5565 ; -O0-LABEL: atomicrmw_max_i16_aligned_acq_rel:
5566 ; -O0:    sxth w10, w9
5567 ; -O0:    subs w10, w10, w8, sxth
5568 ; -O0:    csel w12, w9, w8, gt
5569 ; -O0:    ldaxrh w8, [x11]
5570 ; -O0:    cmp w8, w9, uxth
5571 ; -O0:    stlxrh w10, w12, [x11]
5572 ; -O0:    subs w9, w8, w9, uxth
5573 ; -O0:    subs w9, w9, #1
5575 ; -O1-LABEL: atomicrmw_max_i16_aligned_acq_rel:
5576 ; -O1:    ldaxrh w9, [x0]
5577 ; -O1:    sxth w8, w9
5578 ; -O1:    cmp w8, w1, sxth
5579 ; -O1:    csel w9, w9, w1, gt
5580 ; -O1:    stlxrh w10, w9, [x0]
5581     %r = atomicrmw max ptr %ptr, i16 %value acq_rel, align 2
5582     ret i16 %r
5585 define dso_local i16 @atomicrmw_max_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
5586 ; -O0-LABEL: atomicrmw_max_i16_aligned_seq_cst:
5587 ; -O0:    sxth w10, w9
5588 ; -O0:    subs w10, w10, w8, sxth
5589 ; -O0:    csel w12, w9, w8, gt
5590 ; -O0:    ldaxrh w8, [x11]
5591 ; -O0:    cmp w8, w9, uxth
5592 ; -O0:    stlxrh w10, w12, [x11]
5593 ; -O0:    subs w9, w8, w9, uxth
5594 ; -O0:    subs w9, w9, #1
5596 ; -O1-LABEL: atomicrmw_max_i16_aligned_seq_cst:
5597 ; -O1:    ldaxrh w9, [x0]
5598 ; -O1:    sxth w8, w9
5599 ; -O1:    cmp w8, w1, sxth
5600 ; -O1:    csel w9, w9, w1, gt
5601 ; -O1:    stlxrh w10, w9, [x0]
5602     %r = atomicrmw max ptr %ptr, i16 %value seq_cst, align 2
5603     ret i16 %r
5606 define dso_local i32 @atomicrmw_max_i32_aligned_monotonic(ptr %ptr, i32 %value) {
5607 ; -O0-LABEL: atomicrmw_max_i32_aligned_monotonic:
5608 ; -O0:    subs w10, w9, w8
5609 ; -O0:    csel w12, w9, w8, gt
5610 ; -O0:    ldaxr w8, [x11]
5611 ; -O0:    cmp w8, w9
5612 ; -O0:    stlxr w10, w12, [x11]
5613 ; -O0:    subs w9, w8, w9
5614 ; -O0:    subs w9, w9, #1
5616 ; -O1-LABEL: atomicrmw_max_i32_aligned_monotonic:
5617 ; -O1:    ldxr w8, [x0]
5618 ; -O1:    cmp w8, w1
5619 ; -O1:    csel w9, w8, w1, gt
5620 ; -O1:    stxr w10, w9, [x0]
5621     %r = atomicrmw max ptr %ptr, i32 %value monotonic, align 4
5622     ret i32 %r
5625 define dso_local i32 @atomicrmw_max_i32_aligned_acquire(ptr %ptr, i32 %value) {
5626 ; -O0-LABEL: atomicrmw_max_i32_aligned_acquire:
5627 ; -O0:    subs w10, w9, w8
5628 ; -O0:    csel w12, w9, w8, gt
5629 ; -O0:    ldaxr w8, [x11]
5630 ; -O0:    cmp w8, w9
5631 ; -O0:    stlxr w10, w12, [x11]
5632 ; -O0:    subs w9, w8, w9
5633 ; -O0:    subs w9, w9, #1
5635 ; -O1-LABEL: atomicrmw_max_i32_aligned_acquire:
5636 ; -O1:    ldaxr w8, [x0]
5637 ; -O1:    cmp w8, w1
5638 ; -O1:    csel w9, w8, w1, gt
5639 ; -O1:    stxr w10, w9, [x0]
5640     %r = atomicrmw max ptr %ptr, i32 %value acquire, align 4
5641     ret i32 %r
5644 define dso_local i32 @atomicrmw_max_i32_aligned_release(ptr %ptr, i32 %value) {
5645 ; -O0-LABEL: atomicrmw_max_i32_aligned_release:
5646 ; -O0:    subs w10, w9, w8
5647 ; -O0:    csel w12, w9, w8, gt
5648 ; -O0:    ldaxr w8, [x11]
5649 ; -O0:    cmp w8, w9
5650 ; -O0:    stlxr w10, w12, [x11]
5651 ; -O0:    subs w9, w8, w9
5652 ; -O0:    subs w9, w9, #1
5654 ; -O1-LABEL: atomicrmw_max_i32_aligned_release:
5655 ; -O1:    ldxr w8, [x0]
5656 ; -O1:    cmp w8, w1
5657 ; -O1:    csel w9, w8, w1, gt
5658 ; -O1:    stlxr w10, w9, [x0]
5659     %r = atomicrmw max ptr %ptr, i32 %value release, align 4
5660     ret i32 %r
5663 define dso_local i32 @atomicrmw_max_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
5664 ; -O0-LABEL: atomicrmw_max_i32_aligned_acq_rel:
5665 ; -O0:    subs w10, w9, w8
5666 ; -O0:    csel w12, w9, w8, gt
5667 ; -O0:    ldaxr w8, [x11]
5668 ; -O0:    cmp w8, w9
5669 ; -O0:    stlxr w10, w12, [x11]
5670 ; -O0:    subs w9, w8, w9
5671 ; -O0:    subs w9, w9, #1
5673 ; -O1-LABEL: atomicrmw_max_i32_aligned_acq_rel:
5674 ; -O1:    ldaxr w8, [x0]
5675 ; -O1:    cmp w8, w1
5676 ; -O1:    csel w9, w8, w1, gt
5677 ; -O1:    stlxr w10, w9, [x0]
5678     %r = atomicrmw max ptr %ptr, i32 %value acq_rel, align 4
5679     ret i32 %r
5682 define dso_local i32 @atomicrmw_max_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
5683 ; -O0-LABEL: atomicrmw_max_i32_aligned_seq_cst:
5684 ; -O0:    subs w10, w9, w8
5685 ; -O0:    csel w12, w9, w8, gt
5686 ; -O0:    ldaxr w8, [x11]
5687 ; -O0:    cmp w8, w9
5688 ; -O0:    stlxr w10, w12, [x11]
5689 ; -O0:    subs w9, w8, w9
5690 ; -O0:    subs w9, w9, #1
5692 ; -O1-LABEL: atomicrmw_max_i32_aligned_seq_cst:
5693 ; -O1:    ldaxr w8, [x0]
5694 ; -O1:    cmp w8, w1
5695 ; -O1:    csel w9, w8, w1, gt
5696 ; -O1:    stlxr w10, w9, [x0]
5697     %r = atomicrmw max ptr %ptr, i32 %value seq_cst, align 4
5698     ret i32 %r
5701 define dso_local i64 @atomicrmw_max_i64_aligned_monotonic(ptr %ptr, i64 %value) {
5702 ; -O0-LABEL: atomicrmw_max_i64_aligned_monotonic:
5703 ; -O0:    subs x10, x9, x8
5704 ; -O0:    csel x12, x9, x8, gt
5705 ; -O0:    ldaxr x8, [x11]
5706 ; -O0:    cmp x8, x9
5707 ; -O0:    stlxr w10, x12, [x11]
5708 ; -O0:    subs x9, x8, x9
5709 ; -O0:    subs w9, w9, #1
5711 ; -O1-LABEL: atomicrmw_max_i64_aligned_monotonic:
5712 ; -O1:    ldxr x0, [x8]
5713 ; -O1:    cmp x0, x1
5714 ; -O1:    csel x9, x0, x1, gt
5715 ; -O1:    stxr w10, x9, [x8]
5716     %r = atomicrmw max ptr %ptr, i64 %value monotonic, align 8
5717     ret i64 %r
5720 define dso_local i64 @atomicrmw_max_i64_aligned_acquire(ptr %ptr, i64 %value) {
5721 ; -O0-LABEL: atomicrmw_max_i64_aligned_acquire:
5722 ; -O0:    subs x10, x9, x8
5723 ; -O0:    csel x12, x9, x8, gt
5724 ; -O0:    ldaxr x8, [x11]
5725 ; -O0:    cmp x8, x9
5726 ; -O0:    stlxr w10, x12, [x11]
5727 ; -O0:    subs x9, x8, x9
5728 ; -O0:    subs w9, w9, #1
5730 ; -O1-LABEL: atomicrmw_max_i64_aligned_acquire:
5731 ; -O1:    ldaxr x0, [x8]
5732 ; -O1:    cmp x0, x1
5733 ; -O1:    csel x9, x0, x1, gt
5734 ; -O1:    stxr w10, x9, [x8]
5735     %r = atomicrmw max ptr %ptr, i64 %value acquire, align 8
5736     ret i64 %r
5739 define dso_local i64 @atomicrmw_max_i64_aligned_release(ptr %ptr, i64 %value) {
5740 ; -O0-LABEL: atomicrmw_max_i64_aligned_release:
5741 ; -O0:    subs x10, x9, x8
5742 ; -O0:    csel x12, x9, x8, gt
5743 ; -O0:    ldaxr x8, [x11]
5744 ; -O0:    cmp x8, x9
5745 ; -O0:    stlxr w10, x12, [x11]
5746 ; -O0:    subs x9, x8, x9
5747 ; -O0:    subs w9, w9, #1
5749 ; -O1-LABEL: atomicrmw_max_i64_aligned_release:
5750 ; -O1:    ldxr x0, [x8]
5751 ; -O1:    cmp x0, x1
5752 ; -O1:    csel x9, x0, x1, gt
5753 ; -O1:    stlxr w10, x9, [x8]
5754     %r = atomicrmw max ptr %ptr, i64 %value release, align 8
5755     ret i64 %r
5758 define dso_local i64 @atomicrmw_max_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
5759 ; -O0-LABEL: atomicrmw_max_i64_aligned_acq_rel:
5760 ; -O0:    subs x10, x9, x8
5761 ; -O0:    csel x12, x9, x8, gt
5762 ; -O0:    ldaxr x8, [x11]
5763 ; -O0:    cmp x8, x9
5764 ; -O0:    stlxr w10, x12, [x11]
5765 ; -O0:    subs x9, x8, x9
5766 ; -O0:    subs w9, w9, #1
5768 ; -O1-LABEL: atomicrmw_max_i64_aligned_acq_rel:
5769 ; -O1:    ldaxr x0, [x8]
5770 ; -O1:    cmp x0, x1
5771 ; -O1:    csel x9, x0, x1, gt
5772 ; -O1:    stlxr w10, x9, [x8]
5773     %r = atomicrmw max ptr %ptr, i64 %value acq_rel, align 8
5774     ret i64 %r
5777 define dso_local i64 @atomicrmw_max_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
5778 ; -O0-LABEL: atomicrmw_max_i64_aligned_seq_cst:
5779 ; -O0:    subs x10, x9, x8
5780 ; -O0:    csel x12, x9, x8, gt
5781 ; -O0:    ldaxr x8, [x11]
5782 ; -O0:    cmp x8, x9
5783 ; -O0:    stlxr w10, x12, [x11]
5784 ; -O0:    subs x9, x8, x9
5785 ; -O0:    subs w9, w9, #1
5787 ; -O1-LABEL: atomicrmw_max_i64_aligned_seq_cst:
5788 ; -O1:    ldaxr x0, [x8]
5789 ; -O1:    cmp x0, x1
5790 ; -O1:    csel x9, x0, x1, gt
5791 ; -O1:    stlxr w10, x9, [x8]
5792     %r = atomicrmw max ptr %ptr, i64 %value seq_cst, align 8
5793     ret i64 %r
5796 define dso_local i128 @atomicrmw_max_i128_aligned_monotonic(ptr %ptr, i128 %value) {
5797 ; -O0-LABEL: atomicrmw_max_i128_aligned_monotonic:
5798 ; -O0:    subs x12, x8, x11
5799 ; -O0:    csel x15, x13, x10, lt
5800 ; -O0:    csel x14, x11, x8, lt
5801 ; -O0:    ldxp x10, x12, [x9]
5802 ; -O0:    cmp x10, x11
5803 ; -O0:    cmp x12, x13
5804 ; -O0:    stxp w8, x14, x15, [x9]
5805 ; -O0:    stxp w8, x10, x12, [x9]
5806 ; -O0:    subs x12, x12, x13
5807 ; -O0:    ccmp x10, x11, #0, eq
5809 ; -O1-LABEL: atomicrmw_max_i128_aligned_monotonic:
5810 ; -O1:    ldxp x1, x0, [x8]
5811 ; -O1:    cmp x3, x1
5812 ; -O1:    csel x9, x0, x2, lt
5813 ; -O1:    csel x10, x1, x3, lt
5814 ; -O1:    stxp w11, x10, x9, [x8]
5815     %r = atomicrmw max ptr %ptr, i128 %value monotonic, align 16
5816     ret i128 %r
5819 define dso_local i128 @atomicrmw_max_i128_aligned_acquire(ptr %ptr, i128 %value) {
5820 ; -O0-LABEL: atomicrmw_max_i128_aligned_acquire:
5821 ; -O0:    subs x12, x8, x11
5822 ; -O0:    csel x15, x13, x10, lt
5823 ; -O0:    csel x14, x11, x8, lt
5824 ; -O0:    ldaxp x10, x12, [x9]
5825 ; -O0:    cmp x10, x11
5826 ; -O0:    cmp x12, x13
5827 ; -O0:    stxp w8, x14, x15, [x9]
5828 ; -O0:    stxp w8, x10, x12, [x9]
5829 ; -O0:    subs x12, x12, x13
5830 ; -O0:    ccmp x10, x11, #0, eq
5832 ; -O1-LABEL: atomicrmw_max_i128_aligned_acquire:
5833 ; -O1:    ldaxp x1, x0, [x8]
5834 ; -O1:    cmp x3, x1
5835 ; -O1:    csel x9, x0, x2, lt
5836 ; -O1:    csel x10, x1, x3, lt
5837 ; -O1:    stxp w11, x10, x9, [x8]
5838     %r = atomicrmw max ptr %ptr, i128 %value acquire, align 16
5839     ret i128 %r
5842 define dso_local i128 @atomicrmw_max_i128_aligned_release(ptr %ptr, i128 %value) {
5843 ; -O0-LABEL: atomicrmw_max_i128_aligned_release:
5844 ; -O0:    subs x12, x8, x11
5845 ; -O0:    csel x15, x13, x10, lt
5846 ; -O0:    csel x14, x11, x8, lt
5847 ; -O0:    ldxp x10, x12, [x9]
5848 ; -O0:    cmp x10, x11
5849 ; -O0:    cmp x12, x13
5850 ; -O0:    stlxp w8, x14, x15, [x9]
5851 ; -O0:    stlxp w8, x10, x12, [x9]
5852 ; -O0:    subs x12, x12, x13
5853 ; -O0:    ccmp x10, x11, #0, eq
5855 ; -O1-LABEL: atomicrmw_max_i128_aligned_release:
5856 ; -O1:    ldxp x1, x0, [x8]
5857 ; -O1:    cmp x3, x1
5858 ; -O1:    csel x9, x0, x2, lt
5859 ; -O1:    csel x10, x1, x3, lt
5860 ; -O1:    stlxp w11, x10, x9, [x8]
5861     %r = atomicrmw max ptr %ptr, i128 %value release, align 16
5862     ret i128 %r
5865 define dso_local i128 @atomicrmw_max_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
5866 ; -O0-LABEL: atomicrmw_max_i128_aligned_acq_rel:
5867 ; -O0:    subs x12, x8, x11
5868 ; -O0:    csel x15, x13, x10, lt
5869 ; -O0:    csel x14, x11, x8, lt
5870 ; -O0:    ldaxp x10, x12, [x9]
5871 ; -O0:    cmp x10, x11
5872 ; -O0:    cmp x12, x13
5873 ; -O0:    stlxp w8, x14, x15, [x9]
5874 ; -O0:    stlxp w8, x10, x12, [x9]
5875 ; -O0:    subs x12, x12, x13
5876 ; -O0:    ccmp x10, x11, #0, eq
5878 ; -O1-LABEL: atomicrmw_max_i128_aligned_acq_rel:
5879 ; -O1:    ldaxp x1, x0, [x8]
5880 ; -O1:    cmp x3, x1
5881 ; -O1:    csel x9, x0, x2, lt
5882 ; -O1:    csel x10, x1, x3, lt
5883 ; -O1:    stlxp w11, x10, x9, [x8]
5884     %r = atomicrmw max ptr %ptr, i128 %value acq_rel, align 16
5885     ret i128 %r
5888 define dso_local i128 @atomicrmw_max_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
5889 ; -O0-LABEL: atomicrmw_max_i128_aligned_seq_cst:
5890 ; -O0:    subs x12, x8, x11
5891 ; -O0:    csel x15, x13, x10, lt
5892 ; -O0:    csel x14, x11, x8, lt
5893 ; -O0:    ldaxp x10, x12, [x9]
5894 ; -O0:    cmp x10, x11
5895 ; -O0:    cmp x12, x13
5896 ; -O0:    stlxp w8, x14, x15, [x9]
5897 ; -O0:    stlxp w8, x10, x12, [x9]
5898 ; -O0:    subs x12, x12, x13
5899 ; -O0:    ccmp x10, x11, #0, eq
5901 ; -O1-LABEL: atomicrmw_max_i128_aligned_seq_cst:
5902 ; -O1:    ldaxp x1, x0, [x8]
5903 ; -O1:    cmp x3, x1
5904 ; -O1:    csel x9, x0, x2, lt
5905 ; -O1:    csel x10, x1, x3, lt
5906 ; -O1:    stlxp w11, x10, x9, [x8]
5907     %r = atomicrmw max ptr %ptr, i128 %value seq_cst, align 16
5908     ret i128 %r
5911 define dso_local i8 @atomicrmw_max_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
5912 ; -O0-LABEL: atomicrmw_max_i8_unaligned_monotonic:
5913 ; -O0:    sxtb w10, w9
5914 ; -O0:    subs w10, w10, w8, sxtb
5915 ; -O0:    csel w12, w9, w8, gt
5916 ; -O0:    ldaxrb w8, [x11]
5917 ; -O0:    cmp w8, w9, uxtb
5918 ; -O0:    stlxrb w10, w12, [x11]
5919 ; -O0:    subs w9, w8, w9, uxtb
5920 ; -O0:    subs w9, w9, #1
5922 ; -O1-LABEL: atomicrmw_max_i8_unaligned_monotonic:
5923 ; -O1:    ldxrb w9, [x0]
5924 ; -O1:    sxtb w8, w9
5925 ; -O1:    cmp w8, w1, sxtb
5926 ; -O1:    csel w9, w9, w1, gt
5927 ; -O1:    stxrb w10, w9, [x0]
5928     %r = atomicrmw max ptr %ptr, i8 %value monotonic, align 1
5929     ret i8 %r
5932 define dso_local i8 @atomicrmw_max_i8_unaligned_acquire(ptr %ptr, i8 %value) {
5933 ; -O0-LABEL: atomicrmw_max_i8_unaligned_acquire:
5934 ; -O0:    sxtb w10, w9
5935 ; -O0:    subs w10, w10, w8, sxtb
5936 ; -O0:    csel w12, w9, w8, gt
5937 ; -O0:    ldaxrb w8, [x11]
5938 ; -O0:    cmp w8, w9, uxtb
5939 ; -O0:    stlxrb w10, w12, [x11]
5940 ; -O0:    subs w9, w8, w9, uxtb
5941 ; -O0:    subs w9, w9, #1
5943 ; -O1-LABEL: atomicrmw_max_i8_unaligned_acquire:
5944 ; -O1:    ldaxrb w9, [x0]
5945 ; -O1:    sxtb w8, w9
5946 ; -O1:    cmp w8, w1, sxtb
5947 ; -O1:    csel w9, w9, w1, gt
5948 ; -O1:    stxrb w10, w9, [x0]
5949     %r = atomicrmw max ptr %ptr, i8 %value acquire, align 1
5950     ret i8 %r
5953 define dso_local i8 @atomicrmw_max_i8_unaligned_release(ptr %ptr, i8 %value) {
5954 ; -O0-LABEL: atomicrmw_max_i8_unaligned_release:
5955 ; -O0:    sxtb w10, w9
5956 ; -O0:    subs w10, w10, w8, sxtb
5957 ; -O0:    csel w12, w9, w8, gt
5958 ; -O0:    ldaxrb w8, [x11]
5959 ; -O0:    cmp w8, w9, uxtb
5960 ; -O0:    stlxrb w10, w12, [x11]
5961 ; -O0:    subs w9, w8, w9, uxtb
5962 ; -O0:    subs w9, w9, #1
5964 ; -O1-LABEL: atomicrmw_max_i8_unaligned_release:
5965 ; -O1:    ldxrb w9, [x0]
5966 ; -O1:    sxtb w8, w9
5967 ; -O1:    cmp w8, w1, sxtb
5968 ; -O1:    csel w9, w9, w1, gt
5969 ; -O1:    stlxrb w10, w9, [x0]
5970     %r = atomicrmw max ptr %ptr, i8 %value release, align 1
5971     ret i8 %r
5974 define dso_local i8 @atomicrmw_max_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
5975 ; -O0-LABEL: atomicrmw_max_i8_unaligned_acq_rel:
5976 ; -O0:    sxtb w10, w9
5977 ; -O0:    subs w10, w10, w8, sxtb
5978 ; -O0:    csel w12, w9, w8, gt
5979 ; -O0:    ldaxrb w8, [x11]
5980 ; -O0:    cmp w8, w9, uxtb
5981 ; -O0:    stlxrb w10, w12, [x11]
5982 ; -O0:    subs w9, w8, w9, uxtb
5983 ; -O0:    subs w9, w9, #1
5985 ; -O1-LABEL: atomicrmw_max_i8_unaligned_acq_rel:
5986 ; -O1:    ldaxrb w9, [x0]
5987 ; -O1:    sxtb w8, w9
5988 ; -O1:    cmp w8, w1, sxtb
5989 ; -O1:    csel w9, w9, w1, gt
5990 ; -O1:    stlxrb w10, w9, [x0]
5991     %r = atomicrmw max ptr %ptr, i8 %value acq_rel, align 1
5992     ret i8 %r
5995 define dso_local i8 @atomicrmw_max_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
5996 ; -O0-LABEL: atomicrmw_max_i8_unaligned_seq_cst:
5997 ; -O0:    sxtb w10, w9
5998 ; -O0:    subs w10, w10, w8, sxtb
5999 ; -O0:    csel w12, w9, w8, gt
6000 ; -O0:    ldaxrb w8, [x11]
6001 ; -O0:    cmp w8, w9, uxtb
6002 ; -O0:    stlxrb w10, w12, [x11]
6003 ; -O0:    subs w9, w8, w9, uxtb
6004 ; -O0:    subs w9, w9, #1
6006 ; -O1-LABEL: atomicrmw_max_i8_unaligned_seq_cst:
6007 ; -O1:    ldaxrb w9, [x0]
6008 ; -O1:    sxtb w8, w9
6009 ; -O1:    cmp w8, w1, sxtb
6010 ; -O1:    csel w9, w9, w1, gt
6011 ; -O1:    stlxrb w10, w9, [x0]
6012     %r = atomicrmw max ptr %ptr, i8 %value seq_cst, align 1
6013     ret i8 %r
6016 define dso_local i16 @atomicrmw_max_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
6017 ; -O0-LABEL: atomicrmw_max_i16_unaligned_monotonic:
6018 ; -O0:    sxth w10, w9
6019 ; -O0:    subs w10, w10, w8, sxth
6020 ; -O0:    csel w8, w9, w8, gt
6021 ; -O0:    bl __atomic_compare_exchange
6023 ; -O1-LABEL: atomicrmw_max_i16_unaligned_monotonic:
6024 ; -O1:    sxth w8, w0
6025 ; -O1:    cmp w8, w20, sxth
6026 ; -O1:    csel w8, w0, w20, gt
6027 ; -O1:    bl __atomic_compare_exchange
6028     %r = atomicrmw max ptr %ptr, i16 %value monotonic, align 1
6029     ret i16 %r
6032 define dso_local i16 @atomicrmw_max_i16_unaligned_acquire(ptr %ptr, i16 %value) {
6033 ; -O0-LABEL: atomicrmw_max_i16_unaligned_acquire:
6034 ; -O0:    sxth w10, w9
6035 ; -O0:    subs w10, w10, w8, sxth
6036 ; -O0:    csel w8, w9, w8, gt
6037 ; -O0:    bl __atomic_compare_exchange
6039 ; -O1-LABEL: atomicrmw_max_i16_unaligned_acquire:
6040 ; -O1:    sxth w8, w0
6041 ; -O1:    cmp w8, w20, sxth
6042 ; -O1:    csel w8, w0, w20, gt
6043 ; -O1:    bl __atomic_compare_exchange
6044     %r = atomicrmw max ptr %ptr, i16 %value acquire, align 1
6045     ret i16 %r
6048 define dso_local i16 @atomicrmw_max_i16_unaligned_release(ptr %ptr, i16 %value) {
6049 ; -O0-LABEL: atomicrmw_max_i16_unaligned_release:
6050 ; -O0:    sxth w10, w9
6051 ; -O0:    subs w10, w10, w8, sxth
6052 ; -O0:    csel w8, w9, w8, gt
6053 ; -O0:    bl __atomic_compare_exchange
6055 ; -O1-LABEL: atomicrmw_max_i16_unaligned_release:
6056 ; -O1:    sxth w8, w0
6057 ; -O1:    cmp w8, w20, sxth
6058 ; -O1:    csel w8, w0, w20, gt
6059 ; -O1:    bl __atomic_compare_exchange
6060     %r = atomicrmw max ptr %ptr, i16 %value release, align 1
6061     ret i16 %r
6064 define dso_local i16 @atomicrmw_max_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
6065 ; -O0-LABEL: atomicrmw_max_i16_unaligned_acq_rel:
6066 ; -O0:    sxth w10, w9
6067 ; -O0:    subs w10, w10, w8, sxth
6068 ; -O0:    csel w8, w9, w8, gt
6069 ; -O0:    bl __atomic_compare_exchange
6071 ; -O1-LABEL: atomicrmw_max_i16_unaligned_acq_rel:
6072 ; -O1:    sxth w8, w0
6073 ; -O1:    cmp w8, w20, sxth
6074 ; -O1:    csel w8, w0, w20, gt
6075 ; -O1:    bl __atomic_compare_exchange
6076     %r = atomicrmw max ptr %ptr, i16 %value acq_rel, align 1
6077     ret i16 %r
6080 define dso_local i16 @atomicrmw_max_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
6081 ; -O0-LABEL: atomicrmw_max_i16_unaligned_seq_cst:
6082 ; -O0:    sxth w10, w9
6083 ; -O0:    subs w10, w10, w8, sxth
6084 ; -O0:    csel w8, w9, w8, gt
6085 ; -O0:    bl __atomic_compare_exchange
6087 ; -O1-LABEL: atomicrmw_max_i16_unaligned_seq_cst:
6088 ; -O1:    sxth w8, w0
6089 ; -O1:    cmp w8, w20, sxth
6090 ; -O1:    csel w8, w0, w20, gt
6091 ; -O1:    bl __atomic_compare_exchange
6092     %r = atomicrmw max ptr %ptr, i16 %value seq_cst, align 1
6093     ret i16 %r
6096 define dso_local i32 @atomicrmw_max_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
6097 ; -O0-LABEL: atomicrmw_max_i32_unaligned_monotonic:
6098 ; -O0:    subs w10, w9, w8
6099 ; -O0:    csel w8, w9, w8, gt
6100 ; -O0:    bl __atomic_compare_exchange
6102 ; -O1-LABEL: atomicrmw_max_i32_unaligned_monotonic:
6103 ; -O1:    cmp w0, w20
6104 ; -O1:    csel w8, w0, w20, gt
6105 ; -O1:    bl __atomic_compare_exchange
6106     %r = atomicrmw max ptr %ptr, i32 %value monotonic, align 1
6107     ret i32 %r
6110 define dso_local i32 @atomicrmw_max_i32_unaligned_acquire(ptr %ptr, i32 %value) {
6111 ; -O0-LABEL: atomicrmw_max_i32_unaligned_acquire:
6112 ; -O0:    subs w10, w9, w8
6113 ; -O0:    csel w8, w9, w8, gt
6114 ; -O0:    bl __atomic_compare_exchange
6116 ; -O1-LABEL: atomicrmw_max_i32_unaligned_acquire:
6117 ; -O1:    cmp w0, w20
6118 ; -O1:    csel w8, w0, w20, gt
6119 ; -O1:    bl __atomic_compare_exchange
6120     %r = atomicrmw max ptr %ptr, i32 %value acquire, align 1
6121     ret i32 %r
6124 define dso_local i32 @atomicrmw_max_i32_unaligned_release(ptr %ptr, i32 %value) {
6125 ; -O0-LABEL: atomicrmw_max_i32_unaligned_release:
6126 ; -O0:    subs w10, w9, w8
6127 ; -O0:    csel w8, w9, w8, gt
6128 ; -O0:    bl __atomic_compare_exchange
6130 ; -O1-LABEL: atomicrmw_max_i32_unaligned_release:
6131 ; -O1:    cmp w0, w20
6132 ; -O1:    csel w8, w0, w20, gt
6133 ; -O1:    bl __atomic_compare_exchange
6134     %r = atomicrmw max ptr %ptr, i32 %value release, align 1
6135     ret i32 %r
6138 define dso_local i32 @atomicrmw_max_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
6139 ; -O0-LABEL: atomicrmw_max_i32_unaligned_acq_rel:
6140 ; -O0:    subs w10, w9, w8
6141 ; -O0:    csel w8, w9, w8, gt
6142 ; -O0:    bl __atomic_compare_exchange
6144 ; -O1-LABEL: atomicrmw_max_i32_unaligned_acq_rel:
6145 ; -O1:    cmp w0, w20
6146 ; -O1:    csel w8, w0, w20, gt
6147 ; -O1:    bl __atomic_compare_exchange
6148     %r = atomicrmw max ptr %ptr, i32 %value acq_rel, align 1
6149     ret i32 %r
6152 define dso_local i32 @atomicrmw_max_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
6153 ; -O0-LABEL: atomicrmw_max_i32_unaligned_seq_cst:
6154 ; -O0:    subs w10, w9, w8
6155 ; -O0:    csel w8, w9, w8, gt
6156 ; -O0:    bl __atomic_compare_exchange
6158 ; -O1-LABEL: atomicrmw_max_i32_unaligned_seq_cst:
6159 ; -O1:    cmp w0, w20
6160 ; -O1:    csel w8, w0, w20, gt
6161 ; -O1:    bl __atomic_compare_exchange
6162     %r = atomicrmw max ptr %ptr, i32 %value seq_cst, align 1
6163     ret i32 %r
6166 define dso_local i64 @atomicrmw_max_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
6167 ; -O0-LABEL: atomicrmw_max_i64_unaligned_monotonic:
6168 ; -O0:    subs x10, x9, x8
6169 ; -O0:    csel x8, x9, x8, gt
6170 ; -O0:    bl __atomic_compare_exchange
6172 ; -O1-LABEL: atomicrmw_max_i64_unaligned_monotonic:
6173 ; -O1:    cmp x0, x20
6174 ; -O1:    csel x8, x0, x20, gt
6175 ; -O1:    bl __atomic_compare_exchange
6176     %r = atomicrmw max ptr %ptr, i64 %value monotonic, align 1
6177     ret i64 %r
6180 define dso_local i64 @atomicrmw_max_i64_unaligned_acquire(ptr %ptr, i64 %value) {
6181 ; -O0-LABEL: atomicrmw_max_i64_unaligned_acquire:
6182 ; -O0:    subs x10, x9, x8
6183 ; -O0:    csel x8, x9, x8, gt
6184 ; -O0:    bl __atomic_compare_exchange
6186 ; -O1-LABEL: atomicrmw_max_i64_unaligned_acquire:
6187 ; -O1:    cmp x0, x20
6188 ; -O1:    csel x8, x0, x20, gt
6189 ; -O1:    bl __atomic_compare_exchange
6190     %r = atomicrmw max ptr %ptr, i64 %value acquire, align 1
6191     ret i64 %r
6194 define dso_local i64 @atomicrmw_max_i64_unaligned_release(ptr %ptr, i64 %value) {
6195 ; -O0-LABEL: atomicrmw_max_i64_unaligned_release:
6196 ; -O0:    subs x10, x9, x8
6197 ; -O0:    csel x8, x9, x8, gt
6198 ; -O0:    bl __atomic_compare_exchange
6200 ; -O1-LABEL: atomicrmw_max_i64_unaligned_release:
6201 ; -O1:    cmp x0, x20
6202 ; -O1:    csel x8, x0, x20, gt
6203 ; -O1:    bl __atomic_compare_exchange
6204     %r = atomicrmw max ptr %ptr, i64 %value release, align 1
6205     ret i64 %r
6208 define dso_local i64 @atomicrmw_max_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
6209 ; -O0-LABEL: atomicrmw_max_i64_unaligned_acq_rel:
6210 ; -O0:    subs x10, x9, x8
6211 ; -O0:    csel x8, x9, x8, gt
6212 ; -O0:    bl __atomic_compare_exchange
6214 ; -O1-LABEL: atomicrmw_max_i64_unaligned_acq_rel:
6215 ; -O1:    cmp x0, x20
6216 ; -O1:    csel x8, x0, x20, gt
6217 ; -O1:    bl __atomic_compare_exchange
6218     %r = atomicrmw max ptr %ptr, i64 %value acq_rel, align 1
6219     ret i64 %r
6222 define dso_local i64 @atomicrmw_max_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
6223 ; -O0-LABEL: atomicrmw_max_i64_unaligned_seq_cst:
6224 ; -O0:    subs x10, x9, x8
6225 ; -O0:    csel x8, x9, x8, gt
6226 ; -O0:    bl __atomic_compare_exchange
6228 ; -O1-LABEL: atomicrmw_max_i64_unaligned_seq_cst:
6229 ; -O1:    cmp x0, x20
6230 ; -O1:    csel x8, x0, x20, gt
6231 ; -O1:    bl __atomic_compare_exchange
6232     %r = atomicrmw max ptr %ptr, i64 %value seq_cst, align 1
6233     ret i64 %r
6236 define dso_local i128 @atomicrmw_max_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
6237 ; -O0-LABEL: atomicrmw_max_i128_unaligned_monotonic:
6238 ; -O0:    subs x12, x9, x10
6239 ; -O0:    csel x8, x11, x8, lt
6240 ; -O0:    csel x9, x10, x9, lt
6241 ; -O0:    bl __atomic_compare_exchange
6243 ; -O1-LABEL: atomicrmw_max_i128_unaligned_monotonic:
6244 ; -O1:    ldp x0, x1, [x0]
6245 ; -O1:    cmp x19, x1
6246 ; -O1:    csel x8, x1, x19, lt
6247 ; -O1:    csel x9, x0, x21, lt
6248 ; -O1:    bl __atomic_compare_exchange
6249     %r = atomicrmw max ptr %ptr, i128 %value monotonic, align 1
6250     ret i128 %r
6253 define dso_local i128 @atomicrmw_max_i128_unaligned_acquire(ptr %ptr, i128 %value) {
6254 ; -O0-LABEL: atomicrmw_max_i128_unaligned_acquire:
6255 ; -O0:    subs x12, x9, x10
6256 ; -O0:    csel x8, x11, x8, lt
6257 ; -O0:    csel x9, x10, x9, lt
6258 ; -O0:    bl __atomic_compare_exchange
6260 ; -O1-LABEL: atomicrmw_max_i128_unaligned_acquire:
6261 ; -O1:    ldp x0, x1, [x0]
6262 ; -O1:    cmp x19, x1
6263 ; -O1:    csel x8, x1, x19, lt
6264 ; -O1:    csel x9, x0, x21, lt
6265 ; -O1:    bl __atomic_compare_exchange
6266     %r = atomicrmw max ptr %ptr, i128 %value acquire, align 1
6267     ret i128 %r
6270 define dso_local i128 @atomicrmw_max_i128_unaligned_release(ptr %ptr, i128 %value) {
6271 ; -O0-LABEL: atomicrmw_max_i128_unaligned_release:
6272 ; -O0:    subs x12, x9, x10
6273 ; -O0:    csel x8, x11, x8, lt
6274 ; -O0:    csel x9, x10, x9, lt
6275 ; -O0:    bl __atomic_compare_exchange
6277 ; -O1-LABEL: atomicrmw_max_i128_unaligned_release:
6278 ; -O1:    ldp x0, x1, [x0]
6279 ; -O1:    cmp x19, x1
6280 ; -O1:    csel x8, x1, x19, lt
6281 ; -O1:    csel x9, x0, x21, lt
6282 ; -O1:    bl __atomic_compare_exchange
6283     %r = atomicrmw max ptr %ptr, i128 %value release, align 1
6284     ret i128 %r
6287 define dso_local i128 @atomicrmw_max_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
6288 ; -O0-LABEL: atomicrmw_max_i128_unaligned_acq_rel:
6289 ; -O0:    subs x12, x9, x10
6290 ; -O0:    csel x8, x11, x8, lt
6291 ; -O0:    csel x9, x10, x9, lt
6292 ; -O0:    bl __atomic_compare_exchange
6294 ; -O1-LABEL: atomicrmw_max_i128_unaligned_acq_rel:
6295 ; -O1:    ldp x0, x1, [x0]
6296 ; -O1:    cmp x19, x1
6297 ; -O1:    csel x8, x1, x19, lt
6298 ; -O1:    csel x9, x0, x21, lt
6299 ; -O1:    bl __atomic_compare_exchange
6300     %r = atomicrmw max ptr %ptr, i128 %value acq_rel, align 1
6301     ret i128 %r
6304 define dso_local i128 @atomicrmw_max_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
6305 ; -O0-LABEL: atomicrmw_max_i128_unaligned_seq_cst:
6306 ; -O0:    subs x12, x9, x10
6307 ; -O0:    csel x8, x11, x8, lt
6308 ; -O0:    csel x9, x10, x9, lt
6309 ; -O0:    bl __atomic_compare_exchange
6311 ; -O1-LABEL: atomicrmw_max_i128_unaligned_seq_cst:
6312 ; -O1:    ldp x0, x1, [x0]
6313 ; -O1:    cmp x19, x1
6314 ; -O1:    csel x8, x1, x19, lt
6315 ; -O1:    csel x9, x0, x21, lt
6316 ; -O1:    bl __atomic_compare_exchange
6317     %r = atomicrmw max ptr %ptr, i128 %value seq_cst, align 1
6318     ret i128 %r
6321 define dso_local i8 @atomicrmw_min_i8_aligned_monotonic(ptr %ptr, i8 %value) {
6322 ; -O0-LABEL: atomicrmw_min_i8_aligned_monotonic:
6323 ; -O0:    sxtb w10, w9
6324 ; -O0:    subs w10, w10, w8, sxtb
6325 ; -O0:    csel w12, w9, w8, le
6326 ; -O0:    ldaxrb w8, [x11]
6327 ; -O0:    cmp w8, w9, uxtb
6328 ; -O0:    stlxrb w10, w12, [x11]
6329 ; -O0:    subs w9, w8, w9, uxtb
6330 ; -O0:    subs w9, w9, #1
6332 ; -O1-LABEL: atomicrmw_min_i8_aligned_monotonic:
6333 ; -O1:    ldxrb w9, [x0]
6334 ; -O1:    sxtb w8, w9
6335 ; -O1:    cmp w8, w1, sxtb
6336 ; -O1:    csel w9, w9, w1, le
6337 ; -O1:    stxrb w10, w9, [x0]
6338     %r = atomicrmw min ptr %ptr, i8 %value monotonic, align 1
6339     ret i8 %r
6342 define dso_local i8 @atomicrmw_min_i8_aligned_acquire(ptr %ptr, i8 %value) {
6343 ; -O0-LABEL: atomicrmw_min_i8_aligned_acquire:
6344 ; -O0:    sxtb w10, w9
6345 ; -O0:    subs w10, w10, w8, sxtb
6346 ; -O0:    csel w12, w9, w8, le
6347 ; -O0:    ldaxrb w8, [x11]
6348 ; -O0:    cmp w8, w9, uxtb
6349 ; -O0:    stlxrb w10, w12, [x11]
6350 ; -O0:    subs w9, w8, w9, uxtb
6351 ; -O0:    subs w9, w9, #1
6353 ; -O1-LABEL: atomicrmw_min_i8_aligned_acquire:
6354 ; -O1:    ldaxrb w9, [x0]
6355 ; -O1:    sxtb w8, w9
6356 ; -O1:    cmp w8, w1, sxtb
6357 ; -O1:    csel w9, w9, w1, le
6358 ; -O1:    stxrb w10, w9, [x0]
6359     %r = atomicrmw min ptr %ptr, i8 %value acquire, align 1
6360     ret i8 %r
6363 define dso_local i8 @atomicrmw_min_i8_aligned_release(ptr %ptr, i8 %value) {
6364 ; -O0-LABEL: atomicrmw_min_i8_aligned_release:
6365 ; -O0:    sxtb w10, w9
6366 ; -O0:    subs w10, w10, w8, sxtb
6367 ; -O0:    csel w12, w9, w8, le
6368 ; -O0:    ldaxrb w8, [x11]
6369 ; -O0:    cmp w8, w9, uxtb
6370 ; -O0:    stlxrb w10, w12, [x11]
6371 ; -O0:    subs w9, w8, w9, uxtb
6372 ; -O0:    subs w9, w9, #1
6374 ; -O1-LABEL: atomicrmw_min_i8_aligned_release:
6375 ; -O1:    ldxrb w9, [x0]
6376 ; -O1:    sxtb w8, w9
6377 ; -O1:    cmp w8, w1, sxtb
6378 ; -O1:    csel w9, w9, w1, le
6379 ; -O1:    stlxrb w10, w9, [x0]
6380     %r = atomicrmw min ptr %ptr, i8 %value release, align 1
6381     ret i8 %r
6384 define dso_local i8 @atomicrmw_min_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
6385 ; -O0-LABEL: atomicrmw_min_i8_aligned_acq_rel:
6386 ; -O0:    sxtb w10, w9
6387 ; -O0:    subs w10, w10, w8, sxtb
6388 ; -O0:    csel w12, w9, w8, le
6389 ; -O0:    ldaxrb w8, [x11]
6390 ; -O0:    cmp w8, w9, uxtb
6391 ; -O0:    stlxrb w10, w12, [x11]
6392 ; -O0:    subs w9, w8, w9, uxtb
6393 ; -O0:    subs w9, w9, #1
6395 ; -O1-LABEL: atomicrmw_min_i8_aligned_acq_rel:
6396 ; -O1:    ldaxrb w9, [x0]
6397 ; -O1:    sxtb w8, w9
6398 ; -O1:    cmp w8, w1, sxtb
6399 ; -O1:    csel w9, w9, w1, le
6400 ; -O1:    stlxrb w10, w9, [x0]
6401     %r = atomicrmw min ptr %ptr, i8 %value acq_rel, align 1
6402     ret i8 %r
6405 define dso_local i8 @atomicrmw_min_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
6406 ; -O0-LABEL: atomicrmw_min_i8_aligned_seq_cst:
6407 ; -O0:    sxtb w10, w9
6408 ; -O0:    subs w10, w10, w8, sxtb
6409 ; -O0:    csel w12, w9, w8, le
6410 ; -O0:    ldaxrb w8, [x11]
6411 ; -O0:    cmp w8, w9, uxtb
6412 ; -O0:    stlxrb w10, w12, [x11]
6413 ; -O0:    subs w9, w8, w9, uxtb
6414 ; -O0:    subs w9, w9, #1
6416 ; -O1-LABEL: atomicrmw_min_i8_aligned_seq_cst:
6417 ; -O1:    ldaxrb w9, [x0]
6418 ; -O1:    sxtb w8, w9
6419 ; -O1:    cmp w8, w1, sxtb
6420 ; -O1:    csel w9, w9, w1, le
6421 ; -O1:    stlxrb w10, w9, [x0]
6422     %r = atomicrmw min ptr %ptr, i8 %value seq_cst, align 1
6423     ret i8 %r
6426 define dso_local i16 @atomicrmw_min_i16_aligned_monotonic(ptr %ptr, i16 %value) {
6427 ; -O0-LABEL: atomicrmw_min_i16_aligned_monotonic:
6428 ; -O0:    sxth w10, w9
6429 ; -O0:    subs w10, w10, w8, sxth
6430 ; -O0:    csel w12, w9, w8, le
6431 ; -O0:    ldaxrh w8, [x11]
6432 ; -O0:    cmp w8, w9, uxth
6433 ; -O0:    stlxrh w10, w12, [x11]
6434 ; -O0:    subs w9, w8, w9, uxth
6435 ; -O0:    subs w9, w9, #1
6437 ; -O1-LABEL: atomicrmw_min_i16_aligned_monotonic:
6438 ; -O1:    ldxrh w9, [x0]
6439 ; -O1:    sxth w8, w9
6440 ; -O1:    cmp w8, w1, sxth
6441 ; -O1:    csel w9, w9, w1, le
6442 ; -O1:    stxrh w10, w9, [x0]
6443     %r = atomicrmw min ptr %ptr, i16 %value monotonic, align 2
6444     ret i16 %r
6447 define dso_local i16 @atomicrmw_min_i16_aligned_acquire(ptr %ptr, i16 %value) {
6448 ; -O0-LABEL: atomicrmw_min_i16_aligned_acquire:
6449 ; -O0:    sxth w10, w9
6450 ; -O0:    subs w10, w10, w8, sxth
6451 ; -O0:    csel w12, w9, w8, le
6452 ; -O0:    ldaxrh w8, [x11]
6453 ; -O0:    cmp w8, w9, uxth
6454 ; -O0:    stlxrh w10, w12, [x11]
6455 ; -O0:    subs w9, w8, w9, uxth
6456 ; -O0:    subs w9, w9, #1
6458 ; -O1-LABEL: atomicrmw_min_i16_aligned_acquire:
6459 ; -O1:    ldaxrh w9, [x0]
6460 ; -O1:    sxth w8, w9
6461 ; -O1:    cmp w8, w1, sxth
6462 ; -O1:    csel w9, w9, w1, le
6463 ; -O1:    stxrh w10, w9, [x0]
6464     %r = atomicrmw min ptr %ptr, i16 %value acquire, align 2
6465     ret i16 %r
6468 define dso_local i16 @atomicrmw_min_i16_aligned_release(ptr %ptr, i16 %value) {
6469 ; -O0-LABEL: atomicrmw_min_i16_aligned_release:
6470 ; -O0:    sxth w10, w9
6471 ; -O0:    subs w10, w10, w8, sxth
6472 ; -O0:    csel w12, w9, w8, le
6473 ; -O0:    ldaxrh w8, [x11]
6474 ; -O0:    cmp w8, w9, uxth
6475 ; -O0:    stlxrh w10, w12, [x11]
6476 ; -O0:    subs w9, w8, w9, uxth
6477 ; -O0:    subs w9, w9, #1
6479 ; -O1-LABEL: atomicrmw_min_i16_aligned_release:
6480 ; -O1:    ldxrh w9, [x0]
6481 ; -O1:    sxth w8, w9
6482 ; -O1:    cmp w8, w1, sxth
6483 ; -O1:    csel w9, w9, w1, le
6484 ; -O1:    stlxrh w10, w9, [x0]
6485     %r = atomicrmw min ptr %ptr, i16 %value release, align 2
6486     ret i16 %r
6489 define dso_local i16 @atomicrmw_min_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
6490 ; -O0-LABEL: atomicrmw_min_i16_aligned_acq_rel:
6491 ; -O0:    sxth w10, w9
6492 ; -O0:    subs w10, w10, w8, sxth
6493 ; -O0:    csel w12, w9, w8, le
6494 ; -O0:    ldaxrh w8, [x11]
6495 ; -O0:    cmp w8, w9, uxth
6496 ; -O0:    stlxrh w10, w12, [x11]
6497 ; -O0:    subs w9, w8, w9, uxth
6498 ; -O0:    subs w9, w9, #1
6500 ; -O1-LABEL: atomicrmw_min_i16_aligned_acq_rel:
6501 ; -O1:    ldaxrh w9, [x0]
6502 ; -O1:    sxth w8, w9
6503 ; -O1:    cmp w8, w1, sxth
6504 ; -O1:    csel w9, w9, w1, le
6505 ; -O1:    stlxrh w10, w9, [x0]
6506     %r = atomicrmw min ptr %ptr, i16 %value acq_rel, align 2
6507     ret i16 %r
6510 define dso_local i16 @atomicrmw_min_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
6511 ; -O0-LABEL: atomicrmw_min_i16_aligned_seq_cst:
6512 ; -O0:    sxth w10, w9
6513 ; -O0:    subs w10, w10, w8, sxth
6514 ; -O0:    csel w12, w9, w8, le
6515 ; -O0:    ldaxrh w8, [x11]
6516 ; -O0:    cmp w8, w9, uxth
6517 ; -O0:    stlxrh w10, w12, [x11]
6518 ; -O0:    subs w9, w8, w9, uxth
6519 ; -O0:    subs w9, w9, #1
6521 ; -O1-LABEL: atomicrmw_min_i16_aligned_seq_cst:
6522 ; -O1:    ldaxrh w9, [x0]
6523 ; -O1:    sxth w8, w9
6524 ; -O1:    cmp w8, w1, sxth
6525 ; -O1:    csel w9, w9, w1, le
6526 ; -O1:    stlxrh w10, w9, [x0]
6527     %r = atomicrmw min ptr %ptr, i16 %value seq_cst, align 2
6528     ret i16 %r
6531 define dso_local i32 @atomicrmw_min_i32_aligned_monotonic(ptr %ptr, i32 %value) {
6532 ; -O0-LABEL: atomicrmw_min_i32_aligned_monotonic:
6533 ; -O0:    subs w10, w9, w8
6534 ; -O0:    csel w12, w9, w8, le
6535 ; -O0:    ldaxr w8, [x11]
6536 ; -O0:    cmp w8, w9
6537 ; -O0:    stlxr w10, w12, [x11]
6538 ; -O0:    subs w9, w8, w9
6539 ; -O0:    subs w9, w9, #1
6541 ; -O1-LABEL: atomicrmw_min_i32_aligned_monotonic:
6542 ; -O1:    ldxr w8, [x0]
6543 ; -O1:    cmp w8, w1
6544 ; -O1:    csel w9, w8, w1, le
6545 ; -O1:    stxr w10, w9, [x0]
6546     %r = atomicrmw min ptr %ptr, i32 %value monotonic, align 4
6547     ret i32 %r
6550 define dso_local i32 @atomicrmw_min_i32_aligned_acquire(ptr %ptr, i32 %value) {
6551 ; -O0-LABEL: atomicrmw_min_i32_aligned_acquire:
6552 ; -O0:    subs w10, w9, w8
6553 ; -O0:    csel w12, w9, w8, le
6554 ; -O0:    ldaxr w8, [x11]
6555 ; -O0:    cmp w8, w9
6556 ; -O0:    stlxr w10, w12, [x11]
6557 ; -O0:    subs w9, w8, w9
6558 ; -O0:    subs w9, w9, #1
6560 ; -O1-LABEL: atomicrmw_min_i32_aligned_acquire:
6561 ; -O1:    ldaxr w8, [x0]
6562 ; -O1:    cmp w8, w1
6563 ; -O1:    csel w9, w8, w1, le
6564 ; -O1:    stxr w10, w9, [x0]
6565     %r = atomicrmw min ptr %ptr, i32 %value acquire, align 4
6566     ret i32 %r
6569 define dso_local i32 @atomicrmw_min_i32_aligned_release(ptr %ptr, i32 %value) {
6570 ; -O0-LABEL: atomicrmw_min_i32_aligned_release:
6571 ; -O0:    subs w10, w9, w8
6572 ; -O0:    csel w12, w9, w8, le
6573 ; -O0:    ldaxr w8, [x11]
6574 ; -O0:    cmp w8, w9
6575 ; -O0:    stlxr w10, w12, [x11]
6576 ; -O0:    subs w9, w8, w9
6577 ; -O0:    subs w9, w9, #1
6579 ; -O1-LABEL: atomicrmw_min_i32_aligned_release:
6580 ; -O1:    ldxr w8, [x0]
6581 ; -O1:    cmp w8, w1
6582 ; -O1:    csel w9, w8, w1, le
6583 ; -O1:    stlxr w10, w9, [x0]
6584     %r = atomicrmw min ptr %ptr, i32 %value release, align 4
6585     ret i32 %r
6588 define dso_local i32 @atomicrmw_min_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
6589 ; -O0-LABEL: atomicrmw_min_i32_aligned_acq_rel:
6590 ; -O0:    subs w10, w9, w8
6591 ; -O0:    csel w12, w9, w8, le
6592 ; -O0:    ldaxr w8, [x11]
6593 ; -O0:    cmp w8, w9
6594 ; -O0:    stlxr w10, w12, [x11]
6595 ; -O0:    subs w9, w8, w9
6596 ; -O0:    subs w9, w9, #1
6598 ; -O1-LABEL: atomicrmw_min_i32_aligned_acq_rel:
6599 ; -O1:    ldaxr w8, [x0]
6600 ; -O1:    cmp w8, w1
6601 ; -O1:    csel w9, w8, w1, le
6602 ; -O1:    stlxr w10, w9, [x0]
6603     %r = atomicrmw min ptr %ptr, i32 %value acq_rel, align 4
6604     ret i32 %r
6607 define dso_local i32 @atomicrmw_min_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
6608 ; -O0-LABEL: atomicrmw_min_i32_aligned_seq_cst:
6609 ; -O0:    subs w10, w9, w8
6610 ; -O0:    csel w12, w9, w8, le
6611 ; -O0:    ldaxr w8, [x11]
6612 ; -O0:    cmp w8, w9
6613 ; -O0:    stlxr w10, w12, [x11]
6614 ; -O0:    subs w9, w8, w9
6615 ; -O0:    subs w9, w9, #1
6617 ; -O1-LABEL: atomicrmw_min_i32_aligned_seq_cst:
6618 ; -O1:    ldaxr w8, [x0]
6619 ; -O1:    cmp w8, w1
6620 ; -O1:    csel w9, w8, w1, le
6621 ; -O1:    stlxr w10, w9, [x0]
6622     %r = atomicrmw min ptr %ptr, i32 %value seq_cst, align 4
6623     ret i32 %r
6626 define dso_local i64 @atomicrmw_min_i64_aligned_monotonic(ptr %ptr, i64 %value) {
6627 ; -O0-LABEL: atomicrmw_min_i64_aligned_monotonic:
6628 ; -O0:    subs x10, x9, x8
6629 ; -O0:    csel x12, x9, x8, le
6630 ; -O0:    ldaxr x8, [x11]
6631 ; -O0:    cmp x8, x9
6632 ; -O0:    stlxr w10, x12, [x11]
6633 ; -O0:    subs x9, x8, x9
6634 ; -O0:    subs w9, w9, #1
6636 ; -O1-LABEL: atomicrmw_min_i64_aligned_monotonic:
6637 ; -O1:    ldxr x0, [x8]
6638 ; -O1:    cmp x0, x1
6639 ; -O1:    csel x9, x0, x1, le
6640 ; -O1:    stxr w10, x9, [x8]
6641     %r = atomicrmw min ptr %ptr, i64 %value monotonic, align 8
6642     ret i64 %r
6645 define dso_local i64 @atomicrmw_min_i64_aligned_acquire(ptr %ptr, i64 %value) {
6646 ; -O0-LABEL: atomicrmw_min_i64_aligned_acquire:
6647 ; -O0:    subs x10, x9, x8
6648 ; -O0:    csel x12, x9, x8, le
6649 ; -O0:    ldaxr x8, [x11]
6650 ; -O0:    cmp x8, x9
6651 ; -O0:    stlxr w10, x12, [x11]
6652 ; -O0:    subs x9, x8, x9
6653 ; -O0:    subs w9, w9, #1
6655 ; -O1-LABEL: atomicrmw_min_i64_aligned_acquire:
6656 ; -O1:    ldaxr x0, [x8]
6657 ; -O1:    cmp x0, x1
6658 ; -O1:    csel x9, x0, x1, le
6659 ; -O1:    stxr w10, x9, [x8]
6660     %r = atomicrmw min ptr %ptr, i64 %value acquire, align 8
6661     ret i64 %r
6664 define dso_local i64 @atomicrmw_min_i64_aligned_release(ptr %ptr, i64 %value) {
6665 ; -O0-LABEL: atomicrmw_min_i64_aligned_release:
6666 ; -O0:    subs x10, x9, x8
6667 ; -O0:    csel x12, x9, x8, le
6668 ; -O0:    ldaxr x8, [x11]
6669 ; -O0:    cmp x8, x9
6670 ; -O0:    stlxr w10, x12, [x11]
6671 ; -O0:    subs x9, x8, x9
6672 ; -O0:    subs w9, w9, #1
6674 ; -O1-LABEL: atomicrmw_min_i64_aligned_release:
6675 ; -O1:    ldxr x0, [x8]
6676 ; -O1:    cmp x0, x1
6677 ; -O1:    csel x9, x0, x1, le
6678 ; -O1:    stlxr w10, x9, [x8]
6679     %r = atomicrmw min ptr %ptr, i64 %value release, align 8
6680     ret i64 %r
6683 define dso_local i64 @atomicrmw_min_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
6684 ; -O0-LABEL: atomicrmw_min_i64_aligned_acq_rel:
6685 ; -O0:    subs x10, x9, x8
6686 ; -O0:    csel x12, x9, x8, le
6687 ; -O0:    ldaxr x8, [x11]
6688 ; -O0:    cmp x8, x9
6689 ; -O0:    stlxr w10, x12, [x11]
6690 ; -O0:    subs x9, x8, x9
6691 ; -O0:    subs w9, w9, #1
6693 ; -O1-LABEL: atomicrmw_min_i64_aligned_acq_rel:
6694 ; -O1:    ldaxr x0, [x8]
6695 ; -O1:    cmp x0, x1
6696 ; -O1:    csel x9, x0, x1, le
6697 ; -O1:    stlxr w10, x9, [x8]
6698     %r = atomicrmw min ptr %ptr, i64 %value acq_rel, align 8
6699     ret i64 %r
6702 define dso_local i64 @atomicrmw_min_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
6703 ; -O0-LABEL: atomicrmw_min_i64_aligned_seq_cst:
6704 ; -O0:    subs x10, x9, x8
6705 ; -O0:    csel x12, x9, x8, le
6706 ; -O0:    ldaxr x8, [x11]
6707 ; -O0:    cmp x8, x9
6708 ; -O0:    stlxr w10, x12, [x11]
6709 ; -O0:    subs x9, x8, x9
6710 ; -O0:    subs w9, w9, #1
6712 ; -O1-LABEL: atomicrmw_min_i64_aligned_seq_cst:
6713 ; -O1:    ldaxr x0, [x8]
6714 ; -O1:    cmp x0, x1
6715 ; -O1:    csel x9, x0, x1, le
6716 ; -O1:    stlxr w10, x9, [x8]
6717     %r = atomicrmw min ptr %ptr, i64 %value seq_cst, align 8
6718     ret i64 %r
6721 define dso_local i128 @atomicrmw_min_i128_aligned_monotonic(ptr %ptr, i128 %value) {
6722 ; -O0-LABEL: atomicrmw_min_i128_aligned_monotonic:
6723 ; -O0:    subs x12, x8, x11
6724 ; -O0:    csel x15, x13, x10, ge
6725 ; -O0:    csel x14, x11, x8, ge
6726 ; -O0:    ldxp x10, x12, [x9]
6727 ; -O0:    cmp x10, x11
6728 ; -O0:    cmp x12, x13
6729 ; -O0:    stxp w8, x14, x15, [x9]
6730 ; -O0:    stxp w8, x10, x12, [x9]
6731 ; -O0:    subs x12, x12, x13
6732 ; -O0:    ccmp x10, x11, #0, eq
6734 ; -O1-LABEL: atomicrmw_min_i128_aligned_monotonic:
6735 ; -O1:    ldxp x1, x0, [x8]
6736 ; -O1:    cmp x3, x1
6737 ; -O1:    csel x9, x0, x2, ge
6738 ; -O1:    csel x10, x1, x3, ge
6739 ; -O1:    stxp w11, x10, x9, [x8]
6740     %r = atomicrmw min ptr %ptr, i128 %value monotonic, align 16
6741     ret i128 %r
6744 define dso_local i128 @atomicrmw_min_i128_aligned_acquire(ptr %ptr, i128 %value) {
6745 ; -O0-LABEL: atomicrmw_min_i128_aligned_acquire:
6746 ; -O0:    subs x12, x8, x11
6747 ; -O0:    csel x15, x13, x10, ge
6748 ; -O0:    csel x14, x11, x8, ge
6749 ; -O0:    ldaxp x10, x12, [x9]
6750 ; -O0:    cmp x10, x11
6751 ; -O0:    cmp x12, x13
6752 ; -O0:    stxp w8, x14, x15, [x9]
6753 ; -O0:    stxp w8, x10, x12, [x9]
6754 ; -O0:    subs x12, x12, x13
6755 ; -O0:    ccmp x10, x11, #0, eq
6757 ; -O1-LABEL: atomicrmw_min_i128_aligned_acquire:
6758 ; -O1:    ldaxp x1, x0, [x8]
6759 ; -O1:    cmp x3, x1
6760 ; -O1:    csel x9, x0, x2, ge
6761 ; -O1:    csel x10, x1, x3, ge
6762 ; -O1:    stxp w11, x10, x9, [x8]
6763     %r = atomicrmw min ptr %ptr, i128 %value acquire, align 16
6764     ret i128 %r
6767 define dso_local i128 @atomicrmw_min_i128_aligned_release(ptr %ptr, i128 %value) {
6768 ; -O0-LABEL: atomicrmw_min_i128_aligned_release:
6769 ; -O0:    subs x12, x8, x11
6770 ; -O0:    csel x15, x13, x10, ge
6771 ; -O0:    csel x14, x11, x8, ge
6772 ; -O0:    ldxp x10, x12, [x9]
6773 ; -O0:    cmp x10, x11
6774 ; -O0:    cmp x12, x13
6775 ; -O0:    stlxp w8, x14, x15, [x9]
6776 ; -O0:    stlxp w8, x10, x12, [x9]
6777 ; -O0:    subs x12, x12, x13
6778 ; -O0:    ccmp x10, x11, #0, eq
6780 ; -O1-LABEL: atomicrmw_min_i128_aligned_release:
6781 ; -O1:    ldxp x1, x0, [x8]
6782 ; -O1:    cmp x3, x1
6783 ; -O1:    csel x9, x0, x2, ge
6784 ; -O1:    csel x10, x1, x3, ge
6785 ; -O1:    stlxp w11, x10, x9, [x8]
6786     %r = atomicrmw min ptr %ptr, i128 %value release, align 16
6787     ret i128 %r
6790 define dso_local i128 @atomicrmw_min_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
6791 ; -O0-LABEL: atomicrmw_min_i128_aligned_acq_rel:
6792 ; -O0:    subs x12, x8, x11
6793 ; -O0:    csel x15, x13, x10, ge
6794 ; -O0:    csel x14, x11, x8, ge
6795 ; -O0:    ldaxp x10, x12, [x9]
6796 ; -O0:    cmp x10, x11
6797 ; -O0:    cmp x12, x13
6798 ; -O0:    stlxp w8, x14, x15, [x9]
6799 ; -O0:    stlxp w8, x10, x12, [x9]
6800 ; -O0:    subs x12, x12, x13
6801 ; -O0:    ccmp x10, x11, #0, eq
6803 ; -O1-LABEL: atomicrmw_min_i128_aligned_acq_rel:
6804 ; -O1:    ldaxp x1, x0, [x8]
6805 ; -O1:    cmp x3, x1
6806 ; -O1:    csel x9, x0, x2, ge
6807 ; -O1:    csel x10, x1, x3, ge
6808 ; -O1:    stlxp w11, x10, x9, [x8]
6809     %r = atomicrmw min ptr %ptr, i128 %value acq_rel, align 16
6810     ret i128 %r
6813 define dso_local i128 @atomicrmw_min_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
6814 ; -O0-LABEL: atomicrmw_min_i128_aligned_seq_cst:
6815 ; -O0:    subs x12, x8, x11
6816 ; -O0:    csel x15, x13, x10, ge
6817 ; -O0:    csel x14, x11, x8, ge
6818 ; -O0:    ldaxp x10, x12, [x9]
6819 ; -O0:    cmp x10, x11
6820 ; -O0:    cmp x12, x13
6821 ; -O0:    stlxp w8, x14, x15, [x9]
6822 ; -O0:    stlxp w8, x10, x12, [x9]
6823 ; -O0:    subs x12, x12, x13
6824 ; -O0:    ccmp x10, x11, #0, eq
6826 ; -O1-LABEL: atomicrmw_min_i128_aligned_seq_cst:
6827 ; -O1:    ldaxp x1, x0, [x8]
6828 ; -O1:    cmp x3, x1
6829 ; -O1:    csel x9, x0, x2, ge
6830 ; -O1:    csel x10, x1, x3, ge
6831 ; -O1:    stlxp w11, x10, x9, [x8]
6832     %r = atomicrmw min ptr %ptr, i128 %value seq_cst, align 16
6833     ret i128 %r
6836 define dso_local i8 @atomicrmw_min_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
6837 ; -O0-LABEL: atomicrmw_min_i8_unaligned_monotonic:
6838 ; -O0:    sxtb w10, w9
6839 ; -O0:    subs w10, w10, w8, sxtb
6840 ; -O0:    csel w12, w9, w8, le
6841 ; -O0:    ldaxrb w8, [x11]
6842 ; -O0:    cmp w8, w9, uxtb
6843 ; -O0:    stlxrb w10, w12, [x11]
6844 ; -O0:    subs w9, w8, w9, uxtb
6845 ; -O0:    subs w9, w9, #1
6847 ; -O1-LABEL: atomicrmw_min_i8_unaligned_monotonic:
6848 ; -O1:    ldxrb w9, [x0]
6849 ; -O1:    sxtb w8, w9
6850 ; -O1:    cmp w8, w1, sxtb
6851 ; -O1:    csel w9, w9, w1, le
6852 ; -O1:    stxrb w10, w9, [x0]
6853     %r = atomicrmw min ptr %ptr, i8 %value monotonic, align 1
6854     ret i8 %r
6857 define dso_local i8 @atomicrmw_min_i8_unaligned_acquire(ptr %ptr, i8 %value) {
6858 ; -O0-LABEL: atomicrmw_min_i8_unaligned_acquire:
6859 ; -O0:    sxtb w10, w9
6860 ; -O0:    subs w10, w10, w8, sxtb
6861 ; -O0:    csel w12, w9, w8, le
6862 ; -O0:    ldaxrb w8, [x11]
6863 ; -O0:    cmp w8, w9, uxtb
6864 ; -O0:    stlxrb w10, w12, [x11]
6865 ; -O0:    subs w9, w8, w9, uxtb
6866 ; -O0:    subs w9, w9, #1
6868 ; -O1-LABEL: atomicrmw_min_i8_unaligned_acquire:
6869 ; -O1:    ldaxrb w9, [x0]
6870 ; -O1:    sxtb w8, w9
6871 ; -O1:    cmp w8, w1, sxtb
6872 ; -O1:    csel w9, w9, w1, le
6873 ; -O1:    stxrb w10, w9, [x0]
6874     %r = atomicrmw min ptr %ptr, i8 %value acquire, align 1
6875     ret i8 %r
6878 define dso_local i8 @atomicrmw_min_i8_unaligned_release(ptr %ptr, i8 %value) {
6879 ; -O0-LABEL: atomicrmw_min_i8_unaligned_release:
6880 ; -O0:    sxtb w10, w9
6881 ; -O0:    subs w10, w10, w8, sxtb
6882 ; -O0:    csel w12, w9, w8, le
6883 ; -O0:    ldaxrb w8, [x11]
6884 ; -O0:    cmp w8, w9, uxtb
6885 ; -O0:    stlxrb w10, w12, [x11]
6886 ; -O0:    subs w9, w8, w9, uxtb
6887 ; -O0:    subs w9, w9, #1
6889 ; -O1-LABEL: atomicrmw_min_i8_unaligned_release:
6890 ; -O1:    ldxrb w9, [x0]
6891 ; -O1:    sxtb w8, w9
6892 ; -O1:    cmp w8, w1, sxtb
6893 ; -O1:    csel w9, w9, w1, le
6894 ; -O1:    stlxrb w10, w9, [x0]
6895     %r = atomicrmw min ptr %ptr, i8 %value release, align 1
6896     ret i8 %r
6899 define dso_local i8 @atomicrmw_min_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
6900 ; -O0-LABEL: atomicrmw_min_i8_unaligned_acq_rel:
6901 ; -O0:    sxtb w10, w9
6902 ; -O0:    subs w10, w10, w8, sxtb
6903 ; -O0:    csel w12, w9, w8, le
6904 ; -O0:    ldaxrb w8, [x11]
6905 ; -O0:    cmp w8, w9, uxtb
6906 ; -O0:    stlxrb w10, w12, [x11]
6907 ; -O0:    subs w9, w8, w9, uxtb
6908 ; -O0:    subs w9, w9, #1
6910 ; -O1-LABEL: atomicrmw_min_i8_unaligned_acq_rel:
6911 ; -O1:    ldaxrb w9, [x0]
6912 ; -O1:    sxtb w8, w9
6913 ; -O1:    cmp w8, w1, sxtb
6914 ; -O1:    csel w9, w9, w1, le
6915 ; -O1:    stlxrb w10, w9, [x0]
6916     %r = atomicrmw min ptr %ptr, i8 %value acq_rel, align 1
6917     ret i8 %r
6920 define dso_local i8 @atomicrmw_min_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
6921 ; -O0-LABEL: atomicrmw_min_i8_unaligned_seq_cst:
6922 ; -O0:    sxtb w10, w9
6923 ; -O0:    subs w10, w10, w8, sxtb
6924 ; -O0:    csel w12, w9, w8, le
6925 ; -O0:    ldaxrb w8, [x11]
6926 ; -O0:    cmp w8, w9, uxtb
6927 ; -O0:    stlxrb w10, w12, [x11]
6928 ; -O0:    subs w9, w8, w9, uxtb
6929 ; -O0:    subs w9, w9, #1
6931 ; -O1-LABEL: atomicrmw_min_i8_unaligned_seq_cst:
6932 ; -O1:    ldaxrb w9, [x0]
6933 ; -O1:    sxtb w8, w9
6934 ; -O1:    cmp w8, w1, sxtb
6935 ; -O1:    csel w9, w9, w1, le
6936 ; -O1:    stlxrb w10, w9, [x0]
6937     %r = atomicrmw min ptr %ptr, i8 %value seq_cst, align 1
6938     ret i8 %r
6941 define dso_local i16 @atomicrmw_min_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
6942 ; -O0-LABEL: atomicrmw_min_i16_unaligned_monotonic:
6943 ; -O0:    sxth w10, w9
6944 ; -O0:    subs w10, w10, w8, sxth
6945 ; -O0:    csel w8, w9, w8, le
6946 ; -O0:    bl __atomic_compare_exchange
6948 ; -O1-LABEL: atomicrmw_min_i16_unaligned_monotonic:
6949 ; -O1:    sxth w8, w0
6950 ; -O1:    cmp w8, w20, sxth
6951 ; -O1:    csel w8, w0, w20, le
6952 ; -O1:    bl __atomic_compare_exchange
6953     %r = atomicrmw min ptr %ptr, i16 %value monotonic, align 1
6954     ret i16 %r
6957 define dso_local i16 @atomicrmw_min_i16_unaligned_acquire(ptr %ptr, i16 %value) {
6958 ; -O0-LABEL: atomicrmw_min_i16_unaligned_acquire:
6959 ; -O0:    sxth w10, w9
6960 ; -O0:    subs w10, w10, w8, sxth
6961 ; -O0:    csel w8, w9, w8, le
6962 ; -O0:    bl __atomic_compare_exchange
6964 ; -O1-LABEL: atomicrmw_min_i16_unaligned_acquire:
6965 ; -O1:    sxth w8, w0
6966 ; -O1:    cmp w8, w20, sxth
6967 ; -O1:    csel w8, w0, w20, le
6968 ; -O1:    bl __atomic_compare_exchange
6969     %r = atomicrmw min ptr %ptr, i16 %value acquire, align 1
6970     ret i16 %r
6973 define dso_local i16 @atomicrmw_min_i16_unaligned_release(ptr %ptr, i16 %value) {
6974 ; -O0-LABEL: atomicrmw_min_i16_unaligned_release:
6975 ; -O0:    sxth w10, w9
6976 ; -O0:    subs w10, w10, w8, sxth
6977 ; -O0:    csel w8, w9, w8, le
6978 ; -O0:    bl __atomic_compare_exchange
6980 ; -O1-LABEL: atomicrmw_min_i16_unaligned_release:
6981 ; -O1:    sxth w8, w0
6982 ; -O1:    cmp w8, w20, sxth
6983 ; -O1:    csel w8, w0, w20, le
6984 ; -O1:    bl __atomic_compare_exchange
6985     %r = atomicrmw min ptr %ptr, i16 %value release, align 1
6986     ret i16 %r
6989 define dso_local i16 @atomicrmw_min_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
6990 ; -O0-LABEL: atomicrmw_min_i16_unaligned_acq_rel:
6991 ; -O0:    sxth w10, w9
6992 ; -O0:    subs w10, w10, w8, sxth
6993 ; -O0:    csel w8, w9, w8, le
6994 ; -O0:    bl __atomic_compare_exchange
6996 ; -O1-LABEL: atomicrmw_min_i16_unaligned_acq_rel:
6997 ; -O1:    sxth w8, w0
6998 ; -O1:    cmp w8, w20, sxth
6999 ; -O1:    csel w8, w0, w20, le
7000 ; -O1:    bl __atomic_compare_exchange
7001     %r = atomicrmw min ptr %ptr, i16 %value acq_rel, align 1
7002     ret i16 %r
7005 define dso_local i16 @atomicrmw_min_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
7006 ; -O0-LABEL: atomicrmw_min_i16_unaligned_seq_cst:
7007 ; -O0:    sxth w10, w9
7008 ; -O0:    subs w10, w10, w8, sxth
7009 ; -O0:    csel w8, w9, w8, le
7010 ; -O0:    bl __atomic_compare_exchange
7012 ; -O1-LABEL: atomicrmw_min_i16_unaligned_seq_cst:
7013 ; -O1:    sxth w8, w0
7014 ; -O1:    cmp w8, w20, sxth
7015 ; -O1:    csel w8, w0, w20, le
7016 ; -O1:    bl __atomic_compare_exchange
7017     %r = atomicrmw min ptr %ptr, i16 %value seq_cst, align 1
7018     ret i16 %r
7021 define dso_local i32 @atomicrmw_min_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
7022 ; -O0-LABEL: atomicrmw_min_i32_unaligned_monotonic:
7023 ; -O0:    subs w10, w9, w8
7024 ; -O0:    csel w8, w9, w8, le
7025 ; -O0:    bl __atomic_compare_exchange
7027 ; -O1-LABEL: atomicrmw_min_i32_unaligned_monotonic:
7028 ; -O1:    cmp w0, w20
7029 ; -O1:    csel w8, w0, w20, le
7030 ; -O1:    bl __atomic_compare_exchange
7031     %r = atomicrmw min ptr %ptr, i32 %value monotonic, align 1
7032     ret i32 %r
7035 define dso_local i32 @atomicrmw_min_i32_unaligned_acquire(ptr %ptr, i32 %value) {
7036 ; -O0-LABEL: atomicrmw_min_i32_unaligned_acquire:
7037 ; -O0:    subs w10, w9, w8
7038 ; -O0:    csel w8, w9, w8, le
7039 ; -O0:    bl __atomic_compare_exchange
7041 ; -O1-LABEL: atomicrmw_min_i32_unaligned_acquire:
7042 ; -O1:    cmp w0, w20
7043 ; -O1:    csel w8, w0, w20, le
7044 ; -O1:    bl __atomic_compare_exchange
7045     %r = atomicrmw min ptr %ptr, i32 %value acquire, align 1
7046     ret i32 %r
7049 define dso_local i32 @atomicrmw_min_i32_unaligned_release(ptr %ptr, i32 %value) {
7050 ; -O0-LABEL: atomicrmw_min_i32_unaligned_release:
7051 ; -O0:    subs w10, w9, w8
7052 ; -O0:    csel w8, w9, w8, le
7053 ; -O0:    bl __atomic_compare_exchange
7055 ; -O1-LABEL: atomicrmw_min_i32_unaligned_release:
7056 ; -O1:    cmp w0, w20
7057 ; -O1:    csel w8, w0, w20, le
7058 ; -O1:    bl __atomic_compare_exchange
7059     %r = atomicrmw min ptr %ptr, i32 %value release, align 1
7060     ret i32 %r
7063 define dso_local i32 @atomicrmw_min_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
7064 ; -O0-LABEL: atomicrmw_min_i32_unaligned_acq_rel:
7065 ; -O0:    subs w10, w9, w8
7066 ; -O0:    csel w8, w9, w8, le
7067 ; -O0:    bl __atomic_compare_exchange
7069 ; -O1-LABEL: atomicrmw_min_i32_unaligned_acq_rel:
7070 ; -O1:    cmp w0, w20
7071 ; -O1:    csel w8, w0, w20, le
7072 ; -O1:    bl __atomic_compare_exchange
7073     %r = atomicrmw min ptr %ptr, i32 %value acq_rel, align 1
7074     ret i32 %r
7077 define dso_local i32 @atomicrmw_min_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
7078 ; -O0-LABEL: atomicrmw_min_i32_unaligned_seq_cst:
7079 ; -O0:    subs w10, w9, w8
7080 ; -O0:    csel w8, w9, w8, le
7081 ; -O0:    bl __atomic_compare_exchange
7083 ; -O1-LABEL: atomicrmw_min_i32_unaligned_seq_cst:
7084 ; -O1:    cmp w0, w20
7085 ; -O1:    csel w8, w0, w20, le
7086 ; -O1:    bl __atomic_compare_exchange
7087     %r = atomicrmw min ptr %ptr, i32 %value seq_cst, align 1
7088     ret i32 %r
7091 define dso_local i64 @atomicrmw_min_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
7092 ; -O0-LABEL: atomicrmw_min_i64_unaligned_monotonic:
7093 ; -O0:    subs x10, x9, x8
7094 ; -O0:    csel x8, x9, x8, le
7095 ; -O0:    bl __atomic_compare_exchange
7097 ; -O1-LABEL: atomicrmw_min_i64_unaligned_monotonic:
7098 ; -O1:    cmp x0, x20
7099 ; -O1:    csel x8, x0, x20, le
7100 ; -O1:    bl __atomic_compare_exchange
7101     %r = atomicrmw min ptr %ptr, i64 %value monotonic, align 1
7102     ret i64 %r
7105 define dso_local i64 @atomicrmw_min_i64_unaligned_acquire(ptr %ptr, i64 %value) {
7106 ; -O0-LABEL: atomicrmw_min_i64_unaligned_acquire:
7107 ; -O0:    subs x10, x9, x8
7108 ; -O0:    csel x8, x9, x8, le
7109 ; -O0:    bl __atomic_compare_exchange
7111 ; -O1-LABEL: atomicrmw_min_i64_unaligned_acquire:
7112 ; -O1:    cmp x0, x20
7113 ; -O1:    csel x8, x0, x20, le
7114 ; -O1:    bl __atomic_compare_exchange
7115     %r = atomicrmw min ptr %ptr, i64 %value acquire, align 1
7116     ret i64 %r
7119 define dso_local i64 @atomicrmw_min_i64_unaligned_release(ptr %ptr, i64 %value) {
7120 ; -O0-LABEL: atomicrmw_min_i64_unaligned_release:
7121 ; -O0:    subs x10, x9, x8
7122 ; -O0:    csel x8, x9, x8, le
7123 ; -O0:    bl __atomic_compare_exchange
7125 ; -O1-LABEL: atomicrmw_min_i64_unaligned_release:
7126 ; -O1:    cmp x0, x20
7127 ; -O1:    csel x8, x0, x20, le
7128 ; -O1:    bl __atomic_compare_exchange
7129     %r = atomicrmw min ptr %ptr, i64 %value release, align 1
7130     ret i64 %r
7133 define dso_local i64 @atomicrmw_min_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
7134 ; -O0-LABEL: atomicrmw_min_i64_unaligned_acq_rel:
7135 ; -O0:    subs x10, x9, x8
7136 ; -O0:    csel x8, x9, x8, le
7137 ; -O0:    bl __atomic_compare_exchange
7139 ; -O1-LABEL: atomicrmw_min_i64_unaligned_acq_rel:
7140 ; -O1:    cmp x0, x20
7141 ; -O1:    csel x8, x0, x20, le
7142 ; -O1:    bl __atomic_compare_exchange
7143     %r = atomicrmw min ptr %ptr, i64 %value acq_rel, align 1
7144     ret i64 %r
7147 define dso_local i64 @atomicrmw_min_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
7148 ; -O0-LABEL: atomicrmw_min_i64_unaligned_seq_cst:
7149 ; -O0:    subs x10, x9, x8
7150 ; -O0:    csel x8, x9, x8, le
7151 ; -O0:    bl __atomic_compare_exchange
7153 ; -O1-LABEL: atomicrmw_min_i64_unaligned_seq_cst:
7154 ; -O1:    cmp x0, x20
7155 ; -O1:    csel x8, x0, x20, le
7156 ; -O1:    bl __atomic_compare_exchange
7157     %r = atomicrmw min ptr %ptr, i64 %value seq_cst, align 1
7158     ret i64 %r
7161 define dso_local i128 @atomicrmw_min_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
7162 ; -O0-LABEL: atomicrmw_min_i128_unaligned_monotonic:
7163 ; -O0:    subs x12, x9, x10
7164 ; -O0:    csel x8, x11, x8, ge
7165 ; -O0:    csel x9, x10, x9, ge
7166 ; -O0:    bl __atomic_compare_exchange
7168 ; -O1-LABEL: atomicrmw_min_i128_unaligned_monotonic:
7169 ; -O1:    ldp x0, x1, [x0]
7170 ; -O1:    cmp x19, x1
7171 ; -O1:    csel x8, x1, x19, ge
7172 ; -O1:    csel x9, x0, x21, ge
7173 ; -O1:    bl __atomic_compare_exchange
7174     %r = atomicrmw min ptr %ptr, i128 %value monotonic, align 1
7175     ret i128 %r
7178 define dso_local i128 @atomicrmw_min_i128_unaligned_acquire(ptr %ptr, i128 %value) {
7179 ; -O0-LABEL: atomicrmw_min_i128_unaligned_acquire:
7180 ; -O0:    subs x12, x9, x10
7181 ; -O0:    csel x8, x11, x8, ge
7182 ; -O0:    csel x9, x10, x9, ge
7183 ; -O0:    bl __atomic_compare_exchange
7185 ; -O1-LABEL: atomicrmw_min_i128_unaligned_acquire:
7186 ; -O1:    ldp x0, x1, [x0]
7187 ; -O1:    cmp x19, x1
7188 ; -O1:    csel x8, x1, x19, ge
7189 ; -O1:    csel x9, x0, x21, ge
7190 ; -O1:    bl __atomic_compare_exchange
7191     %r = atomicrmw min ptr %ptr, i128 %value acquire, align 1
7192     ret i128 %r
7195 define dso_local i128 @atomicrmw_min_i128_unaligned_release(ptr %ptr, i128 %value) {
7196 ; -O0-LABEL: atomicrmw_min_i128_unaligned_release:
7197 ; -O0:    subs x12, x9, x10
7198 ; -O0:    csel x8, x11, x8, ge
7199 ; -O0:    csel x9, x10, x9, ge
7200 ; -O0:    bl __atomic_compare_exchange
7202 ; -O1-LABEL: atomicrmw_min_i128_unaligned_release:
7203 ; -O1:    ldp x0, x1, [x0]
7204 ; -O1:    cmp x19, x1
7205 ; -O1:    csel x8, x1, x19, ge
7206 ; -O1:    csel x9, x0, x21, ge
7207 ; -O1:    bl __atomic_compare_exchange
7208     %r = atomicrmw min ptr %ptr, i128 %value release, align 1
7209     ret i128 %r
7212 define dso_local i128 @atomicrmw_min_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
7213 ; -O0-LABEL: atomicrmw_min_i128_unaligned_acq_rel:
7214 ; -O0:    subs x12, x9, x10
7215 ; -O0:    csel x8, x11, x8, ge
7216 ; -O0:    csel x9, x10, x9, ge
7217 ; -O0:    bl __atomic_compare_exchange
7219 ; -O1-LABEL: atomicrmw_min_i128_unaligned_acq_rel:
7220 ; -O1:    ldp x0, x1, [x0]
7221 ; -O1:    cmp x19, x1
7222 ; -O1:    csel x8, x1, x19, ge
7223 ; -O1:    csel x9, x0, x21, ge
7224 ; -O1:    bl __atomic_compare_exchange
7225     %r = atomicrmw min ptr %ptr, i128 %value acq_rel, align 1
7226     ret i128 %r
7229 define dso_local i128 @atomicrmw_min_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
7230 ; -O0-LABEL: atomicrmw_min_i128_unaligned_seq_cst:
7231 ; -O0:    subs x12, x9, x10
7232 ; -O0:    csel x8, x11, x8, ge
7233 ; -O0:    csel x9, x10, x9, ge
7234 ; -O0:    bl __atomic_compare_exchange
7236 ; -O1-LABEL: atomicrmw_min_i128_unaligned_seq_cst:
7237 ; -O1:    ldp x0, x1, [x0]
7238 ; -O1:    cmp x19, x1
7239 ; -O1:    csel x8, x1, x19, ge
7240 ; -O1:    csel x9, x0, x21, ge
7241 ; -O1:    bl __atomic_compare_exchange
7242     %r = atomicrmw min ptr %ptr, i128 %value seq_cst, align 1
7243     ret i128 %r
7246 define dso_local i8 @atomicrmw_umax_i8_aligned_monotonic(ptr %ptr, i8 %value) {
7247 ; -O0-LABEL: atomicrmw_umax_i8_aligned_monotonic:
7248 ; -O0:    and w9, w12, #0xff
7249 ; -O0:    subs w10, w9, w8, uxtb
7250 ; -O0:    csel w13, w12, w8, hi
7251 ; -O0:    ldaxrb w8, [x11]
7252 ; -O0:    cmp w8, w12, uxtb
7253 ; -O0:    stlxrb w10, w13, [x11]
7254 ; -O0:    subs w9, w8, w9
7255 ; -O0:    subs w9, w9, #1
7257 ; -O1-LABEL: atomicrmw_umax_i8_aligned_monotonic:
7258 ; -O1:    and w9, w1, #0xff
7259 ; -O1:    ldxrb w8, [x0]
7260 ; -O1:    cmp w8, w9
7261 ; -O1:    csel w10, w8, w9, hi
7262 ; -O1:    stxrb w11, w10, [x0]
7263     %r = atomicrmw umax ptr %ptr, i8 %value monotonic, align 1
7264     ret i8 %r
7267 define dso_local i8 @atomicrmw_umax_i8_aligned_acquire(ptr %ptr, i8 %value) {
7268 ; -O0-LABEL: atomicrmw_umax_i8_aligned_acquire:
7269 ; -O0:    and w9, w12, #0xff
7270 ; -O0:    subs w10, w9, w8, uxtb
7271 ; -O0:    csel w13, w12, w8, hi
7272 ; -O0:    ldaxrb w8, [x11]
7273 ; -O0:    cmp w8, w12, uxtb
7274 ; -O0:    stlxrb w10, w13, [x11]
7275 ; -O0:    subs w9, w8, w9
7276 ; -O0:    subs w9, w9, #1
7278 ; -O1-LABEL: atomicrmw_umax_i8_aligned_acquire:
7279 ; -O1:    and w9, w1, #0xff
7280 ; -O1:    ldaxrb w8, [x0]
7281 ; -O1:    cmp w8, w9
7282 ; -O1:    csel w10, w8, w9, hi
7283 ; -O1:    stxrb w11, w10, [x0]
7284     %r = atomicrmw umax ptr %ptr, i8 %value acquire, align 1
7285     ret i8 %r
7288 define dso_local i8 @atomicrmw_umax_i8_aligned_release(ptr %ptr, i8 %value) {
7289 ; -O0-LABEL: atomicrmw_umax_i8_aligned_release:
7290 ; -O0:    and w9, w12, #0xff
7291 ; -O0:    subs w10, w9, w8, uxtb
7292 ; -O0:    csel w13, w12, w8, hi
7293 ; -O0:    ldaxrb w8, [x11]
7294 ; -O0:    cmp w8, w12, uxtb
7295 ; -O0:    stlxrb w10, w13, [x11]
7296 ; -O0:    subs w9, w8, w9
7297 ; -O0:    subs w9, w9, #1
7299 ; -O1-LABEL: atomicrmw_umax_i8_aligned_release:
7300 ; -O1:    and w9, w1, #0xff
7301 ; -O1:    ldxrb w8, [x0]
7302 ; -O1:    cmp w8, w9
7303 ; -O1:    csel w10, w8, w9, hi
7304 ; -O1:    stlxrb w11, w10, [x0]
7305     %r = atomicrmw umax ptr %ptr, i8 %value release, align 1
7306     ret i8 %r
7309 define dso_local i8 @atomicrmw_umax_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
7310 ; -O0-LABEL: atomicrmw_umax_i8_aligned_acq_rel:
7311 ; -O0:    and w9, w12, #0xff
7312 ; -O0:    subs w10, w9, w8, uxtb
7313 ; -O0:    csel w13, w12, w8, hi
7314 ; -O0:    ldaxrb w8, [x11]
7315 ; -O0:    cmp w8, w12, uxtb
7316 ; -O0:    stlxrb w10, w13, [x11]
7317 ; -O0:    subs w9, w8, w9
7318 ; -O0:    subs w9, w9, #1
7320 ; -O1-LABEL: atomicrmw_umax_i8_aligned_acq_rel:
7321 ; -O1:    and w9, w1, #0xff
7322 ; -O1:    ldaxrb w8, [x0]
7323 ; -O1:    cmp w8, w9
7324 ; -O1:    csel w10, w8, w9, hi
7325 ; -O1:    stlxrb w11, w10, [x0]
7326     %r = atomicrmw umax ptr %ptr, i8 %value acq_rel, align 1
7327     ret i8 %r
7330 define dso_local i8 @atomicrmw_umax_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
7331 ; -O0-LABEL: atomicrmw_umax_i8_aligned_seq_cst:
7332 ; -O0:    and w9, w12, #0xff
7333 ; -O0:    subs w10, w9, w8, uxtb
7334 ; -O0:    csel w13, w12, w8, hi
7335 ; -O0:    ldaxrb w8, [x11]
7336 ; -O0:    cmp w8, w12, uxtb
7337 ; -O0:    stlxrb w10, w13, [x11]
7338 ; -O0:    subs w9, w8, w9
7339 ; -O0:    subs w9, w9, #1
7341 ; -O1-LABEL: atomicrmw_umax_i8_aligned_seq_cst:
7342 ; -O1:    and w9, w1, #0xff
7343 ; -O1:    ldaxrb w8, [x0]
7344 ; -O1:    cmp w8, w9
7345 ; -O1:    csel w10, w8, w9, hi
7346 ; -O1:    stlxrb w11, w10, [x0]
7347     %r = atomicrmw umax ptr %ptr, i8 %value seq_cst, align 1
7348     ret i8 %r
7351 define dso_local i16 @atomicrmw_umax_i16_aligned_monotonic(ptr %ptr, i16 %value) {
7352 ; -O0-LABEL: atomicrmw_umax_i16_aligned_monotonic:
7353 ; -O0:    and w9, w12, #0xffff
7354 ; -O0:    subs w10, w9, w8, uxth
7355 ; -O0:    csel w13, w12, w8, hi
7356 ; -O0:    ldaxrh w8, [x11]
7357 ; -O0:    cmp w8, w12, uxth
7358 ; -O0:    stlxrh w10, w13, [x11]
7359 ; -O0:    subs w9, w8, w9
7360 ; -O0:    subs w9, w9, #1
7362 ; -O1-LABEL: atomicrmw_umax_i16_aligned_monotonic:
7363 ; -O1:    and w9, w1, #0xffff
7364 ; -O1:    ldxrh w8, [x0]
7365 ; -O1:    cmp w8, w9
7366 ; -O1:    csel w10, w8, w9, hi
7367 ; -O1:    stxrh w11, w10, [x0]
7368     %r = atomicrmw umax ptr %ptr, i16 %value monotonic, align 2
7369     ret i16 %r
7372 define dso_local i16 @atomicrmw_umax_i16_aligned_acquire(ptr %ptr, i16 %value) {
7373 ; -O0-LABEL: atomicrmw_umax_i16_aligned_acquire:
7374 ; -O0:    and w9, w12, #0xffff
7375 ; -O0:    subs w10, w9, w8, uxth
7376 ; -O0:    csel w13, w12, w8, hi
7377 ; -O0:    ldaxrh w8, [x11]
7378 ; -O0:    cmp w8, w12, uxth
7379 ; -O0:    stlxrh w10, w13, [x11]
7380 ; -O0:    subs w9, w8, w9
7381 ; -O0:    subs w9, w9, #1
7383 ; -O1-LABEL: atomicrmw_umax_i16_aligned_acquire:
7384 ; -O1:    and w9, w1, #0xffff
7385 ; -O1:    ldaxrh w8, [x0]
7386 ; -O1:    cmp w8, w9
7387 ; -O1:    csel w10, w8, w9, hi
7388 ; -O1:    stxrh w11, w10, [x0]
7389     %r = atomicrmw umax ptr %ptr, i16 %value acquire, align 2
7390     ret i16 %r
7393 define dso_local i16 @atomicrmw_umax_i16_aligned_release(ptr %ptr, i16 %value) {
7394 ; -O0-LABEL: atomicrmw_umax_i16_aligned_release:
7395 ; -O0:    and w9, w12, #0xffff
7396 ; -O0:    subs w10, w9, w8, uxth
7397 ; -O0:    csel w13, w12, w8, hi
7398 ; -O0:    ldaxrh w8, [x11]
7399 ; -O0:    cmp w8, w12, uxth
7400 ; -O0:    stlxrh w10, w13, [x11]
7401 ; -O0:    subs w9, w8, w9
7402 ; -O0:    subs w9, w9, #1
7404 ; -O1-LABEL: atomicrmw_umax_i16_aligned_release:
7405 ; -O1:    and w9, w1, #0xffff
7406 ; -O1:    ldxrh w8, [x0]
7407 ; -O1:    cmp w8, w9
7408 ; -O1:    csel w10, w8, w9, hi
7409 ; -O1:    stlxrh w11, w10, [x0]
7410     %r = atomicrmw umax ptr %ptr, i16 %value release, align 2
7411     ret i16 %r
7414 define dso_local i16 @atomicrmw_umax_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
7415 ; -O0-LABEL: atomicrmw_umax_i16_aligned_acq_rel:
7416 ; -O0:    and w9, w12, #0xffff
7417 ; -O0:    subs w10, w9, w8, uxth
7418 ; -O0:    csel w13, w12, w8, hi
7419 ; -O0:    ldaxrh w8, [x11]
7420 ; -O0:    cmp w8, w12, uxth
7421 ; -O0:    stlxrh w10, w13, [x11]
7422 ; -O0:    subs w9, w8, w9
7423 ; -O0:    subs w9, w9, #1
7425 ; -O1-LABEL: atomicrmw_umax_i16_aligned_acq_rel:
7426 ; -O1:    and w9, w1, #0xffff
7427 ; -O1:    ldaxrh w8, [x0]
7428 ; -O1:    cmp w8, w9
7429 ; -O1:    csel w10, w8, w9, hi
7430 ; -O1:    stlxrh w11, w10, [x0]
7431     %r = atomicrmw umax ptr %ptr, i16 %value acq_rel, align 2
7432     ret i16 %r
7435 define dso_local i16 @atomicrmw_umax_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
7436 ; -O0-LABEL: atomicrmw_umax_i16_aligned_seq_cst:
7437 ; -O0:    and w9, w12, #0xffff
7438 ; -O0:    subs w10, w9, w8, uxth
7439 ; -O0:    csel w13, w12, w8, hi
7440 ; -O0:    ldaxrh w8, [x11]
7441 ; -O0:    cmp w8, w12, uxth
7442 ; -O0:    stlxrh w10, w13, [x11]
7443 ; -O0:    subs w9, w8, w9
7444 ; -O0:    subs w9, w9, #1
7446 ; -O1-LABEL: atomicrmw_umax_i16_aligned_seq_cst:
7447 ; -O1:    and w9, w1, #0xffff
7448 ; -O1:    ldaxrh w8, [x0]
7449 ; -O1:    cmp w8, w9
7450 ; -O1:    csel w10, w8, w9, hi
7451 ; -O1:    stlxrh w11, w10, [x0]
7452     %r = atomicrmw umax ptr %ptr, i16 %value seq_cst, align 2
7453     ret i16 %r
7456 define dso_local i32 @atomicrmw_umax_i32_aligned_monotonic(ptr %ptr, i32 %value) {
7457 ; -O0-LABEL: atomicrmw_umax_i32_aligned_monotonic:
7458 ; -O0:    subs w10, w9, w8
7459 ; -O0:    csel w12, w9, w8, hi
7460 ; -O0:    ldaxr w8, [x11]
7461 ; -O0:    cmp w8, w9
7462 ; -O0:    stlxr w10, w12, [x11]
7463 ; -O0:    subs w9, w8, w9
7464 ; -O0:    subs w9, w9, #1
7466 ; -O1-LABEL: atomicrmw_umax_i32_aligned_monotonic:
7467 ; -O1:    ldxr w8, [x0]
7468 ; -O1:    cmp w8, w1
7469 ; -O1:    csel w9, w8, w1, hi
7470 ; -O1:    stxr w10, w9, [x0]
7471     %r = atomicrmw umax ptr %ptr, i32 %value monotonic, align 4
7472     ret i32 %r
7475 define dso_local i32 @atomicrmw_umax_i32_aligned_acquire(ptr %ptr, i32 %value) {
7476 ; -O0-LABEL: atomicrmw_umax_i32_aligned_acquire:
7477 ; -O0:    subs w10, w9, w8
7478 ; -O0:    csel w12, w9, w8, hi
7479 ; -O0:    ldaxr w8, [x11]
7480 ; -O0:    cmp w8, w9
7481 ; -O0:    stlxr w10, w12, [x11]
7482 ; -O0:    subs w9, w8, w9
7483 ; -O0:    subs w9, w9, #1
7485 ; -O1-LABEL: atomicrmw_umax_i32_aligned_acquire:
7486 ; -O1:    ldaxr w8, [x0]
7487 ; -O1:    cmp w8, w1
7488 ; -O1:    csel w9, w8, w1, hi
7489 ; -O1:    stxr w10, w9, [x0]
7490     %r = atomicrmw umax ptr %ptr, i32 %value acquire, align 4
7491     ret i32 %r
7494 define dso_local i32 @atomicrmw_umax_i32_aligned_release(ptr %ptr, i32 %value) {
7495 ; -O0-LABEL: atomicrmw_umax_i32_aligned_release:
7496 ; -O0:    subs w10, w9, w8
7497 ; -O0:    csel w12, w9, w8, hi
7498 ; -O0:    ldaxr w8, [x11]
7499 ; -O0:    cmp w8, w9
7500 ; -O0:    stlxr w10, w12, [x11]
7501 ; -O0:    subs w9, w8, w9
7502 ; -O0:    subs w9, w9, #1
7504 ; -O1-LABEL: atomicrmw_umax_i32_aligned_release:
7505 ; -O1:    ldxr w8, [x0]
7506 ; -O1:    cmp w8, w1
7507 ; -O1:    csel w9, w8, w1, hi
7508 ; -O1:    stlxr w10, w9, [x0]
7509     %r = atomicrmw umax ptr %ptr, i32 %value release, align 4
7510     ret i32 %r
7513 define dso_local i32 @atomicrmw_umax_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
7514 ; -O0-LABEL: atomicrmw_umax_i32_aligned_acq_rel:
7515 ; -O0:    subs w10, w9, w8
7516 ; -O0:    csel w12, w9, w8, hi
7517 ; -O0:    ldaxr w8, [x11]
7518 ; -O0:    cmp w8, w9
7519 ; -O0:    stlxr w10, w12, [x11]
7520 ; -O0:    subs w9, w8, w9
7521 ; -O0:    subs w9, w9, #1
7523 ; -O1-LABEL: atomicrmw_umax_i32_aligned_acq_rel:
7524 ; -O1:    ldaxr w8, [x0]
7525 ; -O1:    cmp w8, w1
7526 ; -O1:    csel w9, w8, w1, hi
7527 ; -O1:    stlxr w10, w9, [x0]
7528     %r = atomicrmw umax ptr %ptr, i32 %value acq_rel, align 4
7529     ret i32 %r
7532 define dso_local i32 @atomicrmw_umax_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
7533 ; -O0-LABEL: atomicrmw_umax_i32_aligned_seq_cst:
7534 ; -O0:    subs w10, w9, w8
7535 ; -O0:    csel w12, w9, w8, hi
7536 ; -O0:    ldaxr w8, [x11]
7537 ; -O0:    cmp w8, w9
7538 ; -O0:    stlxr w10, w12, [x11]
7539 ; -O0:    subs w9, w8, w9
7540 ; -O0:    subs w9, w9, #1
7542 ; -O1-LABEL: atomicrmw_umax_i32_aligned_seq_cst:
7543 ; -O1:    ldaxr w8, [x0]
7544 ; -O1:    cmp w8, w1
7545 ; -O1:    csel w9, w8, w1, hi
7546 ; -O1:    stlxr w10, w9, [x0]
7547     %r = atomicrmw umax ptr %ptr, i32 %value seq_cst, align 4
7548     ret i32 %r
7551 define dso_local i64 @atomicrmw_umax_i64_aligned_monotonic(ptr %ptr, i64 %value) {
7552 ; -O0-LABEL: atomicrmw_umax_i64_aligned_monotonic:
7553 ; -O0:    subs x10, x9, x8
7554 ; -O0:    csel x12, x9, x8, hi
7555 ; -O0:    ldaxr x8, [x11]
7556 ; -O0:    cmp x8, x9
7557 ; -O0:    stlxr w10, x12, [x11]
7558 ; -O0:    subs x9, x8, x9
7559 ; -O0:    subs w9, w9, #1
7561 ; -O1-LABEL: atomicrmw_umax_i64_aligned_monotonic:
7562 ; -O1:    ldxr x0, [x8]
7563 ; -O1:    cmp x0, x1
7564 ; -O1:    csel x9, x0, x1, hi
7565 ; -O1:    stxr w10, x9, [x8]
7566     %r = atomicrmw umax ptr %ptr, i64 %value monotonic, align 8
7567     ret i64 %r
7570 define dso_local i64 @atomicrmw_umax_i64_aligned_acquire(ptr %ptr, i64 %value) {
7571 ; -O0-LABEL: atomicrmw_umax_i64_aligned_acquire:
7572 ; -O0:    subs x10, x9, x8
7573 ; -O0:    csel x12, x9, x8, hi
7574 ; -O0:    ldaxr x8, [x11]
7575 ; -O0:    cmp x8, x9
7576 ; -O0:    stlxr w10, x12, [x11]
7577 ; -O0:    subs x9, x8, x9
7578 ; -O0:    subs w9, w9, #1
7580 ; -O1-LABEL: atomicrmw_umax_i64_aligned_acquire:
7581 ; -O1:    ldaxr x0, [x8]
7582 ; -O1:    cmp x0, x1
7583 ; -O1:    csel x9, x0, x1, hi
7584 ; -O1:    stxr w10, x9, [x8]
7585     %r = atomicrmw umax ptr %ptr, i64 %value acquire, align 8
7586     ret i64 %r
7589 define dso_local i64 @atomicrmw_umax_i64_aligned_release(ptr %ptr, i64 %value) {
7590 ; -O0-LABEL: atomicrmw_umax_i64_aligned_release:
7591 ; -O0:    subs x10, x9, x8
7592 ; -O0:    csel x12, x9, x8, hi
7593 ; -O0:    ldaxr x8, [x11]
7594 ; -O0:    cmp x8, x9
7595 ; -O0:    stlxr w10, x12, [x11]
7596 ; -O0:    subs x9, x8, x9
7597 ; -O0:    subs w9, w9, #1
7599 ; -O1-LABEL: atomicrmw_umax_i64_aligned_release:
7600 ; -O1:    ldxr x0, [x8]
7601 ; -O1:    cmp x0, x1
7602 ; -O1:    csel x9, x0, x1, hi
7603 ; -O1:    stlxr w10, x9, [x8]
7604     %r = atomicrmw umax ptr %ptr, i64 %value release, align 8
7605     ret i64 %r
7608 define dso_local i64 @atomicrmw_umax_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
7609 ; -O0-LABEL: atomicrmw_umax_i64_aligned_acq_rel:
7610 ; -O0:    subs x10, x9, x8
7611 ; -O0:    csel x12, x9, x8, hi
7612 ; -O0:    ldaxr x8, [x11]
7613 ; -O0:    cmp x8, x9
7614 ; -O0:    stlxr w10, x12, [x11]
7615 ; -O0:    subs x9, x8, x9
7616 ; -O0:    subs w9, w9, #1
7618 ; -O1-LABEL: atomicrmw_umax_i64_aligned_acq_rel:
7619 ; -O1:    ldaxr x0, [x8]
7620 ; -O1:    cmp x0, x1
7621 ; -O1:    csel x9, x0, x1, hi
7622 ; -O1:    stlxr w10, x9, [x8]
7623     %r = atomicrmw umax ptr %ptr, i64 %value acq_rel, align 8
7624     ret i64 %r
7627 define dso_local i64 @atomicrmw_umax_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
7628 ; -O0-LABEL: atomicrmw_umax_i64_aligned_seq_cst:
7629 ; -O0:    subs x10, x9, x8
7630 ; -O0:    csel x12, x9, x8, hi
7631 ; -O0:    ldaxr x8, [x11]
7632 ; -O0:    cmp x8, x9
7633 ; -O0:    stlxr w10, x12, [x11]
7634 ; -O0:    subs x9, x8, x9
7635 ; -O0:    subs w9, w9, #1
7637 ; -O1-LABEL: atomicrmw_umax_i64_aligned_seq_cst:
7638 ; -O1:    ldaxr x0, [x8]
7639 ; -O1:    cmp x0, x1
7640 ; -O1:    csel x9, x0, x1, hi
7641 ; -O1:    stlxr w10, x9, [x8]
7642     %r = atomicrmw umax ptr %ptr, i64 %value seq_cst, align 8
7643     ret i64 %r
7646 define dso_local i128 @atomicrmw_umax_i128_aligned_monotonic(ptr %ptr, i128 %value) {
7647 ; -O0-LABEL: atomicrmw_umax_i128_aligned_monotonic:
7648 ; -O0:    subs x12, x8, x11
7649 ; -O0:    csel x15, x13, x10, lo
7650 ; -O0:    csel x14, x11, x8, lo
7651 ; -O0:    ldxp x10, x12, [x9]
7652 ; -O0:    cmp x10, x11
7653 ; -O0:    cmp x12, x13
7654 ; -O0:    stxp w8, x14, x15, [x9]
7655 ; -O0:    stxp w8, x10, x12, [x9]
7656 ; -O0:    subs x12, x12, x13
7657 ; -O0:    ccmp x10, x11, #0, eq
7659 ; -O1-LABEL: atomicrmw_umax_i128_aligned_monotonic:
7660 ; -O1:    ldxp x1, x0, [x8]
7661 ; -O1:    cmp x3, x1
7662 ; -O1:    csel x9, x0, x2, lo
7663 ; -O1:    csel x10, x1, x3, lo
7664 ; -O1:    stxp w11, x10, x9, [x8]
7665     %r = atomicrmw umax ptr %ptr, i128 %value monotonic, align 16
7666     ret i128 %r
7669 define dso_local i128 @atomicrmw_umax_i128_aligned_acquire(ptr %ptr, i128 %value) {
7670 ; -O0-LABEL: atomicrmw_umax_i128_aligned_acquire:
7671 ; -O0:    subs x12, x8, x11
7672 ; -O0:    csel x15, x13, x10, lo
7673 ; -O0:    csel x14, x11, x8, lo
7674 ; -O0:    ldaxp x10, x12, [x9]
7675 ; -O0:    cmp x10, x11
7676 ; -O0:    cmp x12, x13
7677 ; -O0:    stxp w8, x14, x15, [x9]
7678 ; -O0:    stxp w8, x10, x12, [x9]
7679 ; -O0:    subs x12, x12, x13
7680 ; -O0:    ccmp x10, x11, #0, eq
7682 ; -O1-LABEL: atomicrmw_umax_i128_aligned_acquire:
7683 ; -O1:    ldaxp x1, x0, [x8]
7684 ; -O1:    cmp x3, x1
7685 ; -O1:    csel x9, x0, x2, lo
7686 ; -O1:    csel x10, x1, x3, lo
7687 ; -O1:    stxp w11, x10, x9, [x8]
7688     %r = atomicrmw umax ptr %ptr, i128 %value acquire, align 16
7689     ret i128 %r
7692 define dso_local i128 @atomicrmw_umax_i128_aligned_release(ptr %ptr, i128 %value) {
7693 ; -O0-LABEL: atomicrmw_umax_i128_aligned_release:
7694 ; -O0:    subs x12, x8, x11
7695 ; -O0:    csel x15, x13, x10, lo
7696 ; -O0:    csel x14, x11, x8, lo
7697 ; -O0:    ldxp x10, x12, [x9]
7698 ; -O0:    cmp x10, x11
7699 ; -O0:    cmp x12, x13
7700 ; -O0:    stlxp w8, x14, x15, [x9]
7701 ; -O0:    stlxp w8, x10, x12, [x9]
7702 ; -O0:    subs x12, x12, x13
7703 ; -O0:    ccmp x10, x11, #0, eq
7705 ; -O1-LABEL: atomicrmw_umax_i128_aligned_release:
7706 ; -O1:    ldxp x1, x0, [x8]
7707 ; -O1:    cmp x3, x1
7708 ; -O1:    csel x9, x0, x2, lo
7709 ; -O1:    csel x10, x1, x3, lo
7710 ; -O1:    stlxp w11, x10, x9, [x8]
7711     %r = atomicrmw umax ptr %ptr, i128 %value release, align 16
7712     ret i128 %r
7715 define dso_local i128 @atomicrmw_umax_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
7716 ; -O0-LABEL: atomicrmw_umax_i128_aligned_acq_rel:
7717 ; -O0:    subs x12, x8, x11
7718 ; -O0:    csel x15, x13, x10, lo
7719 ; -O0:    csel x14, x11, x8, lo
7720 ; -O0:    ldaxp x10, x12, [x9]
7721 ; -O0:    cmp x10, x11
7722 ; -O0:    cmp x12, x13
7723 ; -O0:    stlxp w8, x14, x15, [x9]
7724 ; -O0:    stlxp w8, x10, x12, [x9]
7725 ; -O0:    subs x12, x12, x13
7726 ; -O0:    ccmp x10, x11, #0, eq
7728 ; -O1-LABEL: atomicrmw_umax_i128_aligned_acq_rel:
7729 ; -O1:    ldaxp x1, x0, [x8]
7730 ; -O1:    cmp x3, x1
7731 ; -O1:    csel x9, x0, x2, lo
7732 ; -O1:    csel x10, x1, x3, lo
7733 ; -O1:    stlxp w11, x10, x9, [x8]
7734     %r = atomicrmw umax ptr %ptr, i128 %value acq_rel, align 16
7735     ret i128 %r
7738 define dso_local i128 @atomicrmw_umax_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
7739 ; -O0-LABEL: atomicrmw_umax_i128_aligned_seq_cst:
7740 ; -O0:    subs x12, x8, x11
7741 ; -O0:    csel x15, x13, x10, lo
7742 ; -O0:    csel x14, x11, x8, lo
7743 ; -O0:    ldaxp x10, x12, [x9]
7744 ; -O0:    cmp x10, x11
7745 ; -O0:    cmp x12, x13
7746 ; -O0:    stlxp w8, x14, x15, [x9]
7747 ; -O0:    stlxp w8, x10, x12, [x9]
7748 ; -O0:    subs x12, x12, x13
7749 ; -O0:    ccmp x10, x11, #0, eq
7751 ; -O1-LABEL: atomicrmw_umax_i128_aligned_seq_cst:
7752 ; -O1:    ldaxp x1, x0, [x8]
7753 ; -O1:    cmp x3, x1
7754 ; -O1:    csel x9, x0, x2, lo
7755 ; -O1:    csel x10, x1, x3, lo
7756 ; -O1:    stlxp w11, x10, x9, [x8]
7757     %r = atomicrmw umax ptr %ptr, i128 %value seq_cst, align 16
7758     ret i128 %r
7761 define dso_local i8 @atomicrmw_umax_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
7762 ; -O0-LABEL: atomicrmw_umax_i8_unaligned_monotonic:
7763 ; -O0:    and w9, w12, #0xff
7764 ; -O0:    subs w10, w9, w8, uxtb
7765 ; -O0:    csel w13, w12, w8, hi
7766 ; -O0:    ldaxrb w8, [x11]
7767 ; -O0:    cmp w8, w12, uxtb
7768 ; -O0:    stlxrb w10, w13, [x11]
7769 ; -O0:    subs w9, w8, w9
7770 ; -O0:    subs w9, w9, #1
7772 ; -O1-LABEL: atomicrmw_umax_i8_unaligned_monotonic:
7773 ; -O1:    and w9, w1, #0xff
7774 ; -O1:    ldxrb w8, [x0]
7775 ; -O1:    cmp w8, w9
7776 ; -O1:    csel w10, w8, w9, hi
7777 ; -O1:    stxrb w11, w10, [x0]
7778     %r = atomicrmw umax ptr %ptr, i8 %value monotonic, align 1
7779     ret i8 %r
7782 define dso_local i8 @atomicrmw_umax_i8_unaligned_acquire(ptr %ptr, i8 %value) {
7783 ; -O0-LABEL: atomicrmw_umax_i8_unaligned_acquire:
7784 ; -O0:    and w9, w12, #0xff
7785 ; -O0:    subs w10, w9, w8, uxtb
7786 ; -O0:    csel w13, w12, w8, hi
7787 ; -O0:    ldaxrb w8, [x11]
7788 ; -O0:    cmp w8, w12, uxtb
7789 ; -O0:    stlxrb w10, w13, [x11]
7790 ; -O0:    subs w9, w8, w9
7791 ; -O0:    subs w9, w9, #1
7793 ; -O1-LABEL: atomicrmw_umax_i8_unaligned_acquire:
7794 ; -O1:    and w9, w1, #0xff
7795 ; -O1:    ldaxrb w8, [x0]
7796 ; -O1:    cmp w8, w9
7797 ; -O1:    csel w10, w8, w9, hi
7798 ; -O1:    stxrb w11, w10, [x0]
7799     %r = atomicrmw umax ptr %ptr, i8 %value acquire, align 1
7800     ret i8 %r
7803 define dso_local i8 @atomicrmw_umax_i8_unaligned_release(ptr %ptr, i8 %value) {
7804 ; -O0-LABEL: atomicrmw_umax_i8_unaligned_release:
7805 ; -O0:    and w9, w12, #0xff
7806 ; -O0:    subs w10, w9, w8, uxtb
7807 ; -O0:    csel w13, w12, w8, hi
7808 ; -O0:    ldaxrb w8, [x11]
7809 ; -O0:    cmp w8, w12, uxtb
7810 ; -O0:    stlxrb w10, w13, [x11]
7811 ; -O0:    subs w9, w8, w9
7812 ; -O0:    subs w9, w9, #1
7814 ; -O1-LABEL: atomicrmw_umax_i8_unaligned_release:
7815 ; -O1:    and w9, w1, #0xff
7816 ; -O1:    ldxrb w8, [x0]
7817 ; -O1:    cmp w8, w9
7818 ; -O1:    csel w10, w8, w9, hi
7819 ; -O1:    stlxrb w11, w10, [x0]
7820     %r = atomicrmw umax ptr %ptr, i8 %value release, align 1
7821     ret i8 %r
7824 define dso_local i8 @atomicrmw_umax_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
7825 ; -O0-LABEL: atomicrmw_umax_i8_unaligned_acq_rel:
7826 ; -O0:    and w9, w12, #0xff
7827 ; -O0:    subs w10, w9, w8, uxtb
7828 ; -O0:    csel w13, w12, w8, hi
7829 ; -O0:    ldaxrb w8, [x11]
7830 ; -O0:    cmp w8, w12, uxtb
7831 ; -O0:    stlxrb w10, w13, [x11]
7832 ; -O0:    subs w9, w8, w9
7833 ; -O0:    subs w9, w9, #1
7835 ; -O1-LABEL: atomicrmw_umax_i8_unaligned_acq_rel:
7836 ; -O1:    and w9, w1, #0xff
7837 ; -O1:    ldaxrb w8, [x0]
7838 ; -O1:    cmp w8, w9
7839 ; -O1:    csel w10, w8, w9, hi
7840 ; -O1:    stlxrb w11, w10, [x0]
7841     %r = atomicrmw umax ptr %ptr, i8 %value acq_rel, align 1
7842     ret i8 %r
7845 define dso_local i8 @atomicrmw_umax_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
7846 ; -O0-LABEL: atomicrmw_umax_i8_unaligned_seq_cst:
7847 ; -O0:    and w9, w12, #0xff
7848 ; -O0:    subs w10, w9, w8, uxtb
7849 ; -O0:    csel w13, w12, w8, hi
7850 ; -O0:    ldaxrb w8, [x11]
7851 ; -O0:    cmp w8, w12, uxtb
7852 ; -O0:    stlxrb w10, w13, [x11]
7853 ; -O0:    subs w9, w8, w9
7854 ; -O0:    subs w9, w9, #1
7856 ; -O1-LABEL: atomicrmw_umax_i8_unaligned_seq_cst:
7857 ; -O1:    and w9, w1, #0xff
7858 ; -O1:    ldaxrb w8, [x0]
7859 ; -O1:    cmp w8, w9
7860 ; -O1:    csel w10, w8, w9, hi
7861 ; -O1:    stlxrb w11, w10, [x0]
7862     %r = atomicrmw umax ptr %ptr, i8 %value seq_cst, align 1
7863     ret i8 %r
7866 define dso_local i16 @atomicrmw_umax_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
7867 ; -O0-LABEL: atomicrmw_umax_i16_unaligned_monotonic:
7868 ; -O0:    and w10, w9, #0xffff
7869 ; -O0:    subs w10, w10, w8, uxth
7870 ; -O0:    csel w8, w9, w8, hi
7871 ; -O0:    bl __atomic_compare_exchange
7873 ; -O1-LABEL: atomicrmw_umax_i16_unaligned_monotonic:
7874 ; -O1:    and w8, w0, #0xffff
7875 ; -O1:    cmp w8, w20, uxth
7876 ; -O1:    csel w8, w0, w20, hi
7877 ; -O1:    bl __atomic_compare_exchange
7878     %r = atomicrmw umax ptr %ptr, i16 %value monotonic, align 1
7879     ret i16 %r
7882 define dso_local i16 @atomicrmw_umax_i16_unaligned_acquire(ptr %ptr, i16 %value) {
7883 ; -O0-LABEL: atomicrmw_umax_i16_unaligned_acquire:
7884 ; -O0:    and w10, w9, #0xffff
7885 ; -O0:    subs w10, w10, w8, uxth
7886 ; -O0:    csel w8, w9, w8, hi
7887 ; -O0:    bl __atomic_compare_exchange
7889 ; -O1-LABEL: atomicrmw_umax_i16_unaligned_acquire:
7890 ; -O1:    and w8, w0, #0xffff
7891 ; -O1:    cmp w8, w20, uxth
7892 ; -O1:    csel w8, w0, w20, hi
7893 ; -O1:    bl __atomic_compare_exchange
7894     %r = atomicrmw umax ptr %ptr, i16 %value acquire, align 1
7895     ret i16 %r
7898 define dso_local i16 @atomicrmw_umax_i16_unaligned_release(ptr %ptr, i16 %value) {
7899 ; -O0-LABEL: atomicrmw_umax_i16_unaligned_release:
7900 ; -O0:    and w10, w9, #0xffff
7901 ; -O0:    subs w10, w10, w8, uxth
7902 ; -O0:    csel w8, w9, w8, hi
7903 ; -O0:    bl __atomic_compare_exchange
7905 ; -O1-LABEL: atomicrmw_umax_i16_unaligned_release:
7906 ; -O1:    and w8, w0, #0xffff
7907 ; -O1:    cmp w8, w20, uxth
7908 ; -O1:    csel w8, w0, w20, hi
7909 ; -O1:    bl __atomic_compare_exchange
7910     %r = atomicrmw umax ptr %ptr, i16 %value release, align 1
7911     ret i16 %r
7914 define dso_local i16 @atomicrmw_umax_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
7915 ; -O0-LABEL: atomicrmw_umax_i16_unaligned_acq_rel:
7916 ; -O0:    and w10, w9, #0xffff
7917 ; -O0:    subs w10, w10, w8, uxth
7918 ; -O0:    csel w8, w9, w8, hi
7919 ; -O0:    bl __atomic_compare_exchange
7921 ; -O1-LABEL: atomicrmw_umax_i16_unaligned_acq_rel:
7922 ; -O1:    and w8, w0, #0xffff
7923 ; -O1:    cmp w8, w20, uxth
7924 ; -O1:    csel w8, w0, w20, hi
7925 ; -O1:    bl __atomic_compare_exchange
7926     %r = atomicrmw umax ptr %ptr, i16 %value acq_rel, align 1
7927     ret i16 %r
7930 define dso_local i16 @atomicrmw_umax_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
7931 ; -O0-LABEL: atomicrmw_umax_i16_unaligned_seq_cst:
7932 ; -O0:    and w10, w9, #0xffff
7933 ; -O0:    subs w10, w10, w8, uxth
7934 ; -O0:    csel w8, w9, w8, hi
7935 ; -O0:    bl __atomic_compare_exchange
7937 ; -O1-LABEL: atomicrmw_umax_i16_unaligned_seq_cst:
7938 ; -O1:    and w8, w0, #0xffff
7939 ; -O1:    cmp w8, w20, uxth
7940 ; -O1:    csel w8, w0, w20, hi
7941 ; -O1:    bl __atomic_compare_exchange
7942     %r = atomicrmw umax ptr %ptr, i16 %value seq_cst, align 1
7943     ret i16 %r
7946 define dso_local i32 @atomicrmw_umax_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
7947 ; -O0-LABEL: atomicrmw_umax_i32_unaligned_monotonic:
7948 ; -O0:    subs w10, w9, w8
7949 ; -O0:    csel w8, w9, w8, hi
7950 ; -O0:    bl __atomic_compare_exchange
7952 ; -O1-LABEL: atomicrmw_umax_i32_unaligned_monotonic:
7953 ; -O1:    cmp w0, w20
7954 ; -O1:    csel w8, w0, w20, hi
7955 ; -O1:    bl __atomic_compare_exchange
7956     %r = atomicrmw umax ptr %ptr, i32 %value monotonic, align 1
7957     ret i32 %r
7960 define dso_local i32 @atomicrmw_umax_i32_unaligned_acquire(ptr %ptr, i32 %value) {
7961 ; -O0-LABEL: atomicrmw_umax_i32_unaligned_acquire:
7962 ; -O0:    subs w10, w9, w8
7963 ; -O0:    csel w8, w9, w8, hi
7964 ; -O0:    bl __atomic_compare_exchange
7966 ; -O1-LABEL: atomicrmw_umax_i32_unaligned_acquire:
7967 ; -O1:    cmp w0, w20
7968 ; -O1:    csel w8, w0, w20, hi
7969 ; -O1:    bl __atomic_compare_exchange
7970     %r = atomicrmw umax ptr %ptr, i32 %value acquire, align 1
7971     ret i32 %r
7974 define dso_local i32 @atomicrmw_umax_i32_unaligned_release(ptr %ptr, i32 %value) {
7975 ; -O0-LABEL: atomicrmw_umax_i32_unaligned_release:
7976 ; -O0:    subs w10, w9, w8
7977 ; -O0:    csel w8, w9, w8, hi
7978 ; -O0:    bl __atomic_compare_exchange
7980 ; -O1-LABEL: atomicrmw_umax_i32_unaligned_release:
7981 ; -O1:    cmp w0, w20
7982 ; -O1:    csel w8, w0, w20, hi
7983 ; -O1:    bl __atomic_compare_exchange
7984     %r = atomicrmw umax ptr %ptr, i32 %value release, align 1
7985     ret i32 %r
7988 define dso_local i32 @atomicrmw_umax_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
7989 ; -O0-LABEL: atomicrmw_umax_i32_unaligned_acq_rel:
7990 ; -O0:    subs w10, w9, w8
7991 ; -O0:    csel w8, w9, w8, hi
7992 ; -O0:    bl __atomic_compare_exchange
7994 ; -O1-LABEL: atomicrmw_umax_i32_unaligned_acq_rel:
7995 ; -O1:    cmp w0, w20
7996 ; -O1:    csel w8, w0, w20, hi
7997 ; -O1:    bl __atomic_compare_exchange
7998     %r = atomicrmw umax ptr %ptr, i32 %value acq_rel, align 1
7999     ret i32 %r
8002 define dso_local i32 @atomicrmw_umax_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
8003 ; -O0-LABEL: atomicrmw_umax_i32_unaligned_seq_cst:
8004 ; -O0:    subs w10, w9, w8
8005 ; -O0:    csel w8, w9, w8, hi
8006 ; -O0:    bl __atomic_compare_exchange
8008 ; -O1-LABEL: atomicrmw_umax_i32_unaligned_seq_cst:
8009 ; -O1:    cmp w0, w20
8010 ; -O1:    csel w8, w0, w20, hi
8011 ; -O1:    bl __atomic_compare_exchange
8012     %r = atomicrmw umax ptr %ptr, i32 %value seq_cst, align 1
8013     ret i32 %r
8016 define dso_local i64 @atomicrmw_umax_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
8017 ; -O0-LABEL: atomicrmw_umax_i64_unaligned_monotonic:
8018 ; -O0:    subs x10, x9, x8
8019 ; -O0:    csel x8, x9, x8, hi
8020 ; -O0:    bl __atomic_compare_exchange
8022 ; -O1-LABEL: atomicrmw_umax_i64_unaligned_monotonic:
8023 ; -O1:    cmp x0, x20
8024 ; -O1:    csel x8, x0, x20, hi
8025 ; -O1:    bl __atomic_compare_exchange
8026     %r = atomicrmw umax ptr %ptr, i64 %value monotonic, align 1
8027     ret i64 %r
8030 define dso_local i64 @atomicrmw_umax_i64_unaligned_acquire(ptr %ptr, i64 %value) {
8031 ; -O0-LABEL: atomicrmw_umax_i64_unaligned_acquire:
8032 ; -O0:    subs x10, x9, x8
8033 ; -O0:    csel x8, x9, x8, hi
8034 ; -O0:    bl __atomic_compare_exchange
8036 ; -O1-LABEL: atomicrmw_umax_i64_unaligned_acquire:
8037 ; -O1:    cmp x0, x20
8038 ; -O1:    csel x8, x0, x20, hi
8039 ; -O1:    bl __atomic_compare_exchange
8040     %r = atomicrmw umax ptr %ptr, i64 %value acquire, align 1
8041     ret i64 %r
8044 define dso_local i64 @atomicrmw_umax_i64_unaligned_release(ptr %ptr, i64 %value) {
8045 ; -O0-LABEL: atomicrmw_umax_i64_unaligned_release:
8046 ; -O0:    subs x10, x9, x8
8047 ; -O0:    csel x8, x9, x8, hi
8048 ; -O0:    bl __atomic_compare_exchange
8050 ; -O1-LABEL: atomicrmw_umax_i64_unaligned_release:
8051 ; -O1:    cmp x0, x20
8052 ; -O1:    csel x8, x0, x20, hi
8053 ; -O1:    bl __atomic_compare_exchange
8054     %r = atomicrmw umax ptr %ptr, i64 %value release, align 1
8055     ret i64 %r
8058 define dso_local i64 @atomicrmw_umax_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
8059 ; -O0-LABEL: atomicrmw_umax_i64_unaligned_acq_rel:
8060 ; -O0:    subs x10, x9, x8
8061 ; -O0:    csel x8, x9, x8, hi
8062 ; -O0:    bl __atomic_compare_exchange
8064 ; -O1-LABEL: atomicrmw_umax_i64_unaligned_acq_rel:
8065 ; -O1:    cmp x0, x20
8066 ; -O1:    csel x8, x0, x20, hi
8067 ; -O1:    bl __atomic_compare_exchange
8068     %r = atomicrmw umax ptr %ptr, i64 %value acq_rel, align 1
8069     ret i64 %r
8072 define dso_local i64 @atomicrmw_umax_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
8073 ; -O0-LABEL: atomicrmw_umax_i64_unaligned_seq_cst:
8074 ; -O0:    subs x10, x9, x8
8075 ; -O0:    csel x8, x9, x8, hi
8076 ; -O0:    bl __atomic_compare_exchange
8078 ; -O1-LABEL: atomicrmw_umax_i64_unaligned_seq_cst:
8079 ; -O1:    cmp x0, x20
8080 ; -O1:    csel x8, x0, x20, hi
8081 ; -O1:    bl __atomic_compare_exchange
8082     %r = atomicrmw umax ptr %ptr, i64 %value seq_cst, align 1
8083     ret i64 %r
8086 define dso_local i128 @atomicrmw_umax_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
8087 ; -O0-LABEL: atomicrmw_umax_i128_unaligned_monotonic:
8088 ; -O0:    subs x12, x9, x10
8089 ; -O0:    csel x8, x11, x8, lo
8090 ; -O0:    csel x9, x10, x9, lo
8091 ; -O0:    bl __atomic_compare_exchange
8093 ; -O1-LABEL: atomicrmw_umax_i128_unaligned_monotonic:
8094 ; -O1:    ldp x0, x1, [x0]
8095 ; -O1:    cmp x19, x1
8096 ; -O1:    csel x8, x1, x19, lo
8097 ; -O1:    csel x9, x0, x21, lo
8098 ; -O1:    bl __atomic_compare_exchange
8099     %r = atomicrmw umax ptr %ptr, i128 %value monotonic, align 1
8100     ret i128 %r
8103 define dso_local i128 @atomicrmw_umax_i128_unaligned_acquire(ptr %ptr, i128 %value) {
8104 ; -O0-LABEL: atomicrmw_umax_i128_unaligned_acquire:
8105 ; -O0:    subs x12, x9, x10
8106 ; -O0:    csel x8, x11, x8, lo
8107 ; -O0:    csel x9, x10, x9, lo
8108 ; -O0:    bl __atomic_compare_exchange
8110 ; -O1-LABEL: atomicrmw_umax_i128_unaligned_acquire:
8111 ; -O1:    ldp x0, x1, [x0]
8112 ; -O1:    cmp x19, x1
8113 ; -O1:    csel x8, x1, x19, lo
8114 ; -O1:    csel x9, x0, x21, lo
8115 ; -O1:    bl __atomic_compare_exchange
8116     %r = atomicrmw umax ptr %ptr, i128 %value acquire, align 1
8117     ret i128 %r
8120 define dso_local i128 @atomicrmw_umax_i128_unaligned_release(ptr %ptr, i128 %value) {
8121 ; -O0-LABEL: atomicrmw_umax_i128_unaligned_release:
8122 ; -O0:    subs x12, x9, x10
8123 ; -O0:    csel x8, x11, x8, lo
8124 ; -O0:    csel x9, x10, x9, lo
8125 ; -O0:    bl __atomic_compare_exchange
8127 ; -O1-LABEL: atomicrmw_umax_i128_unaligned_release:
8128 ; -O1:    ldp x0, x1, [x0]
8129 ; -O1:    cmp x19, x1
8130 ; -O1:    csel x8, x1, x19, lo
8131 ; -O1:    csel x9, x0, x21, lo
8132 ; -O1:    bl __atomic_compare_exchange
8133     %r = atomicrmw umax ptr %ptr, i128 %value release, align 1
8134     ret i128 %r
8137 define dso_local i128 @atomicrmw_umax_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
8138 ; -O0-LABEL: atomicrmw_umax_i128_unaligned_acq_rel:
8139 ; -O0:    subs x12, x9, x10
8140 ; -O0:    csel x8, x11, x8, lo
8141 ; -O0:    csel x9, x10, x9, lo
8142 ; -O0:    bl __atomic_compare_exchange
8144 ; -O1-LABEL: atomicrmw_umax_i128_unaligned_acq_rel:
8145 ; -O1:    ldp x0, x1, [x0]
8146 ; -O1:    cmp x19, x1
8147 ; -O1:    csel x8, x1, x19, lo
8148 ; -O1:    csel x9, x0, x21, lo
8149 ; -O1:    bl __atomic_compare_exchange
8150     %r = atomicrmw umax ptr %ptr, i128 %value acq_rel, align 1
8151     ret i128 %r
8154 define dso_local i128 @atomicrmw_umax_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
8155 ; -O0-LABEL: atomicrmw_umax_i128_unaligned_seq_cst:
8156 ; -O0:    subs x12, x9, x10
8157 ; -O0:    csel x8, x11, x8, lo
8158 ; -O0:    csel x9, x10, x9, lo
8159 ; -O0:    bl __atomic_compare_exchange
8161 ; -O1-LABEL: atomicrmw_umax_i128_unaligned_seq_cst:
8162 ; -O1:    ldp x0, x1, [x0]
8163 ; -O1:    cmp x19, x1
8164 ; -O1:    csel x8, x1, x19, lo
8165 ; -O1:    csel x9, x0, x21, lo
8166 ; -O1:    bl __atomic_compare_exchange
8167     %r = atomicrmw umax ptr %ptr, i128 %value seq_cst, align 1
8168     ret i128 %r
8171 define dso_local i8 @atomicrmw_umin_i8_aligned_monotonic(ptr %ptr, i8 %value) {
8172 ; -O0-LABEL: atomicrmw_umin_i8_aligned_monotonic:
8173 ; -O0:    and w9, w12, #0xff
8174 ; -O0:    subs w10, w9, w8, uxtb
8175 ; -O0:    csel w13, w12, w8, ls
8176 ; -O0:    ldaxrb w8, [x11]
8177 ; -O0:    cmp w8, w12, uxtb
8178 ; -O0:    stlxrb w10, w13, [x11]
8179 ; -O0:    subs w9, w8, w9
8180 ; -O0:    subs w9, w9, #1
8182 ; -O1-LABEL: atomicrmw_umin_i8_aligned_monotonic:
8183 ; -O1:    and w9, w1, #0xff
8184 ; -O1:    ldxrb w8, [x0]
8185 ; -O1:    cmp w8, w9
8186 ; -O1:    csel w10, w8, w9, ls
8187 ; -O1:    stxrb w11, w10, [x0]
8188     %r = atomicrmw umin ptr %ptr, i8 %value monotonic, align 1
8189     ret i8 %r
8192 define dso_local i8 @atomicrmw_umin_i8_aligned_acquire(ptr %ptr, i8 %value) {
8193 ; -O0-LABEL: atomicrmw_umin_i8_aligned_acquire:
8194 ; -O0:    and w9, w12, #0xff
8195 ; -O0:    subs w10, w9, w8, uxtb
8196 ; -O0:    csel w13, w12, w8, ls
8197 ; -O0:    ldaxrb w8, [x11]
8198 ; -O0:    cmp w8, w12, uxtb
8199 ; -O0:    stlxrb w10, w13, [x11]
8200 ; -O0:    subs w9, w8, w9
8201 ; -O0:    subs w9, w9, #1
8203 ; -O1-LABEL: atomicrmw_umin_i8_aligned_acquire:
8204 ; -O1:    and w9, w1, #0xff
8205 ; -O1:    ldaxrb w8, [x0]
8206 ; -O1:    cmp w8, w9
8207 ; -O1:    csel w10, w8, w9, ls
8208 ; -O1:    stxrb w11, w10, [x0]
8209     %r = atomicrmw umin ptr %ptr, i8 %value acquire, align 1
8210     ret i8 %r
8213 define dso_local i8 @atomicrmw_umin_i8_aligned_release(ptr %ptr, i8 %value) {
8214 ; -O0-LABEL: atomicrmw_umin_i8_aligned_release:
8215 ; -O0:    and w9, w12, #0xff
8216 ; -O0:    subs w10, w9, w8, uxtb
8217 ; -O0:    csel w13, w12, w8, ls
8218 ; -O0:    ldaxrb w8, [x11]
8219 ; -O0:    cmp w8, w12, uxtb
8220 ; -O0:    stlxrb w10, w13, [x11]
8221 ; -O0:    subs w9, w8, w9
8222 ; -O0:    subs w9, w9, #1
8224 ; -O1-LABEL: atomicrmw_umin_i8_aligned_release:
8225 ; -O1:    and w9, w1, #0xff
8226 ; -O1:    ldxrb w8, [x0]
8227 ; -O1:    cmp w8, w9
8228 ; -O1:    csel w10, w8, w9, ls
8229 ; -O1:    stlxrb w11, w10, [x0]
8230     %r = atomicrmw umin ptr %ptr, i8 %value release, align 1
8231     ret i8 %r
8234 define dso_local i8 @atomicrmw_umin_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
8235 ; -O0-LABEL: atomicrmw_umin_i8_aligned_acq_rel:
8236 ; -O0:    and w9, w12, #0xff
8237 ; -O0:    subs w10, w9, w8, uxtb
8238 ; -O0:    csel w13, w12, w8, ls
8239 ; -O0:    ldaxrb w8, [x11]
8240 ; -O0:    cmp w8, w12, uxtb
8241 ; -O0:    stlxrb w10, w13, [x11]
8242 ; -O0:    subs w9, w8, w9
8243 ; -O0:    subs w9, w9, #1
8245 ; -O1-LABEL: atomicrmw_umin_i8_aligned_acq_rel:
8246 ; -O1:    and w9, w1, #0xff
8247 ; -O1:    ldaxrb w8, [x0]
8248 ; -O1:    cmp w8, w9
8249 ; -O1:    csel w10, w8, w9, ls
8250 ; -O1:    stlxrb w11, w10, [x0]
8251     %r = atomicrmw umin ptr %ptr, i8 %value acq_rel, align 1
8252     ret i8 %r
8255 define dso_local i8 @atomicrmw_umin_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
8256 ; -O0-LABEL: atomicrmw_umin_i8_aligned_seq_cst:
8257 ; -O0:    and w9, w12, #0xff
8258 ; -O0:    subs w10, w9, w8, uxtb
8259 ; -O0:    csel w13, w12, w8, ls
8260 ; -O0:    ldaxrb w8, [x11]
8261 ; -O0:    cmp w8, w12, uxtb
8262 ; -O0:    stlxrb w10, w13, [x11]
8263 ; -O0:    subs w9, w8, w9
8264 ; -O0:    subs w9, w9, #1
8266 ; -O1-LABEL: atomicrmw_umin_i8_aligned_seq_cst:
8267 ; -O1:    and w9, w1, #0xff
8268 ; -O1:    ldaxrb w8, [x0]
8269 ; -O1:    cmp w8, w9
8270 ; -O1:    csel w10, w8, w9, ls
8271 ; -O1:    stlxrb w11, w10, [x0]
8272     %r = atomicrmw umin ptr %ptr, i8 %value seq_cst, align 1
8273     ret i8 %r
8276 define dso_local i16 @atomicrmw_umin_i16_aligned_monotonic(ptr %ptr, i16 %value) {
8277 ; -O0-LABEL: atomicrmw_umin_i16_aligned_monotonic:
8278 ; -O0:    and w9, w12, #0xffff
8279 ; -O0:    subs w10, w9, w8, uxth
8280 ; -O0:    csel w13, w12, w8, ls
8281 ; -O0:    ldaxrh w8, [x11]
8282 ; -O0:    cmp w8, w12, uxth
8283 ; -O0:    stlxrh w10, w13, [x11]
8284 ; -O0:    subs w9, w8, w9
8285 ; -O0:    subs w9, w9, #1
8287 ; -O1-LABEL: atomicrmw_umin_i16_aligned_monotonic:
8288 ; -O1:    and w9, w1, #0xffff
8289 ; -O1:    ldxrh w8, [x0]
8290 ; -O1:    cmp w8, w9
8291 ; -O1:    csel w10, w8, w9, ls
8292 ; -O1:    stxrh w11, w10, [x0]
8293     %r = atomicrmw umin ptr %ptr, i16 %value monotonic, align 2
8294     ret i16 %r
8297 define dso_local i16 @atomicrmw_umin_i16_aligned_acquire(ptr %ptr, i16 %value) {
8298 ; -O0-LABEL: atomicrmw_umin_i16_aligned_acquire:
8299 ; -O0:    and w9, w12, #0xffff
8300 ; -O0:    subs w10, w9, w8, uxth
8301 ; -O0:    csel w13, w12, w8, ls
8302 ; -O0:    ldaxrh w8, [x11]
8303 ; -O0:    cmp w8, w12, uxth
8304 ; -O0:    stlxrh w10, w13, [x11]
8305 ; -O0:    subs w9, w8, w9
8306 ; -O0:    subs w9, w9, #1
8308 ; -O1-LABEL: atomicrmw_umin_i16_aligned_acquire:
8309 ; -O1:    and w9, w1, #0xffff
8310 ; -O1:    ldaxrh w8, [x0]
8311 ; -O1:    cmp w8, w9
8312 ; -O1:    csel w10, w8, w9, ls
8313 ; -O1:    stxrh w11, w10, [x0]
8314     %r = atomicrmw umin ptr %ptr, i16 %value acquire, align 2
8315     ret i16 %r
8318 define dso_local i16 @atomicrmw_umin_i16_aligned_release(ptr %ptr, i16 %value) {
8319 ; -O0-LABEL: atomicrmw_umin_i16_aligned_release:
8320 ; -O0:    and w9, w12, #0xffff
8321 ; -O0:    subs w10, w9, w8, uxth
8322 ; -O0:    csel w13, w12, w8, ls
8323 ; -O0:    ldaxrh w8, [x11]
8324 ; -O0:    cmp w8, w12, uxth
8325 ; -O0:    stlxrh w10, w13, [x11]
8326 ; -O0:    subs w9, w8, w9
8327 ; -O0:    subs w9, w9, #1
8329 ; -O1-LABEL: atomicrmw_umin_i16_aligned_release:
8330 ; -O1:    and w9, w1, #0xffff
8331 ; -O1:    ldxrh w8, [x0]
8332 ; -O1:    cmp w8, w9
8333 ; -O1:    csel w10, w8, w9, ls
8334 ; -O1:    stlxrh w11, w10, [x0]
8335     %r = atomicrmw umin ptr %ptr, i16 %value release, align 2
8336     ret i16 %r
8339 define dso_local i16 @atomicrmw_umin_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
8340 ; -O0-LABEL: atomicrmw_umin_i16_aligned_acq_rel:
8341 ; -O0:    and w9, w12, #0xffff
8342 ; -O0:    subs w10, w9, w8, uxth
8343 ; -O0:    csel w13, w12, w8, ls
8344 ; -O0:    ldaxrh w8, [x11]
8345 ; -O0:    cmp w8, w12, uxth
8346 ; -O0:    stlxrh w10, w13, [x11]
8347 ; -O0:    subs w9, w8, w9
8348 ; -O0:    subs w9, w9, #1
8350 ; -O1-LABEL: atomicrmw_umin_i16_aligned_acq_rel:
8351 ; -O1:    and w9, w1, #0xffff
8352 ; -O1:    ldaxrh w8, [x0]
8353 ; -O1:    cmp w8, w9
8354 ; -O1:    csel w10, w8, w9, ls
8355 ; -O1:    stlxrh w11, w10, [x0]
8356     %r = atomicrmw umin ptr %ptr, i16 %value acq_rel, align 2
8357     ret i16 %r
8360 define dso_local i16 @atomicrmw_umin_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
8361 ; -O0-LABEL: atomicrmw_umin_i16_aligned_seq_cst:
8362 ; -O0:    and w9, w12, #0xffff
8363 ; -O0:    subs w10, w9, w8, uxth
8364 ; -O0:    csel w13, w12, w8, ls
8365 ; -O0:    ldaxrh w8, [x11]
8366 ; -O0:    cmp w8, w12, uxth
8367 ; -O0:    stlxrh w10, w13, [x11]
8368 ; -O0:    subs w9, w8, w9
8369 ; -O0:    subs w9, w9, #1
8371 ; -O1-LABEL: atomicrmw_umin_i16_aligned_seq_cst:
8372 ; -O1:    and w9, w1, #0xffff
8373 ; -O1:    ldaxrh w8, [x0]
8374 ; -O1:    cmp w8, w9
8375 ; -O1:    csel w10, w8, w9, ls
8376 ; -O1:    stlxrh w11, w10, [x0]
8377     %r = atomicrmw umin ptr %ptr, i16 %value seq_cst, align 2
8378     ret i16 %r
8381 define dso_local i32 @atomicrmw_umin_i32_aligned_monotonic(ptr %ptr, i32 %value) {
8382 ; -O0-LABEL: atomicrmw_umin_i32_aligned_monotonic:
8383 ; -O0:    subs w10, w9, w8
8384 ; -O0:    csel w12, w9, w8, ls
8385 ; -O0:    ldaxr w8, [x11]
8386 ; -O0:    cmp w8, w9
8387 ; -O0:    stlxr w10, w12, [x11]
8388 ; -O0:    subs w9, w8, w9
8389 ; -O0:    subs w9, w9, #1
8391 ; -O1-LABEL: atomicrmw_umin_i32_aligned_monotonic:
8392 ; -O1:    ldxr w8, [x0]
8393 ; -O1:    cmp w8, w1
8394 ; -O1:    csel w9, w8, w1, ls
8395 ; -O1:    stxr w10, w9, [x0]
8396     %r = atomicrmw umin ptr %ptr, i32 %value monotonic, align 4
8397     ret i32 %r
8400 define dso_local i32 @atomicrmw_umin_i32_aligned_acquire(ptr %ptr, i32 %value) {
8401 ; -O0-LABEL: atomicrmw_umin_i32_aligned_acquire:
8402 ; -O0:    subs w10, w9, w8
8403 ; -O0:    csel w12, w9, w8, ls
8404 ; -O0:    ldaxr w8, [x11]
8405 ; -O0:    cmp w8, w9
8406 ; -O0:    stlxr w10, w12, [x11]
8407 ; -O0:    subs w9, w8, w9
8408 ; -O0:    subs w9, w9, #1
8410 ; -O1-LABEL: atomicrmw_umin_i32_aligned_acquire:
8411 ; -O1:    ldaxr w8, [x0]
8412 ; -O1:    cmp w8, w1
8413 ; -O1:    csel w9, w8, w1, ls
8414 ; -O1:    stxr w10, w9, [x0]
8415     %r = atomicrmw umin ptr %ptr, i32 %value acquire, align 4
8416     ret i32 %r
8419 define dso_local i32 @atomicrmw_umin_i32_aligned_release(ptr %ptr, i32 %value) {
8420 ; -O0-LABEL: atomicrmw_umin_i32_aligned_release:
8421 ; -O0:    subs w10, w9, w8
8422 ; -O0:    csel w12, w9, w8, ls
8423 ; -O0:    ldaxr w8, [x11]
8424 ; -O0:    cmp w8, w9
8425 ; -O0:    stlxr w10, w12, [x11]
8426 ; -O0:    subs w9, w8, w9
8427 ; -O0:    subs w9, w9, #1
8429 ; -O1-LABEL: atomicrmw_umin_i32_aligned_release:
8430 ; -O1:    ldxr w8, [x0]
8431 ; -O1:    cmp w8, w1
8432 ; -O1:    csel w9, w8, w1, ls
8433 ; -O1:    stlxr w10, w9, [x0]
8434     %r = atomicrmw umin ptr %ptr, i32 %value release, align 4
8435     ret i32 %r
8438 define dso_local i32 @atomicrmw_umin_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
8439 ; -O0-LABEL: atomicrmw_umin_i32_aligned_acq_rel:
8440 ; -O0:    subs w10, w9, w8
8441 ; -O0:    csel w12, w9, w8, ls
8442 ; -O0:    ldaxr w8, [x11]
8443 ; -O0:    cmp w8, w9
8444 ; -O0:    stlxr w10, w12, [x11]
8445 ; -O0:    subs w9, w8, w9
8446 ; -O0:    subs w9, w9, #1
8448 ; -O1-LABEL: atomicrmw_umin_i32_aligned_acq_rel:
8449 ; -O1:    ldaxr w8, [x0]
8450 ; -O1:    cmp w8, w1
8451 ; -O1:    csel w9, w8, w1, ls
8452 ; -O1:    stlxr w10, w9, [x0]
8453     %r = atomicrmw umin ptr %ptr, i32 %value acq_rel, align 4
8454     ret i32 %r
8457 define dso_local i32 @atomicrmw_umin_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
8458 ; -O0-LABEL: atomicrmw_umin_i32_aligned_seq_cst:
8459 ; -O0:    subs w10, w9, w8
8460 ; -O0:    csel w12, w9, w8, ls
8461 ; -O0:    ldaxr w8, [x11]
8462 ; -O0:    cmp w8, w9
8463 ; -O0:    stlxr w10, w12, [x11]
8464 ; -O0:    subs w9, w8, w9
8465 ; -O0:    subs w9, w9, #1
8467 ; -O1-LABEL: atomicrmw_umin_i32_aligned_seq_cst:
8468 ; -O1:    ldaxr w8, [x0]
8469 ; -O1:    cmp w8, w1
8470 ; -O1:    csel w9, w8, w1, ls
8471 ; -O1:    stlxr w10, w9, [x0]
8472     %r = atomicrmw umin ptr %ptr, i32 %value seq_cst, align 4
8473     ret i32 %r
8476 define dso_local i64 @atomicrmw_umin_i64_aligned_monotonic(ptr %ptr, i64 %value) {
8477 ; -O0-LABEL: atomicrmw_umin_i64_aligned_monotonic:
8478 ; -O0:    subs x10, x9, x8
8479 ; -O0:    csel x12, x9, x8, ls
8480 ; -O0:    ldaxr x8, [x11]
8481 ; -O0:    cmp x8, x9
8482 ; -O0:    stlxr w10, x12, [x11]
8483 ; -O0:    subs x9, x8, x9
8484 ; -O0:    subs w9, w9, #1
8486 ; -O1-LABEL: atomicrmw_umin_i64_aligned_monotonic:
8487 ; -O1:    ldxr x0, [x8]
8488 ; -O1:    cmp x0, x1
8489 ; -O1:    csel x9, x0, x1, ls
8490 ; -O1:    stxr w10, x9, [x8]
8491     %r = atomicrmw umin ptr %ptr, i64 %value monotonic, align 8
8492     ret i64 %r
8495 define dso_local i64 @atomicrmw_umin_i64_aligned_acquire(ptr %ptr, i64 %value) {
8496 ; -O0-LABEL: atomicrmw_umin_i64_aligned_acquire:
8497 ; -O0:    subs x10, x9, x8
8498 ; -O0:    csel x12, x9, x8, ls
8499 ; -O0:    ldaxr x8, [x11]
8500 ; -O0:    cmp x8, x9
8501 ; -O0:    stlxr w10, x12, [x11]
8502 ; -O0:    subs x9, x8, x9
8503 ; -O0:    subs w9, w9, #1
8505 ; -O1-LABEL: atomicrmw_umin_i64_aligned_acquire:
8506 ; -O1:    ldaxr x0, [x8]
8507 ; -O1:    cmp x0, x1
8508 ; -O1:    csel x9, x0, x1, ls
8509 ; -O1:    stxr w10, x9, [x8]
8510     %r = atomicrmw umin ptr %ptr, i64 %value acquire, align 8
8511     ret i64 %r
8514 define dso_local i64 @atomicrmw_umin_i64_aligned_release(ptr %ptr, i64 %value) {
8515 ; -O0-LABEL: atomicrmw_umin_i64_aligned_release:
8516 ; -O0:    subs x10, x9, x8
8517 ; -O0:    csel x12, x9, x8, ls
8518 ; -O0:    ldaxr x8, [x11]
8519 ; -O0:    cmp x8, x9
8520 ; -O0:    stlxr w10, x12, [x11]
8521 ; -O0:    subs x9, x8, x9
8522 ; -O0:    subs w9, w9, #1
8524 ; -O1-LABEL: atomicrmw_umin_i64_aligned_release:
8525 ; -O1:    ldxr x0, [x8]
8526 ; -O1:    cmp x0, x1
8527 ; -O1:    csel x9, x0, x1, ls
8528 ; -O1:    stlxr w10, x9, [x8]
8529     %r = atomicrmw umin ptr %ptr, i64 %value release, align 8
8530     ret i64 %r
8533 define dso_local i64 @atomicrmw_umin_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
8534 ; -O0-LABEL: atomicrmw_umin_i64_aligned_acq_rel:
8535 ; -O0:    subs x10, x9, x8
8536 ; -O0:    csel x12, x9, x8, ls
8537 ; -O0:    ldaxr x8, [x11]
8538 ; -O0:    cmp x8, x9
8539 ; -O0:    stlxr w10, x12, [x11]
8540 ; -O0:    subs x9, x8, x9
8541 ; -O0:    subs w9, w9, #1
8543 ; -O1-LABEL: atomicrmw_umin_i64_aligned_acq_rel:
8544 ; -O1:    ldaxr x0, [x8]
8545 ; -O1:    cmp x0, x1
8546 ; -O1:    csel x9, x0, x1, ls
8547 ; -O1:    stlxr w10, x9, [x8]
8548     %r = atomicrmw umin ptr %ptr, i64 %value acq_rel, align 8
8549     ret i64 %r
8552 define dso_local i64 @atomicrmw_umin_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
8553 ; -O0-LABEL: atomicrmw_umin_i64_aligned_seq_cst:
8554 ; -O0:    subs x10, x9, x8
8555 ; -O0:    csel x12, x9, x8, ls
8556 ; -O0:    ldaxr x8, [x11]
8557 ; -O0:    cmp x8, x9
8558 ; -O0:    stlxr w10, x12, [x11]
8559 ; -O0:    subs x9, x8, x9
8560 ; -O0:    subs w9, w9, #1
8562 ; -O1-LABEL: atomicrmw_umin_i64_aligned_seq_cst:
8563 ; -O1:    ldaxr x0, [x8]
8564 ; -O1:    cmp x0, x1
8565 ; -O1:    csel x9, x0, x1, ls
8566 ; -O1:    stlxr w10, x9, [x8]
8567     %r = atomicrmw umin ptr %ptr, i64 %value seq_cst, align 8
8568     ret i64 %r
8571 define dso_local i128 @atomicrmw_umin_i128_aligned_monotonic(ptr %ptr, i128 %value) {
8572 ; -O0-LABEL: atomicrmw_umin_i128_aligned_monotonic:
8573 ; -O0:    subs x12, x8, x11
8574 ; -O0:    csel x15, x13, x10, hs
8575 ; -O0:    csel x14, x11, x8, hs
8576 ; -O0:    ldxp x10, x12, [x9]
8577 ; -O0:    cmp x10, x11
8578 ; -O0:    cmp x12, x13
8579 ; -O0:    stxp w8, x14, x15, [x9]
8580 ; -O0:    stxp w8, x10, x12, [x9]
8581 ; -O0:    subs x12, x12, x13
8582 ; -O0:    ccmp x10, x11, #0, eq
8584 ; -O1-LABEL: atomicrmw_umin_i128_aligned_monotonic:
8585 ; -O1:    ldxp x1, x0, [x8]
8586 ; -O1:    cmp x3, x1
8587 ; -O1:    csel x9, x0, x2, hs
8588 ; -O1:    csel x10, x1, x3, hs
8589 ; -O1:    stxp w11, x10, x9, [x8]
8590     %r = atomicrmw umin ptr %ptr, i128 %value monotonic, align 16
8591     ret i128 %r
8594 define dso_local i128 @atomicrmw_umin_i128_aligned_acquire(ptr %ptr, i128 %value) {
8595 ; -O0-LABEL: atomicrmw_umin_i128_aligned_acquire:
8596 ; -O0:    subs x12, x8, x11
8597 ; -O0:    csel x15, x13, x10, hs
8598 ; -O0:    csel x14, x11, x8, hs
8599 ; -O0:    ldaxp x10, x12, [x9]
8600 ; -O0:    cmp x10, x11
8601 ; -O0:    cmp x12, x13
8602 ; -O0:    stxp w8, x14, x15, [x9]
8603 ; -O0:    stxp w8, x10, x12, [x9]
8604 ; -O0:    subs x12, x12, x13
8605 ; -O0:    ccmp x10, x11, #0, eq
8607 ; -O1-LABEL: atomicrmw_umin_i128_aligned_acquire:
8608 ; -O1:    ldaxp x1, x0, [x8]
8609 ; -O1:    cmp x3, x1
8610 ; -O1:    csel x9, x0, x2, hs
8611 ; -O1:    csel x10, x1, x3, hs
8612 ; -O1:    stxp w11, x10, x9, [x8]
8613     %r = atomicrmw umin ptr %ptr, i128 %value acquire, align 16
8614     ret i128 %r
8617 define dso_local i128 @atomicrmw_umin_i128_aligned_release(ptr %ptr, i128 %value) {
8618 ; -O0-LABEL: atomicrmw_umin_i128_aligned_release:
8619 ; -O0:    subs x12, x8, x11
8620 ; -O0:    csel x15, x13, x10, hs
8621 ; -O0:    csel x14, x11, x8, hs
8622 ; -O0:    ldxp x10, x12, [x9]
8623 ; -O0:    cmp x10, x11
8624 ; -O0:    cmp x12, x13
8625 ; -O0:    stlxp w8, x14, x15, [x9]
8626 ; -O0:    stlxp w8, x10, x12, [x9]
8627 ; -O0:    subs x12, x12, x13
8628 ; -O0:    ccmp x10, x11, #0, eq
8630 ; -O1-LABEL: atomicrmw_umin_i128_aligned_release:
8631 ; -O1:    ldxp x1, x0, [x8]
8632 ; -O1:    cmp x3, x1
8633 ; -O1:    csel x9, x0, x2, hs
8634 ; -O1:    csel x10, x1, x3, hs
8635 ; -O1:    stlxp w11, x10, x9, [x8]
8636     %r = atomicrmw umin ptr %ptr, i128 %value release, align 16
8637     ret i128 %r
8640 define dso_local i128 @atomicrmw_umin_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
8641 ; -O0-LABEL: atomicrmw_umin_i128_aligned_acq_rel:
8642 ; -O0:    subs x12, x8, x11
8643 ; -O0:    csel x15, x13, x10, hs
8644 ; -O0:    csel x14, x11, x8, hs
8645 ; -O0:    ldaxp x10, x12, [x9]
8646 ; -O0:    cmp x10, x11
8647 ; -O0:    cmp x12, x13
8648 ; -O0:    stlxp w8, x14, x15, [x9]
8649 ; -O0:    stlxp w8, x10, x12, [x9]
8650 ; -O0:    subs x12, x12, x13
8651 ; -O0:    ccmp x10, x11, #0, eq
8653 ; -O1-LABEL: atomicrmw_umin_i128_aligned_acq_rel:
8654 ; -O1:    ldaxp x1, x0, [x8]
8655 ; -O1:    cmp x3, x1
8656 ; -O1:    csel x9, x0, x2, hs
8657 ; -O1:    csel x10, x1, x3, hs
8658 ; -O1:    stlxp w11, x10, x9, [x8]
8659     %r = atomicrmw umin ptr %ptr, i128 %value acq_rel, align 16
8660     ret i128 %r
8663 define dso_local i128 @atomicrmw_umin_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
8664 ; -O0-LABEL: atomicrmw_umin_i128_aligned_seq_cst:
8665 ; -O0:    subs x12, x8, x11
8666 ; -O0:    csel x15, x13, x10, hs
8667 ; -O0:    csel x14, x11, x8, hs
8668 ; -O0:    ldaxp x10, x12, [x9]
8669 ; -O0:    cmp x10, x11
8670 ; -O0:    cmp x12, x13
8671 ; -O0:    stlxp w8, x14, x15, [x9]
8672 ; -O0:    stlxp w8, x10, x12, [x9]
8673 ; -O0:    subs x12, x12, x13
8674 ; -O0:    ccmp x10, x11, #0, eq
8676 ; -O1-LABEL: atomicrmw_umin_i128_aligned_seq_cst:
8677 ; -O1:    ldaxp x1, x0, [x8]
8678 ; -O1:    cmp x3, x1
8679 ; -O1:    csel x9, x0, x2, hs
8680 ; -O1:    csel x10, x1, x3, hs
8681 ; -O1:    stlxp w11, x10, x9, [x8]
8682     %r = atomicrmw umin ptr %ptr, i128 %value seq_cst, align 16
8683     ret i128 %r
8686 define dso_local i8 @atomicrmw_umin_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
8687 ; -O0-LABEL: atomicrmw_umin_i8_unaligned_monotonic:
8688 ; -O0:    and w9, w12, #0xff
8689 ; -O0:    subs w10, w9, w8, uxtb
8690 ; -O0:    csel w13, w12, w8, ls
8691 ; -O0:    ldaxrb w8, [x11]
8692 ; -O0:    cmp w8, w12, uxtb
8693 ; -O0:    stlxrb w10, w13, [x11]
8694 ; -O0:    subs w9, w8, w9
8695 ; -O0:    subs w9, w9, #1
8697 ; -O1-LABEL: atomicrmw_umin_i8_unaligned_monotonic:
8698 ; -O1:    and w9, w1, #0xff
8699 ; -O1:    ldxrb w8, [x0]
8700 ; -O1:    cmp w8, w9
8701 ; -O1:    csel w10, w8, w9, ls
8702 ; -O1:    stxrb w11, w10, [x0]
8703     %r = atomicrmw umin ptr %ptr, i8 %value monotonic, align 1
8704     ret i8 %r
8707 define dso_local i8 @atomicrmw_umin_i8_unaligned_acquire(ptr %ptr, i8 %value) {
8708 ; -O0-LABEL: atomicrmw_umin_i8_unaligned_acquire:
8709 ; -O0:    and w9, w12, #0xff
8710 ; -O0:    subs w10, w9, w8, uxtb
8711 ; -O0:    csel w13, w12, w8, ls
8712 ; -O0:    ldaxrb w8, [x11]
8713 ; -O0:    cmp w8, w12, uxtb
8714 ; -O0:    stlxrb w10, w13, [x11]
8715 ; -O0:    subs w9, w8, w9
8716 ; -O0:    subs w9, w9, #1
8718 ; -O1-LABEL: atomicrmw_umin_i8_unaligned_acquire:
8719 ; -O1:    and w9, w1, #0xff
8720 ; -O1:    ldaxrb w8, [x0]
8721 ; -O1:    cmp w8, w9
8722 ; -O1:    csel w10, w8, w9, ls
8723 ; -O1:    stxrb w11, w10, [x0]
8724     %r = atomicrmw umin ptr %ptr, i8 %value acquire, align 1
8725     ret i8 %r
8728 define dso_local i8 @atomicrmw_umin_i8_unaligned_release(ptr %ptr, i8 %value) {
8729 ; -O0-LABEL: atomicrmw_umin_i8_unaligned_release:
8730 ; -O0:    and w9, w12, #0xff
8731 ; -O0:    subs w10, w9, w8, uxtb
8732 ; -O0:    csel w13, w12, w8, ls
8733 ; -O0:    ldaxrb w8, [x11]
8734 ; -O0:    cmp w8, w12, uxtb
8735 ; -O0:    stlxrb w10, w13, [x11]
8736 ; -O0:    subs w9, w8, w9
8737 ; -O0:    subs w9, w9, #1
8739 ; -O1-LABEL: atomicrmw_umin_i8_unaligned_release:
8740 ; -O1:    and w9, w1, #0xff
8741 ; -O1:    ldxrb w8, [x0]
8742 ; -O1:    cmp w8, w9
8743 ; -O1:    csel w10, w8, w9, ls
8744 ; -O1:    stlxrb w11, w10, [x0]
8745     %r = atomicrmw umin ptr %ptr, i8 %value release, align 1
8746     ret i8 %r
8749 define dso_local i8 @atomicrmw_umin_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
8750 ; -O0-LABEL: atomicrmw_umin_i8_unaligned_acq_rel:
8751 ; -O0:    and w9, w12, #0xff
8752 ; -O0:    subs w10, w9, w8, uxtb
8753 ; -O0:    csel w13, w12, w8, ls
8754 ; -O0:    ldaxrb w8, [x11]
8755 ; -O0:    cmp w8, w12, uxtb
8756 ; -O0:    stlxrb w10, w13, [x11]
8757 ; -O0:    subs w9, w8, w9
8758 ; -O0:    subs w9, w9, #1
8760 ; -O1-LABEL: atomicrmw_umin_i8_unaligned_acq_rel:
8761 ; -O1:    and w9, w1, #0xff
8762 ; -O1:    ldaxrb w8, [x0]
8763 ; -O1:    cmp w8, w9
8764 ; -O1:    csel w10, w8, w9, ls
8765 ; -O1:    stlxrb w11, w10, [x0]
8766     %r = atomicrmw umin ptr %ptr, i8 %value acq_rel, align 1
8767     ret i8 %r
8770 define dso_local i8 @atomicrmw_umin_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
8771 ; -O0-LABEL: atomicrmw_umin_i8_unaligned_seq_cst:
8772 ; -O0:    and w9, w12, #0xff
8773 ; -O0:    subs w10, w9, w8, uxtb
8774 ; -O0:    csel w13, w12, w8, ls
8775 ; -O0:    ldaxrb w8, [x11]
8776 ; -O0:    cmp w8, w12, uxtb
8777 ; -O0:    stlxrb w10, w13, [x11]
8778 ; -O0:    subs w9, w8, w9
8779 ; -O0:    subs w9, w9, #1
8781 ; -O1-LABEL: atomicrmw_umin_i8_unaligned_seq_cst:
8782 ; -O1:    and w9, w1, #0xff
8783 ; -O1:    ldaxrb w8, [x0]
8784 ; -O1:    cmp w8, w9
8785 ; -O1:    csel w10, w8, w9, ls
8786 ; -O1:    stlxrb w11, w10, [x0]
8787     %r = atomicrmw umin ptr %ptr, i8 %value seq_cst, align 1
8788     ret i8 %r
8791 define dso_local i16 @atomicrmw_umin_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
8792 ; -O0-LABEL: atomicrmw_umin_i16_unaligned_monotonic:
8793 ; -O0:    and w10, w9, #0xffff
8794 ; -O0:    subs w10, w10, w8, uxth
8795 ; -O0:    csel w8, w9, w8, ls
8796 ; -O0:    bl __atomic_compare_exchange
8798 ; -O1-LABEL: atomicrmw_umin_i16_unaligned_monotonic:
8799 ; -O1:    and w8, w0, #0xffff
8800 ; -O1:    cmp w8, w20, uxth
8801 ; -O1:    csel w8, w0, w20, ls
8802 ; -O1:    bl __atomic_compare_exchange
8803     %r = atomicrmw umin ptr %ptr, i16 %value monotonic, align 1
8804     ret i16 %r
8807 define dso_local i16 @atomicrmw_umin_i16_unaligned_acquire(ptr %ptr, i16 %value) {
8808 ; -O0-LABEL: atomicrmw_umin_i16_unaligned_acquire:
8809 ; -O0:    and w10, w9, #0xffff
8810 ; -O0:    subs w10, w10, w8, uxth
8811 ; -O0:    csel w8, w9, w8, ls
8812 ; -O0:    bl __atomic_compare_exchange
8814 ; -O1-LABEL: atomicrmw_umin_i16_unaligned_acquire:
8815 ; -O1:    and w8, w0, #0xffff
8816 ; -O1:    cmp w8, w20, uxth
8817 ; -O1:    csel w8, w0, w20, ls
8818 ; -O1:    bl __atomic_compare_exchange
8819     %r = atomicrmw umin ptr %ptr, i16 %value acquire, align 1
8820     ret i16 %r
8823 define dso_local i16 @atomicrmw_umin_i16_unaligned_release(ptr %ptr, i16 %value) {
8824 ; -O0-LABEL: atomicrmw_umin_i16_unaligned_release:
8825 ; -O0:    and w10, w9, #0xffff
8826 ; -O0:    subs w10, w10, w8, uxth
8827 ; -O0:    csel w8, w9, w8, ls
8828 ; -O0:    bl __atomic_compare_exchange
8830 ; -O1-LABEL: atomicrmw_umin_i16_unaligned_release:
8831 ; -O1:    and w8, w0, #0xffff
8832 ; -O1:    cmp w8, w20, uxth
8833 ; -O1:    csel w8, w0, w20, ls
8834 ; -O1:    bl __atomic_compare_exchange
8835     %r = atomicrmw umin ptr %ptr, i16 %value release, align 1
8836     ret i16 %r
8839 define dso_local i16 @atomicrmw_umin_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
8840 ; -O0-LABEL: atomicrmw_umin_i16_unaligned_acq_rel:
8841 ; -O0:    and w10, w9, #0xffff
8842 ; -O0:    subs w10, w10, w8, uxth
8843 ; -O0:    csel w8, w9, w8, ls
8844 ; -O0:    bl __atomic_compare_exchange
8846 ; -O1-LABEL: atomicrmw_umin_i16_unaligned_acq_rel:
8847 ; -O1:    and w8, w0, #0xffff
8848 ; -O1:    cmp w8, w20, uxth
8849 ; -O1:    csel w8, w0, w20, ls
8850 ; -O1:    bl __atomic_compare_exchange
8851     %r = atomicrmw umin ptr %ptr, i16 %value acq_rel, align 1
8852     ret i16 %r
8855 define dso_local i16 @atomicrmw_umin_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
8856 ; -O0-LABEL: atomicrmw_umin_i16_unaligned_seq_cst:
8857 ; -O0:    and w10, w9, #0xffff
8858 ; -O0:    subs w10, w10, w8, uxth
8859 ; -O0:    csel w8, w9, w8, ls
8860 ; -O0:    bl __atomic_compare_exchange
8862 ; -O1-LABEL: atomicrmw_umin_i16_unaligned_seq_cst:
8863 ; -O1:    and w8, w0, #0xffff
8864 ; -O1:    cmp w8, w20, uxth
8865 ; -O1:    csel w8, w0, w20, ls
8866 ; -O1:    bl __atomic_compare_exchange
8867     %r = atomicrmw umin ptr %ptr, i16 %value seq_cst, align 1
8868     ret i16 %r
8871 define dso_local i32 @atomicrmw_umin_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
8872 ; -O0-LABEL: atomicrmw_umin_i32_unaligned_monotonic:
8873 ; -O0:    subs w10, w9, w8
8874 ; -O0:    csel w8, w9, w8, ls
8875 ; -O0:    bl __atomic_compare_exchange
8877 ; -O1-LABEL: atomicrmw_umin_i32_unaligned_monotonic:
8878 ; -O1:    cmp w0, w20
8879 ; -O1:    csel w8, w0, w20, ls
8880 ; -O1:    bl __atomic_compare_exchange
8881     %r = atomicrmw umin ptr %ptr, i32 %value monotonic, align 1
8882     ret i32 %r
8885 define dso_local i32 @atomicrmw_umin_i32_unaligned_acquire(ptr %ptr, i32 %value) {
8886 ; -O0-LABEL: atomicrmw_umin_i32_unaligned_acquire:
8887 ; -O0:    subs w10, w9, w8
8888 ; -O0:    csel w8, w9, w8, ls
8889 ; -O0:    bl __atomic_compare_exchange
8891 ; -O1-LABEL: atomicrmw_umin_i32_unaligned_acquire:
8892 ; -O1:    cmp w0, w20
8893 ; -O1:    csel w8, w0, w20, ls
8894 ; -O1:    bl __atomic_compare_exchange
8895     %r = atomicrmw umin ptr %ptr, i32 %value acquire, align 1
8896     ret i32 %r
8899 define dso_local i32 @atomicrmw_umin_i32_unaligned_release(ptr %ptr, i32 %value) {
8900 ; -O0-LABEL: atomicrmw_umin_i32_unaligned_release:
8901 ; -O0:    subs w10, w9, w8
8902 ; -O0:    csel w8, w9, w8, ls
8903 ; -O0:    bl __atomic_compare_exchange
8905 ; -O1-LABEL: atomicrmw_umin_i32_unaligned_release:
8906 ; -O1:    cmp w0, w20
8907 ; -O1:    csel w8, w0, w20, ls
8908 ; -O1:    bl __atomic_compare_exchange
8909     %r = atomicrmw umin ptr %ptr, i32 %value release, align 1
8910     ret i32 %r
8913 define dso_local i32 @atomicrmw_umin_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
8914 ; -O0-LABEL: atomicrmw_umin_i32_unaligned_acq_rel:
8915 ; -O0:    subs w10, w9, w8
8916 ; -O0:    csel w8, w9, w8, ls
8917 ; -O0:    bl __atomic_compare_exchange
8919 ; -O1-LABEL: atomicrmw_umin_i32_unaligned_acq_rel:
8920 ; -O1:    cmp w0, w20
8921 ; -O1:    csel w8, w0, w20, ls
8922 ; -O1:    bl __atomic_compare_exchange
8923     %r = atomicrmw umin ptr %ptr, i32 %value acq_rel, align 1
8924     ret i32 %r
8927 define dso_local i32 @atomicrmw_umin_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
8928 ; -O0-LABEL: atomicrmw_umin_i32_unaligned_seq_cst:
8929 ; -O0:    subs w10, w9, w8
8930 ; -O0:    csel w8, w9, w8, ls
8931 ; -O0:    bl __atomic_compare_exchange
8933 ; -O1-LABEL: atomicrmw_umin_i32_unaligned_seq_cst:
8934 ; -O1:    cmp w0, w20
8935 ; -O1:    csel w8, w0, w20, ls
8936 ; -O1:    bl __atomic_compare_exchange
8937     %r = atomicrmw umin ptr %ptr, i32 %value seq_cst, align 1
8938     ret i32 %r
8941 define dso_local i64 @atomicrmw_umin_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
8942 ; -O0-LABEL: atomicrmw_umin_i64_unaligned_monotonic:
8943 ; -O0:    subs x10, x9, x8
8944 ; -O0:    csel x8, x9, x8, ls
8945 ; -O0:    bl __atomic_compare_exchange
8947 ; -O1-LABEL: atomicrmw_umin_i64_unaligned_monotonic:
8948 ; -O1:    cmp x0, x20
8949 ; -O1:    csel x8, x0, x20, ls
8950 ; -O1:    bl __atomic_compare_exchange
8951     %r = atomicrmw umin ptr %ptr, i64 %value monotonic, align 1
8952     ret i64 %r
8955 define dso_local i64 @atomicrmw_umin_i64_unaligned_acquire(ptr %ptr, i64 %value) {
8956 ; -O0-LABEL: atomicrmw_umin_i64_unaligned_acquire:
8957 ; -O0:    subs x10, x9, x8
8958 ; -O0:    csel x8, x9, x8, ls
8959 ; -O0:    bl __atomic_compare_exchange
8961 ; -O1-LABEL: atomicrmw_umin_i64_unaligned_acquire:
8962 ; -O1:    cmp x0, x20
8963 ; -O1:    csel x8, x0, x20, ls
8964 ; -O1:    bl __atomic_compare_exchange
8965     %r = atomicrmw umin ptr %ptr, i64 %value acquire, align 1
8966     ret i64 %r
8969 define dso_local i64 @atomicrmw_umin_i64_unaligned_release(ptr %ptr, i64 %value) {
8970 ; -O0-LABEL: atomicrmw_umin_i64_unaligned_release:
8971 ; -O0:    subs x10, x9, x8
8972 ; -O0:    csel x8, x9, x8, ls
8973 ; -O0:    bl __atomic_compare_exchange
8975 ; -O1-LABEL: atomicrmw_umin_i64_unaligned_release:
8976 ; -O1:    cmp x0, x20
8977 ; -O1:    csel x8, x0, x20, ls
8978 ; -O1:    bl __atomic_compare_exchange
8979     %r = atomicrmw umin ptr %ptr, i64 %value release, align 1
8980     ret i64 %r
8983 define dso_local i64 @atomicrmw_umin_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
8984 ; -O0-LABEL: atomicrmw_umin_i64_unaligned_acq_rel:
8985 ; -O0:    subs x10, x9, x8
8986 ; -O0:    csel x8, x9, x8, ls
8987 ; -O0:    bl __atomic_compare_exchange
8989 ; -O1-LABEL: atomicrmw_umin_i64_unaligned_acq_rel:
8990 ; -O1:    cmp x0, x20
8991 ; -O1:    csel x8, x0, x20, ls
8992 ; -O1:    bl __atomic_compare_exchange
8993     %r = atomicrmw umin ptr %ptr, i64 %value acq_rel, align 1
8994     ret i64 %r
8997 define dso_local i64 @atomicrmw_umin_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
8998 ; -O0-LABEL: atomicrmw_umin_i64_unaligned_seq_cst:
8999 ; -O0:    subs x10, x9, x8
9000 ; -O0:    csel x8, x9, x8, ls
9001 ; -O0:    bl __atomic_compare_exchange
9003 ; -O1-LABEL: atomicrmw_umin_i64_unaligned_seq_cst:
9004 ; -O1:    cmp x0, x20
9005 ; -O1:    csel x8, x0, x20, ls
9006 ; -O1:    bl __atomic_compare_exchange
9007     %r = atomicrmw umin ptr %ptr, i64 %value seq_cst, align 1
9008     ret i64 %r
9011 define dso_local i128 @atomicrmw_umin_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
9012 ; -O0-LABEL: atomicrmw_umin_i128_unaligned_monotonic:
9013 ; -O0:    subs x12, x9, x10
9014 ; -O0:    csel x8, x11, x8, hs
9015 ; -O0:    csel x9, x10, x9, hs
9016 ; -O0:    bl __atomic_compare_exchange
9018 ; -O1-LABEL: atomicrmw_umin_i128_unaligned_monotonic:
9019 ; -O1:    ldp x0, x1, [x0]
9020 ; -O1:    cmp x19, x1
9021 ; -O1:    csel x8, x1, x19, hs
9022 ; -O1:    csel x9, x0, x21, hs
9023 ; -O1:    bl __atomic_compare_exchange
9024     %r = atomicrmw umin ptr %ptr, i128 %value monotonic, align 1
9025     ret i128 %r
9028 define dso_local i128 @atomicrmw_umin_i128_unaligned_acquire(ptr %ptr, i128 %value) {
9029 ; -O0-LABEL: atomicrmw_umin_i128_unaligned_acquire:
9030 ; -O0:    subs x12, x9, x10
9031 ; -O0:    csel x8, x11, x8, hs
9032 ; -O0:    csel x9, x10, x9, hs
9033 ; -O0:    bl __atomic_compare_exchange
9035 ; -O1-LABEL: atomicrmw_umin_i128_unaligned_acquire:
9036 ; -O1:    ldp x0, x1, [x0]
9037 ; -O1:    cmp x19, x1
9038 ; -O1:    csel x8, x1, x19, hs
9039 ; -O1:    csel x9, x0, x21, hs
9040 ; -O1:    bl __atomic_compare_exchange
9041     %r = atomicrmw umin ptr %ptr, i128 %value acquire, align 1
9042     ret i128 %r
9045 define dso_local i128 @atomicrmw_umin_i128_unaligned_release(ptr %ptr, i128 %value) {
9046 ; -O0-LABEL: atomicrmw_umin_i128_unaligned_release:
9047 ; -O0:    subs x12, x9, x10
9048 ; -O0:    csel x8, x11, x8, hs
9049 ; -O0:    csel x9, x10, x9, hs
9050 ; -O0:    bl __atomic_compare_exchange
9052 ; -O1-LABEL: atomicrmw_umin_i128_unaligned_release:
9053 ; -O1:    ldp x0, x1, [x0]
9054 ; -O1:    cmp x19, x1
9055 ; -O1:    csel x8, x1, x19, hs
9056 ; -O1:    csel x9, x0, x21, hs
9057 ; -O1:    bl __atomic_compare_exchange
9058     %r = atomicrmw umin ptr %ptr, i128 %value release, align 1
9059     ret i128 %r
9062 define dso_local i128 @atomicrmw_umin_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
9063 ; -O0-LABEL: atomicrmw_umin_i128_unaligned_acq_rel:
9064 ; -O0:    subs x12, x9, x10
9065 ; -O0:    csel x8, x11, x8, hs
9066 ; -O0:    csel x9, x10, x9, hs
9067 ; -O0:    bl __atomic_compare_exchange
9069 ; -O1-LABEL: atomicrmw_umin_i128_unaligned_acq_rel:
9070 ; -O1:    ldp x0, x1, [x0]
9071 ; -O1:    cmp x19, x1
9072 ; -O1:    csel x8, x1, x19, hs
9073 ; -O1:    csel x9, x0, x21, hs
9074 ; -O1:    bl __atomic_compare_exchange
9075     %r = atomicrmw umin ptr %ptr, i128 %value acq_rel, align 1
9076     ret i128 %r
9079 define dso_local i128 @atomicrmw_umin_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
9080 ; -O0-LABEL: atomicrmw_umin_i128_unaligned_seq_cst:
9081 ; -O0:    subs x12, x9, x10
9082 ; -O0:    csel x8, x11, x8, hs
9083 ; -O0:    csel x9, x10, x9, hs
9084 ; -O0:    bl __atomic_compare_exchange
9086 ; -O1-LABEL: atomicrmw_umin_i128_unaligned_seq_cst:
9087 ; -O1:    ldp x0, x1, [x0]
9088 ; -O1:    cmp x19, x1
9089 ; -O1:    csel x8, x1, x19, hs
9090 ; -O1:    csel x9, x0, x21, hs
9091 ; -O1:    bl __atomic_compare_exchange
9092     %r = atomicrmw umin ptr %ptr, i128 %value seq_cst, align 1
9093     ret i128 %r