[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / arm64-atomic.ll
blob13cb5191a690f114921f48e245bd82af9b253f4a
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(i32* %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 i32* %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(i32* %p, i32 %cmp, i32* %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, i32* %pnew
107   %pair = cmpxchg i32* %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(i32* %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 i32* %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(i64* %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 i64* %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(i64* %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 i64* %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(i64* %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 i64* %p, i64 %cmp, i64 %new release acquire
308   %val = extractvalue { i64, i1 } %pair, 0
309   ret i64 %val
312 define i32 @fetch_and_nand(i32* %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:  LBB6_1: ; %atomicrmw.start
366 ; CHECK-LSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
367 ; CHECK-LSE-O1-NEXT:    ldxr w8, [x0]
368 ; CHECK-LSE-O1-NEXT:    and w9, w8, #0x7
369 ; CHECK-LSE-O1-NEXT:    mvn w9, w9
370 ; CHECK-LSE-O1-NEXT:    stlxr w10, w9, [x0]
371 ; CHECK-LSE-O1-NEXT:    cbnz w10, LBB6_1
372 ; CHECK-LSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
373 ; CHECK-LSE-O1-NEXT:    mov x0, x8
374 ; CHECK-LSE-O1-NEXT:    ret
376 ; CHECK-LSE-O0-LABEL: fetch_and_nand:
377 ; CHECK-LSE-O0:       ; %bb.0:
378 ; CHECK-LSE-O0-NEXT:    sub sp, sp, #32
379 ; CHECK-LSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
380 ; CHECK-LSE-O0-NEXT:    ldr w8, [x0]
381 ; CHECK-LSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
382 ; CHECK-LSE-O0-NEXT:    b LBB6_1
383 ; CHECK-LSE-O0-NEXT:  LBB6_1: ; %atomicrmw.start
384 ; CHECK-LSE-O0-NEXT:    ; =>This Inner Loop Header: Depth=1
385 ; CHECK-LSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
386 ; CHECK-LSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
387 ; CHECK-LSE-O0-NEXT:    and w9, w8, #0x7
388 ; CHECK-LSE-O0-NEXT:    mvn w10, w9
389 ; CHECK-LSE-O0-NEXT:    mov x9, x8
390 ; CHECK-LSE-O0-NEXT:    casl w9, w10, [x11]
391 ; CHECK-LSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
392 ; CHECK-LSE-O0-NEXT:    subs w8, w9, w8
393 ; CHECK-LSE-O0-NEXT:    cset w8, eq
394 ; CHECK-LSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
395 ; CHECK-LSE-O0-NEXT:    tbz w8, #0, LBB6_1
396 ; CHECK-LSE-O0-NEXT:    b LBB6_2
397 ; CHECK-LSE-O0-NEXT:  LBB6_2: ; %atomicrmw.end
398 ; CHECK-LSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
399 ; CHECK-LSE-O0-NEXT:    add sp, sp, #32
400 ; CHECK-LSE-O0-NEXT:    ret
401   %val = atomicrmw nand i32* %p, i32 7 release
402   ret i32 %val
405 define i64 @fetch_and_nand_64(i64* %p) #0 {
406 ; CHECK-NOLSE-O1-LABEL: fetch_and_nand_64:
407 ; CHECK-NOLSE-O1:       ; %bb.0:
408 ; CHECK-NOLSE-O1-NEXT:  LBB7_1: ; %atomicrmw.start
409 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
410 ; CHECK-NOLSE-O1-NEXT:    ldaxr x8, [x0]
411 ; CHECK-NOLSE-O1-NEXT:    and x9, x8, #0x7
412 ; CHECK-NOLSE-O1-NEXT:    mvn x9, x9
413 ; CHECK-NOLSE-O1-NEXT:    stlxr w10, x9, [x0]
414 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB7_1
415 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
416 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
417 ; CHECK-NOLSE-O1-NEXT:    ret
419 ; CHECK-NOLSE-O0-LABEL: fetch_and_nand_64:
420 ; CHECK-NOLSE-O0:       ; %bb.0:
421 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
422 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
423 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0]
424 ; CHECK-NOLSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
425 ; CHECK-NOLSE-O0-NEXT:    b LBB7_1
426 ; CHECK-NOLSE-O0-NEXT:  LBB7_1: ; %atomicrmw.start
427 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
428 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB7_2 Depth 2
429 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
430 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
431 ; CHECK-NOLSE-O0-NEXT:    and x9, x8, #0x7
432 ; CHECK-NOLSE-O0-NEXT:    mvn x12, x9
433 ; CHECK-NOLSE-O0-NEXT:  LBB7_2: ; %atomicrmw.start
434 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB7_1 Depth=1
435 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
436 ; CHECK-NOLSE-O0-NEXT:    ldaxr x9, [x11]
437 ; CHECK-NOLSE-O0-NEXT:    cmp x9, x8
438 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB7_4
439 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
440 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB7_2 Depth=2
441 ; CHECK-NOLSE-O0-NEXT:    stlxr w10, x12, [x11]
442 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB7_2
443 ; CHECK-NOLSE-O0-NEXT:  LBB7_4: ; %atomicrmw.start
444 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB7_1 Depth=1
445 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
446 ; CHECK-NOLSE-O0-NEXT:    subs x8, x9, x8
447 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
448 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
449 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB7_1
450 ; CHECK-NOLSE-O0-NEXT:    b LBB7_5
451 ; CHECK-NOLSE-O0-NEXT:  LBB7_5: ; %atomicrmw.end
452 ; CHECK-NOLSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
453 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
454 ; CHECK-NOLSE-O0-NEXT:    ret
456 ; CHECK-LSE-O1-LABEL: fetch_and_nand_64:
457 ; CHECK-LSE-O1:       ; %bb.0:
458 ; CHECK-LSE-O1-NEXT:  LBB7_1: ; %atomicrmw.start
459 ; CHECK-LSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
460 ; CHECK-LSE-O1-NEXT:    ldaxr x8, [x0]
461 ; CHECK-LSE-O1-NEXT:    and x9, x8, #0x7
462 ; CHECK-LSE-O1-NEXT:    mvn x9, x9
463 ; CHECK-LSE-O1-NEXT:    stlxr w10, x9, [x0]
464 ; CHECK-LSE-O1-NEXT:    cbnz w10, LBB7_1
465 ; CHECK-LSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
466 ; CHECK-LSE-O1-NEXT:    mov x0, x8
467 ; CHECK-LSE-O1-NEXT:    ret
469 ; CHECK-LSE-O0-LABEL: fetch_and_nand_64:
470 ; CHECK-LSE-O0:       ; %bb.0:
471 ; CHECK-LSE-O0-NEXT:    sub sp, sp, #32
472 ; CHECK-LSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
473 ; CHECK-LSE-O0-NEXT:    ldr x8, [x0]
474 ; CHECK-LSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
475 ; CHECK-LSE-O0-NEXT:    b LBB7_1
476 ; CHECK-LSE-O0-NEXT:  LBB7_1: ; %atomicrmw.start
477 ; CHECK-LSE-O0-NEXT:    ; =>This Inner Loop Header: Depth=1
478 ; CHECK-LSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
479 ; CHECK-LSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
480 ; CHECK-LSE-O0-NEXT:    and x9, x8, #0x7
481 ; CHECK-LSE-O0-NEXT:    mvn x10, x9
482 ; CHECK-LSE-O0-NEXT:    mov x9, x8
483 ; CHECK-LSE-O0-NEXT:    casal x9, x10, [x11]
484 ; CHECK-LSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
485 ; CHECK-LSE-O0-NEXT:    subs x8, x9, x8
486 ; CHECK-LSE-O0-NEXT:    cset w8, eq
487 ; CHECK-LSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
488 ; CHECK-LSE-O0-NEXT:    tbz w8, #0, LBB7_1
489 ; CHECK-LSE-O0-NEXT:    b LBB7_2
490 ; CHECK-LSE-O0-NEXT:  LBB7_2: ; %atomicrmw.end
491 ; CHECK-LSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
492 ; CHECK-LSE-O0-NEXT:    add sp, sp, #32
493 ; CHECK-LSE-O0-NEXT:    ret
494   %val = atomicrmw nand i64* %p, i64 7 acq_rel
495   ret i64 %val
498 define i32 @fetch_and_or(i32* %p) #0 {
499 ; CHECK-NOLSE-O1-LABEL: fetch_and_or:
500 ; CHECK-NOLSE-O1:       ; %bb.0:
501 ; CHECK-NOLSE-O1-NEXT:    mov w9, #5
502 ; CHECK-NOLSE-O1-NEXT:  LBB8_1: ; %atomicrmw.start
503 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
504 ; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
505 ; CHECK-NOLSE-O1-NEXT:    orr w10, w8, w9
506 ; CHECK-NOLSE-O1-NEXT:    stlxr w11, w10, [x0]
507 ; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB8_1
508 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
509 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
510 ; CHECK-NOLSE-O1-NEXT:    ret
512 ; CHECK-NOLSE-O0-LABEL: fetch_and_or:
513 ; CHECK-NOLSE-O0:       ; %bb.0:
514 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
515 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
516 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0]
517 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
518 ; CHECK-NOLSE-O0-NEXT:    b LBB8_1
519 ; CHECK-NOLSE-O0-NEXT:  LBB8_1: ; %atomicrmw.start
520 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
521 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB8_2 Depth 2
522 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
523 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
524 ; CHECK-NOLSE-O0-NEXT:    mov w9, #5
525 ; CHECK-NOLSE-O0-NEXT:    orr w12, w8, w9
526 ; CHECK-NOLSE-O0-NEXT:  LBB8_2: ; %atomicrmw.start
527 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB8_1 Depth=1
528 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
529 ; CHECK-NOLSE-O0-NEXT:    ldaxr w9, [x11]
530 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8
531 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB8_4
532 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
533 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB8_2 Depth=2
534 ; CHECK-NOLSE-O0-NEXT:    stlxr w10, w12, [x11]
535 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB8_2
536 ; CHECK-NOLSE-O0-NEXT:  LBB8_4: ; %atomicrmw.start
537 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB8_1 Depth=1
538 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
539 ; CHECK-NOLSE-O0-NEXT:    subs w8, w9, w8
540 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
541 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
542 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB8_1
543 ; CHECK-NOLSE-O0-NEXT:    LBB8_5
544 ; CHECK-NOLSE-O0-NEXT:  LBB8_5: ; %atomicrmw.end
545 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
546 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
547 ; CHECK-NOLSE-O0-NEXT:    ret
549 ; CHECK-LSE-O1-LABEL: fetch_and_or:
550 ; CHECK-LSE-O1:       ; %bb.0:
551 ; CHECK-LSE-O1-NEXT:    mov w8, #5
552 ; CHECK-LSE-O1-NEXT:    ldsetal w8, w0, [x0]
553 ; CHECK-LSE-O1-NEXT:    ret
555 ; CHECK-LSE-O0-LABEL: fetch_and_or:
556 ; CHECK-LSE-O0:       ; %bb.0:
557 ; CHECK-LSE-O0-NEXT:    mov w8, #5
558 ; CHECK-LSE-O0-NEXT:    ldsetal w8, w0, [x0]
559 ; CHECK-LSE-O0-NEXT:    ret
560   %val = atomicrmw or i32* %p, i32 5 seq_cst
561   ret i32 %val
564 define i64 @fetch_and_or_64(i64* %p) #0 {
565 ; CHECK-NOLSE-O1-LABEL: fetch_and_or_64:
566 ; CHECK-NOLSE-O1:       ; %bb.0:
567 ; CHECK-NOLSE-O1-NEXT:  LBB9_1: ; %atomicrmw.start
568 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
569 ; CHECK-NOLSE-O1-NEXT:    ldxr x8, [x0]
570 ; CHECK-NOLSE-O1-NEXT:    orr x9, x8, #0x7
571 ; CHECK-NOLSE-O1-NEXT:    stxr w10, x9, [x0]
572 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB9_1
573 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
574 ; CHECK-NOLSE-O1-NEXT:    mov x0, x8
575 ; CHECK-NOLSE-O1-NEXT:    ret
577 ; CHECK-NOLSE-O0-LABEL: fetch_and_or_64:
578 ; CHECK-NOLSE-O0:       ; %bb.0:
579 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
580 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
581 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0]
582 ; CHECK-NOLSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
583 ; CHECK-NOLSE-O0-NEXT:    b LBB9_1
584 ; CHECK-NOLSE-O0-NEXT:  LBB9_1: ; %atomicrmw.start
585 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
586 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB9_2 Depth 2
587 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
588 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
589 ; CHECK-NOLSE-O0-NEXT:    orr x12, x8, #0x7
590 ; CHECK-NOLSE-O0-NEXT:  LBB9_2: ; %atomicrmw.start
591 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB9_1 Depth=1
592 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
593 ; CHECK-NOLSE-O0-NEXT:    ldaxr x9, [x11]
594 ; CHECK-NOLSE-O0-NEXT:    cmp x9, x8
595 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB9_4
596 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
597 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB9_2 Depth=2
598 ; CHECK-NOLSE-O0-NEXT:    stlxr w10, x12, [x11]
599 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB9_2
600 ; CHECK-NOLSE-O0-NEXT:  LBB9_4: ; %atomicrmw.start
601 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB9_1 Depth=1
602 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
603 ; CHECK-NOLSE-O0-NEXT:    subs x8, x9, x8
604 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
605 ; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
606 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB9_1
607 ; CHECK-NOLSE-O0-NEXT:    b LBB9_5
608 ; CHECK-NOLSE-O0-NEXT:  LBB9_5: ; %atomicrmw.end
609 ; CHECK-NOLSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
610 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
611 ; CHECK-NOLSE-O0-NEXT:    ret
613 ; CHECK-LSE-O1-LABEL: fetch_and_or_64:
614 ; CHECK-LSE-O1:       ; %bb.0:
615 ; CHECK-LSE-O1-NEXT:    mov w8, #7
616 ; CHECK-LSE-O1-NEXT:    ldset x8, x0, [x0]
617 ; CHECK-LSE-O1-NEXT:    ret
619 ; CHECK-LSE-O0-LABEL: fetch_and_or_64:
620 ; CHECK-LSE-O0:       ; %bb.0:
621 ; CHECK-LSE-O0-NEXT:    mov w8, #7
622 ; CHECK-LSE-O0-NEXT:    ; kill: def $x8 killed $w8
623 ; CHECK-LSE-O0-NEXT:    ldset x8, x0, [x0]
624 ; CHECK-LSE-O0-NEXT:    ret
625   %val = atomicrmw or i64* %p, i64 7 monotonic
626   ret i64 %val
629 define void @acquire_fence() #0 {
630 ; CHECK-NOLSE-LABEL: acquire_fence:
631 ; CHECK-NOLSE:       ; %bb.0:
632 ; CHECK-NOLSE-NEXT:    dmb ish
633 ; CHECK-NOLSE-NEXT:    ret
635 ; CHECK-LSE-O1-LABEL: acquire_fence:
636 ; CHECK-LSE-O1:       ; %bb.0:
637 ; CHECK-LSE-O1-NEXT:    dmb ish
638 ; CHECK-LSE-O1-NEXT:    ret
640 ; CHECK-LSE-O0-LABEL: acquire_fence:
641 ; CHECK-LSE-O0:       ; %bb.0:
642 ; CHECK-LSE-O0-NEXT:    dmb ish
643 ; CHECK-LSE-O0-NEXT:    ret
644    fence acquire
645    ret void
648 define void @release_fence() #0 {
649 ; CHECK-NOLSE-LABEL: release_fence:
650 ; CHECK-NOLSE:       ; %bb.0:
651 ; CHECK-NOLSE-NEXT:    dmb ish
652 ; CHECK-NOLSE-NEXT:    ret
654 ; CHECK-LSE-O1-LABEL: release_fence:
655 ; CHECK-LSE-O1:       ; %bb.0:
656 ; CHECK-LSE-O1-NEXT:    dmb ish
657 ; CHECK-LSE-O1-NEXT:    ret
659 ; CHECK-LSE-O0-LABEL: release_fence:
660 ; CHECK-LSE-O0:       ; %bb.0:
661 ; CHECK-LSE-O0-NEXT:    dmb ish
662 ; CHECK-LSE-O0-NEXT:    ret
663    fence release
664    ret void
667 define void @seq_cst_fence() #0 {
668 ; CHECK-NOLSE-LABEL: seq_cst_fence:
669 ; CHECK-NOLSE:       ; %bb.0:
670 ; CHECK-NOLSE-NEXT:    dmb ish
671 ; CHECK-NOLSE-NEXT:    ret
673 ; CHECK-LSE-O1-LABEL: seq_cst_fence:
674 ; CHECK-LSE-O1:       ; %bb.0:
675 ; CHECK-LSE-O1-NEXT:    dmb ish
676 ; CHECK-LSE-O1-NEXT:    ret
678 ; CHECK-LSE-O0-LABEL: seq_cst_fence:
679 ; CHECK-LSE-O0:       ; %bb.0:
680 ; CHECK-LSE-O0-NEXT:    dmb ish
681 ; CHECK-LSE-O0-NEXT:    ret
682    fence seq_cst
683    ret void
686 define i32 @atomic_load(i32* %p) #0 {
687 ; CHECK-NOLSE-LABEL: atomic_load:
688 ; CHECK-NOLSE:       ; %bb.0:
689 ; CHECK-NOLSE-NEXT:    ldar w0, [x0]
690 ; CHECK-NOLSE-NEXT:    ret
692 ; CHECK-LSE-O1-LABEL: atomic_load:
693 ; CHECK-LSE-O1:       ; %bb.0:
694 ; CHECK-LSE-O1-NEXT:    ldar w0, [x0]
695 ; CHECK-LSE-O1-NEXT:    ret
697 ; CHECK-LSE-O0-LABEL: atomic_load:
698 ; CHECK-LSE-O0:       ; %bb.0:
699 ; CHECK-LSE-O0-NEXT:    ldar w0, [x0]
700 ; CHECK-LSE-O0-NEXT:    ret
701    %r = load atomic i32, i32* %p seq_cst, align 4
702    ret i32 %r
705 define i8 @atomic_load_relaxed_8(i8* %p, i32 %off32) #0 {
706 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_8:
707 ; CHECK-NOLSE-O1:       ; %bb.0:
708 ; CHECK-NOLSE-O1-NEXT:    ldrb w8, [x0, #4095]
709 ; CHECK-NOLSE-O1-NEXT:    ldrb w9, [x0, w1, sxtw]
710 ; CHECK-NOLSE-O1-NEXT:    ldurb w10, [x0, #-256]
711 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
712 ; CHECK-NOLSE-O1-NEXT:    ldrb w11, [x11]
713 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w9
714 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w10
715 ; CHECK-NOLSE-O1-NEXT:    add w0, w8, w11
716 ; CHECK-NOLSE-O1-NEXT:    ret
718 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_8:
719 ; CHECK-NOLSE-O0:       ; %bb.0:
720 ; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x0, #4095]
721 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, w1, sxtw
722 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x8]
723 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxtb
724 ; CHECK-NOLSE-O0-NEXT:    subs x9, x0, #256
725 ; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x9]
726 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxtb
727 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
728 ; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x9]
729 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxtb
730 ; CHECK-NOLSE-O0-NEXT:    ret
732 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_8:
733 ; CHECK-LSE-O1:       ; %bb.0:
734 ; CHECK-LSE-O1-NEXT:    ldrb w8, [x0, #4095]
735 ; CHECK-LSE-O1-NEXT:    ldrb w9, [x0, w1, sxtw]
736 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
737 ; CHECK-LSE-O1-NEXT:    ldurb w9, [x0, #-256]
738 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
739 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
740 ; CHECK-LSE-O1-NEXT:    ldrb w9, [x9]
741 ; CHECK-LSE-O1-NEXT:    add w0, w8, w9
742 ; CHECK-LSE-O1-NEXT:    ret
744 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_8:
745 ; CHECK-LSE-O0:       ; %bb.0:
746 ; CHECK-LSE-O0-NEXT:    ldrb w9, [x0, #4095]
747 ; CHECK-LSE-O0-NEXT:    add x8, x0, w1, sxtw
748 ; CHECK-LSE-O0-NEXT:    ldrb w8, [x8]
749 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxtb
750 ; CHECK-LSE-O0-NEXT:    subs x9, x0, #256
751 ; CHECK-LSE-O0-NEXT:    ldrb w9, [x9]
752 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxtb
753 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
754 ; CHECK-LSE-O0-NEXT:    ldrb w9, [x9]
755 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxtb
756 ; CHECK-LSE-O0-NEXT:    ret
757   %ptr_unsigned = getelementptr i8, i8* %p, i32 4095
758   %val_unsigned = load atomic i8, i8* %ptr_unsigned monotonic, align 1
760   %ptr_regoff = getelementptr i8, i8* %p, i32 %off32
761   %val_regoff = load atomic i8, i8* %ptr_regoff unordered, align 1
762   %tot1 = add i8 %val_unsigned, %val_regoff
764   %ptr_unscaled = getelementptr i8, i8* %p, i32 -256
765   %val_unscaled = load atomic i8, i8* %ptr_unscaled monotonic, align 1
766   %tot2 = add i8 %tot1, %val_unscaled
768   %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm)
769   %val_random = load atomic i8, i8* %ptr_random unordered, align 1
770   %tot3 = add i8 %tot2, %val_random
772   ret i8 %tot3
775 define i16 @atomic_load_relaxed_16(i16* %p, i32 %off32) #0 {
776 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_16:
777 ; CHECK-NOLSE-O1:       ; %bb.0:
778 ; CHECK-NOLSE-O1-NEXT:    ldrh w8, [x0, #8190]
779 ; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x0, w1, sxtw #1]
780 ; CHECK-NOLSE-O1-NEXT:    ldurh w10, [x0, #-256]
781 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
782 ; CHECK-NOLSE-O1-NEXT:    ldrh w11, [x11]
783 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w9
784 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w10
785 ; CHECK-NOLSE-O1-NEXT:    add w0, w8, w11
786 ; CHECK-NOLSE-O1-NEXT:    ret
788 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_16:
789 ; CHECK-NOLSE-O0:       ; %bb.0:
790 ; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x0, #8190]
791 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, w1, sxtw #1
792 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x8]
793 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxth
794 ; CHECK-NOLSE-O0-NEXT:    subs x9, x0, #256
795 ; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x9]
796 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxth
797 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
798 ; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x9]
799 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxth
800 ; CHECK-NOLSE-O0-NEXT:    ret
802 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_16:
803 ; CHECK-LSE-O1:       ; %bb.0:
804 ; CHECK-LSE-O1-NEXT:    ldrh w8, [x0, #8190]
805 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x0, w1, sxtw #1]
806 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
807 ; CHECK-LSE-O1-NEXT:    ldurh w9, [x0, #-256]
808 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
809 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
810 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x9]
811 ; CHECK-LSE-O1-NEXT:    add w0, w8, w9
812 ; CHECK-LSE-O1-NEXT:    ret
814 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_16:
815 ; CHECK-LSE-O0:       ; %bb.0:
816 ; CHECK-LSE-O0-NEXT:    ldrh w9, [x0, #8190]
817 ; CHECK-LSE-O0-NEXT:    add x8, x0, w1, sxtw #1
818 ; CHECK-LSE-O0-NEXT:    ldrh w8, [x8]
819 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxth
820 ; CHECK-LSE-O0-NEXT:    subs x9, x0, #256
821 ; CHECK-LSE-O0-NEXT:    ldrh w9, [x9]
822 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxth
823 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
824 ; CHECK-LSE-O0-NEXT:    ldrh w9, [x9]
825 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxth
826 ; CHECK-LSE-O0-NEXT:    ret
827   %ptr_unsigned = getelementptr i16, i16* %p, i32 4095
828   %val_unsigned = load atomic i16, i16* %ptr_unsigned monotonic, align 2
830   %ptr_regoff = getelementptr i16, i16* %p, i32 %off32
831   %val_regoff = load atomic i16, i16* %ptr_regoff unordered, align 2
832   %tot1 = add i16 %val_unsigned, %val_regoff
834   %ptr_unscaled = getelementptr i16, i16* %p, i32 -128
835   %val_unscaled = load atomic i16, i16* %ptr_unscaled monotonic, align 2
836   %tot2 = add i16 %tot1, %val_unscaled
838   %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)
839   %val_random = load atomic i16, i16* %ptr_random unordered, align 2
840   %tot3 = add i16 %tot2, %val_random
842   ret i16 %tot3
845 define i32 @atomic_load_relaxed_32(i32* %p, i32 %off32) #0 {
846 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_32:
847 ; CHECK-NOLSE-O1:       ; %bb.0:
848 ; CHECK-NOLSE-O1-NEXT:    ldr w8, [x0, #16380]
849 ; CHECK-NOLSE-O1-NEXT:    ldr w9, [x0, w1, sxtw #2]
850 ; CHECK-NOLSE-O1-NEXT:    ldur w10, [x0, #-256]
851 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
852 ; CHECK-NOLSE-O1-NEXT:    ldr w11, [x11]
853 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w9
854 ; CHECK-NOLSE-O1-NEXT:    add w8, w8, w10
855 ; CHECK-NOLSE-O1-NEXT:    add w0, w8, w11
856 ; CHECK-NOLSE-O1-NEXT:    ret
858 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_32:
859 ; CHECK-NOLSE-O0:       ; %bb.0:
860 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0, #16380]
861 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [x0, w1, sxtw #2]
862 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9
863 ; CHECK-NOLSE-O0-NEXT:    ldur w9, [x0, #-256]
864 ; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9
865 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
866 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [x9]
867 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9
868 ; CHECK-NOLSE-O0-NEXT:    ret
870 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_32:
871 ; CHECK-LSE-O1:       ; %bb.0:
872 ; CHECK-LSE-O1-NEXT:    ldr w8, [x0, #16380]
873 ; CHECK-LSE-O1-NEXT:    ldr w9, [x0, w1, sxtw #2]
874 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
875 ; CHECK-LSE-O1-NEXT:    ldur w9, [x0, #-256]
876 ; CHECK-LSE-O1-NEXT:    add w8, w8, w9
877 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
878 ; CHECK-LSE-O1-NEXT:    ldr w9, [x9]
879 ; CHECK-LSE-O1-NEXT:    add w0, w8, w9
880 ; CHECK-LSE-O1-NEXT:    ret
882 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_32:
883 ; CHECK-LSE-O0:       ; %bb.0:
884 ; CHECK-LSE-O0-NEXT:    ldr w8, [x0, #16380]
885 ; CHECK-LSE-O0-NEXT:    ldr w9, [x0, w1, sxtw #2]
886 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9
887 ; CHECK-LSE-O0-NEXT:    ldur w9, [x0, #-256]
888 ; CHECK-LSE-O0-NEXT:    add w8, w8, w9
889 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
890 ; CHECK-LSE-O0-NEXT:    ldr w9, [x9]
891 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9
892 ; CHECK-LSE-O0-NEXT:    ret
893   %ptr_unsigned = getelementptr i32, i32* %p, i32 4095
894   %val_unsigned = load atomic i32, i32* %ptr_unsigned monotonic, align 4
896   %ptr_regoff = getelementptr i32, i32* %p, i32 %off32
897   %val_regoff = load atomic i32, i32* %ptr_regoff unordered, align 4
898   %tot1 = add i32 %val_unsigned, %val_regoff
900   %ptr_unscaled = getelementptr i32, i32* %p, i32 -64
901   %val_unscaled = load atomic i32, i32* %ptr_unscaled monotonic, align 4
902   %tot2 = add i32 %tot1, %val_unscaled
904   %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)
905   %val_random = load atomic i32, i32* %ptr_random unordered, align 4
906   %tot3 = add i32 %tot2, %val_random
908   ret i32 %tot3
911 define i64 @atomic_load_relaxed_64(i64* %p, i32 %off32) #0 {
912 ; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_64:
913 ; CHECK-NOLSE-O1:       ; %bb.0:
914 ; CHECK-NOLSE-O1-NEXT:    ldr x8, [x0, #32760]
915 ; CHECK-NOLSE-O1-NEXT:    ldr x9, [x0, w1, sxtw #3]
916 ; CHECK-NOLSE-O1-NEXT:    ldur x10, [x0, #-256]
917 ; CHECK-NOLSE-O1-NEXT:    add x11, x0, #291, lsl #12 ; =1191936
918 ; CHECK-NOLSE-O1-NEXT:    ldr x11, [x11]
919 ; CHECK-NOLSE-O1-NEXT:    add x8, x8, x9
920 ; CHECK-NOLSE-O1-NEXT:    add x8, x8, x10
921 ; CHECK-NOLSE-O1-NEXT:    add x0, x8, x11
922 ; CHECK-NOLSE-O1-NEXT:    ret
924 ; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_64:
925 ; CHECK-NOLSE-O0:       ; %bb.0:
926 ; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0, #32760]
927 ; CHECK-NOLSE-O0-NEXT:    ldr x9, [x0, w1, sxtw #3]
928 ; CHECK-NOLSE-O0-NEXT:    add x8, x8, x9
929 ; CHECK-NOLSE-O0-NEXT:    ldur x9, [x0, #-256]
930 ; CHECK-NOLSE-O0-NEXT:    add x8, x8, x9
931 ; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
932 ; CHECK-NOLSE-O0-NEXT:    ldr x9, [x9]
933 ; CHECK-NOLSE-O0-NEXT:    add x0, x8, x9
934 ; CHECK-NOLSE-O0-NEXT:    ret
936 ; CHECK-LSE-O1-LABEL: atomic_load_relaxed_64:
937 ; CHECK-LSE-O1:       ; %bb.0:
938 ; CHECK-LSE-O1-NEXT:    ldr x8, [x0, #32760]
939 ; CHECK-LSE-O1-NEXT:    ldr x9, [x0, w1, sxtw #3]
940 ; CHECK-LSE-O1-NEXT:    add x8, x8, x9
941 ; CHECK-LSE-O1-NEXT:    ldur x9, [x0, #-256]
942 ; CHECK-LSE-O1-NEXT:    add x8, x8, x9
943 ; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
944 ; CHECK-LSE-O1-NEXT:    ldr x9, [x9]
945 ; CHECK-LSE-O1-NEXT:    add x0, x8, x9
946 ; CHECK-LSE-O1-NEXT:    ret
948 ; CHECK-LSE-O0-LABEL: atomic_load_relaxed_64:
949 ; CHECK-LSE-O0:       ; %bb.0:
950 ; CHECK-LSE-O0-NEXT:    ldr x8, [x0, #32760]
951 ; CHECK-LSE-O0-NEXT:    ldr x9, [x0, w1, sxtw #3]
952 ; CHECK-LSE-O0-NEXT:    add x8, x8, x9
953 ; CHECK-LSE-O0-NEXT:    ldur x9, [x0, #-256]
954 ; CHECK-LSE-O0-NEXT:    add x8, x8, x9
955 ; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
956 ; CHECK-LSE-O0-NEXT:    ldr x9, [x9]
957 ; CHECK-LSE-O0-NEXT:    add x0, x8, x9
958 ; CHECK-LSE-O0-NEXT:    ret
959   %ptr_unsigned = getelementptr i64, i64* %p, i32 4095
960   %val_unsigned = load atomic i64, i64* %ptr_unsigned monotonic, align 8
962   %ptr_regoff = getelementptr i64, i64* %p, i32 %off32
963   %val_regoff = load atomic i64, i64* %ptr_regoff unordered, align 8
964   %tot1 = add i64 %val_unsigned, %val_regoff
966   %ptr_unscaled = getelementptr i64, i64* %p, i32 -32
967   %val_unscaled = load atomic i64, i64* %ptr_unscaled monotonic, align 8
968   %tot2 = add i64 %tot1, %val_unscaled
970   %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)
971   %val_random = load atomic i64, i64* %ptr_random unordered, align 8
972   %tot3 = add i64 %tot2, %val_random
974   ret i64 %tot3
978 define void @atomc_store(i32* %p) #0 {
979 ; CHECK-NOLSE-LABEL: atomc_store:
980 ; CHECK-NOLSE:       ; %bb.0:
981 ; CHECK-NOLSE-NEXT:    mov w8, #4
982 ; CHECK-NOLSE-NEXT:    stlr w8, [x0]
983 ; CHECK-NOLSE-NEXT:    ret
985 ; CHECK-LSE-O1-LABEL: atomc_store:
986 ; CHECK-LSE-O1:       ; %bb.0:
987 ; CHECK-LSE-O1-NEXT:    mov w8, #4
988 ; CHECK-LSE-O1-NEXT:    stlr w8, [x0]
989 ; CHECK-LSE-O1-NEXT:    ret
991 ; CHECK-LSE-O0-LABEL: atomc_store:
992 ; CHECK-LSE-O0:       ; %bb.0:
993 ; CHECK-LSE-O0-NEXT:    mov w8, #4
994 ; CHECK-LSE-O0-NEXT:    stlr w8, [x0]
995 ; CHECK-LSE-O0-NEXT:    ret
996    store atomic i32 4, i32* %p seq_cst, align 4
997    ret void
1000 define void @atomic_store_relaxed_8(i8* %p, i32 %off32, i8 %val) #0 {
1001 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_8:
1002 ; CHECK-NOLSE-O1:       ; %bb.0:
1003 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1004 ; CHECK-NOLSE-O1-NEXT:    strb w2, [x0, #4095]
1005 ; CHECK-NOLSE-O1-NEXT:    strb w2, [x0, w1, sxtw]
1006 ; CHECK-NOLSE-O1-NEXT:    sturb w2, [x0, #-256]
1007 ; CHECK-NOLSE-O1-NEXT:    strb w2, [x8]
1008 ; CHECK-NOLSE-O1-NEXT:    ret
1010 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_8:
1011 ; CHECK-NOLSE-O0:       ; %bb.0:
1012 ; CHECK-NOLSE-O0-NEXT:    strb w2, [x0, #4095]
1013 ; CHECK-NOLSE-O0-NEXT:    strb w2, [x0, w1, sxtw]
1014 ; CHECK-NOLSE-O0-NEXT:    sturb w2, [x0, #-256]
1015 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1016 ; CHECK-NOLSE-O0-NEXT:    strb w2, [x8]
1017 ; CHECK-NOLSE-O0-NEXT:    ret
1019 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_8:
1020 ; CHECK-LSE-O1:       ; %bb.0:
1021 ; CHECK-LSE-O1-NEXT:    strb w2, [x0, #4095]
1022 ; CHECK-LSE-O1-NEXT:    strb w2, [x0, w1, sxtw]
1023 ; CHECK-LSE-O1-NEXT:    sturb w2, [x0, #-256]
1024 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1025 ; CHECK-LSE-O1-NEXT:    strb w2, [x8]
1026 ; CHECK-LSE-O1-NEXT:    ret
1028 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_8:
1029 ; CHECK-LSE-O0:       ; %bb.0:
1030 ; CHECK-LSE-O0-NEXT:    strb w2, [x0, #4095]
1031 ; CHECK-LSE-O0-NEXT:    strb w2, [x0, w1, sxtw]
1032 ; CHECK-LSE-O0-NEXT:    sturb w2, [x0, #-256]
1033 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1034 ; CHECK-LSE-O0-NEXT:    strb w2, [x8]
1035 ; CHECK-LSE-O0-NEXT:    ret
1036   %ptr_unsigned = getelementptr i8, i8* %p, i32 4095
1037   store atomic i8 %val, i8* %ptr_unsigned monotonic, align 1
1039   %ptr_regoff = getelementptr i8, i8* %p, i32 %off32
1040   store atomic i8 %val, i8* %ptr_regoff unordered, align 1
1042   %ptr_unscaled = getelementptr i8, i8* %p, i32 -256
1043   store atomic i8 %val, i8* %ptr_unscaled monotonic, align 1
1045   %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm)
1046   store atomic i8 %val, i8* %ptr_random unordered, align 1
1048   ret void
1051 define void @atomic_store_relaxed_16(i16* %p, i32 %off32, i16 %val) #0 {
1052 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_16:
1053 ; CHECK-NOLSE-O1:       ; %bb.0:
1054 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1055 ; CHECK-NOLSE-O1-NEXT:    strh w2, [x0, #8190]
1056 ; CHECK-NOLSE-O1-NEXT:    strh w2, [x0, w1, sxtw #1]
1057 ; CHECK-NOLSE-O1-NEXT:    sturh w2, [x0, #-256]
1058 ; CHECK-NOLSE-O1-NEXT:    strh w2, [x8]
1059 ; CHECK-NOLSE-O1-NEXT:    ret
1061 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_16:
1062 ; CHECK-NOLSE-O0:       ; %bb.0:
1063 ; CHECK-NOLSE-O0-NEXT:    strh w2, [x0, #8190]
1064 ; CHECK-NOLSE-O0-NEXT:    strh w2, [x0, w1, sxtw #1]
1065 ; CHECK-NOLSE-O0-NEXT:    sturh w2, [x0, #-256]
1066 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1067 ; CHECK-NOLSE-O0-NEXT:    strh w2, [x8]
1068 ; CHECK-NOLSE-O0-NEXT:    ret
1070 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_16:
1071 ; CHECK-LSE-O1:       ; %bb.0:
1072 ; CHECK-LSE-O1-NEXT:    strh w2, [x0, #8190]
1073 ; CHECK-LSE-O1-NEXT:    strh w2, [x0, w1, sxtw #1]
1074 ; CHECK-LSE-O1-NEXT:    sturh w2, [x0, #-256]
1075 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1076 ; CHECK-LSE-O1-NEXT:    strh w2, [x8]
1077 ; CHECK-LSE-O1-NEXT:    ret
1079 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_16:
1080 ; CHECK-LSE-O0:       ; %bb.0:
1081 ; CHECK-LSE-O0-NEXT:    strh w2, [x0, #8190]
1082 ; CHECK-LSE-O0-NEXT:    strh w2, [x0, w1, sxtw #1]
1083 ; CHECK-LSE-O0-NEXT:    sturh w2, [x0, #-256]
1084 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1085 ; CHECK-LSE-O0-NEXT:    strh w2, [x8]
1086 ; CHECK-LSE-O0-NEXT:    ret
1087   %ptr_unsigned = getelementptr i16, i16* %p, i32 4095
1088   store atomic i16 %val, i16* %ptr_unsigned monotonic, align 2
1090   %ptr_regoff = getelementptr i16, i16* %p, i32 %off32
1091   store atomic i16 %val, i16* %ptr_regoff unordered, align 2
1093   %ptr_unscaled = getelementptr i16, i16* %p, i32 -128
1094   store atomic i16 %val, i16* %ptr_unscaled monotonic, align 2
1096   %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)
1097   store atomic i16 %val, i16* %ptr_random unordered, align 2
1099   ret void
1102 define void @atomic_store_relaxed_32(i32* %p, i32 %off32, i32 %val) #0 {
1103 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_32:
1104 ; CHECK-NOLSE-O1:       ; %bb.0:
1105 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1106 ; CHECK-NOLSE-O1-NEXT:    str w2, [x0, #16380]
1107 ; CHECK-NOLSE-O1-NEXT:    str w2, [x0, w1, sxtw #2]
1108 ; CHECK-NOLSE-O1-NEXT:    stur w2, [x0, #-256]
1109 ; CHECK-NOLSE-O1-NEXT:    str w2, [x8]
1110 ; CHECK-NOLSE-O1-NEXT:    ret
1112 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_32:
1113 ; CHECK-NOLSE-O0:       ; %bb.0:
1114 ; CHECK-NOLSE-O0-NEXT:    str w2, [x0, #16380]
1115 ; CHECK-NOLSE-O0-NEXT:    str w2, [x0, w1, sxtw #2]
1116 ; CHECK-NOLSE-O0-NEXT:    stur w2, [x0, #-256]
1117 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1118 ; CHECK-NOLSE-O0-NEXT:    str w2, [x8]
1119 ; CHECK-NOLSE-O0-NEXT:    ret
1121 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_32:
1122 ; CHECK-LSE-O1:       ; %bb.0:
1123 ; CHECK-LSE-O1-NEXT:    str w2, [x0, #16380]
1124 ; CHECK-LSE-O1-NEXT:    str w2, [x0, w1, sxtw #2]
1125 ; CHECK-LSE-O1-NEXT:    stur w2, [x0, #-256]
1126 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1127 ; CHECK-LSE-O1-NEXT:    str w2, [x8]
1128 ; CHECK-LSE-O1-NEXT:    ret
1130 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_32:
1131 ; CHECK-LSE-O0:       ; %bb.0:
1132 ; CHECK-LSE-O0-NEXT:    str w2, [x0, #16380]
1133 ; CHECK-LSE-O0-NEXT:    str w2, [x0, w1, sxtw #2]
1134 ; CHECK-LSE-O0-NEXT:    stur w2, [x0, #-256]
1135 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1136 ; CHECK-LSE-O0-NEXT:    str w2, [x8]
1137 ; CHECK-LSE-O0-NEXT:    ret
1138   %ptr_unsigned = getelementptr i32, i32* %p, i32 4095
1139   store atomic i32 %val, i32* %ptr_unsigned monotonic, align 4
1141   %ptr_regoff = getelementptr i32, i32* %p, i32 %off32
1142   store atomic i32 %val, i32* %ptr_regoff unordered, align 4
1144   %ptr_unscaled = getelementptr i32, i32* %p, i32 -64
1145   store atomic i32 %val, i32* %ptr_unscaled monotonic, align 4
1147   %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)
1148   store atomic i32 %val, i32* %ptr_random unordered, align 4
1150   ret void
1153 define void @atomic_store_relaxed_64(i64* %p, i32 %off32, i64 %val) #0 {
1154 ; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_64:
1155 ; CHECK-NOLSE-O1:       ; %bb.0:
1156 ; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1157 ; CHECK-NOLSE-O1-NEXT:    str x2, [x0, #32760]
1158 ; CHECK-NOLSE-O1-NEXT:    str x2, [x0, w1, sxtw #3]
1159 ; CHECK-NOLSE-O1-NEXT:    stur x2, [x0, #-256]
1160 ; CHECK-NOLSE-O1-NEXT:    str x2, [x8]
1161 ; CHECK-NOLSE-O1-NEXT:    ret
1163 ; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_64:
1164 ; CHECK-NOLSE-O0:       ; %bb.0:
1165 ; CHECK-NOLSE-O0-NEXT:    str x2, [x0, #32760]
1166 ; CHECK-NOLSE-O0-NEXT:    str x2, [x0, w1, sxtw #3]
1167 ; CHECK-NOLSE-O0-NEXT:    stur x2, [x0, #-256]
1168 ; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1169 ; CHECK-NOLSE-O0-NEXT:    str x2, [x8]
1170 ; CHECK-NOLSE-O0-NEXT:    ret
1172 ; CHECK-LSE-O1-LABEL: atomic_store_relaxed_64:
1173 ; CHECK-LSE-O1:       ; %bb.0:
1174 ; CHECK-LSE-O1-NEXT:    str x2, [x0, #32760]
1175 ; CHECK-LSE-O1-NEXT:    str x2, [x0, w1, sxtw #3]
1176 ; CHECK-LSE-O1-NEXT:    stur x2, [x0, #-256]
1177 ; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1178 ; CHECK-LSE-O1-NEXT:    str x2, [x8]
1179 ; CHECK-LSE-O1-NEXT:    ret
1181 ; CHECK-LSE-O0-LABEL: atomic_store_relaxed_64:
1182 ; CHECK-LSE-O0:       ; %bb.0:
1183 ; CHECK-LSE-O0-NEXT:    str x2, [x0, #32760]
1184 ; CHECK-LSE-O0-NEXT:    str x2, [x0, w1, sxtw #3]
1185 ; CHECK-LSE-O0-NEXT:    stur x2, [x0, #-256]
1186 ; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1187 ; CHECK-LSE-O0-NEXT:    str x2, [x8]
1188 ; CHECK-LSE-O0-NEXT:    ret
1189   %ptr_unsigned = getelementptr i64, i64* %p, i32 4095
1190   store atomic i64 %val, i64* %ptr_unsigned monotonic, align 8
1192   %ptr_regoff = getelementptr i64, i64* %p, i32 %off32
1193   store atomic i64 %val, i64* %ptr_regoff unordered, align 8
1195   %ptr_unscaled = getelementptr i64, i64* %p, i32 -32
1196   store atomic i64 %val, i64* %ptr_unscaled monotonic, align 8
1198   %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)
1199   store atomic i64 %val, i64* %ptr_random unordered, align 8
1201   ret void
1204 define i32 @load_zext(i8* %p8, i16* %p16) {
1205 ; CHECK-NOLSE-O1-LABEL: load_zext:
1206 ; CHECK-NOLSE-O1:       ; %bb.0:
1207 ; CHECK-NOLSE-O1-NEXT:    ldarb w8, [x0]
1208 ; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x1]
1209 ; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8, uxtb
1210 ; CHECK-NOLSE-O1-NEXT:    ret
1212 ; CHECK-NOLSE-O0-LABEL: load_zext:
1213 ; CHECK-NOLSE-O0:       ; %bb.0:
1214 ; CHECK-NOLSE-O0-NEXT:    ldarb w9, [x0]
1215 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x1]
1216 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxtb
1217 ; CHECK-NOLSE-O0-NEXT:    ret
1219 ; CHECK-LSE-O1-LABEL: load_zext:
1220 ; CHECK-LSE-O1:       ; %bb.0:
1221 ; CHECK-LSE-O1-NEXT:    ldarb w8, [x0]
1222 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x1]
1223 ; CHECK-LSE-O1-NEXT:    add w0, w9, w8, uxtb
1224 ; CHECK-LSE-O1-NEXT:    ret
1226 ; CHECK-LSE-O0-LABEL: load_zext:
1227 ; CHECK-LSE-O0:       ; %bb.0:
1228 ; CHECK-LSE-O0-NEXT:    ldarb w9, [x0]
1229 ; CHECK-LSE-O0-NEXT:    ldrh w8, [x1]
1230 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxtb
1231 ; CHECK-LSE-O0-NEXT:    ret
1232   %val1.8 = load atomic i8, i8* %p8 acquire, align 1
1233   %val1 = zext i8 %val1.8 to i32
1235   %val2.16 = load atomic i16, i16* %p16 unordered, align 2
1236   %val2 = zext i16 %val2.16 to i32
1238   %res = add i32 %val1, %val2
1239   ret i32 %res
1242 define { i32, i64 } @load_acq(i32* %p32, i64* %p64) {
1243 ; CHECK-NOLSE-LABEL: load_acq:
1244 ; CHECK-NOLSE:       ; %bb.0:
1245 ; CHECK-NOLSE-NEXT:    ldar w0, [x0]
1246 ; CHECK-NOLSE-NEXT:    ldar x1, [x1]
1247 ; CHECK-NOLSE-NEXT:    ret
1249 ; CHECK-LSE-O1-LABEL: load_acq:
1250 ; CHECK-LSE-O1:       ; %bb.0:
1251 ; CHECK-LSE-O1-NEXT:    ldar w0, [x0]
1252 ; CHECK-LSE-O1-NEXT:    ldar x1, [x1]
1253 ; CHECK-LSE-O1-NEXT:    ret
1255 ; CHECK-LSE-O0-LABEL: load_acq:
1256 ; CHECK-LSE-O0:       ; %bb.0:
1257 ; CHECK-LSE-O0-NEXT:    ldar w0, [x0]
1258 ; CHECK-LSE-O0-NEXT:    ldar x1, [x1]
1259 ; CHECK-LSE-O0-NEXT:    ret
1260   %val32 = load atomic i32, i32* %p32 seq_cst, align 4
1261   %tmp = insertvalue { i32, i64 } undef, i32 %val32, 0
1263   %val64 = load atomic i64, i64* %p64 acquire, align 8
1264   %res = insertvalue { i32, i64 } %tmp, i64 %val64, 1
1266   ret { i32, i64 } %res
1269 define i32 @load_sext(i8* %p8, i16* %p16) {
1270 ; CHECK-NOLSE-O1-LABEL: load_sext:
1271 ; CHECK-NOLSE-O1:       ; %bb.0:
1272 ; CHECK-NOLSE-O1-NEXT:    ldarb w8, [x0]
1273 ; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x1]
1274 ; CHECK-NOLSE-O1-NEXT:    sxth w9, w9
1275 ; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8, sxtb
1276 ; CHECK-NOLSE-O1-NEXT:    ret
1278 ; CHECK-NOLSE-O0-LABEL: load_sext:
1279 ; CHECK-NOLSE-O0:       ; %bb.0:
1280 ; CHECK-NOLSE-O0-NEXT:    ldarb w9, [x0]
1281 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x1]
1282 ; CHECK-NOLSE-O0-NEXT:    sxth w8, w8
1283 ; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, sxtb
1284 ; CHECK-NOLSE-O0-NEXT:    ret
1286 ; CHECK-LSE-O1-LABEL: load_sext:
1287 ; CHECK-LSE-O1:       ; %bb.0:
1288 ; CHECK-LSE-O1-NEXT:    ldarb w8, [x0]
1289 ; CHECK-LSE-O1-NEXT:    ldrh w9, [x1]
1290 ; CHECK-LSE-O1-NEXT:    sxth w9, w9
1291 ; CHECK-LSE-O1-NEXT:    add w0, w9, w8, sxtb
1292 ; CHECK-LSE-O1-NEXT:    ret
1294 ; CHECK-LSE-O0-LABEL: load_sext:
1295 ; CHECK-LSE-O0:       ; %bb.0:
1296 ; CHECK-LSE-O0-NEXT:    ldarb w9, [x0]
1297 ; CHECK-LSE-O0-NEXT:    ldrh w8, [x1]
1298 ; CHECK-LSE-O0-NEXT:    sxth w8, w8
1299 ; CHECK-LSE-O0-NEXT:    add w0, w8, w9, sxtb
1300 ; CHECK-LSE-O0-NEXT:    ret
1301   %val1.8 = load atomic i8, i8* %p8 acquire, align 1
1302   %val1 = sext i8 %val1.8 to i32
1304   %val2.16 = load atomic i16, i16* %p16 unordered, align 2
1305   %val2 = sext i16 %val2.16 to i32
1307   %res = add i32 %val1, %val2
1308   ret i32 %res
1311 define void @store_trunc(i32 %val, i8* %p8, i16* %p16) {
1312 ; CHECK-NOLSE-LABEL: store_trunc:
1313 ; CHECK-NOLSE:       ; %bb.0:
1314 ; CHECK-NOLSE-NEXT:    stlrb w0, [x1]
1315 ; CHECK-NOLSE-NEXT:    strh w0, [x2]
1316 ; CHECK-NOLSE-NEXT:    ret
1318 ; CHECK-LSE-O1-LABEL: store_trunc:
1319 ; CHECK-LSE-O1:       ; %bb.0:
1320 ; CHECK-LSE-O1-NEXT:    stlrb w0, [x1]
1321 ; CHECK-LSE-O1-NEXT:    strh w0, [x2]
1322 ; CHECK-LSE-O1-NEXT:    ret
1324 ; CHECK-LSE-O0-LABEL: store_trunc:
1325 ; CHECK-LSE-O0:       ; %bb.0:
1326 ; CHECK-LSE-O0-NEXT:    stlrb w0, [x1]
1327 ; CHECK-LSE-O0-NEXT:    strh w0, [x2]
1328 ; CHECK-LSE-O0-NEXT:    ret
1329   %val8 = trunc i32 %val to i8
1330   store atomic i8 %val8, i8* %p8 seq_cst, align 1
1332   %val16 = trunc i32 %val to i16
1333   store atomic i16 %val16, i16* %p16 monotonic, align 2
1335   ret void
1338 define i8 @atomicrmw_add_i8(i8* %ptr, i8 %rhs) {
1339 ; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i8:
1340 ; CHECK-NOLSE-O1:       ; %bb.0:
1341 ; CHECK-NOLSE-O1-NEXT:  LBB27_1: ; %atomicrmw.start
1342 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1343 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1344 ; CHECK-NOLSE-O1-NEXT:    add w9, w8, w1
1345 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1346 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB27_1
1347 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1348 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1349 ; CHECK-NOLSE-O1-NEXT:    ret
1351 ; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i8:
1352 ; CHECK-NOLSE-O0:       ; %bb.0:
1353 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1354 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1355 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1356 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1357 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1358 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1359 ; CHECK-NOLSE-O0-NEXT:    b LBB27_1
1360 ; CHECK-NOLSE-O0-NEXT:  LBB27_1: ; %atomicrmw.start
1361 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1362 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB27_2 Depth 2
1363 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1364 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1365 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1366 ; CHECK-NOLSE-O0-NEXT:    add w12, w8, w10, uxth
1367 ; CHECK-NOLSE-O0-NEXT:  LBB27_2: ; %atomicrmw.start
1368 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB27_1 Depth=1
1369 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1370 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1371 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1372 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB27_4
1373 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1374 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB27_2 Depth=2
1375 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1376 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB27_2
1377 ; CHECK-NOLSE-O0-NEXT:  LBB27_4: ; %atomicrmw.start
1378 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB27_1 Depth=1
1379 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1380 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1381 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1382 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1383 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1384 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB27_1
1385 ; CHECK-NOLSE-O0-NEXT:    b LBB27_5
1386 ; CHECK-NOLSE-O0-NEXT:  LBB27_5: ; %atomicrmw.end
1387 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1388 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1389 ; CHECK-NOLSE-O0-NEXT:    ret
1391 ; CHECK-LSE-O1-LABEL: atomicrmw_add_i8:
1392 ; CHECK-LSE-O1:       ; %bb.0:
1393 ; CHECK-LSE-O1-NEXT:    ldaddalb w1, w0, [x0]
1394 ; CHECK-LSE-O1-NEXT:    ret
1396 ; CHECK-LSE-O0-LABEL: atomicrmw_add_i8:
1397 ; CHECK-LSE-O0:       ; %bb.0:
1398 ; CHECK-LSE-O0-NEXT:    ldaddalb w1, w0, [x0]
1399 ; CHECK-LSE-O0-NEXT:    ret
1400   %res = atomicrmw add i8* %ptr, i8 %rhs seq_cst
1401   ret i8 %res
1404 define i8 @atomicrmw_xchg_i8(i8* %ptr, i8 %rhs) {
1405 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i8:
1406 ; CHECK-NOLSE-O1:       ; %bb.0:
1407 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
1408 ; CHECK-NOLSE-O1-NEXT:  LBB28_1: ; %atomicrmw.start
1409 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1410 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1411 ; CHECK-NOLSE-O1-NEXT:    stxrb w9, w1, [x0]
1412 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB28_1
1413 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1414 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1415 ; CHECK-NOLSE-O1-NEXT:    ret
1417 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i8:
1418 ; CHECK-NOLSE-O0:       ; %bb.0:
1419 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1420 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1421 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1422 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1423 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1424 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1425 ; CHECK-NOLSE-O0-NEXT:    b LBB28_1
1426 ; CHECK-NOLSE-O0-NEXT:  LBB28_1: ; %atomicrmw.start
1427 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1428 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB28_2 Depth 2
1429 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1430 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1431 ; CHECK-NOLSE-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
1432 ; CHECK-NOLSE-O0-NEXT:  LBB28_2: ; %atomicrmw.start
1433 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB28_1 Depth=1
1434 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1435 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1436 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1437 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB28_4
1438 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1439 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB28_2 Depth=2
1440 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1441 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB28_2
1442 ; CHECK-NOLSE-O0-NEXT:  LBB28_4: ; %atomicrmw.start
1443 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB28_1 Depth=1
1444 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1445 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1446 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1447 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1448 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1449 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB28_1
1450 ; CHECK-NOLSE-O0-NEXT:    b LBB28_5
1451 ; CHECK-NOLSE-O0-NEXT:  LBB28_5: ; %atomicrmw.end
1452 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1453 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1454 ; CHECK-NOLSE-O0-NEXT:    ret
1456 ; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i8:
1457 ; CHECK-LSE-O1:       ; %bb.0:
1458 ; CHECK-LSE-O1-NEXT:    swpb w1, w0, [x0]
1459 ; CHECK-LSE-O1-NEXT:    ret
1461 ; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i8:
1462 ; CHECK-LSE-O0:       ; %bb.0:
1463 ; CHECK-LSE-O0-NEXT:    swpb w1, w0, [x0]
1464 ; CHECK-LSE-O0-NEXT:    ret
1465   %res = atomicrmw xchg i8* %ptr, i8 %rhs monotonic
1466   ret i8 %res
1469 define i8 @atomicrmw_sub_i8(i8* %ptr, i8 %rhs) {
1470 ; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i8:
1471 ; CHECK-NOLSE-O1:       ; %bb.0:
1472 ; CHECK-NOLSE-O1-NEXT:  LBB29_1: ; %atomicrmw.start
1473 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1474 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1475 ; CHECK-NOLSE-O1-NEXT:    sub w9, w8, w1
1476 ; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
1477 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB29_1
1478 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1479 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1480 ; CHECK-NOLSE-O1-NEXT:    ret
1482 ; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i8:
1483 ; CHECK-NOLSE-O0:       ; %bb.0:
1484 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1485 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1486 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1487 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1488 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1489 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1490 ; CHECK-NOLSE-O0-NEXT:    b LBB29_1
1491 ; CHECK-NOLSE-O0-NEXT:  LBB29_1: ; %atomicrmw.start
1492 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1493 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB29_2 Depth 2
1494 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1495 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1496 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1497 ; CHECK-NOLSE-O0-NEXT:    subs w12, w10, w8
1498 ; CHECK-NOLSE-O0-NEXT:  LBB29_2: ; %atomicrmw.start
1499 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB29_1 Depth=1
1500 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1501 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1502 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1503 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB29_4
1504 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1505 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB29_2 Depth=2
1506 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1507 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB29_2
1508 ; CHECK-NOLSE-O0-NEXT:  LBB29_4: ; %atomicrmw.start
1509 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB29_1 Depth=1
1510 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1511 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1512 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1513 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1514 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1515 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB29_1
1516 ; CHECK-NOLSE-O0-NEXT:    b LBB29_5
1517 ; CHECK-NOLSE-O0-NEXT:  LBB29_5: ; %atomicrmw.end
1518 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1519 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1520 ; CHECK-NOLSE-O0-NEXT:    ret
1522 ; CHECK-LSE-O1-LABEL: atomicrmw_sub_i8:
1523 ; CHECK-LSE-O1:       ; %bb.0:
1524 ; CHECK-LSE-O1-NEXT:    neg w8, w1
1525 ; CHECK-LSE-O1-NEXT:    ldaddab w8, w0, [x0]
1526 ; CHECK-LSE-O1-NEXT:    ret
1528 ; CHECK-LSE-O0-LABEL: atomicrmw_sub_i8:
1529 ; CHECK-LSE-O0:       ; %bb.0:
1530 ; CHECK-LSE-O0-NEXT:    neg w8, w1
1531 ; CHECK-LSE-O0-NEXT:    ldaddab w8, w0, [x0]
1532 ; CHECK-LSE-O0-NEXT:    ret
1533   %res = atomicrmw sub i8* %ptr, i8 %rhs acquire
1534   ret i8 %res
1537 define i8 @atomicrmw_and_i8(i8* %ptr, i8 %rhs) {
1538 ; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i8:
1539 ; CHECK-NOLSE-O1:       ; %bb.0:
1540 ; CHECK-NOLSE-O1-NEXT:  LBB30_1: ; %atomicrmw.start
1541 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1542 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1543 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, w1
1544 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1545 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB30_1
1546 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1547 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1548 ; CHECK-NOLSE-O1-NEXT:    ret
1550 ; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i8:
1551 ; CHECK-NOLSE-O0:       ; %bb.0:
1552 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1553 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1554 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1555 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1556 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1557 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1558 ; CHECK-NOLSE-O0-NEXT:    b LBB30_1
1559 ; CHECK-NOLSE-O0-NEXT:  LBB30_1: ; %atomicrmw.start
1560 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1561 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB30_2 Depth 2
1562 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1563 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1564 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1565 ; CHECK-NOLSE-O0-NEXT:    and w12, w10, w8
1566 ; CHECK-NOLSE-O0-NEXT:  LBB30_2: ; %atomicrmw.start
1567 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB30_1 Depth=1
1568 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1569 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1570 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1571 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB30_4
1572 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1573 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB30_2 Depth=2
1574 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1575 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB30_2
1576 ; CHECK-NOLSE-O0-NEXT:  LBB30_4: ; %atomicrmw.start
1577 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB30_1 Depth=1
1578 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1579 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1580 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1581 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1582 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1583 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB30_1
1584 ; CHECK-NOLSE-O0-NEXT:    b LBB30_5
1585 ; CHECK-NOLSE-O0-NEXT:  LBB30_5: ; %atomicrmw.end
1586 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1587 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1588 ; CHECK-NOLSE-O0-NEXT:    ret
1590 ; CHECK-LSE-O1-LABEL: atomicrmw_and_i8:
1591 ; CHECK-LSE-O1:       ; %bb.0:
1592 ; CHECK-LSE-O1-NEXT:    mvn w8, w1
1593 ; CHECK-LSE-O1-NEXT:    ldclrlb w8, w0, [x0]
1594 ; CHECK-LSE-O1-NEXT:    ret
1596 ; CHECK-LSE-O0-LABEL: atomicrmw_and_i8:
1597 ; CHECK-LSE-O0:       ; %bb.0:
1598 ; CHECK-LSE-O0-NEXT:    mvn w8, w1
1599 ; CHECK-LSE-O0-NEXT:    ldclrlb w8, w0, [x0]
1600 ; CHECK-LSE-O0-NEXT:    ret
1601   %res = atomicrmw and i8* %ptr, i8 %rhs release
1602   ret i8 %res
1605 define i8 @atomicrmw_or_i8(i8* %ptr, i8 %rhs) {
1606 ; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i8:
1607 ; CHECK-NOLSE-O1:       ; %bb.0:
1608 ; CHECK-NOLSE-O1-NEXT:  LBB31_1: ; %atomicrmw.start
1609 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1610 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1611 ; CHECK-NOLSE-O1-NEXT:    orr w9, w8, w1
1612 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1613 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB31_1
1614 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1615 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1616 ; CHECK-NOLSE-O1-NEXT:    ret
1618 ; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i8:
1619 ; CHECK-NOLSE-O0:       ; %bb.0:
1620 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1621 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1622 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1623 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1624 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1625 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1626 ; CHECK-NOLSE-O0-NEXT:    b LBB31_1
1627 ; CHECK-NOLSE-O0-NEXT:  LBB31_1: ; %atomicrmw.start
1628 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1629 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB31_2 Depth 2
1630 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1631 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1632 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1633 ; CHECK-NOLSE-O0-NEXT:    orr w12, w10, w8
1634 ; CHECK-NOLSE-O0-NEXT:  LBB31_2: ; %atomicrmw.start
1635 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB31_1 Depth=1
1636 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1637 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1638 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1639 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB31_4
1640 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1641 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB31_2 Depth=2
1642 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1643 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB31_2
1644 ; CHECK-NOLSE-O0-NEXT:  LBB31_4: ; %atomicrmw.start
1645 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB31_1 Depth=1
1646 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1647 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1648 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1649 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1650 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1651 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB31_1
1652 ; CHECK-NOLSE-O0-NEXT:    b LBB31_5 
1653 ; CHECK-NOLSE-O0-NEXT:  LBB31_5: ; %atomicrmw.end
1654 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1655 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1656 ; CHECK-NOLSE-O0-NEXT:    ret
1658 ; CHECK-LSE-O1-LABEL: atomicrmw_or_i8:
1659 ; CHECK-LSE-O1:       ; %bb.0:
1660 ; CHECK-LSE-O1-NEXT:    ldsetalb w1, w0, [x0]
1661 ; CHECK-LSE-O1-NEXT:    ret
1663 ; CHECK-LSE-O0-LABEL: atomicrmw_or_i8:
1664 ; CHECK-LSE-O0:       ; %bb.0:
1665 ; CHECK-LSE-O0-NEXT:    ldsetalb w1, w0, [x0]
1666 ; CHECK-LSE-O0-NEXT:    ret
1667   %res = atomicrmw or i8* %ptr, i8 %rhs seq_cst
1668   ret i8 %res
1671 define i8 @atomicrmw_xor_i8(i8* %ptr, i8 %rhs) {
1672 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i8:
1673 ; CHECK-NOLSE-O1:       ; %bb.0:
1674 ; CHECK-NOLSE-O1-NEXT:  LBB32_1: ; %atomicrmw.start
1675 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1676 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1677 ; CHECK-NOLSE-O1-NEXT:    eor w9, w8, w1
1678 ; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
1679 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB32_1
1680 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1681 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1682 ; CHECK-NOLSE-O1-NEXT:    ret
1684 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i8:
1685 ; CHECK-NOLSE-O0:       ; %bb.0:
1686 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1687 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1688 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1689 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1690 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1691 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1692 ; CHECK-NOLSE-O0-NEXT:    b LBB32_1
1693 ; CHECK-NOLSE-O0-NEXT:  LBB32_1: ; %atomicrmw.start
1694 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1695 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB32_2 Depth 2
1696 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1697 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1698 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1699 ; CHECK-NOLSE-O0-NEXT:    eor w12, w10, w8
1700 ; CHECK-NOLSE-O0-NEXT:  LBB32_2: ; %atomicrmw.start
1701 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB32_1 Depth=1
1702 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1703 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1704 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1705 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB32_4
1706 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1707 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB32_2 Depth=2
1708 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1709 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB32_2
1710 ; CHECK-NOLSE-O0-NEXT:  LBB32_4: ; %atomicrmw.start
1711 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB32_1 Depth=1
1712 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1713 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1714 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1715 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1716 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1717 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB32_1
1718 ; CHECK-NOLSE-O0-NEXT:    b LBB32_5
1719 ; CHECK-NOLSE-O0-NEXT:  LBB32_5: ; %atomicrmw.end
1720 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1721 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1722 ; CHECK-NOLSE-O0-NEXT:    ret
1724 ; CHECK-LSE-O1-LABEL: atomicrmw_xor_i8:
1725 ; CHECK-LSE-O1:       ; %bb.0:
1726 ; CHECK-LSE-O1-NEXT:    ldeorb w1, w0, [x0]
1727 ; CHECK-LSE-O1-NEXT:    ret
1729 ; CHECK-LSE-O0-LABEL: atomicrmw_xor_i8:
1730 ; CHECK-LSE-O0:       ; %bb.0:
1731 ; CHECK-LSE-O0-NEXT:    ldeorb w1, w0, [x0]
1732 ; CHECK-LSE-O0-NEXT:    ret
1733   %res = atomicrmw xor i8* %ptr, i8 %rhs monotonic
1734   ret i8 %res
1737 define i8 @atomicrmw_min_i8(i8* %ptr, i8 %rhs) {
1738 ; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i8:
1739 ; CHECK-NOLSE-O1:       ; %bb.0:
1740 ; CHECK-NOLSE-O1-NEXT:  LBB33_1: ; %atomicrmw.start
1741 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1742 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1743 ; CHECK-NOLSE-O1-NEXT:    sxtb w9, w8
1744 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxtb
1745 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, le
1746 ; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
1747 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB33_1
1748 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1749 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1750 ; CHECK-NOLSE-O1-NEXT:    ret
1752 ; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i8:
1753 ; CHECK-NOLSE-O0:       ; %bb.0:
1754 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1755 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1756 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1757 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1758 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1759 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1760 ; CHECK-NOLSE-O0-NEXT:    b LBB33_1
1761 ; CHECK-NOLSE-O0-NEXT:  LBB33_1: ; %atomicrmw.start
1762 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1763 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB33_2 Depth 2
1764 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1765 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1766 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1767 ; CHECK-NOLSE-O0-NEXT:    sxtb w9, w10
1768 ; CHECK-NOLSE-O0-NEXT:    mov w12, w8
1769 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w12, sxtb
1770 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, le
1771 ; CHECK-NOLSE-O0-NEXT:  LBB33_2: ; %atomicrmw.start
1772 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB33_1 Depth=1
1773 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1774 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1775 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1776 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB33_4
1777 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1778 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB33_2 Depth=2
1779 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1780 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB33_2
1781 ; CHECK-NOLSE-O0-NEXT:  LBB33_4: ; %atomicrmw.start
1782 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB33_1 Depth=1
1783 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1784 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1785 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1786 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1787 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1788 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB33_1
1789 ; CHECK-NOLSE-O0-NEXT:    b LBB33_5
1790 ; CHECK-NOLSE-O0-NEXT:  LBB33_5: ; %atomicrmw.end
1791 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1792 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1793 ; CHECK-NOLSE-O0-NEXT:    ret
1795 ; CHECK-LSE-O1-LABEL: atomicrmw_min_i8:
1796 ; CHECK-LSE-O1:       ; %bb.0:
1797 ; CHECK-LSE-O1-NEXT:    ldsminab w1, w0, [x0]
1798 ; CHECK-LSE-O1-NEXT:    ret
1800 ; CHECK-LSE-O0-LABEL: atomicrmw_min_i8:
1801 ; CHECK-LSE-O0:       ; %bb.0:
1802 ; CHECK-LSE-O0-NEXT:    ldsminab w1, w0, [x0]
1803 ; CHECK-LSE-O0-NEXT:    ret
1804   %res = atomicrmw min i8* %ptr, i8 %rhs acquire
1805   ret i8 %res
1808 define i8 @atomicrmw_max_i8(i8* %ptr, i8 %rhs) {
1809 ; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i8:
1810 ; CHECK-NOLSE-O1:       ; %bb.0:
1811 ; CHECK-NOLSE-O1-NEXT:  LBB34_1: ; %atomicrmw.start
1812 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1813 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1814 ; CHECK-NOLSE-O1-NEXT:    sxtb w9, w8
1815 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxtb
1816 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, gt
1817 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1818 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB34_1
1819 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1820 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1821 ; CHECK-NOLSE-O1-NEXT:    ret
1823 ; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i8:
1824 ; CHECK-NOLSE-O0:       ; %bb.0:
1825 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1826 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1827 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1828 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1829 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1830 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1831 ; CHECK-NOLSE-O0-NEXT:    b LBB34_1
1832 ; CHECK-NOLSE-O0-NEXT:  LBB34_1: ; %atomicrmw.start
1833 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1834 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB34_2 Depth 2
1835 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1836 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1837 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1838 ; CHECK-NOLSE-O0-NEXT:    sxtb w9, w10
1839 ; CHECK-NOLSE-O0-NEXT:    mov w12, w8
1840 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w12, sxtb
1841 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, gt
1842 ; CHECK-NOLSE-O0-NEXT:  LBB34_2: ; %atomicrmw.start
1843 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB34_1 Depth=1
1844 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1845 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1846 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1847 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB34_4
1848 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1849 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB34_2 Depth=2
1850 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1851 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB34_2
1852 ; CHECK-NOLSE-O0-NEXT:  LBB34_4: ; %atomicrmw.start
1853 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB34_1 Depth=1
1854 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1855 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1856 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1857 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1858 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1859 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB34_1
1860 ; CHECK-NOLSE-O0-NEXT:    b LBB34_5
1861 ; CHECK-NOLSE-O0-NEXT:  LBB34_5: ; %atomicrmw.end
1862 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1863 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1864 ; CHECK-NOLSE-O0-NEXT:    ret
1866 ; CHECK-LSE-O1-LABEL: atomicrmw_max_i8:
1867 ; CHECK-LSE-O1:       ; %bb.0:
1868 ; CHECK-LSE-O1-NEXT:    ldsmaxlb w1, w0, [x0]
1869 ; CHECK-LSE-O1-NEXT:    ret
1871 ; CHECK-LSE-O0-LABEL: atomicrmw_max_i8:
1872 ; CHECK-LSE-O0:       ; %bb.0:
1873 ; CHECK-LSE-O0-NEXT:    ldsmaxlb w1, w0, [x0]
1874 ; CHECK-LSE-O0-NEXT:    ret
1875   %res = atomicrmw max i8* %ptr, i8 %rhs release
1876   ret i8 %res
1879 define i8 @atomicrmw_umin_i8(i8* %ptr, i8 %rhs) {
1880 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i8:
1881 ; CHECK-NOLSE-O1:       ; %bb.0:
1882 ; CHECK-NOLSE-O1-NEXT:  LBB35_1: ; %atomicrmw.start
1883 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1884 ; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
1885 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, #0xff
1886 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxtb
1887 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, ls
1888 ; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
1889 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB35_1
1890 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1891 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1892 ; CHECK-NOLSE-O1-NEXT:    ret
1894 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i8:
1895 ; CHECK-NOLSE-O0:       ; %bb.0:
1896 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1897 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1898 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1899 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1900 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1901 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1902 ; CHECK-NOLSE-O0-NEXT:    b LBB35_1
1903 ; CHECK-NOLSE-O0-NEXT:  LBB35_1: ; %atomicrmw.start
1904 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1905 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB35_2 Depth 2
1906 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1907 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1908 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1909 ; CHECK-NOLSE-O0-NEXT:    and w9, w10, #0xff
1910 ; CHECK-NOLSE-O0-NEXT:    mov w12, w8
1911 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w12, uxtb
1912 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ls
1913 ; CHECK-NOLSE-O0-NEXT:  LBB35_2: ; %atomicrmw.start
1914 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB35_1 Depth=1
1915 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1916 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1917 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1918 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB35_4
1919 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1920 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB35_2 Depth=2
1921 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1922 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB35_2
1923 ; CHECK-NOLSE-O0-NEXT:  LBB35_4: ; %atomicrmw.start
1924 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB35_1 Depth=1
1925 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1926 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1927 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1928 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
1929 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
1930 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB35_1
1931 ; CHECK-NOLSE-O0-NEXT:  b LBB35_5
1932 ; CHECK-NOLSE-O0-NEXT:  LBB35_5: ; %atomicrmw.end
1933 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
1934 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
1935 ; CHECK-NOLSE-O0-NEXT:    ret
1937 ; CHECK-LSE-O1-LABEL: atomicrmw_umin_i8:
1938 ; CHECK-LSE-O1:       ; %bb.0:
1939 ; CHECK-LSE-O1-NEXT:    lduminalb w1, w0, [x0]
1940 ; CHECK-LSE-O1-NEXT:    ret
1942 ; CHECK-LSE-O0-LABEL: atomicrmw_umin_i8:
1943 ; CHECK-LSE-O0:       ; %bb.0:
1944 ; CHECK-LSE-O0-NEXT:    lduminalb w1, w0, [x0]
1945 ; CHECK-LSE-O0-NEXT:    ret
1946   %res = atomicrmw umin i8* %ptr, i8 %rhs seq_cst
1947   ret i8 %res
1950 define i8 @atomicrmw_umax_i8(i8* %ptr, i8 %rhs) {
1951 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i8:
1952 ; CHECK-NOLSE-O1:       ; %bb.0:
1953 ; CHECK-NOLSE-O1-NEXT:  LBB36_1: ; %atomicrmw.start
1954 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
1955 ; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
1956 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, #0xff
1957 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxtb
1958 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, hi
1959 ; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
1960 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB36_1
1961 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
1962 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
1963 ; CHECK-NOLSE-O1-NEXT:    ret
1965 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i8:
1966 ; CHECK-NOLSE-O0:       ; %bb.0:
1967 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
1968 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
1969 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
1970 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
1971 ; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
1972 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
1973 ; CHECK-NOLSE-O0-NEXT:    b LBB36_1
1974 ; CHECK-NOLSE-O0-NEXT:  LBB36_1: ; %atomicrmw.start
1975 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
1976 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB36_2 Depth 2
1977 ; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
1978 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
1979 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
1980 ; CHECK-NOLSE-O0-NEXT:    and w9, w10, #0xff
1981 ; CHECK-NOLSE-O0-NEXT:    mov w12, w8
1982 ; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w12, uxtb
1983 ; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, hi
1984 ; CHECK-NOLSE-O0-NEXT:  LBB36_2: ; %atomicrmw.start
1985 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB36_1 Depth=1
1986 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1987 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
1988 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
1989 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB36_4
1990 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1991 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB36_2 Depth=2
1992 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
1993 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB36_2
1994 ; CHECK-NOLSE-O0-NEXT:  LBB36_4: ; %atomicrmw.start
1995 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB36_1 Depth=1
1996 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
1997 ; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
1998 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
1999 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2000 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2001 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB36_1
2002 ; CHECK-NOLSE-O0-NEXT:    b LBB36_5
2003 ; CHECK-NOLSE-O0-NEXT:  LBB36_5: ; %atomicrmw.end
2004 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2005 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2006 ; CHECK-NOLSE-O0-NEXT:    ret
2008 ; CHECK-LSE-O1-LABEL: atomicrmw_umax_i8:
2009 ; CHECK-LSE-O1:       ; %bb.0:
2010 ; CHECK-LSE-O1-NEXT:    ldumaxb w1, w0, [x0]
2011 ; CHECK-LSE-O1-NEXT:    ret
2013 ; CHECK-LSE-O0-LABEL: atomicrmw_umax_i8:
2014 ; CHECK-LSE-O0:       ; %bb.0:
2015 ; CHECK-LSE-O0-NEXT:    ldumaxb w1, w0, [x0]
2016 ; CHECK-LSE-O0-NEXT:    ret
2017   %res = atomicrmw umax i8* %ptr, i8 %rhs monotonic
2018   ret i8 %res
2021 define i16 @atomicrmw_add_i16(i16* %ptr, i16 %rhs) {
2022 ; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i16:
2023 ; CHECK-NOLSE-O1:       ; %bb.0:
2024 ; CHECK-NOLSE-O1-NEXT:  LBB37_1: ; %atomicrmw.start
2025 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2026 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2027 ; CHECK-NOLSE-O1-NEXT:    add w9, w8, w1
2028 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2029 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB37_1
2030 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2031 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2032 ; CHECK-NOLSE-O1-NEXT:    ret
2034 ; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i16:
2035 ; CHECK-NOLSE-O0:       ; %bb.0:
2036 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2037 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2038 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2039 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2040 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2041 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2042 ; CHECK-NOLSE-O0-NEXT:    b LBB37_1
2043 ; CHECK-NOLSE-O0-NEXT:  LBB37_1: ; %atomicrmw.start
2044 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2045 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB37_2 Depth 2
2046 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2047 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2048 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2049 ; CHECK-NOLSE-O0-NEXT:    add w12, w9, w8, uxth
2050 ; CHECK-NOLSE-O0-NEXT:  LBB37_2: ; %atomicrmw.start
2051 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB37_1 Depth=1
2052 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2053 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2054 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2055 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB37_4
2056 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2057 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB37_2 Depth=2
2058 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2059 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB37_2
2060 ; CHECK-NOLSE-O0-NEXT:  LBB37_4: ; %atomicrmw.start
2061 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB37_1 Depth=1
2062 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2063 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2064 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2065 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2066 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2067 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB37_1
2068 ; CHECK-NOLSE-O0-NEXT:    b LBB37_5
2069 ; CHECK-NOLSE-O0-NEXT:  LBB37_5: ; %atomicrmw.end
2070 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2071 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2072 ; CHECK-NOLSE-O0-NEXT:    ret
2074 ; CHECK-LSE-O1-LABEL: atomicrmw_add_i16:
2075 ; CHECK-LSE-O1:       ; %bb.0:
2076 ; CHECK-LSE-O1-NEXT:    ldaddalh w1, w0, [x0]
2077 ; CHECK-LSE-O1-NEXT:    ret
2079 ; CHECK-LSE-O0-LABEL: atomicrmw_add_i16:
2080 ; CHECK-LSE-O0:       ; %bb.0:
2081 ; CHECK-LSE-O0-NEXT:    ldaddalh w1, w0, [x0]
2082 ; CHECK-LSE-O0-NEXT:    ret
2083   %res = atomicrmw add i16* %ptr, i16 %rhs seq_cst
2084   ret i16 %res
2087 define i16 @atomicrmw_xchg_i16(i16* %ptr, i16 %rhs) {
2088 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i16:
2089 ; CHECK-NOLSE-O1:       ; %bb.0:
2090 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
2091 ; CHECK-NOLSE-O1-NEXT:  LBB38_1: ; %atomicrmw.start
2092 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2093 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2094 ; CHECK-NOLSE-O1-NEXT:    stxrh w9, w1, [x0]
2095 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB38_1
2096 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2097 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2098 ; CHECK-NOLSE-O1-NEXT:    ret
2100 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i16:
2101 ; CHECK-NOLSE-O0:       ; %bb.0:
2102 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2103 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2104 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2105 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2106 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2107 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2108 ; CHECK-NOLSE-O0-NEXT:    b LBB38_1
2109 ; CHECK-NOLSE-O0-NEXT:  LBB38_1: ; %atomicrmw.start
2110 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2111 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB38_2 Depth 2
2112 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2113 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2114 ; CHECK-NOLSE-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
2115 ; CHECK-NOLSE-O0-NEXT:  LBB38_2: ; %atomicrmw.start
2116 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB38_1 Depth=1
2117 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2118 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2119 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2120 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB38_4
2121 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2122 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB38_2 Depth=2
2123 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2124 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB38_2
2125 ; CHECK-NOLSE-O0-NEXT:  LBB38_4: ; %atomicrmw.start
2126 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB38_1 Depth=1
2127 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2128 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2129 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2130 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2131 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2132 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB38_1
2133 ; CHECK-NOLSE-O0-NEXT:    b LBB38_5
2134 ; CHECK-NOLSE-O0-NEXT:  LBB38_5: ; %atomicrmw.end
2135 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2136 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2137 ; CHECK-NOLSE-O0-NEXT:    ret
2139 ; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i16:
2140 ; CHECK-LSE-O1:       ; %bb.0:
2141 ; CHECK-LSE-O1-NEXT:    swph w1, w0, [x0]
2142 ; CHECK-LSE-O1-NEXT:    ret
2144 ; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i16:
2145 ; CHECK-LSE-O0:       ; %bb.0:
2146 ; CHECK-LSE-O0-NEXT:    swph w1, w0, [x0]
2147 ; CHECK-LSE-O0-NEXT:    ret
2148   %res = atomicrmw xchg i16* %ptr, i16 %rhs monotonic
2149   ret i16 %res
2152 define i16 @atomicrmw_sub_i16(i16* %ptr, i16 %rhs) {
2153 ; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i16:
2154 ; CHECK-NOLSE-O1:       ; %bb.0:
2155 ; CHECK-NOLSE-O1-NEXT:  LBB39_1: ; %atomicrmw.start
2156 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2157 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2158 ; CHECK-NOLSE-O1-NEXT:    sub w9, w8, w1
2159 ; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
2160 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB39_1
2161 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2162 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2163 ; CHECK-NOLSE-O1-NEXT:    ret
2165 ; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i16:
2166 ; CHECK-NOLSE-O0:       ; %bb.0:
2167 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2168 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2169 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2170 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2171 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2172 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2173 ; CHECK-NOLSE-O0-NEXT:    b LBB39_1
2174 ; CHECK-NOLSE-O0-NEXT:  LBB39_1: ; %atomicrmw.start
2175 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2176 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB39_2 Depth 2
2177 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2178 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2179 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2180 ; CHECK-NOLSE-O0-NEXT:    subs w12, w8, w9
2181 ; CHECK-NOLSE-O0-NEXT:  LBB39_2: ; %atomicrmw.start
2182 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB39_1 Depth=1
2183 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2184 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2185 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2186 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB39_4
2187 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2188 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB39_2 Depth=2
2189 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2190 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB39_2
2191 ; CHECK-NOLSE-O0-NEXT:  LBB39_4: ; %atomicrmw.start
2192 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB39_1 Depth=1
2193 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2194 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2195 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2196 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2197 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2198 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB39_1
2199 ; CHECK-NOLSE-O0-NEXT:    b LBB39_5
2200 ; CHECK-NOLSE-O0-NEXT:  LBB39_5: ; %atomicrmw.end
2201 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2202 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2203 ; CHECK-NOLSE-O0-NEXT:    ret
2205 ; CHECK-LSE-O1-LABEL: atomicrmw_sub_i16:
2206 ; CHECK-LSE-O1:       ; %bb.0:
2207 ; CHECK-LSE-O1-NEXT:    neg w8, w1
2208 ; CHECK-LSE-O1-NEXT:    ldaddah w8, w0, [x0]
2209 ; CHECK-LSE-O1-NEXT:    ret
2211 ; CHECK-LSE-O0-LABEL: atomicrmw_sub_i16:
2212 ; CHECK-LSE-O0:       ; %bb.0:
2213 ; CHECK-LSE-O0-NEXT:    neg w8, w1
2214 ; CHECK-LSE-O0-NEXT:    ldaddah w8, w0, [x0]
2215 ; CHECK-LSE-O0-NEXT:    ret
2216   %res = atomicrmw sub i16* %ptr, i16 %rhs acquire
2217   ret i16 %res
2220 define i16 @atomicrmw_and_i16(i16* %ptr, i16 %rhs) {
2221 ; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i16:
2222 ; CHECK-NOLSE-O1:       ; %bb.0:
2223 ; CHECK-NOLSE-O1-NEXT:  LBB40_1: ; %atomicrmw.start
2224 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2225 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2226 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, w1
2227 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2228 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB40_1
2229 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2230 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2231 ; CHECK-NOLSE-O1-NEXT:    ret
2233 ; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i16:
2234 ; CHECK-NOLSE-O0:       ; %bb.0:
2235 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2236 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2237 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2238 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2239 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2240 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2241 ; CHECK-NOLSE-O0-NEXT:    b LBB40_1
2242 ; CHECK-NOLSE-O0-NEXT:  LBB40_1: ; %atomicrmw.start
2243 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2244 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB40_2 Depth 2
2245 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2246 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2247 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2248 ; CHECK-NOLSE-O0-NEXT:    and w12, w8, w9
2249 ; CHECK-NOLSE-O0-NEXT:  LBB40_2: ; %atomicrmw.start
2250 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB40_1 Depth=1
2251 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2252 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2253 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2254 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB40_4
2255 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2256 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB40_2 Depth=2
2257 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2258 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB40_2
2259 ; CHECK-NOLSE-O0-NEXT:  LBB40_4: ; %atomicrmw.start
2260 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB40_1 Depth=1
2261 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2262 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2263 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2264 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2265 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2266 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB40_1
2267 ; CHECK-NOLSE-O0-NEXT:    b LBB40_5
2268 ; CHECK-NOLSE-O0-NEXT:  LBB40_5: ; %atomicrmw.end
2269 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2270 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2271 ; CHECK-NOLSE-O0-NEXT:    ret
2273 ; CHECK-LSE-O1-LABEL: atomicrmw_and_i16:
2274 ; CHECK-LSE-O1:       ; %bb.0:
2275 ; CHECK-LSE-O1-NEXT:    mvn w8, w1
2276 ; CHECK-LSE-O1-NEXT:    ldclrlh w8, w0, [x0]
2277 ; CHECK-LSE-O1-NEXT:    ret
2279 ; CHECK-LSE-O0-LABEL: atomicrmw_and_i16:
2280 ; CHECK-LSE-O0:       ; %bb.0:
2281 ; CHECK-LSE-O0-NEXT:    mvn w8, w1
2282 ; CHECK-LSE-O0-NEXT:    ldclrlh w8, w0, [x0]
2283 ; CHECK-LSE-O0-NEXT:    ret
2284   %res = atomicrmw and i16* %ptr, i16 %rhs release
2285   ret i16 %res
2288 define i16 @atomicrmw_or_i16(i16* %ptr, i16 %rhs) {
2289 ; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i16:
2290 ; CHECK-NOLSE-O1:       ; %bb.0:
2291 ; CHECK-NOLSE-O1-NEXT:  LBB41_1: ; %atomicrmw.start
2292 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2293 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2294 ; CHECK-NOLSE-O1-NEXT:    orr w9, w8, w1
2295 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2296 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB41_1
2297 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2298 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2299 ; CHECK-NOLSE-O1-NEXT:    ret
2301 ; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i16:
2302 ; CHECK-NOLSE-O0:       ; %bb.0:
2303 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2304 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2305 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2306 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2307 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2308 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2309 ; CHECK-NOLSE-O0-NEXT:    b LBB41_1
2310 ; CHECK-NOLSE-O0-NEXT:  LBB41_1: ; %atomicrmw.start
2311 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2312 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB41_2 Depth 2
2313 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2314 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2315 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2316 ; CHECK-NOLSE-O0-NEXT:    orr w12, w8, w9
2317 ; CHECK-NOLSE-O0-NEXT:  LBB41_2: ; %atomicrmw.start
2318 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB41_1 Depth=1
2319 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2320 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2321 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2322 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB41_4
2323 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2324 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB41_2 Depth=2
2325 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2326 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB41_2
2327 ; CHECK-NOLSE-O0-NEXT:  LBB41_4: ; %atomicrmw.start
2328 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB41_1 Depth=1
2329 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2330 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2331 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2332 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2333 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2334 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB41_1
2335 ; CHECK-NOLSE-O0-NEXT:    b LBB41_5
2336 ; CHECK-NOLSE-O0-NEXT:  LBB41_5: ; %atomicrmw.end
2337 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2338 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2339 ; CHECK-NOLSE-O0-NEXT:    ret
2341 ; CHECK-LSE-O1-LABEL: atomicrmw_or_i16:
2342 ; CHECK-LSE-O1:       ; %bb.0:
2343 ; CHECK-LSE-O1-NEXT:    ldsetalh w1, w0, [x0]
2344 ; CHECK-LSE-O1-NEXT:    ret
2346 ; CHECK-LSE-O0-LABEL: atomicrmw_or_i16:
2347 ; CHECK-LSE-O0:       ; %bb.0:
2348 ; CHECK-LSE-O0-NEXT:    ldsetalh w1, w0, [x0]
2349 ; CHECK-LSE-O0-NEXT:    ret
2350   %res = atomicrmw or i16* %ptr, i16 %rhs seq_cst
2351   ret i16 %res
2354 define i16 @atomicrmw_xor_i16(i16* %ptr, i16 %rhs) {
2355 ; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i16:
2356 ; CHECK-NOLSE-O1:       ; %bb.0:
2357 ; CHECK-NOLSE-O1-NEXT:  LBB42_1: ; %atomicrmw.start
2358 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2359 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2360 ; CHECK-NOLSE-O1-NEXT:    eor w9, w8, w1
2361 ; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
2362 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB42_1
2363 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2364 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2365 ; CHECK-NOLSE-O1-NEXT:    ret
2367 ; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i16:
2368 ; CHECK-NOLSE-O0:       ; %bb.0:
2369 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2370 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2371 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2372 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2373 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2374 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2375 ; CHECK-NOLSE-O0-NEXT:    b LBB42_1
2376 ; CHECK-NOLSE-O0-NEXT:  LBB42_1: ; %atomicrmw.start
2377 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2378 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB42_2 Depth 2
2379 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2380 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2381 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2382 ; CHECK-NOLSE-O0-NEXT:    eor w12, w8, w9
2383 ; CHECK-NOLSE-O0-NEXT:  LBB42_2: ; %atomicrmw.start
2384 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB42_1 Depth=1
2385 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2386 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2387 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2388 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB42_4
2389 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2390 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB42_2 Depth=2
2391 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2392 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB42_2
2393 ; CHECK-NOLSE-O0-NEXT:  LBB42_4: ; %atomicrmw.start
2394 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB42_1 Depth=1
2395 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2396 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2397 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2398 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2399 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2400 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB42_1
2401 ; CHECK-NOLSE-O0-NEXT:    b LBB42_5
2402 ; CHECK-NOLSE-O0-NEXT:  LBB42_5: ; %atomicrmw.end
2403 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2404 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2405 ; CHECK-NOLSE-O0-NEXT:    ret
2407 ; CHECK-LSE-O1-LABEL: atomicrmw_xor_i16:
2408 ; CHECK-LSE-O1:       ; %bb.0:
2409 ; CHECK-LSE-O1-NEXT:    ldeorh w1, w0, [x0]
2410 ; CHECK-LSE-O1-NEXT:    ret
2412 ; CHECK-LSE-O0-LABEL: atomicrmw_xor_i16:
2413 ; CHECK-LSE-O0:       ; %bb.0:
2414 ; CHECK-LSE-O0-NEXT:    ldeorh w1, w0, [x0]
2415 ; CHECK-LSE-O0-NEXT:    ret
2416   %res = atomicrmw xor i16* %ptr, i16 %rhs monotonic
2417   ret i16 %res
2420 define i16 @atomicrmw_min_i16(i16* %ptr, i16 %rhs) {
2421 ; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i16:
2422 ; CHECK-NOLSE-O1:       ; %bb.0:
2423 ; CHECK-NOLSE-O1-NEXT:  LBB43_1: ; %atomicrmw.start
2424 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2425 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2426 ; CHECK-NOLSE-O1-NEXT:    sxth w9, w8
2427 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxth
2428 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, le
2429 ; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
2430 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB43_1
2431 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2432 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2433 ; CHECK-NOLSE-O1-NEXT:    ret
2435 ; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i16:
2436 ; CHECK-NOLSE-O0:       ; %bb.0:
2437 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2438 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2439 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2440 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2441 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2442 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2443 ; CHECK-NOLSE-O0-NEXT:    b LBB43_1
2444 ; CHECK-NOLSE-O0-NEXT:  LBB43_1: ; %atomicrmw.start
2445 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2446 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB43_2 Depth 2
2447 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2448 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2449 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2450 ; CHECK-NOLSE-O0-NEXT:    sxth w10, w8
2451 ; CHECK-NOLSE-O0-NEXT:    mov w12, w9
2452 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w12, sxth
2453 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, le
2454 ; CHECK-NOLSE-O0-NEXT:  LBB43_2: ; %atomicrmw.start
2455 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB43_1 Depth=1
2456 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2457 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2458 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2459 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB43_4
2460 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2461 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB43_2 Depth=2
2462 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2463 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB43_2
2464 ; CHECK-NOLSE-O0-NEXT:  LBB43_4: ; %atomicrmw.start
2465 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB43_1 Depth=1
2466 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2467 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2468 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2469 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2470 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2471 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB43_1
2472 ; CHECK-NOLSE-O0-NEXT:    b LBB43_5
2473 ; CHECK-NOLSE-O0-NEXT:  LBB43_5: ; %atomicrmw.end
2474 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2475 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2476 ; CHECK-NOLSE-O0-NEXT:    ret
2478 ; CHECK-LSE-O1-LABEL: atomicrmw_min_i16:
2479 ; CHECK-LSE-O1:       ; %bb.0:
2480 ; CHECK-LSE-O1-NEXT:    ldsminah w1, w0, [x0]
2481 ; CHECK-LSE-O1-NEXT:    ret
2483 ; CHECK-LSE-O0-LABEL: atomicrmw_min_i16:
2484 ; CHECK-LSE-O0:       ; %bb.0:
2485 ; CHECK-LSE-O0-NEXT:    ldsminah w1, w0, [x0]
2486 ; CHECK-LSE-O0-NEXT:    ret
2487   %res = atomicrmw min i16* %ptr, i16 %rhs acquire
2488   ret i16 %res
2491 define i16 @atomicrmw_max_i16(i16* %ptr, i16 %rhs) {
2492 ; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i16:
2493 ; CHECK-NOLSE-O1:       ; %bb.0:
2494 ; CHECK-NOLSE-O1-NEXT:  LBB44_1: ; %atomicrmw.start
2495 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2496 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2497 ; CHECK-NOLSE-O1-NEXT:    sxth w9, w8
2498 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxth
2499 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, gt
2500 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2501 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB44_1
2502 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2503 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2504 ; CHECK-NOLSE-O1-NEXT:    ret
2506 ; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i16:
2507 ; CHECK-NOLSE-O0:       ; %bb.0:
2508 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2509 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2510 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2511 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2512 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2513 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2514 ; CHECK-NOLSE-O0-NEXT:    b LBB44_1
2515 ; CHECK-NOLSE-O0-NEXT:  LBB44_1: ; %atomicrmw.start
2516 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2517 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB44_2 Depth 2
2518 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2519 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2520 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2521 ; CHECK-NOLSE-O0-NEXT:    sxth w10, w8
2522 ; CHECK-NOLSE-O0-NEXT:    mov w12, w9
2523 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w12, sxth
2524 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, gt
2525 ; CHECK-NOLSE-O0-NEXT:  LBB44_2: ; %atomicrmw.start
2526 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB44_1 Depth=1
2527 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2528 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2529 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2530 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB44_4
2531 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2532 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB44_2 Depth=2
2533 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2534 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB44_2
2535 ; CHECK-NOLSE-O0-NEXT:  LBB44_4: ; %atomicrmw.start
2536 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB44_1 Depth=1
2537 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2538 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2539 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2540 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2541 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2542 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB44_1
2543 ; CHECK-NOLSE-O0-NEXT:    b LBB44_5
2544 ; CHECK-NOLSE-O0-NEXT:  LBB44_5: ; %atomicrmw.end
2545 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2546 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2547 ; CHECK-NOLSE-O0-NEXT:    ret
2549 ; CHECK-LSE-O1-LABEL: atomicrmw_max_i16:
2550 ; CHECK-LSE-O1:       ; %bb.0:
2551 ; CHECK-LSE-O1-NEXT:    ldsmaxlh w1, w0, [x0]
2552 ; CHECK-LSE-O1-NEXT:    ret
2554 ; CHECK-LSE-O0-LABEL: atomicrmw_max_i16:
2555 ; CHECK-LSE-O0:       ; %bb.0:
2556 ; CHECK-LSE-O0-NEXT:    ldsmaxlh w1, w0, [x0]
2557 ; CHECK-LSE-O0-NEXT:    ret
2558   %res = atomicrmw max i16* %ptr, i16 %rhs release
2559   ret i16 %res
2562 define i16 @atomicrmw_umin_i16(i16* %ptr, i16 %rhs) {
2563 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i16:
2564 ; CHECK-NOLSE-O1:       ; %bb.0:
2565 ; CHECK-NOLSE-O1-NEXT:  LBB45_1: ; %atomicrmw.start
2566 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2567 ; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
2568 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, #0xffff
2569 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxth
2570 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, ls
2571 ; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
2572 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB45_1
2573 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2574 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2575 ; CHECK-NOLSE-O1-NEXT:    ret
2577 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i16:
2578 ; CHECK-NOLSE-O0:       ; %bb.0:
2579 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2580 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2581 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2582 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2583 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2584 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2585 ; CHECK-NOLSE-O0-NEXT:    b LBB45_1
2586 ; CHECK-NOLSE-O0-NEXT:  LBB45_1: ; %atomicrmw.start
2587 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2588 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB45_2 Depth 2
2589 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2590 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2591 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2592 ; CHECK-NOLSE-O0-NEXT:    uxth w10, w8
2593 ; CHECK-NOLSE-O0-NEXT:    mov w12, w9
2594 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w12, uxth
2595 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ls
2596 ; CHECK-NOLSE-O0-NEXT:  LBB45_2: ; %atomicrmw.start
2597 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB45_1 Depth=1
2598 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2599 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2600 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2601 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB45_4
2602 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2603 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB45_2 Depth=2
2604 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2605 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB45_2
2606 ; CHECK-NOLSE-O0-NEXT:  LBB45_4: ; %atomicrmw.start
2607 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB45_1 Depth=1
2608 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2609 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2610 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2611 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2612 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2613 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB45_1
2614 ; CHECK-NOLSE-O0-NEXT:    b LBB45_5
2615 ; CHECK-NOLSE-O0-NEXT:  LBB45_5: ; %atomicrmw.end
2616 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2617 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2618 ; CHECK-NOLSE-O0-NEXT:    ret
2620 ; CHECK-LSE-O1-LABEL: atomicrmw_umin_i16:
2621 ; CHECK-LSE-O1:       ; %bb.0:
2622 ; CHECK-LSE-O1-NEXT:    lduminalh w1, w0, [x0]
2623 ; CHECK-LSE-O1-NEXT:    ret
2625 ; CHECK-LSE-O0-LABEL: atomicrmw_umin_i16:
2626 ; CHECK-LSE-O0:       ; %bb.0:
2627 ; CHECK-LSE-O0-NEXT:    lduminalh w1, w0, [x0]
2628 ; CHECK-LSE-O0-NEXT:    ret
2629   %res = atomicrmw umin i16* %ptr, i16 %rhs seq_cst
2630   ret i16 %res
2633 define i16 @atomicrmw_umax_i16(i16* %ptr, i16 %rhs) {
2634 ; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i16:
2635 ; CHECK-NOLSE-O1:       ; %bb.0:
2636 ; CHECK-NOLSE-O1-NEXT:  LBB46_1: ; %atomicrmw.start
2637 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2638 ; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
2639 ; CHECK-NOLSE-O1-NEXT:    and w9, w8, #0xffff
2640 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxth
2641 ; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, hi
2642 ; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
2643 ; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB46_1
2644 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2645 ; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2646 ; CHECK-NOLSE-O1-NEXT:    ret
2648 ; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i16:
2649 ; CHECK-NOLSE-O0:       ; %bb.0:
2650 ; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2651 ; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2652 ; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2653 ; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2654 ; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
2655 ; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2656 ; CHECK-NOLSE-O0-NEXT:    b LBB46_1
2657 ; CHECK-NOLSE-O0-NEXT:  LBB46_1: ; %atomicrmw.start
2658 ; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2659 ; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB46_2 Depth 2
2660 ; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
2661 ; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2662 ; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
2663 ; CHECK-NOLSE-O0-NEXT:    uxth w10, w8
2664 ; CHECK-NOLSE-O0-NEXT:    mov w12, w9
2665 ; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w12, uxth
2666 ; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, hi
2667 ; CHECK-NOLSE-O0-NEXT:  LBB46_2: ; %atomicrmw.start
2668 ; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB46_1 Depth=1
2669 ; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2670 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
2671 ; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
2672 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB46_4
2673 ; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2674 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB46_2 Depth=2
2675 ; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
2676 ; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB46_2
2677 ; CHECK-NOLSE-O0-NEXT:  LBB46_4: ; %atomicrmw.start
2678 ; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB46_1 Depth=1
2679 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2680 ; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
2681 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
2682 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2683 ; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2684 ; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB46_1
2685 ; CHECK-NOLSE-O0-NEXT:    b LBB46_5
2686 ; CHECK-NOLSE-O0-NEXT:  LBB46_5: ; %atomicrmw.end
2687 ; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2688 ; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2689 ; CHECK-NOLSE-O0-NEXT:    ret
2691 ; CHECK-LSE-O1-LABEL: atomicrmw_umax_i16:
2692 ; CHECK-LSE-O1:       ; %bb.0:
2693 ; CHECK-LSE-O1-NEXT:    ldumaxh w1, w0, [x0]
2694 ; CHECK-LSE-O1-NEXT:    ret
2696 ; CHECK-LSE-O0-LABEL: atomicrmw_umax_i16:
2697 ; CHECK-LSE-O0:       ; %bb.0:
2698 ; CHECK-LSE-O0-NEXT:    ldumaxh w1, w0, [x0]
2699 ; CHECK-LSE-O0-NEXT:    ret
2700   %res = atomicrmw umax i16* %ptr, i16 %rhs monotonic
2701   ret i16 %res
2704 define { i8, i1 } @cmpxchg_i8(i8* %ptr, i8 %desired, i8 %new) {
2705 ; CHECK-NOLSE-O1-LABEL: cmpxchg_i8:
2706 ; CHECK-NOLSE-O1:       ; %bb.0:
2707 ; CHECK-NOLSE-O1-NEXT:    mov x8, x0
2708 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
2709 ; CHECK-NOLSE-O1-NEXT:  LBB47_1: ; %cmpxchg.start
2710 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2711 ; CHECK-NOLSE-O1-NEXT:    ldxrb w0, [x8]
2712 ; CHECK-NOLSE-O1-NEXT:    and w9, w0, #0xff
2713 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxtb
2714 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB47_4
2715 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
2716 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB47_1 Depth=1
2717 ; CHECK-NOLSE-O1-NEXT:    stxrb w9, w2, [x8]
2718 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB47_1
2719 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3:
2720 ; CHECK-NOLSE-O1-NEXT:    mov w1, #1
2721 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2722 ; CHECK-NOLSE-O1-NEXT:    ret
2723 ; CHECK-NOLSE-O1-NEXT:  LBB47_4: ; %cmpxchg.nostore
2724 ; CHECK-NOLSE-O1-NEXT:    clrex
2725 ; CHECK-NOLSE-O1-NEXT:    mov w1, wzr
2726 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2727 ; CHECK-NOLSE-O1-NEXT:    ret
2729 ; CHECK-NOLSE-O0-LABEL: cmpxchg_i8:
2730 ; CHECK-NOLSE-O0:       ; %bb.0:
2731 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
2732 ; CHECK-NOLSE-O0-NEXT:    mov w10, w1
2733 ; CHECK-NOLSE-O0-NEXT:  LBB47_1: ; =>This Inner Loop Header: Depth=1
2734 ; CHECK-NOLSE-O0-NEXT:    ldaxrb w0, [x9]
2735 ; CHECK-NOLSE-O0-NEXT:    cmp w0, w10, uxtb
2736 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB47_3
2737 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB47_1 Depth=1
2738 ; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w2, [x9]
2739 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB47_1
2740 ; CHECK-NOLSE-O0-NEXT:  LBB47_3:
2741 ; CHECK-NOLSE-O0-NEXT:    and w8, w0, #0xff
2742 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w1, uxtb
2743 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2744 ; CHECK-NOLSE-O0-NEXT:    and w1, w8, #0x1
2745 ; CHECK-NOLSE-O0-NEXT:    ret
2747 ; CHECK-LSE-O1-LABEL: cmpxchg_i8:
2748 ; CHECK-LSE-O1:       ; %bb.0:
2749 ; CHECK-LSE-O1-NEXT:    mov x8, x1
2750 ; CHECK-LSE-O1-NEXT:    casb w8, w2, [x0]
2751 ; CHECK-LSE-O1-NEXT:    and w9, w8, #0xff
2752 ; CHECK-LSE-O1-NEXT:    cmp w9, w1, uxtb
2753 ; CHECK-LSE-O1-NEXT:    cset w1, eq
2754 ; CHECK-LSE-O1-NEXT:    mov x0, x8
2755 ; CHECK-LSE-O1-NEXT:    ret
2757 ; CHECK-LSE-O0-LABEL: cmpxchg_i8:
2758 ; CHECK-LSE-O0:       ; %bb.0:
2759 ; CHECK-LSE-O0-NEXT:    mov x8, x0
2760 ; CHECK-LSE-O0-NEXT:    mov x0, x1
2761 ; CHECK-LSE-O0-NEXT:    casb w0, w2, [x8]
2762 ; CHECK-LSE-O0-NEXT:    and w8, w0, #0xff
2763 ; CHECK-LSE-O0-NEXT:    subs w8, w8, w1, uxtb
2764 ; CHECK-LSE-O0-NEXT:    cset w8, eq
2765 ; CHECK-LSE-O0-NEXT:    and w1, w8, #0x1
2766 ; CHECK-LSE-O0-NEXT:    ret
2767   %res = cmpxchg i8* %ptr, i8 %desired, i8 %new monotonic monotonic
2768   ret { i8, i1 } %res
2771 define { i16, i1 } @cmpxchg_i16(i16* %ptr, i16 %desired, i16 %new) {
2772 ; CHECK-NOLSE-O1-LABEL: cmpxchg_i16:
2773 ; CHECK-NOLSE-O1:       ; %bb.0:
2774 ; CHECK-NOLSE-O1-NEXT:    mov x8, x0
2775 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
2776 ; CHECK-NOLSE-O1-NEXT:  LBB48_1: ; %cmpxchg.start
2777 ; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2778 ; CHECK-NOLSE-O1-NEXT:    ldxrh w0, [x8]
2779 ; CHECK-NOLSE-O1-NEXT:    and w9, w0, #0xffff
2780 ; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxth
2781 ; CHECK-NOLSE-O1-NEXT:    b.ne LBB48_4
2782 ; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
2783 ; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB48_1 Depth=1
2784 ; CHECK-NOLSE-O1-NEXT:    stxrh w9, w2, [x8]
2785 ; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB48_1
2786 ; CHECK-NOLSE-O1-NEXT:  ; %bb.3:
2787 ; CHECK-NOLSE-O1-NEXT:    mov w1, #1
2788 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2789 ; CHECK-NOLSE-O1-NEXT:    ret
2790 ; CHECK-NOLSE-O1-NEXT:  LBB48_4: ; %cmpxchg.nostore
2791 ; CHECK-NOLSE-O1-NEXT:    clrex
2792 ; CHECK-NOLSE-O1-NEXT:    mov w1, wzr
2793 ; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
2794 ; CHECK-NOLSE-O1-NEXT:    ret
2796 ; CHECK-NOLSE-O0-LABEL: cmpxchg_i16:
2797 ; CHECK-NOLSE-O0:       ; %bb.0:
2798 ; CHECK-NOLSE-O0-NEXT:    mov x9, x0
2799 ; CHECK-NOLSE-O0-NEXT:    mov w10, w1
2800 ; CHECK-NOLSE-O0-NEXT:  LBB48_1: ; =>This Inner Loop Header: Depth=1
2801 ; CHECK-NOLSE-O0-NEXT:    ldaxrh w0, [x9]
2802 ; CHECK-NOLSE-O0-NEXT:    cmp w0, w10, uxth
2803 ; CHECK-NOLSE-O0-NEXT:    b.ne LBB48_3
2804 ; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB48_1 Depth=1
2805 ; CHECK-NOLSE-O0-NEXT:    stlxrh w8, w2, [x9]
2806 ; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB48_1
2807 ; CHECK-NOLSE-O0-NEXT:  LBB48_3:
2808 ; CHECK-NOLSE-O0-NEXT:    and w8, w0, #0xffff
2809 ; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w1, uxth
2810 ; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2811 ; CHECK-NOLSE-O0-NEXT:    and w1, w8, #0x1
2812 ; CHECK-NOLSE-O0-NEXT:    ret
2814 ; CHECK-LSE-O1-LABEL: cmpxchg_i16:
2815 ; CHECK-LSE-O1:       ; %bb.0:
2816 ; CHECK-LSE-O1-NEXT:    mov x8, x1
2817 ; CHECK-LSE-O1-NEXT:    cash w8, w2, [x0]
2818 ; CHECK-LSE-O1-NEXT:    and w9, w8, #0xffff
2819 ; CHECK-LSE-O1-NEXT:    cmp w9, w1, uxth
2820 ; CHECK-LSE-O1-NEXT:    cset w1, eq
2821 ; CHECK-LSE-O1-NEXT:    mov x0, x8
2822 ; CHECK-LSE-O1-NEXT:    ret
2824 ; CHECK-LSE-O0-LABEL: cmpxchg_i16:
2825 ; CHECK-LSE-O0:       ; %bb.0:
2826 ; CHECK-LSE-O0-NEXT:    mov x8, x0
2827 ; CHECK-LSE-O0-NEXT:    mov x0, x1
2828 ; CHECK-LSE-O0-NEXT:    cash w0, w2, [x8]
2829 ; CHECK-LSE-O0-NEXT:    and w8, w0, #0xffff
2830 ; CHECK-LSE-O0-NEXT:    subs w8, w8, w1, uxth
2831 ; CHECK-LSE-O0-NEXT:    cset w8, eq
2832 ; CHECK-LSE-O0-NEXT:    and w1, w8, #0x1
2833 ; CHECK-LSE-O0-NEXT:    ret
2834   %res = cmpxchg i16* %ptr, i16 %desired, i16 %new monotonic monotonic
2835   ret { i16, i1 } %res
2838 attributes #0 = { nounwind }