[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / arm64-atomic.ll
blobaa5e54992f486fbada175bce114f1df667cc0824
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-NOLSE,CHECK-NOLSE-O1
3 ; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-NOLSE,CHECK-NOLSE-O0
4 ; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mcpu=apple-a13 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O1
5 ; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mcpu=apple-a13 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O0
7 define i32 @val_compare_and_swap(ptr %p, i32 %cmp, i32 %new) #0 {
8 ; CHECK-NOLSE-O1-LABEL: val_compare_and_swap:
9 ; CHECK-NOLSE-O1:       ; %bb.0:
10 ; CHECK-NOLSE-O1-NEXT:  LBB0_1: ; %cmpxchg.start
11 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
12 ; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
13 ; CHECK-NOLSE-O1-NEXT:    cmp w8, w1
14 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB0_4
15 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
16 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB0_1 Depth=1
17 ; CHECK-NOLSE-O1-NEXT:    stxr w9, w2, [x0]
18 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB0_1
19 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
20 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
21 ; CHECK-NOLSE-O1-NEXT:    ret
22 ; CHECK-NOLSE-O1-NEXT:  LBB0_4: ; %cmpxchg.nostore
23 ; CHECK-NOLSE-O1-NEXT:    clrex
24 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
25 ; CHECK-NOLSE-O1-NEXT:    ret
27 ; CHECK-NOLSE-O0-LABEL: val_compare_and_swap:
28 ; CHECK-NOLSE-O0:       ; %bb.0:
29 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
30 ; CHECK-NOLSE-O0-NEXT:  LBB0_1: ; =>This Inner Loop Header: Depth=1
31 ; CHECK-NOLSE-O0-NEXT:    ldaxr w0, [x9]
32 ; CHECK-NOLSE-O0-NEXT:    cmp w0, w1
33 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB0_3
34 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB0_1 Depth=1
35 ; CHECK-NOLSE-O0-NEXT:    stlxr w8, w2, [x9]
36 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB0_1
37 ; CHECK-NOLSE-O0-NEXT:  LBB0_3:
38 ; CHECK-NOLSE-O0-NEXT:    ret
40 ; CHECK-LSE-O1-LABEL: val_compare_and_swap:
41 ; CHECK-LSE-O1:       ; %bb.0:
42 ; CHECK-LSE-O1-NEXT:    casa w1, w2, [x0]
43 ; CHECK-LSE-O1-NEXT:    mov x0, x1
44 ; CHECK-LSE-O1-NEXT:    ret
46 ; CHECK-LSE-O0-LABEL: val_compare_and_swap:
47 ; CHECK-LSE-O0:       ; %bb.0:
48 ; CHECK-LSE-O0-NEXT:    mov x8, x0
49 ; CHECK-LSE-O0-NEXT:    mov x0, x1
50 ; CHECK-LSE-O0-NEXT:    casa w0, w2, [x8]
51 ; CHECK-LSE-O0-NEXT:    ret
52   %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acquire acquire
53   %val = extractvalue { i32, i1 } %pair, 0
54   ret i32 %val
57 define i32 @val_compare_and_swap_from_load(ptr %p, i32 %cmp, ptr %pnew) #0 {
58 ; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_from_load:
59 ; CHECK-NOLSE-O1:       ; %bb.0:
60 ; CHECK-NOLSE-O1-NEXT:    ldr w9, [x2]
61 ; CHECK-NOLSE-O1-NEXT:  LBB1_1: ; %cmpxchg.start
62 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
63 ; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
64 ; CHECK-NOLSE-O1-NEXT:    cmp w8, w1
65 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB1_4
66 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
67 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB1_1 Depth=1
68 ; CHECK-NOLSE-O1-NEXT:    stxr w10, w9, [x0]
69 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB1_1
70 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
71 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
72 ; CHECK-NOLSE-O1-NEXT:    ret
73 ; CHECK-NOLSE-O1-NEXT:  LBB1_4: ; %cmpxchg.nostore
74 ; CHECK-NOLSE-O1-NEXT:    clrex
75 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
76 ; CHECK-NOLSE-O1-NEXT:    ret
78 ; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_from_load:
79 ; CHECK-NOLSE-O0:       ; %bb.0:
80 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
81 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [x2]
82 ; CHECK-NOLSE-O0-NEXT:  LBB1_1: ; =>This Inner Loop Header: Depth=1
83 ; CHECK-NOLSE-O0-NEXT:    ldaxr w0, [x9]
84 ; CHECK-NOLSE-O0-NEXT:    cmp w0, w1
85 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB1_3
86 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB1_1 Depth=1
87 ; CHECK-NOLSE-O0-NEXT:    stlxr w8, w10, [x9]
88 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB1_1
89 ; CHECK-NOLSE-O0-NEXT:  LBB1_3:
90 ; CHECK-NOLSE-O0-NEXT:    ret
92 ; CHECK-LSE-O1-LABEL: val_compare_and_swap_from_load:
93 ; CHECK-LSE-O1:       ; %bb.0:
94 ; CHECK-LSE-O1-NEXT:    ldr w8, [x2]
95 ; CHECK-LSE-O1-NEXT:    casa w1, w8, [x0]
96 ; CHECK-LSE-O1-NEXT:    mov x0, x1
97 ; CHECK-LSE-O1-NEXT:    ret
99 ; CHECK-LSE-O0-LABEL: val_compare_and_swap_from_load:
100 ; CHECK-LSE-O0:       ; %bb.0:
101 ; CHECK-LSE-O0-NEXT:    mov x9, x0
102 ; CHECK-LSE-O0-NEXT:    mov x0, x1
103 ; CHECK-LSE-O0-NEXT:    ldr w8, [x2]
104 ; CHECK-LSE-O0-NEXT:    casa w0, w8, [x9]
105 ; CHECK-LSE-O0-NEXT:    ret
106   %new = load i32, ptr %pnew
107   %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acquire acquire
108   %val = extractvalue { i32, i1 } %pair, 0
109   ret i32 %val
112 define i32 @val_compare_and_swap_rel(ptr %p, i32 %cmp, i32 %new) #0 {
113 ; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_rel:
114 ; CHECK-NOLSE-O1:       ; %bb.0:
115 ; CHECK-NOLSE-O1-NEXT:  LBB2_1: ; %cmpxchg.start
116 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
117 ; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
118 ; CHECK-NOLSE-O1-NEXT:    cmp w8, w1
119 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB2_4
120 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
121 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB2_1 Depth=1
122 ; CHECK-NOLSE-O1-NEXT:    stlxr w9, w2, [x0]
123 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB2_1
124 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
125 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
126 ; CHECK-NOLSE-O1-NEXT:    ret
127 ; CHECK-NOLSE-O1-NEXT:  LBB2_4: ; %cmpxchg.nostore
128 ; CHECK-NOLSE-O1-NEXT:    clrex
129 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
130 ; CHECK-NOLSE-O1-NEXT:    ret
132 ; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_rel:
133 ; CHECK-NOLSE-O0:       ; %bb.0:
134 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
135 ; CHECK-NOLSE-O0-NEXT:  LBB2_1: ; =>This Inner Loop Header: Depth=1
136 ; CHECK-NOLSE-O0-NEXT:    ldaxr w0, [x9]
137 ; CHECK-NOLSE-O0-NEXT:    cmp w0, w1
138 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB2_3
139 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB2_1 Depth=1
140 ; CHECK-NOLSE-O0-NEXT:    stlxr w8, w2, [x9]
141 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB2_1
142 ; CHECK-NOLSE-O0-NEXT:  LBB2_3:
143 ; CHECK-NOLSE-O0-NEXT:    ret
145 ; CHECK-LSE-O1-LABEL: val_compare_and_swap_rel:
146 ; CHECK-LSE-O1:       ; %bb.0:
147 ; CHECK-LSE-O1-NEXT:    casal w1, w2, [x0]
148 ; CHECK-LSE-O1-NEXT:    mov x0, x1
149 ; CHECK-LSE-O1-NEXT:    ret
151 ; CHECK-LSE-O0-LABEL: val_compare_and_swap_rel:
152 ; CHECK-LSE-O0:       ; %bb.0:
153 ; CHECK-LSE-O0-NEXT:    mov x8, x0
154 ; CHECK-LSE-O0-NEXT:    mov x0, x1
155 ; CHECK-LSE-O0-NEXT:    casal w0, w2, [x8]
156 ; CHECK-LSE-O0-NEXT:    ret
157   %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acq_rel monotonic
158   %val = extractvalue { i32, i1 } %pair, 0
159   ret i32 %val
162 define i64 @val_compare_and_swap_64(ptr %p, i64 %cmp, i64 %new) #0 {
163 ; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64:
164 ; CHECK-NOLSE-O1:       ; %bb.0:
165 ; CHECK-NOLSE-O1-NEXT:  LBB3_1: ; %cmpxchg.start
166 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
167 ; CHECK-NOLSE-O1-NEXT:    ldxr x8, [x0]
168 ; CHECK-NOLSE-O1-NEXT:    cmp x8, x1
169 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB3_4
170 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
171 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB3_1 Depth=1
172 ; CHECK-NOLSE-O1-NEXT:    stxr w9, x2, [x0]
173 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB3_1
174 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
175 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
176 ; CHECK-NOLSE-O1-NEXT:    ret
177 ; CHECK-NOLSE-O1-NEXT:  LBB3_4: ; %cmpxchg.nostore
178 ; CHECK-NOLSE-O1-NEXT:    clrex
179 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
180 ; CHECK-NOLSE-O1-NEXT:    ret
182 ; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64:
183 ; CHECK-NOLSE-O0:       ; %bb.0:
184 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
185 ; CHECK-NOLSE-O0-NEXT:  LBB3_1: ; =>This Inner Loop Header: Depth=1
186 ; CHECK-NOLSE-O0-NEXT:    ldaxr x0, [x9]
187 ; CHECK-NOLSE-O0-NEXT:    cmp x0, x1
188 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB3_3
189 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB3_1 Depth=1
190 ; CHECK-NOLSE-O0-NEXT:    stlxr w8, x2, [x9]
191 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB3_1
192 ; CHECK-NOLSE-O0-NEXT:  LBB3_3:
193 ; CHECK-NOLSE-O0-NEXT:    ret
195 ; CHECK-LSE-O1-LABEL: val_compare_and_swap_64:
196 ; CHECK-LSE-O1:       ; %bb.0:
197 ; CHECK-LSE-O1-NEXT:    cas x1, x2, [x0]
198 ; CHECK-LSE-O1-NEXT:    mov x0, x1
199 ; CHECK-LSE-O1-NEXT:    ret
201 ; CHECK-LSE-O0-LABEL: val_compare_and_swap_64:
202 ; CHECK-LSE-O0:       ; %bb.0:
203 ; CHECK-LSE-O0-NEXT:    mov x8, x0
204 ; CHECK-LSE-O0-NEXT:    mov x0, x1
205 ; CHECK-LSE-O0-NEXT:    cas x0, x2, [x8]
206 ; CHECK-LSE-O0-NEXT:    ret
207   %pair = cmpxchg ptr %p, i64 %cmp, i64 %new monotonic monotonic
208   %val = extractvalue { i64, i1 } %pair, 0
209   ret i64 %val
212 define i64 @val_compare_and_swap_64_monotonic_seqcst(ptr %p, i64 %cmp, i64 %new) #0 {
213 ; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:
214 ; CHECK-NOLSE-O1:       ; %bb.0:
215 ; CHECK-NOLSE-O1-NEXT:  LBB4_1: ; %cmpxchg.start
216 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
217 ; CHECK-NOLSE-O1-NEXT:    ldaxr x8, [x0]
218 ; CHECK-NOLSE-O1-NEXT:    cmp x8, x1
219 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB4_4
220 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
221 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB4_1 Depth=1
222 ; CHECK-NOLSE-O1-NEXT:    stlxr w9, x2, [x0]
223 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB4_1
224 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
225 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
226 ; CHECK-NOLSE-O1-NEXT:    ret
227 ; CHECK-NOLSE-O1-NEXT:  LBB4_4: ; %cmpxchg.nostore
228 ; CHECK-NOLSE-O1-NEXT:    clrex
229 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
230 ; CHECK-NOLSE-O1-NEXT:    ret
232 ; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:
233 ; CHECK-NOLSE-O0:       ; %bb.0:
234 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
235 ; CHECK-NOLSE-O0-NEXT:  LBB4_1: ; =>This Inner Loop Header: Depth=1
236 ; CHECK-NOLSE-O0-NEXT:    ldaxr x0, [x9]
237 ; CHECK-NOLSE-O0-NEXT:    cmp x0, x1
238 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB4_3
239 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB4_1 Depth=1
240 ; CHECK-NOLSE-O0-NEXT:    stlxr w8, x2, [x9]
241 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB4_1
242 ; CHECK-NOLSE-O0-NEXT:  LBB4_3:
243 ; CHECK-NOLSE-O0-NEXT:    ret
245 ; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:
246 ; CHECK-LSE-O1:       ; %bb.0:
247 ; CHECK-LSE-O1-NEXT:    casal x1, x2, [x0]
248 ; CHECK-LSE-O1-NEXT:    mov x0, x1
249 ; CHECK-LSE-O1-NEXT:    ret
251 ; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:
252 ; CHECK-LSE-O0:       ; %bb.0:
253 ; CHECK-LSE-O0-NEXT:    mov x8, x0
254 ; CHECK-LSE-O0-NEXT:    mov x0, x1
255 ; CHECK-LSE-O0-NEXT:    casal x0, x2, [x8]
256 ; CHECK-LSE-O0-NEXT:    ret
257   %pair = cmpxchg ptr %p, i64 %cmp, i64 %new monotonic seq_cst
258   %val = extractvalue { i64, i1 } %pair, 0
259   ret i64 %val
262 define i64 @val_compare_and_swap_64_release_acquire(ptr %p, i64 %cmp, i64 %new) #0 {
263 ; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_release_acquire:
264 ; CHECK-NOLSE-O1:       ; %bb.0:
265 ; CHECK-NOLSE-O1-NEXT:  LBB5_1: ; %cmpxchg.start
266 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
267 ; CHECK-NOLSE-O1-NEXT:    ldaxr x8, [x0]
268 ; CHECK-NOLSE-O1-NEXT:    cmp x8, x1
269 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB5_4
270 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
271 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB5_1 Depth=1
272 ; CHECK-NOLSE-O1-NEXT:    stlxr w9, x2, [x0]
273 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB5_1
274 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
275 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
276 ; CHECK-NOLSE-O1-NEXT:    ret
277 ; CHECK-NOLSE-O1-NEXT:  LBB5_4: ; %cmpxchg.nostore
278 ; CHECK-NOLSE-O1-NEXT:    clrex
279 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
280 ; CHECK-NOLSE-O1-NEXT:    ret
282 ; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_release_acquire:
283 ; CHECK-NOLSE-O0:       ; %bb.0:
284 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
285 ; CHECK-NOLSE-O0-NEXT:  LBB5_1: ; =>This Inner Loop Header: Depth=1
286 ; CHECK-NOLSE-O0-NEXT:    ldaxr x0, [x9]
287 ; CHECK-NOLSE-O0-NEXT:    cmp x0, x1
288 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB5_3
289 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB5_1 Depth=1
290 ; CHECK-NOLSE-O0-NEXT:    stlxr w8, x2, [x9]
291 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB5_1
292 ; CHECK-NOLSE-O0-NEXT:  LBB5_3:
293 ; CHECK-NOLSE-O0-NEXT:    ret
295 ; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_release_acquire:
296 ; CHECK-LSE-O1:       ; %bb.0:
297 ; CHECK-LSE-O1-NEXT:    casal x1, x2, [x0]
298 ; CHECK-LSE-O1-NEXT:    mov x0, x1
299 ; CHECK-LSE-O1-NEXT:    ret
301 ; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_release_acquire:
302 ; CHECK-LSE-O0:       ; %bb.0:
303 ; CHECK-LSE-O0-NEXT:    mov x8, x0
304 ; CHECK-LSE-O0-NEXT:    mov x0, x1
305 ; CHECK-LSE-O0-NEXT:    casal x0, x2, [x8]
306 ; CHECK-LSE-O0-NEXT:    ret
307   %pair = cmpxchg ptr %p, i64 %cmp, i64 %new release acquire
308   %val = extractvalue { i64, i1 } %pair, 0
309   ret i64 %val
312 define i32 @fetch_and_nand(ptr %p) #0 {
313 ; CHECK-NOLSE-O1-LABEL: fetch_and_nand:
314 ; CHECK-NOLSE-O1:       ; %bb.0:
315 ; CHECK-NOLSE-O1-NEXT:  LBB6_1: ; %atomicrmw.start
316 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
317 ; CHECK-NOLSE-O1-NEXT:    ldxr w8, [x0]
318 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, #0x7
319 ; CHECK-NOLSE-O1-NEXT:    mvn w9, w9
320 ; CHECK-NOLSE-O1-NEXT:    stlxr w10, w9, [x0]
321 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB6_1
322 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
323 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
324 ; CHECK-NOLSE-O1-NEXT:    ret
326 ; CHECK-NOLSE-O0-LABEL: fetch_and_nand:
327 ; CHECK-NOLSE-O0:       ; %bb.0:
328 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
329 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
330 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0]
331 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
332 ; CHECK-NOLSE-O0-NEXT:    b LBB6_1
333 ; CHECK-NOLSE-O0-NEXT:  LBB6_1: ; %atomicrmw.start
334 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
335 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB6_2 Depth 2
336 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
337 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
338 ; CHECK-NOLSE-O0-NEXT:    and w9, w8, #0x7
339 ; CHECK-NOLSE-O0-NEXT:    mvn w12, w9
340 ; CHECK-NOLSE-O0-NEXT:  LBB6_2: ; %atomicrmw.start
341 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB6_1 Depth=1
342 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
343 ; CHECK-NOLSE-O0-NEXT:    ldaxr w9, [x11]
344 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8
345 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB6_4
346 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
347 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB6_2 Depth=2
348 ; CHECK-NOLSE-O0-NEXT:    stlxr w10, w12, [x11]
349 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB6_2
350 ; CHECK-NOLSE-O0-NEXT:  LBB6_4: ; %atomicrmw.start
351 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB6_1 Depth=1
352 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
353 ; CHECK-NOLSE-O0-NEXT:    subs w8, w9, w8
354 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
355 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
356 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB6_1
357 ; CHECK-NOLSE-O0-NEXT:    b LBB6_5
358 ; CHECK-NOLSE-O0-NEXT:  LBB6_5: ; %atomicrmw.end
359 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
360 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
361 ; CHECK-NOLSE-O0-NEXT:    ret
363 ; CHECK-LSE-O1-LABEL: fetch_and_nand:
364 ; CHECK-LSE-O1:       ; %bb.0:
365 ; CHECK-LSE-O1-NEXT:    mov x8, x0
366 ; CHECK-LSE-O1-NEXT:    ldr w0, [x0]
367 ; CHECK-LSE-O1-NEXT:  LBB6_1: ; %atomicrmw.start
368 ; CHECK-LSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
369 ; CHECK-LSE-O1-NEXT:    mov x9, x0
370 ; CHECK-LSE-O1-NEXT:    and w10, w0, #0x7
371 ; CHECK-LSE-O1-NEXT:    mvn w10, w10
372 ; CHECK-LSE-O1-NEXT:    casl w0, w10, [x8]
373 ; CHECK-LSE-O1-NEXT:    cmp w0, w9
374 ; CHECK-LSE-O1-NEXT:    b.ne LBB6_1
375 ; CHECK-LSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
376 ; CHECK-LSE-O1-NEXT:    ret
378 ; CHECK-LSE-O0-LABEL: fetch_and_nand:
379 ; CHECK-LSE-O0:       ; %bb.0:
380 ; CHECK-LSE-O0-NEXT:    sub sp, sp, #32
381 ; CHECK-LSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
382 ; CHECK-LSE-O0-NEXT:    ldr w8, [x0]
383 ; CHECK-LSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
384 ; CHECK-LSE-O0-NEXT:    b LBB6_1
385 ; CHECK-LSE-O0-NEXT:  LBB6_1: ; %atomicrmw.start
386 ; CHECK-LSE-O0-NEXT:    ; =>This Inner Loop Header: Depth=1
387 ; CHECK-LSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
388 ; CHECK-LSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
389 ; CHECK-LSE-O0-NEXT:    and w9, w8, #0x7
390 ; CHECK-LSE-O0-NEXT:    mvn w10, w9
391 ; CHECK-LSE-O0-NEXT:    mov x9, x8
392 ; CHECK-LSE-O0-NEXT:    casl w9, w10, [x11]
393 ; CHECK-LSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
394 ; CHECK-LSE-O0-NEXT:    subs w8, w9, w8
395 ; CHECK-LSE-O0-NEXT:    cset w8, eq
396 ; CHECK-LSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
397 ; CHECK-LSE-O0-NEXT:    tbz w8, #0, LBB6_1
398 ; CHECK-LSE-O0-NEXT:    b LBB6_2
399 ; CHECK-LSE-O0-NEXT:  LBB6_2: ; %atomicrmw.end
400 ; CHECK-LSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
401 ; CHECK-LSE-O0-NEXT:    add sp, sp, #32
402 ; CHECK-LSE-O0-NEXT:    ret
403   %val = atomicrmw nand ptr %p, i32 7 release
404   ret i32 %val
407 define i64 @fetch_and_nand_64(ptr %p) #0 {
408 ; CHECK-NOLSE-O1-LABEL: fetch_and_nand_64:
409 ; CHECK-NOLSE-O1:       ; %bb.0:
410 ; CHECK-NOLSE-O1-NEXT:  LBB7_1: ; %atomicrmw.start
411 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
412 ; CHECK-NOLSE-O1-NEXT:    ldaxr x8, [x0]
413 ; CHECK-NOLSE-O1-NEXT:    and x9, x8, #0x7
414 ; CHECK-NOLSE-O1-NEXT:    mvn x9, x9
415 ; CHECK-NOLSE-O1-NEXT:    stlxr w10, x9, [x0]
416 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB7_1
417 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
418 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
419 ; CHECK-NOLSE-O1-NEXT:    ret
421 ; CHECK-NOLSE-O0-LABEL: fetch_and_nand_64:
422 ; CHECK-NOLSE-O0:       ; %bb.0:
423 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
424 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
425 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0]
426 ; CHECK-NOLSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
427 ; CHECK-NOLSE-O0-NEXT:    b LBB7_1
428 ; CHECK-NOLSE-O0-NEXT:  LBB7_1: ; %atomicrmw.start
429 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
430 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB7_2 Depth 2
431 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
432 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
433 ; CHECK-NOLSE-O0-NEXT:    and x9, x8, #0x7
434 ; CHECK-NOLSE-O0-NEXT:    mvn x12, x9
435 ; CHECK-NOLSE-O0-NEXT:  LBB7_2: ; %atomicrmw.start
436 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB7_1 Depth=1
437 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
438 ; CHECK-NOLSE-O0-NEXT:    ldaxr x9, [x11]
439 ; CHECK-NOLSE-O0-NEXT:    cmp x9, x8
440 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB7_4
441 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
442 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB7_2 Depth=2
443 ; CHECK-NOLSE-O0-NEXT:    stlxr w10, x12, [x11]
444 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB7_2
445 ; CHECK-NOLSE-O0-NEXT:  LBB7_4: ; %atomicrmw.start
446 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB7_1 Depth=1
447 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
448 ; CHECK-NOLSE-O0-NEXT:    subs x8, x9, x8
449 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
450 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
451 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB7_1
452 ; CHECK-NOLSE-O0-NEXT:    b LBB7_5
453 ; CHECK-NOLSE-O0-NEXT:  LBB7_5: ; %atomicrmw.end
454 ; CHECK-NOLSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
455 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
456 ; CHECK-NOLSE-O0-NEXT:    ret
458 ; CHECK-LSE-O1-LABEL: fetch_and_nand_64:
459 ; CHECK-LSE-O1:       ; %bb.0:
460 ; CHECK-LSE-O1-NEXT:    mov x8, x0
461 ; CHECK-LSE-O1-NEXT:    ldr x0, [x0]
462 ; CHECK-LSE-O1-NEXT:  LBB7_1: ; %atomicrmw.start
463 ; CHECK-LSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
464 ; CHECK-LSE-O1-NEXT:    mov x9, x0
465 ; CHECK-LSE-O1-NEXT:    and x10, x0, #0x7
466 ; CHECK-LSE-O1-NEXT:    mvn x10, x10
467 ; CHECK-LSE-O1-NEXT:    casal x0, x10, [x8]
468 ; CHECK-LSE-O1-NEXT:    cmp x0, x9
469 ; CHECK-LSE-O1-NEXT:    b.ne LBB7_1
470 ; CHECK-LSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
471 ; CHECK-LSE-O1-NEXT:    ret
473 ; CHECK-LSE-O0-LABEL: fetch_and_nand_64:
474 ; CHECK-LSE-O0:       ; %bb.0:
475 ; CHECK-LSE-O0-NEXT:    sub sp, sp, #32
476 ; CHECK-LSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
477 ; CHECK-LSE-O0-NEXT:    ldr x8, [x0]
478 ; CHECK-LSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
479 ; CHECK-LSE-O0-NEXT:    b LBB7_1
480 ; CHECK-LSE-O0-NEXT:  LBB7_1: ; %atomicrmw.start
481 ; CHECK-LSE-O0-NEXT:    ; =>This Inner Loop Header: Depth=1
482 ; CHECK-LSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
483 ; CHECK-LSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
484 ; CHECK-LSE-O0-NEXT:    and x9, x8, #0x7
485 ; CHECK-LSE-O0-NEXT:    mvn x10, x9
486 ; CHECK-LSE-O0-NEXT:    mov x9, x8
487 ; CHECK-LSE-O0-NEXT:    casal x9, x10, [x11]
488 ; CHECK-LSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
489 ; CHECK-LSE-O0-NEXT:    subs x8, x9, x8
490 ; CHECK-LSE-O0-NEXT:    cset w8, eq
491 ; CHECK-LSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
492 ; CHECK-LSE-O0-NEXT:    tbz w8, #0, LBB7_1
493 ; CHECK-LSE-O0-NEXT:    b LBB7_2
494 ; CHECK-LSE-O0-NEXT:  LBB7_2: ; %atomicrmw.end
495 ; CHECK-LSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
496 ; CHECK-LSE-O0-NEXT:    add sp, sp, #32
497 ; CHECK-LSE-O0-NEXT:    ret
498   %val = atomicrmw nand ptr %p, i64 7 acq_rel
499   ret i64 %val
502 define i32 @fetch_and_or(ptr %p) #0 {
503 ; CHECK-NOLSE-O1-LABEL: fetch_and_or:
504 ; CHECK-NOLSE-O1:       ; %bb.0:
505 ; CHECK-NOLSE-O1-NEXT:    mov w9, #5 ; =0x5
506 ; CHECK-NOLSE-O1-NEXT:  LBB8_1: ; %atomicrmw.start
507 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
508 ; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
509 ; CHECK-NOLSE-O1-NEXT:    orr w10, w8, w9
510 ; CHECK-NOLSE-O1-NEXT:    stlxr w11, w10, [x0]
511 ; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB8_1
512 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
513 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
514 ; CHECK-NOLSE-O1-NEXT:    ret
516 ; CHECK-NOLSE-O0-LABEL: fetch_and_or:
517 ; CHECK-NOLSE-O0:       ; %bb.0:
518 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
519 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
520 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0]
521 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
522 ; CHECK-NOLSE-O0-NEXT:    b LBB8_1
523 ; CHECK-NOLSE-O0-NEXT:  LBB8_1: ; %atomicrmw.start
524 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
525 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB8_2 Depth 2
526 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
527 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
528 ; CHECK-NOLSE-O0-NEXT:    mov w9, #5 ; =0x5
529 ; CHECK-NOLSE-O0-NEXT:    orr w12, w8, w9
530 ; CHECK-NOLSE-O0-NEXT:  LBB8_2: ; %atomicrmw.start
531 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB8_1 Depth=1
532 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
533 ; CHECK-NOLSE-O0-NEXT:    ldaxr w9, [x11]
534 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8
535 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB8_4
536 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
537 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB8_2 Depth=2
538 ; CHECK-NOLSE-O0-NEXT:    stlxr w10, w12, [x11]
539 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB8_2
540 ; CHECK-NOLSE-O0-NEXT:  LBB8_4: ; %atomicrmw.start
541 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB8_1 Depth=1
542 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
543 ; CHECK-NOLSE-O0-NEXT:    subs w8, w9, w8
544 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
545 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
546 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB8_1
547 ; CHECK-NOLSE-O0-NEXT:    b LBB8_5
548 ; CHECK-NOLSE-O0-NEXT:  LBB8_5: ; %atomicrmw.end
549 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
550 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
551 ; CHECK-NOLSE-O0-NEXT:    ret
553 ; CHECK-LSE-O1-LABEL: fetch_and_or:
554 ; CHECK-LSE-O1:       ; %bb.0:
555 ; CHECK-LSE-O1-NEXT:    mov w8, #5 ; =0x5
556 ; CHECK-LSE-O1-NEXT:    ldsetal w8, w0, [x0]
557 ; CHECK-LSE-O1-NEXT:    ret
559 ; CHECK-LSE-O0-LABEL: fetch_and_or:
560 ; CHECK-LSE-O0:       ; %bb.0:
561 ; CHECK-LSE-O0-NEXT:    mov w8, #5 ; =0x5
562 ; CHECK-LSE-O0-NEXT:    ldsetal w8, w0, [x0]
563 ; CHECK-LSE-O0-NEXT:    ret
564   %val = atomicrmw or ptr %p, i32 5 seq_cst
565   ret i32 %val
568 define i64 @fetch_and_or_64(ptr %p) #0 {
569 ; CHECK-NOLSE-O1-LABEL: fetch_and_or_64:
570 ; CHECK-NOLSE-O1:       ; %bb.0:
571 ; CHECK-NOLSE-O1-NEXT:  LBB9_1: ; %atomicrmw.start
572 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
573 ; CHECK-NOLSE-O1-NEXT:    ldxr x8, [x0]
574 ; CHECK-NOLSE-O1-NEXT:    orr x9, x8, #0x7
575 ; CHECK-NOLSE-O1-NEXT:    stxr w10, x9, [x0]
576 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB9_1
577 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
578 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
579 ; CHECK-NOLSE-O1-NEXT:    ret
581 ; CHECK-NOLSE-O0-LABEL: fetch_and_or_64:
582 ; CHECK-NOLSE-O0:       ; %bb.0:
583 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
584 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
585 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0]
586 ; CHECK-NOLSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
587 ; CHECK-NOLSE-O0-NEXT:    b LBB9_1
588 ; CHECK-NOLSE-O0-NEXT:  LBB9_1: ; %atomicrmw.start
589 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
590 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB9_2 Depth 2
591 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
592 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
593 ; CHECK-NOLSE-O0-NEXT:    orr x12, x8, #0x7
594 ; CHECK-NOLSE-O0-NEXT:  LBB9_2: ; %atomicrmw.start
595 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB9_1 Depth=1
596 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
597 ; CHECK-NOLSE-O0-NEXT:    ldaxr x9, [x11]
598 ; CHECK-NOLSE-O0-NEXT:    cmp x9, x8
599 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB9_4
600 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
601 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB9_2 Depth=2
602 ; CHECK-NOLSE-O0-NEXT:    stlxr w10, x12, [x11]
603 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB9_2
604 ; CHECK-NOLSE-O0-NEXT:  LBB9_4: ; %atomicrmw.start
605 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB9_1 Depth=1
606 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
607 ; CHECK-NOLSE-O0-NEXT:    subs x8, x9, x8
608 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
609 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
610 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB9_1
611 ; CHECK-NOLSE-O0-NEXT:    b LBB9_5
612 ; CHECK-NOLSE-O0-NEXT:  LBB9_5: ; %atomicrmw.end
613 ; CHECK-NOLSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
614 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
615 ; CHECK-NOLSE-O0-NEXT:    ret
617 ; CHECK-LSE-O1-LABEL: fetch_and_or_64:
618 ; CHECK-LSE-O1:       ; %bb.0:
619 ; CHECK-LSE-O1-NEXT:    mov w8, #7 ; =0x7
620 ; CHECK-LSE-O1-NEXT:    ldset x8, x0, [x0]
621 ; CHECK-LSE-O1-NEXT:    ret
623 ; CHECK-LSE-O0-LABEL: fetch_and_or_64:
624 ; CHECK-LSE-O0:       ; %bb.0:
625 ; CHECK-LSE-O0-NEXT:    mov w8, #7 ; =0x7
626 ; CHECK-LSE-O0-NEXT:    ; kill: def $x8 killed $w8
627 ; CHECK-LSE-O0-NEXT:    ldset x8, x0, [x0]
628 ; CHECK-LSE-O0-NEXT:    ret
629   %val = atomicrmw or ptr %p, i64 7 monotonic
630   ret i64 %val
633 define void @acquire_fence() #0 {
634 ; CHECK-NOLSE-LABEL: acquire_fence:
635 ; CHECK-NOLSE:       ; %bb.0:
636 ; CHECK-NOLSE-NEXT:    dmb ishld
637 ; CHECK-NOLSE-NEXT:    ret
639 ; CHECK-LSE-O1-LABEL: acquire_fence:
640 ; CHECK-LSE-O1:       ; %bb.0:
641 ; CHECK-LSE-O1-NEXT:    dmb ishld
642 ; CHECK-LSE-O1-NEXT:    ret
644 ; CHECK-LSE-O0-LABEL: acquire_fence:
645 ; CHECK-LSE-O0:       ; %bb.0:
646 ; CHECK-LSE-O0-NEXT:    dmb ishld
647 ; CHECK-LSE-O0-NEXT:    ret
648    fence acquire
649    ret void
652 define void @release_fence() #0 {
653 ; CHECK-NOLSE-LABEL: release_fence:
654 ; CHECK-NOLSE:       ; %bb.0:
655 ; CHECK-NOLSE-NEXT:    dmb ish
656 ; CHECK-NOLSE-NEXT:    ret
658 ; CHECK-LSE-O1-LABEL: release_fence:
659 ; CHECK-LSE-O1:       ; %bb.0:
660 ; CHECK-LSE-O1-NEXT:    dmb ish
661 ; CHECK-LSE-O1-NEXT:    ret
663 ; CHECK-LSE-O0-LABEL: release_fence:
664 ; CHECK-LSE-O0:       ; %bb.0:
665 ; CHECK-LSE-O0-NEXT:    dmb ish
666 ; CHECK-LSE-O0-NEXT:    ret
667    fence release
668    ret void
671 define void @seq_cst_fence() #0 {
672 ; CHECK-NOLSE-LABEL: seq_cst_fence:
673 ; CHECK-NOLSE:       ; %bb.0:
674 ; CHECK-NOLSE-NEXT:    dmb ish
675 ; CHECK-NOLSE-NEXT:    ret
677 ; CHECK-LSE-O1-LABEL: seq_cst_fence:
678 ; CHECK-LSE-O1:       ; %bb.0:
679 ; CHECK-LSE-O1-NEXT:    dmb ish
680 ; CHECK-LSE-O1-NEXT:    ret
682 ; CHECK-LSE-O0-LABEL: seq_cst_fence:
683 ; CHECK-LSE-O0:       ; %bb.0:
684 ; CHECK-LSE-O0-NEXT:    dmb ish
685 ; CHECK-LSE-O0-NEXT:    ret
686    fence seq_cst
687    ret void
690 define i32 @atomic_load(ptr %p) #0 {
691 ; CHECK-NOLSE-LABEL: atomic_load:
692 ; CHECK-NOLSE:       ; %bb.0:
693 ; CHECK-NOLSE-NEXT:    ldar w0, [x0]
694 ; CHECK-NOLSE-NEXT:    ret
696 ; CHECK-LSE-O1-LABEL: atomic_load:
697 ; CHECK-LSE-O1:       ; %bb.0:
698 ; CHECK-LSE-O1-NEXT:    ldar w0, [x0]
699 ; CHECK-LSE-O1-NEXT:    ret
701 ; CHECK-LSE-O0-LABEL: atomic_load:
702 ; CHECK-LSE-O0:       ; %bb.0:
703 ; CHECK-LSE-O0-NEXT:    ldar w0, [x0]
704 ; CHECK-LSE-O0-NEXT:    ret
705    %r = load atomic i32, ptr %p seq_cst, align 4
706    ret i32 %r
709 define i8 @atomic_load_relaxed_8(ptr %p, i32 %off32) #0 {
710 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_8:
711 ; CHECK-NOLSE-O1:       ; %bb.0:
712 ; CHECK-NOLSE-O1-NEXT:    ldrb w8, [x0, #4095]
713 ; CHECK-NOLSE-O1-NEXT:    ldrb w9, [x0, w1, sxtw]
714 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
715 ; CHECK-NOLSE-O1-NEXT:    ldurb w10, [x0, #-256]
716 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w9
717 ; CHECK-NOLSE-O1-NEXT:    ldrb w9, [x11]
718 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w10
719 ; CHECK-NOLSE-O1-NEXT:    add w0, w8, w9
720 ; CHECK-NOLSE-O1-NEXT:    ret
722 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_8:
723 ; CHECK-NOLSE-O0:       ; %bb.0:
724 ; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x0, #4095]
725 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, w1, sxtw
726 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x8]
727 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxtb
728 ; CHECK-NOLSE-O0-NEXT:    subs x9, x0, #256
729 ; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x9]
730 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxtb
731 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
732 ; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x9]
733 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxtb
734 ; CHECK-NOLSE-O0-NEXT:    ret
736 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_8:
737 ; CHECK-LSE-O1:       ; %bb.0:
738 ; CHECK-LSE-O1-NEXT:    ldrb w8, [x0, #4095]
739 ; CHECK-LSE-O1-NEXT:    ldrb w9, [x0, w1, sxtw]
740 ; CHECK-LSE-O1-NEXT:    ldurb w10, [x0, #-256]
741 ; CHECK-LSE-O1-NEXT:    add w8, w8, w10
742 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
743 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
744 ; CHECK-LSE-O1-NEXT:    ldrb w9, [x9]
745 ; CHECK-LSE-O1-NEXT:    add w0, w8, w9
746 ; CHECK-LSE-O1-NEXT:    ret
748 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_8:
749 ; CHECK-LSE-O0:       ; %bb.0:
750 ; CHECK-LSE-O0-NEXT:    ldrb w9, [x0, #4095]
751 ; CHECK-LSE-O0-NEXT:    add x8, x0, w1, sxtw
752 ; CHECK-LSE-O0-NEXT:    ldrb w8, [x8]
753 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxtb
754 ; CHECK-LSE-O0-NEXT:    subs x9, x0, #256
755 ; CHECK-LSE-O0-NEXT:    ldrb w9, [x9]
756 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxtb
757 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
758 ; CHECK-LSE-O0-NEXT:    ldrb w9, [x9]
759 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxtb
760 ; CHECK-LSE-O0-NEXT:    ret
761   %ptr_unsigned = getelementptr i8, ptr %p, i32 4095
762   %val_unsigned = load atomic i8, ptr %ptr_unsigned monotonic, align 1
764   %ptr_regoff = getelementptr i8, ptr %p, i32 %off32
765   %val_regoff = load atomic i8, ptr %ptr_regoff unordered, align 1
766   %tot1 = add i8 %val_unsigned, %val_regoff
768   %ptr_unscaled = getelementptr i8, ptr %p, i32 -256
769   %val_unscaled = load atomic i8, ptr %ptr_unscaled monotonic, align 1
770   %tot2 = add i8 %tot1, %val_unscaled
772   %ptr_random = getelementptr i8, ptr %p, i32 1191936 ; 0x123000 (i.e. ADD imm)
773   %val_random = load atomic i8, ptr %ptr_random unordered, align 1
774   %tot3 = add i8 %tot2, %val_random
776   ret i8 %tot3
779 define i16 @atomic_load_relaxed_16(ptr %p, i32 %off32) #0 {
780 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_16:
781 ; CHECK-NOLSE-O1:       ; %bb.0:
782 ; CHECK-NOLSE-O1-NEXT:    ldrh w8, [x0, #8190]
783 ; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x0, w1, sxtw #1]
784 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
785 ; CHECK-NOLSE-O1-NEXT:    ldurh w10, [x0, #-256]
786 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w9
787 ; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x11]
788 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w10
789 ; CHECK-NOLSE-O1-NEXT:    add w0, w8, w9
790 ; CHECK-NOLSE-O1-NEXT:    ret
792 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_16:
793 ; CHECK-NOLSE-O0:       ; %bb.0:
794 ; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x0, #8190]
795 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, w1, sxtw #1
796 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x8]
797 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxth
798 ; CHECK-NOLSE-O0-NEXT:    subs x9, x0, #256
799 ; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x9]
800 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxth
801 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
802 ; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x9]
803 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxth
804 ; CHECK-NOLSE-O0-NEXT:    ret
806 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_16:
807 ; CHECK-LSE-O1:       ; %bb.0:
808 ; CHECK-LSE-O1-NEXT:    ldrh w8, [x0, #8190]
809 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x0, w1, sxtw #1]
810 ; CHECK-LSE-O1-NEXT:    ldurh w10, [x0, #-256]
811 ; CHECK-LSE-O1-NEXT:    add w8, w8, w10
812 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
813 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
814 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x9]
815 ; CHECK-LSE-O1-NEXT:    add w0, w8, w9
816 ; CHECK-LSE-O1-NEXT:    ret
818 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_16:
819 ; CHECK-LSE-O0:       ; %bb.0:
820 ; CHECK-LSE-O0-NEXT:    ldrh w9, [x0, #8190]
821 ; CHECK-LSE-O0-NEXT:    add x8, x0, w1, sxtw #1
822 ; CHECK-LSE-O0-NEXT:    ldrh w8, [x8]
823 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxth
824 ; CHECK-LSE-O0-NEXT:    subs x9, x0, #256
825 ; CHECK-LSE-O0-NEXT:    ldrh w9, [x9]
826 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxth
827 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
828 ; CHECK-LSE-O0-NEXT:    ldrh w9, [x9]
829 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxth
830 ; CHECK-LSE-O0-NEXT:    ret
831   %ptr_unsigned = getelementptr i16, ptr %p, i32 4095
832   %val_unsigned = load atomic i16, ptr %ptr_unsigned monotonic, align 2
834   %ptr_regoff = getelementptr i16, ptr %p, i32 %off32
835   %val_regoff = load atomic i16, ptr %ptr_regoff unordered, align 2
836   %tot1 = add i16 %val_unsigned, %val_regoff
838   %ptr_unscaled = getelementptr i16, ptr %p, i32 -128
839   %val_unscaled = load atomic i16, ptr %ptr_unscaled monotonic, align 2
840   %tot2 = add i16 %tot1, %val_unscaled
842   %ptr_random = getelementptr i16, ptr %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)
843   %val_random = load atomic i16, ptr %ptr_random unordered, align 2
844   %tot3 = add i16 %tot2, %val_random
846   ret i16 %tot3
849 define i32 @atomic_load_relaxed_32(ptr %p, i32 %off32) #0 {
850 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_32:
851 ; CHECK-NOLSE-O1:       ; %bb.0:
852 ; CHECK-NOLSE-O1-NEXT:    ldr w8, [x0, #16380]
853 ; CHECK-NOLSE-O1-NEXT:    ldr w9, [x0, w1, sxtw #2]
854 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
855 ; CHECK-NOLSE-O1-NEXT:    ldur w10, [x0, #-256]
856 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w9
857 ; CHECK-NOLSE-O1-NEXT:    ldr w9, [x11]
858 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w10
859 ; CHECK-NOLSE-O1-NEXT:    add w0, w8, w9
860 ; CHECK-NOLSE-O1-NEXT:    ret
862 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_32:
863 ; CHECK-NOLSE-O0:       ; %bb.0:
864 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0, #16380]
865 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [x0, w1, sxtw #2]
866 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9
867 ; CHECK-NOLSE-O0-NEXT:    ldur w9, [x0, #-256]
868 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9
869 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
870 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [x9]
871 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9
872 ; CHECK-NOLSE-O0-NEXT:    ret
874 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_32:
875 ; CHECK-LSE-O1:       ; %bb.0:
876 ; CHECK-LSE-O1-NEXT:    ldr w8, [x0, #16380]
877 ; CHECK-LSE-O1-NEXT:    ldr w9, [x0, w1, sxtw #2]
878 ; CHECK-LSE-O1-NEXT:    ldur w10, [x0, #-256]
879 ; CHECK-LSE-O1-NEXT:    add w8, w8, w10
880 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
881 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
882 ; CHECK-LSE-O1-NEXT:    ldr w9, [x9]
883 ; CHECK-LSE-O1-NEXT:    add w0, w8, w9
884 ; CHECK-LSE-O1-NEXT:    ret
886 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_32:
887 ; CHECK-LSE-O0:       ; %bb.0:
888 ; CHECK-LSE-O0-NEXT:    ldr w8, [x0, #16380]
889 ; CHECK-LSE-O0-NEXT:    ldr w9, [x0, w1, sxtw #2]
890 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9
891 ; CHECK-LSE-O0-NEXT:    ldur w9, [x0, #-256]
892 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9
893 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
894 ; CHECK-LSE-O0-NEXT:    ldr w9, [x9]
895 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9
896 ; CHECK-LSE-O0-NEXT:    ret
897   %ptr_unsigned = getelementptr i32, ptr %p, i32 4095
898   %val_unsigned = load atomic i32, ptr %ptr_unsigned monotonic, align 4
900   %ptr_regoff = getelementptr i32, ptr %p, i32 %off32
901   %val_regoff = load atomic i32, ptr %ptr_regoff unordered, align 4
902   %tot1 = add i32 %val_unsigned, %val_regoff
904   %ptr_unscaled = getelementptr i32, ptr %p, i32 -64
905   %val_unscaled = load atomic i32, ptr %ptr_unscaled monotonic, align 4
906   %tot2 = add i32 %tot1, %val_unscaled
908   %ptr_random = getelementptr i32, ptr %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)
909   %val_random = load atomic i32, ptr %ptr_random unordered, align 4
910   %tot3 = add i32 %tot2, %val_random
912   ret i32 %tot3
915 define i64 @atomic_load_relaxed_64(ptr %p, i32 %off32) #0 {
916 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_64:
917 ; CHECK-NOLSE-O1:       ; %bb.0:
918 ; CHECK-NOLSE-O1-NEXT:    ldr x8, [x0, #32760]
919 ; CHECK-NOLSE-O1-NEXT:    ldr x9, [x0, w1, sxtw #3]
920 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
921 ; CHECK-NOLSE-O1-NEXT:    ldur x10, [x0, #-256]
922 ; CHECK-NOLSE-O1-NEXT:    add x8, x8, x9
923 ; CHECK-NOLSE-O1-NEXT:    ldr x9, [x11]
924 ; CHECK-NOLSE-O1-NEXT:    add x8, x8, x10
925 ; CHECK-NOLSE-O1-NEXT:    add x0, x8, x9
926 ; CHECK-NOLSE-O1-NEXT:    ret
928 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_64:
929 ; CHECK-NOLSE-O0:       ; %bb.0:
930 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0, #32760]
931 ; CHECK-NOLSE-O0-NEXT:    ldr x9, [x0, w1, sxtw #3]
932 ; CHECK-NOLSE-O0-NEXT:    add x8, x8, x9
933 ; CHECK-NOLSE-O0-NEXT:    ldur x9, [x0, #-256]
934 ; CHECK-NOLSE-O0-NEXT:    add x8, x8, x9
935 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
936 ; CHECK-NOLSE-O0-NEXT:    ldr x9, [x9]
937 ; CHECK-NOLSE-O0-NEXT:    add x0, x8, x9
938 ; CHECK-NOLSE-O0-NEXT:    ret
940 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_64:
941 ; CHECK-LSE-O1:       ; %bb.0:
942 ; CHECK-LSE-O1-NEXT:    ldr x8, [x0, #32760]
943 ; CHECK-LSE-O1-NEXT:    ldr x9, [x0, w1, sxtw #3]
944 ; CHECK-LSE-O1-NEXT:    ldur x10, [x0, #-256]
945 ; CHECK-LSE-O1-NEXT:    add x8, x8, x10
946 ; CHECK-LSE-O1-NEXT:    add x8, x8, x9
947 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
948 ; CHECK-LSE-O1-NEXT:    ldr x9, [x9]
949 ; CHECK-LSE-O1-NEXT:    add x0, x8, x9
950 ; CHECK-LSE-O1-NEXT:    ret
952 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_64:
953 ; CHECK-LSE-O0:       ; %bb.0:
954 ; CHECK-LSE-O0-NEXT:    ldr x8, [x0, #32760]
955 ; CHECK-LSE-O0-NEXT:    ldr x9, [x0, w1, sxtw #3]
956 ; CHECK-LSE-O0-NEXT:    add x8, x8, x9
957 ; CHECK-LSE-O0-NEXT:    ldur x9, [x0, #-256]
958 ; CHECK-LSE-O0-NEXT:    add x8, x8, x9
959 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
960 ; CHECK-LSE-O0-NEXT:    ldr x9, [x9]
961 ; CHECK-LSE-O0-NEXT:    add x0, x8, x9
962 ; CHECK-LSE-O0-NEXT:    ret
963   %ptr_unsigned = getelementptr i64, ptr %p, i32 4095
964   %val_unsigned = load atomic i64, ptr %ptr_unsigned monotonic, align 8
966   %ptr_regoff = getelementptr i64, ptr %p, i32 %off32
967   %val_regoff = load atomic i64, ptr %ptr_regoff unordered, align 8
968   %tot1 = add i64 %val_unsigned, %val_regoff
970   %ptr_unscaled = getelementptr i64, ptr %p, i32 -32
971   %val_unscaled = load atomic i64, ptr %ptr_unscaled monotonic, align 8
972   %tot2 = add i64 %tot1, %val_unscaled
974   %ptr_random = getelementptr i64, ptr %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)
975   %val_random = load atomic i64, ptr %ptr_random unordered, align 8
976   %tot3 = add i64 %tot2, %val_random
978   ret i64 %tot3
982 define void @atomc_store(ptr %p) #0 {
983 ; CHECK-NOLSE-LABEL: atomc_store:
984 ; CHECK-NOLSE:       ; %bb.0:
985 ; CHECK-NOLSE-NEXT:    mov w8, #4 ; =0x4
986 ; CHECK-NOLSE-NEXT:    stlr w8, [x0]
987 ; CHECK-NOLSE-NEXT:    ret
989 ; CHECK-LSE-O1-LABEL: atomc_store:
990 ; CHECK-LSE-O1:       ; %bb.0:
991 ; CHECK-LSE-O1-NEXT:    mov w8, #4 ; =0x4
992 ; CHECK-LSE-O1-NEXT:    stlr w8, [x0]
993 ; CHECK-LSE-O1-NEXT:    ret
995 ; CHECK-LSE-O0-LABEL: atomc_store:
996 ; CHECK-LSE-O0:       ; %bb.0:
997 ; CHECK-LSE-O0-NEXT:    mov w8, #4 ; =0x4
998 ; CHECK-LSE-O0-NEXT:    stlr w8, [x0]
999 ; CHECK-LSE-O0-NEXT:    ret
1000    store atomic i32 4, ptr %p seq_cst, align 4
1001    ret void
1004 define void @atomic_store_relaxed_8(ptr %p, i32 %off32, i8 %val) #0 {
1005 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_8:
1006 ; CHECK-NOLSE-O1:       ; %bb.0:
1007 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1008 ; CHECK-NOLSE-O1-NEXT:    strb w2, [x0, #4095]
1009 ; CHECK-NOLSE-O1-NEXT:    strb w2, [x0, w1, sxtw]
1010 ; CHECK-NOLSE-O1-NEXT:    sturb w2, [x0, #-256]
1011 ; CHECK-NOLSE-O1-NEXT:    strb w2, [x8]
1012 ; CHECK-NOLSE-O1-NEXT:    ret
1014 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_8:
1015 ; CHECK-NOLSE-O0:       ; %bb.0:
1016 ; CHECK-NOLSE-O0-NEXT:    strb w2, [x0, #4095]
1017 ; CHECK-NOLSE-O0-NEXT:    strb w2, [x0, w1, sxtw]
1018 ; CHECK-NOLSE-O0-NEXT:    sturb w2, [x0, #-256]
1019 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1020 ; CHECK-NOLSE-O0-NEXT:    strb w2, [x8]
1021 ; CHECK-NOLSE-O0-NEXT:    ret
1023 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_8:
1024 ; CHECK-LSE-O1:       ; %bb.0:
1025 ; CHECK-LSE-O1-NEXT:    strb w2, [x0, #4095]
1026 ; CHECK-LSE-O1-NEXT:    strb w2, [x0, w1, sxtw]
1027 ; CHECK-LSE-O1-NEXT:    sturb w2, [x0, #-256]
1028 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1029 ; CHECK-LSE-O1-NEXT:    strb w2, [x8]
1030 ; CHECK-LSE-O1-NEXT:    ret
1032 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_8:
1033 ; CHECK-LSE-O0:       ; %bb.0:
1034 ; CHECK-LSE-O0-NEXT:    strb w2, [x0, #4095]
1035 ; CHECK-LSE-O0-NEXT:    strb w2, [x0, w1, sxtw]
1036 ; CHECK-LSE-O0-NEXT:    sturb w2, [x0, #-256]
1037 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1038 ; CHECK-LSE-O0-NEXT:    strb w2, [x8]
1039 ; CHECK-LSE-O0-NEXT:    ret
1040   %ptr_unsigned = getelementptr i8, ptr %p, i32 4095
1041   store atomic i8 %val, ptr %ptr_unsigned monotonic, align 1
1043   %ptr_regoff = getelementptr i8, ptr %p, i32 %off32
1044   store atomic i8 %val, ptr %ptr_regoff unordered, align 1
1046   %ptr_unscaled = getelementptr i8, ptr %p, i32 -256
1047   store atomic i8 %val, ptr %ptr_unscaled monotonic, align 1
1049   %ptr_random = getelementptr i8, ptr %p, i32 1191936 ; 0x123000 (i.e. ADD imm)
1050   store atomic i8 %val, ptr %ptr_random unordered, align 1
1052   ret void
1055 define void @atomic_store_relaxed_16(ptr %p, i32 %off32, i16 %val) #0 {
1056 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_16:
1057 ; CHECK-NOLSE-O1:       ; %bb.0:
1058 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1059 ; CHECK-NOLSE-O1-NEXT:    strh w2, [x0, #8190]
1060 ; CHECK-NOLSE-O1-NEXT:    strh w2, [x0, w1, sxtw #1]
1061 ; CHECK-NOLSE-O1-NEXT:    sturh w2, [x0, #-256]
1062 ; CHECK-NOLSE-O1-NEXT:    strh w2, [x8]
1063 ; CHECK-NOLSE-O1-NEXT:    ret
1065 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_16:
1066 ; CHECK-NOLSE-O0:       ; %bb.0:
1067 ; CHECK-NOLSE-O0-NEXT:    strh w2, [x0, #8190]
1068 ; CHECK-NOLSE-O0-NEXT:    strh w2, [x0, w1, sxtw #1]
1069 ; CHECK-NOLSE-O0-NEXT:    sturh w2, [x0, #-256]
1070 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1071 ; CHECK-NOLSE-O0-NEXT:    strh w2, [x8]
1072 ; CHECK-NOLSE-O0-NEXT:    ret
1074 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_16:
1075 ; CHECK-LSE-O1:       ; %bb.0:
1076 ; CHECK-LSE-O1-NEXT:    strh w2, [x0, #8190]
1077 ; CHECK-LSE-O1-NEXT:    strh w2, [x0, w1, sxtw #1]
1078 ; CHECK-LSE-O1-NEXT:    sturh w2, [x0, #-256]
1079 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1080 ; CHECK-LSE-O1-NEXT:    strh w2, [x8]
1081 ; CHECK-LSE-O1-NEXT:    ret
1083 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_16:
1084 ; CHECK-LSE-O0:       ; %bb.0:
1085 ; CHECK-LSE-O0-NEXT:    strh w2, [x0, #8190]
1086 ; CHECK-LSE-O0-NEXT:    strh w2, [x0, w1, sxtw #1]
1087 ; CHECK-LSE-O0-NEXT:    sturh w2, [x0, #-256]
1088 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1089 ; CHECK-LSE-O0-NEXT:    strh w2, [x8]
1090 ; CHECK-LSE-O0-NEXT:    ret
1091   %ptr_unsigned = getelementptr i16, ptr %p, i32 4095
1092   store atomic i16 %val, ptr %ptr_unsigned monotonic, align 2
1094   %ptr_regoff = getelementptr i16, ptr %p, i32 %off32
1095   store atomic i16 %val, ptr %ptr_regoff unordered, align 2
1097   %ptr_unscaled = getelementptr i16, ptr %p, i32 -128
1098   store atomic i16 %val, ptr %ptr_unscaled monotonic, align 2
1100   %ptr_random = getelementptr i16, ptr %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)
1101   store atomic i16 %val, ptr %ptr_random unordered, align 2
1103   ret void
1106 define void @atomic_store_relaxed_32(ptr %p, i32 %off32, i32 %val) #0 {
1107 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_32:
1108 ; CHECK-NOLSE-O1:       ; %bb.0:
1109 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1110 ; CHECK-NOLSE-O1-NEXT:    str w2, [x0, #16380]
1111 ; CHECK-NOLSE-O1-NEXT:    str w2, [x0, w1, sxtw #2]
1112 ; CHECK-NOLSE-O1-NEXT:    stur w2, [x0, #-256]
1113 ; CHECK-NOLSE-O1-NEXT:    str w2, [x8]
1114 ; CHECK-NOLSE-O1-NEXT:    ret
1116 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_32:
1117 ; CHECK-NOLSE-O0:       ; %bb.0:
1118 ; CHECK-NOLSE-O0-NEXT:    str w2, [x0, #16380]
1119 ; CHECK-NOLSE-O0-NEXT:    str w2, [x0, w1, sxtw #2]
1120 ; CHECK-NOLSE-O0-NEXT:    stur w2, [x0, #-256]
1121 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1122 ; CHECK-NOLSE-O0-NEXT:    str w2, [x8]
1123 ; CHECK-NOLSE-O0-NEXT:    ret
1125 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_32:
1126 ; CHECK-LSE-O1:       ; %bb.0:
1127 ; CHECK-LSE-O1-NEXT:    str w2, [x0, #16380]
1128 ; CHECK-LSE-O1-NEXT:    str w2, [x0, w1, sxtw #2]
1129 ; CHECK-LSE-O1-NEXT:    stur w2, [x0, #-256]
1130 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1131 ; CHECK-LSE-O1-NEXT:    str w2, [x8]
1132 ; CHECK-LSE-O1-NEXT:    ret
1134 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_32:
1135 ; CHECK-LSE-O0:       ; %bb.0:
1136 ; CHECK-LSE-O0-NEXT:    str w2, [x0, #16380]
1137 ; CHECK-LSE-O0-NEXT:    str w2, [x0, w1, sxtw #2]
1138 ; CHECK-LSE-O0-NEXT:    stur w2, [x0, #-256]
1139 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1140 ; CHECK-LSE-O0-NEXT:    str w2, [x8]
1141 ; CHECK-LSE-O0-NEXT:    ret
1142   %ptr_unsigned = getelementptr i32, ptr %p, i32 4095
1143   store atomic i32 %val, ptr %ptr_unsigned monotonic, align 4
1145   %ptr_regoff = getelementptr i32, ptr %p, i32 %off32
1146   store atomic i32 %val, ptr %ptr_regoff unordered, align 4
1148   %ptr_unscaled = getelementptr i32, ptr %p, i32 -64
1149   store atomic i32 %val, ptr %ptr_unscaled monotonic, align 4
1151   %ptr_random = getelementptr i32, ptr %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)
1152   store atomic i32 %val, ptr %ptr_random unordered, align 4
1154   ret void
1157 define void @atomic_store_relaxed_64(ptr %p, i32 %off32, i64 %val) #0 {
1158 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_64:
1159 ; CHECK-NOLSE-O1:       ; %bb.0:
1160 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1161 ; CHECK-NOLSE-O1-NEXT:    str x2, [x0, #32760]
1162 ; CHECK-NOLSE-O1-NEXT:    str x2, [x0, w1, sxtw #3]
1163 ; CHECK-NOLSE-O1-NEXT:    stur x2, [x0, #-256]
1164 ; CHECK-NOLSE-O1-NEXT:    str x2, [x8]
1165 ; CHECK-NOLSE-O1-NEXT:    ret
1167 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_64:
1168 ; CHECK-NOLSE-O0:       ; %bb.0:
1169 ; CHECK-NOLSE-O0-NEXT:    str x2, [x0, #32760]
1170 ; CHECK-NOLSE-O0-NEXT:    str x2, [x0, w1, sxtw #3]
1171 ; CHECK-NOLSE-O0-NEXT:    stur x2, [x0, #-256]
1172 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1173 ; CHECK-NOLSE-O0-NEXT:    str x2, [x8]
1174 ; CHECK-NOLSE-O0-NEXT:    ret
1176 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_64:
1177 ; CHECK-LSE-O1:       ; %bb.0:
1178 ; CHECK-LSE-O1-NEXT:    str x2, [x0, #32760]
1179 ; CHECK-LSE-O1-NEXT:    str x2, [x0, w1, sxtw #3]
1180 ; CHECK-LSE-O1-NEXT:    stur x2, [x0, #-256]
1181 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1182 ; CHECK-LSE-O1-NEXT:    str x2, [x8]
1183 ; CHECK-LSE-O1-NEXT:    ret
1185 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_64:
1186 ; CHECK-LSE-O0:       ; %bb.0:
1187 ; CHECK-LSE-O0-NEXT:    str x2, [x0, #32760]
1188 ; CHECK-LSE-O0-NEXT:    str x2, [x0, w1, sxtw #3]
1189 ; CHECK-LSE-O0-NEXT:    stur x2, [x0, #-256]
1190 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1191 ; CHECK-LSE-O0-NEXT:    str x2, [x8]
1192 ; CHECK-LSE-O0-NEXT:    ret
1193   %ptr_unsigned = getelementptr i64, ptr %p, i32 4095
1194   store atomic i64 %val, ptr %ptr_unsigned monotonic, align 8
1196   %ptr_regoff = getelementptr i64, ptr %p, i32 %off32
1197   store atomic i64 %val, ptr %ptr_regoff unordered, align 8
1199   %ptr_unscaled = getelementptr i64, ptr %p, i32 -32
1200   store atomic i64 %val, ptr %ptr_unscaled monotonic, align 8
1202   %ptr_random = getelementptr i64, ptr %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)
1203   store atomic i64 %val, ptr %ptr_random unordered, align 8
1205   ret void
1208 define i32 @load_zext(ptr %p8, ptr %p16) {
1209 ; CHECK-NOLSE-O1-LABEL: load_zext:
1210 ; CHECK-NOLSE-O1:       ; %bb.0:
1211 ; CHECK-NOLSE-O1-NEXT:    ldarb w8, [x0]
1212 ; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x1]
1213 ; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8, uxtb
1214 ; CHECK-NOLSE-O1-NEXT:    ret
1216 ; CHECK-NOLSE-O0-LABEL: load_zext:
1217 ; CHECK-NOLSE-O0:       ; %bb.0:
1218 ; CHECK-NOLSE-O0-NEXT:    ldarb w9, [x0]
1219 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x1]
1220 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxtb
1221 ; CHECK-NOLSE-O0-NEXT:    ret
1223 ; CHECK-LSE-O1-LABEL: load_zext:
1224 ; CHECK-LSE-O1:       ; %bb.0:
1225 ; CHECK-LSE-O1-NEXT:    ldaprb w8, [x0]
1226 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x1]
1227 ; CHECK-LSE-O1-NEXT:    add w0, w9, w8, uxtb
1228 ; CHECK-LSE-O1-NEXT:    ret
1230 ; CHECK-LSE-O0-LABEL: load_zext:
1231 ; CHECK-LSE-O0:       ; %bb.0:
1232 ; CHECK-LSE-O0-NEXT:    ldaprb w9, [x0]
1233 ; CHECK-LSE-O0-NEXT:    ldrh w8, [x1]
1234 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxtb
1235 ; CHECK-LSE-O0-NEXT:    ret
1236   %val1.8 = load atomic i8, ptr %p8 acquire, align 1
1237   %val1 = zext i8 %val1.8 to i32
1239   %val2.16 = load atomic i16, ptr %p16 unordered, align 2
1240   %val2 = zext i16 %val2.16 to i32
1242   %res = add i32 %val1, %val2
1243   ret i32 %res
1246 define { i32, i64 } @load_acq(ptr %p32, ptr %p64) {
1247 ; CHECK-NOLSE-LABEL: load_acq:
1248 ; CHECK-NOLSE:       ; %bb.0:
1249 ; CHECK-NOLSE-NEXT:    ldar w0, [x0]
1250 ; CHECK-NOLSE-NEXT:    ldar x1, [x1]
1251 ; CHECK-NOLSE-NEXT:    ret
1253 ; CHECK-LSE-O1-LABEL: load_acq:
1254 ; CHECK-LSE-O1:       ; %bb.0:
1255 ; CHECK-LSE-O1-NEXT:    ldar w0, [x0]
1256 ; CHECK-LSE-O1-NEXT:    ldapr x1, [x1]
1257 ; CHECK-LSE-O1-NEXT:    ret
1259 ; CHECK-LSE-O0-LABEL: load_acq:
1260 ; CHECK-LSE-O0:       ; %bb.0:
1261 ; CHECK-LSE-O0-NEXT:    ldar w0, [x0]
1262 ; CHECK-LSE-O0-NEXT:    ldapr x1, [x1]
1263 ; CHECK-LSE-O0-NEXT:    ret
1264   %val32 = load atomic i32, ptr %p32 seq_cst, align 4
1265   %tmp = insertvalue { i32, i64 } undef, i32 %val32, 0
1267   %val64 = load atomic i64, ptr %p64 acquire, align 8
1268   %res = insertvalue { i32, i64 } %tmp, i64 %val64, 1
1270   ret { i32, i64 } %res
1273 define i32 @load_sext(ptr %p8, ptr %p16) {
1274 ; CHECK-NOLSE-O1-LABEL: load_sext:
1275 ; CHECK-NOLSE-O1:       ; %bb.0:
1276 ; CHECK-NOLSE-O1-NEXT:    ldarb w8, [x0]
1277 ; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x1]
1278 ; CHECK-NOLSE-O1-NEXT:    sxth w9, w9
1279 ; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8, sxtb
1280 ; CHECK-NOLSE-O1-NEXT:    ret
1282 ; CHECK-NOLSE-O0-LABEL: load_sext:
1283 ; CHECK-NOLSE-O0:       ; %bb.0:
1284 ; CHECK-NOLSE-O0-NEXT:    ldarb w9, [x0]
1285 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x1]
1286 ; CHECK-NOLSE-O0-NEXT:    sxth w8, w8
1287 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, sxtb
1288 ; CHECK-NOLSE-O0-NEXT:    ret
1290 ; CHECK-LSE-O1-LABEL: load_sext:
1291 ; CHECK-LSE-O1:       ; %bb.0:
1292 ; CHECK-LSE-O1-NEXT:    ldaprb w8, [x0]
1293 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x1]
1294 ; CHECK-LSE-O1-NEXT:    sxth w9, w9
1295 ; CHECK-LSE-O1-NEXT:    add w0, w9, w8, sxtb
1296 ; CHECK-LSE-O1-NEXT:    ret
1298 ; CHECK-LSE-O0-LABEL: load_sext:
1299 ; CHECK-LSE-O0:       ; %bb.0:
1300 ; CHECK-LSE-O0-NEXT:    ldaprb w9, [x0]
1301 ; CHECK-LSE-O0-NEXT:    ldrh w8, [x1]
1302 ; CHECK-LSE-O0-NEXT:    sxth w8, w8
1303 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, sxtb
1304 ; CHECK-LSE-O0-NEXT:    ret
1305   %val1.8 = load atomic i8, ptr %p8 acquire, align 1
1306   %val1 = sext i8 %val1.8 to i32
1308   %val2.16 = load atomic i16, ptr %p16 unordered, align 2
1309   %val2 = sext i16 %val2.16 to i32
1311   %res = add i32 %val1, %val2
1312   ret i32 %res
1315 define void @store_trunc(i32 %val, ptr %p8, ptr %p16) {
1316 ; CHECK-NOLSE-LABEL: store_trunc:
1317 ; CHECK-NOLSE:       ; %bb.0:
1318 ; CHECK-NOLSE-NEXT:    stlrb w0, [x1]
1319 ; CHECK-NOLSE-NEXT:    strh w0, [x2]
1320 ; CHECK-NOLSE-NEXT:    ret
1322 ; CHECK-LSE-O1-LABEL: store_trunc:
1323 ; CHECK-LSE-O1:       ; %bb.0:
1324 ; CHECK-LSE-O1-NEXT:    stlrb w0, [x1]
1325 ; CHECK-LSE-O1-NEXT:    strh w0, [x2]
1326 ; CHECK-LSE-O1-NEXT:    ret
1328 ; CHECK-LSE-O0-LABEL: store_trunc:
1329 ; CHECK-LSE-O0:       ; %bb.0:
1330 ; CHECK-LSE-O0-NEXT:    stlrb w0, [x1]
1331 ; CHECK-LSE-O0-NEXT:    strh w0, [x2]
1332 ; CHECK-LSE-O0-NEXT:    ret
1333   %val8 = trunc i32 %val to i8
1334   store atomic i8 %val8, ptr %p8 seq_cst, align 1
1336   %val16 = trunc i32 %val to i16
1337   store atomic i16 %val16, ptr %p16 monotonic, align 2
1339   ret void
1342 define i8 @atomicrmw_add_i8(ptr %ptr, i8 %rhs) {
1343 ; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i8:
1344 ; CHECK-NOLSE-O1:       ; %bb.0:
1345 ; CHECK-NOLSE-O1-NEXT:  LBB27_1: ; %atomicrmw.start
1346 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1347 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1348 ; CHECK-NOLSE-O1-NEXT:    add w9, w8, w1
1349 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1350 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB27_1
1351 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1352 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1353 ; CHECK-NOLSE-O1-NEXT:    ret
1355 ; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i8:
1356 ; CHECK-NOLSE-O0:       ; %bb.0:
1357 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1358 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1359 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1360 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1361 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1362 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1363 ; CHECK-NOLSE-O0-NEXT:    b LBB27_1
1364 ; CHECK-NOLSE-O0-NEXT:  LBB27_1: ; %atomicrmw.start
1365 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1366 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB27_2 Depth 2
1367 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1368 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1369 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1370 ; CHECK-NOLSE-O0-NEXT:    add w12, w8, w10, uxth
1371 ; CHECK-NOLSE-O0-NEXT:  LBB27_2: ; %atomicrmw.start
1372 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB27_1 Depth=1
1373 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1374 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1375 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1376 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB27_4
1377 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1378 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB27_2 Depth=2
1379 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1380 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB27_2
1381 ; CHECK-NOLSE-O0-NEXT:  LBB27_4: ; %atomicrmw.start
1382 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB27_1 Depth=1
1383 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1384 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1385 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1386 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1387 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1388 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB27_1
1389 ; CHECK-NOLSE-O0-NEXT:    b LBB27_5
1390 ; CHECK-NOLSE-O0-NEXT:  LBB27_5: ; %atomicrmw.end
1391 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1392 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1393 ; CHECK-NOLSE-O0-NEXT:    ret
1395 ; CHECK-LSE-O1-LABEL: atomicrmw_add_i8:
1396 ; CHECK-LSE-O1:       ; %bb.0:
1397 ; CHECK-LSE-O1-NEXT:    ldaddalb w1, w0, [x0]
1398 ; CHECK-LSE-O1-NEXT:    ret
1400 ; CHECK-LSE-O0-LABEL: atomicrmw_add_i8:
1401 ; CHECK-LSE-O0:       ; %bb.0:
1402 ; CHECK-LSE-O0-NEXT:    ldaddalb w1, w0, [x0]
1403 ; CHECK-LSE-O0-NEXT:    ret
1404   %res = atomicrmw add ptr %ptr, i8 %rhs seq_cst
1405   ret i8 %res
1408 define i8 @atomicrmw_xchg_i8(ptr %ptr, i8 %rhs) {
1409 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i8:
1410 ; CHECK-NOLSE-O1:       ; %bb.0:
1411 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
1412 ; CHECK-NOLSE-O1-NEXT:  LBB28_1: ; %atomicrmw.start
1413 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1414 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1415 ; CHECK-NOLSE-O1-NEXT:    stxrb w9, w1, [x0]
1416 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB28_1
1417 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1418 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1419 ; CHECK-NOLSE-O1-NEXT:    ret
1421 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i8:
1422 ; CHECK-NOLSE-O0:       ; %bb.0:
1423 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1424 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1425 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1426 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1427 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1428 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1429 ; CHECK-NOLSE-O0-NEXT:    b LBB28_1
1430 ; CHECK-NOLSE-O0-NEXT:  LBB28_1: ; %atomicrmw.start
1431 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1432 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB28_2 Depth 2
1433 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1434 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1435 ; CHECK-NOLSE-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
1436 ; CHECK-NOLSE-O0-NEXT:  LBB28_2: ; %atomicrmw.start
1437 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB28_1 Depth=1
1438 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1439 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1440 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1441 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB28_4
1442 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1443 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB28_2 Depth=2
1444 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1445 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB28_2
1446 ; CHECK-NOLSE-O0-NEXT:  LBB28_4: ; %atomicrmw.start
1447 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB28_1 Depth=1
1448 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1449 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1450 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1451 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1452 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1453 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB28_1
1454 ; CHECK-NOLSE-O0-NEXT:    b LBB28_5
1455 ; CHECK-NOLSE-O0-NEXT:  LBB28_5: ; %atomicrmw.end
1456 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1457 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1458 ; CHECK-NOLSE-O0-NEXT:    ret
1460 ; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i8:
1461 ; CHECK-LSE-O1:       ; %bb.0:
1462 ; CHECK-LSE-O1-NEXT:    swpb w1, w0, [x0]
1463 ; CHECK-LSE-O1-NEXT:    ret
1465 ; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i8:
1466 ; CHECK-LSE-O0:       ; %bb.0:
1467 ; CHECK-LSE-O0-NEXT:    swpb w1, w0, [x0]
1468 ; CHECK-LSE-O0-NEXT:    ret
1469   %res = atomicrmw xchg ptr %ptr, i8 %rhs monotonic
1470   ret i8 %res
1473 define i8 @atomicrmw_sub_i8(ptr %ptr, i8 %rhs) {
1474 ; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i8:
1475 ; CHECK-NOLSE-O1:       ; %bb.0:
1476 ; CHECK-NOLSE-O1-NEXT:  LBB29_1: ; %atomicrmw.start
1477 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1478 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1479 ; CHECK-NOLSE-O1-NEXT:    sub w9, w8, w1
1480 ; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
1481 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB29_1
1482 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1483 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1484 ; CHECK-NOLSE-O1-NEXT:    ret
1486 ; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i8:
1487 ; CHECK-NOLSE-O0:       ; %bb.0:
1488 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1489 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1490 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1491 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1492 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1493 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1494 ; CHECK-NOLSE-O0-NEXT:    b LBB29_1
1495 ; CHECK-NOLSE-O0-NEXT:  LBB29_1: ; %atomicrmw.start
1496 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1497 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB29_2 Depth 2
1498 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1499 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1500 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1501 ; CHECK-NOLSE-O0-NEXT:    subs w12, w10, w8
1502 ; CHECK-NOLSE-O0-NEXT:  LBB29_2: ; %atomicrmw.start
1503 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB29_1 Depth=1
1504 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1505 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1506 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1507 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB29_4
1508 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1509 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB29_2 Depth=2
1510 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1511 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB29_2
1512 ; CHECK-NOLSE-O0-NEXT:  LBB29_4: ; %atomicrmw.start
1513 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB29_1 Depth=1
1514 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1515 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1516 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1517 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1518 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1519 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB29_1
1520 ; CHECK-NOLSE-O0-NEXT:    b LBB29_5
1521 ; CHECK-NOLSE-O0-NEXT:  LBB29_5: ; %atomicrmw.end
1522 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1523 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1524 ; CHECK-NOLSE-O0-NEXT:    ret
1526 ; CHECK-LSE-O1-LABEL: atomicrmw_sub_i8:
1527 ; CHECK-LSE-O1:       ; %bb.0:
1528 ; CHECK-LSE-O1-NEXT:    neg w8, w1
1529 ; CHECK-LSE-O1-NEXT:    ldaddab w8, w0, [x0]
1530 ; CHECK-LSE-O1-NEXT:    ret
1532 ; CHECK-LSE-O0-LABEL: atomicrmw_sub_i8:
1533 ; CHECK-LSE-O0:       ; %bb.0:
1534 ; CHECK-LSE-O0-NEXT:    neg w8, w1
1535 ; CHECK-LSE-O0-NEXT:    ldaddab w8, w0, [x0]
1536 ; CHECK-LSE-O0-NEXT:    ret
1537   %res = atomicrmw sub ptr %ptr, i8 %rhs acquire
1538   ret i8 %res
1541 define i8 @atomicrmw_and_i8(ptr %ptr, i8 %rhs) {
1542 ; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i8:
1543 ; CHECK-NOLSE-O1:       ; %bb.0:
1544 ; CHECK-NOLSE-O1-NEXT:  LBB30_1: ; %atomicrmw.start
1545 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1546 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1547 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, w1
1548 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1549 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB30_1
1550 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1551 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1552 ; CHECK-NOLSE-O1-NEXT:    ret
1554 ; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i8:
1555 ; CHECK-NOLSE-O0:       ; %bb.0:
1556 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1557 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1558 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1559 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1560 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1561 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1562 ; CHECK-NOLSE-O0-NEXT:    b LBB30_1
1563 ; CHECK-NOLSE-O0-NEXT:  LBB30_1: ; %atomicrmw.start
1564 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1565 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB30_2 Depth 2
1566 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1567 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1568 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1569 ; CHECK-NOLSE-O0-NEXT:    and w12, w10, w8
1570 ; CHECK-NOLSE-O0-NEXT:  LBB30_2: ; %atomicrmw.start
1571 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB30_1 Depth=1
1572 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1573 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1574 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1575 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB30_4
1576 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1577 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB30_2 Depth=2
1578 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1579 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB30_2
1580 ; CHECK-NOLSE-O0-NEXT:  LBB30_4: ; %atomicrmw.start
1581 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB30_1 Depth=1
1582 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1583 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1584 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1585 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1586 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1587 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB30_1
1588 ; CHECK-NOLSE-O0-NEXT:    b LBB30_5
1589 ; CHECK-NOLSE-O0-NEXT:  LBB30_5: ; %atomicrmw.end
1590 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1591 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1592 ; CHECK-NOLSE-O0-NEXT:    ret
1594 ; CHECK-LSE-O1-LABEL: atomicrmw_and_i8:
1595 ; CHECK-LSE-O1:       ; %bb.0:
1596 ; CHECK-LSE-O1-NEXT:    mvn w8, w1
1597 ; CHECK-LSE-O1-NEXT:    ldclrlb w8, w0, [x0]
1598 ; CHECK-LSE-O1-NEXT:    ret
1600 ; CHECK-LSE-O0-LABEL: atomicrmw_and_i8:
1601 ; CHECK-LSE-O0:       ; %bb.0:
1602 ; CHECK-LSE-O0-NEXT:    mvn w8, w1
1603 ; CHECK-LSE-O0-NEXT:    ldclrlb w8, w0, [x0]
1604 ; CHECK-LSE-O0-NEXT:    ret
1605   %res = atomicrmw and ptr %ptr, i8 %rhs release
1606   ret i8 %res
1609 define i8 @atomicrmw_or_i8(ptr %ptr, i8 %rhs) {
1610 ; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i8:
1611 ; CHECK-NOLSE-O1:       ; %bb.0:
1612 ; CHECK-NOLSE-O1-NEXT:  LBB31_1: ; %atomicrmw.start
1613 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1614 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1615 ; CHECK-NOLSE-O1-NEXT:    orr w9, w8, w1
1616 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1617 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB31_1
1618 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1619 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1620 ; CHECK-NOLSE-O1-NEXT:    ret
1622 ; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i8:
1623 ; CHECK-NOLSE-O0:       ; %bb.0:
1624 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1625 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1626 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1627 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1628 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1629 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1630 ; CHECK-NOLSE-O0-NEXT:    b LBB31_1
1631 ; CHECK-NOLSE-O0-NEXT:  LBB31_1: ; %atomicrmw.start
1632 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1633 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB31_2 Depth 2
1634 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1635 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1636 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1637 ; CHECK-NOLSE-O0-NEXT:    orr w12, w10, w8
1638 ; CHECK-NOLSE-O0-NEXT:  LBB31_2: ; %atomicrmw.start
1639 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB31_1 Depth=1
1640 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1641 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1642 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1643 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB31_4
1644 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1645 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB31_2 Depth=2
1646 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1647 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB31_2
1648 ; CHECK-NOLSE-O0-NEXT:  LBB31_4: ; %atomicrmw.start
1649 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB31_1 Depth=1
1650 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1651 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1652 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1653 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1654 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1655 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB31_1
1656 ; CHECK-NOLSE-O0-NEXT:    b LBB31_5
1657 ; CHECK-NOLSE-O0-NEXT:  LBB31_5: ; %atomicrmw.end
1658 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1659 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1660 ; CHECK-NOLSE-O0-NEXT:    ret
1662 ; CHECK-LSE-O1-LABEL: atomicrmw_or_i8:
1663 ; CHECK-LSE-O1:       ; %bb.0:
1664 ; CHECK-LSE-O1-NEXT:    ldsetalb w1, w0, [x0]
1665 ; CHECK-LSE-O1-NEXT:    ret
1667 ; CHECK-LSE-O0-LABEL: atomicrmw_or_i8:
1668 ; CHECK-LSE-O0:       ; %bb.0:
1669 ; CHECK-LSE-O0-NEXT:    ldsetalb w1, w0, [x0]
1670 ; CHECK-LSE-O0-NEXT:    ret
1671   %res = atomicrmw or ptr %ptr, i8 %rhs seq_cst
1672   ret i8 %res
1675 define i8 @atomicrmw_xor_i8(ptr %ptr, i8 %rhs) {
1676 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i8:
1677 ; CHECK-NOLSE-O1:       ; %bb.0:
1678 ; CHECK-NOLSE-O1-NEXT:  LBB32_1: ; %atomicrmw.start
1679 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1680 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1681 ; CHECK-NOLSE-O1-NEXT:    eor w9, w8, w1
1682 ; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
1683 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB32_1
1684 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1685 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1686 ; CHECK-NOLSE-O1-NEXT:    ret
1688 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i8:
1689 ; CHECK-NOLSE-O0:       ; %bb.0:
1690 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1691 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1692 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1693 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1694 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1695 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1696 ; CHECK-NOLSE-O0-NEXT:    b LBB32_1
1697 ; CHECK-NOLSE-O0-NEXT:  LBB32_1: ; %atomicrmw.start
1698 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1699 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB32_2 Depth 2
1700 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1701 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1702 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1703 ; CHECK-NOLSE-O0-NEXT:    eor w12, w10, w8
1704 ; CHECK-NOLSE-O0-NEXT:  LBB32_2: ; %atomicrmw.start
1705 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB32_1 Depth=1
1706 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1707 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1708 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1709 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB32_4
1710 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1711 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB32_2 Depth=2
1712 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1713 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB32_2
1714 ; CHECK-NOLSE-O0-NEXT:  LBB32_4: ; %atomicrmw.start
1715 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB32_1 Depth=1
1716 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1717 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1718 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1719 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1720 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1721 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB32_1
1722 ; CHECK-NOLSE-O0-NEXT:    b LBB32_5
1723 ; CHECK-NOLSE-O0-NEXT:  LBB32_5: ; %atomicrmw.end
1724 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1725 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1726 ; CHECK-NOLSE-O0-NEXT:    ret
1728 ; CHECK-LSE-O1-LABEL: atomicrmw_xor_i8:
1729 ; CHECK-LSE-O1:       ; %bb.0:
1730 ; CHECK-LSE-O1-NEXT:    ldeorb w1, w0, [x0]
1731 ; CHECK-LSE-O1-NEXT:    ret
1733 ; CHECK-LSE-O0-LABEL: atomicrmw_xor_i8:
1734 ; CHECK-LSE-O0:       ; %bb.0:
1735 ; CHECK-LSE-O0-NEXT:    ldeorb w1, w0, [x0]
1736 ; CHECK-LSE-O0-NEXT:    ret
1737   %res = atomicrmw xor ptr %ptr, i8 %rhs monotonic
1738   ret i8 %res
1741 define i8 @atomicrmw_min_i8(ptr %ptr, i8 %rhs) {
1742 ; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i8:
1743 ; CHECK-NOLSE-O1:       ; %bb.0:
1744 ; CHECK-NOLSE-O1-NEXT:  LBB33_1: ; %atomicrmw.start
1745 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1746 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1747 ; CHECK-NOLSE-O1-NEXT:    sxtb w9, w8
1748 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxtb
1749 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, le
1750 ; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
1751 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB33_1
1752 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1753 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1754 ; CHECK-NOLSE-O1-NEXT:    ret
1756 ; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i8:
1757 ; CHECK-NOLSE-O0:       ; %bb.0:
1758 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1759 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1760 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1761 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1762 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1763 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1764 ; CHECK-NOLSE-O0-NEXT:    b LBB33_1
1765 ; CHECK-NOLSE-O0-NEXT:  LBB33_1: ; %atomicrmw.start
1766 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1767 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB33_2 Depth 2
1768 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1769 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1770 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1771 ; CHECK-NOLSE-O0-NEXT:    sxtb w9, w10
1772 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, sxtb
1773 ; CHECK-NOLSE-O0-NEXT:    cset w9, le
1774 ; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
1775 ; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
1776 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
1777 ; CHECK-NOLSE-O0-NEXT:  LBB33_2: ; %atomicrmw.start
1778 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB33_1 Depth=1
1779 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1780 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1781 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1782 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB33_4
1783 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1784 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB33_2 Depth=2
1785 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1786 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB33_2
1787 ; CHECK-NOLSE-O0-NEXT:  LBB33_4: ; %atomicrmw.start
1788 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB33_1 Depth=1
1789 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1790 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1791 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1792 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1793 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1794 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB33_1
1795 ; CHECK-NOLSE-O0-NEXT:    b LBB33_5
1796 ; CHECK-NOLSE-O0-NEXT:  LBB33_5: ; %atomicrmw.end
1797 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1798 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1799 ; CHECK-NOLSE-O0-NEXT:    ret
1801 ; CHECK-LSE-O1-LABEL: atomicrmw_min_i8:
1802 ; CHECK-LSE-O1:       ; %bb.0:
1803 ; CHECK-LSE-O1-NEXT:    ldsminab w1, w0, [x0]
1804 ; CHECK-LSE-O1-NEXT:    ret
1806 ; CHECK-LSE-O0-LABEL: atomicrmw_min_i8:
1807 ; CHECK-LSE-O0:       ; %bb.0:
1808 ; CHECK-LSE-O0-NEXT:    ldsminab w1, w0, [x0]
1809 ; CHECK-LSE-O0-NEXT:    ret
1810   %res = atomicrmw min ptr %ptr, i8 %rhs acquire
1811   ret i8 %res
1814 define i8 @atomicrmw_max_i8(ptr %ptr, i8 %rhs) {
1815 ; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i8:
1816 ; CHECK-NOLSE-O1:       ; %bb.0:
1817 ; CHECK-NOLSE-O1-NEXT:  LBB34_1: ; %atomicrmw.start
1818 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1819 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1820 ; CHECK-NOLSE-O1-NEXT:    sxtb w9, w8
1821 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxtb
1822 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, gt
1823 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1824 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB34_1
1825 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1826 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1827 ; CHECK-NOLSE-O1-NEXT:    ret
1829 ; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i8:
1830 ; CHECK-NOLSE-O0:       ; %bb.0:
1831 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1832 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1833 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1834 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1835 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1836 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1837 ; CHECK-NOLSE-O0-NEXT:    b LBB34_1
1838 ; CHECK-NOLSE-O0-NEXT:  LBB34_1: ; %atomicrmw.start
1839 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1840 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB34_2 Depth 2
1841 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1842 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1843 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1844 ; CHECK-NOLSE-O0-NEXT:    sxtb w9, w10
1845 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, sxtb
1846 ; CHECK-NOLSE-O0-NEXT:    cset w9, gt
1847 ; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
1848 ; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
1849 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
1850 ; CHECK-NOLSE-O0-NEXT:  LBB34_2: ; %atomicrmw.start
1851 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB34_1 Depth=1
1852 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1853 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1854 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1855 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB34_4
1856 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1857 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB34_2 Depth=2
1858 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1859 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB34_2
1860 ; CHECK-NOLSE-O0-NEXT:  LBB34_4: ; %atomicrmw.start
1861 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB34_1 Depth=1
1862 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1863 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1864 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1865 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1866 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1867 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB34_1
1868 ; CHECK-NOLSE-O0-NEXT:    b LBB34_5
1869 ; CHECK-NOLSE-O0-NEXT:  LBB34_5: ; %atomicrmw.end
1870 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1871 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1872 ; CHECK-NOLSE-O0-NEXT:    ret
1874 ; CHECK-LSE-O1-LABEL: atomicrmw_max_i8:
1875 ; CHECK-LSE-O1:       ; %bb.0:
1876 ; CHECK-LSE-O1-NEXT:    ldsmaxlb w1, w0, [x0]
1877 ; CHECK-LSE-O1-NEXT:    ret
1879 ; CHECK-LSE-O0-LABEL: atomicrmw_max_i8:
1880 ; CHECK-LSE-O0:       ; %bb.0:
1881 ; CHECK-LSE-O0-NEXT:    ldsmaxlb w1, w0, [x0]
1882 ; CHECK-LSE-O0-NEXT:    ret
1883   %res = atomicrmw max ptr %ptr, i8 %rhs release
1884   ret i8 %res
1887 define i8 @atomicrmw_umin_i8(ptr %ptr, i8 %rhs) {
1888 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i8:
1889 ; CHECK-NOLSE-O1:       ; %bb.0:
1890 ; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xff
1891 ; CHECK-NOLSE-O1-NEXT:  LBB35_1: ; %atomicrmw.start
1892 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1893 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1894 ; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xff
1895 ; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
1896 ; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, ls
1897 ; CHECK-NOLSE-O1-NEXT:    stlxrb w11, w10, [x0]
1898 ; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB35_1
1899 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1900 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1901 ; CHECK-NOLSE-O1-NEXT:    ret
1903 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i8:
1904 ; CHECK-NOLSE-O0:       ; %bb.0:
1905 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1906 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1907 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1908 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1909 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1910 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1911 ; CHECK-NOLSE-O0-NEXT:    b LBB35_1
1912 ; CHECK-NOLSE-O0-NEXT:  LBB35_1: ; %atomicrmw.start
1913 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1914 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB35_2 Depth 2
1915 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1916 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1917 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1918 ; CHECK-NOLSE-O0-NEXT:    and w9, w10, #0xff
1919 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, uxtb
1920 ; CHECK-NOLSE-O0-NEXT:    cset w9, ls
1921 ; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
1922 ; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
1923 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
1924 ; CHECK-NOLSE-O0-NEXT:  LBB35_2: ; %atomicrmw.start
1925 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB35_1 Depth=1
1926 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1927 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1928 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1929 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB35_4
1930 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1931 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB35_2 Depth=2
1932 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1933 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB35_2
1934 ; CHECK-NOLSE-O0-NEXT:  LBB35_4: ; %atomicrmw.start
1935 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB35_1 Depth=1
1936 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1937 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1938 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1939 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1940 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1941 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB35_1
1942 ; CHECK-NOLSE-O0-NEXT:    b LBB35_5
1943 ; CHECK-NOLSE-O0-NEXT:  LBB35_5: ; %atomicrmw.end
1944 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1945 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1946 ; CHECK-NOLSE-O0-NEXT:    ret
1948 ; CHECK-LSE-O1-LABEL: atomicrmw_umin_i8:
1949 ; CHECK-LSE-O1:       ; %bb.0:
1950 ; CHECK-LSE-O1-NEXT:    lduminalb w1, w0, [x0]
1951 ; CHECK-LSE-O1-NEXT:    ret
1953 ; CHECK-LSE-O0-LABEL: atomicrmw_umin_i8:
1954 ; CHECK-LSE-O0:       ; %bb.0:
1955 ; CHECK-LSE-O0-NEXT:    lduminalb w1, w0, [x0]
1956 ; CHECK-LSE-O0-NEXT:    ret
1957   %res = atomicrmw umin ptr %ptr, i8 %rhs seq_cst
1958   ret i8 %res
1961 define i8 @atomicrmw_umax_i8(ptr %ptr, i8 %rhs) {
1962 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i8:
1963 ; CHECK-NOLSE-O1:       ; %bb.0:
1964 ; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xff
1965 ; CHECK-NOLSE-O1-NEXT:  LBB36_1: ; %atomicrmw.start
1966 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1967 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1968 ; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xff
1969 ; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
1970 ; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, hi
1971 ; CHECK-NOLSE-O1-NEXT:    stxrb w11, w10, [x0]
1972 ; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB36_1
1973 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1974 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1975 ; CHECK-NOLSE-O1-NEXT:    ret
1977 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i8:
1978 ; CHECK-NOLSE-O0:       ; %bb.0:
1979 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1980 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1981 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1982 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1983 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1984 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1985 ; CHECK-NOLSE-O0-NEXT:    b LBB36_1
1986 ; CHECK-NOLSE-O0-NEXT:  LBB36_1: ; %atomicrmw.start
1987 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1988 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB36_2 Depth 2
1989 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1990 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1991 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1992 ; CHECK-NOLSE-O0-NEXT:    and w9, w10, #0xff
1993 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, uxtb
1994 ; CHECK-NOLSE-O0-NEXT:    cset w9, hi
1995 ; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
1996 ; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
1997 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
1998 ; CHECK-NOLSE-O0-NEXT:  LBB36_2: ; %atomicrmw.start
1999 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB36_1 Depth=1
2000 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2001 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2002 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2003 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB36_4
2004 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2005 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB36_2 Depth=2
2006 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2007 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB36_2
2008 ; CHECK-NOLSE-O0-NEXT:  LBB36_4: ; %atomicrmw.start
2009 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB36_1 Depth=1
2010 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2011 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2012 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2013 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2014 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2015 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB36_1
2016 ; CHECK-NOLSE-O0-NEXT:    b LBB36_5
2017 ; CHECK-NOLSE-O0-NEXT:  LBB36_5: ; %atomicrmw.end
2018 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2019 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2020 ; CHECK-NOLSE-O0-NEXT:    ret
2022 ; CHECK-LSE-O1-LABEL: atomicrmw_umax_i8:
2023 ; CHECK-LSE-O1:       ; %bb.0:
2024 ; CHECK-LSE-O1-NEXT:    ldumaxb w1, w0, [x0]
2025 ; CHECK-LSE-O1-NEXT:    ret
2027 ; CHECK-LSE-O0-LABEL: atomicrmw_umax_i8:
2028 ; CHECK-LSE-O0:       ; %bb.0:
2029 ; CHECK-LSE-O0-NEXT:    ldumaxb w1, w0, [x0]
2030 ; CHECK-LSE-O0-NEXT:    ret
2031   %res = atomicrmw umax ptr %ptr, i8 %rhs monotonic
2032   ret i8 %res
2035 define i16 @atomicrmw_add_i16(ptr %ptr, i16 %rhs) {
2036 ; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i16:
2037 ; CHECK-NOLSE-O1:       ; %bb.0:
2038 ; CHECK-NOLSE-O1-NEXT:  LBB37_1: ; %atomicrmw.start
2039 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2040 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2041 ; CHECK-NOLSE-O1-NEXT:    add w9, w8, w1
2042 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2043 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB37_1
2044 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2045 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2046 ; CHECK-NOLSE-O1-NEXT:    ret
2048 ; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i16:
2049 ; CHECK-NOLSE-O0:       ; %bb.0:
2050 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2051 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2052 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2053 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2054 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2055 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2056 ; CHECK-NOLSE-O0-NEXT:    b LBB37_1
2057 ; CHECK-NOLSE-O0-NEXT:  LBB37_1: ; %atomicrmw.start
2058 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2059 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB37_2 Depth 2
2060 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2061 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2062 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2063 ; CHECK-NOLSE-O0-NEXT:    add w12, w9, w8, uxth
2064 ; CHECK-NOLSE-O0-NEXT:  LBB37_2: ; %atomicrmw.start
2065 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB37_1 Depth=1
2066 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2067 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2068 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2069 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB37_4
2070 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2071 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB37_2 Depth=2
2072 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2073 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB37_2
2074 ; CHECK-NOLSE-O0-NEXT:  LBB37_4: ; %atomicrmw.start
2075 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB37_1 Depth=1
2076 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2077 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2078 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2079 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2080 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2081 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB37_1
2082 ; CHECK-NOLSE-O0-NEXT:    b LBB37_5
2083 ; CHECK-NOLSE-O0-NEXT:  LBB37_5: ; %atomicrmw.end
2084 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2085 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2086 ; CHECK-NOLSE-O0-NEXT:    ret
2088 ; CHECK-LSE-O1-LABEL: atomicrmw_add_i16:
2089 ; CHECK-LSE-O1:       ; %bb.0:
2090 ; CHECK-LSE-O1-NEXT:    ldaddalh w1, w0, [x0]
2091 ; CHECK-LSE-O1-NEXT:    ret
2093 ; CHECK-LSE-O0-LABEL: atomicrmw_add_i16:
2094 ; CHECK-LSE-O0:       ; %bb.0:
2095 ; CHECK-LSE-O0-NEXT:    ldaddalh w1, w0, [x0]
2096 ; CHECK-LSE-O0-NEXT:    ret
2097   %res = atomicrmw add ptr %ptr, i16 %rhs seq_cst
2098   ret i16 %res
2101 define i16 @atomicrmw_xchg_i16(ptr %ptr, i16 %rhs) {
2102 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i16:
2103 ; CHECK-NOLSE-O1:       ; %bb.0:
2104 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
2105 ; CHECK-NOLSE-O1-NEXT:  LBB38_1: ; %atomicrmw.start
2106 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2107 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2108 ; CHECK-NOLSE-O1-NEXT:    stxrh w9, w1, [x0]
2109 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB38_1
2110 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2111 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2112 ; CHECK-NOLSE-O1-NEXT:    ret
2114 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i16:
2115 ; CHECK-NOLSE-O0:       ; %bb.0:
2116 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2117 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2118 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2119 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2120 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2121 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2122 ; CHECK-NOLSE-O0-NEXT:    b LBB38_1
2123 ; CHECK-NOLSE-O0-NEXT:  LBB38_1: ; %atomicrmw.start
2124 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2125 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB38_2 Depth 2
2126 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2127 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2128 ; CHECK-NOLSE-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
2129 ; CHECK-NOLSE-O0-NEXT:  LBB38_2: ; %atomicrmw.start
2130 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB38_1 Depth=1
2131 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2132 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2133 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2134 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB38_4
2135 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2136 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB38_2 Depth=2
2137 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2138 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB38_2
2139 ; CHECK-NOLSE-O0-NEXT:  LBB38_4: ; %atomicrmw.start
2140 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB38_1 Depth=1
2141 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2142 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2143 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2144 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2145 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2146 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB38_1
2147 ; CHECK-NOLSE-O0-NEXT:    b LBB38_5
2148 ; CHECK-NOLSE-O0-NEXT:  LBB38_5: ; %atomicrmw.end
2149 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2150 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2151 ; CHECK-NOLSE-O0-NEXT:    ret
2153 ; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i16:
2154 ; CHECK-LSE-O1:       ; %bb.0:
2155 ; CHECK-LSE-O1-NEXT:    swph w1, w0, [x0]
2156 ; CHECK-LSE-O1-NEXT:    ret
2158 ; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i16:
2159 ; CHECK-LSE-O0:       ; %bb.0:
2160 ; CHECK-LSE-O0-NEXT:    swph w1, w0, [x0]
2161 ; CHECK-LSE-O0-NEXT:    ret
2162   %res = atomicrmw xchg ptr %ptr, i16 %rhs monotonic
2163   ret i16 %res
2166 define i16 @atomicrmw_sub_i16(ptr %ptr, i16 %rhs) {
2167 ; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i16:
2168 ; CHECK-NOLSE-O1:       ; %bb.0:
2169 ; CHECK-NOLSE-O1-NEXT:  LBB39_1: ; %atomicrmw.start
2170 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2171 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2172 ; CHECK-NOLSE-O1-NEXT:    sub w9, w8, w1
2173 ; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
2174 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB39_1
2175 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2176 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2177 ; CHECK-NOLSE-O1-NEXT:    ret
2179 ; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i16:
2180 ; CHECK-NOLSE-O0:       ; %bb.0:
2181 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2182 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2183 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2184 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2185 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2186 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2187 ; CHECK-NOLSE-O0-NEXT:    b LBB39_1
2188 ; CHECK-NOLSE-O0-NEXT:  LBB39_1: ; %atomicrmw.start
2189 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2190 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB39_2 Depth 2
2191 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2192 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2193 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2194 ; CHECK-NOLSE-O0-NEXT:    subs w12, w8, w9
2195 ; CHECK-NOLSE-O0-NEXT:  LBB39_2: ; %atomicrmw.start
2196 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB39_1 Depth=1
2197 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2198 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2199 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2200 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB39_4
2201 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2202 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB39_2 Depth=2
2203 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2204 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB39_2
2205 ; CHECK-NOLSE-O0-NEXT:  LBB39_4: ; %atomicrmw.start
2206 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB39_1 Depth=1
2207 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2208 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2209 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2210 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2211 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2212 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB39_1
2213 ; CHECK-NOLSE-O0-NEXT:    b LBB39_5
2214 ; CHECK-NOLSE-O0-NEXT:  LBB39_5: ; %atomicrmw.end
2215 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2216 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2217 ; CHECK-NOLSE-O0-NEXT:    ret
2219 ; CHECK-LSE-O1-LABEL: atomicrmw_sub_i16:
2220 ; CHECK-LSE-O1:       ; %bb.0:
2221 ; CHECK-LSE-O1-NEXT:    neg w8, w1
2222 ; CHECK-LSE-O1-NEXT:    ldaddah w8, w0, [x0]
2223 ; CHECK-LSE-O1-NEXT:    ret
2225 ; CHECK-LSE-O0-LABEL: atomicrmw_sub_i16:
2226 ; CHECK-LSE-O0:       ; %bb.0:
2227 ; CHECK-LSE-O0-NEXT:    neg w8, w1
2228 ; CHECK-LSE-O0-NEXT:    ldaddah w8, w0, [x0]
2229 ; CHECK-LSE-O0-NEXT:    ret
2230   %res = atomicrmw sub ptr %ptr, i16 %rhs acquire
2231   ret i16 %res
2234 define i16 @atomicrmw_and_i16(ptr %ptr, i16 %rhs) {
2235 ; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i16:
2236 ; CHECK-NOLSE-O1:       ; %bb.0:
2237 ; CHECK-NOLSE-O1-NEXT:  LBB40_1: ; %atomicrmw.start
2238 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2239 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2240 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, w1
2241 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2242 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB40_1
2243 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2244 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2245 ; CHECK-NOLSE-O1-NEXT:    ret
2247 ; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i16:
2248 ; CHECK-NOLSE-O0:       ; %bb.0:
2249 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2250 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2251 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2252 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2253 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2254 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2255 ; CHECK-NOLSE-O0-NEXT:    b LBB40_1
2256 ; CHECK-NOLSE-O0-NEXT:  LBB40_1: ; %atomicrmw.start
2257 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2258 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB40_2 Depth 2
2259 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2260 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2261 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2262 ; CHECK-NOLSE-O0-NEXT:    and w12, w8, w9
2263 ; CHECK-NOLSE-O0-NEXT:  LBB40_2: ; %atomicrmw.start
2264 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB40_1 Depth=1
2265 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2266 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2267 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2268 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB40_4
2269 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2270 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB40_2 Depth=2
2271 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2272 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB40_2
2273 ; CHECK-NOLSE-O0-NEXT:  LBB40_4: ; %atomicrmw.start
2274 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB40_1 Depth=1
2275 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2276 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2277 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2278 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2279 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2280 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB40_1
2281 ; CHECK-NOLSE-O0-NEXT:    b LBB40_5
2282 ; CHECK-NOLSE-O0-NEXT:  LBB40_5: ; %atomicrmw.end
2283 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2284 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2285 ; CHECK-NOLSE-O0-NEXT:    ret
2287 ; CHECK-LSE-O1-LABEL: atomicrmw_and_i16:
2288 ; CHECK-LSE-O1:       ; %bb.0:
2289 ; CHECK-LSE-O1-NEXT:    mvn w8, w1
2290 ; CHECK-LSE-O1-NEXT:    ldclrlh w8, w0, [x0]
2291 ; CHECK-LSE-O1-NEXT:    ret
2293 ; CHECK-LSE-O0-LABEL: atomicrmw_and_i16:
2294 ; CHECK-LSE-O0:       ; %bb.0:
2295 ; CHECK-LSE-O0-NEXT:    mvn w8, w1
2296 ; CHECK-LSE-O0-NEXT:    ldclrlh w8, w0, [x0]
2297 ; CHECK-LSE-O0-NEXT:    ret
2298   %res = atomicrmw and ptr %ptr, i16 %rhs release
2299   ret i16 %res
2302 define i16 @atomicrmw_or_i16(ptr %ptr, i16 %rhs) {
2303 ; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i16:
2304 ; CHECK-NOLSE-O1:       ; %bb.0:
2305 ; CHECK-NOLSE-O1-NEXT:  LBB41_1: ; %atomicrmw.start
2306 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2307 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2308 ; CHECK-NOLSE-O1-NEXT:    orr w9, w8, w1
2309 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2310 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB41_1
2311 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2312 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2313 ; CHECK-NOLSE-O1-NEXT:    ret
2315 ; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i16:
2316 ; CHECK-NOLSE-O0:       ; %bb.0:
2317 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2318 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2319 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2320 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2321 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2322 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2323 ; CHECK-NOLSE-O0-NEXT:    b LBB41_1
2324 ; CHECK-NOLSE-O0-NEXT:  LBB41_1: ; %atomicrmw.start
2325 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2326 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB41_2 Depth 2
2327 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2328 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2329 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2330 ; CHECK-NOLSE-O0-NEXT:    orr w12, w8, w9
2331 ; CHECK-NOLSE-O0-NEXT:  LBB41_2: ; %atomicrmw.start
2332 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB41_1 Depth=1
2333 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2334 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2335 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2336 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB41_4
2337 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2338 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB41_2 Depth=2
2339 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2340 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB41_2
2341 ; CHECK-NOLSE-O0-NEXT:  LBB41_4: ; %atomicrmw.start
2342 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB41_1 Depth=1
2343 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2344 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2345 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2346 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2347 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2348 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB41_1
2349 ; CHECK-NOLSE-O0-NEXT:    b LBB41_5
2350 ; CHECK-NOLSE-O0-NEXT:  LBB41_5: ; %atomicrmw.end
2351 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2352 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2353 ; CHECK-NOLSE-O0-NEXT:    ret
2355 ; CHECK-LSE-O1-LABEL: atomicrmw_or_i16:
2356 ; CHECK-LSE-O1:       ; %bb.0:
2357 ; CHECK-LSE-O1-NEXT:    ldsetalh w1, w0, [x0]
2358 ; CHECK-LSE-O1-NEXT:    ret
2360 ; CHECK-LSE-O0-LABEL: atomicrmw_or_i16:
2361 ; CHECK-LSE-O0:       ; %bb.0:
2362 ; CHECK-LSE-O0-NEXT:    ldsetalh w1, w0, [x0]
2363 ; CHECK-LSE-O0-NEXT:    ret
2364   %res = atomicrmw or ptr %ptr, i16 %rhs seq_cst
2365   ret i16 %res
2368 define i16 @atomicrmw_xor_i16(ptr %ptr, i16 %rhs) {
2369 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i16:
2370 ; CHECK-NOLSE-O1:       ; %bb.0:
2371 ; CHECK-NOLSE-O1-NEXT:  LBB42_1: ; %atomicrmw.start
2372 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2373 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2374 ; CHECK-NOLSE-O1-NEXT:    eor w9, w8, w1
2375 ; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
2376 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB42_1
2377 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2378 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2379 ; CHECK-NOLSE-O1-NEXT:    ret
2381 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i16:
2382 ; CHECK-NOLSE-O0:       ; %bb.0:
2383 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2384 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2385 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2386 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2387 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2388 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2389 ; CHECK-NOLSE-O0-NEXT:    b LBB42_1
2390 ; CHECK-NOLSE-O0-NEXT:  LBB42_1: ; %atomicrmw.start
2391 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2392 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB42_2 Depth 2
2393 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2394 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2395 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2396 ; CHECK-NOLSE-O0-NEXT:    eor w12, w8, w9
2397 ; CHECK-NOLSE-O0-NEXT:  LBB42_2: ; %atomicrmw.start
2398 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB42_1 Depth=1
2399 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2400 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2401 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2402 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB42_4
2403 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2404 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB42_2 Depth=2
2405 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2406 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB42_2
2407 ; CHECK-NOLSE-O0-NEXT:  LBB42_4: ; %atomicrmw.start
2408 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB42_1 Depth=1
2409 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2410 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2411 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2412 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2413 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2414 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB42_1
2415 ; CHECK-NOLSE-O0-NEXT:    b LBB42_5
2416 ; CHECK-NOLSE-O0-NEXT:  LBB42_5: ; %atomicrmw.end
2417 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2418 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2419 ; CHECK-NOLSE-O0-NEXT:    ret
2421 ; CHECK-LSE-O1-LABEL: atomicrmw_xor_i16:
2422 ; CHECK-LSE-O1:       ; %bb.0:
2423 ; CHECK-LSE-O1-NEXT:    ldeorh w1, w0, [x0]
2424 ; CHECK-LSE-O1-NEXT:    ret
2426 ; CHECK-LSE-O0-LABEL: atomicrmw_xor_i16:
2427 ; CHECK-LSE-O0:       ; %bb.0:
2428 ; CHECK-LSE-O0-NEXT:    ldeorh w1, w0, [x0]
2429 ; CHECK-LSE-O0-NEXT:    ret
2430   %res = atomicrmw xor ptr %ptr, i16 %rhs monotonic
2431   ret i16 %res
2434 define i16 @atomicrmw_min_i16(ptr %ptr, i16 %rhs) {
2435 ; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i16:
2436 ; CHECK-NOLSE-O1:       ; %bb.0:
2437 ; CHECK-NOLSE-O1-NEXT:  LBB43_1: ; %atomicrmw.start
2438 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2439 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2440 ; CHECK-NOLSE-O1-NEXT:    sxth w9, w8
2441 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxth
2442 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, le
2443 ; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
2444 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB43_1
2445 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2446 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2447 ; CHECK-NOLSE-O1-NEXT:    ret
2449 ; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i16:
2450 ; CHECK-NOLSE-O0:       ; %bb.0:
2451 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2452 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2453 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2454 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2455 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2456 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2457 ; CHECK-NOLSE-O0-NEXT:    b LBB43_1
2458 ; CHECK-NOLSE-O0-NEXT:  LBB43_1: ; %atomicrmw.start
2459 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2460 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB43_2 Depth 2
2461 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2462 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2463 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2464 ; CHECK-NOLSE-O0-NEXT:    sxth w10, w8
2465 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, sxth
2466 ; CHECK-NOLSE-O0-NEXT:    cset w10, le
2467 ; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
2468 ; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
2469 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
2470 ; CHECK-NOLSE-O0-NEXT:  LBB43_2: ; %atomicrmw.start
2471 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB43_1 Depth=1
2472 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2473 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2474 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2475 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB43_4
2476 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2477 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB43_2 Depth=2
2478 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2479 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB43_2
2480 ; CHECK-NOLSE-O0-NEXT:  LBB43_4: ; %atomicrmw.start
2481 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB43_1 Depth=1
2482 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2483 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2484 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2485 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2486 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2487 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB43_1
2488 ; CHECK-NOLSE-O0-NEXT:    b LBB43_5
2489 ; CHECK-NOLSE-O0-NEXT:  LBB43_5: ; %atomicrmw.end
2490 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2491 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2492 ; CHECK-NOLSE-O0-NEXT:    ret
2494 ; CHECK-LSE-O1-LABEL: atomicrmw_min_i16:
2495 ; CHECK-LSE-O1:       ; %bb.0:
2496 ; CHECK-LSE-O1-NEXT:    ldsminah w1, w0, [x0]
2497 ; CHECK-LSE-O1-NEXT:    ret
2499 ; CHECK-LSE-O0-LABEL: atomicrmw_min_i16:
2500 ; CHECK-LSE-O0:       ; %bb.0:
2501 ; CHECK-LSE-O0-NEXT:    ldsminah w1, w0, [x0]
2502 ; CHECK-LSE-O0-NEXT:    ret
2503   %res = atomicrmw min ptr %ptr, i16 %rhs acquire
2504   ret i16 %res
2507 define i16 @atomicrmw_max_i16(ptr %ptr, i16 %rhs) {
2508 ; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i16:
2509 ; CHECK-NOLSE-O1:       ; %bb.0:
2510 ; CHECK-NOLSE-O1-NEXT:  LBB44_1: ; %atomicrmw.start
2511 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2512 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2513 ; CHECK-NOLSE-O1-NEXT:    sxth w9, w8
2514 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxth
2515 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, gt
2516 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2517 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB44_1
2518 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2519 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2520 ; CHECK-NOLSE-O1-NEXT:    ret
2522 ; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i16:
2523 ; CHECK-NOLSE-O0:       ; %bb.0:
2524 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2525 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2526 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2527 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2528 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2529 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2530 ; CHECK-NOLSE-O0-NEXT:    b LBB44_1
2531 ; CHECK-NOLSE-O0-NEXT:  LBB44_1: ; %atomicrmw.start
2532 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2533 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB44_2 Depth 2
2534 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2535 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2536 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2537 ; CHECK-NOLSE-O0-NEXT:    sxth w10, w8
2538 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, sxth
2539 ; CHECK-NOLSE-O0-NEXT:    cset w10, gt
2540 ; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
2541 ; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
2542 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
2543 ; CHECK-NOLSE-O0-NEXT:  LBB44_2: ; %atomicrmw.start
2544 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB44_1 Depth=1
2545 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2546 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2547 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2548 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB44_4
2549 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2550 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB44_2 Depth=2
2551 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2552 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB44_2
2553 ; CHECK-NOLSE-O0-NEXT:  LBB44_4: ; %atomicrmw.start
2554 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB44_1 Depth=1
2555 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2556 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2557 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2558 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2559 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2560 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB44_1
2561 ; CHECK-NOLSE-O0-NEXT:    b LBB44_5
2562 ; CHECK-NOLSE-O0-NEXT:  LBB44_5: ; %atomicrmw.end
2563 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2564 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2565 ; CHECK-NOLSE-O0-NEXT:    ret
2567 ; CHECK-LSE-O1-LABEL: atomicrmw_max_i16:
2568 ; CHECK-LSE-O1:       ; %bb.0:
2569 ; CHECK-LSE-O1-NEXT:    ldsmaxlh w1, w0, [x0]
2570 ; CHECK-LSE-O1-NEXT:    ret
2572 ; CHECK-LSE-O0-LABEL: atomicrmw_max_i16:
2573 ; CHECK-LSE-O0:       ; %bb.0:
2574 ; CHECK-LSE-O0-NEXT:    ldsmaxlh w1, w0, [x0]
2575 ; CHECK-LSE-O0-NEXT:    ret
2576   %res = atomicrmw max ptr %ptr, i16 %rhs release
2577   ret i16 %res
2580 define i16 @atomicrmw_umin_i16(ptr %ptr, i16 %rhs) {
2581 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i16:
2582 ; CHECK-NOLSE-O1:       ; %bb.0:
2583 ; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xffff
2584 ; CHECK-NOLSE-O1-NEXT:  LBB45_1: ; %atomicrmw.start
2585 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2586 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2587 ; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xffff
2588 ; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
2589 ; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, ls
2590 ; CHECK-NOLSE-O1-NEXT:    stlxrh w11, w10, [x0]
2591 ; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB45_1
2592 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2593 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2594 ; CHECK-NOLSE-O1-NEXT:    ret
2596 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i16:
2597 ; CHECK-NOLSE-O0:       ; %bb.0:
2598 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2599 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2600 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2601 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2602 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2603 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2604 ; CHECK-NOLSE-O0-NEXT:    b LBB45_1
2605 ; CHECK-NOLSE-O0-NEXT:  LBB45_1: ; %atomicrmw.start
2606 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2607 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB45_2 Depth 2
2608 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2609 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2610 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2611 ; CHECK-NOLSE-O0-NEXT:    uxth w10, w8
2612 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, uxth
2613 ; CHECK-NOLSE-O0-NEXT:    cset w10, ls
2614 ; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
2615 ; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
2616 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
2617 ; CHECK-NOLSE-O0-NEXT:  LBB45_2: ; %atomicrmw.start
2618 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB45_1 Depth=1
2619 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2620 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2621 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2622 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB45_4
2623 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2624 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB45_2 Depth=2
2625 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2626 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB45_2
2627 ; CHECK-NOLSE-O0-NEXT:  LBB45_4: ; %atomicrmw.start
2628 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB45_1 Depth=1
2629 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2630 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2631 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2632 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2633 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2634 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB45_1
2635 ; CHECK-NOLSE-O0-NEXT:    b LBB45_5
2636 ; CHECK-NOLSE-O0-NEXT:  LBB45_5: ; %atomicrmw.end
2637 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2638 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2639 ; CHECK-NOLSE-O0-NEXT:    ret
2641 ; CHECK-LSE-O1-LABEL: atomicrmw_umin_i16:
2642 ; CHECK-LSE-O1:       ; %bb.0:
2643 ; CHECK-LSE-O1-NEXT:    lduminalh w1, w0, [x0]
2644 ; CHECK-LSE-O1-NEXT:    ret
2646 ; CHECK-LSE-O0-LABEL: atomicrmw_umin_i16:
2647 ; CHECK-LSE-O0:       ; %bb.0:
2648 ; CHECK-LSE-O0-NEXT:    lduminalh w1, w0, [x0]
2649 ; CHECK-LSE-O0-NEXT:    ret
2650   %res = atomicrmw umin ptr %ptr, i16 %rhs seq_cst
2651   ret i16 %res
2654 define i16 @atomicrmw_umax_i16(ptr %ptr, i16 %rhs) {
2655 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i16:
2656 ; CHECK-NOLSE-O1:       ; %bb.0:
2657 ; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xffff
2658 ; CHECK-NOLSE-O1-NEXT:  LBB46_1: ; %atomicrmw.start
2659 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2660 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2661 ; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xffff
2662 ; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
2663 ; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, hi
2664 ; CHECK-NOLSE-O1-NEXT:    stxrh w11, w10, [x0]
2665 ; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB46_1
2666 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2667 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2668 ; CHECK-NOLSE-O1-NEXT:    ret
2670 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i16:
2671 ; CHECK-NOLSE-O0:       ; %bb.0:
2672 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2673 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2674 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2675 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2676 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2677 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2678 ; CHECK-NOLSE-O0-NEXT:    b LBB46_1
2679 ; CHECK-NOLSE-O0-NEXT:  LBB46_1: ; %atomicrmw.start
2680 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2681 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB46_2 Depth 2
2682 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2683 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2684 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2685 ; CHECK-NOLSE-O0-NEXT:    uxth w10, w8
2686 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, uxth
2687 ; CHECK-NOLSE-O0-NEXT:    cset w10, hi
2688 ; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
2689 ; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
2690 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
2691 ; CHECK-NOLSE-O0-NEXT:  LBB46_2: ; %atomicrmw.start
2692 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB46_1 Depth=1
2693 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2694 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2695 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2696 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB46_4
2697 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2698 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB46_2 Depth=2
2699 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2700 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB46_2
2701 ; CHECK-NOLSE-O0-NEXT:  LBB46_4: ; %atomicrmw.start
2702 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB46_1 Depth=1
2703 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2704 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2705 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2706 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2707 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2708 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB46_1
2709 ; CHECK-NOLSE-O0-NEXT:    b LBB46_5
2710 ; CHECK-NOLSE-O0-NEXT:  LBB46_5: ; %atomicrmw.end
2711 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2712 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2713 ; CHECK-NOLSE-O0-NEXT:    ret
2715 ; CHECK-LSE-O1-LABEL: atomicrmw_umax_i16:
2716 ; CHECK-LSE-O1:       ; %bb.0:
2717 ; CHECK-LSE-O1-NEXT:    ldumaxh w1, w0, [x0]
2718 ; CHECK-LSE-O1-NEXT:    ret
2720 ; CHECK-LSE-O0-LABEL: atomicrmw_umax_i16:
2721 ; CHECK-LSE-O0:       ; %bb.0:
2722 ; CHECK-LSE-O0-NEXT:    ldumaxh w1, w0, [x0]
2723 ; CHECK-LSE-O0-NEXT:    ret
2724   %res = atomicrmw umax ptr %ptr, i16 %rhs monotonic
2725   ret i16 %res
2728 define { i8, i1 } @cmpxchg_i8(ptr %ptr, i8 %desired, i8 %new) {
2729 ; CHECK-NOLSE-O1-LABEL: cmpxchg_i8:
2730 ; CHECK-NOLSE-O1:       ; %bb.0:
2731 ; CHECK-NOLSE-O1-NEXT:    mov x8, x0
2732 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
2733 ; CHECK-NOLSE-O1-NEXT:  LBB47_1: ; %cmpxchg.start
2734 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2735 ; CHECK-NOLSE-O1-NEXT:    ldxrb w0, [x8]
2736 ; CHECK-NOLSE-O1-NEXT:    and w9, w0, #0xff
2737 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxtb
2738 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB47_4
2739 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
2740 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB47_1 Depth=1
2741 ; CHECK-NOLSE-O1-NEXT:    stxrb w9, w2, [x8]
2742 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB47_1
2743 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3:
2744 ; CHECK-NOLSE-O1-NEXT:    mov w1, #1 ; =0x1
2745 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2746 ; CHECK-NOLSE-O1-NEXT:    ret
2747 ; CHECK-NOLSE-O1-NEXT:  LBB47_4: ; %cmpxchg.nostore
2748 ; CHECK-NOLSE-O1-NEXT:    mov w1, wzr
2749 ; CHECK-NOLSE-O1-NEXT:    clrex
2750 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2751 ; CHECK-NOLSE-O1-NEXT:    ret
2753 ; CHECK-NOLSE-O0-LABEL: cmpxchg_i8:
2754 ; CHECK-NOLSE-O0:       ; %bb.0:
2755 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
2756 ; CHECK-NOLSE-O0-NEXT:  LBB47_1: ; =>This Inner Loop Header: Depth=1
2757 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w0, [x9]
2758 ; CHECK-NOLSE-O0-NEXT:    cmp w0, w1, uxtb
2759 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB47_3
2760 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB47_1 Depth=1
2761 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w2, [x9]
2762 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB47_1
2763 ; CHECK-NOLSE-O0-NEXT:  LBB47_3:
2764 ; CHECK-NOLSE-O0-NEXT:    and w8, w0, #0xff
2765 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w1, uxtb
2766 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2767 ; CHECK-NOLSE-O0-NEXT:    and w1, w8, #0x1
2768 ; CHECK-NOLSE-O0-NEXT:    ret
2770 ; CHECK-LSE-O1-LABEL: cmpxchg_i8:
2771 ; CHECK-LSE-O1:       ; %bb.0:
2772 ; CHECK-LSE-O1-NEXT:    mov x8, x1
2773 ; CHECK-LSE-O1-NEXT:    casb w8, w2, [x0]
2774 ; CHECK-LSE-O1-NEXT:    and w9, w8, #0xff
2775 ; CHECK-LSE-O1-NEXT:    cmp w9, w1, uxtb
2776 ; CHECK-LSE-O1-NEXT:    cset w1, eq
2777 ; CHECK-LSE-O1-NEXT:    mov x0, x8
2778 ; CHECK-LSE-O1-NEXT:    ret
2780 ; CHECK-LSE-O0-LABEL: cmpxchg_i8:
2781 ; CHECK-LSE-O0:       ; %bb.0:
2782 ; CHECK-LSE-O0-NEXT:    mov x8, x0
2783 ; CHECK-LSE-O0-NEXT:    mov x0, x1
2784 ; CHECK-LSE-O0-NEXT:    casb w0, w2, [x8]
2785 ; CHECK-LSE-O0-NEXT:    and w8, w0, #0xff
2786 ; CHECK-LSE-O0-NEXT:    subs w8, w8, w1, uxtb
2787 ; CHECK-LSE-O0-NEXT:    cset w8, eq
2788 ; CHECK-LSE-O0-NEXT:    and w1, w8, #0x1
2789 ; CHECK-LSE-O0-NEXT:    ret
2790   %res = cmpxchg ptr %ptr, i8 %desired, i8 %new monotonic monotonic
2791   ret { i8, i1 } %res
2794 define { i16, i1 } @cmpxchg_i16(ptr %ptr, i16 %desired, i16 %new) {
2795 ; CHECK-NOLSE-O1-LABEL: cmpxchg_i16:
2796 ; CHECK-NOLSE-O1:       ; %bb.0:
2797 ; CHECK-NOLSE-O1-NEXT:    mov x8, x0
2798 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
2799 ; CHECK-NOLSE-O1-NEXT:  LBB48_1: ; %cmpxchg.start
2800 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2801 ; CHECK-NOLSE-O1-NEXT:    ldxrh w0, [x8]
2802 ; CHECK-NOLSE-O1-NEXT:    and w9, w0, #0xffff
2803 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxth
2804 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB48_4
2805 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
2806 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB48_1 Depth=1
2807 ; CHECK-NOLSE-O1-NEXT:    stxrh w9, w2, [x8]
2808 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB48_1
2809 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3:
2810 ; CHECK-NOLSE-O1-NEXT:    mov w1, #1 ; =0x1
2811 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2812 ; CHECK-NOLSE-O1-NEXT:    ret
2813 ; CHECK-NOLSE-O1-NEXT:  LBB48_4: ; %cmpxchg.nostore
2814 ; CHECK-NOLSE-O1-NEXT:    mov w1, wzr
2815 ; CHECK-NOLSE-O1-NEXT:    clrex
2816 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2817 ; CHECK-NOLSE-O1-NEXT:    ret
2819 ; CHECK-NOLSE-O0-LABEL: cmpxchg_i16:
2820 ; CHECK-NOLSE-O0:       ; %bb.0:
2821 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
2822 ; CHECK-NOLSE-O0-NEXT:  LBB48_1: ; =>This Inner Loop Header: Depth=1
2823 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w0, [x9]
2824 ; CHECK-NOLSE-O0-NEXT:    cmp w0, w1, uxth
2825 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB48_3
2826 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB48_1 Depth=1
2827 ; CHECK-NOLSE-O0-NEXT:    stlxrh w8, w2, [x9]
2828 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB48_1
2829 ; CHECK-NOLSE-O0-NEXT:  LBB48_3:
2830 ; CHECK-NOLSE-O0-NEXT:    and w8, w0, #0xffff
2831 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w1, uxth
2832 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2833 ; CHECK-NOLSE-O0-NEXT:    and w1, w8, #0x1
2834 ; CHECK-NOLSE-O0-NEXT:    ret
2836 ; CHECK-LSE-O1-LABEL: cmpxchg_i16:
2837 ; CHECK-LSE-O1:       ; %bb.0:
2838 ; CHECK-LSE-O1-NEXT:    mov x8, x1
2839 ; CHECK-LSE-O1-NEXT:    cash w8, w2, [x0]
2840 ; CHECK-LSE-O1-NEXT:    and w9, w8, #0xffff
2841 ; CHECK-LSE-O1-NEXT:    cmp w9, w1, uxth
2842 ; CHECK-LSE-O1-NEXT:    cset w1, eq
2843 ; CHECK-LSE-O1-NEXT:    mov x0, x8
2844 ; CHECK-LSE-O1-NEXT:    ret
2846 ; CHECK-LSE-O0-LABEL: cmpxchg_i16:
2847 ; CHECK-LSE-O0:       ; %bb.0:
2848 ; CHECK-LSE-O0-NEXT:    mov x8, x0
2849 ; CHECK-LSE-O0-NEXT:    mov x0, x1
2850 ; CHECK-LSE-O0-NEXT:    cash w0, w2, [x8]
2851 ; CHECK-LSE-O0-NEXT:    and w8, w0, #0xffff
2852 ; CHECK-LSE-O0-NEXT:    subs w8, w8, w1, uxth
2853 ; CHECK-LSE-O0-NEXT:    cset w8, eq
2854 ; CHECK-LSE-O0-NEXT:    and w1, w8, #0x1
2855 ; CHECK-LSE-O0-NEXT:    ret
2856   %res = cmpxchg ptr %ptr, i16 %desired, i16 %new monotonic monotonic
2857   ret { i16, i1 } %res
2860 define internal double @bitcast_to_double(ptr %ptr) {
2861 ; CHECK-NOLSE-LABEL: bitcast_to_double:
2862 ; CHECK-NOLSE:       ; %bb.0:
2863 ; CHECK-NOLSE-NEXT:    ldar x8, [x0]
2864 ; CHECK-NOLSE-NEXT:    fmov d0, x8
2865 ; CHECK-NOLSE-NEXT:    ret
2867 ; CHECK-LSE-O1-LABEL: bitcast_to_double:
2868 ; CHECK-LSE-O1:       ; %bb.0:
2869 ; CHECK-LSE-O1-NEXT:    ldar x8, [x0]
2870 ; CHECK-LSE-O1-NEXT:    fmov d0, x8
2871 ; CHECK-LSE-O1-NEXT:    ret
2873 ; CHECK-LSE-O0-LABEL: bitcast_to_double:
2874 ; CHECK-LSE-O0:       ; %bb.0:
2875 ; CHECK-LSE-O0-NEXT:    ldar x8, [x0]
2876 ; CHECK-LSE-O0-NEXT:    fmov d0, x8
2877 ; CHECK-LSE-O0-NEXT:    ret
2878   %load = load atomic i64, ptr %ptr seq_cst, align 8
2879   %bitcast = bitcast i64 %load to double
2880   ret double %bitcast
2883 define internal float @bitcast_to_float(ptr %ptr) {
2884 ; CHECK-NOLSE-LABEL: bitcast_to_float:
2885 ; CHECK-NOLSE:       ; %bb.0:
2886 ; CHECK-NOLSE-NEXT:    ldar w8, [x0]
2887 ; CHECK-NOLSE-NEXT:    fmov s0, w8
2888 ; CHECK-NOLSE-NEXT:    ret
2890 ; CHECK-LSE-O1-LABEL: bitcast_to_float:
2891 ; CHECK-LSE-O1:       ; %bb.0:
2892 ; CHECK-LSE-O1-NEXT:    ldar w8, [x0]
2893 ; CHECK-LSE-O1-NEXT:    fmov s0, w8
2894 ; CHECK-LSE-O1-NEXT:    ret
2896 ; CHECK-LSE-O0-LABEL: bitcast_to_float:
2897 ; CHECK-LSE-O0:       ; %bb.0:
2898 ; CHECK-LSE-O0-NEXT:    ldar w8, [x0]
2899 ; CHECK-LSE-O0-NEXT:    fmov s0, w8
2900 ; CHECK-LSE-O0-NEXT:    ret
2901   %load = load atomic i32, ptr %ptr seq_cst, align 8
2902   %bitcast = bitcast i32 %load to float
2903   ret float %bitcast
2906 define internal half @bitcast_to_half(ptr %ptr) {
2907 ; CHECK-NOLSE-LABEL: bitcast_to_half:
2908 ; CHECK-NOLSE:       ; %bb.0:
2909 ; CHECK-NOLSE-NEXT:    ldarh w8, [x0]
2910 ; CHECK-NOLSE-NEXT:    fmov s0, w8
2911 ; CHECK-NOLSE-NEXT:    ; kill: def $h0 killed $h0 killed $s0
2912 ; CHECK-NOLSE-NEXT:    ret
2914 ; CHECK-LSE-O1-LABEL: bitcast_to_half:
2915 ; CHECK-LSE-O1:       ; %bb.0:
2916 ; CHECK-LSE-O1-NEXT:    ldarh w8, [x0]
2917 ; CHECK-LSE-O1-NEXT:    fmov s0, w8
2918 ; CHECK-LSE-O1-NEXT:    ; kill: def $h0 killed $h0 killed $s0
2919 ; CHECK-LSE-O1-NEXT:    ret
2921 ; CHECK-LSE-O0-LABEL: bitcast_to_half:
2922 ; CHECK-LSE-O0:       ; %bb.0:
2923 ; CHECK-LSE-O0-NEXT:    ldarh w8, [x0]
2924 ; CHECK-LSE-O0-NEXT:    fmov s0, w8
2925 ; CHECK-LSE-O0-NEXT:    ; kill: def $h0 killed $h0 killed $s0
2926 ; CHECK-LSE-O0-NEXT:    ret
2927   %load = load atomic i16, ptr %ptr seq_cst, align 8
2928   %bitcast = bitcast i16 %load to half
2929   ret half %bitcast
2932 define internal ptr @inttoptr(ptr %ptr) {
2933 ; CHECK-NOLSE-LABEL: inttoptr:
2934 ; CHECK-NOLSE:       ; %bb.0:
2935 ; CHECK-NOLSE-NEXT:    ldar x0, [x0]
2936 ; CHECK-NOLSE-NEXT:    ret
2938 ; CHECK-LSE-O1-LABEL: inttoptr:
2939 ; CHECK-LSE-O1:       ; %bb.0:
2940 ; CHECK-LSE-O1-NEXT:    ldar x0, [x0]
2941 ; CHECK-LSE-O1-NEXT:    ret
2943 ; CHECK-LSE-O0-LABEL: inttoptr:
2944 ; CHECK-LSE-O0:       ; %bb.0:
2945 ; CHECK-LSE-O0-NEXT:    ldar x0, [x0]
2946 ; CHECK-LSE-O0-NEXT:    ret
2947   %load = load atomic i64, ptr %ptr seq_cst, align 8
2948   %bitcast = inttoptr i64 %load to ptr
2949   ret ptr %bitcast
2952 define internal ptr @load_ptr(ptr %ptr) {
2953 ; CHECK-NOLSE-LABEL: load_ptr:
2954 ; CHECK-NOLSE:       ; %bb.0:
2955 ; CHECK-NOLSE-NEXT:    ldar x0, [x0]
2956 ; CHECK-NOLSE-NEXT:    ret
2958 ; CHECK-LSE-O1-LABEL: load_ptr:
2959 ; CHECK-LSE-O1:       ; %bb.0:
2960 ; CHECK-LSE-O1-NEXT:    ldar x0, [x0]
2961 ; CHECK-LSE-O1-NEXT:    ret
2963 ; CHECK-LSE-O0-LABEL: load_ptr:
2964 ; CHECK-LSE-O0:       ; %bb.0:
2965 ; CHECK-LSE-O0-NEXT:    ldar x0, [x0]
2966 ; CHECK-LSE-O0-NEXT:    ret
2967   %load = load atomic ptr, ptr %ptr seq_cst, align 8
2968   ret ptr %load
2971 attributes #0 = { nounwind }