xref: /llvm-project/llvm/test/CodeGen/CSKY/atomic-cmpxchg.ll (revision 423ac3d9ee82ff48da91b35ec80497089bc55b9e)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=csky -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s \
3; RUN:   | FileCheck -check-prefix=CSKY %s
4
5define void @cmpxchg_i8_monotonic_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
6; CSKY-LABEL: cmpxchg_i8_monotonic_monotonic:
7; CSKY:       # %bb.0:
8; CSKY-NEXT:    subi16 sp, sp, 4
9; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
10; CSKY-NEXT:    subi16 sp, sp, 8
11; CSKY-NEXT:    st32.b a1, (sp, 7)
12; CSKY-NEXT:    movi16 a1, 0
13; CSKY-NEXT:    st16.w a1, (sp, 0)
14; CSKY-NEXT:    addi32 a1, sp, 7
15; CSKY-NEXT:    movi16 a3, 0
16; CSKY-NEXT:    jsri32 [.LCPI0_0]
17; CSKY-NEXT:    addi16 sp, sp, 8
18; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
19; CSKY-NEXT:    addi16 sp, sp, 4
20; CSKY-NEXT:    rts16
21; CSKY-NEXT:    .p2align 1
22; CSKY-NEXT:  # %bb.1:
23; CSKY-NEXT:    .p2align 2
24; CSKY-NEXT:  .LCPI0_0:
25; CSKY-NEXT:    .long __atomic_compare_exchange_1
26;
27  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
28  ret void
29}
30
31define void @cmpxchg_i8_acquire_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
32; CSKY-LABEL: cmpxchg_i8_acquire_monotonic:
33; CSKY:       # %bb.0:
34; CSKY-NEXT:    subi16 sp, sp, 4
35; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
36; CSKY-NEXT:    subi16 sp, sp, 8
37; CSKY-NEXT:    st32.b a1, (sp, 7)
38; CSKY-NEXT:    movi16 a1, 0
39; CSKY-NEXT:    st16.w a1, (sp, 0)
40; CSKY-NEXT:    addi32 a1, sp, 7
41; CSKY-NEXT:    movi16 a3, 2
42; CSKY-NEXT:    jsri32 [.LCPI1_0]
43; CSKY-NEXT:    addi16 sp, sp, 8
44; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
45; CSKY-NEXT:    addi16 sp, sp, 4
46; CSKY-NEXT:    rts16
47; CSKY-NEXT:    .p2align 1
48; CSKY-NEXT:  # %bb.1:
49; CSKY-NEXT:    .p2align 2
50; CSKY-NEXT:  .LCPI1_0:
51; CSKY-NEXT:    .long __atomic_compare_exchange_1
52;
53  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire monotonic
54  ret void
55}
56
57define void @cmpxchg_i8_acquire_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind {
58; CSKY-LABEL: cmpxchg_i8_acquire_acquire:
59; CSKY:       # %bb.0:
60; CSKY-NEXT:    subi16 sp, sp, 4
61; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
62; CSKY-NEXT:    subi16 sp, sp, 8
63; CSKY-NEXT:    st32.b a1, (sp, 7)
64; CSKY-NEXT:    movi16 a1, 2
65; CSKY-NEXT:    st16.w a1, (sp, 0)
66; CSKY-NEXT:    addi32 a1, sp, 7
67; CSKY-NEXT:    movi16 a3, 2
68; CSKY-NEXT:    jsri32 [.LCPI2_0]
69; CSKY-NEXT:    addi16 sp, sp, 8
70; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
71; CSKY-NEXT:    addi16 sp, sp, 4
72; CSKY-NEXT:    rts16
73; CSKY-NEXT:    .p2align 1
74; CSKY-NEXT:  # %bb.1:
75; CSKY-NEXT:    .p2align 2
76; CSKY-NEXT:  .LCPI2_0:
77; CSKY-NEXT:    .long __atomic_compare_exchange_1
78;
79  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire
80  ret void
81}
82
83define void @cmpxchg_i8_release_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
84; CSKY-LABEL: cmpxchg_i8_release_monotonic:
85; CSKY:       # %bb.0:
86; CSKY-NEXT:    subi16 sp, sp, 4
87; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
88; CSKY-NEXT:    subi16 sp, sp, 8
89; CSKY-NEXT:    st32.b a1, (sp, 7)
90; CSKY-NEXT:    movi16 a1, 0
91; CSKY-NEXT:    st16.w a1, (sp, 0)
92; CSKY-NEXT:    addi32 a1, sp, 7
93; CSKY-NEXT:    movi16 a3, 3
94; CSKY-NEXT:    jsri32 [.LCPI3_0]
95; CSKY-NEXT:    addi16 sp, sp, 8
96; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
97; CSKY-NEXT:    addi16 sp, sp, 4
98; CSKY-NEXT:    rts16
99; CSKY-NEXT:    .p2align 1
100; CSKY-NEXT:  # %bb.1:
101; CSKY-NEXT:    .p2align 2
102; CSKY-NEXT:  .LCPI3_0:
103; CSKY-NEXT:    .long __atomic_compare_exchange_1
104;
105  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val release monotonic
106  ret void
107}
108
109define void @cmpxchg_i8_release_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind {
110; CSKY-LABEL: cmpxchg_i8_release_acquire:
111; CSKY:       # %bb.0:
112; CSKY-NEXT:    subi16 sp, sp, 4
113; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
114; CSKY-NEXT:    subi16 sp, sp, 8
115; CSKY-NEXT:    st32.b a1, (sp, 7)
116; CSKY-NEXT:    movi16 a1, 2
117; CSKY-NEXT:    st16.w a1, (sp, 0)
118; CSKY-NEXT:    addi32 a1, sp, 7
119; CSKY-NEXT:    movi16 a3, 3
120; CSKY-NEXT:    jsri32 [.LCPI4_0]
121; CSKY-NEXT:    addi16 sp, sp, 8
122; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
123; CSKY-NEXT:    addi16 sp, sp, 4
124; CSKY-NEXT:    rts16
125; CSKY-NEXT:    .p2align 1
126; CSKY-NEXT:  # %bb.1:
127; CSKY-NEXT:    .p2align 2
128; CSKY-NEXT:  .LCPI4_0:
129; CSKY-NEXT:    .long __atomic_compare_exchange_1
130;
131  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val release acquire
132  ret void
133}
134
135define void @cmpxchg_i8_acq_rel_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
136; CSKY-LABEL: cmpxchg_i8_acq_rel_monotonic:
137; CSKY:       # %bb.0:
138; CSKY-NEXT:    subi16 sp, sp, 4
139; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
140; CSKY-NEXT:    subi16 sp, sp, 8
141; CSKY-NEXT:    st32.b a1, (sp, 7)
142; CSKY-NEXT:    movi16 a1, 0
143; CSKY-NEXT:    st16.w a1, (sp, 0)
144; CSKY-NEXT:    addi32 a1, sp, 7
145; CSKY-NEXT:    movi16 a3, 4
146; CSKY-NEXT:    jsri32 [.LCPI5_0]
147; CSKY-NEXT:    addi16 sp, sp, 8
148; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
149; CSKY-NEXT:    addi16 sp, sp, 4
150; CSKY-NEXT:    rts16
151; CSKY-NEXT:    .p2align 1
152; CSKY-NEXT:  # %bb.1:
153; CSKY-NEXT:    .p2align 2
154; CSKY-NEXT:  .LCPI5_0:
155; CSKY-NEXT:    .long __atomic_compare_exchange_1
156;
157  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acq_rel monotonic
158  ret void
159}
160
161define void @cmpxchg_i8_acq_rel_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind {
162; CSKY-LABEL: cmpxchg_i8_acq_rel_acquire:
163; CSKY:       # %bb.0:
164; CSKY-NEXT:    subi16 sp, sp, 4
165; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
166; CSKY-NEXT:    subi16 sp, sp, 8
167; CSKY-NEXT:    st32.b a1, (sp, 7)
168; CSKY-NEXT:    movi16 a1, 2
169; CSKY-NEXT:    st16.w a1, (sp, 0)
170; CSKY-NEXT:    addi32 a1, sp, 7
171; CSKY-NEXT:    movi16 a3, 4
172; CSKY-NEXT:    jsri32 [.LCPI6_0]
173; CSKY-NEXT:    addi16 sp, sp, 8
174; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
175; CSKY-NEXT:    addi16 sp, sp, 4
176; CSKY-NEXT:    rts16
177; CSKY-NEXT:    .p2align 1
178; CSKY-NEXT:  # %bb.1:
179; CSKY-NEXT:    .p2align 2
180; CSKY-NEXT:  .LCPI6_0:
181; CSKY-NEXT:    .long __atomic_compare_exchange_1
182;
183  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acq_rel acquire
184  ret void
185}
186
187define void @cmpxchg_i8_seq_cst_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
188; CSKY-LABEL: cmpxchg_i8_seq_cst_monotonic:
189; CSKY:       # %bb.0:
190; CSKY-NEXT:    subi16 sp, sp, 4
191; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
192; CSKY-NEXT:    subi16 sp, sp, 8
193; CSKY-NEXT:    st32.b a1, (sp, 7)
194; CSKY-NEXT:    movi16 a1, 0
195; CSKY-NEXT:    st16.w a1, (sp, 0)
196; CSKY-NEXT:    addi32 a1, sp, 7
197; CSKY-NEXT:    movi16 a3, 5
198; CSKY-NEXT:    jsri32 [.LCPI7_0]
199; CSKY-NEXT:    addi16 sp, sp, 8
200; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
201; CSKY-NEXT:    addi16 sp, sp, 4
202; CSKY-NEXT:    rts16
203; CSKY-NEXT:    .p2align 1
204; CSKY-NEXT:  # %bb.1:
205; CSKY-NEXT:    .p2align 2
206; CSKY-NEXT:  .LCPI7_0:
207; CSKY-NEXT:    .long __atomic_compare_exchange_1
208;
209  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst monotonic
210  ret void
211}
212
213define void @cmpxchg_i8_seq_cst_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind {
214; CSKY-LABEL: cmpxchg_i8_seq_cst_acquire:
215; CSKY:       # %bb.0:
216; CSKY-NEXT:    subi16 sp, sp, 4
217; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
218; CSKY-NEXT:    subi16 sp, sp, 8
219; CSKY-NEXT:    st32.b a1, (sp, 7)
220; CSKY-NEXT:    movi16 a1, 2
221; CSKY-NEXT:    st16.w a1, (sp, 0)
222; CSKY-NEXT:    addi32 a1, sp, 7
223; CSKY-NEXT:    movi16 a3, 5
224; CSKY-NEXT:    jsri32 [.LCPI8_0]
225; CSKY-NEXT:    addi16 sp, sp, 8
226; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
227; CSKY-NEXT:    addi16 sp, sp, 4
228; CSKY-NEXT:    rts16
229; CSKY-NEXT:    .p2align 1
230; CSKY-NEXT:  # %bb.1:
231; CSKY-NEXT:    .p2align 2
232; CSKY-NEXT:  .LCPI8_0:
233; CSKY-NEXT:    .long __atomic_compare_exchange_1
234;
235  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst acquire
236  ret void
237}
238
239define void @cmpxchg_i8_seq_cst_seq_cst(ptr %ptr, i8 %cmp, i8 %val) nounwind {
240; CSKY-LABEL: cmpxchg_i8_seq_cst_seq_cst:
241; CSKY:       # %bb.0:
242; CSKY-NEXT:    subi16 sp, sp, 4
243; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
244; CSKY-NEXT:    subi16 sp, sp, 8
245; CSKY-NEXT:    st32.b a1, (sp, 7)
246; CSKY-NEXT:    movi16 a1, 5
247; CSKY-NEXT:    st16.w a1, (sp, 0)
248; CSKY-NEXT:    addi32 a1, sp, 7
249; CSKY-NEXT:    movi16 a3, 5
250; CSKY-NEXT:    jsri32 [.LCPI9_0]
251; CSKY-NEXT:    addi16 sp, sp, 8
252; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
253; CSKY-NEXT:    addi16 sp, sp, 4
254; CSKY-NEXT:    rts16
255; CSKY-NEXT:    .p2align 1
256; CSKY-NEXT:  # %bb.1:
257; CSKY-NEXT:    .p2align 2
258; CSKY-NEXT:  .LCPI9_0:
259; CSKY-NEXT:    .long __atomic_compare_exchange_1
260;
261  %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst seq_cst
262  ret void
263}
264
265define void @cmpxchg_i16_monotonic_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
266; CSKY-LABEL: cmpxchg_i16_monotonic_monotonic:
267; CSKY:       # %bb.0:
268; CSKY-NEXT:    subi16 sp, sp, 4
269; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
270; CSKY-NEXT:    subi16 sp, sp, 8
271; CSKY-NEXT:    st32.h a1, (sp, 6)
272; CSKY-NEXT:    movi16 a1, 0
273; CSKY-NEXT:    st16.w a1, (sp, 0)
274; CSKY-NEXT:    addi32 a1, sp, 6
275; CSKY-NEXT:    movi16 a3, 0
276; CSKY-NEXT:    jsri32 [.LCPI10_0]
277; CSKY-NEXT:    addi16 sp, sp, 8
278; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
279; CSKY-NEXT:    addi16 sp, sp, 4
280; CSKY-NEXT:    rts16
281; CSKY-NEXT:    .p2align 1
282; CSKY-NEXT:  # %bb.1:
283; CSKY-NEXT:    .p2align 2
284; CSKY-NEXT:  .LCPI10_0:
285; CSKY-NEXT:    .long __atomic_compare_exchange_2
286;
287  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
288  ret void
289}
290
291define void @cmpxchg_i16_acquire_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
292; CSKY-LABEL: cmpxchg_i16_acquire_monotonic:
293; CSKY:       # %bb.0:
294; CSKY-NEXT:    subi16 sp, sp, 4
295; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
296; CSKY-NEXT:    subi16 sp, sp, 8
297; CSKY-NEXT:    st32.h a1, (sp, 6)
298; CSKY-NEXT:    movi16 a1, 0
299; CSKY-NEXT:    st16.w a1, (sp, 0)
300; CSKY-NEXT:    addi32 a1, sp, 6
301; CSKY-NEXT:    movi16 a3, 2
302; CSKY-NEXT:    jsri32 [.LCPI11_0]
303; CSKY-NEXT:    addi16 sp, sp, 8
304; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
305; CSKY-NEXT:    addi16 sp, sp, 4
306; CSKY-NEXT:    rts16
307; CSKY-NEXT:    .p2align 1
308; CSKY-NEXT:  # %bb.1:
309; CSKY-NEXT:    .p2align 2
310; CSKY-NEXT:  .LCPI11_0:
311; CSKY-NEXT:    .long __atomic_compare_exchange_2
312;
313  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire monotonic
314  ret void
315}
316
317define void @cmpxchg_i16_acquire_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind {
318; CSKY-LABEL: cmpxchg_i16_acquire_acquire:
319; CSKY:       # %bb.0:
320; CSKY-NEXT:    subi16 sp, sp, 4
321; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
322; CSKY-NEXT:    subi16 sp, sp, 8
323; CSKY-NEXT:    st32.h a1, (sp, 6)
324; CSKY-NEXT:    movi16 a1, 2
325; CSKY-NEXT:    st16.w a1, (sp, 0)
326; CSKY-NEXT:    addi32 a1, sp, 6
327; CSKY-NEXT:    movi16 a3, 2
328; CSKY-NEXT:    jsri32 [.LCPI12_0]
329; CSKY-NEXT:    addi16 sp, sp, 8
330; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
331; CSKY-NEXT:    addi16 sp, sp, 4
332; CSKY-NEXT:    rts16
333; CSKY-NEXT:    .p2align 1
334; CSKY-NEXT:  # %bb.1:
335; CSKY-NEXT:    .p2align 2
336; CSKY-NEXT:  .LCPI12_0:
337; CSKY-NEXT:    .long __atomic_compare_exchange_2
338;
339  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire
340  ret void
341}
342
343define void @cmpxchg_i16_release_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
344; CSKY-LABEL: cmpxchg_i16_release_monotonic:
345; CSKY:       # %bb.0:
346; CSKY-NEXT:    subi16 sp, sp, 4
347; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
348; CSKY-NEXT:    subi16 sp, sp, 8
349; CSKY-NEXT:    st32.h a1, (sp, 6)
350; CSKY-NEXT:    movi16 a1, 0
351; CSKY-NEXT:    st16.w a1, (sp, 0)
352; CSKY-NEXT:    addi32 a1, sp, 6
353; CSKY-NEXT:    movi16 a3, 3
354; CSKY-NEXT:    jsri32 [.LCPI13_0]
355; CSKY-NEXT:    addi16 sp, sp, 8
356; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
357; CSKY-NEXT:    addi16 sp, sp, 4
358; CSKY-NEXT:    rts16
359; CSKY-NEXT:    .p2align 1
360; CSKY-NEXT:  # %bb.1:
361; CSKY-NEXT:    .p2align 2
362; CSKY-NEXT:  .LCPI13_0:
363; CSKY-NEXT:    .long __atomic_compare_exchange_2
364;
365  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val release monotonic
366  ret void
367}
368
369define void @cmpxchg_i16_release_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind {
370; CSKY-LABEL: cmpxchg_i16_release_acquire:
371; CSKY:       # %bb.0:
372; CSKY-NEXT:    subi16 sp, sp, 4
373; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
374; CSKY-NEXT:    subi16 sp, sp, 8
375; CSKY-NEXT:    st32.h a1, (sp, 6)
376; CSKY-NEXT:    movi16 a1, 2
377; CSKY-NEXT:    st16.w a1, (sp, 0)
378; CSKY-NEXT:    addi32 a1, sp, 6
379; CSKY-NEXT:    movi16 a3, 3
380; CSKY-NEXT:    jsri32 [.LCPI14_0]
381; CSKY-NEXT:    addi16 sp, sp, 8
382; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
383; CSKY-NEXT:    addi16 sp, sp, 4
384; CSKY-NEXT:    rts16
385; CSKY-NEXT:    .p2align 1
386; CSKY-NEXT:  # %bb.1:
387; CSKY-NEXT:    .p2align 2
388; CSKY-NEXT:  .LCPI14_0:
389; CSKY-NEXT:    .long __atomic_compare_exchange_2
390;
391  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val release acquire
392  ret void
393}
394
395define void @cmpxchg_i16_acq_rel_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
396; CSKY-LABEL: cmpxchg_i16_acq_rel_monotonic:
397; CSKY:       # %bb.0:
398; CSKY-NEXT:    subi16 sp, sp, 4
399; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
400; CSKY-NEXT:    subi16 sp, sp, 8
401; CSKY-NEXT:    st32.h a1, (sp, 6)
402; CSKY-NEXT:    movi16 a1, 0
403; CSKY-NEXT:    st16.w a1, (sp, 0)
404; CSKY-NEXT:    addi32 a1, sp, 6
405; CSKY-NEXT:    movi16 a3, 4
406; CSKY-NEXT:    jsri32 [.LCPI15_0]
407; CSKY-NEXT:    addi16 sp, sp, 8
408; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
409; CSKY-NEXT:    addi16 sp, sp, 4
410; CSKY-NEXT:    rts16
411; CSKY-NEXT:    .p2align 1
412; CSKY-NEXT:  # %bb.1:
413; CSKY-NEXT:    .p2align 2
414; CSKY-NEXT:  .LCPI15_0:
415; CSKY-NEXT:    .long __atomic_compare_exchange_2
416;
417  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acq_rel monotonic
418  ret void
419}
420
421define void @cmpxchg_i16_acq_rel_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind {
422; CSKY-LABEL: cmpxchg_i16_acq_rel_acquire:
423; CSKY:       # %bb.0:
424; CSKY-NEXT:    subi16 sp, sp, 4
425; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
426; CSKY-NEXT:    subi16 sp, sp, 8
427; CSKY-NEXT:    st32.h a1, (sp, 6)
428; CSKY-NEXT:    movi16 a1, 2
429; CSKY-NEXT:    st16.w a1, (sp, 0)
430; CSKY-NEXT:    addi32 a1, sp, 6
431; CSKY-NEXT:    movi16 a3, 4
432; CSKY-NEXT:    jsri32 [.LCPI16_0]
433; CSKY-NEXT:    addi16 sp, sp, 8
434; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
435; CSKY-NEXT:    addi16 sp, sp, 4
436; CSKY-NEXT:    rts16
437; CSKY-NEXT:    .p2align 1
438; CSKY-NEXT:  # %bb.1:
439; CSKY-NEXT:    .p2align 2
440; CSKY-NEXT:  .LCPI16_0:
441; CSKY-NEXT:    .long __atomic_compare_exchange_2
442;
443  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acq_rel acquire
444  ret void
445}
446
447define void @cmpxchg_i16_seq_cst_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
448; CSKY-LABEL: cmpxchg_i16_seq_cst_monotonic:
449; CSKY:       # %bb.0:
450; CSKY-NEXT:    subi16 sp, sp, 4
451; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
452; CSKY-NEXT:    subi16 sp, sp, 8
453; CSKY-NEXT:    st32.h a1, (sp, 6)
454; CSKY-NEXT:    movi16 a1, 0
455; CSKY-NEXT:    st16.w a1, (sp, 0)
456; CSKY-NEXT:    addi32 a1, sp, 6
457; CSKY-NEXT:    movi16 a3, 5
458; CSKY-NEXT:    jsri32 [.LCPI17_0]
459; CSKY-NEXT:    addi16 sp, sp, 8
460; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
461; CSKY-NEXT:    addi16 sp, sp, 4
462; CSKY-NEXT:    rts16
463; CSKY-NEXT:    .p2align 1
464; CSKY-NEXT:  # %bb.1:
465; CSKY-NEXT:    .p2align 2
466; CSKY-NEXT:  .LCPI17_0:
467; CSKY-NEXT:    .long __atomic_compare_exchange_2
468;
469  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val seq_cst monotonic
470  ret void
471}
472
473define void @cmpxchg_i16_seq_cst_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind {
474; CSKY-LABEL: cmpxchg_i16_seq_cst_acquire:
475; CSKY:       # %bb.0:
476; CSKY-NEXT:    subi16 sp, sp, 4
477; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
478; CSKY-NEXT:    subi16 sp, sp, 8
479; CSKY-NEXT:    st32.h a1, (sp, 6)
480; CSKY-NEXT:    movi16 a1, 2
481; CSKY-NEXT:    st16.w a1, (sp, 0)
482; CSKY-NEXT:    addi32 a1, sp, 6
483; CSKY-NEXT:    movi16 a3, 5
484; CSKY-NEXT:    jsri32 [.LCPI18_0]
485; CSKY-NEXT:    addi16 sp, sp, 8
486; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
487; CSKY-NEXT:    addi16 sp, sp, 4
488; CSKY-NEXT:    rts16
489; CSKY-NEXT:    .p2align 1
490; CSKY-NEXT:  # %bb.1:
491; CSKY-NEXT:    .p2align 2
492; CSKY-NEXT:  .LCPI18_0:
493; CSKY-NEXT:    .long __atomic_compare_exchange_2
494;
495  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val seq_cst acquire
496  ret void
497}
498
499define void @cmpxchg_i16_seq_cst_seq_cst(ptr %ptr, i16 %cmp, i16 %val) nounwind {
500; CSKY-LABEL: cmpxchg_i16_seq_cst_seq_cst:
501; CSKY:       # %bb.0:
502; CSKY-NEXT:    subi16 sp, sp, 4
503; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
504; CSKY-NEXT:    subi16 sp, sp, 8
505; CSKY-NEXT:    st32.h a1, (sp, 6)
506; CSKY-NEXT:    movi16 a1, 5
507; CSKY-NEXT:    st16.w a1, (sp, 0)
508; CSKY-NEXT:    addi32 a1, sp, 6
509; CSKY-NEXT:    movi16 a3, 5
510; CSKY-NEXT:    jsri32 [.LCPI19_0]
511; CSKY-NEXT:    addi16 sp, sp, 8
512; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
513; CSKY-NEXT:    addi16 sp, sp, 4
514; CSKY-NEXT:    rts16
515; CSKY-NEXT:    .p2align 1
516; CSKY-NEXT:  # %bb.1:
517; CSKY-NEXT:    .p2align 2
518; CSKY-NEXT:  .LCPI19_0:
519; CSKY-NEXT:    .long __atomic_compare_exchange_2
520;
521  %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val seq_cst seq_cst
522  ret void
523}
524
525define void @cmpxchg_i32_monotonic_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
526; CSKY-LABEL: cmpxchg_i32_monotonic_monotonic:
527; CSKY:       # %bb.0:
528; CSKY-NEXT:    subi16 sp, sp, 4
529; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
530; CSKY-NEXT:    subi16 sp, sp, 8
531; CSKY-NEXT:    st16.w a1, (sp, 4)
532; CSKY-NEXT:    movi16 a1, 0
533; CSKY-NEXT:    st16.w a1, (sp, 0)
534; CSKY-NEXT:    addi16 a1, sp, 4
535; CSKY-NEXT:    movi16 a3, 0
536; CSKY-NEXT:    jsri32 [.LCPI20_0]
537; CSKY-NEXT:    addi16 sp, sp, 8
538; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
539; CSKY-NEXT:    addi16 sp, sp, 4
540; CSKY-NEXT:    rts16
541; CSKY-NEXT:    .p2align 1
542; CSKY-NEXT:  # %bb.1:
543; CSKY-NEXT:    .p2align 2
544; CSKY-NEXT:  .LCPI20_0:
545; CSKY-NEXT:    .long __atomic_compare_exchange_4
546;
547  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
548  ret void
549}
550
551define void @cmpxchg_i32_acquire_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
552; CSKY-LABEL: cmpxchg_i32_acquire_monotonic:
553; CSKY:       # %bb.0:
554; CSKY-NEXT:    subi16 sp, sp, 4
555; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
556; CSKY-NEXT:    subi16 sp, sp, 8
557; CSKY-NEXT:    st16.w a1, (sp, 4)
558; CSKY-NEXT:    movi16 a1, 0
559; CSKY-NEXT:    st16.w a1, (sp, 0)
560; CSKY-NEXT:    addi16 a1, sp, 4
561; CSKY-NEXT:    movi16 a3, 2
562; CSKY-NEXT:    jsri32 [.LCPI21_0]
563; CSKY-NEXT:    addi16 sp, sp, 8
564; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
565; CSKY-NEXT:    addi16 sp, sp, 4
566; CSKY-NEXT:    rts16
567; CSKY-NEXT:    .p2align 1
568; CSKY-NEXT:  # %bb.1:
569; CSKY-NEXT:    .p2align 2
570; CSKY-NEXT:  .LCPI21_0:
571; CSKY-NEXT:    .long __atomic_compare_exchange_4
572;
573  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire monotonic
574  ret void
575}
576
577define void @cmpxchg_i32_acquire_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind {
578; CSKY-LABEL: cmpxchg_i32_acquire_acquire:
579; CSKY:       # %bb.0:
580; CSKY-NEXT:    subi16 sp, sp, 4
581; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
582; CSKY-NEXT:    subi16 sp, sp, 8
583; CSKY-NEXT:    st16.w a1, (sp, 4)
584; CSKY-NEXT:    movi16 a1, 2
585; CSKY-NEXT:    st16.w a1, (sp, 0)
586; CSKY-NEXT:    addi16 a1, sp, 4
587; CSKY-NEXT:    movi16 a3, 2
588; CSKY-NEXT:    jsri32 [.LCPI22_0]
589; CSKY-NEXT:    addi16 sp, sp, 8
590; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
591; CSKY-NEXT:    addi16 sp, sp, 4
592; CSKY-NEXT:    rts16
593; CSKY-NEXT:    .p2align 1
594; CSKY-NEXT:  # %bb.1:
595; CSKY-NEXT:    .p2align 2
596; CSKY-NEXT:  .LCPI22_0:
597; CSKY-NEXT:    .long __atomic_compare_exchange_4
598;
599  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
600  ret void
601}
602
603define void @cmpxchg_i32_release_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
604; CSKY-LABEL: cmpxchg_i32_release_monotonic:
605; CSKY:       # %bb.0:
606; CSKY-NEXT:    subi16 sp, sp, 4
607; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
608; CSKY-NEXT:    subi16 sp, sp, 8
609; CSKY-NEXT:    st16.w a1, (sp, 4)
610; CSKY-NEXT:    movi16 a1, 0
611; CSKY-NEXT:    st16.w a1, (sp, 0)
612; CSKY-NEXT:    addi16 a1, sp, 4
613; CSKY-NEXT:    movi16 a3, 3
614; CSKY-NEXT:    jsri32 [.LCPI23_0]
615; CSKY-NEXT:    addi16 sp, sp, 8
616; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
617; CSKY-NEXT:    addi16 sp, sp, 4
618; CSKY-NEXT:    rts16
619; CSKY-NEXT:    .p2align 1
620; CSKY-NEXT:  # %bb.1:
621; CSKY-NEXT:    .p2align 2
622; CSKY-NEXT:  .LCPI23_0:
623; CSKY-NEXT:    .long __atomic_compare_exchange_4
624;
625  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val release monotonic
626  ret void
627}
628
629define void @cmpxchg_i32_release_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind {
630; CSKY-LABEL: cmpxchg_i32_release_acquire:
631; CSKY:       # %bb.0:
632; CSKY-NEXT:    subi16 sp, sp, 4
633; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
634; CSKY-NEXT:    subi16 sp, sp, 8
635; CSKY-NEXT:    st16.w a1, (sp, 4)
636; CSKY-NEXT:    movi16 a1, 2
637; CSKY-NEXT:    st16.w a1, (sp, 0)
638; CSKY-NEXT:    addi16 a1, sp, 4
639; CSKY-NEXT:    movi16 a3, 3
640; CSKY-NEXT:    jsri32 [.LCPI24_0]
641; CSKY-NEXT:    addi16 sp, sp, 8
642; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
643; CSKY-NEXT:    addi16 sp, sp, 4
644; CSKY-NEXT:    rts16
645; CSKY-NEXT:    .p2align 1
646; CSKY-NEXT:  # %bb.1:
647; CSKY-NEXT:    .p2align 2
648; CSKY-NEXT:  .LCPI24_0:
649; CSKY-NEXT:    .long __atomic_compare_exchange_4
650;
651  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val release acquire
652  ret void
653}
654
655define void @cmpxchg_i32_acq_rel_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
656; CSKY-LABEL: cmpxchg_i32_acq_rel_monotonic:
657; CSKY:       # %bb.0:
658; CSKY-NEXT:    subi16 sp, sp, 4
659; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
660; CSKY-NEXT:    subi16 sp, sp, 8
661; CSKY-NEXT:    st16.w a1, (sp, 4)
662; CSKY-NEXT:    movi16 a1, 0
663; CSKY-NEXT:    st16.w a1, (sp, 0)
664; CSKY-NEXT:    addi16 a1, sp, 4
665; CSKY-NEXT:    movi16 a3, 4
666; CSKY-NEXT:    jsri32 [.LCPI25_0]
667; CSKY-NEXT:    addi16 sp, sp, 8
668; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
669; CSKY-NEXT:    addi16 sp, sp, 4
670; CSKY-NEXT:    rts16
671; CSKY-NEXT:    .p2align 1
672; CSKY-NEXT:  # %bb.1:
673; CSKY-NEXT:    .p2align 2
674; CSKY-NEXT:  .LCPI25_0:
675; CSKY-NEXT:    .long __atomic_compare_exchange_4
676;
677  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acq_rel monotonic
678  ret void
679}
680
681define void @cmpxchg_i32_acq_rel_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind {
682; CSKY-LABEL: cmpxchg_i32_acq_rel_acquire:
683; CSKY:       # %bb.0:
684; CSKY-NEXT:    subi16 sp, sp, 4
685; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
686; CSKY-NEXT:    subi16 sp, sp, 8
687; CSKY-NEXT:    st16.w a1, (sp, 4)
688; CSKY-NEXT:    movi16 a1, 2
689; CSKY-NEXT:    st16.w a1, (sp, 0)
690; CSKY-NEXT:    addi16 a1, sp, 4
691; CSKY-NEXT:    movi16 a3, 4
692; CSKY-NEXT:    jsri32 [.LCPI26_0]
693; CSKY-NEXT:    addi16 sp, sp, 8
694; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
695; CSKY-NEXT:    addi16 sp, sp, 4
696; CSKY-NEXT:    rts16
697; CSKY-NEXT:    .p2align 1
698; CSKY-NEXT:  # %bb.1:
699; CSKY-NEXT:    .p2align 2
700; CSKY-NEXT:  .LCPI26_0:
701; CSKY-NEXT:    .long __atomic_compare_exchange_4
702;
703  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acq_rel acquire
704  ret void
705}
706
707define void @cmpxchg_i32_seq_cst_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
708; CSKY-LABEL: cmpxchg_i32_seq_cst_monotonic:
709; CSKY:       # %bb.0:
710; CSKY-NEXT:    subi16 sp, sp, 4
711; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
712; CSKY-NEXT:    subi16 sp, sp, 8
713; CSKY-NEXT:    st16.w a1, (sp, 4)
714; CSKY-NEXT:    movi16 a1, 0
715; CSKY-NEXT:    st16.w a1, (sp, 0)
716; CSKY-NEXT:    addi16 a1, sp, 4
717; CSKY-NEXT:    movi16 a3, 5
718; CSKY-NEXT:    jsri32 [.LCPI27_0]
719; CSKY-NEXT:    addi16 sp, sp, 8
720; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
721; CSKY-NEXT:    addi16 sp, sp, 4
722; CSKY-NEXT:    rts16
723; CSKY-NEXT:    .p2align 1
724; CSKY-NEXT:  # %bb.1:
725; CSKY-NEXT:    .p2align 2
726; CSKY-NEXT:  .LCPI27_0:
727; CSKY-NEXT:    .long __atomic_compare_exchange_4
728;
729  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst monotonic
730  ret void
731}
732
733define void @cmpxchg_i32_seq_cst_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind {
734; CSKY-LABEL: cmpxchg_i32_seq_cst_acquire:
735; CSKY:       # %bb.0:
736; CSKY-NEXT:    subi16 sp, sp, 4
737; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
738; CSKY-NEXT:    subi16 sp, sp, 8
739; CSKY-NEXT:    st16.w a1, (sp, 4)
740; CSKY-NEXT:    movi16 a1, 2
741; CSKY-NEXT:    st16.w a1, (sp, 0)
742; CSKY-NEXT:    addi16 a1, sp, 4
743; CSKY-NEXT:    movi16 a3, 5
744; CSKY-NEXT:    jsri32 [.LCPI28_0]
745; CSKY-NEXT:    addi16 sp, sp, 8
746; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
747; CSKY-NEXT:    addi16 sp, sp, 4
748; CSKY-NEXT:    rts16
749; CSKY-NEXT:    .p2align 1
750; CSKY-NEXT:  # %bb.1:
751; CSKY-NEXT:    .p2align 2
752; CSKY-NEXT:  .LCPI28_0:
753; CSKY-NEXT:    .long __atomic_compare_exchange_4
754;
755  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst acquire
756  ret void
757}
758
759define void @cmpxchg_i32_seq_cst_seq_cst(ptr %ptr, i32 %cmp, i32 %val) nounwind {
760; CSKY-LABEL: cmpxchg_i32_seq_cst_seq_cst:
761; CSKY:       # %bb.0:
762; CSKY-NEXT:    subi16 sp, sp, 4
763; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
764; CSKY-NEXT:    subi16 sp, sp, 8
765; CSKY-NEXT:    st16.w a1, (sp, 4)
766; CSKY-NEXT:    movi16 a1, 5
767; CSKY-NEXT:    st16.w a1, (sp, 0)
768; CSKY-NEXT:    addi16 a1, sp, 4
769; CSKY-NEXT:    movi16 a3, 5
770; CSKY-NEXT:    jsri32 [.LCPI29_0]
771; CSKY-NEXT:    addi16 sp, sp, 8
772; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
773; CSKY-NEXT:    addi16 sp, sp, 4
774; CSKY-NEXT:    rts16
775; CSKY-NEXT:    .p2align 1
776; CSKY-NEXT:  # %bb.1:
777; CSKY-NEXT:    .p2align 2
778; CSKY-NEXT:  .LCPI29_0:
779; CSKY-NEXT:    .long __atomic_compare_exchange_4
780;
781  %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst
782  ret void
783}
784
785define void @cmpxchg_i64_monotonic_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
786; CSKY-LABEL: cmpxchg_i64_monotonic_monotonic:
787; CSKY:       # %bb.0:
788; CSKY-NEXT:    subi16 sp, sp, 4
789; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
790; CSKY-NEXT:    subi16 sp, sp, 16
791; CSKY-NEXT:    mov16 t0, a3
792; CSKY-NEXT:    ld16.w a3, (sp, 20)
793; CSKY-NEXT:    st16.w a2, (sp, 12)
794; CSKY-NEXT:    st16.w a1, (sp, 8)
795; CSKY-NEXT:    movi16 a1, 0
796; CSKY-NEXT:    st16.w a1, (sp, 4)
797; CSKY-NEXT:    st16.w a1, (sp, 0)
798; CSKY-NEXT:    addi16 a1, sp, 8
799; CSKY-NEXT:    mov16 a2, t0
800; CSKY-NEXT:    jsri32 [.LCPI30_0]
801; CSKY-NEXT:    addi16 sp, sp, 16
802; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
803; CSKY-NEXT:    addi16 sp, sp, 4
804; CSKY-NEXT:    rts16
805; CSKY-NEXT:    .p2align 1
806; CSKY-NEXT:  # %bb.1:
807; CSKY-NEXT:    .p2align 2
808; CSKY-NEXT:  .LCPI30_0:
809; CSKY-NEXT:    .long __atomic_compare_exchange_8
810;
811  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic
812  ret void
813}
814
815define void @cmpxchg_i64_acquire_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
816; CSKY-LABEL: cmpxchg_i64_acquire_monotonic:
817; CSKY:       # %bb.0:
818; CSKY-NEXT:    subi16 sp, sp, 4
819; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
820; CSKY-NEXT:    subi16 sp, sp, 16
821; CSKY-NEXT:    mov16 t0, a3
822; CSKY-NEXT:    ld16.w a3, (sp, 20)
823; CSKY-NEXT:    st16.w a2, (sp, 12)
824; CSKY-NEXT:    st16.w a1, (sp, 8)
825; CSKY-NEXT:    movi16 a1, 0
826; CSKY-NEXT:    st16.w a1, (sp, 4)
827; CSKY-NEXT:    movi16 a1, 2
828; CSKY-NEXT:    st16.w a1, (sp, 0)
829; CSKY-NEXT:    addi16 a1, sp, 8
830; CSKY-NEXT:    mov16 a2, t0
831; CSKY-NEXT:    jsri32 [.LCPI31_0]
832; CSKY-NEXT:    addi16 sp, sp, 16
833; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
834; CSKY-NEXT:    addi16 sp, sp, 4
835; CSKY-NEXT:    rts16
836; CSKY-NEXT:    .p2align 1
837; CSKY-NEXT:  # %bb.1:
838; CSKY-NEXT:    .p2align 2
839; CSKY-NEXT:  .LCPI31_0:
840; CSKY-NEXT:    .long __atomic_compare_exchange_8
841;
842  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire monotonic
843  ret void
844}
845
846define void @cmpxchg_i64_acquire_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind {
847; CSKY-LABEL: cmpxchg_i64_acquire_acquire:
848; CSKY:       # %bb.0:
849; CSKY-NEXT:    subi16 sp, sp, 4
850; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
851; CSKY-NEXT:    subi16 sp, sp, 16
852; CSKY-NEXT:    mov16 t0, a3
853; CSKY-NEXT:    ld16.w a3, (sp, 20)
854; CSKY-NEXT:    st16.w a2, (sp, 12)
855; CSKY-NEXT:    st16.w a1, (sp, 8)
856; CSKY-NEXT:    movi16 a1, 2
857; CSKY-NEXT:    st16.w a1, (sp, 4)
858; CSKY-NEXT:    st16.w a1, (sp, 0)
859; CSKY-NEXT:    addi16 a1, sp, 8
860; CSKY-NEXT:    mov16 a2, t0
861; CSKY-NEXT:    jsri32 [.LCPI32_0]
862; CSKY-NEXT:    addi16 sp, sp, 16
863; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
864; CSKY-NEXT:    addi16 sp, sp, 4
865; CSKY-NEXT:    rts16
866; CSKY-NEXT:    .p2align 1
867; CSKY-NEXT:  # %bb.1:
868; CSKY-NEXT:    .p2align 2
869; CSKY-NEXT:  .LCPI32_0:
870; CSKY-NEXT:    .long __atomic_compare_exchange_8
871;
872  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire
873  ret void
874}
875
876define void @cmpxchg_i64_release_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
877; CSKY-LABEL: cmpxchg_i64_release_monotonic:
878; CSKY:       # %bb.0:
879; CSKY-NEXT:    subi16 sp, sp, 4
880; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
881; CSKY-NEXT:    subi16 sp, sp, 16
882; CSKY-NEXT:    mov16 t0, a3
883; CSKY-NEXT:    ld16.w a3, (sp, 20)
884; CSKY-NEXT:    st16.w a2, (sp, 12)
885; CSKY-NEXT:    st16.w a1, (sp, 8)
886; CSKY-NEXT:    movi16 a1, 0
887; CSKY-NEXT:    st16.w a1, (sp, 4)
888; CSKY-NEXT:    movi16 a1, 3
889; CSKY-NEXT:    st16.w a1, (sp, 0)
890; CSKY-NEXT:    addi16 a1, sp, 8
891; CSKY-NEXT:    mov16 a2, t0
892; CSKY-NEXT:    jsri32 [.LCPI33_0]
893; CSKY-NEXT:    addi16 sp, sp, 16
894; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
895; CSKY-NEXT:    addi16 sp, sp, 4
896; CSKY-NEXT:    rts16
897; CSKY-NEXT:    .p2align 1
898; CSKY-NEXT:  # %bb.1:
899; CSKY-NEXT:    .p2align 2
900; CSKY-NEXT:  .LCPI33_0:
901; CSKY-NEXT:    .long __atomic_compare_exchange_8
902;
903  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val release monotonic
904  ret void
905}
906
907define void @cmpxchg_i64_release_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind {
908; CSKY-LABEL: cmpxchg_i64_release_acquire:
909; CSKY:       # %bb.0:
910; CSKY-NEXT:    subi16 sp, sp, 4
911; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
912; CSKY-NEXT:    subi16 sp, sp, 16
913; CSKY-NEXT:    mov16 t0, a3
914; CSKY-NEXT:    ld16.w a3, (sp, 20)
915; CSKY-NEXT:    st16.w a2, (sp, 12)
916; CSKY-NEXT:    st16.w a1, (sp, 8)
917; CSKY-NEXT:    movi16 a1, 2
918; CSKY-NEXT:    st16.w a1, (sp, 4)
919; CSKY-NEXT:    movi16 a1, 3
920; CSKY-NEXT:    st16.w a1, (sp, 0)
921; CSKY-NEXT:    addi16 a1, sp, 8
922; CSKY-NEXT:    mov16 a2, t0
923; CSKY-NEXT:    jsri32 [.LCPI34_0]
924; CSKY-NEXT:    addi16 sp, sp, 16
925; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
926; CSKY-NEXT:    addi16 sp, sp, 4
927; CSKY-NEXT:    rts16
928; CSKY-NEXT:    .p2align 1
929; CSKY-NEXT:  # %bb.1:
930; CSKY-NEXT:    .p2align 2
931; CSKY-NEXT:  .LCPI34_0:
932; CSKY-NEXT:    .long __atomic_compare_exchange_8
933;
934  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val release acquire
935  ret void
936}
937
938define void @cmpxchg_i64_acq_rel_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
939; CSKY-LABEL: cmpxchg_i64_acq_rel_monotonic:
940; CSKY:       # %bb.0:
941; CSKY-NEXT:    subi16 sp, sp, 4
942; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
943; CSKY-NEXT:    subi16 sp, sp, 16
944; CSKY-NEXT:    mov16 t0, a3
945; CSKY-NEXT:    ld16.w a3, (sp, 20)
946; CSKY-NEXT:    st16.w a2, (sp, 12)
947; CSKY-NEXT:    st16.w a1, (sp, 8)
948; CSKY-NEXT:    movi16 a1, 0
949; CSKY-NEXT:    st16.w a1, (sp, 4)
950; CSKY-NEXT:    movi16 a1, 4
951; CSKY-NEXT:    st16.w a1, (sp, 0)
952; CSKY-NEXT:    addi16 a1, sp, 8
953; CSKY-NEXT:    mov16 a2, t0
954; CSKY-NEXT:    jsri32 [.LCPI35_0]
955; CSKY-NEXT:    addi16 sp, sp, 16
956; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
957; CSKY-NEXT:    addi16 sp, sp, 4
958; CSKY-NEXT:    rts16
959; CSKY-NEXT:    .p2align 1
960; CSKY-NEXT:  # %bb.1:
961; CSKY-NEXT:    .p2align 2
962; CSKY-NEXT:  .LCPI35_0:
963; CSKY-NEXT:    .long __atomic_compare_exchange_8
964;
965  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acq_rel monotonic
966  ret void
967}
968
969define void @cmpxchg_i64_acq_rel_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind {
970; CSKY-LABEL: cmpxchg_i64_acq_rel_acquire:
971; CSKY:       # %bb.0:
972; CSKY-NEXT:    subi16 sp, sp, 4
973; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
974; CSKY-NEXT:    subi16 sp, sp, 16
975; CSKY-NEXT:    mov16 t0, a3
976; CSKY-NEXT:    ld16.w a3, (sp, 20)
977; CSKY-NEXT:    st16.w a2, (sp, 12)
978; CSKY-NEXT:    st16.w a1, (sp, 8)
979; CSKY-NEXT:    movi16 a1, 2
980; CSKY-NEXT:    st16.w a1, (sp, 4)
981; CSKY-NEXT:    movi16 a1, 4
982; CSKY-NEXT:    st16.w a1, (sp, 0)
983; CSKY-NEXT:    addi16 a1, sp, 8
984; CSKY-NEXT:    mov16 a2, t0
985; CSKY-NEXT:    jsri32 [.LCPI36_0]
986; CSKY-NEXT:    addi16 sp, sp, 16
987; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
988; CSKY-NEXT:    addi16 sp, sp, 4
989; CSKY-NEXT:    rts16
990; CSKY-NEXT:    .p2align 1
991; CSKY-NEXT:  # %bb.1:
992; CSKY-NEXT:    .p2align 2
993; CSKY-NEXT:  .LCPI36_0:
994; CSKY-NEXT:    .long __atomic_compare_exchange_8
995;
996  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acq_rel acquire
997  ret void
998}
999
1000define void @cmpxchg_i64_seq_cst_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
1001; CSKY-LABEL: cmpxchg_i64_seq_cst_monotonic:
1002; CSKY:       # %bb.0:
1003; CSKY-NEXT:    subi16 sp, sp, 4
1004; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
1005; CSKY-NEXT:    subi16 sp, sp, 16
1006; CSKY-NEXT:    mov16 t0, a3
1007; CSKY-NEXT:    ld16.w a3, (sp, 20)
1008; CSKY-NEXT:    st16.w a2, (sp, 12)
1009; CSKY-NEXT:    st16.w a1, (sp, 8)
1010; CSKY-NEXT:    movi16 a1, 0
1011; CSKY-NEXT:    st16.w a1, (sp, 4)
1012; CSKY-NEXT:    movi16 a1, 5
1013; CSKY-NEXT:    st16.w a1, (sp, 0)
1014; CSKY-NEXT:    addi16 a1, sp, 8
1015; CSKY-NEXT:    mov16 a2, t0
1016; CSKY-NEXT:    jsri32 [.LCPI37_0]
1017; CSKY-NEXT:    addi16 sp, sp, 16
1018; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
1019; CSKY-NEXT:    addi16 sp, sp, 4
1020; CSKY-NEXT:    rts16
1021; CSKY-NEXT:    .p2align 1
1022; CSKY-NEXT:  # %bb.1:
1023; CSKY-NEXT:    .p2align 2
1024; CSKY-NEXT:  .LCPI37_0:
1025; CSKY-NEXT:    .long __atomic_compare_exchange_8
1026;
1027  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val seq_cst monotonic
1028  ret void
1029}
1030
1031define void @cmpxchg_i64_seq_cst_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind {
1032; CSKY-LABEL: cmpxchg_i64_seq_cst_acquire:
1033; CSKY:       # %bb.0:
1034; CSKY-NEXT:    subi16 sp, sp, 4
1035; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
1036; CSKY-NEXT:    subi16 sp, sp, 16
1037; CSKY-NEXT:    mov16 t0, a3
1038; CSKY-NEXT:    ld16.w a3, (sp, 20)
1039; CSKY-NEXT:    st16.w a2, (sp, 12)
1040; CSKY-NEXT:    st16.w a1, (sp, 8)
1041; CSKY-NEXT:    movi16 a1, 2
1042; CSKY-NEXT:    st16.w a1, (sp, 4)
1043; CSKY-NEXT:    movi16 a1, 5
1044; CSKY-NEXT:    st16.w a1, (sp, 0)
1045; CSKY-NEXT:    addi16 a1, sp, 8
1046; CSKY-NEXT:    mov16 a2, t0
1047; CSKY-NEXT:    jsri32 [.LCPI38_0]
1048; CSKY-NEXT:    addi16 sp, sp, 16
1049; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
1050; CSKY-NEXT:    addi16 sp, sp, 4
1051; CSKY-NEXT:    rts16
1052; CSKY-NEXT:    .p2align 1
1053; CSKY-NEXT:  # %bb.1:
1054; CSKY-NEXT:    .p2align 2
1055; CSKY-NEXT:  .LCPI38_0:
1056; CSKY-NEXT:    .long __atomic_compare_exchange_8
1057;
1058  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val seq_cst acquire
1059  ret void
1060}
1061
1062define void @cmpxchg_i64_seq_cst_seq_cst(ptr %ptr, i64 %cmp, i64 %val) nounwind {
1063; CSKY-LABEL: cmpxchg_i64_seq_cst_seq_cst:
1064; CSKY:       # %bb.0:
1065; CSKY-NEXT:    subi16 sp, sp, 4
1066; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
1067; CSKY-NEXT:    subi16 sp, sp, 16
1068; CSKY-NEXT:    mov16 t0, a3
1069; CSKY-NEXT:    ld16.w a3, (sp, 20)
1070; CSKY-NEXT:    st16.w a2, (sp, 12)
1071; CSKY-NEXT:    st16.w a1, (sp, 8)
1072; CSKY-NEXT:    movi16 a1, 5
1073; CSKY-NEXT:    st16.w a1, (sp, 4)
1074; CSKY-NEXT:    st16.w a1, (sp, 0)
1075; CSKY-NEXT:    addi16 a1, sp, 8
1076; CSKY-NEXT:    mov16 a2, t0
1077; CSKY-NEXT:    jsri32 [.LCPI39_0]
1078; CSKY-NEXT:    addi16 sp, sp, 16
1079; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
1080; CSKY-NEXT:    addi16 sp, sp, 4
1081; CSKY-NEXT:    rts16
1082; CSKY-NEXT:    .p2align 1
1083; CSKY-NEXT:  # %bb.1:
1084; CSKY-NEXT:    .p2align 2
1085; CSKY-NEXT:  .LCPI39_0:
1086; CSKY-NEXT:    .long __atomic_compare_exchange_8
1087;
1088  %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val seq_cst seq_cst
1089  ret void
1090}
1091