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
6; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mattr=+rcpc,+ldapr -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LDAPR-O1
7; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mattr=+rcpc,+ldapr -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LDAPR-O0
8
9define i32 @val_compare_and_swap(i32* %p, i32 %cmp, i32 %new) #0 {
10; CHECK-NOLSE-O1-LABEL: val_compare_and_swap:
11; CHECK-NOLSE-O1:       ; %bb.0:
12; CHECK-NOLSE-O1-NEXT:  LBB0_1: ; %cmpxchg.start
13; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
14; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
15; CHECK-NOLSE-O1-NEXT:    cmp w8, w1
16; CHECK-NOLSE-O1-NEXT:    b.ne LBB0_4
17; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
18; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB0_1 Depth=1
19; CHECK-NOLSE-O1-NEXT:    stxr w9, w2, [x0]
20; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB0_1
21; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
22; CHECK-NOLSE-O1-NEXT:    mov w0, w8
23; CHECK-NOLSE-O1-NEXT:    ret
24; CHECK-NOLSE-O1-NEXT:  LBB0_4: ; %cmpxchg.nostore
25; CHECK-NOLSE-O1-NEXT:    clrex
26; CHECK-NOLSE-O1-NEXT:    mov w0, w8
27; CHECK-NOLSE-O1-NEXT:    ret
28;
29; CHECK-NOLSE-O0-LABEL: val_compare_and_swap:
30; CHECK-NOLSE-O0:       ; %bb.0:
31; CHECK-NOLSE-O0-NEXT:    mov x9, x0
32; CHECK-NOLSE-O0-NEXT:  LBB0_1: ; =>This Inner Loop Header: Depth=1
33; CHECK-NOLSE-O0-NEXT:    ldaxr w0, [x9]
34; CHECK-NOLSE-O0-NEXT:    cmp w0, w1
35; CHECK-NOLSE-O0-NEXT:    b.ne LBB0_3
36; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB0_1 Depth=1
37; CHECK-NOLSE-O0-NEXT:    stlxr w8, w2, [x9]
38; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB0_1
39; CHECK-NOLSE-O0-NEXT:  LBB0_3:
40; CHECK-NOLSE-O0-NEXT:    ret
41;
42; CHECK-LSE-O1-LABEL: val_compare_and_swap:
43; CHECK-LSE-O1:       ; %bb.0:
44; CHECK-LSE-O1-NEXT:    casa w1, w2, [x0]
45; CHECK-LSE-O1-NEXT:    mov x0, x1
46; CHECK-LSE-O1-NEXT:    ret
47;
48; CHECK-LSE-O0-LABEL: val_compare_and_swap:
49; CHECK-LSE-O0:       ; %bb.0:
50; CHECK-LSE-O0-NEXT:    mov x8, x0
51; CHECK-LSE-O0-NEXT:    mov x0, x1
52; CHECK-LSE-O0-NEXT:    casa w0, w2, [x8]
53; CHECK-LSE-O0-NEXT:    ret
54;
55; CHECK-LDAPR-O1-LABEL: val_compare_and_swap:
56; CHECK-LDAPR-O1:       ; %bb.0:
57; CHECK-LDAPR-O1-NEXT:  LBB0_1: ; %cmpxchg.start
58; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
59; CHECK-LDAPR-O1-NEXT:    ldaxr w8, [x0]
60; CHECK-LDAPR-O1-NEXT:    cmp w8, w1
61; CHECK-LDAPR-O1-NEXT:    b.ne LBB0_4
62; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
63; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB0_1 Depth=1
64; CHECK-LDAPR-O1-NEXT:    stxr w9, w2, [x0]
65; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB0_1
66; CHECK-LDAPR-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
67; CHECK-LDAPR-O1-NEXT:    mov w0, w8
68; CHECK-LDAPR-O1-NEXT:    ret
69; CHECK-LDAPR-O1-NEXT:  LBB0_4: ; %cmpxchg.nostore
70; CHECK-LDAPR-O1-NEXT:    clrex
71; CHECK-LDAPR-O1-NEXT:    mov w0, w8
72; CHECK-LDAPR-O1-NEXT:    ret
73;
74; CHECK-LDAPR-O0-LABEL: val_compare_and_swap:
75; CHECK-LDAPR-O0:       ; %bb.0:
76; CHECK-LDAPR-O0-NEXT:    mov x9, x0
77; CHECK-LDAPR-O0-NEXT:  LBB0_1: ; =>This Inner Loop Header: Depth=1
78; CHECK-LDAPR-O0-NEXT:    ldaxr w0, [x9]
79; CHECK-LDAPR-O0-NEXT:    cmp w0, w1
80; CHECK-LDAPR-O0-NEXT:    b.ne LBB0_3
81; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB0_1 Depth=1
82; CHECK-LDAPR-O0-NEXT:    stlxr w8, w2, [x9]
83; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB0_1
84; CHECK-LDAPR-O0-NEXT:  LBB0_3:
85; CHECK-LDAPR-O0-NEXT:    ret
86  %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acquire acquire
87  %val = extractvalue { i32, i1 } %pair, 0
88  ret i32 %val
89}
90
91define i32 @val_compare_and_swap_from_load(i32* %p, i32 %cmp, i32* %pnew) #0 {
92; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_from_load:
93; CHECK-NOLSE-O1:       ; %bb.0:
94; CHECK-NOLSE-O1-NEXT:    ldr w9, [x2]
95; CHECK-NOLSE-O1-NEXT:  LBB1_1: ; %cmpxchg.start
96; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
97; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
98; CHECK-NOLSE-O1-NEXT:    cmp w8, w1
99; CHECK-NOLSE-O1-NEXT:    b.ne LBB1_4
100; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
101; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB1_1 Depth=1
102; CHECK-NOLSE-O1-NEXT:    stxr w10, w9, [x0]
103; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB1_1
104; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
105; CHECK-NOLSE-O1-NEXT:    mov w0, w8
106; CHECK-NOLSE-O1-NEXT:    ret
107; CHECK-NOLSE-O1-NEXT:  LBB1_4: ; %cmpxchg.nostore
108; CHECK-NOLSE-O1-NEXT:    clrex
109; CHECK-NOLSE-O1-NEXT:    mov w0, w8
110; CHECK-NOLSE-O1-NEXT:    ret
111;
112; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_from_load:
113; CHECK-NOLSE-O0:       ; %bb.0:
114; CHECK-NOLSE-O0-NEXT:    mov x9, x0
115; CHECK-NOLSE-O0-NEXT:    ldr w10, [x2]
116; CHECK-NOLSE-O0-NEXT:  LBB1_1: ; =>This Inner Loop Header: Depth=1
117; CHECK-NOLSE-O0-NEXT:    ldaxr w0, [x9]
118; CHECK-NOLSE-O0-NEXT:    cmp w0, w1
119; CHECK-NOLSE-O0-NEXT:    b.ne LBB1_3
120; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB1_1 Depth=1
121; CHECK-NOLSE-O0-NEXT:    stlxr w8, w10, [x9]
122; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB1_1
123; CHECK-NOLSE-O0-NEXT:  LBB1_3:
124; CHECK-NOLSE-O0-NEXT:    ret
125;
126; CHECK-LSE-O1-LABEL: val_compare_and_swap_from_load:
127; CHECK-LSE-O1:       ; %bb.0:
128; CHECK-LSE-O1-NEXT:    ldr w8, [x2]
129; CHECK-LSE-O1-NEXT:    casa w1, w8, [x0]
130; CHECK-LSE-O1-NEXT:    mov x0, x1
131; CHECK-LSE-O1-NEXT:    ret
132;
133; CHECK-LSE-O0-LABEL: val_compare_and_swap_from_load:
134; CHECK-LSE-O0:       ; %bb.0:
135; CHECK-LSE-O0-NEXT:    mov x9, x0
136; CHECK-LSE-O0-NEXT:    mov x0, x1
137; CHECK-LSE-O0-NEXT:    ldr w8, [x2]
138; CHECK-LSE-O0-NEXT:    casa w0, w8, [x9]
139; CHECK-LSE-O0-NEXT:    ret
140;
141; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_from_load:
142; CHECK-LDAPR-O1:       ; %bb.0:
143; CHECK-LDAPR-O1-NEXT:    ldr w9, [x2]
144; CHECK-LDAPR-O1-NEXT:  LBB1_1: ; %cmpxchg.start
145; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
146; CHECK-LDAPR-O1-NEXT:    ldaxr w8, [x0]
147; CHECK-LDAPR-O1-NEXT:    cmp w8, w1
148; CHECK-LDAPR-O1-NEXT:    b.ne LBB1_4
149; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
150; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB1_1 Depth=1
151; CHECK-LDAPR-O1-NEXT:    stxr w10, w9, [x0]
152; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB1_1
153; CHECK-LDAPR-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
154; CHECK-LDAPR-O1-NEXT:    mov w0, w8
155; CHECK-LDAPR-O1-NEXT:    ret
156; CHECK-LDAPR-O1-NEXT:  LBB1_4: ; %cmpxchg.nostore
157; CHECK-LDAPR-O1-NEXT:    clrex
158; CHECK-LDAPR-O1-NEXT:    mov w0, w8
159; CHECK-LDAPR-O1-NEXT:    ret
160;
161; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_from_load:
162; CHECK-LDAPR-O0:       ; %bb.0:
163; CHECK-LDAPR-O0-NEXT:    mov x9, x0
164; CHECK-LDAPR-O0-NEXT:    ldr w10, [x2]
165; CHECK-LDAPR-O0-NEXT:  LBB1_1: ; =>This Inner Loop Header: Depth=1
166; CHECK-LDAPR-O0-NEXT:    ldaxr w0, [x9]
167; CHECK-LDAPR-O0-NEXT:    cmp w0, w1
168; CHECK-LDAPR-O0-NEXT:    b.ne LBB1_3
169; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB1_1 Depth=1
170; CHECK-LDAPR-O0-NEXT:    stlxr w8, w10, [x9]
171; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB1_1
172; CHECK-LDAPR-O0-NEXT:  LBB1_3:
173; CHECK-LDAPR-O0-NEXT:    ret
174  %new = load i32, i32* %pnew
175  %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acquire acquire
176  %val = extractvalue { i32, i1 } %pair, 0
177  ret i32 %val
178}
179
180define i32 @val_compare_and_swap_rel(i32* %p, i32 %cmp, i32 %new) #0 {
181; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_rel:
182; CHECK-NOLSE-O1:       ; %bb.0:
183; CHECK-NOLSE-O1-NEXT:  LBB2_1: ; %cmpxchg.start
184; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
185; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
186; CHECK-NOLSE-O1-NEXT:    cmp w8, w1
187; CHECK-NOLSE-O1-NEXT:    b.ne LBB2_4
188; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
189; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB2_1 Depth=1
190; CHECK-NOLSE-O1-NEXT:    stlxr w9, w2, [x0]
191; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB2_1
192; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
193; CHECK-NOLSE-O1-NEXT:    mov w0, w8
194; CHECK-NOLSE-O1-NEXT:    ret
195; CHECK-NOLSE-O1-NEXT:  LBB2_4: ; %cmpxchg.nostore
196; CHECK-NOLSE-O1-NEXT:    clrex
197; CHECK-NOLSE-O1-NEXT:    mov w0, w8
198; CHECK-NOLSE-O1-NEXT:    ret
199;
200; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_rel:
201; CHECK-NOLSE-O0:       ; %bb.0:
202; CHECK-NOLSE-O0-NEXT:    mov x9, x0
203; CHECK-NOLSE-O0-NEXT:  LBB2_1: ; =>This Inner Loop Header: Depth=1
204; CHECK-NOLSE-O0-NEXT:    ldaxr w0, [x9]
205; CHECK-NOLSE-O0-NEXT:    cmp w0, w1
206; CHECK-NOLSE-O0-NEXT:    b.ne LBB2_3
207; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB2_1 Depth=1
208; CHECK-NOLSE-O0-NEXT:    stlxr w8, w2, [x9]
209; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB2_1
210; CHECK-NOLSE-O0-NEXT:  LBB2_3:
211; CHECK-NOLSE-O0-NEXT:    ret
212;
213; CHECK-LSE-O1-LABEL: val_compare_and_swap_rel:
214; CHECK-LSE-O1:       ; %bb.0:
215; CHECK-LSE-O1-NEXT:    casal w1, w2, [x0]
216; CHECK-LSE-O1-NEXT:    mov x0, x1
217; CHECK-LSE-O1-NEXT:    ret
218;
219; CHECK-LSE-O0-LABEL: val_compare_and_swap_rel:
220; CHECK-LSE-O0:       ; %bb.0:
221; CHECK-LSE-O0-NEXT:    mov x8, x0
222; CHECK-LSE-O0-NEXT:    mov x0, x1
223; CHECK-LSE-O0-NEXT:    casal w0, w2, [x8]
224; CHECK-LSE-O0-NEXT:    ret
225;
226; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_rel:
227; CHECK-LDAPR-O1:       ; %bb.0:
228; CHECK-LDAPR-O1-NEXT:  LBB2_1: ; %cmpxchg.start
229; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
230; CHECK-LDAPR-O1-NEXT:    ldaxr w8, [x0]
231; CHECK-LDAPR-O1-NEXT:    cmp w8, w1
232; CHECK-LDAPR-O1-NEXT:    b.ne LBB2_4
233; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
234; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB2_1 Depth=1
235; CHECK-LDAPR-O1-NEXT:    stlxr w9, w2, [x0]
236; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB2_1
237; CHECK-LDAPR-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
238; CHECK-LDAPR-O1-NEXT:    mov w0, w8
239; CHECK-LDAPR-O1-NEXT:    ret
240; CHECK-LDAPR-O1-NEXT:  LBB2_4: ; %cmpxchg.nostore
241; CHECK-LDAPR-O1-NEXT:    clrex
242; CHECK-LDAPR-O1-NEXT:    mov w0, w8
243; CHECK-LDAPR-O1-NEXT:    ret
244;
245; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_rel:
246; CHECK-LDAPR-O0:       ; %bb.0:
247; CHECK-LDAPR-O0-NEXT:    mov x9, x0
248; CHECK-LDAPR-O0-NEXT:  LBB2_1: ; =>This Inner Loop Header: Depth=1
249; CHECK-LDAPR-O0-NEXT:    ldaxr w0, [x9]
250; CHECK-LDAPR-O0-NEXT:    cmp w0, w1
251; CHECK-LDAPR-O0-NEXT:    b.ne LBB2_3
252; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB2_1 Depth=1
253; CHECK-LDAPR-O0-NEXT:    stlxr w8, w2, [x9]
254; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB2_1
255; CHECK-LDAPR-O0-NEXT:  LBB2_3:
256; CHECK-LDAPR-O0-NEXT:    ret
257  %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acq_rel monotonic
258  %val = extractvalue { i32, i1 } %pair, 0
259  ret i32 %val
260}
261
262define i64 @val_compare_and_swap_64(i64* %p, i64 %cmp, i64 %new) #0 {
263; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64:
264; CHECK-NOLSE-O1:       ; %bb.0:
265; CHECK-NOLSE-O1-NEXT:  LBB3_1: ; %cmpxchg.start
266; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
267; CHECK-NOLSE-O1-NEXT:    ldxr x8, [x0]
268; CHECK-NOLSE-O1-NEXT:    cmp x8, x1
269; CHECK-NOLSE-O1-NEXT:    b.ne LBB3_4
270; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
271; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB3_1 Depth=1
272; CHECK-NOLSE-O1-NEXT:    stxr w9, x2, [x0]
273; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB3_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:  LBB3_4: ; %cmpxchg.nostore
278; CHECK-NOLSE-O1-NEXT:    clrex
279; CHECK-NOLSE-O1-NEXT:    mov x0, x8
280; CHECK-NOLSE-O1-NEXT:    ret
281;
282; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64:
283; CHECK-NOLSE-O0:       ; %bb.0:
284; CHECK-NOLSE-O0-NEXT:    mov x9, x0
285; CHECK-NOLSE-O0-NEXT:  LBB3_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 LBB3_3
289; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB3_1 Depth=1
290; CHECK-NOLSE-O0-NEXT:    stlxr w8, x2, [x9]
291; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB3_1
292; CHECK-NOLSE-O0-NEXT:  LBB3_3:
293; CHECK-NOLSE-O0-NEXT:    ret
294;
295; CHECK-LSE-O1-LABEL: val_compare_and_swap_64:
296; CHECK-LSE-O1:       ; %bb.0:
297; CHECK-LSE-O1-NEXT:    cas x1, x2, [x0]
298; CHECK-LSE-O1-NEXT:    mov x0, x1
299; CHECK-LSE-O1-NEXT:    ret
300;
301; CHECK-LSE-O0-LABEL: val_compare_and_swap_64:
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:    cas x0, x2, [x8]
306; CHECK-LSE-O0-NEXT:    ret
307;
308; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_64:
309; CHECK-LDAPR-O1:       ; %bb.0:
310; CHECK-LDAPR-O1-NEXT:  LBB3_1: ; %cmpxchg.start
311; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
312; CHECK-LDAPR-O1-NEXT:    ldxr x8, [x0]
313; CHECK-LDAPR-O1-NEXT:    cmp x8, x1
314; CHECK-LDAPR-O1-NEXT:    b.ne LBB3_4
315; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
316; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB3_1 Depth=1
317; CHECK-LDAPR-O1-NEXT:    stxr w9, x2, [x0]
318; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB3_1
319; CHECK-LDAPR-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
320; CHECK-LDAPR-O1-NEXT:    mov x0, x8
321; CHECK-LDAPR-O1-NEXT:    ret
322; CHECK-LDAPR-O1-NEXT:  LBB3_4: ; %cmpxchg.nostore
323; CHECK-LDAPR-O1-NEXT:    clrex
324; CHECK-LDAPR-O1-NEXT:    mov x0, x8
325; CHECK-LDAPR-O1-NEXT:    ret
326;
327; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_64:
328; CHECK-LDAPR-O0:       ; %bb.0:
329; CHECK-LDAPR-O0-NEXT:    mov x9, x0
330; CHECK-LDAPR-O0-NEXT:  LBB3_1: ; =>This Inner Loop Header: Depth=1
331; CHECK-LDAPR-O0-NEXT:    ldaxr x0, [x9]
332; CHECK-LDAPR-O0-NEXT:    cmp x0, x1
333; CHECK-LDAPR-O0-NEXT:    b.ne LBB3_3
334; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB3_1 Depth=1
335; CHECK-LDAPR-O0-NEXT:    stlxr w8, x2, [x9]
336; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB3_1
337; CHECK-LDAPR-O0-NEXT:  LBB3_3:
338; CHECK-LDAPR-O0-NEXT:    ret
339  %pair = cmpxchg i64* %p, i64 %cmp, i64 %new monotonic monotonic
340  %val = extractvalue { i64, i1 } %pair, 0
341  ret i64 %val
342}
343
344define i64 @val_compare_and_swap_64_monotonic_seqcst(i64* %p, i64 %cmp, i64 %new) #0 {
345; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:
346; CHECK-NOLSE-O1:       ; %bb.0:
347; CHECK-NOLSE-O1-NEXT:  LBB4_1: ; %cmpxchg.start
348; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
349; CHECK-NOLSE-O1-NEXT:    ldaxr x8, [x0]
350; CHECK-NOLSE-O1-NEXT:    cmp x8, x1
351; CHECK-NOLSE-O1-NEXT:    b.ne LBB4_4
352; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
353; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB4_1 Depth=1
354; CHECK-NOLSE-O1-NEXT:    stlxr w9, x2, [x0]
355; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB4_1
356; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
357; CHECK-NOLSE-O1-NEXT:    mov x0, x8
358; CHECK-NOLSE-O1-NEXT:    ret
359; CHECK-NOLSE-O1-NEXT:  LBB4_4: ; %cmpxchg.nostore
360; CHECK-NOLSE-O1-NEXT:    clrex
361; CHECK-NOLSE-O1-NEXT:    mov x0, x8
362; CHECK-NOLSE-O1-NEXT:    ret
363;
364; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:
365; CHECK-NOLSE-O0:       ; %bb.0:
366; CHECK-NOLSE-O0-NEXT:    mov x9, x0
367; CHECK-NOLSE-O0-NEXT:  LBB4_1: ; =>This Inner Loop Header: Depth=1
368; CHECK-NOLSE-O0-NEXT:    ldaxr x0, [x9]
369; CHECK-NOLSE-O0-NEXT:    cmp x0, x1
370; CHECK-NOLSE-O0-NEXT:    b.ne LBB4_3
371; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB4_1 Depth=1
372; CHECK-NOLSE-O0-NEXT:    stlxr w8, x2, [x9]
373; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB4_1
374; CHECK-NOLSE-O0-NEXT:  LBB4_3:
375; CHECK-NOLSE-O0-NEXT:    ret
376;
377; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:
378; CHECK-LSE-O1:       ; %bb.0:
379; CHECK-LSE-O1-NEXT:    casal x1, x2, [x0]
380; CHECK-LSE-O1-NEXT:    mov x0, x1
381; CHECK-LSE-O1-NEXT:    ret
382;
383; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:
384; CHECK-LSE-O0:       ; %bb.0:
385; CHECK-LSE-O0-NEXT:    mov x8, x0
386; CHECK-LSE-O0-NEXT:    mov x0, x1
387; CHECK-LSE-O0-NEXT:    casal x0, x2, [x8]
388; CHECK-LSE-O0-NEXT:    ret
389;
390; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:
391; CHECK-LDAPR-O1:       ; %bb.0:
392; CHECK-LDAPR-O1-NEXT:  LBB4_1: ; %cmpxchg.start
393; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
394; CHECK-LDAPR-O1-NEXT:    ldaxr x8, [x0]
395; CHECK-LDAPR-O1-NEXT:    cmp x8, x1
396; CHECK-LDAPR-O1-NEXT:    b.ne LBB4_4
397; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
398; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB4_1 Depth=1
399; CHECK-LDAPR-O1-NEXT:    stlxr w9, x2, [x0]
400; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB4_1
401; CHECK-LDAPR-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
402; CHECK-LDAPR-O1-NEXT:    mov x0, x8
403; CHECK-LDAPR-O1-NEXT:    ret
404; CHECK-LDAPR-O1-NEXT:  LBB4_4: ; %cmpxchg.nostore
405; CHECK-LDAPR-O1-NEXT:    clrex
406; CHECK-LDAPR-O1-NEXT:    mov x0, x8
407; CHECK-LDAPR-O1-NEXT:    ret
408;
409; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:
410; CHECK-LDAPR-O0:       ; %bb.0:
411; CHECK-LDAPR-O0-NEXT:    mov x9, x0
412; CHECK-LDAPR-O0-NEXT:  LBB4_1: ; =>This Inner Loop Header: Depth=1
413; CHECK-LDAPR-O0-NEXT:    ldaxr x0, [x9]
414; CHECK-LDAPR-O0-NEXT:    cmp x0, x1
415; CHECK-LDAPR-O0-NEXT:    b.ne LBB4_3
416; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB4_1 Depth=1
417; CHECK-LDAPR-O0-NEXT:    stlxr w8, x2, [x9]
418; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB4_1
419; CHECK-LDAPR-O0-NEXT:  LBB4_3:
420; CHECK-LDAPR-O0-NEXT:    ret
421  %pair = cmpxchg i64* %p, i64 %cmp, i64 %new monotonic seq_cst
422  %val = extractvalue { i64, i1 } %pair, 0
423  ret i64 %val
424}
425
426define i64 @val_compare_and_swap_64_release_acquire(i64* %p, i64 %cmp, i64 %new) #0 {
427; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_release_acquire:
428; CHECK-NOLSE-O1:       ; %bb.0:
429; CHECK-NOLSE-O1-NEXT:  LBB5_1: ; %cmpxchg.start
430; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
431; CHECK-NOLSE-O1-NEXT:    ldaxr x8, [x0]
432; CHECK-NOLSE-O1-NEXT:    cmp x8, x1
433; CHECK-NOLSE-O1-NEXT:    b.ne LBB5_4
434; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
435; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB5_1 Depth=1
436; CHECK-NOLSE-O1-NEXT:    stlxr w9, x2, [x0]
437; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB5_1
438; CHECK-NOLSE-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
439; CHECK-NOLSE-O1-NEXT:    mov x0, x8
440; CHECK-NOLSE-O1-NEXT:    ret
441; CHECK-NOLSE-O1-NEXT:  LBB5_4: ; %cmpxchg.nostore
442; CHECK-NOLSE-O1-NEXT:    clrex
443; CHECK-NOLSE-O1-NEXT:    mov x0, x8
444; CHECK-NOLSE-O1-NEXT:    ret
445;
446; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_release_acquire:
447; CHECK-NOLSE-O0:       ; %bb.0:
448; CHECK-NOLSE-O0-NEXT:    mov x9, x0
449; CHECK-NOLSE-O0-NEXT:  LBB5_1: ; =>This Inner Loop Header: Depth=1
450; CHECK-NOLSE-O0-NEXT:    ldaxr x0, [x9]
451; CHECK-NOLSE-O0-NEXT:    cmp x0, x1
452; CHECK-NOLSE-O0-NEXT:    b.ne LBB5_3
453; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB5_1 Depth=1
454; CHECK-NOLSE-O0-NEXT:    stlxr w8, x2, [x9]
455; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB5_1
456; CHECK-NOLSE-O0-NEXT:  LBB5_3:
457; CHECK-NOLSE-O0-NEXT:    ret
458;
459; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_release_acquire:
460; CHECK-LSE-O1:       ; %bb.0:
461; CHECK-LSE-O1-NEXT:    casal x1, x2, [x0]
462; CHECK-LSE-O1-NEXT:    mov x0, x1
463; CHECK-LSE-O1-NEXT:    ret
464;
465; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_release_acquire:
466; CHECK-LSE-O0:       ; %bb.0:
467; CHECK-LSE-O0-NEXT:    mov x8, x0
468; CHECK-LSE-O0-NEXT:    mov x0, x1
469; CHECK-LSE-O0-NEXT:    casal x0, x2, [x8]
470; CHECK-LSE-O0-NEXT:    ret
471;
472; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_64_release_acquire:
473; CHECK-LDAPR-O1:       ; %bb.0:
474; CHECK-LDAPR-O1-NEXT:  LBB5_1: ; %cmpxchg.start
475; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
476; CHECK-LDAPR-O1-NEXT:    ldaxr x8, [x0]
477; CHECK-LDAPR-O1-NEXT:    cmp x8, x1
478; CHECK-LDAPR-O1-NEXT:    b.ne LBB5_4
479; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
480; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB5_1 Depth=1
481; CHECK-LDAPR-O1-NEXT:    stlxr w9, x2, [x0]
482; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB5_1
483; CHECK-LDAPR-O1-NEXT:  ; %bb.3: ; %cmpxchg.end
484; CHECK-LDAPR-O1-NEXT:    mov x0, x8
485; CHECK-LDAPR-O1-NEXT:    ret
486; CHECK-LDAPR-O1-NEXT:  LBB5_4: ; %cmpxchg.nostore
487; CHECK-LDAPR-O1-NEXT:    clrex
488; CHECK-LDAPR-O1-NEXT:    mov x0, x8
489; CHECK-LDAPR-O1-NEXT:    ret
490;
491; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_64_release_acquire:
492; CHECK-LDAPR-O0:       ; %bb.0:
493; CHECK-LDAPR-O0-NEXT:    mov x9, x0
494; CHECK-LDAPR-O0-NEXT:  LBB5_1: ; =>This Inner Loop Header: Depth=1
495; CHECK-LDAPR-O0-NEXT:    ldaxr x0, [x9]
496; CHECK-LDAPR-O0-NEXT:    cmp x0, x1
497; CHECK-LDAPR-O0-NEXT:    b.ne LBB5_3
498; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB5_1 Depth=1
499; CHECK-LDAPR-O0-NEXT:    stlxr w8, x2, [x9]
500; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB5_1
501; CHECK-LDAPR-O0-NEXT:  LBB5_3:
502; CHECK-LDAPR-O0-NEXT:    ret
503  %pair = cmpxchg i64* %p, i64 %cmp, i64 %new release acquire
504  %val = extractvalue { i64, i1 } %pair, 0
505  ret i64 %val
506}
507
508define i32 @fetch_and_nand(i32* %p) #0 {
509; CHECK-NOLSE-O1-LABEL: fetch_and_nand:
510; CHECK-NOLSE-O1:       ; %bb.0:
511; CHECK-NOLSE-O1-NEXT:  LBB6_1: ; %atomicrmw.start
512; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
513; CHECK-NOLSE-O1-NEXT:    ldxr w8, [x0]
514; CHECK-NOLSE-O1-NEXT:    and w9, w8, #0x7
515; CHECK-NOLSE-O1-NEXT:    mvn w9, w9
516; CHECK-NOLSE-O1-NEXT:    stlxr w10, w9, [x0]
517; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB6_1
518; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
519; CHECK-NOLSE-O1-NEXT:    mov w0, w8
520; CHECK-NOLSE-O1-NEXT:    ret
521;
522; CHECK-NOLSE-O0-LABEL: fetch_and_nand:
523; CHECK-NOLSE-O0:       ; %bb.0:
524; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
525; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
526; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0]
527; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
528; CHECK-NOLSE-O0-NEXT:    b LBB6_1
529; CHECK-NOLSE-O0-NEXT:  LBB6_1: ; %atomicrmw.start
530; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
531; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB6_2 Depth 2
532; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
533; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
534; CHECK-NOLSE-O0-NEXT:    and w9, w8, #0x7
535; CHECK-NOLSE-O0-NEXT:    mvn w12, w9
536; CHECK-NOLSE-O0-NEXT:  LBB6_2: ; %atomicrmw.start
537; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB6_1 Depth=1
538; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
539; CHECK-NOLSE-O0-NEXT:    ldaxr w9, [x11]
540; CHECK-NOLSE-O0-NEXT:    cmp w9, w8
541; CHECK-NOLSE-O0-NEXT:    b.ne LBB6_4
542; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
543; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB6_2 Depth=2
544; CHECK-NOLSE-O0-NEXT:    stlxr w10, w12, [x11]
545; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB6_2
546; CHECK-NOLSE-O0-NEXT:  LBB6_4: ; %atomicrmw.start
547; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB6_1 Depth=1
548; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
549; CHECK-NOLSE-O0-NEXT:    subs w8, w9, w8
550; CHECK-NOLSE-O0-NEXT:    cset w8, eq
551; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
552; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB6_1
553; CHECK-NOLSE-O0-NEXT:    b LBB6_5
554; CHECK-NOLSE-O0-NEXT:  LBB6_5: ; %atomicrmw.end
555; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
556; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
557; CHECK-NOLSE-O0-NEXT:    ret
558;
559; CHECK-LSE-O1-LABEL: fetch_and_nand:
560; CHECK-LSE-O1:       ; %bb.0:
561; CHECK-LSE-O1-NEXT:  LBB6_1: ; %atomicrmw.start
562; CHECK-LSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
563; CHECK-LSE-O1-NEXT:    ldxr w8, [x0]
564; CHECK-LSE-O1-NEXT:    and w9, w8, #0x7
565; CHECK-LSE-O1-NEXT:    mvn w9, w9
566; CHECK-LSE-O1-NEXT:    stlxr w10, w9, [x0]
567; CHECK-LSE-O1-NEXT:    cbnz w10, LBB6_1
568; CHECK-LSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
569; CHECK-LSE-O1-NEXT:    mov x0, x8
570; CHECK-LSE-O1-NEXT:    ret
571;
572; CHECK-LSE-O0-LABEL: fetch_and_nand:
573; CHECK-LSE-O0:       ; %bb.0:
574; CHECK-LSE-O0-NEXT:    sub sp, sp, #32
575; CHECK-LSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
576; CHECK-LSE-O0-NEXT:    ldr w8, [x0]
577; CHECK-LSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
578; CHECK-LSE-O0-NEXT:    b LBB6_1
579; CHECK-LSE-O0-NEXT:  LBB6_1: ; %atomicrmw.start
580; CHECK-LSE-O0-NEXT:    ; =>This Inner Loop Header: Depth=1
581; CHECK-LSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
582; CHECK-LSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
583; CHECK-LSE-O0-NEXT:    and w9, w8, #0x7
584; CHECK-LSE-O0-NEXT:    mvn w10, w9
585; CHECK-LSE-O0-NEXT:    mov x9, x8
586; CHECK-LSE-O0-NEXT:    casl w9, w10, [x11]
587; CHECK-LSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
588; CHECK-LSE-O0-NEXT:    subs w8, w9, w8
589; CHECK-LSE-O0-NEXT:    cset w8, eq
590; CHECK-LSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
591; CHECK-LSE-O0-NEXT:    tbz w8, #0, LBB6_1
592; CHECK-LSE-O0-NEXT:    b LBB6_2
593; CHECK-LSE-O0-NEXT:  LBB6_2: ; %atomicrmw.end
594; CHECK-LSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
595; CHECK-LSE-O0-NEXT:    add sp, sp, #32
596; CHECK-LSE-O0-NEXT:    ret
597;
598; CHECK-LDAPR-O1-LABEL: fetch_and_nand:
599; CHECK-LDAPR-O1:       ; %bb.0:
600; CHECK-LDAPR-O1-NEXT:  LBB6_1: ; %atomicrmw.start
601; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
602; CHECK-LDAPR-O1-NEXT:    ldxr w8, [x0]
603; CHECK-LDAPR-O1-NEXT:    and w9, w8, #0x7
604; CHECK-LDAPR-O1-NEXT:    mvn w9, w9
605; CHECK-LDAPR-O1-NEXT:    stlxr w10, w9, [x0]
606; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB6_1
607; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
608; CHECK-LDAPR-O1-NEXT:    mov w0, w8
609; CHECK-LDAPR-O1-NEXT:    ret
610;
611; CHECK-LDAPR-O0-LABEL: fetch_and_nand:
612; CHECK-LDAPR-O0:       ; %bb.0:
613; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
614; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
615; CHECK-LDAPR-O0-NEXT:    ldr w8, [x0]
616; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
617; CHECK-LDAPR-O0-NEXT:    b LBB6_1
618; CHECK-LDAPR-O0-NEXT:  LBB6_1: ; %atomicrmw.start
619; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
620; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB6_2 Depth 2
621; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
622; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
623; CHECK-LDAPR-O0-NEXT:    and w9, w8, #0x7
624; CHECK-LDAPR-O0-NEXT:    mvn w12, w9
625; CHECK-LDAPR-O0-NEXT:  LBB6_2: ; %atomicrmw.start
626; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB6_1 Depth=1
627; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
628; CHECK-LDAPR-O0-NEXT:    ldaxr w9, [x11]
629; CHECK-LDAPR-O0-NEXT:    cmp w9, w8
630; CHECK-LDAPR-O0-NEXT:    b.ne LBB6_4
631; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
632; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB6_2 Depth=2
633; CHECK-LDAPR-O0-NEXT:    stlxr w10, w12, [x11]
634; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB6_2
635; CHECK-LDAPR-O0-NEXT:  LBB6_4: ; %atomicrmw.start
636; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB6_1 Depth=1
637; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
638; CHECK-LDAPR-O0-NEXT:    subs w8, w9, w8
639; CHECK-LDAPR-O0-NEXT:    cset w8, eq
640; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
641; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB6_1
642; CHECK-LDAPR-O0-NEXT:    b LBB6_5
643; CHECK-LDAPR-O0-NEXT:  LBB6_5: ; %atomicrmw.end
644; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
645; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
646; CHECK-LDAPR-O0-NEXT:    ret
647  %val = atomicrmw nand i32* %p, i32 7 release
648  ret i32 %val
649}
650
651define i64 @fetch_and_nand_64(i64* %p) #0 {
652; CHECK-NOLSE-O1-LABEL: fetch_and_nand_64:
653; CHECK-NOLSE-O1:       ; %bb.0:
654; CHECK-NOLSE-O1-NEXT:  LBB7_1: ; %atomicrmw.start
655; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
656; CHECK-NOLSE-O1-NEXT:    ldaxr x8, [x0]
657; CHECK-NOLSE-O1-NEXT:    and x9, x8, #0x7
658; CHECK-NOLSE-O1-NEXT:    mvn x9, x9
659; CHECK-NOLSE-O1-NEXT:    stlxr w10, x9, [x0]
660; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB7_1
661; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
662; CHECK-NOLSE-O1-NEXT:    mov x0, x8
663; CHECK-NOLSE-O1-NEXT:    ret
664;
665; CHECK-NOLSE-O0-LABEL: fetch_and_nand_64:
666; CHECK-NOLSE-O0:       ; %bb.0:
667; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
668; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
669; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0]
670; CHECK-NOLSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
671; CHECK-NOLSE-O0-NEXT:    b LBB7_1
672; CHECK-NOLSE-O0-NEXT:  LBB7_1: ; %atomicrmw.start
673; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
674; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB7_2 Depth 2
675; CHECK-NOLSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
676; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
677; CHECK-NOLSE-O0-NEXT:    and x9, x8, #0x7
678; CHECK-NOLSE-O0-NEXT:    mvn x12, x9
679; CHECK-NOLSE-O0-NEXT:  LBB7_2: ; %atomicrmw.start
680; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB7_1 Depth=1
681; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
682; CHECK-NOLSE-O0-NEXT:    ldaxr x9, [x11]
683; CHECK-NOLSE-O0-NEXT:    cmp x9, x8
684; CHECK-NOLSE-O0-NEXT:    b.ne LBB7_4
685; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
686; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB7_2 Depth=2
687; CHECK-NOLSE-O0-NEXT:    stlxr w10, x12, [x11]
688; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB7_2
689; CHECK-NOLSE-O0-NEXT:  LBB7_4: ; %atomicrmw.start
690; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB7_1 Depth=1
691; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
692; CHECK-NOLSE-O0-NEXT:    subs x8, x9, x8
693; CHECK-NOLSE-O0-NEXT:    cset w8, eq
694; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
695; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB7_1
696; CHECK-NOLSE-O0-NEXT:    b LBB7_5
697; CHECK-NOLSE-O0-NEXT:  LBB7_5: ; %atomicrmw.end
698; CHECK-NOLSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
699; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
700; CHECK-NOLSE-O0-NEXT:    ret
701;
702; CHECK-LSE-O1-LABEL: fetch_and_nand_64:
703; CHECK-LSE-O1:       ; %bb.0:
704; CHECK-LSE-O1-NEXT:  LBB7_1: ; %atomicrmw.start
705; CHECK-LSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
706; CHECK-LSE-O1-NEXT:    ldaxr x8, [x0]
707; CHECK-LSE-O1-NEXT:    and x9, x8, #0x7
708; CHECK-LSE-O1-NEXT:    mvn x9, x9
709; CHECK-LSE-O1-NEXT:    stlxr w10, x9, [x0]
710; CHECK-LSE-O1-NEXT:    cbnz w10, LBB7_1
711; CHECK-LSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
712; CHECK-LSE-O1-NEXT:    mov x0, x8
713; CHECK-LSE-O1-NEXT:    ret
714;
715; CHECK-LSE-O0-LABEL: fetch_and_nand_64:
716; CHECK-LSE-O0:       ; %bb.0:
717; CHECK-LSE-O0-NEXT:    sub sp, sp, #32
718; CHECK-LSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
719; CHECK-LSE-O0-NEXT:    ldr x8, [x0]
720; CHECK-LSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
721; CHECK-LSE-O0-NEXT:    b LBB7_1
722; CHECK-LSE-O0-NEXT:  LBB7_1: ; %atomicrmw.start
723; CHECK-LSE-O0-NEXT:    ; =>This Inner Loop Header: Depth=1
724; CHECK-LSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
725; CHECK-LSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
726; CHECK-LSE-O0-NEXT:    and x9, x8, #0x7
727; CHECK-LSE-O0-NEXT:    mvn x10, x9
728; CHECK-LSE-O0-NEXT:    mov x9, x8
729; CHECK-LSE-O0-NEXT:    casal x9, x10, [x11]
730; CHECK-LSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
731; CHECK-LSE-O0-NEXT:    subs x8, x9, x8
732; CHECK-LSE-O0-NEXT:    cset w8, eq
733; CHECK-LSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
734; CHECK-LSE-O0-NEXT:    tbz w8, #0, LBB7_1
735; CHECK-LSE-O0-NEXT:    b LBB7_2
736; CHECK-LSE-O0-NEXT:  LBB7_2: ; %atomicrmw.end
737; CHECK-LSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
738; CHECK-LSE-O0-NEXT:    add sp, sp, #32
739; CHECK-LSE-O0-NEXT:    ret
740;
741; CHECK-LDAPR-O1-LABEL: fetch_and_nand_64:
742; CHECK-LDAPR-O1:       ; %bb.0:
743; CHECK-LDAPR-O1-NEXT:  LBB7_1: ; %atomicrmw.start
744; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
745; CHECK-LDAPR-O1-NEXT:    ldaxr x8, [x0]
746; CHECK-LDAPR-O1-NEXT:    and x9, x8, #0x7
747; CHECK-LDAPR-O1-NEXT:    mvn x9, x9
748; CHECK-LDAPR-O1-NEXT:    stlxr w10, x9, [x0]
749; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB7_1
750; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
751; CHECK-LDAPR-O1-NEXT:    mov x0, x8
752; CHECK-LDAPR-O1-NEXT:    ret
753;
754; CHECK-LDAPR-O0-LABEL: fetch_and_nand_64:
755; CHECK-LDAPR-O0:       ; %bb.0:
756; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
757; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
758; CHECK-LDAPR-O0-NEXT:    ldr x8, [x0]
759; CHECK-LDAPR-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
760; CHECK-LDAPR-O0-NEXT:    b LBB7_1
761; CHECK-LDAPR-O0-NEXT:  LBB7_1: ; %atomicrmw.start
762; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
763; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB7_2 Depth 2
764; CHECK-LDAPR-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
765; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
766; CHECK-LDAPR-O0-NEXT:    and x9, x8, #0x7
767; CHECK-LDAPR-O0-NEXT:    mvn x12, x9
768; CHECK-LDAPR-O0-NEXT:  LBB7_2: ; %atomicrmw.start
769; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB7_1 Depth=1
770; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
771; CHECK-LDAPR-O0-NEXT:    ldaxr x9, [x11]
772; CHECK-LDAPR-O0-NEXT:    cmp x9, x8
773; CHECK-LDAPR-O0-NEXT:    b.ne LBB7_4
774; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
775; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB7_2 Depth=2
776; CHECK-LDAPR-O0-NEXT:    stlxr w10, x12, [x11]
777; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB7_2
778; CHECK-LDAPR-O0-NEXT:  LBB7_4: ; %atomicrmw.start
779; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB7_1 Depth=1
780; CHECK-LDAPR-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
781; CHECK-LDAPR-O0-NEXT:    subs x8, x9, x8
782; CHECK-LDAPR-O0-NEXT:    cset w8, eq
783; CHECK-LDAPR-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
784; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB7_1
785; CHECK-LDAPR-O0-NEXT:    b LBB7_5
786; CHECK-LDAPR-O0-NEXT:  LBB7_5: ; %atomicrmw.end
787; CHECK-LDAPR-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
788; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
789; CHECK-LDAPR-O0-NEXT:    ret
790  %val = atomicrmw nand i64* %p, i64 7 acq_rel
791  ret i64 %val
792}
793
794define i32 @fetch_and_or(i32* %p) #0 {
795; CHECK-NOLSE-O1-LABEL: fetch_and_or:
796; CHECK-NOLSE-O1:       ; %bb.0:
797; CHECK-NOLSE-O1-NEXT:    mov w9, #5
798; CHECK-NOLSE-O1-NEXT:  LBB8_1: ; %atomicrmw.start
799; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
800; CHECK-NOLSE-O1-NEXT:    ldaxr w8, [x0]
801; CHECK-NOLSE-O1-NEXT:    orr w10, w8, w9
802; CHECK-NOLSE-O1-NEXT:    stlxr w11, w10, [x0]
803; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB8_1
804; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
805; CHECK-NOLSE-O1-NEXT:    mov w0, w8
806; CHECK-NOLSE-O1-NEXT:    ret
807;
808; CHECK-NOLSE-O0-LABEL: fetch_and_or:
809; CHECK-NOLSE-O0:       ; %bb.0:
810; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
811; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
812; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0]
813; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
814; CHECK-NOLSE-O0-NEXT:    b LBB8_1
815; CHECK-NOLSE-O0-NEXT:  LBB8_1: ; %atomicrmw.start
816; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
817; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB8_2 Depth 2
818; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
819; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
820; CHECK-NOLSE-O0-NEXT:    mov w9, #5
821; CHECK-NOLSE-O0-NEXT:    orr w12, w8, w9
822; CHECK-NOLSE-O0-NEXT:  LBB8_2: ; %atomicrmw.start
823; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB8_1 Depth=1
824; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
825; CHECK-NOLSE-O0-NEXT:    ldaxr w9, [x11]
826; CHECK-NOLSE-O0-NEXT:    cmp w9, w8
827; CHECK-NOLSE-O0-NEXT:    b.ne LBB8_4
828; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
829; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB8_2 Depth=2
830; CHECK-NOLSE-O0-NEXT:    stlxr w10, w12, [x11]
831; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB8_2
832; CHECK-NOLSE-O0-NEXT:  LBB8_4: ; %atomicrmw.start
833; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB8_1 Depth=1
834; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
835; CHECK-NOLSE-O0-NEXT:    subs w8, w9, w8
836; CHECK-NOLSE-O0-NEXT:    cset w8, eq
837; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
838; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB8_1
839; CHECK-NOLSE-O0-NEXT:    b LBB8_5
840; CHECK-NOLSE-O0-NEXT:  LBB8_5: ; %atomicrmw.end
841; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
842; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
843; CHECK-NOLSE-O0-NEXT:    ret
844;
845; CHECK-LSE-O1-LABEL: fetch_and_or:
846; CHECK-LSE-O1:       ; %bb.0:
847; CHECK-LSE-O1-NEXT:    mov w8, #5
848; CHECK-LSE-O1-NEXT:    ldsetal w8, w0, [x0]
849; CHECK-LSE-O1-NEXT:    ret
850;
851; CHECK-LSE-O0-LABEL: fetch_and_or:
852; CHECK-LSE-O0:       ; %bb.0:
853; CHECK-LSE-O0-NEXT:    mov w8, #5
854; CHECK-LSE-O0-NEXT:    ldsetal w8, w0, [x0]
855; CHECK-LSE-O0-NEXT:    ret
856;
857; CHECK-LDAPR-O1-LABEL: fetch_and_or:
858; CHECK-LDAPR-O1:       ; %bb.0:
859; CHECK-LDAPR-O1-NEXT:    mov w9, #5
860; CHECK-LDAPR-O1-NEXT:  LBB8_1: ; %atomicrmw.start
861; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
862; CHECK-LDAPR-O1-NEXT:    ldaxr w8, [x0]
863; CHECK-LDAPR-O1-NEXT:    orr w10, w8, w9
864; CHECK-LDAPR-O1-NEXT:    stlxr w11, w10, [x0]
865; CHECK-LDAPR-O1-NEXT:    cbnz w11, LBB8_1
866; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
867; CHECK-LDAPR-O1-NEXT:    mov w0, w8
868; CHECK-LDAPR-O1-NEXT:    ret
869;
870; CHECK-LDAPR-O0-LABEL: fetch_and_or:
871; CHECK-LDAPR-O0:       ; %bb.0:
872; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
873; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
874; CHECK-LDAPR-O0-NEXT:    ldr w8, [x0]
875; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
876; CHECK-LDAPR-O0-NEXT:    b LBB8_1
877; CHECK-LDAPR-O0-NEXT:  LBB8_1: ; %atomicrmw.start
878; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
879; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB8_2 Depth 2
880; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
881; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
882; CHECK-LDAPR-O0-NEXT:    mov w9, #5
883; CHECK-LDAPR-O0-NEXT:    orr w12, w8, w9
884; CHECK-LDAPR-O0-NEXT:  LBB8_2: ; %atomicrmw.start
885; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB8_1 Depth=1
886; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
887; CHECK-LDAPR-O0-NEXT:    ldaxr w9, [x11]
888; CHECK-LDAPR-O0-NEXT:    cmp w9, w8
889; CHECK-LDAPR-O0-NEXT:    b.ne LBB8_4
890; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
891; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB8_2 Depth=2
892; CHECK-LDAPR-O0-NEXT:    stlxr w10, w12, [x11]
893; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB8_2
894; CHECK-LDAPR-O0-NEXT:  LBB8_4: ; %atomicrmw.start
895; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB8_1 Depth=1
896; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
897; CHECK-LDAPR-O0-NEXT:    subs w8, w9, w8
898; CHECK-LDAPR-O0-NEXT:    cset w8, eq
899; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
900; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB8_1
901; CHECK-LDAPR-O0-NEXT:    b LBB8_5
902; CHECK-LDAPR-O0-NEXT:  LBB8_5: ; %atomicrmw.end
903; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
904; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
905; CHECK-LDAPR-O0-NEXT:    ret
906  %val = atomicrmw or i32* %p, i32 5 seq_cst
907  ret i32 %val
908}
909
910define i64 @fetch_and_or_64(i64* %p) #0 {
911; CHECK-NOLSE-O1-LABEL: fetch_and_or_64:
912; CHECK-NOLSE-O1:       ; %bb.0:
913; CHECK-NOLSE-O1-NEXT:  LBB9_1: ; %atomicrmw.start
914; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
915; CHECK-NOLSE-O1-NEXT:    ldxr x8, [x0]
916; CHECK-NOLSE-O1-NEXT:    orr x9, x8, #0x7
917; CHECK-NOLSE-O1-NEXT:    stxr w10, x9, [x0]
918; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB9_1
919; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
920; CHECK-NOLSE-O1-NEXT:    mov x0, x8
921; CHECK-NOLSE-O1-NEXT:    ret
922;
923; CHECK-NOLSE-O0-LABEL: fetch_and_or_64:
924; CHECK-NOLSE-O0:       ; %bb.0:
925; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
926; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
927; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0]
928; CHECK-NOLSE-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
929; CHECK-NOLSE-O0-NEXT:    b LBB9_1
930; CHECK-NOLSE-O0-NEXT:  LBB9_1: ; %atomicrmw.start
931; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
932; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB9_2 Depth 2
933; CHECK-NOLSE-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
934; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
935; CHECK-NOLSE-O0-NEXT:    orr x12, x8, #0x7
936; CHECK-NOLSE-O0-NEXT:  LBB9_2: ; %atomicrmw.start
937; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB9_1 Depth=1
938; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
939; CHECK-NOLSE-O0-NEXT:    ldaxr x9, [x11]
940; CHECK-NOLSE-O0-NEXT:    cmp x9, x8
941; CHECK-NOLSE-O0-NEXT:    b.ne LBB9_4
942; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
943; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB9_2 Depth=2
944; CHECK-NOLSE-O0-NEXT:    stlxr w10, x12, [x11]
945; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB9_2
946; CHECK-NOLSE-O0-NEXT:  LBB9_4: ; %atomicrmw.start
947; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB9_1 Depth=1
948; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
949; CHECK-NOLSE-O0-NEXT:    subs x8, x9, x8
950; CHECK-NOLSE-O0-NEXT:    cset w8, eq
951; CHECK-NOLSE-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
952; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB9_1
953; CHECK-NOLSE-O0-NEXT:    b LBB9_5
954; CHECK-NOLSE-O0-NEXT:  LBB9_5: ; %atomicrmw.end
955; CHECK-NOLSE-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
956; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
957; CHECK-NOLSE-O0-NEXT:    ret
958;
959; CHECK-LSE-O1-LABEL: fetch_and_or_64:
960; CHECK-LSE-O1:       ; %bb.0:
961; CHECK-LSE-O1-NEXT:    mov w8, #7
962; CHECK-LSE-O1-NEXT:    ldset x8, x0, [x0]
963; CHECK-LSE-O1-NEXT:    ret
964;
965; CHECK-LSE-O0-LABEL: fetch_and_or_64:
966; CHECK-LSE-O0:       ; %bb.0:
967; CHECK-LSE-O0-NEXT:    mov w8, #7
968; CHECK-LSE-O0-NEXT:    ; kill: def $x8 killed $w8
969; CHECK-LSE-O0-NEXT:    ldset x8, x0, [x0]
970; CHECK-LSE-O0-NEXT:    ret
971;
972; CHECK-LDAPR-O1-LABEL: fetch_and_or_64:
973; CHECK-LDAPR-O1:       ; %bb.0:
974; CHECK-LDAPR-O1-NEXT:  LBB9_1: ; %atomicrmw.start
975; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
976; CHECK-LDAPR-O1-NEXT:    ldxr x8, [x0]
977; CHECK-LDAPR-O1-NEXT:    orr x9, x8, #0x7
978; CHECK-LDAPR-O1-NEXT:    stxr w10, x9, [x0]
979; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB9_1
980; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
981; CHECK-LDAPR-O1-NEXT:    mov x0, x8
982; CHECK-LDAPR-O1-NEXT:    ret
983;
984; CHECK-LDAPR-O0-LABEL: fetch_and_or_64:
985; CHECK-LDAPR-O0:       ; %bb.0:
986; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
987; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
988; CHECK-LDAPR-O0-NEXT:    ldr x8, [x0]
989; CHECK-LDAPR-O0-NEXT:    str x8, [sp, #24] ; 8-byte Folded Spill
990; CHECK-LDAPR-O0-NEXT:    b LBB9_1
991; CHECK-LDAPR-O0-NEXT:  LBB9_1: ; %atomicrmw.start
992; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
993; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB9_2 Depth 2
994; CHECK-LDAPR-O0-NEXT:    ldr x8, [sp, #24] ; 8-byte Folded Reload
995; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
996; CHECK-LDAPR-O0-NEXT:    orr x12, x8, #0x7
997; CHECK-LDAPR-O0-NEXT:  LBB9_2: ; %atomicrmw.start
998; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB9_1 Depth=1
999; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
1000; CHECK-LDAPR-O0-NEXT:    ldaxr x9, [x11]
1001; CHECK-LDAPR-O0-NEXT:    cmp x9, x8
1002; CHECK-LDAPR-O0-NEXT:    b.ne LBB9_4
1003; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
1004; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB9_2 Depth=2
1005; CHECK-LDAPR-O0-NEXT:    stlxr w10, x12, [x11]
1006; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB9_2
1007; CHECK-LDAPR-O0-NEXT:  LBB9_4: ; %atomicrmw.start
1008; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB9_1 Depth=1
1009; CHECK-LDAPR-O0-NEXT:    str x9, [sp, #8] ; 8-byte Folded Spill
1010; CHECK-LDAPR-O0-NEXT:    subs x8, x9, x8
1011; CHECK-LDAPR-O0-NEXT:    cset w8, eq
1012; CHECK-LDAPR-O0-NEXT:    str x9, [sp, #24] ; 8-byte Folded Spill
1013; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB9_1
1014; CHECK-LDAPR-O0-NEXT:    b LBB9_5
1015; CHECK-LDAPR-O0-NEXT:  LBB9_5: ; %atomicrmw.end
1016; CHECK-LDAPR-O0-NEXT:    ldr x0, [sp, #8] ; 8-byte Folded Reload
1017; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
1018; CHECK-LDAPR-O0-NEXT:    ret
1019  %val = atomicrmw or i64* %p, i64 7 monotonic
1020  ret i64 %val
1021}
1022
1023define void @acquire_fence() #0 {
1024; CHECK-NOLSE-LABEL: acquire_fence:
1025; CHECK-NOLSE:       ; %bb.0:
1026; CHECK-NOLSE-NEXT:    dmb ishld
1027; CHECK-NOLSE-NEXT:    ret
1028;
1029; CHECK-LSE-O1-LABEL: acquire_fence:
1030; CHECK-LSE-O1:       ; %bb.0:
1031; CHECK-LSE-O1-NEXT:    dmb ishld
1032; CHECK-LSE-O1-NEXT:    ret
1033;
1034; CHECK-LSE-O0-LABEL: acquire_fence:
1035; CHECK-LSE-O0:       ; %bb.0:
1036; CHECK-LSE-O0-NEXT:    dmb ishld
1037; CHECK-LSE-O0-NEXT:    ret
1038;
1039; CHECK-LDAPR-O1-LABEL: acquire_fence:
1040; CHECK-LDAPR-O1:       ; %bb.0:
1041; CHECK-LDAPR-O1-NEXT:    dmb ishld
1042; CHECK-LDAPR-O1-NEXT:    ret
1043;
1044; CHECK-LDAPR-O0-LABEL: acquire_fence:
1045; CHECK-LDAPR-O0:       ; %bb.0:
1046; CHECK-LDAPR-O0-NEXT:    dmb ishld
1047; CHECK-LDAPR-O0-NEXT:    ret
1048   fence acquire
1049   ret void
1050}
1051
1052define void @release_fence() #0 {
1053; CHECK-NOLSE-LABEL: release_fence:
1054; CHECK-NOLSE:       ; %bb.0:
1055; CHECK-NOLSE-NEXT:    dmb ish
1056; CHECK-NOLSE-NEXT:    ret
1057;
1058; CHECK-LSE-O1-LABEL: release_fence:
1059; CHECK-LSE-O1:       ; %bb.0:
1060; CHECK-LSE-O1-NEXT:    dmb ish
1061; CHECK-LSE-O1-NEXT:    ret
1062;
1063; CHECK-LSE-O0-LABEL: release_fence:
1064; CHECK-LSE-O0:       ; %bb.0:
1065; CHECK-LSE-O0-NEXT:    dmb ish
1066; CHECK-LSE-O0-NEXT:    ret
1067;
1068; CHECK-LDAPR-O1-LABEL: release_fence:
1069; CHECK-LDAPR-O1:       ; %bb.0:
1070; CHECK-LDAPR-O1-NEXT:    dmb ish
1071; CHECK-LDAPR-O1-NEXT:    ret
1072;
1073; CHECK-LDAPR-O0-LABEL: release_fence:
1074; CHECK-LDAPR-O0:       ; %bb.0:
1075; CHECK-LDAPR-O0-NEXT:    dmb ish
1076; CHECK-LDAPR-O0-NEXT:    ret
1077   fence release
1078   ret void
1079}
1080
1081define void @seq_cst_fence() #0 {
1082; CHECK-NOLSE-LABEL: seq_cst_fence:
1083; CHECK-NOLSE:       ; %bb.0:
1084; CHECK-NOLSE-NEXT:    dmb ish
1085; CHECK-NOLSE-NEXT:    ret
1086;
1087; CHECK-LSE-O1-LABEL: seq_cst_fence:
1088; CHECK-LSE-O1:       ; %bb.0:
1089; CHECK-LSE-O1-NEXT:    dmb ish
1090; CHECK-LSE-O1-NEXT:    ret
1091;
1092; CHECK-LSE-O0-LABEL: seq_cst_fence:
1093; CHECK-LSE-O0:       ; %bb.0:
1094; CHECK-LSE-O0-NEXT:    dmb ish
1095; CHECK-LSE-O0-NEXT:    ret
1096;
1097; CHECK-LDAPR-O1-LABEL: seq_cst_fence:
1098; CHECK-LDAPR-O1:       ; %bb.0:
1099; CHECK-LDAPR-O1-NEXT:    dmb ish
1100; CHECK-LDAPR-O1-NEXT:    ret
1101;
1102; CHECK-LDAPR-O0-LABEL: seq_cst_fence:
1103; CHECK-LDAPR-O0:       ; %bb.0:
1104; CHECK-LDAPR-O0-NEXT:    dmb ish
1105; CHECK-LDAPR-O0-NEXT:    ret
1106   fence seq_cst
1107   ret void
1108}
1109
1110define i32 @atomic_load(i32* %p) #0 {
1111; CHECK-NOLSE-LABEL: atomic_load:
1112; CHECK-NOLSE:       ; %bb.0:
1113; CHECK-NOLSE-NEXT:    ldar w0, [x0]
1114; CHECK-NOLSE-NEXT:    ret
1115;
1116; CHECK-LSE-O1-LABEL: atomic_load:
1117; CHECK-LSE-O1:       ; %bb.0:
1118; CHECK-LSE-O1-NEXT:    ldar w0, [x0]
1119; CHECK-LSE-O1-NEXT:    ret
1120;
1121; CHECK-LSE-O0-LABEL: atomic_load:
1122; CHECK-LSE-O0:       ; %bb.0:
1123; CHECK-LSE-O0-NEXT:    ldar w0, [x0]
1124; CHECK-LSE-O0-NEXT:    ret
1125;
1126; CHECK-LDAPR-O1-LABEL: atomic_load:
1127; CHECK-LDAPR-O1:       ; %bb.0:
1128; CHECK-LDAPR-O1-NEXT:    ldar w0, [x0]
1129; CHECK-LDAPR-O1-NEXT:    ret
1130;
1131; CHECK-LDAPR-O0-LABEL: atomic_load:
1132; CHECK-LDAPR-O0:       ; %bb.0:
1133; CHECK-LDAPR-O0-NEXT:    ldar w0, [x0]
1134; CHECK-LDAPR-O0-NEXT:    ret
1135   %r = load atomic i32, i32* %p seq_cst, align 4
1136   ret i32 %r
1137}
1138
1139define i8 @atomic_load_relaxed_8(i8* %p, i32 %off32) #0 {
1140; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_8:
1141; CHECK-NOLSE-O1:       ; %bb.0:
1142; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1143; CHECK-NOLSE-O1-NEXT:    ldrb w9, [x0, #4095]
1144; CHECK-NOLSE-O1-NEXT:    ldrb w10, [x0, w1, sxtw]
1145; CHECK-NOLSE-O1-NEXT:    ldurb w11, [x0, #-256]
1146; CHECK-NOLSE-O1-NEXT:    ldrb w8, [x8]
1147; CHECK-NOLSE-O1-NEXT:    add w9, w9, w10
1148; CHECK-NOLSE-O1-NEXT:    add w9, w9, w11
1149; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8
1150; CHECK-NOLSE-O1-NEXT:    ret
1151;
1152; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_8:
1153; CHECK-NOLSE-O0:       ; %bb.0:
1154; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x0, #4095]
1155; CHECK-NOLSE-O0-NEXT:    add x8, x0, w1, sxtw
1156; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x8]
1157; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxtb
1158; CHECK-NOLSE-O0-NEXT:    subs x9, x0, #256
1159; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x9]
1160; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxtb
1161; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1162; CHECK-NOLSE-O0-NEXT:    ldrb w9, [x9]
1163; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxtb
1164; CHECK-NOLSE-O0-NEXT:    ret
1165;
1166; CHECK-LSE-O1-LABEL: atomic_load_relaxed_8:
1167; CHECK-LSE-O1:       ; %bb.0:
1168; CHECK-LSE-O1-NEXT:    ldrb w8, [x0, #4095]
1169; CHECK-LSE-O1-NEXT:    ldrb w9, [x0, w1, sxtw]
1170; CHECK-LSE-O1-NEXT:    add w8, w8, w9
1171; CHECK-LSE-O1-NEXT:    ldurb w9, [x0, #-256]
1172; CHECK-LSE-O1-NEXT:    add w8, w8, w9
1173; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1174; CHECK-LSE-O1-NEXT:    ldrb w9, [x9]
1175; CHECK-LSE-O1-NEXT:    add w0, w8, w9
1176; CHECK-LSE-O1-NEXT:    ret
1177;
1178; CHECK-LSE-O0-LABEL: atomic_load_relaxed_8:
1179; CHECK-LSE-O0:       ; %bb.0:
1180; CHECK-LSE-O0-NEXT:    ldrb w9, [x0, #4095]
1181; CHECK-LSE-O0-NEXT:    add x8, x0, w1, sxtw
1182; CHECK-LSE-O0-NEXT:    ldrb w8, [x8]
1183; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxtb
1184; CHECK-LSE-O0-NEXT:    subs x9, x0, #256
1185; CHECK-LSE-O0-NEXT:    ldrb w9, [x9]
1186; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxtb
1187; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1188; CHECK-LSE-O0-NEXT:    ldrb w9, [x9]
1189; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxtb
1190; CHECK-LSE-O0-NEXT:    ret
1191;
1192; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_8:
1193; CHECK-LDAPR-O1:       ; %bb.0:
1194; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1195; CHECK-LDAPR-O1-NEXT:    ldrb w9, [x0, #4095]
1196; CHECK-LDAPR-O1-NEXT:    ldrb w10, [x0, w1, sxtw]
1197; CHECK-LDAPR-O1-NEXT:    ldurb w11, [x0, #-256]
1198; CHECK-LDAPR-O1-NEXT:    ldrb w8, [x8]
1199; CHECK-LDAPR-O1-NEXT:    add w9, w9, w10
1200; CHECK-LDAPR-O1-NEXT:    add w9, w9, w11
1201; CHECK-LDAPR-O1-NEXT:    add w0, w9, w8
1202; CHECK-LDAPR-O1-NEXT:    ret
1203;
1204; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_8:
1205; CHECK-LDAPR-O0:       ; %bb.0:
1206; CHECK-LDAPR-O0-NEXT:    ldrb w9, [x0, #4095]
1207; CHECK-LDAPR-O0-NEXT:    add x8, x0, w1, sxtw
1208; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x8]
1209; CHECK-LDAPR-O0-NEXT:    add w8, w8, w9, uxtb
1210; CHECK-LDAPR-O0-NEXT:    subs x9, x0, #256
1211; CHECK-LDAPR-O0-NEXT:    ldrb w9, [x9]
1212; CHECK-LDAPR-O0-NEXT:    add w8, w8, w9, uxtb
1213; CHECK-LDAPR-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1214; CHECK-LDAPR-O0-NEXT:    ldrb w9, [x9]
1215; CHECK-LDAPR-O0-NEXT:    add w0, w8, w9, uxtb
1216; CHECK-LDAPR-O0-NEXT:    ret
1217  %ptr_unsigned = getelementptr i8, i8* %p, i32 4095
1218  %val_unsigned = load atomic i8, i8* %ptr_unsigned monotonic, align 1
1219
1220  %ptr_regoff = getelementptr i8, i8* %p, i32 %off32
1221  %val_regoff = load atomic i8, i8* %ptr_regoff unordered, align 1
1222  %tot1 = add i8 %val_unsigned, %val_regoff
1223
1224  %ptr_unscaled = getelementptr i8, i8* %p, i32 -256
1225  %val_unscaled = load atomic i8, i8* %ptr_unscaled monotonic, align 1
1226  %tot2 = add i8 %tot1, %val_unscaled
1227
1228  %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm)
1229  %val_random = load atomic i8, i8* %ptr_random unordered, align 1
1230  %tot3 = add i8 %tot2, %val_random
1231
1232  ret i8 %tot3
1233}
1234
1235define i16 @atomic_load_relaxed_16(i16* %p, i32 %off32) #0 {
1236; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_16:
1237; CHECK-NOLSE-O1:       ; %bb.0:
1238; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1239; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x0, #8190]
1240; CHECK-NOLSE-O1-NEXT:    ldrh w10, [x0, w1, sxtw #1]
1241; CHECK-NOLSE-O1-NEXT:    ldurh w11, [x0, #-256]
1242; CHECK-NOLSE-O1-NEXT:    ldrh w8, [x8]
1243; CHECK-NOLSE-O1-NEXT:    add w9, w9, w10
1244; CHECK-NOLSE-O1-NEXT:    add w9, w9, w11
1245; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8
1246; CHECK-NOLSE-O1-NEXT:    ret
1247;
1248; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_16:
1249; CHECK-NOLSE-O0:       ; %bb.0:
1250; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x0, #8190]
1251; CHECK-NOLSE-O0-NEXT:    add x8, x0, w1, sxtw #1
1252; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x8]
1253; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxth
1254; CHECK-NOLSE-O0-NEXT:    subs x9, x0, #256
1255; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x9]
1256; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9, uxth
1257; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1258; CHECK-NOLSE-O0-NEXT:    ldrh w9, [x9]
1259; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxth
1260; CHECK-NOLSE-O0-NEXT:    ret
1261;
1262; CHECK-LSE-O1-LABEL: atomic_load_relaxed_16:
1263; CHECK-LSE-O1:       ; %bb.0:
1264; CHECK-LSE-O1-NEXT:    ldrh w8, [x0, #8190]
1265; CHECK-LSE-O1-NEXT:    ldrh w9, [x0, w1, sxtw #1]
1266; CHECK-LSE-O1-NEXT:    add w8, w8, w9
1267; CHECK-LSE-O1-NEXT:    ldurh w9, [x0, #-256]
1268; CHECK-LSE-O1-NEXT:    add w8, w8, w9
1269; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1270; CHECK-LSE-O1-NEXT:    ldrh w9, [x9]
1271; CHECK-LSE-O1-NEXT:    add w0, w8, w9
1272; CHECK-LSE-O1-NEXT:    ret
1273;
1274; CHECK-LSE-O0-LABEL: atomic_load_relaxed_16:
1275; CHECK-LSE-O0:       ; %bb.0:
1276; CHECK-LSE-O0-NEXT:    ldrh w9, [x0, #8190]
1277; CHECK-LSE-O0-NEXT:    add x8, x0, w1, sxtw #1
1278; CHECK-LSE-O0-NEXT:    ldrh w8, [x8]
1279; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxth
1280; CHECK-LSE-O0-NEXT:    subs x9, x0, #256
1281; CHECK-LSE-O0-NEXT:    ldrh w9, [x9]
1282; CHECK-LSE-O0-NEXT:    add w8, w8, w9, uxth
1283; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1284; CHECK-LSE-O0-NEXT:    ldrh w9, [x9]
1285; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxth
1286; CHECK-LSE-O0-NEXT:    ret
1287;
1288; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_16:
1289; CHECK-LDAPR-O1:       ; %bb.0:
1290; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1291; CHECK-LDAPR-O1-NEXT:    ldrh w9, [x0, #8190]
1292; CHECK-LDAPR-O1-NEXT:    ldrh w10, [x0, w1, sxtw #1]
1293; CHECK-LDAPR-O1-NEXT:    ldurh w11, [x0, #-256]
1294; CHECK-LDAPR-O1-NEXT:    ldrh w8, [x8]
1295; CHECK-LDAPR-O1-NEXT:    add w9, w9, w10
1296; CHECK-LDAPR-O1-NEXT:    add w9, w9, w11
1297; CHECK-LDAPR-O1-NEXT:    add w0, w9, w8
1298; CHECK-LDAPR-O1-NEXT:    ret
1299;
1300; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_16:
1301; CHECK-LDAPR-O0:       ; %bb.0:
1302; CHECK-LDAPR-O0-NEXT:    ldrh w9, [x0, #8190]
1303; CHECK-LDAPR-O0-NEXT:    add x8, x0, w1, sxtw #1
1304; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x8]
1305; CHECK-LDAPR-O0-NEXT:    add w8, w8, w9, uxth
1306; CHECK-LDAPR-O0-NEXT:    subs x9, x0, #256
1307; CHECK-LDAPR-O0-NEXT:    ldrh w9, [x9]
1308; CHECK-LDAPR-O0-NEXT:    add w8, w8, w9, uxth
1309; CHECK-LDAPR-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1310; CHECK-LDAPR-O0-NEXT:    ldrh w9, [x9]
1311; CHECK-LDAPR-O0-NEXT:    add w0, w8, w9, uxth
1312; CHECK-LDAPR-O0-NEXT:    ret
1313  %ptr_unsigned = getelementptr i16, i16* %p, i32 4095
1314  %val_unsigned = load atomic i16, i16* %ptr_unsigned monotonic, align 2
1315
1316  %ptr_regoff = getelementptr i16, i16* %p, i32 %off32
1317  %val_regoff = load atomic i16, i16* %ptr_regoff unordered, align 2
1318  %tot1 = add i16 %val_unsigned, %val_regoff
1319
1320  %ptr_unscaled = getelementptr i16, i16* %p, i32 -128
1321  %val_unscaled = load atomic i16, i16* %ptr_unscaled monotonic, align 2
1322  %tot2 = add i16 %tot1, %val_unscaled
1323
1324  %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)
1325  %val_random = load atomic i16, i16* %ptr_random unordered, align 2
1326  %tot3 = add i16 %tot2, %val_random
1327
1328  ret i16 %tot3
1329}
1330
1331define i32 @atomic_load_relaxed_32(i32* %p, i32 %off32) #0 {
1332; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_32:
1333; CHECK-NOLSE-O1:       ; %bb.0:
1334; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1335; CHECK-NOLSE-O1-NEXT:    ldr w9, [x0, #16380]
1336; CHECK-NOLSE-O1-NEXT:    ldr w10, [x0, w1, sxtw #2]
1337; CHECK-NOLSE-O1-NEXT:    ldur w11, [x0, #-256]
1338; CHECK-NOLSE-O1-NEXT:    ldr w8, [x8]
1339; CHECK-NOLSE-O1-NEXT:    add w9, w9, w10
1340; CHECK-NOLSE-O1-NEXT:    add w9, w9, w11
1341; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8
1342; CHECK-NOLSE-O1-NEXT:    ret
1343;
1344; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_32:
1345; CHECK-NOLSE-O0:       ; %bb.0:
1346; CHECK-NOLSE-O0-NEXT:    ldr w8, [x0, #16380]
1347; CHECK-NOLSE-O0-NEXT:    ldr w9, [x0, w1, sxtw #2]
1348; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9
1349; CHECK-NOLSE-O0-NEXT:    ldur w9, [x0, #-256]
1350; CHECK-NOLSE-O0-NEXT:    add w8, w8, w9
1351; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1352; CHECK-NOLSE-O0-NEXT:    ldr w9, [x9]
1353; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9
1354; CHECK-NOLSE-O0-NEXT:    ret
1355;
1356; CHECK-LSE-O1-LABEL: atomic_load_relaxed_32:
1357; CHECK-LSE-O1:       ; %bb.0:
1358; CHECK-LSE-O1-NEXT:    ldr w8, [x0, #16380]
1359; CHECK-LSE-O1-NEXT:    ldr w9, [x0, w1, sxtw #2]
1360; CHECK-LSE-O1-NEXT:    add w8, w8, w9
1361; CHECK-LSE-O1-NEXT:    ldur w9, [x0, #-256]
1362; CHECK-LSE-O1-NEXT:    add w8, w8, w9
1363; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1364; CHECK-LSE-O1-NEXT:    ldr w9, [x9]
1365; CHECK-LSE-O1-NEXT:    add w0, w8, w9
1366; CHECK-LSE-O1-NEXT:    ret
1367;
1368; CHECK-LSE-O0-LABEL: atomic_load_relaxed_32:
1369; CHECK-LSE-O0:       ; %bb.0:
1370; CHECK-LSE-O0-NEXT:    ldr w8, [x0, #16380]
1371; CHECK-LSE-O0-NEXT:    ldr w9, [x0, w1, sxtw #2]
1372; CHECK-LSE-O0-NEXT:    add w8, w8, w9
1373; CHECK-LSE-O0-NEXT:    ldur w9, [x0, #-256]
1374; CHECK-LSE-O0-NEXT:    add w8, w8, w9
1375; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1376; CHECK-LSE-O0-NEXT:    ldr w9, [x9]
1377; CHECK-LSE-O0-NEXT:    add w0, w8, w9
1378; CHECK-LSE-O0-NEXT:    ret
1379;
1380; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_32:
1381; CHECK-LDAPR-O1:       ; %bb.0:
1382; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1383; CHECK-LDAPR-O1-NEXT:    ldr w9, [x0, #16380]
1384; CHECK-LDAPR-O1-NEXT:    ldr w10, [x0, w1, sxtw #2]
1385; CHECK-LDAPR-O1-NEXT:    ldur w11, [x0, #-256]
1386; CHECK-LDAPR-O1-NEXT:    ldr w8, [x8]
1387; CHECK-LDAPR-O1-NEXT:    add w9, w9, w10
1388; CHECK-LDAPR-O1-NEXT:    add w9, w9, w11
1389; CHECK-LDAPR-O1-NEXT:    add w0, w9, w8
1390; CHECK-LDAPR-O1-NEXT:    ret
1391;
1392; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_32:
1393; CHECK-LDAPR-O0:       ; %bb.0:
1394; CHECK-LDAPR-O0-NEXT:    ldr w8, [x0, #16380]
1395; CHECK-LDAPR-O0-NEXT:    ldr w9, [x0, w1, sxtw #2]
1396; CHECK-LDAPR-O0-NEXT:    add w8, w8, w9
1397; CHECK-LDAPR-O0-NEXT:    ldur w9, [x0, #-256]
1398; CHECK-LDAPR-O0-NEXT:    add w8, w8, w9
1399; CHECK-LDAPR-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1400; CHECK-LDAPR-O0-NEXT:    ldr w9, [x9]
1401; CHECK-LDAPR-O0-NEXT:    add w0, w8, w9
1402; CHECK-LDAPR-O0-NEXT:    ret
1403  %ptr_unsigned = getelementptr i32, i32* %p, i32 4095
1404  %val_unsigned = load atomic i32, i32* %ptr_unsigned monotonic, align 4
1405
1406  %ptr_regoff = getelementptr i32, i32* %p, i32 %off32
1407  %val_regoff = load atomic i32, i32* %ptr_regoff unordered, align 4
1408  %tot1 = add i32 %val_unsigned, %val_regoff
1409
1410  %ptr_unscaled = getelementptr i32, i32* %p, i32 -64
1411  %val_unscaled = load atomic i32, i32* %ptr_unscaled monotonic, align 4
1412  %tot2 = add i32 %tot1, %val_unscaled
1413
1414  %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)
1415  %val_random = load atomic i32, i32* %ptr_random unordered, align 4
1416  %tot3 = add i32 %tot2, %val_random
1417
1418  ret i32 %tot3
1419}
1420
1421define i64 @atomic_load_relaxed_64(i64* %p, i32 %off32) #0 {
1422; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_64:
1423; CHECK-NOLSE-O1:       ; %bb.0:
1424; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1425; CHECK-NOLSE-O1-NEXT:    ldr x9, [x0, #32760]
1426; CHECK-NOLSE-O1-NEXT:    ldr x10, [x0, w1, sxtw #3]
1427; CHECK-NOLSE-O1-NEXT:    ldur x11, [x0, #-256]
1428; CHECK-NOLSE-O1-NEXT:    ldr x8, [x8]
1429; CHECK-NOLSE-O1-NEXT:    add x9, x9, x10
1430; CHECK-NOLSE-O1-NEXT:    add x9, x9, x11
1431; CHECK-NOLSE-O1-NEXT:    add x0, x9, x8
1432; CHECK-NOLSE-O1-NEXT:    ret
1433;
1434; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_64:
1435; CHECK-NOLSE-O0:       ; %bb.0:
1436; CHECK-NOLSE-O0-NEXT:    ldr x8, [x0, #32760]
1437; CHECK-NOLSE-O0-NEXT:    ldr x9, [x0, w1, sxtw #3]
1438; CHECK-NOLSE-O0-NEXT:    add x8, x8, x9
1439; CHECK-NOLSE-O0-NEXT:    ldur x9, [x0, #-256]
1440; CHECK-NOLSE-O0-NEXT:    add x8, x8, x9
1441; CHECK-NOLSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1442; CHECK-NOLSE-O0-NEXT:    ldr x9, [x9]
1443; CHECK-NOLSE-O0-NEXT:    add x0, x8, x9
1444; CHECK-NOLSE-O0-NEXT:    ret
1445;
1446; CHECK-LSE-O1-LABEL: atomic_load_relaxed_64:
1447; CHECK-LSE-O1:       ; %bb.0:
1448; CHECK-LSE-O1-NEXT:    ldr x8, [x0, #32760]
1449; CHECK-LSE-O1-NEXT:    ldr x9, [x0, w1, sxtw #3]
1450; CHECK-LSE-O1-NEXT:    add x8, x8, x9
1451; CHECK-LSE-O1-NEXT:    ldur x9, [x0, #-256]
1452; CHECK-LSE-O1-NEXT:    add x8, x8, x9
1453; CHECK-LSE-O1-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1454; CHECK-LSE-O1-NEXT:    ldr x9, [x9]
1455; CHECK-LSE-O1-NEXT:    add x0, x8, x9
1456; CHECK-LSE-O1-NEXT:    ret
1457;
1458; CHECK-LSE-O0-LABEL: atomic_load_relaxed_64:
1459; CHECK-LSE-O0:       ; %bb.0:
1460; CHECK-LSE-O0-NEXT:    ldr x8, [x0, #32760]
1461; CHECK-LSE-O0-NEXT:    ldr x9, [x0, w1, sxtw #3]
1462; CHECK-LSE-O0-NEXT:    add x8, x8, x9
1463; CHECK-LSE-O0-NEXT:    ldur x9, [x0, #-256]
1464; CHECK-LSE-O0-NEXT:    add x8, x8, x9
1465; CHECK-LSE-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1466; CHECK-LSE-O0-NEXT:    ldr x9, [x9]
1467; CHECK-LSE-O0-NEXT:    add x0, x8, x9
1468; CHECK-LSE-O0-NEXT:    ret
1469;
1470; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_64:
1471; CHECK-LDAPR-O1:       ; %bb.0:
1472; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1473; CHECK-LDAPR-O1-NEXT:    ldr x9, [x0, #32760]
1474; CHECK-LDAPR-O1-NEXT:    ldr x10, [x0, w1, sxtw #3]
1475; CHECK-LDAPR-O1-NEXT:    ldur x11, [x0, #-256]
1476; CHECK-LDAPR-O1-NEXT:    ldr x8, [x8]
1477; CHECK-LDAPR-O1-NEXT:    add x9, x9, x10
1478; CHECK-LDAPR-O1-NEXT:    add x9, x9, x11
1479; CHECK-LDAPR-O1-NEXT:    add x0, x9, x8
1480; CHECK-LDAPR-O1-NEXT:    ret
1481;
1482; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_64:
1483; CHECK-LDAPR-O0:       ; %bb.0:
1484; CHECK-LDAPR-O0-NEXT:    ldr x8, [x0, #32760]
1485; CHECK-LDAPR-O0-NEXT:    ldr x9, [x0, w1, sxtw #3]
1486; CHECK-LDAPR-O0-NEXT:    add x8, x8, x9
1487; CHECK-LDAPR-O0-NEXT:    ldur x9, [x0, #-256]
1488; CHECK-LDAPR-O0-NEXT:    add x8, x8, x9
1489; CHECK-LDAPR-O0-NEXT:    add x9, x0, #291, lsl #12 ; =1191936
1490; CHECK-LDAPR-O0-NEXT:    ldr x9, [x9]
1491; CHECK-LDAPR-O0-NEXT:    add x0, x8, x9
1492; CHECK-LDAPR-O0-NEXT:    ret
1493  %ptr_unsigned = getelementptr i64, i64* %p, i32 4095
1494  %val_unsigned = load atomic i64, i64* %ptr_unsigned monotonic, align 8
1495
1496  %ptr_regoff = getelementptr i64, i64* %p, i32 %off32
1497  %val_regoff = load atomic i64, i64* %ptr_regoff unordered, align 8
1498  %tot1 = add i64 %val_unsigned, %val_regoff
1499
1500  %ptr_unscaled = getelementptr i64, i64* %p, i32 -32
1501  %val_unscaled = load atomic i64, i64* %ptr_unscaled monotonic, align 8
1502  %tot2 = add i64 %tot1, %val_unscaled
1503
1504  %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)
1505  %val_random = load atomic i64, i64* %ptr_random unordered, align 8
1506  %tot3 = add i64 %tot2, %val_random
1507
1508  ret i64 %tot3
1509}
1510
1511
1512define void @atomc_store(i32* %p) #0 {
1513; CHECK-NOLSE-LABEL: atomc_store:
1514; CHECK-NOLSE:       ; %bb.0:
1515; CHECK-NOLSE-NEXT:    mov w8, #4
1516; CHECK-NOLSE-NEXT:    stlr w8, [x0]
1517; CHECK-NOLSE-NEXT:    ret
1518;
1519; CHECK-LSE-O1-LABEL: atomc_store:
1520; CHECK-LSE-O1:       ; %bb.0:
1521; CHECK-LSE-O1-NEXT:    mov w8, #4
1522; CHECK-LSE-O1-NEXT:    stlr w8, [x0]
1523; CHECK-LSE-O1-NEXT:    ret
1524;
1525; CHECK-LSE-O0-LABEL: atomc_store:
1526; CHECK-LSE-O0:       ; %bb.0:
1527; CHECK-LSE-O0-NEXT:    mov w8, #4
1528; CHECK-LSE-O0-NEXT:    stlr w8, [x0]
1529; CHECK-LSE-O0-NEXT:    ret
1530;
1531; CHECK-LDAPR-O1-LABEL: atomc_store:
1532; CHECK-LDAPR-O1:       ; %bb.0:
1533; CHECK-LDAPR-O1-NEXT:    mov w8, #4
1534; CHECK-LDAPR-O1-NEXT:    stlr w8, [x0]
1535; CHECK-LDAPR-O1-NEXT:    ret
1536;
1537; CHECK-LDAPR-O0-LABEL: atomc_store:
1538; CHECK-LDAPR-O0:       ; %bb.0:
1539; CHECK-LDAPR-O0-NEXT:    mov w8, #4
1540; CHECK-LDAPR-O0-NEXT:    stlr w8, [x0]
1541; CHECK-LDAPR-O0-NEXT:    ret
1542   store atomic i32 4, i32* %p seq_cst, align 4
1543   ret void
1544}
1545
1546define void @atomic_store_relaxed_8(i8* %p, i32 %off32, i8 %val) #0 {
1547; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_8:
1548; CHECK-NOLSE-O1:       ; %bb.0:
1549; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1550; CHECK-NOLSE-O1-NEXT:    strb w2, [x0, #4095]
1551; CHECK-NOLSE-O1-NEXT:    strb w2, [x0, w1, sxtw]
1552; CHECK-NOLSE-O1-NEXT:    sturb w2, [x0, #-256]
1553; CHECK-NOLSE-O1-NEXT:    strb w2, [x8]
1554; CHECK-NOLSE-O1-NEXT:    ret
1555;
1556; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_8:
1557; CHECK-NOLSE-O0:       ; %bb.0:
1558; CHECK-NOLSE-O0-NEXT:    strb w2, [x0, #4095]
1559; CHECK-NOLSE-O0-NEXT:    strb w2, [x0, w1, sxtw]
1560; CHECK-NOLSE-O0-NEXT:    sturb w2, [x0, #-256]
1561; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1562; CHECK-NOLSE-O0-NEXT:    strb w2, [x8]
1563; CHECK-NOLSE-O0-NEXT:    ret
1564;
1565; CHECK-LSE-O1-LABEL: atomic_store_relaxed_8:
1566; CHECK-LSE-O1:       ; %bb.0:
1567; CHECK-LSE-O1-NEXT:    strb w2, [x0, #4095]
1568; CHECK-LSE-O1-NEXT:    strb w2, [x0, w1, sxtw]
1569; CHECK-LSE-O1-NEXT:    sturb w2, [x0, #-256]
1570; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1571; CHECK-LSE-O1-NEXT:    strb w2, [x8]
1572; CHECK-LSE-O1-NEXT:    ret
1573;
1574; CHECK-LSE-O0-LABEL: atomic_store_relaxed_8:
1575; CHECK-LSE-O0:       ; %bb.0:
1576; CHECK-LSE-O0-NEXT:    strb w2, [x0, #4095]
1577; CHECK-LSE-O0-NEXT:    strb w2, [x0, w1, sxtw]
1578; CHECK-LSE-O0-NEXT:    sturb w2, [x0, #-256]
1579; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1580; CHECK-LSE-O0-NEXT:    strb w2, [x8]
1581; CHECK-LSE-O0-NEXT:    ret
1582;
1583; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_8:
1584; CHECK-LDAPR-O1:       ; %bb.0:
1585; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1586; CHECK-LDAPR-O1-NEXT:    strb w2, [x0, #4095]
1587; CHECK-LDAPR-O1-NEXT:    strb w2, [x0, w1, sxtw]
1588; CHECK-LDAPR-O1-NEXT:    sturb w2, [x0, #-256]
1589; CHECK-LDAPR-O1-NEXT:    strb w2, [x8]
1590; CHECK-LDAPR-O1-NEXT:    ret
1591;
1592; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_8:
1593; CHECK-LDAPR-O0:       ; %bb.0:
1594; CHECK-LDAPR-O0-NEXT:    strb w2, [x0, #4095]
1595; CHECK-LDAPR-O0-NEXT:    strb w2, [x0, w1, sxtw]
1596; CHECK-LDAPR-O0-NEXT:    sturb w2, [x0, #-256]
1597; CHECK-LDAPR-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1598; CHECK-LDAPR-O0-NEXT:    strb w2, [x8]
1599; CHECK-LDAPR-O0-NEXT:    ret
1600  %ptr_unsigned = getelementptr i8, i8* %p, i32 4095
1601  store atomic i8 %val, i8* %ptr_unsigned monotonic, align 1
1602
1603  %ptr_regoff = getelementptr i8, i8* %p, i32 %off32
1604  store atomic i8 %val, i8* %ptr_regoff unordered, align 1
1605
1606  %ptr_unscaled = getelementptr i8, i8* %p, i32 -256
1607  store atomic i8 %val, i8* %ptr_unscaled monotonic, align 1
1608
1609  %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm)
1610  store atomic i8 %val, i8* %ptr_random unordered, align 1
1611
1612  ret void
1613}
1614
1615define void @atomic_store_relaxed_16(i16* %p, i32 %off32, i16 %val) #0 {
1616; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_16:
1617; CHECK-NOLSE-O1:       ; %bb.0:
1618; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1619; CHECK-NOLSE-O1-NEXT:    strh w2, [x0, #8190]
1620; CHECK-NOLSE-O1-NEXT:    strh w2, [x0, w1, sxtw #1]
1621; CHECK-NOLSE-O1-NEXT:    sturh w2, [x0, #-256]
1622; CHECK-NOLSE-O1-NEXT:    strh w2, [x8]
1623; CHECK-NOLSE-O1-NEXT:    ret
1624;
1625; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_16:
1626; CHECK-NOLSE-O0:       ; %bb.0:
1627; CHECK-NOLSE-O0-NEXT:    strh w2, [x0, #8190]
1628; CHECK-NOLSE-O0-NEXT:    strh w2, [x0, w1, sxtw #1]
1629; CHECK-NOLSE-O0-NEXT:    sturh w2, [x0, #-256]
1630; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1631; CHECK-NOLSE-O0-NEXT:    strh w2, [x8]
1632; CHECK-NOLSE-O0-NEXT:    ret
1633;
1634; CHECK-LSE-O1-LABEL: atomic_store_relaxed_16:
1635; CHECK-LSE-O1:       ; %bb.0:
1636; CHECK-LSE-O1-NEXT:    strh w2, [x0, #8190]
1637; CHECK-LSE-O1-NEXT:    strh w2, [x0, w1, sxtw #1]
1638; CHECK-LSE-O1-NEXT:    sturh w2, [x0, #-256]
1639; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1640; CHECK-LSE-O1-NEXT:    strh w2, [x8]
1641; CHECK-LSE-O1-NEXT:    ret
1642;
1643; CHECK-LSE-O0-LABEL: atomic_store_relaxed_16:
1644; CHECK-LSE-O0:       ; %bb.0:
1645; CHECK-LSE-O0-NEXT:    strh w2, [x0, #8190]
1646; CHECK-LSE-O0-NEXT:    strh w2, [x0, w1, sxtw #1]
1647; CHECK-LSE-O0-NEXT:    sturh w2, [x0, #-256]
1648; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1649; CHECK-LSE-O0-NEXT:    strh w2, [x8]
1650; CHECK-LSE-O0-NEXT:    ret
1651;
1652; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_16:
1653; CHECK-LDAPR-O1:       ; %bb.0:
1654; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1655; CHECK-LDAPR-O1-NEXT:    strh w2, [x0, #8190]
1656; CHECK-LDAPR-O1-NEXT:    strh w2, [x0, w1, sxtw #1]
1657; CHECK-LDAPR-O1-NEXT:    sturh w2, [x0, #-256]
1658; CHECK-LDAPR-O1-NEXT:    strh w2, [x8]
1659; CHECK-LDAPR-O1-NEXT:    ret
1660;
1661; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_16:
1662; CHECK-LDAPR-O0:       ; %bb.0:
1663; CHECK-LDAPR-O0-NEXT:    strh w2, [x0, #8190]
1664; CHECK-LDAPR-O0-NEXT:    strh w2, [x0, w1, sxtw #1]
1665; CHECK-LDAPR-O0-NEXT:    sturh w2, [x0, #-256]
1666; CHECK-LDAPR-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1667; CHECK-LDAPR-O0-NEXT:    strh w2, [x8]
1668; CHECK-LDAPR-O0-NEXT:    ret
1669  %ptr_unsigned = getelementptr i16, i16* %p, i32 4095
1670  store atomic i16 %val, i16* %ptr_unsigned monotonic, align 2
1671
1672  %ptr_regoff = getelementptr i16, i16* %p, i32 %off32
1673  store atomic i16 %val, i16* %ptr_regoff unordered, align 2
1674
1675  %ptr_unscaled = getelementptr i16, i16* %p, i32 -128
1676  store atomic i16 %val, i16* %ptr_unscaled monotonic, align 2
1677
1678  %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)
1679  store atomic i16 %val, i16* %ptr_random unordered, align 2
1680
1681  ret void
1682}
1683
1684define void @atomic_store_relaxed_32(i32* %p, i32 %off32, i32 %val) #0 {
1685; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_32:
1686; CHECK-NOLSE-O1:       ; %bb.0:
1687; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1688; CHECK-NOLSE-O1-NEXT:    str w2, [x0, #16380]
1689; CHECK-NOLSE-O1-NEXT:    str w2, [x0, w1, sxtw #2]
1690; CHECK-NOLSE-O1-NEXT:    stur w2, [x0, #-256]
1691; CHECK-NOLSE-O1-NEXT:    str w2, [x8]
1692; CHECK-NOLSE-O1-NEXT:    ret
1693;
1694; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_32:
1695; CHECK-NOLSE-O0:       ; %bb.0:
1696; CHECK-NOLSE-O0-NEXT:    str w2, [x0, #16380]
1697; CHECK-NOLSE-O0-NEXT:    str w2, [x0, w1, sxtw #2]
1698; CHECK-NOLSE-O0-NEXT:    stur w2, [x0, #-256]
1699; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1700; CHECK-NOLSE-O0-NEXT:    str w2, [x8]
1701; CHECK-NOLSE-O0-NEXT:    ret
1702;
1703; CHECK-LSE-O1-LABEL: atomic_store_relaxed_32:
1704; CHECK-LSE-O1:       ; %bb.0:
1705; CHECK-LSE-O1-NEXT:    str w2, [x0, #16380]
1706; CHECK-LSE-O1-NEXT:    str w2, [x0, w1, sxtw #2]
1707; CHECK-LSE-O1-NEXT:    stur w2, [x0, #-256]
1708; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1709; CHECK-LSE-O1-NEXT:    str w2, [x8]
1710; CHECK-LSE-O1-NEXT:    ret
1711;
1712; CHECK-LSE-O0-LABEL: atomic_store_relaxed_32:
1713; CHECK-LSE-O0:       ; %bb.0:
1714; CHECK-LSE-O0-NEXT:    str w2, [x0, #16380]
1715; CHECK-LSE-O0-NEXT:    str w2, [x0, w1, sxtw #2]
1716; CHECK-LSE-O0-NEXT:    stur w2, [x0, #-256]
1717; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1718; CHECK-LSE-O0-NEXT:    str w2, [x8]
1719; CHECK-LSE-O0-NEXT:    ret
1720;
1721; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_32:
1722; CHECK-LDAPR-O1:       ; %bb.0:
1723; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1724; CHECK-LDAPR-O1-NEXT:    str w2, [x0, #16380]
1725; CHECK-LDAPR-O1-NEXT:    str w2, [x0, w1, sxtw #2]
1726; CHECK-LDAPR-O1-NEXT:    stur w2, [x0, #-256]
1727; CHECK-LDAPR-O1-NEXT:    str w2, [x8]
1728; CHECK-LDAPR-O1-NEXT:    ret
1729;
1730; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_32:
1731; CHECK-LDAPR-O0:       ; %bb.0:
1732; CHECK-LDAPR-O0-NEXT:    str w2, [x0, #16380]
1733; CHECK-LDAPR-O0-NEXT:    str w2, [x0, w1, sxtw #2]
1734; CHECK-LDAPR-O0-NEXT:    stur w2, [x0, #-256]
1735; CHECK-LDAPR-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1736; CHECK-LDAPR-O0-NEXT:    str w2, [x8]
1737; CHECK-LDAPR-O0-NEXT:    ret
1738  %ptr_unsigned = getelementptr i32, i32* %p, i32 4095
1739  store atomic i32 %val, i32* %ptr_unsigned monotonic, align 4
1740
1741  %ptr_regoff = getelementptr i32, i32* %p, i32 %off32
1742  store atomic i32 %val, i32* %ptr_regoff unordered, align 4
1743
1744  %ptr_unscaled = getelementptr i32, i32* %p, i32 -64
1745  store atomic i32 %val, i32* %ptr_unscaled monotonic, align 4
1746
1747  %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)
1748  store atomic i32 %val, i32* %ptr_random unordered, align 4
1749
1750  ret void
1751}
1752
1753define void @atomic_store_relaxed_64(i64* %p, i32 %off32, i64 %val) #0 {
1754; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_64:
1755; CHECK-NOLSE-O1:       ; %bb.0:
1756; CHECK-NOLSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1757; CHECK-NOLSE-O1-NEXT:    str x2, [x0, #32760]
1758; CHECK-NOLSE-O1-NEXT:    str x2, [x0, w1, sxtw #3]
1759; CHECK-NOLSE-O1-NEXT:    stur x2, [x0, #-256]
1760; CHECK-NOLSE-O1-NEXT:    str x2, [x8]
1761; CHECK-NOLSE-O1-NEXT:    ret
1762;
1763; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_64:
1764; CHECK-NOLSE-O0:       ; %bb.0:
1765; CHECK-NOLSE-O0-NEXT:    str x2, [x0, #32760]
1766; CHECK-NOLSE-O0-NEXT:    str x2, [x0, w1, sxtw #3]
1767; CHECK-NOLSE-O0-NEXT:    stur x2, [x0, #-256]
1768; CHECK-NOLSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1769; CHECK-NOLSE-O0-NEXT:    str x2, [x8]
1770; CHECK-NOLSE-O0-NEXT:    ret
1771;
1772; CHECK-LSE-O1-LABEL: atomic_store_relaxed_64:
1773; CHECK-LSE-O1:       ; %bb.0:
1774; CHECK-LSE-O1-NEXT:    str x2, [x0, #32760]
1775; CHECK-LSE-O1-NEXT:    str x2, [x0, w1, sxtw #3]
1776; CHECK-LSE-O1-NEXT:    stur x2, [x0, #-256]
1777; CHECK-LSE-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1778; CHECK-LSE-O1-NEXT:    str x2, [x8]
1779; CHECK-LSE-O1-NEXT:    ret
1780;
1781; CHECK-LSE-O0-LABEL: atomic_store_relaxed_64:
1782; CHECK-LSE-O0:       ; %bb.0:
1783; CHECK-LSE-O0-NEXT:    str x2, [x0, #32760]
1784; CHECK-LSE-O0-NEXT:    str x2, [x0, w1, sxtw #3]
1785; CHECK-LSE-O0-NEXT:    stur x2, [x0, #-256]
1786; CHECK-LSE-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1787; CHECK-LSE-O0-NEXT:    str x2, [x8]
1788; CHECK-LSE-O0-NEXT:    ret
1789;
1790; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_64:
1791; CHECK-LDAPR-O1:       ; %bb.0:
1792; CHECK-LDAPR-O1-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1793; CHECK-LDAPR-O1-NEXT:    str x2, [x0, #32760]
1794; CHECK-LDAPR-O1-NEXT:    str x2, [x0, w1, sxtw #3]
1795; CHECK-LDAPR-O1-NEXT:    stur x2, [x0, #-256]
1796; CHECK-LDAPR-O1-NEXT:    str x2, [x8]
1797; CHECK-LDAPR-O1-NEXT:    ret
1798;
1799; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_64:
1800; CHECK-LDAPR-O0:       ; %bb.0:
1801; CHECK-LDAPR-O0-NEXT:    str x2, [x0, #32760]
1802; CHECK-LDAPR-O0-NEXT:    str x2, [x0, w1, sxtw #3]
1803; CHECK-LDAPR-O0-NEXT:    stur x2, [x0, #-256]
1804; CHECK-LDAPR-O0-NEXT:    add x8, x0, #291, lsl #12 ; =1191936
1805; CHECK-LDAPR-O0-NEXT:    str x2, [x8]
1806; CHECK-LDAPR-O0-NEXT:    ret
1807  %ptr_unsigned = getelementptr i64, i64* %p, i32 4095
1808  store atomic i64 %val, i64* %ptr_unsigned monotonic, align 8
1809
1810  %ptr_regoff = getelementptr i64, i64* %p, i32 %off32
1811  store atomic i64 %val, i64* %ptr_regoff unordered, align 8
1812
1813  %ptr_unscaled = getelementptr i64, i64* %p, i32 -32
1814  store atomic i64 %val, i64* %ptr_unscaled monotonic, align 8
1815
1816  %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)
1817  store atomic i64 %val, i64* %ptr_random unordered, align 8
1818
1819  ret void
1820}
1821
1822define i32 @load_zext(i8* %p8, i16* %p16) {
1823; CHECK-NOLSE-O1-LABEL: load_zext:
1824; CHECK-NOLSE-O1:       ; %bb.0:
1825; CHECK-NOLSE-O1-NEXT:    ldarb w8, [x0]
1826; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x1]
1827; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8, uxtb
1828; CHECK-NOLSE-O1-NEXT:    ret
1829;
1830; CHECK-NOLSE-O0-LABEL: load_zext:
1831; CHECK-NOLSE-O0:       ; %bb.0:
1832; CHECK-NOLSE-O0-NEXT:    ldarb w9, [x0]
1833; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x1]
1834; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, uxtb
1835; CHECK-NOLSE-O0-NEXT:    ret
1836;
1837; CHECK-LSE-O1-LABEL: load_zext:
1838; CHECK-LSE-O1:       ; %bb.0:
1839; CHECK-LSE-O1-NEXT:    ldarb w8, [x0]
1840; CHECK-LSE-O1-NEXT:    ldrh w9, [x1]
1841; CHECK-LSE-O1-NEXT:    add w0, w9, w8, uxtb
1842; CHECK-LSE-O1-NEXT:    ret
1843;
1844; CHECK-LSE-O0-LABEL: load_zext:
1845; CHECK-LSE-O0:       ; %bb.0:
1846; CHECK-LSE-O0-NEXT:    ldarb w9, [x0]
1847; CHECK-LSE-O0-NEXT:    ldrh w8, [x1]
1848; CHECK-LSE-O0-NEXT:    add w0, w8, w9, uxtb
1849; CHECK-LSE-O0-NEXT:    ret
1850;
1851; CHECK-LDAPR-O1-LABEL: load_zext:
1852; CHECK-LDAPR-O1:       ; %bb.0:
1853; CHECK-LDAPR-O1-NEXT:    ldaprb w8, [x0]
1854; CHECK-LDAPR-O1-NEXT:    ldrh w9, [x1]
1855; CHECK-LDAPR-O1-NEXT:    add w0, w9, w8, uxtb
1856; CHECK-LDAPR-O1-NEXT:    ret
1857;
1858; CHECK-LDAPR-O0-LABEL: load_zext:
1859; CHECK-LDAPR-O0:       ; %bb.0:
1860; CHECK-LDAPR-O0-NEXT:    ldaprb w9, [x0]
1861; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x1]
1862; CHECK-LDAPR-O0-NEXT:    add w0, w8, w9, uxtb
1863; CHECK-LDAPR-O0-NEXT:    ret
1864  %val1.8 = load atomic i8, i8* %p8 acquire, align 1
1865  %val1 = zext i8 %val1.8 to i32
1866
1867  %val2.16 = load atomic i16, i16* %p16 unordered, align 2
1868  %val2 = zext i16 %val2.16 to i32
1869
1870  %res = add i32 %val1, %val2
1871  ret i32 %res
1872}
1873
1874define { i32, i64 } @load_acq(i32* %p32, i64* %p64) {
1875; CHECK-NOLSE-LABEL: load_acq:
1876; CHECK-NOLSE:       ; %bb.0:
1877; CHECK-NOLSE-NEXT:    ldar w0, [x0]
1878; CHECK-NOLSE-NEXT:    ldar x1, [x1]
1879; CHECK-NOLSE-NEXT:    ret
1880;
1881; CHECK-LSE-O1-LABEL: load_acq:
1882; CHECK-LSE-O1:       ; %bb.0:
1883; CHECK-LSE-O1-NEXT:    ldar w0, [x0]
1884; CHECK-LSE-O1-NEXT:    ldar x1, [x1]
1885; CHECK-LSE-O1-NEXT:    ret
1886;
1887; CHECK-LSE-O0-LABEL: load_acq:
1888; CHECK-LSE-O0:       ; %bb.0:
1889; CHECK-LSE-O0-NEXT:    ldar w0, [x0]
1890; CHECK-LSE-O0-NEXT:    ldar x1, [x1]
1891; CHECK-LSE-O0-NEXT:    ret
1892;
1893; CHECK-LDAPR-O1-LABEL: load_acq:
1894; CHECK-LDAPR-O1:       ; %bb.0:
1895; CHECK-LDAPR-O1-NEXT:    ldar w0, [x0]
1896; CHECK-LDAPR-O1-NEXT:    ldapr x1, [x1]
1897; CHECK-LDAPR-O1-NEXT:    ret
1898;
1899; CHECK-LDAPR-O0-LABEL: load_acq:
1900; CHECK-LDAPR-O0:       ; %bb.0:
1901; CHECK-LDAPR-O0-NEXT:    ldar w0, [x0]
1902; CHECK-LDAPR-O0-NEXT:    ldapr x1, [x1]
1903; CHECK-LDAPR-O0-NEXT:    ret
1904  %val32 = load atomic i32, i32* %p32 seq_cst, align 4
1905  %tmp = insertvalue { i32, i64 } undef, i32 %val32, 0
1906
1907  %val64 = load atomic i64, i64* %p64 acquire, align 8
1908  %res = insertvalue { i32, i64 } %tmp, i64 %val64, 1
1909
1910  ret { i32, i64 } %res
1911}
1912
1913define i32 @load_sext(i8* %p8, i16* %p16) {
1914; CHECK-NOLSE-O1-LABEL: load_sext:
1915; CHECK-NOLSE-O1:       ; %bb.0:
1916; CHECK-NOLSE-O1-NEXT:    ldarb w8, [x0]
1917; CHECK-NOLSE-O1-NEXT:    ldrh w9, [x1]
1918; CHECK-NOLSE-O1-NEXT:    sxth w9, w9
1919; CHECK-NOLSE-O1-NEXT:    add w0, w9, w8, sxtb
1920; CHECK-NOLSE-O1-NEXT:    ret
1921;
1922; CHECK-NOLSE-O0-LABEL: load_sext:
1923; CHECK-NOLSE-O0:       ; %bb.0:
1924; CHECK-NOLSE-O0-NEXT:    ldarb w9, [x0]
1925; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x1]
1926; CHECK-NOLSE-O0-NEXT:    sxth w8, w8
1927; CHECK-NOLSE-O0-NEXT:    add w0, w8, w9, sxtb
1928; CHECK-NOLSE-O0-NEXT:    ret
1929;
1930; CHECK-LSE-O1-LABEL: load_sext:
1931; CHECK-LSE-O1:       ; %bb.0:
1932; CHECK-LSE-O1-NEXT:    ldarb w8, [x0]
1933; CHECK-LSE-O1-NEXT:    ldrh w9, [x1]
1934; CHECK-LSE-O1-NEXT:    sxth w9, w9
1935; CHECK-LSE-O1-NEXT:    add w0, w9, w8, sxtb
1936; CHECK-LSE-O1-NEXT:    ret
1937;
1938; CHECK-LSE-O0-LABEL: load_sext:
1939; CHECK-LSE-O0:       ; %bb.0:
1940; CHECK-LSE-O0-NEXT:    ldarb w9, [x0]
1941; CHECK-LSE-O0-NEXT:    ldrh w8, [x1]
1942; CHECK-LSE-O0-NEXT:    sxth w8, w8
1943; CHECK-LSE-O0-NEXT:    add w0, w8, w9, sxtb
1944; CHECK-LSE-O0-NEXT:    ret
1945;
1946; CHECK-LDAPR-O1-LABEL: load_sext:
1947; CHECK-LDAPR-O1:       ; %bb.0:
1948; CHECK-LDAPR-O1-NEXT:    ldaprb w8, [x0]
1949; CHECK-LDAPR-O1-NEXT:    ldrh w9, [x1]
1950; CHECK-LDAPR-O1-NEXT:    sxth w9, w9
1951; CHECK-LDAPR-O1-NEXT:    add w0, w9, w8, sxtb
1952; CHECK-LDAPR-O1-NEXT:    ret
1953;
1954; CHECK-LDAPR-O0-LABEL: load_sext:
1955; CHECK-LDAPR-O0:       ; %bb.0:
1956; CHECK-LDAPR-O0-NEXT:    ldaprb w9, [x0]
1957; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x1]
1958; CHECK-LDAPR-O0-NEXT:    sxth w8, w8
1959; CHECK-LDAPR-O0-NEXT:    add w0, w8, w9, sxtb
1960; CHECK-LDAPR-O0-NEXT:    ret
1961  %val1.8 = load atomic i8, i8* %p8 acquire, align 1
1962  %val1 = sext i8 %val1.8 to i32
1963
1964  %val2.16 = load atomic i16, i16* %p16 unordered, align 2
1965  %val2 = sext i16 %val2.16 to i32
1966
1967  %res = add i32 %val1, %val2
1968  ret i32 %res
1969}
1970
1971define void @store_trunc(i32 %val, i8* %p8, i16* %p16) {
1972; CHECK-NOLSE-LABEL: store_trunc:
1973; CHECK-NOLSE:       ; %bb.0:
1974; CHECK-NOLSE-NEXT:    stlrb w0, [x1]
1975; CHECK-NOLSE-NEXT:    strh w0, [x2]
1976; CHECK-NOLSE-NEXT:    ret
1977;
1978; CHECK-LSE-O1-LABEL: store_trunc:
1979; CHECK-LSE-O1:       ; %bb.0:
1980; CHECK-LSE-O1-NEXT:    stlrb w0, [x1]
1981; CHECK-LSE-O1-NEXT:    strh w0, [x2]
1982; CHECK-LSE-O1-NEXT:    ret
1983;
1984; CHECK-LSE-O0-LABEL: store_trunc:
1985; CHECK-LSE-O0:       ; %bb.0:
1986; CHECK-LSE-O0-NEXT:    stlrb w0, [x1]
1987; CHECK-LSE-O0-NEXT:    strh w0, [x2]
1988; CHECK-LSE-O0-NEXT:    ret
1989;
1990; CHECK-LDAPR-O1-LABEL: store_trunc:
1991; CHECK-LDAPR-O1:       ; %bb.0:
1992; CHECK-LDAPR-O1-NEXT:    stlrb w0, [x1]
1993; CHECK-LDAPR-O1-NEXT:    strh w0, [x2]
1994; CHECK-LDAPR-O1-NEXT:    ret
1995;
1996; CHECK-LDAPR-O0-LABEL: store_trunc:
1997; CHECK-LDAPR-O0:       ; %bb.0:
1998; CHECK-LDAPR-O0-NEXT:    stlrb w0, [x1]
1999; CHECK-LDAPR-O0-NEXT:    strh w0, [x2]
2000; CHECK-LDAPR-O0-NEXT:    ret
2001  %val8 = trunc i32 %val to i8
2002  store atomic i8 %val8, i8* %p8 seq_cst, align 1
2003
2004  %val16 = trunc i32 %val to i16
2005  store atomic i16 %val16, i16* %p16 monotonic, align 2
2006
2007  ret void
2008}
2009
2010define i8 @atomicrmw_add_i8(i8* %ptr, i8 %rhs) {
2011; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i8:
2012; CHECK-NOLSE-O1:       ; %bb.0:
2013; CHECK-NOLSE-O1-NEXT:  LBB27_1: ; %atomicrmw.start
2014; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2015; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
2016; CHECK-NOLSE-O1-NEXT:    add w9, w8, w1
2017; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
2018; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB27_1
2019; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2020; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2021; CHECK-NOLSE-O1-NEXT:    ret
2022;
2023; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i8:
2024; CHECK-NOLSE-O0:       ; %bb.0:
2025; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2026; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2027; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2028; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2029; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2030; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2031; CHECK-NOLSE-O0-NEXT:    b LBB27_1
2032; CHECK-NOLSE-O0-NEXT:  LBB27_1: ; %atomicrmw.start
2033; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2034; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB27_2 Depth 2
2035; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2036; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2037; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2038; CHECK-NOLSE-O0-NEXT:    add w12, w8, w10, uxth
2039; CHECK-NOLSE-O0-NEXT:  LBB27_2: ; %atomicrmw.start
2040; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB27_1 Depth=1
2041; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2042; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2043; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2044; CHECK-NOLSE-O0-NEXT:    b.ne LBB27_4
2045; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2046; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB27_2 Depth=2
2047; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2048; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB27_2
2049; CHECK-NOLSE-O0-NEXT:  LBB27_4: ; %atomicrmw.start
2050; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB27_1 Depth=1
2051; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2052; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2053; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2054; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2055; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2056; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB27_1
2057; CHECK-NOLSE-O0-NEXT:    b LBB27_5
2058; CHECK-NOLSE-O0-NEXT:  LBB27_5: ; %atomicrmw.end
2059; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2060; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2061; CHECK-NOLSE-O0-NEXT:    ret
2062;
2063; CHECK-LSE-O1-LABEL: atomicrmw_add_i8:
2064; CHECK-LSE-O1:       ; %bb.0:
2065; CHECK-LSE-O1-NEXT:    ldaddalb w1, w0, [x0]
2066; CHECK-LSE-O1-NEXT:    ret
2067;
2068; CHECK-LSE-O0-LABEL: atomicrmw_add_i8:
2069; CHECK-LSE-O0:       ; %bb.0:
2070; CHECK-LSE-O0-NEXT:    ldaddalb w1, w0, [x0]
2071; CHECK-LSE-O0-NEXT:    ret
2072;
2073; CHECK-LDAPR-O1-LABEL: atomicrmw_add_i8:
2074; CHECK-LDAPR-O1:       ; %bb.0:
2075; CHECK-LDAPR-O1-NEXT:  LBB27_1: ; %atomicrmw.start
2076; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2077; CHECK-LDAPR-O1-NEXT:    ldaxrb w8, [x0]
2078; CHECK-LDAPR-O1-NEXT:    add w9, w8, w1
2079; CHECK-LDAPR-O1-NEXT:    stlxrb w10, w9, [x0]
2080; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB27_1
2081; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2082; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2083; CHECK-LDAPR-O1-NEXT:    ret
2084;
2085; CHECK-LDAPR-O0-LABEL: atomicrmw_add_i8:
2086; CHECK-LDAPR-O0:       ; %bb.0:
2087; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2088; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2089; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2090; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2091; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2092; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2093; CHECK-LDAPR-O0-NEXT:    b LBB27_1
2094; CHECK-LDAPR-O0-NEXT:  LBB27_1: ; %atomicrmw.start
2095; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2096; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB27_2 Depth 2
2097; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2098; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2099; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2100; CHECK-LDAPR-O0-NEXT:    add w12, w8, w10, uxth
2101; CHECK-LDAPR-O0-NEXT:  LBB27_2: ; %atomicrmw.start
2102; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB27_1 Depth=1
2103; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2104; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2105; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2106; CHECK-LDAPR-O0-NEXT:    b.ne LBB27_4
2107; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2108; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB27_2 Depth=2
2109; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2110; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB27_2
2111; CHECK-LDAPR-O0-NEXT:  LBB27_4: ; %atomicrmw.start
2112; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB27_1 Depth=1
2113; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2114; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2115; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2116; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2117; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2118; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB27_1
2119; CHECK-LDAPR-O0-NEXT:    b LBB27_5
2120; CHECK-LDAPR-O0-NEXT:  LBB27_5: ; %atomicrmw.end
2121; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2122; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2123; CHECK-LDAPR-O0-NEXT:    ret
2124  %res = atomicrmw add i8* %ptr, i8 %rhs seq_cst
2125  ret i8 %res
2126}
2127
2128define i8 @atomicrmw_xchg_i8(i8* %ptr, i8 %rhs) {
2129; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i8:
2130; CHECK-NOLSE-O1:       ; %bb.0:
2131; CHECK-NOLSE-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
2132; CHECK-NOLSE-O1-NEXT:  LBB28_1: ; %atomicrmw.start
2133; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2134; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
2135; CHECK-NOLSE-O1-NEXT:    stxrb w9, w1, [x0]
2136; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB28_1
2137; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2138; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2139; CHECK-NOLSE-O1-NEXT:    ret
2140;
2141; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i8:
2142; CHECK-NOLSE-O0:       ; %bb.0:
2143; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2144; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2145; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2146; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2147; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2148; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2149; CHECK-NOLSE-O0-NEXT:    b LBB28_1
2150; CHECK-NOLSE-O0-NEXT:  LBB28_1: ; %atomicrmw.start
2151; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2152; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB28_2 Depth 2
2153; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2154; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2155; CHECK-NOLSE-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
2156; CHECK-NOLSE-O0-NEXT:  LBB28_2: ; %atomicrmw.start
2157; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB28_1 Depth=1
2158; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2159; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2160; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2161; CHECK-NOLSE-O0-NEXT:    b.ne LBB28_4
2162; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2163; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB28_2 Depth=2
2164; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2165; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB28_2
2166; CHECK-NOLSE-O0-NEXT:  LBB28_4: ; %atomicrmw.start
2167; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB28_1 Depth=1
2168; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2169; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2170; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2171; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2172; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2173; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB28_1
2174; CHECK-NOLSE-O0-NEXT:    b LBB28_5
2175; CHECK-NOLSE-O0-NEXT:  LBB28_5: ; %atomicrmw.end
2176; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2177; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2178; CHECK-NOLSE-O0-NEXT:    ret
2179;
2180; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i8:
2181; CHECK-LSE-O1:       ; %bb.0:
2182; CHECK-LSE-O1-NEXT:    swpb w1, w0, [x0]
2183; CHECK-LSE-O1-NEXT:    ret
2184;
2185; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i8:
2186; CHECK-LSE-O0:       ; %bb.0:
2187; CHECK-LSE-O0-NEXT:    swpb w1, w0, [x0]
2188; CHECK-LSE-O0-NEXT:    ret
2189;
2190; CHECK-LDAPR-O1-LABEL: atomicrmw_xchg_i8:
2191; CHECK-LDAPR-O1:       ; %bb.0:
2192; CHECK-LDAPR-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
2193; CHECK-LDAPR-O1-NEXT:  LBB28_1: ; %atomicrmw.start
2194; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2195; CHECK-LDAPR-O1-NEXT:    ldxrb w8, [x0]
2196; CHECK-LDAPR-O1-NEXT:    stxrb w9, w1, [x0]
2197; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB28_1
2198; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2199; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2200; CHECK-LDAPR-O1-NEXT:    ret
2201;
2202; CHECK-LDAPR-O0-LABEL: atomicrmw_xchg_i8:
2203; CHECK-LDAPR-O0:       ; %bb.0:
2204; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2205; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2206; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2207; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2208; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2209; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2210; CHECK-LDAPR-O0-NEXT:    b LBB28_1
2211; CHECK-LDAPR-O0-NEXT:  LBB28_1: ; %atomicrmw.start
2212; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2213; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB28_2 Depth 2
2214; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2215; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2216; CHECK-LDAPR-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
2217; CHECK-LDAPR-O0-NEXT:  LBB28_2: ; %atomicrmw.start
2218; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB28_1 Depth=1
2219; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2220; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2221; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2222; CHECK-LDAPR-O0-NEXT:    b.ne LBB28_4
2223; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2224; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB28_2 Depth=2
2225; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2226; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB28_2
2227; CHECK-LDAPR-O0-NEXT:  LBB28_4: ; %atomicrmw.start
2228; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB28_1 Depth=1
2229; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2230; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2231; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2232; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2233; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2234; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB28_1
2235; CHECK-LDAPR-O0-NEXT:    b LBB28_5
2236; CHECK-LDAPR-O0-NEXT:  LBB28_5: ; %atomicrmw.end
2237; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2238; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2239; CHECK-LDAPR-O0-NEXT:    ret
2240  %res = atomicrmw xchg i8* %ptr, i8 %rhs monotonic
2241  ret i8 %res
2242}
2243
2244define i8 @atomicrmw_sub_i8(i8* %ptr, i8 %rhs) {
2245; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i8:
2246; CHECK-NOLSE-O1:       ; %bb.0:
2247; CHECK-NOLSE-O1-NEXT:  LBB29_1: ; %atomicrmw.start
2248; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2249; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
2250; CHECK-NOLSE-O1-NEXT:    sub w9, w8, w1
2251; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
2252; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB29_1
2253; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2254; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2255; CHECK-NOLSE-O1-NEXT:    ret
2256;
2257; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i8:
2258; CHECK-NOLSE-O0:       ; %bb.0:
2259; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2260; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2261; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2262; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2263; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2264; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2265; CHECK-NOLSE-O0-NEXT:    b LBB29_1
2266; CHECK-NOLSE-O0-NEXT:  LBB29_1: ; %atomicrmw.start
2267; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2268; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB29_2 Depth 2
2269; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2270; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2271; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2272; CHECK-NOLSE-O0-NEXT:    subs w12, w10, w8
2273; CHECK-NOLSE-O0-NEXT:  LBB29_2: ; %atomicrmw.start
2274; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB29_1 Depth=1
2275; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2276; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2277; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2278; CHECK-NOLSE-O0-NEXT:    b.ne LBB29_4
2279; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2280; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB29_2 Depth=2
2281; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2282; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB29_2
2283; CHECK-NOLSE-O0-NEXT:  LBB29_4: ; %atomicrmw.start
2284; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB29_1 Depth=1
2285; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2286; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2287; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2288; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2289; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2290; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB29_1
2291; CHECK-NOLSE-O0-NEXT:    b LBB29_5
2292; CHECK-NOLSE-O0-NEXT:  LBB29_5: ; %atomicrmw.end
2293; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2294; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2295; CHECK-NOLSE-O0-NEXT:    ret
2296;
2297; CHECK-LSE-O1-LABEL: atomicrmw_sub_i8:
2298; CHECK-LSE-O1:       ; %bb.0:
2299; CHECK-LSE-O1-NEXT:    neg w8, w1
2300; CHECK-LSE-O1-NEXT:    ldaddab w8, w0, [x0]
2301; CHECK-LSE-O1-NEXT:    ret
2302;
2303; CHECK-LSE-O0-LABEL: atomicrmw_sub_i8:
2304; CHECK-LSE-O0:       ; %bb.0:
2305; CHECK-LSE-O0-NEXT:    neg w8, w1
2306; CHECK-LSE-O0-NEXT:    ldaddab w8, w0, [x0]
2307; CHECK-LSE-O0-NEXT:    ret
2308;
2309; CHECK-LDAPR-O1-LABEL: atomicrmw_sub_i8:
2310; CHECK-LDAPR-O1:       ; %bb.0:
2311; CHECK-LDAPR-O1-NEXT:  LBB29_1: ; %atomicrmw.start
2312; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2313; CHECK-LDAPR-O1-NEXT:    ldaxrb w8, [x0]
2314; CHECK-LDAPR-O1-NEXT:    sub w9, w8, w1
2315; CHECK-LDAPR-O1-NEXT:    stxrb w10, w9, [x0]
2316; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB29_1
2317; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2318; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2319; CHECK-LDAPR-O1-NEXT:    ret
2320;
2321; CHECK-LDAPR-O0-LABEL: atomicrmw_sub_i8:
2322; CHECK-LDAPR-O0:       ; %bb.0:
2323; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2324; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2325; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2326; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2327; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2328; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2329; CHECK-LDAPR-O0-NEXT:    b LBB29_1
2330; CHECK-LDAPR-O0-NEXT:  LBB29_1: ; %atomicrmw.start
2331; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2332; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB29_2 Depth 2
2333; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2334; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2335; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2336; CHECK-LDAPR-O0-NEXT:    subs w12, w10, w8
2337; CHECK-LDAPR-O0-NEXT:  LBB29_2: ; %atomicrmw.start
2338; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB29_1 Depth=1
2339; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2340; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2341; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2342; CHECK-LDAPR-O0-NEXT:    b.ne LBB29_4
2343; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2344; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB29_2 Depth=2
2345; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2346; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB29_2
2347; CHECK-LDAPR-O0-NEXT:  LBB29_4: ; %atomicrmw.start
2348; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB29_1 Depth=1
2349; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2350; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2351; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2352; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2353; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2354; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB29_1
2355; CHECK-LDAPR-O0-NEXT:    b LBB29_5
2356; CHECK-LDAPR-O0-NEXT:  LBB29_5: ; %atomicrmw.end
2357; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2358; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2359; CHECK-LDAPR-O0-NEXT:    ret
2360  %res = atomicrmw sub i8* %ptr, i8 %rhs acquire
2361  ret i8 %res
2362}
2363
2364define i8 @atomicrmw_and_i8(i8* %ptr, i8 %rhs) {
2365; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i8:
2366; CHECK-NOLSE-O1:       ; %bb.0:
2367; CHECK-NOLSE-O1-NEXT:  LBB30_1: ; %atomicrmw.start
2368; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2369; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
2370; CHECK-NOLSE-O1-NEXT:    and w9, w8, w1
2371; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
2372; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB30_1
2373; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2374; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2375; CHECK-NOLSE-O1-NEXT:    ret
2376;
2377; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i8:
2378; CHECK-NOLSE-O0:       ; %bb.0:
2379; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2380; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2381; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2382; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2383; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2384; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2385; CHECK-NOLSE-O0-NEXT:    b LBB30_1
2386; CHECK-NOLSE-O0-NEXT:  LBB30_1: ; %atomicrmw.start
2387; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2388; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB30_2 Depth 2
2389; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2390; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2391; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2392; CHECK-NOLSE-O0-NEXT:    and w12, w10, w8
2393; CHECK-NOLSE-O0-NEXT:  LBB30_2: ; %atomicrmw.start
2394; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB30_1 Depth=1
2395; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2396; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2397; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2398; CHECK-NOLSE-O0-NEXT:    b.ne LBB30_4
2399; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2400; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB30_2 Depth=2
2401; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2402; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB30_2
2403; CHECK-NOLSE-O0-NEXT:  LBB30_4: ; %atomicrmw.start
2404; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB30_1 Depth=1
2405; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2406; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2407; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2408; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2409; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2410; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB30_1
2411; CHECK-NOLSE-O0-NEXT:    b LBB30_5
2412; CHECK-NOLSE-O0-NEXT:  LBB30_5: ; %atomicrmw.end
2413; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2414; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2415; CHECK-NOLSE-O0-NEXT:    ret
2416;
2417; CHECK-LSE-O1-LABEL: atomicrmw_and_i8:
2418; CHECK-LSE-O1:       ; %bb.0:
2419; CHECK-LSE-O1-NEXT:    mvn w8, w1
2420; CHECK-LSE-O1-NEXT:    ldclrlb w8, w0, [x0]
2421; CHECK-LSE-O1-NEXT:    ret
2422;
2423; CHECK-LSE-O0-LABEL: atomicrmw_and_i8:
2424; CHECK-LSE-O0:       ; %bb.0:
2425; CHECK-LSE-O0-NEXT:    mvn w8, w1
2426; CHECK-LSE-O0-NEXT:    ldclrlb w8, w0, [x0]
2427; CHECK-LSE-O0-NEXT:    ret
2428;
2429; CHECK-LDAPR-O1-LABEL: atomicrmw_and_i8:
2430; CHECK-LDAPR-O1:       ; %bb.0:
2431; CHECK-LDAPR-O1-NEXT:  LBB30_1: ; %atomicrmw.start
2432; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2433; CHECK-LDAPR-O1-NEXT:    ldxrb w8, [x0]
2434; CHECK-LDAPR-O1-NEXT:    and w9, w8, w1
2435; CHECK-LDAPR-O1-NEXT:    stlxrb w10, w9, [x0]
2436; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB30_1
2437; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2438; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2439; CHECK-LDAPR-O1-NEXT:    ret
2440;
2441; CHECK-LDAPR-O0-LABEL: atomicrmw_and_i8:
2442; CHECK-LDAPR-O0:       ; %bb.0:
2443; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2444; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2445; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2446; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2447; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2448; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2449; CHECK-LDAPR-O0-NEXT:    b LBB30_1
2450; CHECK-LDAPR-O0-NEXT:  LBB30_1: ; %atomicrmw.start
2451; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2452; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB30_2 Depth 2
2453; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2454; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2455; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2456; CHECK-LDAPR-O0-NEXT:    and w12, w10, w8
2457; CHECK-LDAPR-O0-NEXT:  LBB30_2: ; %atomicrmw.start
2458; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB30_1 Depth=1
2459; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2460; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2461; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2462; CHECK-LDAPR-O0-NEXT:    b.ne LBB30_4
2463; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2464; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB30_2 Depth=2
2465; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2466; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB30_2
2467; CHECK-LDAPR-O0-NEXT:  LBB30_4: ; %atomicrmw.start
2468; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB30_1 Depth=1
2469; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2470; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2471; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2472; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2473; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2474; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB30_1
2475; CHECK-LDAPR-O0-NEXT:    b LBB30_5
2476; CHECK-LDAPR-O0-NEXT:  LBB30_5: ; %atomicrmw.end
2477; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2478; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2479; CHECK-LDAPR-O0-NEXT:    ret
2480  %res = atomicrmw and i8* %ptr, i8 %rhs release
2481  ret i8 %res
2482}
2483
2484define i8 @atomicrmw_or_i8(i8* %ptr, i8 %rhs) {
2485; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i8:
2486; CHECK-NOLSE-O1:       ; %bb.0:
2487; CHECK-NOLSE-O1-NEXT:  LBB31_1: ; %atomicrmw.start
2488; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2489; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
2490; CHECK-NOLSE-O1-NEXT:    orr w9, w8, w1
2491; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
2492; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB31_1
2493; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2494; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2495; CHECK-NOLSE-O1-NEXT:    ret
2496;
2497; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i8:
2498; CHECK-NOLSE-O0:       ; %bb.0:
2499; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2500; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2501; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2502; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2503; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2504; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2505; CHECK-NOLSE-O0-NEXT:    b LBB31_1
2506; CHECK-NOLSE-O0-NEXT:  LBB31_1: ; %atomicrmw.start
2507; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2508; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB31_2 Depth 2
2509; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2510; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2511; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2512; CHECK-NOLSE-O0-NEXT:    orr w12, w10, w8
2513; CHECK-NOLSE-O0-NEXT:  LBB31_2: ; %atomicrmw.start
2514; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB31_1 Depth=1
2515; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2516; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2517; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2518; CHECK-NOLSE-O0-NEXT:    b.ne LBB31_4
2519; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2520; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB31_2 Depth=2
2521; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2522; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB31_2
2523; CHECK-NOLSE-O0-NEXT:  LBB31_4: ; %atomicrmw.start
2524; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB31_1 Depth=1
2525; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2526; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2527; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2528; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2529; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2530; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB31_1
2531; CHECK-NOLSE-O0-NEXT:    b LBB31_5
2532; CHECK-NOLSE-O0-NEXT:  LBB31_5: ; %atomicrmw.end
2533; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2534; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2535; CHECK-NOLSE-O0-NEXT:    ret
2536;
2537; CHECK-LSE-O1-LABEL: atomicrmw_or_i8:
2538; CHECK-LSE-O1:       ; %bb.0:
2539; CHECK-LSE-O1-NEXT:    ldsetalb w1, w0, [x0]
2540; CHECK-LSE-O1-NEXT:    ret
2541;
2542; CHECK-LSE-O0-LABEL: atomicrmw_or_i8:
2543; CHECK-LSE-O0:       ; %bb.0:
2544; CHECK-LSE-O0-NEXT:    ldsetalb w1, w0, [x0]
2545; CHECK-LSE-O0-NEXT:    ret
2546;
2547; CHECK-LDAPR-O1-LABEL: atomicrmw_or_i8:
2548; CHECK-LDAPR-O1:       ; %bb.0:
2549; CHECK-LDAPR-O1-NEXT:  LBB31_1: ; %atomicrmw.start
2550; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2551; CHECK-LDAPR-O1-NEXT:    ldaxrb w8, [x0]
2552; CHECK-LDAPR-O1-NEXT:    orr w9, w8, w1
2553; CHECK-LDAPR-O1-NEXT:    stlxrb w10, w9, [x0]
2554; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB31_1
2555; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2556; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2557; CHECK-LDAPR-O1-NEXT:    ret
2558;
2559; CHECK-LDAPR-O0-LABEL: atomicrmw_or_i8:
2560; CHECK-LDAPR-O0:       ; %bb.0:
2561; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2562; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2563; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2564; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2565; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2566; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2567; CHECK-LDAPR-O0-NEXT:    b LBB31_1
2568; CHECK-LDAPR-O0-NEXT:  LBB31_1: ; %atomicrmw.start
2569; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2570; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB31_2 Depth 2
2571; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2572; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2573; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2574; CHECK-LDAPR-O0-NEXT:    orr w12, w10, w8
2575; CHECK-LDAPR-O0-NEXT:  LBB31_2: ; %atomicrmw.start
2576; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB31_1 Depth=1
2577; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2578; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2579; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2580; CHECK-LDAPR-O0-NEXT:    b.ne LBB31_4
2581; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2582; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB31_2 Depth=2
2583; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2584; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB31_2
2585; CHECK-LDAPR-O0-NEXT:  LBB31_4: ; %atomicrmw.start
2586; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB31_1 Depth=1
2587; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2588; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2589; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2590; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2591; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2592; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB31_1
2593; CHECK-LDAPR-O0-NEXT:    b LBB31_5
2594; CHECK-LDAPR-O0-NEXT:  LBB31_5: ; %atomicrmw.end
2595; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2596; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2597; CHECK-LDAPR-O0-NEXT:    ret
2598  %res = atomicrmw or i8* %ptr, i8 %rhs seq_cst
2599  ret i8 %res
2600}
2601
2602define i8 @atomicrmw_xor_i8(i8* %ptr, i8 %rhs) {
2603; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i8:
2604; CHECK-NOLSE-O1:       ; %bb.0:
2605; CHECK-NOLSE-O1-NEXT:  LBB32_1: ; %atomicrmw.start
2606; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2607; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
2608; CHECK-NOLSE-O1-NEXT:    eor w9, w8, w1
2609; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
2610; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB32_1
2611; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2612; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2613; CHECK-NOLSE-O1-NEXT:    ret
2614;
2615; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i8:
2616; CHECK-NOLSE-O0:       ; %bb.0:
2617; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2618; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2619; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2620; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2621; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2622; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2623; CHECK-NOLSE-O0-NEXT:    b LBB32_1
2624; CHECK-NOLSE-O0-NEXT:  LBB32_1: ; %atomicrmw.start
2625; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2626; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB32_2 Depth 2
2627; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2628; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2629; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2630; CHECK-NOLSE-O0-NEXT:    eor w12, w10, w8
2631; CHECK-NOLSE-O0-NEXT:  LBB32_2: ; %atomicrmw.start
2632; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB32_1 Depth=1
2633; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2634; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2635; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2636; CHECK-NOLSE-O0-NEXT:    b.ne LBB32_4
2637; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2638; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB32_2 Depth=2
2639; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2640; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB32_2
2641; CHECK-NOLSE-O0-NEXT:  LBB32_4: ; %atomicrmw.start
2642; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB32_1 Depth=1
2643; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2644; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2645; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2646; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2647; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2648; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB32_1
2649; CHECK-NOLSE-O0-NEXT:    b LBB32_5
2650; CHECK-NOLSE-O0-NEXT:  LBB32_5: ; %atomicrmw.end
2651; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2652; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2653; CHECK-NOLSE-O0-NEXT:    ret
2654;
2655; CHECK-LSE-O1-LABEL: atomicrmw_xor_i8:
2656; CHECK-LSE-O1:       ; %bb.0:
2657; CHECK-LSE-O1-NEXT:    ldeorb w1, w0, [x0]
2658; CHECK-LSE-O1-NEXT:    ret
2659;
2660; CHECK-LSE-O0-LABEL: atomicrmw_xor_i8:
2661; CHECK-LSE-O0:       ; %bb.0:
2662; CHECK-LSE-O0-NEXT:    ldeorb w1, w0, [x0]
2663; CHECK-LSE-O0-NEXT:    ret
2664;
2665; CHECK-LDAPR-O1-LABEL: atomicrmw_xor_i8:
2666; CHECK-LDAPR-O1:       ; %bb.0:
2667; CHECK-LDAPR-O1-NEXT:  LBB32_1: ; %atomicrmw.start
2668; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2669; CHECK-LDAPR-O1-NEXT:    ldxrb w8, [x0]
2670; CHECK-LDAPR-O1-NEXT:    eor w9, w8, w1
2671; CHECK-LDAPR-O1-NEXT:    stxrb w10, w9, [x0]
2672; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB32_1
2673; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2674; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2675; CHECK-LDAPR-O1-NEXT:    ret
2676;
2677; CHECK-LDAPR-O0-LABEL: atomicrmw_xor_i8:
2678; CHECK-LDAPR-O0:       ; %bb.0:
2679; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2680; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2681; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2682; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2683; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2684; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2685; CHECK-LDAPR-O0-NEXT:    b LBB32_1
2686; CHECK-LDAPR-O0-NEXT:  LBB32_1: ; %atomicrmw.start
2687; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2688; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB32_2 Depth 2
2689; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2690; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2691; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2692; CHECK-LDAPR-O0-NEXT:    eor w12, w10, w8
2693; CHECK-LDAPR-O0-NEXT:  LBB32_2: ; %atomicrmw.start
2694; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB32_1 Depth=1
2695; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2696; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2697; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2698; CHECK-LDAPR-O0-NEXT:    b.ne LBB32_4
2699; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2700; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB32_2 Depth=2
2701; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2702; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB32_2
2703; CHECK-LDAPR-O0-NEXT:  LBB32_4: ; %atomicrmw.start
2704; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB32_1 Depth=1
2705; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2706; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2707; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2708; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2709; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2710; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB32_1
2711; CHECK-LDAPR-O0-NEXT:    b LBB32_5
2712; CHECK-LDAPR-O0-NEXT:  LBB32_5: ; %atomicrmw.end
2713; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2714; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2715; CHECK-LDAPR-O0-NEXT:    ret
2716  %res = atomicrmw xor i8* %ptr, i8 %rhs monotonic
2717  ret i8 %res
2718}
2719
2720define i8 @atomicrmw_min_i8(i8* %ptr, i8 %rhs) {
2721; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i8:
2722; CHECK-NOLSE-O1:       ; %bb.0:
2723; CHECK-NOLSE-O1-NEXT:  LBB33_1: ; %atomicrmw.start
2724; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2725; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
2726; CHECK-NOLSE-O1-NEXT:    sxtb w9, w8
2727; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxtb
2728; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, le
2729; CHECK-NOLSE-O1-NEXT:    stxrb w10, w9, [x0]
2730; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB33_1
2731; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2732; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2733; CHECK-NOLSE-O1-NEXT:    ret
2734;
2735; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i8:
2736; CHECK-NOLSE-O0:       ; %bb.0:
2737; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2738; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2739; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2740; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2741; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2742; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2743; CHECK-NOLSE-O0-NEXT:    b LBB33_1
2744; CHECK-NOLSE-O0-NEXT:  LBB33_1: ; %atomicrmw.start
2745; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2746; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB33_2 Depth 2
2747; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2748; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2749; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2750; CHECK-NOLSE-O0-NEXT:    sxtb w9, w10
2751; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, sxtb
2752; CHECK-NOLSE-O0-NEXT:    cset w9, le
2753; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
2754; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
2755; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
2756; CHECK-NOLSE-O0-NEXT:  LBB33_2: ; %atomicrmw.start
2757; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB33_1 Depth=1
2758; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2759; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2760; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2761; CHECK-NOLSE-O0-NEXT:    b.ne LBB33_4
2762; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2763; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB33_2 Depth=2
2764; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2765; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB33_2
2766; CHECK-NOLSE-O0-NEXT:  LBB33_4: ; %atomicrmw.start
2767; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB33_1 Depth=1
2768; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2769; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2770; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2771; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2772; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2773; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB33_1
2774; CHECK-NOLSE-O0-NEXT:    b LBB33_5
2775; CHECK-NOLSE-O0-NEXT:  LBB33_5: ; %atomicrmw.end
2776; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2777; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2778; CHECK-NOLSE-O0-NEXT:    ret
2779;
2780; CHECK-LSE-O1-LABEL: atomicrmw_min_i8:
2781; CHECK-LSE-O1:       ; %bb.0:
2782; CHECK-LSE-O1-NEXT:    ldsminab w1, w0, [x0]
2783; CHECK-LSE-O1-NEXT:    ret
2784;
2785; CHECK-LSE-O0-LABEL: atomicrmw_min_i8:
2786; CHECK-LSE-O0:       ; %bb.0:
2787; CHECK-LSE-O0-NEXT:    ldsminab w1, w0, [x0]
2788; CHECK-LSE-O0-NEXT:    ret
2789;
2790; CHECK-LDAPR-O1-LABEL: atomicrmw_min_i8:
2791; CHECK-LDAPR-O1:       ; %bb.0:
2792; CHECK-LDAPR-O1-NEXT:  LBB33_1: ; %atomicrmw.start
2793; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2794; CHECK-LDAPR-O1-NEXT:    ldaxrb w8, [x0]
2795; CHECK-LDAPR-O1-NEXT:    sxtb w9, w8
2796; CHECK-LDAPR-O1-NEXT:    cmp w9, w1, sxtb
2797; CHECK-LDAPR-O1-NEXT:    csel w9, w8, w1, le
2798; CHECK-LDAPR-O1-NEXT:    stxrb w10, w9, [x0]
2799; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB33_1
2800; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2801; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2802; CHECK-LDAPR-O1-NEXT:    ret
2803;
2804; CHECK-LDAPR-O0-LABEL: atomicrmw_min_i8:
2805; CHECK-LDAPR-O0:       ; %bb.0:
2806; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2807; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2808; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2809; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2810; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2811; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2812; CHECK-LDAPR-O0-NEXT:    b LBB33_1
2813; CHECK-LDAPR-O0-NEXT:  LBB33_1: ; %atomicrmw.start
2814; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2815; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB33_2 Depth 2
2816; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2817; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2818; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2819; CHECK-LDAPR-O0-NEXT:    sxtb w9, w10
2820; CHECK-LDAPR-O0-NEXT:    subs w9, w9, w8, sxtb
2821; CHECK-LDAPR-O0-NEXT:    cset w9, le
2822; CHECK-LDAPR-O0-NEXT:    and w9, w9, #0x1
2823; CHECK-LDAPR-O0-NEXT:    ands w9, w9, #0x1
2824; CHECK-LDAPR-O0-NEXT:    csel w12, w10, w8, ne
2825; CHECK-LDAPR-O0-NEXT:  LBB33_2: ; %atomicrmw.start
2826; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB33_1 Depth=1
2827; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2828; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2829; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2830; CHECK-LDAPR-O0-NEXT:    b.ne LBB33_4
2831; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2832; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB33_2 Depth=2
2833; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2834; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB33_2
2835; CHECK-LDAPR-O0-NEXT:  LBB33_4: ; %atomicrmw.start
2836; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB33_1 Depth=1
2837; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2838; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2839; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2840; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2841; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2842; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB33_1
2843; CHECK-LDAPR-O0-NEXT:    b LBB33_5
2844; CHECK-LDAPR-O0-NEXT:  LBB33_5: ; %atomicrmw.end
2845; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2846; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2847; CHECK-LDAPR-O0-NEXT:    ret
2848  %res = atomicrmw min i8* %ptr, i8 %rhs acquire
2849  ret i8 %res
2850}
2851
2852define i8 @atomicrmw_max_i8(i8* %ptr, i8 %rhs) {
2853; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i8:
2854; CHECK-NOLSE-O1:       ; %bb.0:
2855; CHECK-NOLSE-O1-NEXT:  LBB34_1: ; %atomicrmw.start
2856; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2857; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
2858; CHECK-NOLSE-O1-NEXT:    sxtb w9, w8
2859; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxtb
2860; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, gt
2861; CHECK-NOLSE-O1-NEXT:    stlxrb w10, w9, [x0]
2862; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB34_1
2863; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2864; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2865; CHECK-NOLSE-O1-NEXT:    ret
2866;
2867; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i8:
2868; CHECK-NOLSE-O0:       ; %bb.0:
2869; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
2870; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
2871; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2872; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2873; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
2874; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2875; CHECK-NOLSE-O0-NEXT:    b LBB34_1
2876; CHECK-NOLSE-O0-NEXT:  LBB34_1: ; %atomicrmw.start
2877; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
2878; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB34_2 Depth 2
2879; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2880; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2881; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2882; CHECK-NOLSE-O0-NEXT:    sxtb w9, w10
2883; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, sxtb
2884; CHECK-NOLSE-O0-NEXT:    cset w9, gt
2885; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
2886; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
2887; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
2888; CHECK-NOLSE-O0-NEXT:  LBB34_2: ; %atomicrmw.start
2889; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB34_1 Depth=1
2890; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2891; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
2892; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
2893; CHECK-NOLSE-O0-NEXT:    b.ne LBB34_4
2894; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2895; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB34_2 Depth=2
2896; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
2897; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB34_2
2898; CHECK-NOLSE-O0-NEXT:  LBB34_4: ; %atomicrmw.start
2899; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB34_1 Depth=1
2900; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2901; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
2902; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
2903; CHECK-NOLSE-O0-NEXT:    cset w8, eq
2904; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2905; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB34_1
2906; CHECK-NOLSE-O0-NEXT:    b LBB34_5
2907; CHECK-NOLSE-O0-NEXT:  LBB34_5: ; %atomicrmw.end
2908; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2909; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
2910; CHECK-NOLSE-O0-NEXT:    ret
2911;
2912; CHECK-LSE-O1-LABEL: atomicrmw_max_i8:
2913; CHECK-LSE-O1:       ; %bb.0:
2914; CHECK-LSE-O1-NEXT:    ldsmaxlb w1, w0, [x0]
2915; CHECK-LSE-O1-NEXT:    ret
2916;
2917; CHECK-LSE-O0-LABEL: atomicrmw_max_i8:
2918; CHECK-LSE-O0:       ; %bb.0:
2919; CHECK-LSE-O0-NEXT:    ldsmaxlb w1, w0, [x0]
2920; CHECK-LSE-O0-NEXT:    ret
2921;
2922; CHECK-LDAPR-O1-LABEL: atomicrmw_max_i8:
2923; CHECK-LDAPR-O1:       ; %bb.0:
2924; CHECK-LDAPR-O1-NEXT:  LBB34_1: ; %atomicrmw.start
2925; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2926; CHECK-LDAPR-O1-NEXT:    ldxrb w8, [x0]
2927; CHECK-LDAPR-O1-NEXT:    sxtb w9, w8
2928; CHECK-LDAPR-O1-NEXT:    cmp w9, w1, sxtb
2929; CHECK-LDAPR-O1-NEXT:    csel w9, w8, w1, gt
2930; CHECK-LDAPR-O1-NEXT:    stlxrb w10, w9, [x0]
2931; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB34_1
2932; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2933; CHECK-LDAPR-O1-NEXT:    mov w0, w8
2934; CHECK-LDAPR-O1-NEXT:    ret
2935;
2936; CHECK-LDAPR-O0-LABEL: atomicrmw_max_i8:
2937; CHECK-LDAPR-O0:       ; %bb.0:
2938; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
2939; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
2940; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
2941; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
2942; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
2943; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
2944; CHECK-LDAPR-O0-NEXT:    b LBB34_1
2945; CHECK-LDAPR-O0-NEXT:  LBB34_1: ; %atomicrmw.start
2946; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
2947; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB34_2 Depth 2
2948; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
2949; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
2950; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
2951; CHECK-LDAPR-O0-NEXT:    sxtb w9, w10
2952; CHECK-LDAPR-O0-NEXT:    subs w9, w9, w8, sxtb
2953; CHECK-LDAPR-O0-NEXT:    cset w9, gt
2954; CHECK-LDAPR-O0-NEXT:    and w9, w9, #0x1
2955; CHECK-LDAPR-O0-NEXT:    ands w9, w9, #0x1
2956; CHECK-LDAPR-O0-NEXT:    csel w12, w10, w8, ne
2957; CHECK-LDAPR-O0-NEXT:  LBB34_2: ; %atomicrmw.start
2958; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB34_1 Depth=1
2959; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
2960; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
2961; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
2962; CHECK-LDAPR-O0-NEXT:    b.ne LBB34_4
2963; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
2964; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB34_2 Depth=2
2965; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
2966; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB34_2
2967; CHECK-LDAPR-O0-NEXT:  LBB34_4: ; %atomicrmw.start
2968; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB34_1 Depth=1
2969; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
2970; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
2971; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
2972; CHECK-LDAPR-O0-NEXT:    cset w8, eq
2973; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
2974; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB34_1
2975; CHECK-LDAPR-O0-NEXT:    b LBB34_5
2976; CHECK-LDAPR-O0-NEXT:  LBB34_5: ; %atomicrmw.end
2977; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
2978; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
2979; CHECK-LDAPR-O0-NEXT:    ret
2980  %res = atomicrmw max i8* %ptr, i8 %rhs release
2981  ret i8 %res
2982}
2983
2984define i8 @atomicrmw_umin_i8(i8* %ptr, i8 %rhs) {
2985; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i8:
2986; CHECK-NOLSE-O1:       ; %bb.0:
2987; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xff
2988; CHECK-NOLSE-O1-NEXT:  LBB35_1: ; %atomicrmw.start
2989; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
2990; CHECK-NOLSE-O1-NEXT:    ldaxrb w8, [x0]
2991; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xff
2992; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
2993; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, ls
2994; CHECK-NOLSE-O1-NEXT:    stlxrb w11, w10, [x0]
2995; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB35_1
2996; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
2997; CHECK-NOLSE-O1-NEXT:    mov w0, w8
2998; CHECK-NOLSE-O1-NEXT:    ret
2999;
3000; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i8:
3001; CHECK-NOLSE-O0:       ; %bb.0:
3002; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3003; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3004; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3005; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3006; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
3007; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3008; CHECK-NOLSE-O0-NEXT:    b LBB35_1
3009; CHECK-NOLSE-O0-NEXT:  LBB35_1: ; %atomicrmw.start
3010; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3011; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB35_2 Depth 2
3012; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
3013; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3014; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
3015; CHECK-NOLSE-O0-NEXT:    and w9, w10, #0xff
3016; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, uxtb
3017; CHECK-NOLSE-O0-NEXT:    cset w9, ls
3018; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
3019; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
3020; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
3021; CHECK-NOLSE-O0-NEXT:  LBB35_2: ; %atomicrmw.start
3022; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB35_1 Depth=1
3023; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3024; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
3025; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
3026; CHECK-NOLSE-O0-NEXT:    b.ne LBB35_4
3027; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3028; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB35_2 Depth=2
3029; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
3030; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB35_2
3031; CHECK-NOLSE-O0-NEXT:  LBB35_4: ; %atomicrmw.start
3032; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB35_1 Depth=1
3033; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3034; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
3035; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
3036; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3037; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3038; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB35_1
3039; CHECK-NOLSE-O0-NEXT:    b LBB35_5
3040; CHECK-NOLSE-O0-NEXT:  LBB35_5: ; %atomicrmw.end
3041; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3042; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3043; CHECK-NOLSE-O0-NEXT:    ret
3044;
3045; CHECK-LSE-O1-LABEL: atomicrmw_umin_i8:
3046; CHECK-LSE-O1:       ; %bb.0:
3047; CHECK-LSE-O1-NEXT:    lduminalb w1, w0, [x0]
3048; CHECK-LSE-O1-NEXT:    ret
3049;
3050; CHECK-LSE-O0-LABEL: atomicrmw_umin_i8:
3051; CHECK-LSE-O0:       ; %bb.0:
3052; CHECK-LSE-O0-NEXT:    lduminalb w1, w0, [x0]
3053; CHECK-LSE-O0-NEXT:    ret
3054;
3055; CHECK-LDAPR-O1-LABEL: atomicrmw_umin_i8:
3056; CHECK-LDAPR-O1:       ; %bb.0:
3057; CHECK-LDAPR-O1-NEXT:    and w9, w1, #0xff
3058; CHECK-LDAPR-O1-NEXT:  LBB35_1: ; %atomicrmw.start
3059; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3060; CHECK-LDAPR-O1-NEXT:    ldaxrb w8, [x0]
3061; CHECK-LDAPR-O1-NEXT:    and w10, w8, #0xff
3062; CHECK-LDAPR-O1-NEXT:    cmp w10, w9
3063; CHECK-LDAPR-O1-NEXT:    csel w10, w10, w9, ls
3064; CHECK-LDAPR-O1-NEXT:    stlxrb w11, w10, [x0]
3065; CHECK-LDAPR-O1-NEXT:    cbnz w11, LBB35_1
3066; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3067; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3068; CHECK-LDAPR-O1-NEXT:    ret
3069;
3070; CHECK-LDAPR-O0-LABEL: atomicrmw_umin_i8:
3071; CHECK-LDAPR-O0:       ; %bb.0:
3072; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3073; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3074; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3075; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3076; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
3077; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3078; CHECK-LDAPR-O0-NEXT:    b LBB35_1
3079; CHECK-LDAPR-O0-NEXT:  LBB35_1: ; %atomicrmw.start
3080; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3081; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB35_2 Depth 2
3082; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
3083; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3084; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
3085; CHECK-LDAPR-O0-NEXT:    and w9, w10, #0xff
3086; CHECK-LDAPR-O0-NEXT:    subs w9, w9, w8, uxtb
3087; CHECK-LDAPR-O0-NEXT:    cset w9, ls
3088; CHECK-LDAPR-O0-NEXT:    and w9, w9, #0x1
3089; CHECK-LDAPR-O0-NEXT:    ands w9, w9, #0x1
3090; CHECK-LDAPR-O0-NEXT:    csel w12, w10, w8, ne
3091; CHECK-LDAPR-O0-NEXT:  LBB35_2: ; %atomicrmw.start
3092; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB35_1 Depth=1
3093; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3094; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
3095; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
3096; CHECK-LDAPR-O0-NEXT:    b.ne LBB35_4
3097; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3098; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB35_2 Depth=2
3099; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
3100; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB35_2
3101; CHECK-LDAPR-O0-NEXT:  LBB35_4: ; %atomicrmw.start
3102; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB35_1 Depth=1
3103; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3104; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
3105; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
3106; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3107; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3108; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB35_1
3109; CHECK-LDAPR-O0-NEXT:    b LBB35_5
3110; CHECK-LDAPR-O0-NEXT:  LBB35_5: ; %atomicrmw.end
3111; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3112; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3113; CHECK-LDAPR-O0-NEXT:    ret
3114  %res = atomicrmw umin i8* %ptr, i8 %rhs seq_cst
3115  ret i8 %res
3116}
3117
3118define i8 @atomicrmw_umax_i8(i8* %ptr, i8 %rhs) {
3119; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i8:
3120; CHECK-NOLSE-O1:       ; %bb.0:
3121; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xff
3122; CHECK-NOLSE-O1-NEXT:  LBB36_1: ; %atomicrmw.start
3123; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3124; CHECK-NOLSE-O1-NEXT:    ldxrb w8, [x0]
3125; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xff
3126; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
3127; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, hi
3128; CHECK-NOLSE-O1-NEXT:    stxrb w11, w10, [x0]
3129; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB36_1
3130; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3131; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3132; CHECK-NOLSE-O1-NEXT:    ret
3133;
3134; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i8:
3135; CHECK-NOLSE-O0:       ; %bb.0:
3136; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3137; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3138; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3139; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3140; CHECK-NOLSE-O0-NEXT:    ldrb w8, [x0]
3141; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3142; CHECK-NOLSE-O0-NEXT:    b LBB36_1
3143; CHECK-NOLSE-O0-NEXT:  LBB36_1: ; %atomicrmw.start
3144; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3145; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB36_2 Depth 2
3146; CHECK-NOLSE-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
3147; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3148; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
3149; CHECK-NOLSE-O0-NEXT:    and w9, w10, #0xff
3150; CHECK-NOLSE-O0-NEXT:    subs w9, w9, w8, uxtb
3151; CHECK-NOLSE-O0-NEXT:    cset w9, hi
3152; CHECK-NOLSE-O0-NEXT:    and w9, w9, #0x1
3153; CHECK-NOLSE-O0-NEXT:    ands w9, w9, #0x1
3154; CHECK-NOLSE-O0-NEXT:    csel w12, w10, w8, ne
3155; CHECK-NOLSE-O0-NEXT:  LBB36_2: ; %atomicrmw.start
3156; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB36_1 Depth=1
3157; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3158; CHECK-NOLSE-O0-NEXT:    ldaxrb w9, [x11]
3159; CHECK-NOLSE-O0-NEXT:    cmp w9, w10, uxtb
3160; CHECK-NOLSE-O0-NEXT:    b.ne LBB36_4
3161; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3162; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB36_2 Depth=2
3163; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w12, [x11]
3164; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB36_2
3165; CHECK-NOLSE-O0-NEXT:  LBB36_4: ; %atomicrmw.start
3166; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB36_1 Depth=1
3167; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3168; CHECK-NOLSE-O0-NEXT:    and w8, w9, #0xff
3169; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w10, uxtb
3170; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3171; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3172; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB36_1
3173; CHECK-NOLSE-O0-NEXT:    b LBB36_5
3174; CHECK-NOLSE-O0-NEXT:  LBB36_5: ; %atomicrmw.end
3175; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3176; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3177; CHECK-NOLSE-O0-NEXT:    ret
3178;
3179; CHECK-LSE-O1-LABEL: atomicrmw_umax_i8:
3180; CHECK-LSE-O1:       ; %bb.0:
3181; CHECK-LSE-O1-NEXT:    ldumaxb w1, w0, [x0]
3182; CHECK-LSE-O1-NEXT:    ret
3183;
3184; CHECK-LSE-O0-LABEL: atomicrmw_umax_i8:
3185; CHECK-LSE-O0:       ; %bb.0:
3186; CHECK-LSE-O0-NEXT:    ldumaxb w1, w0, [x0]
3187; CHECK-LSE-O0-NEXT:    ret
3188;
3189; CHECK-LDAPR-O1-LABEL: atomicrmw_umax_i8:
3190; CHECK-LDAPR-O1:       ; %bb.0:
3191; CHECK-LDAPR-O1-NEXT:    and w9, w1, #0xff
3192; CHECK-LDAPR-O1-NEXT:  LBB36_1: ; %atomicrmw.start
3193; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3194; CHECK-LDAPR-O1-NEXT:    ldxrb w8, [x0]
3195; CHECK-LDAPR-O1-NEXT:    and w10, w8, #0xff
3196; CHECK-LDAPR-O1-NEXT:    cmp w10, w9
3197; CHECK-LDAPR-O1-NEXT:    csel w10, w10, w9, hi
3198; CHECK-LDAPR-O1-NEXT:    stxrb w11, w10, [x0]
3199; CHECK-LDAPR-O1-NEXT:    cbnz w11, LBB36_1
3200; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3201; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3202; CHECK-LDAPR-O1-NEXT:    ret
3203;
3204; CHECK-LDAPR-O0-LABEL: atomicrmw_umax_i8:
3205; CHECK-LDAPR-O0:       ; %bb.0:
3206; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3207; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3208; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3209; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3210; CHECK-LDAPR-O0-NEXT:    ldrb w8, [x0]
3211; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3212; CHECK-LDAPR-O0-NEXT:    b LBB36_1
3213; CHECK-LDAPR-O0-NEXT:  LBB36_1: ; %atomicrmw.start
3214; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3215; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB36_2 Depth 2
3216; CHECK-LDAPR-O0-NEXT:    ldr w10, [sp, #28] ; 4-byte Folded Reload
3217; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3218; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #24] ; 4-byte Folded Reload
3219; CHECK-LDAPR-O0-NEXT:    and w9, w10, #0xff
3220; CHECK-LDAPR-O0-NEXT:    subs w9, w9, w8, uxtb
3221; CHECK-LDAPR-O0-NEXT:    cset w9, hi
3222; CHECK-LDAPR-O0-NEXT:    and w9, w9, #0x1
3223; CHECK-LDAPR-O0-NEXT:    ands w9, w9, #0x1
3224; CHECK-LDAPR-O0-NEXT:    csel w12, w10, w8, ne
3225; CHECK-LDAPR-O0-NEXT:  LBB36_2: ; %atomicrmw.start
3226; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB36_1 Depth=1
3227; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3228; CHECK-LDAPR-O0-NEXT:    ldaxrb w9, [x11]
3229; CHECK-LDAPR-O0-NEXT:    cmp w9, w10, uxtb
3230; CHECK-LDAPR-O0-NEXT:    b.ne LBB36_4
3231; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3232; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB36_2 Depth=2
3233; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w12, [x11]
3234; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB36_2
3235; CHECK-LDAPR-O0-NEXT:  LBB36_4: ; %atomicrmw.start
3236; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB36_1 Depth=1
3237; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3238; CHECK-LDAPR-O0-NEXT:    and w8, w9, #0xff
3239; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w10, uxtb
3240; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3241; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3242; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB36_1
3243; CHECK-LDAPR-O0-NEXT:    b LBB36_5
3244; CHECK-LDAPR-O0-NEXT:  LBB36_5: ; %atomicrmw.end
3245; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3246; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3247; CHECK-LDAPR-O0-NEXT:    ret
3248  %res = atomicrmw umax i8* %ptr, i8 %rhs monotonic
3249  ret i8 %res
3250}
3251
3252define i16 @atomicrmw_add_i16(i16* %ptr, i16 %rhs) {
3253; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i16:
3254; CHECK-NOLSE-O1:       ; %bb.0:
3255; CHECK-NOLSE-O1-NEXT:  LBB37_1: ; %atomicrmw.start
3256; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3257; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
3258; CHECK-NOLSE-O1-NEXT:    add w9, w8, w1
3259; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
3260; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB37_1
3261; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3262; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3263; CHECK-NOLSE-O1-NEXT:    ret
3264;
3265; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i16:
3266; CHECK-NOLSE-O0:       ; %bb.0:
3267; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3268; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3269; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3270; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3271; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
3272; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3273; CHECK-NOLSE-O0-NEXT:    b LBB37_1
3274; CHECK-NOLSE-O0-NEXT:  LBB37_1: ; %atomicrmw.start
3275; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3276; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB37_2 Depth 2
3277; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3278; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3279; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3280; CHECK-NOLSE-O0-NEXT:    add w12, w9, w8, uxth
3281; CHECK-NOLSE-O0-NEXT:  LBB37_2: ; %atomicrmw.start
3282; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB37_1 Depth=1
3283; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3284; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
3285; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
3286; CHECK-NOLSE-O0-NEXT:    b.ne LBB37_4
3287; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3288; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB37_2 Depth=2
3289; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
3290; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB37_2
3291; CHECK-NOLSE-O0-NEXT:  LBB37_4: ; %atomicrmw.start
3292; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB37_1 Depth=1
3293; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3294; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
3295; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
3296; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3297; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3298; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB37_1
3299; CHECK-NOLSE-O0-NEXT:    b LBB37_5
3300; CHECK-NOLSE-O0-NEXT:  LBB37_5: ; %atomicrmw.end
3301; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3302; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3303; CHECK-NOLSE-O0-NEXT:    ret
3304;
3305; CHECK-LSE-O1-LABEL: atomicrmw_add_i16:
3306; CHECK-LSE-O1:       ; %bb.0:
3307; CHECK-LSE-O1-NEXT:    ldaddalh w1, w0, [x0]
3308; CHECK-LSE-O1-NEXT:    ret
3309;
3310; CHECK-LSE-O0-LABEL: atomicrmw_add_i16:
3311; CHECK-LSE-O0:       ; %bb.0:
3312; CHECK-LSE-O0-NEXT:    ldaddalh w1, w0, [x0]
3313; CHECK-LSE-O0-NEXT:    ret
3314;
3315; CHECK-LDAPR-O1-LABEL: atomicrmw_add_i16:
3316; CHECK-LDAPR-O1:       ; %bb.0:
3317; CHECK-LDAPR-O1-NEXT:  LBB37_1: ; %atomicrmw.start
3318; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3319; CHECK-LDAPR-O1-NEXT:    ldaxrh w8, [x0]
3320; CHECK-LDAPR-O1-NEXT:    add w9, w8, w1
3321; CHECK-LDAPR-O1-NEXT:    stlxrh w10, w9, [x0]
3322; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB37_1
3323; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3324; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3325; CHECK-LDAPR-O1-NEXT:    ret
3326;
3327; CHECK-LDAPR-O0-LABEL: atomicrmw_add_i16:
3328; CHECK-LDAPR-O0:       ; %bb.0:
3329; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3330; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3331; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3332; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3333; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
3334; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3335; CHECK-LDAPR-O0-NEXT:    b LBB37_1
3336; CHECK-LDAPR-O0-NEXT:  LBB37_1: ; %atomicrmw.start
3337; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3338; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB37_2 Depth 2
3339; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3340; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3341; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3342; CHECK-LDAPR-O0-NEXT:    add w12, w9, w8, uxth
3343; CHECK-LDAPR-O0-NEXT:  LBB37_2: ; %atomicrmw.start
3344; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB37_1 Depth=1
3345; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3346; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
3347; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
3348; CHECK-LDAPR-O0-NEXT:    b.ne LBB37_4
3349; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3350; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB37_2 Depth=2
3351; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
3352; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB37_2
3353; CHECK-LDAPR-O0-NEXT:  LBB37_4: ; %atomicrmw.start
3354; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB37_1 Depth=1
3355; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3356; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
3357; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
3358; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3359; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3360; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB37_1
3361; CHECK-LDAPR-O0-NEXT:    b LBB37_5
3362; CHECK-LDAPR-O0-NEXT:  LBB37_5: ; %atomicrmw.end
3363; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3364; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3365; CHECK-LDAPR-O0-NEXT:    ret
3366  %res = atomicrmw add i16* %ptr, i16 %rhs seq_cst
3367  ret i16 %res
3368}
3369
3370define i16 @atomicrmw_xchg_i16(i16* %ptr, i16 %rhs) {
3371; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i16:
3372; CHECK-NOLSE-O1:       ; %bb.0:
3373; CHECK-NOLSE-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
3374; CHECK-NOLSE-O1-NEXT:  LBB38_1: ; %atomicrmw.start
3375; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3376; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
3377; CHECK-NOLSE-O1-NEXT:    stxrh w9, w1, [x0]
3378; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB38_1
3379; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3380; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3381; CHECK-NOLSE-O1-NEXT:    ret
3382;
3383; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i16:
3384; CHECK-NOLSE-O0:       ; %bb.0:
3385; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3386; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3387; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3388; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3389; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
3390; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3391; CHECK-NOLSE-O0-NEXT:    b LBB38_1
3392; CHECK-NOLSE-O0-NEXT:  LBB38_1: ; %atomicrmw.start
3393; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3394; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB38_2 Depth 2
3395; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3396; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3397; CHECK-NOLSE-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
3398; CHECK-NOLSE-O0-NEXT:  LBB38_2: ; %atomicrmw.start
3399; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB38_1 Depth=1
3400; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3401; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
3402; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
3403; CHECK-NOLSE-O0-NEXT:    b.ne LBB38_4
3404; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3405; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB38_2 Depth=2
3406; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
3407; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB38_2
3408; CHECK-NOLSE-O0-NEXT:  LBB38_4: ; %atomicrmw.start
3409; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB38_1 Depth=1
3410; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3411; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
3412; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
3413; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3414; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3415; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB38_1
3416; CHECK-NOLSE-O0-NEXT:    b LBB38_5
3417; CHECK-NOLSE-O0-NEXT:  LBB38_5: ; %atomicrmw.end
3418; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3419; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3420; CHECK-NOLSE-O0-NEXT:    ret
3421;
3422; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i16:
3423; CHECK-LSE-O1:       ; %bb.0:
3424; CHECK-LSE-O1-NEXT:    swph w1, w0, [x0]
3425; CHECK-LSE-O1-NEXT:    ret
3426;
3427; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i16:
3428; CHECK-LSE-O0:       ; %bb.0:
3429; CHECK-LSE-O0-NEXT:    swph w1, w0, [x0]
3430; CHECK-LSE-O0-NEXT:    ret
3431;
3432; CHECK-LDAPR-O1-LABEL: atomicrmw_xchg_i16:
3433; CHECK-LDAPR-O1:       ; %bb.0:
3434; CHECK-LDAPR-O1-NEXT:    ; kill: def $w1 killed $w1 def $x1
3435; CHECK-LDAPR-O1-NEXT:  LBB38_1: ; %atomicrmw.start
3436; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3437; CHECK-LDAPR-O1-NEXT:    ldxrh w8, [x0]
3438; CHECK-LDAPR-O1-NEXT:    stxrh w9, w1, [x0]
3439; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB38_1
3440; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3441; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3442; CHECK-LDAPR-O1-NEXT:    ret
3443;
3444; CHECK-LDAPR-O0-LABEL: atomicrmw_xchg_i16:
3445; CHECK-LDAPR-O0:       ; %bb.0:
3446; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3447; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3448; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3449; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3450; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
3451; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3452; CHECK-LDAPR-O0-NEXT:    b LBB38_1
3453; CHECK-LDAPR-O0-NEXT:  LBB38_1: ; %atomicrmw.start
3454; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3455; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB38_2 Depth 2
3456; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3457; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3458; CHECK-LDAPR-O0-NEXT:    ldr w12, [sp, #24] ; 4-byte Folded Reload
3459; CHECK-LDAPR-O0-NEXT:  LBB38_2: ; %atomicrmw.start
3460; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB38_1 Depth=1
3461; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3462; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
3463; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
3464; CHECK-LDAPR-O0-NEXT:    b.ne LBB38_4
3465; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3466; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB38_2 Depth=2
3467; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
3468; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB38_2
3469; CHECK-LDAPR-O0-NEXT:  LBB38_4: ; %atomicrmw.start
3470; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB38_1 Depth=1
3471; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3472; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
3473; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
3474; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3475; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3476; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB38_1
3477; CHECK-LDAPR-O0-NEXT:    b LBB38_5
3478; CHECK-LDAPR-O0-NEXT:  LBB38_5: ; %atomicrmw.end
3479; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3480; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3481; CHECK-LDAPR-O0-NEXT:    ret
3482  %res = atomicrmw xchg i16* %ptr, i16 %rhs monotonic
3483  ret i16 %res
3484}
3485
3486define i16 @atomicrmw_sub_i16(i16* %ptr, i16 %rhs) {
3487; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i16:
3488; CHECK-NOLSE-O1:       ; %bb.0:
3489; CHECK-NOLSE-O1-NEXT:  LBB39_1: ; %atomicrmw.start
3490; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3491; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
3492; CHECK-NOLSE-O1-NEXT:    sub w9, w8, w1
3493; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
3494; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB39_1
3495; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3496; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3497; CHECK-NOLSE-O1-NEXT:    ret
3498;
3499; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i16:
3500; CHECK-NOLSE-O0:       ; %bb.0:
3501; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3502; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3503; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3504; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3505; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
3506; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3507; CHECK-NOLSE-O0-NEXT:    b LBB39_1
3508; CHECK-NOLSE-O0-NEXT:  LBB39_1: ; %atomicrmw.start
3509; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3510; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB39_2 Depth 2
3511; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3512; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3513; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3514; CHECK-NOLSE-O0-NEXT:    subs w12, w8, w9
3515; CHECK-NOLSE-O0-NEXT:  LBB39_2: ; %atomicrmw.start
3516; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB39_1 Depth=1
3517; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3518; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
3519; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
3520; CHECK-NOLSE-O0-NEXT:    b.ne LBB39_4
3521; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3522; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB39_2 Depth=2
3523; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
3524; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB39_2
3525; CHECK-NOLSE-O0-NEXT:  LBB39_4: ; %atomicrmw.start
3526; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB39_1 Depth=1
3527; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3528; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
3529; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
3530; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3531; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3532; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB39_1
3533; CHECK-NOLSE-O0-NEXT:    b LBB39_5
3534; CHECK-NOLSE-O0-NEXT:  LBB39_5: ; %atomicrmw.end
3535; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3536; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3537; CHECK-NOLSE-O0-NEXT:    ret
3538;
3539; CHECK-LSE-O1-LABEL: atomicrmw_sub_i16:
3540; CHECK-LSE-O1:       ; %bb.0:
3541; CHECK-LSE-O1-NEXT:    neg w8, w1
3542; CHECK-LSE-O1-NEXT:    ldaddah w8, w0, [x0]
3543; CHECK-LSE-O1-NEXT:    ret
3544;
3545; CHECK-LSE-O0-LABEL: atomicrmw_sub_i16:
3546; CHECK-LSE-O0:       ; %bb.0:
3547; CHECK-LSE-O0-NEXT:    neg w8, w1
3548; CHECK-LSE-O0-NEXT:    ldaddah w8, w0, [x0]
3549; CHECK-LSE-O0-NEXT:    ret
3550;
3551; CHECK-LDAPR-O1-LABEL: atomicrmw_sub_i16:
3552; CHECK-LDAPR-O1:       ; %bb.0:
3553; CHECK-LDAPR-O1-NEXT:  LBB39_1: ; %atomicrmw.start
3554; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3555; CHECK-LDAPR-O1-NEXT:    ldaxrh w8, [x0]
3556; CHECK-LDAPR-O1-NEXT:    sub w9, w8, w1
3557; CHECK-LDAPR-O1-NEXT:    stxrh w10, w9, [x0]
3558; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB39_1
3559; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3560; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3561; CHECK-LDAPR-O1-NEXT:    ret
3562;
3563; CHECK-LDAPR-O0-LABEL: atomicrmw_sub_i16:
3564; CHECK-LDAPR-O0:       ; %bb.0:
3565; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3566; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3567; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3568; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3569; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
3570; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3571; CHECK-LDAPR-O0-NEXT:    b LBB39_1
3572; CHECK-LDAPR-O0-NEXT:  LBB39_1: ; %atomicrmw.start
3573; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3574; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB39_2 Depth 2
3575; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3576; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3577; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3578; CHECK-LDAPR-O0-NEXT:    subs w12, w8, w9
3579; CHECK-LDAPR-O0-NEXT:  LBB39_2: ; %atomicrmw.start
3580; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB39_1 Depth=1
3581; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3582; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
3583; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
3584; CHECK-LDAPR-O0-NEXT:    b.ne LBB39_4
3585; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3586; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB39_2 Depth=2
3587; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
3588; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB39_2
3589; CHECK-LDAPR-O0-NEXT:  LBB39_4: ; %atomicrmw.start
3590; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB39_1 Depth=1
3591; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3592; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
3593; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
3594; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3595; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3596; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB39_1
3597; CHECK-LDAPR-O0-NEXT:    b LBB39_5
3598; CHECK-LDAPR-O0-NEXT:  LBB39_5: ; %atomicrmw.end
3599; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3600; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3601; CHECK-LDAPR-O0-NEXT:    ret
3602  %res = atomicrmw sub i16* %ptr, i16 %rhs acquire
3603  ret i16 %res
3604}
3605
3606define i16 @atomicrmw_and_i16(i16* %ptr, i16 %rhs) {
3607; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i16:
3608; CHECK-NOLSE-O1:       ; %bb.0:
3609; CHECK-NOLSE-O1-NEXT:  LBB40_1: ; %atomicrmw.start
3610; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3611; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
3612; CHECK-NOLSE-O1-NEXT:    and w9, w8, w1
3613; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
3614; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB40_1
3615; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3616; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3617; CHECK-NOLSE-O1-NEXT:    ret
3618;
3619; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i16:
3620; CHECK-NOLSE-O0:       ; %bb.0:
3621; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3622; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3623; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3624; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3625; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
3626; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3627; CHECK-NOLSE-O0-NEXT:    b LBB40_1
3628; CHECK-NOLSE-O0-NEXT:  LBB40_1: ; %atomicrmw.start
3629; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3630; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB40_2 Depth 2
3631; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3632; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3633; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3634; CHECK-NOLSE-O0-NEXT:    and w12, w8, w9
3635; CHECK-NOLSE-O0-NEXT:  LBB40_2: ; %atomicrmw.start
3636; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB40_1 Depth=1
3637; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3638; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
3639; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
3640; CHECK-NOLSE-O0-NEXT:    b.ne LBB40_4
3641; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3642; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB40_2 Depth=2
3643; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
3644; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB40_2
3645; CHECK-NOLSE-O0-NEXT:  LBB40_4: ; %atomicrmw.start
3646; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB40_1 Depth=1
3647; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3648; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
3649; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
3650; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3651; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3652; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB40_1
3653; CHECK-NOLSE-O0-NEXT:    b LBB40_5
3654; CHECK-NOLSE-O0-NEXT:  LBB40_5: ; %atomicrmw.end
3655; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3656; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3657; CHECK-NOLSE-O0-NEXT:    ret
3658;
3659; CHECK-LSE-O1-LABEL: atomicrmw_and_i16:
3660; CHECK-LSE-O1:       ; %bb.0:
3661; CHECK-LSE-O1-NEXT:    mvn w8, w1
3662; CHECK-LSE-O1-NEXT:    ldclrlh w8, w0, [x0]
3663; CHECK-LSE-O1-NEXT:    ret
3664;
3665; CHECK-LSE-O0-LABEL: atomicrmw_and_i16:
3666; CHECK-LSE-O0:       ; %bb.0:
3667; CHECK-LSE-O0-NEXT:    mvn w8, w1
3668; CHECK-LSE-O0-NEXT:    ldclrlh w8, w0, [x0]
3669; CHECK-LSE-O0-NEXT:    ret
3670;
3671; CHECK-LDAPR-O1-LABEL: atomicrmw_and_i16:
3672; CHECK-LDAPR-O1:       ; %bb.0:
3673; CHECK-LDAPR-O1-NEXT:  LBB40_1: ; %atomicrmw.start
3674; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3675; CHECK-LDAPR-O1-NEXT:    ldxrh w8, [x0]
3676; CHECK-LDAPR-O1-NEXT:    and w9, w8, w1
3677; CHECK-LDAPR-O1-NEXT:    stlxrh w10, w9, [x0]
3678; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB40_1
3679; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3680; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3681; CHECK-LDAPR-O1-NEXT:    ret
3682;
3683; CHECK-LDAPR-O0-LABEL: atomicrmw_and_i16:
3684; CHECK-LDAPR-O0:       ; %bb.0:
3685; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3686; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3687; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3688; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3689; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
3690; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3691; CHECK-LDAPR-O0-NEXT:    b LBB40_1
3692; CHECK-LDAPR-O0-NEXT:  LBB40_1: ; %atomicrmw.start
3693; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3694; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB40_2 Depth 2
3695; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3696; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3697; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3698; CHECK-LDAPR-O0-NEXT:    and w12, w8, w9
3699; CHECK-LDAPR-O0-NEXT:  LBB40_2: ; %atomicrmw.start
3700; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB40_1 Depth=1
3701; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3702; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
3703; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
3704; CHECK-LDAPR-O0-NEXT:    b.ne LBB40_4
3705; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3706; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB40_2 Depth=2
3707; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
3708; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB40_2
3709; CHECK-LDAPR-O0-NEXT:  LBB40_4: ; %atomicrmw.start
3710; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB40_1 Depth=1
3711; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3712; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
3713; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
3714; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3715; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3716; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB40_1
3717; CHECK-LDAPR-O0-NEXT:    b LBB40_5
3718; CHECK-LDAPR-O0-NEXT:  LBB40_5: ; %atomicrmw.end
3719; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3720; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3721; CHECK-LDAPR-O0-NEXT:    ret
3722  %res = atomicrmw and i16* %ptr, i16 %rhs release
3723  ret i16 %res
3724}
3725
3726define i16 @atomicrmw_or_i16(i16* %ptr, i16 %rhs) {
3727; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i16:
3728; CHECK-NOLSE-O1:       ; %bb.0:
3729; CHECK-NOLSE-O1-NEXT:  LBB41_1: ; %atomicrmw.start
3730; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3731; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
3732; CHECK-NOLSE-O1-NEXT:    orr w9, w8, w1
3733; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
3734; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB41_1
3735; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3736; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3737; CHECK-NOLSE-O1-NEXT:    ret
3738;
3739; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i16:
3740; CHECK-NOLSE-O0:       ; %bb.0:
3741; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3742; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3743; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3744; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3745; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
3746; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3747; CHECK-NOLSE-O0-NEXT:    b LBB41_1
3748; CHECK-NOLSE-O0-NEXT:  LBB41_1: ; %atomicrmw.start
3749; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3750; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB41_2 Depth 2
3751; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3752; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3753; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3754; CHECK-NOLSE-O0-NEXT:    orr w12, w8, w9
3755; CHECK-NOLSE-O0-NEXT:  LBB41_2: ; %atomicrmw.start
3756; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB41_1 Depth=1
3757; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3758; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
3759; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
3760; CHECK-NOLSE-O0-NEXT:    b.ne LBB41_4
3761; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3762; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB41_2 Depth=2
3763; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
3764; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB41_2
3765; CHECK-NOLSE-O0-NEXT:  LBB41_4: ; %atomicrmw.start
3766; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB41_1 Depth=1
3767; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3768; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
3769; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
3770; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3771; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3772; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB41_1
3773; CHECK-NOLSE-O0-NEXT:    b LBB41_5
3774; CHECK-NOLSE-O0-NEXT:  LBB41_5: ; %atomicrmw.end
3775; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3776; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3777; CHECK-NOLSE-O0-NEXT:    ret
3778;
3779; CHECK-LSE-O1-LABEL: atomicrmw_or_i16:
3780; CHECK-LSE-O1:       ; %bb.0:
3781; CHECK-LSE-O1-NEXT:    ldsetalh w1, w0, [x0]
3782; CHECK-LSE-O1-NEXT:    ret
3783;
3784; CHECK-LSE-O0-LABEL: atomicrmw_or_i16:
3785; CHECK-LSE-O0:       ; %bb.0:
3786; CHECK-LSE-O0-NEXT:    ldsetalh w1, w0, [x0]
3787; CHECK-LSE-O0-NEXT:    ret
3788;
3789; CHECK-LDAPR-O1-LABEL: atomicrmw_or_i16:
3790; CHECK-LDAPR-O1:       ; %bb.0:
3791; CHECK-LDAPR-O1-NEXT:  LBB41_1: ; %atomicrmw.start
3792; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3793; CHECK-LDAPR-O1-NEXT:    ldaxrh w8, [x0]
3794; CHECK-LDAPR-O1-NEXT:    orr w9, w8, w1
3795; CHECK-LDAPR-O1-NEXT:    stlxrh w10, w9, [x0]
3796; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB41_1
3797; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3798; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3799; CHECK-LDAPR-O1-NEXT:    ret
3800;
3801; CHECK-LDAPR-O0-LABEL: atomicrmw_or_i16:
3802; CHECK-LDAPR-O0:       ; %bb.0:
3803; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3804; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3805; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3806; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3807; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
3808; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3809; CHECK-LDAPR-O0-NEXT:    b LBB41_1
3810; CHECK-LDAPR-O0-NEXT:  LBB41_1: ; %atomicrmw.start
3811; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3812; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB41_2 Depth 2
3813; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3814; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3815; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3816; CHECK-LDAPR-O0-NEXT:    orr w12, w8, w9
3817; CHECK-LDAPR-O0-NEXT:  LBB41_2: ; %atomicrmw.start
3818; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB41_1 Depth=1
3819; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3820; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
3821; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
3822; CHECK-LDAPR-O0-NEXT:    b.ne LBB41_4
3823; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3824; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB41_2 Depth=2
3825; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
3826; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB41_2
3827; CHECK-LDAPR-O0-NEXT:  LBB41_4: ; %atomicrmw.start
3828; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB41_1 Depth=1
3829; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3830; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
3831; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
3832; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3833; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3834; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB41_1
3835; CHECK-LDAPR-O0-NEXT:    b LBB41_5
3836; CHECK-LDAPR-O0-NEXT:  LBB41_5: ; %atomicrmw.end
3837; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3838; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3839; CHECK-LDAPR-O0-NEXT:    ret
3840  %res = atomicrmw or i16* %ptr, i16 %rhs seq_cst
3841  ret i16 %res
3842}
3843
3844define i16 @atomicrmw_xor_i16(i16* %ptr, i16 %rhs) {
3845; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i16:
3846; CHECK-NOLSE-O1:       ; %bb.0:
3847; CHECK-NOLSE-O1-NEXT:  LBB42_1: ; %atomicrmw.start
3848; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3849; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
3850; CHECK-NOLSE-O1-NEXT:    eor w9, w8, w1
3851; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
3852; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB42_1
3853; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3854; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3855; CHECK-NOLSE-O1-NEXT:    ret
3856;
3857; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i16:
3858; CHECK-NOLSE-O0:       ; %bb.0:
3859; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3860; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3861; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3862; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3863; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
3864; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3865; CHECK-NOLSE-O0-NEXT:    b LBB42_1
3866; CHECK-NOLSE-O0-NEXT:  LBB42_1: ; %atomicrmw.start
3867; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3868; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB42_2 Depth 2
3869; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3870; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3871; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3872; CHECK-NOLSE-O0-NEXT:    eor w12, w8, w9
3873; CHECK-NOLSE-O0-NEXT:  LBB42_2: ; %atomicrmw.start
3874; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB42_1 Depth=1
3875; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3876; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
3877; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
3878; CHECK-NOLSE-O0-NEXT:    b.ne LBB42_4
3879; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3880; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB42_2 Depth=2
3881; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
3882; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB42_2
3883; CHECK-NOLSE-O0-NEXT:  LBB42_4: ; %atomicrmw.start
3884; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB42_1 Depth=1
3885; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3886; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
3887; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
3888; CHECK-NOLSE-O0-NEXT:    cset w8, eq
3889; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3890; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB42_1
3891; CHECK-NOLSE-O0-NEXT:    b LBB42_5
3892; CHECK-NOLSE-O0-NEXT:  LBB42_5: ; %atomicrmw.end
3893; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3894; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
3895; CHECK-NOLSE-O0-NEXT:    ret
3896;
3897; CHECK-LSE-O1-LABEL: atomicrmw_xor_i16:
3898; CHECK-LSE-O1:       ; %bb.0:
3899; CHECK-LSE-O1-NEXT:    ldeorh w1, w0, [x0]
3900; CHECK-LSE-O1-NEXT:    ret
3901;
3902; CHECK-LSE-O0-LABEL: atomicrmw_xor_i16:
3903; CHECK-LSE-O0:       ; %bb.0:
3904; CHECK-LSE-O0-NEXT:    ldeorh w1, w0, [x0]
3905; CHECK-LSE-O0-NEXT:    ret
3906;
3907; CHECK-LDAPR-O1-LABEL: atomicrmw_xor_i16:
3908; CHECK-LDAPR-O1:       ; %bb.0:
3909; CHECK-LDAPR-O1-NEXT:  LBB42_1: ; %atomicrmw.start
3910; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3911; CHECK-LDAPR-O1-NEXT:    ldxrh w8, [x0]
3912; CHECK-LDAPR-O1-NEXT:    eor w9, w8, w1
3913; CHECK-LDAPR-O1-NEXT:    stxrh w10, w9, [x0]
3914; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB42_1
3915; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3916; CHECK-LDAPR-O1-NEXT:    mov w0, w8
3917; CHECK-LDAPR-O1-NEXT:    ret
3918;
3919; CHECK-LDAPR-O0-LABEL: atomicrmw_xor_i16:
3920; CHECK-LDAPR-O0:       ; %bb.0:
3921; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
3922; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
3923; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3924; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3925; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
3926; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3927; CHECK-LDAPR-O0-NEXT:    b LBB42_1
3928; CHECK-LDAPR-O0-NEXT:  LBB42_1: ; %atomicrmw.start
3929; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
3930; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB42_2 Depth 2
3931; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3932; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3933; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3934; CHECK-LDAPR-O0-NEXT:    eor w12, w8, w9
3935; CHECK-LDAPR-O0-NEXT:  LBB42_2: ; %atomicrmw.start
3936; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB42_1 Depth=1
3937; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
3938; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
3939; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
3940; CHECK-LDAPR-O0-NEXT:    b.ne LBB42_4
3941; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
3942; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB42_2 Depth=2
3943; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
3944; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB42_2
3945; CHECK-LDAPR-O0-NEXT:  LBB42_4: ; %atomicrmw.start
3946; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB42_1 Depth=1
3947; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
3948; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
3949; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
3950; CHECK-LDAPR-O0-NEXT:    cset w8, eq
3951; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
3952; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB42_1
3953; CHECK-LDAPR-O0-NEXT:    b LBB42_5
3954; CHECK-LDAPR-O0-NEXT:  LBB42_5: ; %atomicrmw.end
3955; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
3956; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
3957; CHECK-LDAPR-O0-NEXT:    ret
3958  %res = atomicrmw xor i16* %ptr, i16 %rhs monotonic
3959  ret i16 %res
3960}
3961
3962define i16 @atomicrmw_min_i16(i16* %ptr, i16 %rhs) {
3963; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i16:
3964; CHECK-NOLSE-O1:       ; %bb.0:
3965; CHECK-NOLSE-O1-NEXT:  LBB43_1: ; %atomicrmw.start
3966; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
3967; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
3968; CHECK-NOLSE-O1-NEXT:    sxth w9, w8
3969; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxth
3970; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, le
3971; CHECK-NOLSE-O1-NEXT:    stxrh w10, w9, [x0]
3972; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB43_1
3973; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
3974; CHECK-NOLSE-O1-NEXT:    mov w0, w8
3975; CHECK-NOLSE-O1-NEXT:    ret
3976;
3977; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i16:
3978; CHECK-NOLSE-O0:       ; %bb.0:
3979; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
3980; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
3981; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
3982; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
3983; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
3984; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
3985; CHECK-NOLSE-O0-NEXT:    b LBB43_1
3986; CHECK-NOLSE-O0-NEXT:  LBB43_1: ; %atomicrmw.start
3987; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
3988; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB43_2 Depth 2
3989; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
3990; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
3991; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
3992; CHECK-NOLSE-O0-NEXT:    sxth w10, w8
3993; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, sxth
3994; CHECK-NOLSE-O0-NEXT:    cset w10, le
3995; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
3996; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
3997; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
3998; CHECK-NOLSE-O0-NEXT:  LBB43_2: ; %atomicrmw.start
3999; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB43_1 Depth=1
4000; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4001; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
4002; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
4003; CHECK-NOLSE-O0-NEXT:    b.ne LBB43_4
4004; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4005; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB43_2 Depth=2
4006; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
4007; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB43_2
4008; CHECK-NOLSE-O0-NEXT:  LBB43_4: ; %atomicrmw.start
4009; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB43_1 Depth=1
4010; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4011; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
4012; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
4013; CHECK-NOLSE-O0-NEXT:    cset w8, eq
4014; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4015; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB43_1
4016; CHECK-NOLSE-O0-NEXT:    b LBB43_5
4017; CHECK-NOLSE-O0-NEXT:  LBB43_5: ; %atomicrmw.end
4018; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4019; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
4020; CHECK-NOLSE-O0-NEXT:    ret
4021;
4022; CHECK-LSE-O1-LABEL: atomicrmw_min_i16:
4023; CHECK-LSE-O1:       ; %bb.0:
4024; CHECK-LSE-O1-NEXT:    ldsminah w1, w0, [x0]
4025; CHECK-LSE-O1-NEXT:    ret
4026;
4027; CHECK-LSE-O0-LABEL: atomicrmw_min_i16:
4028; CHECK-LSE-O0:       ; %bb.0:
4029; CHECK-LSE-O0-NEXT:    ldsminah w1, w0, [x0]
4030; CHECK-LSE-O0-NEXT:    ret
4031;
4032; CHECK-LDAPR-O1-LABEL: atomicrmw_min_i16:
4033; CHECK-LDAPR-O1:       ; %bb.0:
4034; CHECK-LDAPR-O1-NEXT:  LBB43_1: ; %atomicrmw.start
4035; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4036; CHECK-LDAPR-O1-NEXT:    ldaxrh w8, [x0]
4037; CHECK-LDAPR-O1-NEXT:    sxth w9, w8
4038; CHECK-LDAPR-O1-NEXT:    cmp w9, w1, sxth
4039; CHECK-LDAPR-O1-NEXT:    csel w9, w8, w1, le
4040; CHECK-LDAPR-O1-NEXT:    stxrh w10, w9, [x0]
4041; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB43_1
4042; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
4043; CHECK-LDAPR-O1-NEXT:    mov w0, w8
4044; CHECK-LDAPR-O1-NEXT:    ret
4045;
4046; CHECK-LDAPR-O0-LABEL: atomicrmw_min_i16:
4047; CHECK-LDAPR-O0:       ; %bb.0:
4048; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
4049; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
4050; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
4051; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
4052; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
4053; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
4054; CHECK-LDAPR-O0-NEXT:    b LBB43_1
4055; CHECK-LDAPR-O0-NEXT:  LBB43_1: ; %atomicrmw.start
4056; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
4057; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB43_2 Depth 2
4058; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
4059; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
4060; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
4061; CHECK-LDAPR-O0-NEXT:    sxth w10, w8
4062; CHECK-LDAPR-O0-NEXT:    subs w10, w10, w9, sxth
4063; CHECK-LDAPR-O0-NEXT:    cset w10, le
4064; CHECK-LDAPR-O0-NEXT:    and w10, w10, #0x1
4065; CHECK-LDAPR-O0-NEXT:    ands w10, w10, #0x1
4066; CHECK-LDAPR-O0-NEXT:    csel w12, w8, w9, ne
4067; CHECK-LDAPR-O0-NEXT:  LBB43_2: ; %atomicrmw.start
4068; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB43_1 Depth=1
4069; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4070; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
4071; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
4072; CHECK-LDAPR-O0-NEXT:    b.ne LBB43_4
4073; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4074; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB43_2 Depth=2
4075; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
4076; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB43_2
4077; CHECK-LDAPR-O0-NEXT:  LBB43_4: ; %atomicrmw.start
4078; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB43_1 Depth=1
4079; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4080; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
4081; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
4082; CHECK-LDAPR-O0-NEXT:    cset w8, eq
4083; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4084; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB43_1
4085; CHECK-LDAPR-O0-NEXT:    b LBB43_5
4086; CHECK-LDAPR-O0-NEXT:  LBB43_5: ; %atomicrmw.end
4087; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4088; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
4089; CHECK-LDAPR-O0-NEXT:    ret
4090  %res = atomicrmw min i16* %ptr, i16 %rhs acquire
4091  ret i16 %res
4092}
4093
4094define i16 @atomicrmw_max_i16(i16* %ptr, i16 %rhs) {
4095; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i16:
4096; CHECK-NOLSE-O1:       ; %bb.0:
4097; CHECK-NOLSE-O1-NEXT:  LBB44_1: ; %atomicrmw.start
4098; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4099; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
4100; CHECK-NOLSE-O1-NEXT:    sxth w9, w8
4101; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, sxth
4102; CHECK-NOLSE-O1-NEXT:    csel w9, w8, w1, gt
4103; CHECK-NOLSE-O1-NEXT:    stlxrh w10, w9, [x0]
4104; CHECK-NOLSE-O1-NEXT:    cbnz w10, LBB44_1
4105; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
4106; CHECK-NOLSE-O1-NEXT:    mov w0, w8
4107; CHECK-NOLSE-O1-NEXT:    ret
4108;
4109; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i16:
4110; CHECK-NOLSE-O0:       ; %bb.0:
4111; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
4112; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
4113; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
4114; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
4115; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
4116; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
4117; CHECK-NOLSE-O0-NEXT:    b LBB44_1
4118; CHECK-NOLSE-O0-NEXT:  LBB44_1: ; %atomicrmw.start
4119; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
4120; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB44_2 Depth 2
4121; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
4122; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
4123; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
4124; CHECK-NOLSE-O0-NEXT:    sxth w10, w8
4125; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, sxth
4126; CHECK-NOLSE-O0-NEXT:    cset w10, gt
4127; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
4128; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
4129; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
4130; CHECK-NOLSE-O0-NEXT:  LBB44_2: ; %atomicrmw.start
4131; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB44_1 Depth=1
4132; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4133; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
4134; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
4135; CHECK-NOLSE-O0-NEXT:    b.ne LBB44_4
4136; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4137; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB44_2 Depth=2
4138; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
4139; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB44_2
4140; CHECK-NOLSE-O0-NEXT:  LBB44_4: ; %atomicrmw.start
4141; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB44_1 Depth=1
4142; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4143; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
4144; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
4145; CHECK-NOLSE-O0-NEXT:    cset w8, eq
4146; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4147; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB44_1
4148; CHECK-NOLSE-O0-NEXT:    b LBB44_5
4149; CHECK-NOLSE-O0-NEXT:  LBB44_5: ; %atomicrmw.end
4150; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4151; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
4152; CHECK-NOLSE-O0-NEXT:    ret
4153;
4154; CHECK-LSE-O1-LABEL: atomicrmw_max_i16:
4155; CHECK-LSE-O1:       ; %bb.0:
4156; CHECK-LSE-O1-NEXT:    ldsmaxlh w1, w0, [x0]
4157; CHECK-LSE-O1-NEXT:    ret
4158;
4159; CHECK-LSE-O0-LABEL: atomicrmw_max_i16:
4160; CHECK-LSE-O0:       ; %bb.0:
4161; CHECK-LSE-O0-NEXT:    ldsmaxlh w1, w0, [x0]
4162; CHECK-LSE-O0-NEXT:    ret
4163;
4164; CHECK-LDAPR-O1-LABEL: atomicrmw_max_i16:
4165; CHECK-LDAPR-O1:       ; %bb.0:
4166; CHECK-LDAPR-O1-NEXT:  LBB44_1: ; %atomicrmw.start
4167; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4168; CHECK-LDAPR-O1-NEXT:    ldxrh w8, [x0]
4169; CHECK-LDAPR-O1-NEXT:    sxth w9, w8
4170; CHECK-LDAPR-O1-NEXT:    cmp w9, w1, sxth
4171; CHECK-LDAPR-O1-NEXT:    csel w9, w8, w1, gt
4172; CHECK-LDAPR-O1-NEXT:    stlxrh w10, w9, [x0]
4173; CHECK-LDAPR-O1-NEXT:    cbnz w10, LBB44_1
4174; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
4175; CHECK-LDAPR-O1-NEXT:    mov w0, w8
4176; CHECK-LDAPR-O1-NEXT:    ret
4177;
4178; CHECK-LDAPR-O0-LABEL: atomicrmw_max_i16:
4179; CHECK-LDAPR-O0:       ; %bb.0:
4180; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
4181; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
4182; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
4183; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
4184; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
4185; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
4186; CHECK-LDAPR-O0-NEXT:    b LBB44_1
4187; CHECK-LDAPR-O0-NEXT:  LBB44_1: ; %atomicrmw.start
4188; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
4189; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB44_2 Depth 2
4190; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
4191; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
4192; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
4193; CHECK-LDAPR-O0-NEXT:    sxth w10, w8
4194; CHECK-LDAPR-O0-NEXT:    subs w10, w10, w9, sxth
4195; CHECK-LDAPR-O0-NEXT:    cset w10, gt
4196; CHECK-LDAPR-O0-NEXT:    and w10, w10, #0x1
4197; CHECK-LDAPR-O0-NEXT:    ands w10, w10, #0x1
4198; CHECK-LDAPR-O0-NEXT:    csel w12, w8, w9, ne
4199; CHECK-LDAPR-O0-NEXT:  LBB44_2: ; %atomicrmw.start
4200; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB44_1 Depth=1
4201; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4202; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
4203; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
4204; CHECK-LDAPR-O0-NEXT:    b.ne LBB44_4
4205; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4206; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB44_2 Depth=2
4207; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
4208; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB44_2
4209; CHECK-LDAPR-O0-NEXT:  LBB44_4: ; %atomicrmw.start
4210; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB44_1 Depth=1
4211; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4212; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
4213; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
4214; CHECK-LDAPR-O0-NEXT:    cset w8, eq
4215; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4216; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB44_1
4217; CHECK-LDAPR-O0-NEXT:    b LBB44_5
4218; CHECK-LDAPR-O0-NEXT:  LBB44_5: ; %atomicrmw.end
4219; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4220; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
4221; CHECK-LDAPR-O0-NEXT:    ret
4222  %res = atomicrmw max i16* %ptr, i16 %rhs release
4223  ret i16 %res
4224}
4225
4226define i16 @atomicrmw_umin_i16(i16* %ptr, i16 %rhs) {
4227; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i16:
4228; CHECK-NOLSE-O1:       ; %bb.0:
4229; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xffff
4230; CHECK-NOLSE-O1-NEXT:  LBB45_1: ; %atomicrmw.start
4231; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4232; CHECK-NOLSE-O1-NEXT:    ldaxrh w8, [x0]
4233; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xffff
4234; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
4235; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, ls
4236; CHECK-NOLSE-O1-NEXT:    stlxrh w11, w10, [x0]
4237; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB45_1
4238; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
4239; CHECK-NOLSE-O1-NEXT:    mov w0, w8
4240; CHECK-NOLSE-O1-NEXT:    ret
4241;
4242; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i16:
4243; CHECK-NOLSE-O0:       ; %bb.0:
4244; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
4245; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
4246; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
4247; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
4248; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
4249; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
4250; CHECK-NOLSE-O0-NEXT:    b LBB45_1
4251; CHECK-NOLSE-O0-NEXT:  LBB45_1: ; %atomicrmw.start
4252; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
4253; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB45_2 Depth 2
4254; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
4255; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
4256; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
4257; CHECK-NOLSE-O0-NEXT:    uxth w10, w8
4258; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, uxth
4259; CHECK-NOLSE-O0-NEXT:    cset w10, ls
4260; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
4261; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
4262; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
4263; CHECK-NOLSE-O0-NEXT:  LBB45_2: ; %atomicrmw.start
4264; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB45_1 Depth=1
4265; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4266; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
4267; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
4268; CHECK-NOLSE-O0-NEXT:    b.ne LBB45_4
4269; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4270; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB45_2 Depth=2
4271; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
4272; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB45_2
4273; CHECK-NOLSE-O0-NEXT:  LBB45_4: ; %atomicrmw.start
4274; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB45_1 Depth=1
4275; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4276; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
4277; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
4278; CHECK-NOLSE-O0-NEXT:    cset w8, eq
4279; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4280; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB45_1
4281; CHECK-NOLSE-O0-NEXT:    b LBB45_5
4282; CHECK-NOLSE-O0-NEXT:  LBB45_5: ; %atomicrmw.end
4283; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4284; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
4285; CHECK-NOLSE-O0-NEXT:    ret
4286;
4287; CHECK-LSE-O1-LABEL: atomicrmw_umin_i16:
4288; CHECK-LSE-O1:       ; %bb.0:
4289; CHECK-LSE-O1-NEXT:    lduminalh w1, w0, [x0]
4290; CHECK-LSE-O1-NEXT:    ret
4291;
4292; CHECK-LSE-O0-LABEL: atomicrmw_umin_i16:
4293; CHECK-LSE-O0:       ; %bb.0:
4294; CHECK-LSE-O0-NEXT:    lduminalh w1, w0, [x0]
4295; CHECK-LSE-O0-NEXT:    ret
4296;
4297; CHECK-LDAPR-O1-LABEL: atomicrmw_umin_i16:
4298; CHECK-LDAPR-O1:       ; %bb.0:
4299; CHECK-LDAPR-O1-NEXT:    and w9, w1, #0xffff
4300; CHECK-LDAPR-O1-NEXT:  LBB45_1: ; %atomicrmw.start
4301; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4302; CHECK-LDAPR-O1-NEXT:    ldaxrh w8, [x0]
4303; CHECK-LDAPR-O1-NEXT:    and w10, w8, #0xffff
4304; CHECK-LDAPR-O1-NEXT:    cmp w10, w9
4305; CHECK-LDAPR-O1-NEXT:    csel w10, w10, w9, ls
4306; CHECK-LDAPR-O1-NEXT:    stlxrh w11, w10, [x0]
4307; CHECK-LDAPR-O1-NEXT:    cbnz w11, LBB45_1
4308; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
4309; CHECK-LDAPR-O1-NEXT:    mov w0, w8
4310; CHECK-LDAPR-O1-NEXT:    ret
4311;
4312; CHECK-LDAPR-O0-LABEL: atomicrmw_umin_i16:
4313; CHECK-LDAPR-O0:       ; %bb.0:
4314; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
4315; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
4316; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
4317; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
4318; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
4319; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
4320; CHECK-LDAPR-O0-NEXT:    b LBB45_1
4321; CHECK-LDAPR-O0-NEXT:  LBB45_1: ; %atomicrmw.start
4322; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
4323; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB45_2 Depth 2
4324; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
4325; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
4326; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
4327; CHECK-LDAPR-O0-NEXT:    uxth w10, w8
4328; CHECK-LDAPR-O0-NEXT:    subs w10, w10, w9, uxth
4329; CHECK-LDAPR-O0-NEXT:    cset w10, ls
4330; CHECK-LDAPR-O0-NEXT:    and w10, w10, #0x1
4331; CHECK-LDAPR-O0-NEXT:    ands w10, w10, #0x1
4332; CHECK-LDAPR-O0-NEXT:    csel w12, w8, w9, ne
4333; CHECK-LDAPR-O0-NEXT:  LBB45_2: ; %atomicrmw.start
4334; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB45_1 Depth=1
4335; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4336; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
4337; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
4338; CHECK-LDAPR-O0-NEXT:    b.ne LBB45_4
4339; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4340; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB45_2 Depth=2
4341; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
4342; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB45_2
4343; CHECK-LDAPR-O0-NEXT:  LBB45_4: ; %atomicrmw.start
4344; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB45_1 Depth=1
4345; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4346; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
4347; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
4348; CHECK-LDAPR-O0-NEXT:    cset w8, eq
4349; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4350; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB45_1
4351; CHECK-LDAPR-O0-NEXT:    b LBB45_5
4352; CHECK-LDAPR-O0-NEXT:  LBB45_5: ; %atomicrmw.end
4353; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4354; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
4355; CHECK-LDAPR-O0-NEXT:    ret
4356  %res = atomicrmw umin i16* %ptr, i16 %rhs seq_cst
4357  ret i16 %res
4358}
4359
4360define i16 @atomicrmw_umax_i16(i16* %ptr, i16 %rhs) {
4361; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i16:
4362; CHECK-NOLSE-O1:       ; %bb.0:
4363; CHECK-NOLSE-O1-NEXT:    and w9, w1, #0xffff
4364; CHECK-NOLSE-O1-NEXT:  LBB46_1: ; %atomicrmw.start
4365; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4366; CHECK-NOLSE-O1-NEXT:    ldxrh w8, [x0]
4367; CHECK-NOLSE-O1-NEXT:    and w10, w8, #0xffff
4368; CHECK-NOLSE-O1-NEXT:    cmp w10, w9
4369; CHECK-NOLSE-O1-NEXT:    csel w10, w10, w9, hi
4370; CHECK-NOLSE-O1-NEXT:    stxrh w11, w10, [x0]
4371; CHECK-NOLSE-O1-NEXT:    cbnz w11, LBB46_1
4372; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
4373; CHECK-NOLSE-O1-NEXT:    mov w0, w8
4374; CHECK-NOLSE-O1-NEXT:    ret
4375;
4376; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i16:
4377; CHECK-NOLSE-O0:       ; %bb.0:
4378; CHECK-NOLSE-O0-NEXT:    sub sp, sp, #32
4379; CHECK-NOLSE-O0-NEXT:    .cfi_def_cfa_offset 32
4380; CHECK-NOLSE-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
4381; CHECK-NOLSE-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
4382; CHECK-NOLSE-O0-NEXT:    ldrh w8, [x0]
4383; CHECK-NOLSE-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
4384; CHECK-NOLSE-O0-NEXT:    b LBB46_1
4385; CHECK-NOLSE-O0-NEXT:  LBB46_1: ; %atomicrmw.start
4386; CHECK-NOLSE-O0-NEXT:    ; =>This Loop Header: Depth=1
4387; CHECK-NOLSE-O0-NEXT:    ; Child Loop BB46_2 Depth 2
4388; CHECK-NOLSE-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
4389; CHECK-NOLSE-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
4390; CHECK-NOLSE-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
4391; CHECK-NOLSE-O0-NEXT:    uxth w10, w8
4392; CHECK-NOLSE-O0-NEXT:    subs w10, w10, w9, uxth
4393; CHECK-NOLSE-O0-NEXT:    cset w10, hi
4394; CHECK-NOLSE-O0-NEXT:    and w10, w10, #0x1
4395; CHECK-NOLSE-O0-NEXT:    ands w10, w10, #0x1
4396; CHECK-NOLSE-O0-NEXT:    csel w12, w8, w9, ne
4397; CHECK-NOLSE-O0-NEXT:  LBB46_2: ; %atomicrmw.start
4398; CHECK-NOLSE-O0-NEXT:    ; Parent Loop BB46_1 Depth=1
4399; CHECK-NOLSE-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4400; CHECK-NOLSE-O0-NEXT:    ldaxrh w9, [x11]
4401; CHECK-NOLSE-O0-NEXT:    cmp w9, w8, uxth
4402; CHECK-NOLSE-O0-NEXT:    b.ne LBB46_4
4403; CHECK-NOLSE-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4404; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB46_2 Depth=2
4405; CHECK-NOLSE-O0-NEXT:    stlxrh w10, w12, [x11]
4406; CHECK-NOLSE-O0-NEXT:    cbnz w10, LBB46_2
4407; CHECK-NOLSE-O0-NEXT:  LBB46_4: ; %atomicrmw.start
4408; CHECK-NOLSE-O0-NEXT:    ; in Loop: Header=BB46_1 Depth=1
4409; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4410; CHECK-NOLSE-O0-NEXT:    uxth w8, w8
4411; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w9, uxth
4412; CHECK-NOLSE-O0-NEXT:    cset w8, eq
4413; CHECK-NOLSE-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4414; CHECK-NOLSE-O0-NEXT:    tbz w8, #0, LBB46_1
4415; CHECK-NOLSE-O0-NEXT:    b LBB46_5
4416; CHECK-NOLSE-O0-NEXT:  LBB46_5: ; %atomicrmw.end
4417; CHECK-NOLSE-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4418; CHECK-NOLSE-O0-NEXT:    add sp, sp, #32
4419; CHECK-NOLSE-O0-NEXT:    ret
4420;
4421; CHECK-LSE-O1-LABEL: atomicrmw_umax_i16:
4422; CHECK-LSE-O1:       ; %bb.0:
4423; CHECK-LSE-O1-NEXT:    ldumaxh w1, w0, [x0]
4424; CHECK-LSE-O1-NEXT:    ret
4425;
4426; CHECK-LSE-O0-LABEL: atomicrmw_umax_i16:
4427; CHECK-LSE-O0:       ; %bb.0:
4428; CHECK-LSE-O0-NEXT:    ldumaxh w1, w0, [x0]
4429; CHECK-LSE-O0-NEXT:    ret
4430;
4431; CHECK-LDAPR-O1-LABEL: atomicrmw_umax_i16:
4432; CHECK-LDAPR-O1:       ; %bb.0:
4433; CHECK-LDAPR-O1-NEXT:    and w9, w1, #0xffff
4434; CHECK-LDAPR-O1-NEXT:  LBB46_1: ; %atomicrmw.start
4435; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4436; CHECK-LDAPR-O1-NEXT:    ldxrh w8, [x0]
4437; CHECK-LDAPR-O1-NEXT:    and w10, w8, #0xffff
4438; CHECK-LDAPR-O1-NEXT:    cmp w10, w9
4439; CHECK-LDAPR-O1-NEXT:    csel w10, w10, w9, hi
4440; CHECK-LDAPR-O1-NEXT:    stxrh w11, w10, [x0]
4441; CHECK-LDAPR-O1-NEXT:    cbnz w11, LBB46_1
4442; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %atomicrmw.end
4443; CHECK-LDAPR-O1-NEXT:    mov w0, w8
4444; CHECK-LDAPR-O1-NEXT:    ret
4445;
4446; CHECK-LDAPR-O0-LABEL: atomicrmw_umax_i16:
4447; CHECK-LDAPR-O0:       ; %bb.0:
4448; CHECK-LDAPR-O0-NEXT:    sub sp, sp, #32
4449; CHECK-LDAPR-O0-NEXT:    .cfi_def_cfa_offset 32
4450; CHECK-LDAPR-O0-NEXT:    str x0, [sp, #16] ; 8-byte Folded Spill
4451; CHECK-LDAPR-O0-NEXT:    str w1, [sp, #24] ; 4-byte Folded Spill
4452; CHECK-LDAPR-O0-NEXT:    ldrh w8, [x0]
4453; CHECK-LDAPR-O0-NEXT:    str w8, [sp, #28] ; 4-byte Folded Spill
4454; CHECK-LDAPR-O0-NEXT:    b LBB46_1
4455; CHECK-LDAPR-O0-NEXT:  LBB46_1: ; %atomicrmw.start
4456; CHECK-LDAPR-O0-NEXT:    ; =>This Loop Header: Depth=1
4457; CHECK-LDAPR-O0-NEXT:    ; Child Loop BB46_2 Depth 2
4458; CHECK-LDAPR-O0-NEXT:    ldr w8, [sp, #28] ; 4-byte Folded Reload
4459; CHECK-LDAPR-O0-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
4460; CHECK-LDAPR-O0-NEXT:    ldr w9, [sp, #24] ; 4-byte Folded Reload
4461; CHECK-LDAPR-O0-NEXT:    uxth w10, w8
4462; CHECK-LDAPR-O0-NEXT:    subs w10, w10, w9, uxth
4463; CHECK-LDAPR-O0-NEXT:    cset w10, hi
4464; CHECK-LDAPR-O0-NEXT:    and w10, w10, #0x1
4465; CHECK-LDAPR-O0-NEXT:    ands w10, w10, #0x1
4466; CHECK-LDAPR-O0-NEXT:    csel w12, w8, w9, ne
4467; CHECK-LDAPR-O0-NEXT:  LBB46_2: ; %atomicrmw.start
4468; CHECK-LDAPR-O0-NEXT:    ; Parent Loop BB46_1 Depth=1
4469; CHECK-LDAPR-O0-NEXT:    ; => This Inner Loop Header: Depth=2
4470; CHECK-LDAPR-O0-NEXT:    ldaxrh w9, [x11]
4471; CHECK-LDAPR-O0-NEXT:    cmp w9, w8, uxth
4472; CHECK-LDAPR-O0-NEXT:    b.ne LBB46_4
4473; CHECK-LDAPR-O0-NEXT:  ; %bb.3: ; %atomicrmw.start
4474; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB46_2 Depth=2
4475; CHECK-LDAPR-O0-NEXT:    stlxrh w10, w12, [x11]
4476; CHECK-LDAPR-O0-NEXT:    cbnz w10, LBB46_2
4477; CHECK-LDAPR-O0-NEXT:  LBB46_4: ; %atomicrmw.start
4478; CHECK-LDAPR-O0-NEXT:    ; in Loop: Header=BB46_1 Depth=1
4479; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #12] ; 4-byte Folded Spill
4480; CHECK-LDAPR-O0-NEXT:    uxth w8, w8
4481; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w9, uxth
4482; CHECK-LDAPR-O0-NEXT:    cset w8, eq
4483; CHECK-LDAPR-O0-NEXT:    str w9, [sp, #28] ; 4-byte Folded Spill
4484; CHECK-LDAPR-O0-NEXT:    tbz w8, #0, LBB46_1
4485; CHECK-LDAPR-O0-NEXT:    b LBB46_5
4486; CHECK-LDAPR-O0-NEXT:  LBB46_5: ; %atomicrmw.end
4487; CHECK-LDAPR-O0-NEXT:    ldr w0, [sp, #12] ; 4-byte Folded Reload
4488; CHECK-LDAPR-O0-NEXT:    add sp, sp, #32
4489; CHECK-LDAPR-O0-NEXT:    ret
4490  %res = atomicrmw umax i16* %ptr, i16 %rhs monotonic
4491  ret i16 %res
4492}
4493
4494define { i8, i1 } @cmpxchg_i8(i8* %ptr, i8 %desired, i8 %new) {
4495; CHECK-NOLSE-O1-LABEL: cmpxchg_i8:
4496; CHECK-NOLSE-O1:       ; %bb.0:
4497; CHECK-NOLSE-O1-NEXT:    mov x8, x0
4498; CHECK-NOLSE-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
4499; CHECK-NOLSE-O1-NEXT:  LBB47_1: ; %cmpxchg.start
4500; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4501; CHECK-NOLSE-O1-NEXT:    ldxrb w0, [x8]
4502; CHECK-NOLSE-O1-NEXT:    and w9, w0, #0xff
4503; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxtb
4504; CHECK-NOLSE-O1-NEXT:    b.ne LBB47_4
4505; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
4506; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB47_1 Depth=1
4507; CHECK-NOLSE-O1-NEXT:    stxrb w9, w2, [x8]
4508; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB47_1
4509; CHECK-NOLSE-O1-NEXT:  ; %bb.3:
4510; CHECK-NOLSE-O1-NEXT:    mov w1, #1
4511; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4512; CHECK-NOLSE-O1-NEXT:    ret
4513; CHECK-NOLSE-O1-NEXT:  LBB47_4: ; %cmpxchg.nostore
4514; CHECK-NOLSE-O1-NEXT:    mov w1, wzr
4515; CHECK-NOLSE-O1-NEXT:    clrex
4516; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4517; CHECK-NOLSE-O1-NEXT:    ret
4518;
4519; CHECK-NOLSE-O0-LABEL: cmpxchg_i8:
4520; CHECK-NOLSE-O0:       ; %bb.0:
4521; CHECK-NOLSE-O0-NEXT:    mov x9, x0
4522; CHECK-NOLSE-O0-NEXT:  LBB47_1: ; =>This Inner Loop Header: Depth=1
4523; CHECK-NOLSE-O0-NEXT:    ldaxrb w0, [x9]
4524; CHECK-NOLSE-O0-NEXT:    cmp w0, w1, uxtb
4525; CHECK-NOLSE-O0-NEXT:    b.ne LBB47_3
4526; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB47_1 Depth=1
4527; CHECK-NOLSE-O0-NEXT:    stlxrb w8, w2, [x9]
4528; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB47_1
4529; CHECK-NOLSE-O0-NEXT:  LBB47_3:
4530; CHECK-NOLSE-O0-NEXT:    and w8, w0, #0xff
4531; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w1, uxtb
4532; CHECK-NOLSE-O0-NEXT:    cset w8, eq
4533; CHECK-NOLSE-O0-NEXT:    and w1, w8, #0x1
4534; CHECK-NOLSE-O0-NEXT:    ret
4535;
4536; CHECK-LSE-O1-LABEL: cmpxchg_i8:
4537; CHECK-LSE-O1:       ; %bb.0:
4538; CHECK-LSE-O1-NEXT:    mov x8, x1
4539; CHECK-LSE-O1-NEXT:    casb w8, w2, [x0]
4540; CHECK-LSE-O1-NEXT:    and w9, w8, #0xff
4541; CHECK-LSE-O1-NEXT:    cmp w9, w1, uxtb
4542; CHECK-LSE-O1-NEXT:    cset w1, eq
4543; CHECK-LSE-O1-NEXT:    mov x0, x8
4544; CHECK-LSE-O1-NEXT:    ret
4545;
4546; CHECK-LSE-O0-LABEL: cmpxchg_i8:
4547; CHECK-LSE-O0:       ; %bb.0:
4548; CHECK-LSE-O0-NEXT:    mov x8, x0
4549; CHECK-LSE-O0-NEXT:    mov x0, x1
4550; CHECK-LSE-O0-NEXT:    casb w0, w2, [x8]
4551; CHECK-LSE-O0-NEXT:    and w8, w0, #0xff
4552; CHECK-LSE-O0-NEXT:    subs w8, w8, w1, uxtb
4553; CHECK-LSE-O0-NEXT:    cset w8, eq
4554; CHECK-LSE-O0-NEXT:    and w1, w8, #0x1
4555; CHECK-LSE-O0-NEXT:    ret
4556;
4557; CHECK-LDAPR-O1-LABEL: cmpxchg_i8:
4558; CHECK-LDAPR-O1:       ; %bb.0:
4559; CHECK-LDAPR-O1-NEXT:    mov x8, x0
4560; CHECK-LDAPR-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
4561; CHECK-LDAPR-O1-NEXT:  LBB47_1: ; %cmpxchg.start
4562; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4563; CHECK-LDAPR-O1-NEXT:    ldxrb w0, [x8]
4564; CHECK-LDAPR-O1-NEXT:    and w9, w0, #0xff
4565; CHECK-LDAPR-O1-NEXT:    cmp w9, w1, uxtb
4566; CHECK-LDAPR-O1-NEXT:    b.ne LBB47_4
4567; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
4568; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB47_1 Depth=1
4569; CHECK-LDAPR-O1-NEXT:    stxrb w9, w2, [x8]
4570; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB47_1
4571; CHECK-LDAPR-O1-NEXT:  ; %bb.3:
4572; CHECK-LDAPR-O1-NEXT:    mov w1, #1
4573; CHECK-LDAPR-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4574; CHECK-LDAPR-O1-NEXT:    ret
4575; CHECK-LDAPR-O1-NEXT:  LBB47_4: ; %cmpxchg.nostore
4576; CHECK-LDAPR-O1-NEXT:    mov w1, wzr
4577; CHECK-LDAPR-O1-NEXT:    clrex
4578; CHECK-LDAPR-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4579; CHECK-LDAPR-O1-NEXT:    ret
4580;
4581; CHECK-LDAPR-O0-LABEL: cmpxchg_i8:
4582; CHECK-LDAPR-O0:       ; %bb.0:
4583; CHECK-LDAPR-O0-NEXT:    mov x9, x0
4584; CHECK-LDAPR-O0-NEXT:  LBB47_1: ; =>This Inner Loop Header: Depth=1
4585; CHECK-LDAPR-O0-NEXT:    ldaxrb w0, [x9]
4586; CHECK-LDAPR-O0-NEXT:    cmp w0, w1, uxtb
4587; CHECK-LDAPR-O0-NEXT:    b.ne LBB47_3
4588; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB47_1 Depth=1
4589; CHECK-LDAPR-O0-NEXT:    stlxrb w8, w2, [x9]
4590; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB47_1
4591; CHECK-LDAPR-O0-NEXT:  LBB47_3:
4592; CHECK-LDAPR-O0-NEXT:    and w8, w0, #0xff
4593; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w1, uxtb
4594; CHECK-LDAPR-O0-NEXT:    cset w8, eq
4595; CHECK-LDAPR-O0-NEXT:    and w1, w8, #0x1
4596; CHECK-LDAPR-O0-NEXT:    ret
4597  %res = cmpxchg i8* %ptr, i8 %desired, i8 %new monotonic monotonic
4598  ret { i8, i1 } %res
4599}
4600
4601define { i16, i1 } @cmpxchg_i16(i16* %ptr, i16 %desired, i16 %new) {
4602; CHECK-NOLSE-O1-LABEL: cmpxchg_i16:
4603; CHECK-NOLSE-O1:       ; %bb.0:
4604; CHECK-NOLSE-O1-NEXT:    mov x8, x0
4605; CHECK-NOLSE-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
4606; CHECK-NOLSE-O1-NEXT:  LBB48_1: ; %cmpxchg.start
4607; CHECK-NOLSE-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4608; CHECK-NOLSE-O1-NEXT:    ldxrh w0, [x8]
4609; CHECK-NOLSE-O1-NEXT:    and w9, w0, #0xffff
4610; CHECK-NOLSE-O1-NEXT:    cmp w9, w1, uxth
4611; CHECK-NOLSE-O1-NEXT:    b.ne LBB48_4
4612; CHECK-NOLSE-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
4613; CHECK-NOLSE-O1-NEXT:    ; in Loop: Header=BB48_1 Depth=1
4614; CHECK-NOLSE-O1-NEXT:    stxrh w9, w2, [x8]
4615; CHECK-NOLSE-O1-NEXT:    cbnz w9, LBB48_1
4616; CHECK-NOLSE-O1-NEXT:  ; %bb.3:
4617; CHECK-NOLSE-O1-NEXT:    mov w1, #1
4618; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4619; CHECK-NOLSE-O1-NEXT:    ret
4620; CHECK-NOLSE-O1-NEXT:  LBB48_4: ; %cmpxchg.nostore
4621; CHECK-NOLSE-O1-NEXT:    mov w1, wzr
4622; CHECK-NOLSE-O1-NEXT:    clrex
4623; CHECK-NOLSE-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4624; CHECK-NOLSE-O1-NEXT:    ret
4625;
4626; CHECK-NOLSE-O0-LABEL: cmpxchg_i16:
4627; CHECK-NOLSE-O0:       ; %bb.0:
4628; CHECK-NOLSE-O0-NEXT:    mov x9, x0
4629; CHECK-NOLSE-O0-NEXT:  LBB48_1: ; =>This Inner Loop Header: Depth=1
4630; CHECK-NOLSE-O0-NEXT:    ldaxrh w0, [x9]
4631; CHECK-NOLSE-O0-NEXT:    cmp w0, w1, uxth
4632; CHECK-NOLSE-O0-NEXT:    b.ne LBB48_3
4633; CHECK-NOLSE-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB48_1 Depth=1
4634; CHECK-NOLSE-O0-NEXT:    stlxrh w8, w2, [x9]
4635; CHECK-NOLSE-O0-NEXT:    cbnz w8, LBB48_1
4636; CHECK-NOLSE-O0-NEXT:  LBB48_3:
4637; CHECK-NOLSE-O0-NEXT:    and w8, w0, #0xffff
4638; CHECK-NOLSE-O0-NEXT:    subs w8, w8, w1, uxth
4639; CHECK-NOLSE-O0-NEXT:    cset w8, eq
4640; CHECK-NOLSE-O0-NEXT:    and w1, w8, #0x1
4641; CHECK-NOLSE-O0-NEXT:    ret
4642;
4643; CHECK-LSE-O1-LABEL: cmpxchg_i16:
4644; CHECK-LSE-O1:       ; %bb.0:
4645; CHECK-LSE-O1-NEXT:    mov x8, x1
4646; CHECK-LSE-O1-NEXT:    cash w8, w2, [x0]
4647; CHECK-LSE-O1-NEXT:    and w9, w8, #0xffff
4648; CHECK-LSE-O1-NEXT:    cmp w9, w1, uxth
4649; CHECK-LSE-O1-NEXT:    cset w1, eq
4650; CHECK-LSE-O1-NEXT:    mov x0, x8
4651; CHECK-LSE-O1-NEXT:    ret
4652;
4653; CHECK-LSE-O0-LABEL: cmpxchg_i16:
4654; CHECK-LSE-O0:       ; %bb.0:
4655; CHECK-LSE-O0-NEXT:    mov x8, x0
4656; CHECK-LSE-O0-NEXT:    mov x0, x1
4657; CHECK-LSE-O0-NEXT:    cash w0, w2, [x8]
4658; CHECK-LSE-O0-NEXT:    and w8, w0, #0xffff
4659; CHECK-LSE-O0-NEXT:    subs w8, w8, w1, uxth
4660; CHECK-LSE-O0-NEXT:    cset w8, eq
4661; CHECK-LSE-O0-NEXT:    and w1, w8, #0x1
4662; CHECK-LSE-O0-NEXT:    ret
4663;
4664; CHECK-LDAPR-O1-LABEL: cmpxchg_i16:
4665; CHECK-LDAPR-O1:       ; %bb.0:
4666; CHECK-LDAPR-O1-NEXT:    mov x8, x0
4667; CHECK-LDAPR-O1-NEXT:    ; kill: def $w2 killed $w2 def $x2
4668; CHECK-LDAPR-O1-NEXT:  LBB48_1: ; %cmpxchg.start
4669; CHECK-LDAPR-O1-NEXT:    ; =>This Inner Loop Header: Depth=1
4670; CHECK-LDAPR-O1-NEXT:    ldxrh w0, [x8]
4671; CHECK-LDAPR-O1-NEXT:    and w9, w0, #0xffff
4672; CHECK-LDAPR-O1-NEXT:    cmp w9, w1, uxth
4673; CHECK-LDAPR-O1-NEXT:    b.ne LBB48_4
4674; CHECK-LDAPR-O1-NEXT:  ; %bb.2: ; %cmpxchg.trystore
4675; CHECK-LDAPR-O1-NEXT:    ; in Loop: Header=BB48_1 Depth=1
4676; CHECK-LDAPR-O1-NEXT:    stxrh w9, w2, [x8]
4677; CHECK-LDAPR-O1-NEXT:    cbnz w9, LBB48_1
4678; CHECK-LDAPR-O1-NEXT:  ; %bb.3:
4679; CHECK-LDAPR-O1-NEXT:    mov w1, #1
4680; CHECK-LDAPR-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4681; CHECK-LDAPR-O1-NEXT:    ret
4682; CHECK-LDAPR-O1-NEXT:  LBB48_4: ; %cmpxchg.nostore
4683; CHECK-LDAPR-O1-NEXT:    mov w1, wzr
4684; CHECK-LDAPR-O1-NEXT:    clrex
4685; CHECK-LDAPR-O1-NEXT:    ; kill: def $w0 killed $w0 killed $x0
4686; CHECK-LDAPR-O1-NEXT:    ret
4687;
4688; CHECK-LDAPR-O0-LABEL: cmpxchg_i16:
4689; CHECK-LDAPR-O0:       ; %bb.0:
4690; CHECK-LDAPR-O0-NEXT:    mov x9, x0
4691; CHECK-LDAPR-O0-NEXT:  LBB48_1: ; =>This Inner Loop Header: Depth=1
4692; CHECK-LDAPR-O0-NEXT:    ldaxrh w0, [x9]
4693; CHECK-LDAPR-O0-NEXT:    cmp w0, w1, uxth
4694; CHECK-LDAPR-O0-NEXT:    b.ne LBB48_3
4695; CHECK-LDAPR-O0-NEXT:  ; %bb.2: ; in Loop: Header=BB48_1 Depth=1
4696; CHECK-LDAPR-O0-NEXT:    stlxrh w8, w2, [x9]
4697; CHECK-LDAPR-O0-NEXT:    cbnz w8, LBB48_1
4698; CHECK-LDAPR-O0-NEXT:  LBB48_3:
4699; CHECK-LDAPR-O0-NEXT:    and w8, w0, #0xffff
4700; CHECK-LDAPR-O0-NEXT:    subs w8, w8, w1, uxth
4701; CHECK-LDAPR-O0-NEXT:    cset w8, eq
4702; CHECK-LDAPR-O0-NEXT:    and w1, w8, #0x1
4703; CHECK-LDAPR-O0-NEXT:    ret
4704  %res = cmpxchg i16* %ptr, i16 %desired, i16 %new monotonic monotonic
4705  ret { i16, i1 } %res
4706}
4707
4708define internal double @bitcast_to_double(i64* %ptr) {
4709; CHECK-NOLSE-LABEL: bitcast_to_double:
4710; CHECK-NOLSE:       ; %bb.0:
4711; CHECK-NOLSE-NEXT:    ldar x8, [x0]
4712; CHECK-NOLSE-NEXT:    fmov d0, x8
4713; CHECK-NOLSE-NEXT:    ret
4714;
4715; CHECK-LSE-O1-LABEL: bitcast_to_double:
4716; CHECK-LSE-O1:       ; %bb.0:
4717; CHECK-LSE-O1-NEXT:    ldar x8, [x0]
4718; CHECK-LSE-O1-NEXT:    fmov d0, x8
4719; CHECK-LSE-O1-NEXT:    ret
4720;
4721; CHECK-LSE-O0-LABEL: bitcast_to_double:
4722; CHECK-LSE-O0:       ; %bb.0:
4723; CHECK-LSE-O0-NEXT:    ldar x8, [x0]
4724; CHECK-LSE-O0-NEXT:    fmov d0, x8
4725; CHECK-LSE-O0-NEXT:    ret
4726;
4727; CHECK-LDAPR-O1-LABEL: bitcast_to_double:
4728; CHECK-LDAPR-O1:       ; %bb.0:
4729; CHECK-LDAPR-O1-NEXT:    ldar x8, [x0]
4730; CHECK-LDAPR-O1-NEXT:    fmov d0, x8
4731; CHECK-LDAPR-O1-NEXT:    ret
4732;
4733; CHECK-LDAPR-O0-LABEL: bitcast_to_double:
4734; CHECK-LDAPR-O0:       ; %bb.0:
4735; CHECK-LDAPR-O0-NEXT:    ldar x8, [x0]
4736; CHECK-LDAPR-O0-NEXT:    fmov d0, x8
4737; CHECK-LDAPR-O0-NEXT:    ret
4738  %load = load atomic i64, i64* %ptr seq_cst, align 8
4739  %bitcast = bitcast i64 %load to double
4740  ret double %bitcast
4741}
4742
4743define internal float @bitcast_to_float(i32* %ptr) {
4744; CHECK-NOLSE-LABEL: bitcast_to_float:
4745; CHECK-NOLSE:       ; %bb.0:
4746; CHECK-NOLSE-NEXT:    ldar w8, [x0]
4747; CHECK-NOLSE-NEXT:    fmov s0, w8
4748; CHECK-NOLSE-NEXT:    ret
4749;
4750; CHECK-LSE-O1-LABEL: bitcast_to_float:
4751; CHECK-LSE-O1:       ; %bb.0:
4752; CHECK-LSE-O1-NEXT:    ldar w8, [x0]
4753; CHECK-LSE-O1-NEXT:    fmov s0, w8
4754; CHECK-LSE-O1-NEXT:    ret
4755;
4756; CHECK-LSE-O0-LABEL: bitcast_to_float:
4757; CHECK-LSE-O0:       ; %bb.0:
4758; CHECK-LSE-O0-NEXT:    ldar w8, [x0]
4759; CHECK-LSE-O0-NEXT:    fmov s0, w8
4760; CHECK-LSE-O0-NEXT:    ret
4761;
4762; CHECK-LDAPR-O1-LABEL: bitcast_to_float:
4763; CHECK-LDAPR-O1:       ; %bb.0:
4764; CHECK-LDAPR-O1-NEXT:    ldar w8, [x0]
4765; CHECK-LDAPR-O1-NEXT:    fmov s0, w8
4766; CHECK-LDAPR-O1-NEXT:    ret
4767;
4768; CHECK-LDAPR-O0-LABEL: bitcast_to_float:
4769; CHECK-LDAPR-O0:       ; %bb.0:
4770; CHECK-LDAPR-O0-NEXT:    ldar w8, [x0]
4771; CHECK-LDAPR-O0-NEXT:    fmov s0, w8
4772; CHECK-LDAPR-O0-NEXT:    ret
4773  %load = load atomic i32, i32* %ptr seq_cst, align 8
4774  %bitcast = bitcast i32 %load to float
4775  ret float %bitcast
4776}
4777
4778define internal half @bitcast_to_half(i16* %ptr) {
4779; CHECK-NOLSE-LABEL: bitcast_to_half:
4780; CHECK-NOLSE:       ; %bb.0:
4781; CHECK-NOLSE-NEXT:    ldarh w8, [x0]
4782; CHECK-NOLSE-NEXT:    fmov s0, w8
4783; CHECK-NOLSE-NEXT:    ; kill: def $h0 killed $h0 killed $s0
4784; CHECK-NOLSE-NEXT:    ret
4785;
4786; CHECK-LSE-O1-LABEL: bitcast_to_half:
4787; CHECK-LSE-O1:       ; %bb.0:
4788; CHECK-LSE-O1-NEXT:    ldarh w8, [x0]
4789; CHECK-LSE-O1-NEXT:    fmov s0, w8
4790; CHECK-LSE-O1-NEXT:    ; kill: def $h0 killed $h0 killed $s0
4791; CHECK-LSE-O1-NEXT:    ret
4792;
4793; CHECK-LSE-O0-LABEL: bitcast_to_half:
4794; CHECK-LSE-O0:       ; %bb.0:
4795; CHECK-LSE-O0-NEXT:    ldarh w8, [x0]
4796; CHECK-LSE-O0-NEXT:    fmov s0, w8
4797; CHECK-LSE-O0-NEXT:    ; kill: def $h0 killed $h0 killed $s0
4798; CHECK-LSE-O0-NEXT:    ret
4799;
4800; CHECK-LDAPR-O1-LABEL: bitcast_to_half:
4801; CHECK-LDAPR-O1:       ; %bb.0:
4802; CHECK-LDAPR-O1-NEXT:    ldarh w8, [x0]
4803; CHECK-LDAPR-O1-NEXT:    fmov s0, w8
4804; CHECK-LDAPR-O1-NEXT:    ; kill: def $h0 killed $h0 killed $s0
4805; CHECK-LDAPR-O1-NEXT:    ret
4806;
4807; CHECK-LDAPR-O0-LABEL: bitcast_to_half:
4808; CHECK-LDAPR-O0:       ; %bb.0:
4809; CHECK-LDAPR-O0-NEXT:    ldarh w8, [x0]
4810; CHECK-LDAPR-O0-NEXT:    fmov s0, w8
4811; CHECK-LDAPR-O0-NEXT:    ; kill: def $h0 killed $h0 killed $s0
4812; CHECK-LDAPR-O0-NEXT:    ret
4813  %load = load atomic i16, i16* %ptr seq_cst, align 8
4814  %bitcast = bitcast i16 %load to half
4815  ret half %bitcast
4816}
4817
4818define internal i64* @inttoptr(i64* %ptr) {
4819; CHECK-NOLSE-LABEL: inttoptr:
4820; CHECK-NOLSE:       ; %bb.0:
4821; CHECK-NOLSE-NEXT:    ldar x0, [x0]
4822; CHECK-NOLSE-NEXT:    ret
4823;
4824; CHECK-LSE-O1-LABEL: inttoptr:
4825; CHECK-LSE-O1:       ; %bb.0:
4826; CHECK-LSE-O1-NEXT:    ldar x0, [x0]
4827; CHECK-LSE-O1-NEXT:    ret
4828;
4829; CHECK-LSE-O0-LABEL: inttoptr:
4830; CHECK-LSE-O0:       ; %bb.0:
4831; CHECK-LSE-O0-NEXT:    ldar x0, [x0]
4832; CHECK-LSE-O0-NEXT:    ret
4833;
4834; CHECK-LDAPR-O1-LABEL: inttoptr:
4835; CHECK-LDAPR-O1:       ; %bb.0:
4836; CHECK-LDAPR-O1-NEXT:    ldar x0, [x0]
4837; CHECK-LDAPR-O1-NEXT:    ret
4838;
4839; CHECK-LDAPR-O0-LABEL: inttoptr:
4840; CHECK-LDAPR-O0:       ; %bb.0:
4841; CHECK-LDAPR-O0-NEXT:    ldar x0, [x0]
4842; CHECK-LDAPR-O0-NEXT:    ret
4843  %load = load atomic i64, i64* %ptr seq_cst, align 8
4844  %bitcast = inttoptr i64 %load to i64*
4845  ret i64* %bitcast
4846}
4847
4848define internal i64* @load_ptr(i64** %ptr) {
4849; CHECK-NOLSE-LABEL: load_ptr:
4850; CHECK-NOLSE:       ; %bb.0:
4851; CHECK-NOLSE-NEXT:    ldar x0, [x0]
4852; CHECK-NOLSE-NEXT:    ret
4853;
4854; CHECK-LSE-O1-LABEL: load_ptr:
4855; CHECK-LSE-O1:       ; %bb.0:
4856; CHECK-LSE-O1-NEXT:    ldar x0, [x0]
4857; CHECK-LSE-O1-NEXT:    ret
4858;
4859; CHECK-LSE-O0-LABEL: load_ptr:
4860; CHECK-LSE-O0:       ; %bb.0:
4861; CHECK-LSE-O0-NEXT:    ldar x0, [x0]
4862; CHECK-LSE-O0-NEXT:    ret
4863;
4864; CHECK-LDAPR-O1-LABEL: load_ptr:
4865; CHECK-LDAPR-O1:       ; %bb.0:
4866; CHECK-LDAPR-O1-NEXT:    ldar x0, [x0]
4867; CHECK-LDAPR-O1-NEXT:    ret
4868;
4869; CHECK-LDAPR-O0-LABEL: load_ptr:
4870; CHECK-LDAPR-O0:       ; %bb.0:
4871; CHECK-LDAPR-O0-NEXT:    ldar x0, [x0]
4872; CHECK-LDAPR-O0-NEXT:    ret
4873  %load = load atomic i64*, i64** %ptr seq_cst, align 8
4874  ret i64* %load
4875}
4876
4877attributes #0 = { nounwind }
4878