xref: /llvm-project/llvm/test/CodeGen/M68k/CodeModel/Large/Atomics/cmpxchg.ll (revision 4cce10743d2275710d3d2e0de8013386a9799092)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC
3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC
4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC
5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC
6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 --code-model=large | FileCheck %s --check-prefix=ATOMIC
7; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 --code-model=large | FileCheck %s --check-prefix=ATOMIC
8; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 --code-model=large | FileCheck %s --check-prefix=ATOMIC
9; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC
10; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC
11; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC
12
13@thread_id = internal global <{ [5 x i8] }> <{ [5 x i8] zeroinitializer}>, align 4
14
15define { i32, i1 } @std_thread_new() {
16; NO-ATOMIC-LABEL: std_thread_new:
17; NO-ATOMIC:         .cfi_startproc
18; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
19; NO-ATOMIC-NEXT:    suba.l #12, %sp
20; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
21; NO-ATOMIC-NEXT:    move.l #1, (8,%sp)
22; NO-ATOMIC-NEXT:    move.l #0, (4,%sp)
23; NO-ATOMIC-NEXT:    move.l #thread_id, (%sp)
24; NO-ATOMIC-NEXT:    jsr __sync_val_compare_and_swap_4
25; NO-ATOMIC-NEXT:    cmpi.l #0, %d0
26; NO-ATOMIC-NEXT:    seq %d1
27; NO-ATOMIC-NEXT:    adda.l #12, %sp
28; NO-ATOMIC-NEXT:    rts
29;
30; NO-ATOMIC-PIC-LABEL: std_thread_new:
31; NO-ATOMIC-PIC:         .cfi_startproc
32; NO-ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
33; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
34; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
35; NO-ATOMIC-PIC-NEXT:    lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
36; NO-ATOMIC-PIC-NEXT:    adda.l #thread_id@GOTOFF, %a0
37; NO-ATOMIC-PIC-NEXT:    move.l %a0, (%sp)
38; NO-ATOMIC-PIC-NEXT:    move.l #1, (8,%sp)
39; NO-ATOMIC-PIC-NEXT:    move.l #0, (4,%sp)
40; NO-ATOMIC-PIC-NEXT:    jsr (__sync_val_compare_and_swap_4@PLT,%pc)
41; NO-ATOMIC-PIC-NEXT:    cmpi.l #0, %d0
42; NO-ATOMIC-PIC-NEXT:    seq %d1
43; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
44; NO-ATOMIC-PIC-NEXT:    rts
45;
46; ATOMIC-LABEL: std_thread_new:
47; ATOMIC:         .cfi_startproc
48; ATOMIC-NEXT:  ; %bb.0: ; %start
49; ATOMIC-NEXT:    move.l #thread_id, %a0
50; ATOMIC-NEXT:    moveq #1, %d1
51; ATOMIC-NEXT:    moveq #0, %d0
52; ATOMIC-NEXT:    cas.l %d0, %d1, (%a0)
53; ATOMIC-NEXT:    cmpi.l #0, %d0
54; ATOMIC-NEXT:    seq %d1
55; ATOMIC-NEXT:    rts
56;
57; ATOMIC-PIC-LABEL: std_thread_new:
58; ATOMIC-PIC:         .cfi_startproc
59; ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
60; ATOMIC-PIC-NEXT:    suba.l #4, %sp
61; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -8
62; ATOMIC-PIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
63; ATOMIC-PIC-NEXT:    lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
64; ATOMIC-PIC-NEXT:    move.l #thread_id@GOTOFF, %d1
65; ATOMIC-PIC-NEXT:    moveq #1, %d2
66; ATOMIC-PIC-NEXT:    moveq #0, %d0
67; ATOMIC-PIC-NEXT:    cas.l %d0, %d2, (0,%a0,%d1)
68; ATOMIC-PIC-NEXT:    cmpi.l #0, %d0
69; ATOMIC-PIC-NEXT:    seq %d1
70; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
71; ATOMIC-PIC-NEXT:    adda.l #4, %sp
72; ATOMIC-PIC-NEXT:    rts
73start:
74  %1 = cmpxchg ptr @thread_id, i32 0, i32 1 acquire monotonic, align 4
75  ret { i32, i1 } %1
76}
77
78define i1 @cmpxchg_i8_monotonic_monotonic(i8 %cmp, i8 %new, ptr %mem) nounwind {
79; NO-ATOMIC-LABEL: cmpxchg_i8_monotonic_monotonic:
80; NO-ATOMIC:       ; %bb.0:
81; NO-ATOMIC-NEXT:    suba.l #20, %sp
82; NO-ATOMIC-NEXT:    movem.l %d2, (16,%sp) ; 8-byte Folded Spill
83; NO-ATOMIC-NEXT:    move.b (31,%sp), %d0
84; NO-ATOMIC-NEXT:    and.l #255, %d0
85; NO-ATOMIC-NEXT:    move.l %d0, (8,%sp)
86; NO-ATOMIC-NEXT:    move.b (27,%sp), %d2
87; NO-ATOMIC-NEXT:    move.l %d2, %d0
88; NO-ATOMIC-NEXT:    and.l #255, %d0
89; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
90; NO-ATOMIC-NEXT:    move.l (32,%sp), (%sp)
91; NO-ATOMIC-NEXT:    jsr __sync_val_compare_and_swap_1
92; NO-ATOMIC-NEXT:    sub.b %d2, %d0
93; NO-ATOMIC-NEXT:    seq %d0
94; NO-ATOMIC-NEXT:    movem.l (16,%sp), %d2 ; 8-byte Folded Reload
95; NO-ATOMIC-NEXT:    adda.l #20, %sp
96; NO-ATOMIC-NEXT:    rts
97;
98; NO-ATOMIC-PIC-LABEL: cmpxchg_i8_monotonic_monotonic:
99; NO-ATOMIC-PIC:       ; %bb.0:
100; NO-ATOMIC-PIC-NEXT:    suba.l #20, %sp
101; NO-ATOMIC-PIC-NEXT:    movem.l %d2, (16,%sp) ; 8-byte Folded Spill
102; NO-ATOMIC-PIC-NEXT:    move.b (31,%sp), %d0
103; NO-ATOMIC-PIC-NEXT:    and.l #255, %d0
104; NO-ATOMIC-PIC-NEXT:    move.l %d0, (8,%sp)
105; NO-ATOMIC-PIC-NEXT:    move.b (27,%sp), %d2
106; NO-ATOMIC-PIC-NEXT:    move.l %d2, %d0
107; NO-ATOMIC-PIC-NEXT:    and.l #255, %d0
108; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
109; NO-ATOMIC-PIC-NEXT:    move.l (32,%sp), (%sp)
110; NO-ATOMIC-PIC-NEXT:    jsr (__sync_val_compare_and_swap_1@PLT,%pc)
111; NO-ATOMIC-PIC-NEXT:    sub.b %d2, %d0
112; NO-ATOMIC-PIC-NEXT:    seq %d0
113; NO-ATOMIC-PIC-NEXT:    movem.l (16,%sp), %d2 ; 8-byte Folded Reload
114; NO-ATOMIC-PIC-NEXT:    adda.l #20, %sp
115; NO-ATOMIC-PIC-NEXT:    rts
116;
117; ATOMIC-LABEL: cmpxchg_i8_monotonic_monotonic:
118; ATOMIC:       ; %bb.0:
119; ATOMIC-NEXT:    suba.l #4, %sp
120; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
121; ATOMIC-NEXT:    move.l (16,%sp), %a0
122; ATOMIC-NEXT:    move.b (15,%sp), %d0
123; ATOMIC-NEXT:    move.b (11,%sp), %d1
124; ATOMIC-NEXT:    move.b %d1, %d2
125; ATOMIC-NEXT:    cas.b %d2, %d0, (%a0)
126; ATOMIC-NEXT:    sub.b %d1, %d2
127; ATOMIC-NEXT:    seq %d0
128; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
129; ATOMIC-NEXT:    adda.l #4, %sp
130; ATOMIC-NEXT:    rts
131;
132; ATOMIC-PIC-LABEL: cmpxchg_i8_monotonic_monotonic:
133; ATOMIC-PIC:       ; %bb.0:
134; ATOMIC-PIC-NEXT:    suba.l #4, %sp
135; ATOMIC-PIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
136; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
137; ATOMIC-PIC-NEXT:    move.b (15,%sp), %d0
138; ATOMIC-PIC-NEXT:    move.b (11,%sp), %d1
139; ATOMIC-PIC-NEXT:    move.b %d1, %d2
140; ATOMIC-PIC-NEXT:    cas.b %d2, %d0, (%a0)
141; ATOMIC-PIC-NEXT:    sub.b %d1, %d2
142; ATOMIC-PIC-NEXT:    seq %d0
143; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
144; ATOMIC-PIC-NEXT:    adda.l #4, %sp
145; ATOMIC-PIC-NEXT:    rts
146  %res = cmpxchg ptr %mem, i8 %cmp, i8 %new monotonic monotonic
147  %val = extractvalue {i8, i1} %res, 1
148  ret i1 %val
149}
150
151define i16 @cmpxchg_i16_release_monotonic(i16 %cmp, i16 %new, ptr %mem) nounwind {
152; NO-ATOMIC-LABEL: cmpxchg_i16_release_monotonic:
153; NO-ATOMIC:       ; %bb.0:
154; NO-ATOMIC-NEXT:    suba.l #12, %sp
155; NO-ATOMIC-NEXT:    move.w (22,%sp), %d0
156; NO-ATOMIC-NEXT:    and.l #65535, %d0
157; NO-ATOMIC-NEXT:    move.l %d0, (8,%sp)
158; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
159; NO-ATOMIC-NEXT:    and.l #65535, %d0
160; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
161; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
162; NO-ATOMIC-NEXT:    jsr __sync_val_compare_and_swap_2
163; NO-ATOMIC-NEXT:    adda.l #12, %sp
164; NO-ATOMIC-NEXT:    rts
165;
166; NO-ATOMIC-PIC-LABEL: cmpxchg_i16_release_monotonic:
167; NO-ATOMIC-PIC:       ; %bb.0:
168; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
169; NO-ATOMIC-PIC-NEXT:    move.w (22,%sp), %d0
170; NO-ATOMIC-PIC-NEXT:    and.l #65535, %d0
171; NO-ATOMIC-PIC-NEXT:    move.l %d0, (8,%sp)
172; NO-ATOMIC-PIC-NEXT:    move.w (18,%sp), %d0
173; NO-ATOMIC-PIC-NEXT:    and.l #65535, %d0
174; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
175; NO-ATOMIC-PIC-NEXT:    move.l (24,%sp), (%sp)
176; NO-ATOMIC-PIC-NEXT:    jsr (__sync_val_compare_and_swap_2@PLT,%pc)
177; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
178; NO-ATOMIC-PIC-NEXT:    rts
179;
180; ATOMIC-LABEL: cmpxchg_i16_release_monotonic:
181; ATOMIC:       ; %bb.0:
182; ATOMIC-NEXT:    move.l (12,%sp), %a0
183; ATOMIC-NEXT:    move.w (10,%sp), %d1
184; ATOMIC-NEXT:    move.w (6,%sp), %d0
185; ATOMIC-NEXT:    cas.w %d0, %d1, (%a0)
186; ATOMIC-NEXT:    rts
187;
188; ATOMIC-PIC-LABEL: cmpxchg_i16_release_monotonic:
189; ATOMIC-PIC:       ; %bb.0:
190; ATOMIC-PIC-NEXT:    move.l (12,%sp), %a0
191; ATOMIC-PIC-NEXT:    move.w (10,%sp), %d1
192; ATOMIC-PIC-NEXT:    move.w (6,%sp), %d0
193; ATOMIC-PIC-NEXT:    cas.w %d0, %d1, (%a0)
194; ATOMIC-PIC-NEXT:    rts
195  %res = cmpxchg ptr %mem, i16 %cmp, i16 %new release monotonic
196  %val = extractvalue {i16, i1} %res, 0
197  ret i16 %val
198}
199
200define i32 @cmpxchg_i32_release_acquire(i32 %cmp, i32 %new, ptr %mem) nounwind {
201; NO-ATOMIC-LABEL: cmpxchg_i32_release_acquire:
202; NO-ATOMIC:       ; %bb.0:
203; NO-ATOMIC-NEXT:    suba.l #12, %sp
204; NO-ATOMIC-NEXT:    move.l (20,%sp), (8,%sp)
205; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
206; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
207; NO-ATOMIC-NEXT:    jsr __sync_val_compare_and_swap_4
208; NO-ATOMIC-NEXT:    adda.l #12, %sp
209; NO-ATOMIC-NEXT:    rts
210;
211; NO-ATOMIC-PIC-LABEL: cmpxchg_i32_release_acquire:
212; NO-ATOMIC-PIC:       ; %bb.0:
213; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
214; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (8,%sp)
215; NO-ATOMIC-PIC-NEXT:    move.l (16,%sp), (4,%sp)
216; NO-ATOMIC-PIC-NEXT:    move.l (24,%sp), (%sp)
217; NO-ATOMIC-PIC-NEXT:    jsr (__sync_val_compare_and_swap_4@PLT,%pc)
218; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
219; NO-ATOMIC-PIC-NEXT:    rts
220;
221; ATOMIC-LABEL: cmpxchg_i32_release_acquire:
222; ATOMIC:       ; %bb.0:
223; ATOMIC-NEXT:    move.l (12,%sp), %a0
224; ATOMIC-NEXT:    move.l (8,%sp), %d1
225; ATOMIC-NEXT:    move.l (4,%sp), %d0
226; ATOMIC-NEXT:    cas.l %d0, %d1, (%a0)
227; ATOMIC-NEXT:    rts
228;
229; ATOMIC-PIC-LABEL: cmpxchg_i32_release_acquire:
230; ATOMIC-PIC:       ; %bb.0:
231; ATOMIC-PIC-NEXT:    move.l (12,%sp), %a0
232; ATOMIC-PIC-NEXT:    move.l (8,%sp), %d1
233; ATOMIC-PIC-NEXT:    move.l (4,%sp), %d0
234; ATOMIC-PIC-NEXT:    cas.l %d0, %d1, (%a0)
235; ATOMIC-PIC-NEXT:    rts
236  %res = cmpxchg ptr %mem, i32 %cmp, i32 %new release acquire
237  %val = extractvalue {i32, i1} %res, 0
238  ret i32 %val
239}
240
241define i64 @cmpxchg_i64_seqcst_seqcst(i64 %cmp, i64 %new, ptr %mem) nounwind {
242; NO-ATOMIC-LABEL: cmpxchg_i64_seqcst_seqcst:
243; NO-ATOMIC:       ; %bb.0:
244; NO-ATOMIC-NEXT:    suba.l #36, %sp
245; NO-ATOMIC-NEXT:    move.l (44,%sp), (28,%sp)
246; NO-ATOMIC-NEXT:    move.l (40,%sp), (24,%sp)
247; NO-ATOMIC-NEXT:    lea (24,%sp), %a0
248; NO-ATOMIC-NEXT:    move.l %a0, (4,%sp)
249; NO-ATOMIC-NEXT:    move.l #5, (20,%sp)
250; NO-ATOMIC-NEXT:    move.l #5, (16,%sp)
251; NO-ATOMIC-NEXT:    move.l (52,%sp), (12,%sp)
252; NO-ATOMIC-NEXT:    move.l (48,%sp), (8,%sp)
253; NO-ATOMIC-NEXT:    move.l (56,%sp), (%sp)
254; NO-ATOMIC-NEXT:    jsr __atomic_compare_exchange_8
255; NO-ATOMIC-NEXT:    move.l (28,%sp), %d1
256; NO-ATOMIC-NEXT:    move.l (24,%sp), %d0
257; NO-ATOMIC-NEXT:    adda.l #36, %sp
258; NO-ATOMIC-NEXT:    rts
259;
260; NO-ATOMIC-PIC-LABEL: cmpxchg_i64_seqcst_seqcst:
261; NO-ATOMIC-PIC:       ; %bb.0:
262; NO-ATOMIC-PIC-NEXT:    suba.l #36, %sp
263; NO-ATOMIC-PIC-NEXT:    move.l (44,%sp), (28,%sp)
264; NO-ATOMIC-PIC-NEXT:    move.l (40,%sp), (24,%sp)
265; NO-ATOMIC-PIC-NEXT:    lea (24,%sp), %a0
266; NO-ATOMIC-PIC-NEXT:    move.l %a0, (4,%sp)
267; NO-ATOMIC-PIC-NEXT:    move.l #5, (20,%sp)
268; NO-ATOMIC-PIC-NEXT:    move.l #5, (16,%sp)
269; NO-ATOMIC-PIC-NEXT:    move.l (52,%sp), (12,%sp)
270; NO-ATOMIC-PIC-NEXT:    move.l (48,%sp), (8,%sp)
271; NO-ATOMIC-PIC-NEXT:    move.l (56,%sp), (%sp)
272; NO-ATOMIC-PIC-NEXT:    jsr (__atomic_compare_exchange_8@PLT,%pc)
273; NO-ATOMIC-PIC-NEXT:    move.l (28,%sp), %d1
274; NO-ATOMIC-PIC-NEXT:    move.l (24,%sp), %d0
275; NO-ATOMIC-PIC-NEXT:    adda.l #36, %sp
276; NO-ATOMIC-PIC-NEXT:    rts
277;
278; ATOMIC-LABEL: cmpxchg_i64_seqcst_seqcst:
279; ATOMIC:       ; %bb.0:
280; ATOMIC-NEXT:    suba.l #36, %sp
281; ATOMIC-NEXT:    move.l (44,%sp), (28,%sp)
282; ATOMIC-NEXT:    move.l (40,%sp), (24,%sp)
283; ATOMIC-NEXT:    lea (24,%sp), %a0
284; ATOMIC-NEXT:    move.l %a0, (4,%sp)
285; ATOMIC-NEXT:    move.l #5, (20,%sp)
286; ATOMIC-NEXT:    move.l #5, (16,%sp)
287; ATOMIC-NEXT:    move.l (52,%sp), (12,%sp)
288; ATOMIC-NEXT:    move.l (48,%sp), (8,%sp)
289; ATOMIC-NEXT:    move.l (56,%sp), (%sp)
290; ATOMIC-NEXT:    jsr __atomic_compare_exchange_8
291; ATOMIC-NEXT:    move.l (28,%sp), %d1
292; ATOMIC-NEXT:    move.l (24,%sp), %d0
293; ATOMIC-NEXT:    adda.l #36, %sp
294; ATOMIC-NEXT:    rts
295;
296; ATOMIC-PIC-LABEL: cmpxchg_i64_seqcst_seqcst:
297; ATOMIC-PIC:       ; %bb.0:
298; ATOMIC-PIC-NEXT:    suba.l #36, %sp
299; ATOMIC-PIC-NEXT:    move.l (44,%sp), (28,%sp)
300; ATOMIC-PIC-NEXT:    move.l (40,%sp), (24,%sp)
301; ATOMIC-PIC-NEXT:    lea (24,%sp), %a0
302; ATOMIC-PIC-NEXT:    move.l %a0, (4,%sp)
303; ATOMIC-PIC-NEXT:    move.l #5, (20,%sp)
304; ATOMIC-PIC-NEXT:    move.l #5, (16,%sp)
305; ATOMIC-PIC-NEXT:    move.l (52,%sp), (12,%sp)
306; ATOMIC-PIC-NEXT:    move.l (48,%sp), (8,%sp)
307; ATOMIC-PIC-NEXT:    move.l (56,%sp), (%sp)
308; ATOMIC-PIC-NEXT:    jsr (__atomic_compare_exchange_8@PLT,%pc)
309; ATOMIC-PIC-NEXT:    move.l (28,%sp), %d1
310; ATOMIC-PIC-NEXT:    move.l (24,%sp), %d0
311; ATOMIC-PIC-NEXT:    adda.l #36, %sp
312; ATOMIC-PIC-NEXT:    rts
313  %res = cmpxchg ptr %mem, i64 %cmp, i64 %new seq_cst seq_cst
314  %val = extractvalue {i64, i1} %res, 0
315  ret i64 %val
316}
317