xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/atomic-cmpxchg.ll (revision 427be0767523b6e0f4004a421892f463d62446ac)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch64 -mattr=+d,-ld-seq-sa < %s | FileCheck %s --check-prefixes=LA64,NO-LD-SEQ-SA
3; RUN: llc --mtriple=loongarch64 -mattr=+d,+ld-seq-sa < %s | FileCheck %s --check-prefixes=LA64,LD-SEQ-SA
4; RUN: llc --mtriple=loongarch64 -mattr=+d,+lamcas < %s | FileCheck %s --check-prefix=LA64-LAMCAS
5
6define void @cmpxchg_i8_acquire_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind {
7; LA64-LABEL: cmpxchg_i8_acquire_acquire:
8; LA64:       # %bb.0:
9; LA64-NEXT:    slli.d $a3, $a0, 3
10; LA64-NEXT:    bstrins.d $a0, $zero, 1, 0
11; LA64-NEXT:    ori $a4, $zero, 255
12; LA64-NEXT:    sll.w $a4, $a4, $a3
13; LA64-NEXT:    andi $a1, $a1, 255
14; LA64-NEXT:    sll.w $a1, $a1, $a3
15; LA64-NEXT:    andi $a2, $a2, 255
16; LA64-NEXT:    sll.w $a2, $a2, $a3
17; LA64-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
18; LA64-NEXT:    ll.w $a3, $a0, 0
19; LA64-NEXT:    and $a5, $a3, $a4
20; LA64-NEXT:    bne $a5, $a1, .LBB0_3
21; LA64-NEXT:  # %bb.2: # in Loop: Header=BB0_1 Depth=1
22; LA64-NEXT:    andn $a5, $a3, $a4
23; LA64-NEXT:    or $a5, $a5, $a2
24; LA64-NEXT:    sc.w $a5, $a0, 0
25; LA64-NEXT:    beqz $a5, .LBB0_1
26; LA64-NEXT:    b .LBB0_4
27; LA64-NEXT:  .LBB0_3:
28; LA64-NEXT:    dbar 20
29; LA64-NEXT:  .LBB0_4:
30; LA64-NEXT:    ret
31;
32; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_acquire:
33; LA64-LAMCAS:       # %bb.0:
34; LA64-LAMCAS-NEXT:    amcas_db.b $a1, $a2, $a0
35; LA64-LAMCAS-NEXT:    ret
36  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire
37  ret void
38}
39
40define void @cmpxchg_i16_acquire_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind {
41; LA64-LABEL: cmpxchg_i16_acquire_acquire:
42; LA64:       # %bb.0:
43; LA64-NEXT:    slli.d $a3, $a0, 3
44; LA64-NEXT:    bstrins.d $a0, $zero, 1, 0
45; LA64-NEXT:    lu12i.w $a4, 15
46; LA64-NEXT:    ori $a4, $a4, 4095
47; LA64-NEXT:    sll.w $a4, $a4, $a3
48; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 0
49; LA64-NEXT:    sll.w $a1, $a1, $a3
50; LA64-NEXT:    bstrpick.d $a2, $a2, 15, 0
51; LA64-NEXT:    sll.w $a2, $a2, $a3
52; LA64-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
53; LA64-NEXT:    ll.w $a3, $a0, 0
54; LA64-NEXT:    and $a5, $a3, $a4
55; LA64-NEXT:    bne $a5, $a1, .LBB1_3
56; LA64-NEXT:  # %bb.2: # in Loop: Header=BB1_1 Depth=1
57; LA64-NEXT:    andn $a5, $a3, $a4
58; LA64-NEXT:    or $a5, $a5, $a2
59; LA64-NEXT:    sc.w $a5, $a0, 0
60; LA64-NEXT:    beqz $a5, .LBB1_1
61; LA64-NEXT:    b .LBB1_4
62; LA64-NEXT:  .LBB1_3:
63; LA64-NEXT:    dbar 20
64; LA64-NEXT:  .LBB1_4:
65; LA64-NEXT:    ret
66;
67; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_acquire:
68; LA64-LAMCAS:       # %bb.0:
69; LA64-LAMCAS-NEXT:    amcas_db.h $a1, $a2, $a0
70; LA64-LAMCAS-NEXT:    ret
71  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire
72  ret void
73}
74
75define void @cmpxchg_i32_acquire_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind {
76; LA64-LABEL: cmpxchg_i32_acquire_acquire:
77; LA64:       # %bb.0:
78; LA64-NEXT:    addi.w $a1, $a1, 0
79; LA64-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
80; LA64-NEXT:    ll.w $a3, $a0, 0
81; LA64-NEXT:    bne $a3, $a1, .LBB2_3
82; LA64-NEXT:  # %bb.2: # in Loop: Header=BB2_1 Depth=1
83; LA64-NEXT:    move $a4, $a2
84; LA64-NEXT:    sc.w $a4, $a0, 0
85; LA64-NEXT:    beqz $a4, .LBB2_1
86; LA64-NEXT:    b .LBB2_4
87; LA64-NEXT:  .LBB2_3:
88; LA64-NEXT:    dbar 20
89; LA64-NEXT:  .LBB2_4:
90; LA64-NEXT:    ret
91;
92; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_acquire:
93; LA64-LAMCAS:       # %bb.0:
94; LA64-LAMCAS-NEXT:    amcas_db.w $a1, $a2, $a0
95; LA64-LAMCAS-NEXT:    ret
96  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
97  ret void
98}
99
100define void @cmpxchg_i64_acquire_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind {
101; LA64-LABEL: cmpxchg_i64_acquire_acquire:
102; LA64:       # %bb.0:
103; LA64-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
104; LA64-NEXT:    ll.d $a3, $a0, 0
105; LA64-NEXT:    bne $a3, $a1, .LBB3_3
106; LA64-NEXT:  # %bb.2: # in Loop: Header=BB3_1 Depth=1
107; LA64-NEXT:    move $a4, $a2
108; LA64-NEXT:    sc.d $a4, $a0, 0
109; LA64-NEXT:    beqz $a4, .LBB3_1
110; LA64-NEXT:    b .LBB3_4
111; LA64-NEXT:  .LBB3_3:
112; LA64-NEXT:    dbar 20
113; LA64-NEXT:  .LBB3_4:
114; LA64-NEXT:    ret
115;
116; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_acquire:
117; LA64-LAMCAS:       # %bb.0:
118; LA64-LAMCAS-NEXT:    amcas_db.d $a1, $a2, $a0
119; LA64-LAMCAS-NEXT:    ret
120  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire
121  ret void
122}
123
124define void @cmpxchg_i8_acquire_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
125; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_acquire_monotonic:
126; NO-LD-SEQ-SA:       # %bb.0:
127; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
128; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
129; NO-LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
130; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
131; NO-LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
132; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
133; NO-LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
134; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
135; NO-LD-SEQ-SA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
136; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
137; NO-LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
138; NO-LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB4_3
139; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB4_1 Depth=1
140; NO-LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
141; NO-LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
142; NO-LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
143; NO-LD-SEQ-SA-NEXT:    beqz $a5, .LBB4_1
144; NO-LD-SEQ-SA-NEXT:    b .LBB4_4
145; NO-LD-SEQ-SA-NEXT:  .LBB4_3:
146; NO-LD-SEQ-SA-NEXT:    dbar 1792
147; NO-LD-SEQ-SA-NEXT:  .LBB4_4:
148; NO-LD-SEQ-SA-NEXT:    ret
149;
150; LD-SEQ-SA-LABEL: cmpxchg_i8_acquire_monotonic:
151; LD-SEQ-SA:       # %bb.0:
152; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
153; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
154; LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
155; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
156; LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
157; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
158; LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
159; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
160; LD-SEQ-SA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
161; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
162; LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
163; LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB4_3
164; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB4_1 Depth=1
165; LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
166; LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
167; LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
168; LD-SEQ-SA-NEXT:    beqz $a5, .LBB4_1
169; LD-SEQ-SA-NEXT:    b .LBB4_4
170; LD-SEQ-SA-NEXT:  .LBB4_3:
171; LD-SEQ-SA-NEXT:  .LBB4_4:
172; LD-SEQ-SA-NEXT:    ret
173;
174; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_monotonic:
175; LA64-LAMCAS:       # %bb.0:
176; LA64-LAMCAS-NEXT:    amcas_db.b $a1, $a2, $a0
177; LA64-LAMCAS-NEXT:    ret
178  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire monotonic
179  ret void
180}
181
182define void @cmpxchg_i16_acquire_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
183; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_acquire_monotonic:
184; NO-LD-SEQ-SA:       # %bb.0:
185; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
186; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
187; NO-LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
188; NO-LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
189; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
190; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
191; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
192; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
193; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
194; NO-LD-SEQ-SA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
195; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
196; NO-LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
197; NO-LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB5_3
198; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB5_1 Depth=1
199; NO-LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
200; NO-LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
201; NO-LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
202; NO-LD-SEQ-SA-NEXT:    beqz $a5, .LBB5_1
203; NO-LD-SEQ-SA-NEXT:    b .LBB5_4
204; NO-LD-SEQ-SA-NEXT:  .LBB5_3:
205; NO-LD-SEQ-SA-NEXT:    dbar 1792
206; NO-LD-SEQ-SA-NEXT:  .LBB5_4:
207; NO-LD-SEQ-SA-NEXT:    ret
208;
209; LD-SEQ-SA-LABEL: cmpxchg_i16_acquire_monotonic:
210; LD-SEQ-SA:       # %bb.0:
211; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
212; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
213; LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
214; LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
215; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
216; LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
217; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
218; LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
219; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
220; LD-SEQ-SA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
221; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
222; LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
223; LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB5_3
224; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB5_1 Depth=1
225; LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
226; LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
227; LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
228; LD-SEQ-SA-NEXT:    beqz $a5, .LBB5_1
229; LD-SEQ-SA-NEXT:    b .LBB5_4
230; LD-SEQ-SA-NEXT:  .LBB5_3:
231; LD-SEQ-SA-NEXT:  .LBB5_4:
232; LD-SEQ-SA-NEXT:    ret
233;
234; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_monotonic:
235; LA64-LAMCAS:       # %bb.0:
236; LA64-LAMCAS-NEXT:    amcas_db.h $a1, $a2, $a0
237; LA64-LAMCAS-NEXT:    ret
238  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire monotonic
239  ret void
240}
241
242define void @cmpxchg_i32_acquire_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
243; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_acquire_monotonic:
244; NO-LD-SEQ-SA:       # %bb.0:
245; NO-LD-SEQ-SA-NEXT:    addi.w $a1, $a1, 0
246; NO-LD-SEQ-SA-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1
247; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
248; NO-LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB6_3
249; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB6_1 Depth=1
250; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
251; NO-LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
252; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB6_1
253; NO-LD-SEQ-SA-NEXT:    b .LBB6_4
254; NO-LD-SEQ-SA-NEXT:  .LBB6_3:
255; NO-LD-SEQ-SA-NEXT:    dbar 1792
256; NO-LD-SEQ-SA-NEXT:  .LBB6_4:
257; NO-LD-SEQ-SA-NEXT:    ret
258;
259; LD-SEQ-SA-LABEL: cmpxchg_i32_acquire_monotonic:
260; LD-SEQ-SA:       # %bb.0:
261; LD-SEQ-SA-NEXT:    addi.w $a1, $a1, 0
262; LD-SEQ-SA-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1
263; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
264; LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB6_3
265; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB6_1 Depth=1
266; LD-SEQ-SA-NEXT:    move $a4, $a2
267; LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
268; LD-SEQ-SA-NEXT:    beqz $a4, .LBB6_1
269; LD-SEQ-SA-NEXT:    b .LBB6_4
270; LD-SEQ-SA-NEXT:  .LBB6_3:
271; LD-SEQ-SA-NEXT:  .LBB6_4:
272; LD-SEQ-SA-NEXT:    ret
273;
274; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_monotonic:
275; LA64-LAMCAS:       # %bb.0:
276; LA64-LAMCAS-NEXT:    amcas_db.w $a1, $a2, $a0
277; LA64-LAMCAS-NEXT:    ret
278  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire monotonic
279  ret void
280}
281
282define void @cmpxchg_i64_acquire_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
283; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_acquire_monotonic:
284; NO-LD-SEQ-SA:       # %bb.0:
285; NO-LD-SEQ-SA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
286; NO-LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
287; NO-LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB7_3
288; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB7_1 Depth=1
289; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
290; NO-LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
291; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB7_1
292; NO-LD-SEQ-SA-NEXT:    b .LBB7_4
293; NO-LD-SEQ-SA-NEXT:  .LBB7_3:
294; NO-LD-SEQ-SA-NEXT:    dbar 1792
295; NO-LD-SEQ-SA-NEXT:  .LBB7_4:
296; NO-LD-SEQ-SA-NEXT:    ret
297;
298; LD-SEQ-SA-LABEL: cmpxchg_i64_acquire_monotonic:
299; LD-SEQ-SA:       # %bb.0:
300; LD-SEQ-SA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
301; LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
302; LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB7_3
303; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB7_1 Depth=1
304; LD-SEQ-SA-NEXT:    move $a4, $a2
305; LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
306; LD-SEQ-SA-NEXT:    beqz $a4, .LBB7_1
307; LD-SEQ-SA-NEXT:    b .LBB7_4
308; LD-SEQ-SA-NEXT:  .LBB7_3:
309; LD-SEQ-SA-NEXT:  .LBB7_4:
310; LD-SEQ-SA-NEXT:    ret
311;
312; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_monotonic:
313; LA64-LAMCAS:       # %bb.0:
314; LA64-LAMCAS-NEXT:    amcas_db.d $a1, $a2, $a0
315; LA64-LAMCAS-NEXT:    ret
316  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire monotonic
317  ret void
318}
319
320define i8 @cmpxchg_i8_acquire_acquire_reti8(ptr %ptr, i8 %cmp, i8 %val) nounwind {
321; LA64-LABEL: cmpxchg_i8_acquire_acquire_reti8:
322; LA64:       # %bb.0:
323; LA64-NEXT:    slli.d $a3, $a0, 3
324; LA64-NEXT:    bstrins.d $a0, $zero, 1, 0
325; LA64-NEXT:    ori $a4, $zero, 255
326; LA64-NEXT:    sll.w $a4, $a4, $a3
327; LA64-NEXT:    andi $a1, $a1, 255
328; LA64-NEXT:    sll.w $a1, $a1, $a3
329; LA64-NEXT:    andi $a2, $a2, 255
330; LA64-NEXT:    sll.w $a2, $a2, $a3
331; LA64-NEXT:  .LBB8_1: # =>This Inner Loop Header: Depth=1
332; LA64-NEXT:    ll.w $a5, $a0, 0
333; LA64-NEXT:    and $a6, $a5, $a4
334; LA64-NEXT:    bne $a6, $a1, .LBB8_3
335; LA64-NEXT:  # %bb.2: # in Loop: Header=BB8_1 Depth=1
336; LA64-NEXT:    andn $a6, $a5, $a4
337; LA64-NEXT:    or $a6, $a6, $a2
338; LA64-NEXT:    sc.w $a6, $a0, 0
339; LA64-NEXT:    beqz $a6, .LBB8_1
340; LA64-NEXT:    b .LBB8_4
341; LA64-NEXT:  .LBB8_3:
342; LA64-NEXT:    dbar 20
343; LA64-NEXT:  .LBB8_4:
344; LA64-NEXT:    srl.w $a0, $a5, $a3
345; LA64-NEXT:    ret
346;
347; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_acquire_reti8:
348; LA64-LAMCAS:       # %bb.0:
349; LA64-LAMCAS-NEXT:    amcas_db.b $a1, $a2, $a0
350; LA64-LAMCAS-NEXT:    move $a0, $a1
351; LA64-LAMCAS-NEXT:    ret
352  %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire
353  %res = extractvalue { i8, i1 } %tmp, 0
354  ret i8 %res
355}
356
357define i16 @cmpxchg_i16_acquire_acquire_reti16(ptr %ptr, i16 %cmp, i16 %val) nounwind {
358; LA64-LABEL: cmpxchg_i16_acquire_acquire_reti16:
359; LA64:       # %bb.0:
360; LA64-NEXT:    slli.d $a3, $a0, 3
361; LA64-NEXT:    bstrins.d $a0, $zero, 1, 0
362; LA64-NEXT:    lu12i.w $a4, 15
363; LA64-NEXT:    ori $a4, $a4, 4095
364; LA64-NEXT:    sll.w $a4, $a4, $a3
365; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 0
366; LA64-NEXT:    sll.w $a1, $a1, $a3
367; LA64-NEXT:    bstrpick.d $a2, $a2, 15, 0
368; LA64-NEXT:    sll.w $a2, $a2, $a3
369; LA64-NEXT:  .LBB9_1: # =>This Inner Loop Header: Depth=1
370; LA64-NEXT:    ll.w $a5, $a0, 0
371; LA64-NEXT:    and $a6, $a5, $a4
372; LA64-NEXT:    bne $a6, $a1, .LBB9_3
373; LA64-NEXT:  # %bb.2: # in Loop: Header=BB9_1 Depth=1
374; LA64-NEXT:    andn $a6, $a5, $a4
375; LA64-NEXT:    or $a6, $a6, $a2
376; LA64-NEXT:    sc.w $a6, $a0, 0
377; LA64-NEXT:    beqz $a6, .LBB9_1
378; LA64-NEXT:    b .LBB9_4
379; LA64-NEXT:  .LBB9_3:
380; LA64-NEXT:    dbar 20
381; LA64-NEXT:  .LBB9_4:
382; LA64-NEXT:    srl.w $a0, $a5, $a3
383; LA64-NEXT:    ret
384;
385; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_acquire_reti16:
386; LA64-LAMCAS:       # %bb.0:
387; LA64-LAMCAS-NEXT:    amcas_db.h $a1, $a2, $a0
388; LA64-LAMCAS-NEXT:    move $a0, $a1
389; LA64-LAMCAS-NEXT:    ret
390  %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire
391  %res = extractvalue { i16, i1 } %tmp, 0
392  ret i16 %res
393}
394
395define i32 @cmpxchg_i32_acquire_acquire_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind {
396; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti32:
397; LA64:       # %bb.0:
398; LA64-NEXT:    addi.w $a3, $a1, 0
399; LA64-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
400; LA64-NEXT:    ll.w $a1, $a0, 0
401; LA64-NEXT:    bne $a1, $a3, .LBB10_3
402; LA64-NEXT:  # %bb.2: # in Loop: Header=BB10_1 Depth=1
403; LA64-NEXT:    move $a4, $a2
404; LA64-NEXT:    sc.w $a4, $a0, 0
405; LA64-NEXT:    beqz $a4, .LBB10_1
406; LA64-NEXT:    b .LBB10_4
407; LA64-NEXT:  .LBB10_3:
408; LA64-NEXT:    dbar 20
409; LA64-NEXT:  .LBB10_4:
410; LA64-NEXT:    move $a0, $a1
411; LA64-NEXT:    ret
412;
413; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_acquire_reti32:
414; LA64-LAMCAS:       # %bb.0:
415; LA64-LAMCAS-NEXT:    amcas_db.w $a1, $a2, $a0
416; LA64-LAMCAS-NEXT:    move $a0, $a1
417; LA64-LAMCAS-NEXT:    ret
418  %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
419  %res = extractvalue { i32, i1 } %tmp, 0
420  ret i32 %res
421}
422
423define i64 @cmpxchg_i64_acquire_acquire_reti64(ptr %ptr, i64 %cmp, i64 %val) nounwind {
424; LA64-LABEL: cmpxchg_i64_acquire_acquire_reti64:
425; LA64:       # %bb.0:
426; LA64-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
427; LA64-NEXT:    ll.d $a3, $a0, 0
428; LA64-NEXT:    bne $a3, $a1, .LBB11_3
429; LA64-NEXT:  # %bb.2: # in Loop: Header=BB11_1 Depth=1
430; LA64-NEXT:    move $a4, $a2
431; LA64-NEXT:    sc.d $a4, $a0, 0
432; LA64-NEXT:    beqz $a4, .LBB11_1
433; LA64-NEXT:    b .LBB11_4
434; LA64-NEXT:  .LBB11_3:
435; LA64-NEXT:    dbar 20
436; LA64-NEXT:  .LBB11_4:
437; LA64-NEXT:    move $a0, $a3
438; LA64-NEXT:    ret
439;
440; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_acquire_reti64:
441; LA64-LAMCAS:       # %bb.0:
442; LA64-LAMCAS-NEXT:    amcas_db.d $a1, $a2, $a0
443; LA64-LAMCAS-NEXT:    move $a0, $a1
444; LA64-LAMCAS-NEXT:    ret
445  %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire
446  %res = extractvalue { i64, i1 } %tmp, 0
447  ret i64 %res
448}
449
450define i1 @cmpxchg_i8_acquire_acquire_reti1(ptr %ptr, i8 %cmp, i8 %val) nounwind {
451; LA64-LABEL: cmpxchg_i8_acquire_acquire_reti1:
452; LA64:       # %bb.0:
453; LA64-NEXT:    slli.d $a3, $a0, 3
454; LA64-NEXT:    bstrins.d $a0, $zero, 1, 0
455; LA64-NEXT:    ori $a4, $zero, 255
456; LA64-NEXT:    sll.w $a4, $a4, $a3
457; LA64-NEXT:    andi $a1, $a1, 255
458; LA64-NEXT:    sll.w $a1, $a1, $a3
459; LA64-NEXT:    andi $a2, $a2, 255
460; LA64-NEXT:    sll.w $a2, $a2, $a3
461; LA64-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
462; LA64-NEXT:    ll.w $a3, $a0, 0
463; LA64-NEXT:    and $a5, $a3, $a4
464; LA64-NEXT:    bne $a5, $a1, .LBB12_3
465; LA64-NEXT:  # %bb.2: # in Loop: Header=BB12_1 Depth=1
466; LA64-NEXT:    andn $a5, $a3, $a4
467; LA64-NEXT:    or $a5, $a5, $a2
468; LA64-NEXT:    sc.w $a5, $a0, 0
469; LA64-NEXT:    beqz $a5, .LBB12_1
470; LA64-NEXT:    b .LBB12_4
471; LA64-NEXT:  .LBB12_3:
472; LA64-NEXT:    dbar 20
473; LA64-NEXT:  .LBB12_4:
474; LA64-NEXT:    and $a0, $a3, $a4
475; LA64-NEXT:    xor $a0, $a1, $a0
476; LA64-NEXT:    sltui $a0, $a0, 1
477; LA64-NEXT:    ret
478;
479; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_acquire_reti1:
480; LA64-LAMCAS:       # %bb.0:
481; LA64-LAMCAS-NEXT:    ext.w.b $a3, $a1
482; LA64-LAMCAS-NEXT:    amcas_db.b $a1, $a2, $a0
483; LA64-LAMCAS-NEXT:    xor $a0, $a1, $a3
484; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
485; LA64-LAMCAS-NEXT:    ret
486  %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire
487  %res = extractvalue { i8, i1 } %tmp, 1
488  ret i1 %res
489}
490
491define i1 @cmpxchg_i16_acquire_acquire_reti1(ptr %ptr, i16 %cmp, i16 %val) nounwind {
492; LA64-LABEL: cmpxchg_i16_acquire_acquire_reti1:
493; LA64:       # %bb.0:
494; LA64-NEXT:    slli.d $a3, $a0, 3
495; LA64-NEXT:    bstrins.d $a0, $zero, 1, 0
496; LA64-NEXT:    lu12i.w $a4, 15
497; LA64-NEXT:    ori $a4, $a4, 4095
498; LA64-NEXT:    sll.w $a4, $a4, $a3
499; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 0
500; LA64-NEXT:    sll.w $a1, $a1, $a3
501; LA64-NEXT:    bstrpick.d $a2, $a2, 15, 0
502; LA64-NEXT:    sll.w $a2, $a2, $a3
503; LA64-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
504; LA64-NEXT:    ll.w $a3, $a0, 0
505; LA64-NEXT:    and $a5, $a3, $a4
506; LA64-NEXT:    bne $a5, $a1, .LBB13_3
507; LA64-NEXT:  # %bb.2: # in Loop: Header=BB13_1 Depth=1
508; LA64-NEXT:    andn $a5, $a3, $a4
509; LA64-NEXT:    or $a5, $a5, $a2
510; LA64-NEXT:    sc.w $a5, $a0, 0
511; LA64-NEXT:    beqz $a5, .LBB13_1
512; LA64-NEXT:    b .LBB13_4
513; LA64-NEXT:  .LBB13_3:
514; LA64-NEXT:    dbar 20
515; LA64-NEXT:  .LBB13_4:
516; LA64-NEXT:    and $a0, $a3, $a4
517; LA64-NEXT:    xor $a0, $a1, $a0
518; LA64-NEXT:    sltui $a0, $a0, 1
519; LA64-NEXT:    ret
520;
521; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_acquire_reti1:
522; LA64-LAMCAS:       # %bb.0:
523; LA64-LAMCAS-NEXT:    ext.w.h $a3, $a1
524; LA64-LAMCAS-NEXT:    amcas_db.h $a1, $a2, $a0
525; LA64-LAMCAS-NEXT:    xor $a0, $a1, $a3
526; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
527; LA64-LAMCAS-NEXT:    ret
528  %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire
529  %res = extractvalue { i16, i1 } %tmp, 1
530  ret i1 %res
531}
532
533define i1 @cmpxchg_i32_acquire_acquire_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind {
534; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti1:
535; LA64:       # %bb.0:
536; LA64-NEXT:    addi.w $a1, $a1, 0
537; LA64-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
538; LA64-NEXT:    ll.w $a3, $a0, 0
539; LA64-NEXT:    bne $a3, $a1, .LBB14_3
540; LA64-NEXT:  # %bb.2: # in Loop: Header=BB14_1 Depth=1
541; LA64-NEXT:    move $a4, $a2
542; LA64-NEXT:    sc.w $a4, $a0, 0
543; LA64-NEXT:    beqz $a4, .LBB14_1
544; LA64-NEXT:    b .LBB14_4
545; LA64-NEXT:  .LBB14_3:
546; LA64-NEXT:    dbar 20
547; LA64-NEXT:  .LBB14_4:
548; LA64-NEXT:    xor $a0, $a3, $a1
549; LA64-NEXT:    sltui $a0, $a0, 1
550; LA64-NEXT:    ret
551;
552; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_acquire_reti1:
553; LA64-LAMCAS:       # %bb.0:
554; LA64-LAMCAS-NEXT:    addi.w $a3, $a1, 0
555; LA64-LAMCAS-NEXT:    amcas_db.w $a1, $a2, $a0
556; LA64-LAMCAS-NEXT:    xor $a0, $a1, $a3
557; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
558; LA64-LAMCAS-NEXT:    ret
559  %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
560  %res = extractvalue { i32, i1 } %tmp, 1
561  ret i1 %res
562}
563
564define i1 @cmpxchg_i64_acquire_acquire_reti1(ptr %ptr, i64 %cmp, i64 %val) nounwind {
565; LA64-LABEL: cmpxchg_i64_acquire_acquire_reti1:
566; LA64:       # %bb.0:
567; LA64-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
568; LA64-NEXT:    ll.d $a3, $a0, 0
569; LA64-NEXT:    bne $a3, $a1, .LBB15_3
570; LA64-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
571; LA64-NEXT:    move $a4, $a2
572; LA64-NEXT:    sc.d $a4, $a0, 0
573; LA64-NEXT:    beqz $a4, .LBB15_1
574; LA64-NEXT:    b .LBB15_4
575; LA64-NEXT:  .LBB15_3:
576; LA64-NEXT:    dbar 20
577; LA64-NEXT:  .LBB15_4:
578; LA64-NEXT:    xor $a0, $a3, $a1
579; LA64-NEXT:    sltui $a0, $a0, 1
580; LA64-NEXT:    ret
581;
582; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_acquire_reti1:
583; LA64-LAMCAS:       # %bb.0:
584; LA64-LAMCAS-NEXT:    move $a3, $a1
585; LA64-LAMCAS-NEXT:    amcas_db.d $a3, $a2, $a0
586; LA64-LAMCAS-NEXT:    xor $a0, $a3, $a1
587; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
588; LA64-LAMCAS-NEXT:    ret
589  %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire
590  %res = extractvalue { i64, i1 } %tmp, 1
591  ret i1 %res
592}
593
594define void @cmpxchg_i8_monotonic_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
595; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic:
596; NO-LD-SEQ-SA:       # %bb.0:
597; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
598; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
599; NO-LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
600; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
601; NO-LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
602; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
603; NO-LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
604; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
605; NO-LD-SEQ-SA-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
606; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
607; NO-LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
608; NO-LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB16_3
609; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB16_1 Depth=1
610; NO-LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
611; NO-LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
612; NO-LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
613; NO-LD-SEQ-SA-NEXT:    beqz $a5, .LBB16_1
614; NO-LD-SEQ-SA-NEXT:    b .LBB16_4
615; NO-LD-SEQ-SA-NEXT:  .LBB16_3:
616; NO-LD-SEQ-SA-NEXT:    dbar 1792
617; NO-LD-SEQ-SA-NEXT:  .LBB16_4:
618; NO-LD-SEQ-SA-NEXT:    ret
619;
620; LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic:
621; LD-SEQ-SA:       # %bb.0:
622; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
623; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
624; LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
625; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
626; LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
627; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
628; LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
629; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
630; LD-SEQ-SA-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
631; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
632; LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
633; LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB16_3
634; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB16_1 Depth=1
635; LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
636; LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
637; LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
638; LD-SEQ-SA-NEXT:    beqz $a5, .LBB16_1
639; LD-SEQ-SA-NEXT:    b .LBB16_4
640; LD-SEQ-SA-NEXT:  .LBB16_3:
641; LD-SEQ-SA-NEXT:  .LBB16_4:
642; LD-SEQ-SA-NEXT:    ret
643;
644; LA64-LAMCAS-LABEL: cmpxchg_i8_monotonic_monotonic:
645; LA64-LAMCAS:       # %bb.0:
646; LA64-LAMCAS-NEXT:    amcas.b $a1, $a2, $a0
647; LA64-LAMCAS-NEXT:    ret
648  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
649  ret void
650}
651
652define void @cmpxchg_i16_monotonic_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
653; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic:
654; NO-LD-SEQ-SA:       # %bb.0:
655; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
656; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
657; NO-LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
658; NO-LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
659; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
660; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
661; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
662; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
663; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
664; NO-LD-SEQ-SA-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
665; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
666; NO-LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
667; NO-LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB17_3
668; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB17_1 Depth=1
669; NO-LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
670; NO-LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
671; NO-LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
672; NO-LD-SEQ-SA-NEXT:    beqz $a5, .LBB17_1
673; NO-LD-SEQ-SA-NEXT:    b .LBB17_4
674; NO-LD-SEQ-SA-NEXT:  .LBB17_3:
675; NO-LD-SEQ-SA-NEXT:    dbar 1792
676; NO-LD-SEQ-SA-NEXT:  .LBB17_4:
677; NO-LD-SEQ-SA-NEXT:    ret
678;
679; LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic:
680; LD-SEQ-SA:       # %bb.0:
681; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
682; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
683; LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
684; LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
685; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
686; LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
687; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
688; LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
689; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
690; LD-SEQ-SA-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
691; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
692; LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
693; LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB17_3
694; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB17_1 Depth=1
695; LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
696; LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
697; LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
698; LD-SEQ-SA-NEXT:    beqz $a5, .LBB17_1
699; LD-SEQ-SA-NEXT:    b .LBB17_4
700; LD-SEQ-SA-NEXT:  .LBB17_3:
701; LD-SEQ-SA-NEXT:  .LBB17_4:
702; LD-SEQ-SA-NEXT:    ret
703;
704; LA64-LAMCAS-LABEL: cmpxchg_i16_monotonic_monotonic:
705; LA64-LAMCAS:       # %bb.0:
706; LA64-LAMCAS-NEXT:    amcas.h $a1, $a2, $a0
707; LA64-LAMCAS-NEXT:    ret
708  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
709  ret void
710}
711
712define void @cmpxchg_i32_monotonic_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
713; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic:
714; NO-LD-SEQ-SA:       # %bb.0:
715; NO-LD-SEQ-SA-NEXT:    addi.w $a1, $a1, 0
716; NO-LD-SEQ-SA-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
717; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
718; NO-LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB18_3
719; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB18_1 Depth=1
720; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
721; NO-LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
722; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB18_1
723; NO-LD-SEQ-SA-NEXT:    b .LBB18_4
724; NO-LD-SEQ-SA-NEXT:  .LBB18_3:
725; NO-LD-SEQ-SA-NEXT:    dbar 1792
726; NO-LD-SEQ-SA-NEXT:  .LBB18_4:
727; NO-LD-SEQ-SA-NEXT:    ret
728;
729; LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic:
730; LD-SEQ-SA:       # %bb.0:
731; LD-SEQ-SA-NEXT:    addi.w $a1, $a1, 0
732; LD-SEQ-SA-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
733; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
734; LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB18_3
735; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB18_1 Depth=1
736; LD-SEQ-SA-NEXT:    move $a4, $a2
737; LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
738; LD-SEQ-SA-NEXT:    beqz $a4, .LBB18_1
739; LD-SEQ-SA-NEXT:    b .LBB18_4
740; LD-SEQ-SA-NEXT:  .LBB18_3:
741; LD-SEQ-SA-NEXT:  .LBB18_4:
742; LD-SEQ-SA-NEXT:    ret
743;
744; LA64-LAMCAS-LABEL: cmpxchg_i32_monotonic_monotonic:
745; LA64-LAMCAS:       # %bb.0:
746; LA64-LAMCAS-NEXT:    amcas.w $a1, $a2, $a0
747; LA64-LAMCAS-NEXT:    ret
748  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
749  ret void
750}
751
752define void @cmpxchg_i64_monotonic_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
753; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic:
754; NO-LD-SEQ-SA:       # %bb.0:
755; NO-LD-SEQ-SA-NEXT:  .LBB19_1: # =>This Inner Loop Header: Depth=1
756; NO-LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
757; NO-LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB19_3
758; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB19_1 Depth=1
759; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
760; NO-LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
761; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB19_1
762; NO-LD-SEQ-SA-NEXT:    b .LBB19_4
763; NO-LD-SEQ-SA-NEXT:  .LBB19_3:
764; NO-LD-SEQ-SA-NEXT:    dbar 1792
765; NO-LD-SEQ-SA-NEXT:  .LBB19_4:
766; NO-LD-SEQ-SA-NEXT:    ret
767;
768; LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic:
769; LD-SEQ-SA:       # %bb.0:
770; LD-SEQ-SA-NEXT:  .LBB19_1: # =>This Inner Loop Header: Depth=1
771; LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
772; LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB19_3
773; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB19_1 Depth=1
774; LD-SEQ-SA-NEXT:    move $a4, $a2
775; LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
776; LD-SEQ-SA-NEXT:    beqz $a4, .LBB19_1
777; LD-SEQ-SA-NEXT:    b .LBB19_4
778; LD-SEQ-SA-NEXT:  .LBB19_3:
779; LD-SEQ-SA-NEXT:  .LBB19_4:
780; LD-SEQ-SA-NEXT:    ret
781;
782; LA64-LAMCAS-LABEL: cmpxchg_i64_monotonic_monotonic:
783; LA64-LAMCAS:       # %bb.0:
784; LA64-LAMCAS-NEXT:    amcas.d $a1, $a2, $a0
785; LA64-LAMCAS-NEXT:    ret
786  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic
787  ret void
788}
789
790define i8 @cmpxchg_i8_monotonic_monotonic_reti8(ptr %ptr, i8 %cmp, i8 %val) nounwind {
791; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti8:
792; NO-LD-SEQ-SA:       # %bb.0:
793; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
794; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
795; NO-LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
796; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
797; NO-LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
798; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
799; NO-LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
800; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
801; NO-LD-SEQ-SA-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
802; NO-LD-SEQ-SA-NEXT:    ll.w $a5, $a0, 0
803; NO-LD-SEQ-SA-NEXT:    and $a6, $a5, $a4
804; NO-LD-SEQ-SA-NEXT:    bne $a6, $a1, .LBB20_3
805; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB20_1 Depth=1
806; NO-LD-SEQ-SA-NEXT:    andn $a6, $a5, $a4
807; NO-LD-SEQ-SA-NEXT:    or $a6, $a6, $a2
808; NO-LD-SEQ-SA-NEXT:    sc.w $a6, $a0, 0
809; NO-LD-SEQ-SA-NEXT:    beqz $a6, .LBB20_1
810; NO-LD-SEQ-SA-NEXT:    b .LBB20_4
811; NO-LD-SEQ-SA-NEXT:  .LBB20_3:
812; NO-LD-SEQ-SA-NEXT:    dbar 1792
813; NO-LD-SEQ-SA-NEXT:  .LBB20_4:
814; NO-LD-SEQ-SA-NEXT:    srl.w $a0, $a5, $a3
815; NO-LD-SEQ-SA-NEXT:    ret
816;
817; LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti8:
818; LD-SEQ-SA:       # %bb.0:
819; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
820; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
821; LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
822; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
823; LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
824; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
825; LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
826; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
827; LD-SEQ-SA-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
828; LD-SEQ-SA-NEXT:    ll.w $a5, $a0, 0
829; LD-SEQ-SA-NEXT:    and $a6, $a5, $a4
830; LD-SEQ-SA-NEXT:    bne $a6, $a1, .LBB20_3
831; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB20_1 Depth=1
832; LD-SEQ-SA-NEXT:    andn $a6, $a5, $a4
833; LD-SEQ-SA-NEXT:    or $a6, $a6, $a2
834; LD-SEQ-SA-NEXT:    sc.w $a6, $a0, 0
835; LD-SEQ-SA-NEXT:    beqz $a6, .LBB20_1
836; LD-SEQ-SA-NEXT:    b .LBB20_4
837; LD-SEQ-SA-NEXT:  .LBB20_3:
838; LD-SEQ-SA-NEXT:  .LBB20_4:
839; LD-SEQ-SA-NEXT:    srl.w $a0, $a5, $a3
840; LD-SEQ-SA-NEXT:    ret
841;
842; LA64-LAMCAS-LABEL: cmpxchg_i8_monotonic_monotonic_reti8:
843; LA64-LAMCAS:       # %bb.0:
844; LA64-LAMCAS-NEXT:    amcas.b $a1, $a2, $a0
845; LA64-LAMCAS-NEXT:    move $a0, $a1
846; LA64-LAMCAS-NEXT:    ret
847  %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
848  %res = extractvalue { i8, i1 } %tmp, 0
849  ret i8 %res
850}
851
852define i16 @cmpxchg_i16_monotonic_monotonic_reti16(ptr %ptr, i16 %cmp, i16 %val) nounwind {
853; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti16:
854; NO-LD-SEQ-SA:       # %bb.0:
855; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
856; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
857; NO-LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
858; NO-LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
859; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
860; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
861; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
862; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
863; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
864; NO-LD-SEQ-SA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
865; NO-LD-SEQ-SA-NEXT:    ll.w $a5, $a0, 0
866; NO-LD-SEQ-SA-NEXT:    and $a6, $a5, $a4
867; NO-LD-SEQ-SA-NEXT:    bne $a6, $a1, .LBB21_3
868; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB21_1 Depth=1
869; NO-LD-SEQ-SA-NEXT:    andn $a6, $a5, $a4
870; NO-LD-SEQ-SA-NEXT:    or $a6, $a6, $a2
871; NO-LD-SEQ-SA-NEXT:    sc.w $a6, $a0, 0
872; NO-LD-SEQ-SA-NEXT:    beqz $a6, .LBB21_1
873; NO-LD-SEQ-SA-NEXT:    b .LBB21_4
874; NO-LD-SEQ-SA-NEXT:  .LBB21_3:
875; NO-LD-SEQ-SA-NEXT:    dbar 1792
876; NO-LD-SEQ-SA-NEXT:  .LBB21_4:
877; NO-LD-SEQ-SA-NEXT:    srl.w $a0, $a5, $a3
878; NO-LD-SEQ-SA-NEXT:    ret
879;
880; LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti16:
881; LD-SEQ-SA:       # %bb.0:
882; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
883; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
884; LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
885; LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
886; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
887; LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
888; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
889; LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
890; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
891; LD-SEQ-SA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
892; LD-SEQ-SA-NEXT:    ll.w $a5, $a0, 0
893; LD-SEQ-SA-NEXT:    and $a6, $a5, $a4
894; LD-SEQ-SA-NEXT:    bne $a6, $a1, .LBB21_3
895; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB21_1 Depth=1
896; LD-SEQ-SA-NEXT:    andn $a6, $a5, $a4
897; LD-SEQ-SA-NEXT:    or $a6, $a6, $a2
898; LD-SEQ-SA-NEXT:    sc.w $a6, $a0, 0
899; LD-SEQ-SA-NEXT:    beqz $a6, .LBB21_1
900; LD-SEQ-SA-NEXT:    b .LBB21_4
901; LD-SEQ-SA-NEXT:  .LBB21_3:
902; LD-SEQ-SA-NEXT:  .LBB21_4:
903; LD-SEQ-SA-NEXT:    srl.w $a0, $a5, $a3
904; LD-SEQ-SA-NEXT:    ret
905;
906; LA64-LAMCAS-LABEL: cmpxchg_i16_monotonic_monotonic_reti16:
907; LA64-LAMCAS:       # %bb.0:
908; LA64-LAMCAS-NEXT:    amcas.h $a1, $a2, $a0
909; LA64-LAMCAS-NEXT:    move $a0, $a1
910; LA64-LAMCAS-NEXT:    ret
911  %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
912  %res = extractvalue { i16, i1 } %tmp, 0
913  ret i16 %res
914}
915
916define i32 @cmpxchg_i32_monotonic_monotonic_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind {
917; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti32:
918; NO-LD-SEQ-SA:       # %bb.0:
919; NO-LD-SEQ-SA-NEXT:    addi.w $a3, $a1, 0
920; NO-LD-SEQ-SA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
921; NO-LD-SEQ-SA-NEXT:    ll.w $a1, $a0, 0
922; NO-LD-SEQ-SA-NEXT:    bne $a1, $a3, .LBB22_3
923; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB22_1 Depth=1
924; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
925; NO-LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
926; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB22_1
927; NO-LD-SEQ-SA-NEXT:    b .LBB22_4
928; NO-LD-SEQ-SA-NEXT:  .LBB22_3:
929; NO-LD-SEQ-SA-NEXT:    dbar 1792
930; NO-LD-SEQ-SA-NEXT:  .LBB22_4:
931; NO-LD-SEQ-SA-NEXT:    move $a0, $a1
932; NO-LD-SEQ-SA-NEXT:    ret
933;
934; LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti32:
935; LD-SEQ-SA:       # %bb.0:
936; LD-SEQ-SA-NEXT:    addi.w $a3, $a1, 0
937; LD-SEQ-SA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
938; LD-SEQ-SA-NEXT:    ll.w $a1, $a0, 0
939; LD-SEQ-SA-NEXT:    bne $a1, $a3, .LBB22_3
940; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB22_1 Depth=1
941; LD-SEQ-SA-NEXT:    move $a4, $a2
942; LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
943; LD-SEQ-SA-NEXT:    beqz $a4, .LBB22_1
944; LD-SEQ-SA-NEXT:    b .LBB22_4
945; LD-SEQ-SA-NEXT:  .LBB22_3:
946; LD-SEQ-SA-NEXT:  .LBB22_4:
947; LD-SEQ-SA-NEXT:    move $a0, $a1
948; LD-SEQ-SA-NEXT:    ret
949;
950; LA64-LAMCAS-LABEL: cmpxchg_i32_monotonic_monotonic_reti32:
951; LA64-LAMCAS:       # %bb.0:
952; LA64-LAMCAS-NEXT:    amcas.w $a1, $a2, $a0
953; LA64-LAMCAS-NEXT:    move $a0, $a1
954; LA64-LAMCAS-NEXT:    ret
955  %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
956  %res = extractvalue { i32, i1 } %tmp, 0
957  ret i32 %res
958}
959
960define i64 @cmpxchg_i64_monotonic_monotonic_reti64(ptr %ptr, i64 %cmp, i64 %val) nounwind {
961; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti64:
962; NO-LD-SEQ-SA:       # %bb.0:
963; NO-LD-SEQ-SA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
964; NO-LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
965; NO-LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB23_3
966; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB23_1 Depth=1
967; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
968; NO-LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
969; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB23_1
970; NO-LD-SEQ-SA-NEXT:    b .LBB23_4
971; NO-LD-SEQ-SA-NEXT:  .LBB23_3:
972; NO-LD-SEQ-SA-NEXT:    dbar 1792
973; NO-LD-SEQ-SA-NEXT:  .LBB23_4:
974; NO-LD-SEQ-SA-NEXT:    move $a0, $a3
975; NO-LD-SEQ-SA-NEXT:    ret
976;
977; LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti64:
978; LD-SEQ-SA:       # %bb.0:
979; LD-SEQ-SA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
980; LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
981; LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB23_3
982; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB23_1 Depth=1
983; LD-SEQ-SA-NEXT:    move $a4, $a2
984; LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
985; LD-SEQ-SA-NEXT:    beqz $a4, .LBB23_1
986; LD-SEQ-SA-NEXT:    b .LBB23_4
987; LD-SEQ-SA-NEXT:  .LBB23_3:
988; LD-SEQ-SA-NEXT:  .LBB23_4:
989; LD-SEQ-SA-NEXT:    move $a0, $a3
990; LD-SEQ-SA-NEXT:    ret
991;
992; LA64-LAMCAS-LABEL: cmpxchg_i64_monotonic_monotonic_reti64:
993; LA64-LAMCAS:       # %bb.0:
994; LA64-LAMCAS-NEXT:    amcas.d $a1, $a2, $a0
995; LA64-LAMCAS-NEXT:    move $a0, $a1
996; LA64-LAMCAS-NEXT:    ret
997  %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic
998  %res = extractvalue { i64, i1 } %tmp, 0
999  ret i64 %res
1000}
1001
1002define i1 @cmpxchg_i8_monotonic_monotonic_reti1(ptr %ptr, i8 %cmp, i8 %val) nounwind {
1003; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti1:
1004; NO-LD-SEQ-SA:       # %bb.0:
1005; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
1006; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
1007; NO-LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
1008; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
1009; NO-LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
1010; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
1011; NO-LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
1012; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
1013; NO-LD-SEQ-SA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
1014; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
1015; NO-LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
1016; NO-LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB24_3
1017; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB24_1 Depth=1
1018; NO-LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
1019; NO-LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
1020; NO-LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
1021; NO-LD-SEQ-SA-NEXT:    beqz $a5, .LBB24_1
1022; NO-LD-SEQ-SA-NEXT:    b .LBB24_4
1023; NO-LD-SEQ-SA-NEXT:  .LBB24_3:
1024; NO-LD-SEQ-SA-NEXT:    dbar 1792
1025; NO-LD-SEQ-SA-NEXT:  .LBB24_4:
1026; NO-LD-SEQ-SA-NEXT:    and $a0, $a3, $a4
1027; NO-LD-SEQ-SA-NEXT:    xor $a0, $a1, $a0
1028; NO-LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1029; NO-LD-SEQ-SA-NEXT:    ret
1030;
1031; LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti1:
1032; LD-SEQ-SA:       # %bb.0:
1033; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
1034; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
1035; LD-SEQ-SA-NEXT:    ori $a4, $zero, 255
1036; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
1037; LD-SEQ-SA-NEXT:    andi $a1, $a1, 255
1038; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
1039; LD-SEQ-SA-NEXT:    andi $a2, $a2, 255
1040; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
1041; LD-SEQ-SA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
1042; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
1043; LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
1044; LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB24_3
1045; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB24_1 Depth=1
1046; LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
1047; LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
1048; LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
1049; LD-SEQ-SA-NEXT:    beqz $a5, .LBB24_1
1050; LD-SEQ-SA-NEXT:    b .LBB24_4
1051; LD-SEQ-SA-NEXT:  .LBB24_3:
1052; LD-SEQ-SA-NEXT:  .LBB24_4:
1053; LD-SEQ-SA-NEXT:    and $a0, $a3, $a4
1054; LD-SEQ-SA-NEXT:    xor $a0, $a1, $a0
1055; LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1056; LD-SEQ-SA-NEXT:    ret
1057;
1058; LA64-LAMCAS-LABEL: cmpxchg_i8_monotonic_monotonic_reti1:
1059; LA64-LAMCAS:       # %bb.0:
1060; LA64-LAMCAS-NEXT:    ext.w.b $a3, $a1
1061; LA64-LAMCAS-NEXT:    amcas.b $a1, $a2, $a0
1062; LA64-LAMCAS-NEXT:    xor $a0, $a1, $a3
1063; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
1064; LA64-LAMCAS-NEXT:    ret
1065  %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
1066  %res = extractvalue { i8, i1 } %tmp, 1
1067  ret i1 %res
1068}
1069
1070define i1 @cmpxchg_i16_monotonic_monotonic_reti1(ptr %ptr, i16 %cmp, i16 %val) nounwind {
1071; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti1:
1072; NO-LD-SEQ-SA:       # %bb.0:
1073; NO-LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
1074; NO-LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
1075; NO-LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
1076; NO-LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
1077; NO-LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
1078; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
1079; NO-LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
1080; NO-LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
1081; NO-LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
1082; NO-LD-SEQ-SA-NEXT:  .LBB25_1: # =>This Inner Loop Header: Depth=1
1083; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
1084; NO-LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
1085; NO-LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB25_3
1086; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB25_1 Depth=1
1087; NO-LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
1088; NO-LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
1089; NO-LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
1090; NO-LD-SEQ-SA-NEXT:    beqz $a5, .LBB25_1
1091; NO-LD-SEQ-SA-NEXT:    b .LBB25_4
1092; NO-LD-SEQ-SA-NEXT:  .LBB25_3:
1093; NO-LD-SEQ-SA-NEXT:    dbar 1792
1094; NO-LD-SEQ-SA-NEXT:  .LBB25_4:
1095; NO-LD-SEQ-SA-NEXT:    and $a0, $a3, $a4
1096; NO-LD-SEQ-SA-NEXT:    xor $a0, $a1, $a0
1097; NO-LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1098; NO-LD-SEQ-SA-NEXT:    ret
1099;
1100; LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti1:
1101; LD-SEQ-SA:       # %bb.0:
1102; LD-SEQ-SA-NEXT:    slli.d $a3, $a0, 3
1103; LD-SEQ-SA-NEXT:    bstrins.d $a0, $zero, 1, 0
1104; LD-SEQ-SA-NEXT:    lu12i.w $a4, 15
1105; LD-SEQ-SA-NEXT:    ori $a4, $a4, 4095
1106; LD-SEQ-SA-NEXT:    sll.w $a4, $a4, $a3
1107; LD-SEQ-SA-NEXT:    bstrpick.d $a1, $a1, 15, 0
1108; LD-SEQ-SA-NEXT:    sll.w $a1, $a1, $a3
1109; LD-SEQ-SA-NEXT:    bstrpick.d $a2, $a2, 15, 0
1110; LD-SEQ-SA-NEXT:    sll.w $a2, $a2, $a3
1111; LD-SEQ-SA-NEXT:  .LBB25_1: # =>This Inner Loop Header: Depth=1
1112; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
1113; LD-SEQ-SA-NEXT:    and $a5, $a3, $a4
1114; LD-SEQ-SA-NEXT:    bne $a5, $a1, .LBB25_3
1115; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB25_1 Depth=1
1116; LD-SEQ-SA-NEXT:    andn $a5, $a3, $a4
1117; LD-SEQ-SA-NEXT:    or $a5, $a5, $a2
1118; LD-SEQ-SA-NEXT:    sc.w $a5, $a0, 0
1119; LD-SEQ-SA-NEXT:    beqz $a5, .LBB25_1
1120; LD-SEQ-SA-NEXT:    b .LBB25_4
1121; LD-SEQ-SA-NEXT:  .LBB25_3:
1122; LD-SEQ-SA-NEXT:  .LBB25_4:
1123; LD-SEQ-SA-NEXT:    and $a0, $a3, $a4
1124; LD-SEQ-SA-NEXT:    xor $a0, $a1, $a0
1125; LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1126; LD-SEQ-SA-NEXT:    ret
1127;
1128; LA64-LAMCAS-LABEL: cmpxchg_i16_monotonic_monotonic_reti1:
1129; LA64-LAMCAS:       # %bb.0:
1130; LA64-LAMCAS-NEXT:    ext.w.h $a3, $a1
1131; LA64-LAMCAS-NEXT:    amcas.h $a1, $a2, $a0
1132; LA64-LAMCAS-NEXT:    xor $a0, $a1, $a3
1133; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
1134; LA64-LAMCAS-NEXT:    ret
1135  %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
1136  %res = extractvalue { i16, i1 } %tmp, 1
1137  ret i1 %res
1138}
1139
1140define i1 @cmpxchg_i32_monotonic_monotonic_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind {
1141; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti1:
1142; NO-LD-SEQ-SA:       # %bb.0:
1143; NO-LD-SEQ-SA-NEXT:    addi.w $a1, $a1, 0
1144; NO-LD-SEQ-SA-NEXT:  .LBB26_1: # =>This Inner Loop Header: Depth=1
1145; NO-LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
1146; NO-LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB26_3
1147; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB26_1 Depth=1
1148; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
1149; NO-LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
1150; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB26_1
1151; NO-LD-SEQ-SA-NEXT:    b .LBB26_4
1152; NO-LD-SEQ-SA-NEXT:  .LBB26_3:
1153; NO-LD-SEQ-SA-NEXT:    dbar 1792
1154; NO-LD-SEQ-SA-NEXT:  .LBB26_4:
1155; NO-LD-SEQ-SA-NEXT:    xor $a0, $a3, $a1
1156; NO-LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1157; NO-LD-SEQ-SA-NEXT:    ret
1158;
1159; LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti1:
1160; LD-SEQ-SA:       # %bb.0:
1161; LD-SEQ-SA-NEXT:    addi.w $a1, $a1, 0
1162; LD-SEQ-SA-NEXT:  .LBB26_1: # =>This Inner Loop Header: Depth=1
1163; LD-SEQ-SA-NEXT:    ll.w $a3, $a0, 0
1164; LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB26_3
1165; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB26_1 Depth=1
1166; LD-SEQ-SA-NEXT:    move $a4, $a2
1167; LD-SEQ-SA-NEXT:    sc.w $a4, $a0, 0
1168; LD-SEQ-SA-NEXT:    beqz $a4, .LBB26_1
1169; LD-SEQ-SA-NEXT:    b .LBB26_4
1170; LD-SEQ-SA-NEXT:  .LBB26_3:
1171; LD-SEQ-SA-NEXT:  .LBB26_4:
1172; LD-SEQ-SA-NEXT:    xor $a0, $a3, $a1
1173; LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1174; LD-SEQ-SA-NEXT:    ret
1175;
1176; LA64-LAMCAS-LABEL: cmpxchg_i32_monotonic_monotonic_reti1:
1177; LA64-LAMCAS:       # %bb.0:
1178; LA64-LAMCAS-NEXT:    addi.w $a3, $a1, 0
1179; LA64-LAMCAS-NEXT:    amcas.w $a1, $a2, $a0
1180; LA64-LAMCAS-NEXT:    xor $a0, $a1, $a3
1181; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
1182; LA64-LAMCAS-NEXT:    ret
1183  %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
1184  %res = extractvalue { i32, i1 } %tmp, 1
1185  ret i1 %res
1186}
1187
1188define i1 @cmpxchg_i64_monotonic_monotonic_reti1(ptr %ptr, i64 %cmp, i64 %val) nounwind {
1189; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti1:
1190; NO-LD-SEQ-SA:       # %bb.0:
1191; NO-LD-SEQ-SA-NEXT:  .LBB27_1: # =>This Inner Loop Header: Depth=1
1192; NO-LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
1193; NO-LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB27_3
1194; NO-LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB27_1 Depth=1
1195; NO-LD-SEQ-SA-NEXT:    move $a4, $a2
1196; NO-LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
1197; NO-LD-SEQ-SA-NEXT:    beqz $a4, .LBB27_1
1198; NO-LD-SEQ-SA-NEXT:    b .LBB27_4
1199; NO-LD-SEQ-SA-NEXT:  .LBB27_3:
1200; NO-LD-SEQ-SA-NEXT:    dbar 1792
1201; NO-LD-SEQ-SA-NEXT:  .LBB27_4:
1202; NO-LD-SEQ-SA-NEXT:    xor $a0, $a3, $a1
1203; NO-LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1204; NO-LD-SEQ-SA-NEXT:    ret
1205;
1206; LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti1:
1207; LD-SEQ-SA:       # %bb.0:
1208; LD-SEQ-SA-NEXT:  .LBB27_1: # =>This Inner Loop Header: Depth=1
1209; LD-SEQ-SA-NEXT:    ll.d $a3, $a0, 0
1210; LD-SEQ-SA-NEXT:    bne $a3, $a1, .LBB27_3
1211; LD-SEQ-SA-NEXT:  # %bb.2: # in Loop: Header=BB27_1 Depth=1
1212; LD-SEQ-SA-NEXT:    move $a4, $a2
1213; LD-SEQ-SA-NEXT:    sc.d $a4, $a0, 0
1214; LD-SEQ-SA-NEXT:    beqz $a4, .LBB27_1
1215; LD-SEQ-SA-NEXT:    b .LBB27_4
1216; LD-SEQ-SA-NEXT:  .LBB27_3:
1217; LD-SEQ-SA-NEXT:  .LBB27_4:
1218; LD-SEQ-SA-NEXT:    xor $a0, $a3, $a1
1219; LD-SEQ-SA-NEXT:    sltui $a0, $a0, 1
1220; LD-SEQ-SA-NEXT:    ret
1221;
1222; LA64-LAMCAS-LABEL: cmpxchg_i64_monotonic_monotonic_reti1:
1223; LA64-LAMCAS:       # %bb.0:
1224; LA64-LAMCAS-NEXT:    move $a3, $a1
1225; LA64-LAMCAS-NEXT:    amcas.d $a3, $a2, $a0
1226; LA64-LAMCAS-NEXT:    xor $a0, $a3, $a1
1227; LA64-LAMCAS-NEXT:    sltui $a0, $a0, 1
1228; LA64-LAMCAS-NEXT:    ret
1229  %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic
1230  %res = extractvalue { i64, i1 } %tmp, 1
1231  ret i1 %res
1232}
1233