xref: /llvm-project/llvm/test/CodeGen/M68k/Atomics/rmw.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 -verify-machineinstrs | FileCheck %s --check-prefix=NO-ATOMIC
3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 -verify-machineinstrs | FileCheck %s --check-prefix=NO-ATOMIC
4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 -verify-machineinstrs | FileCheck %s --check-prefix=ATOMIC
5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 -verify-machineinstrs | FileCheck %s --check-prefix=ATOMIC
6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 -verify-machineinstrs | FileCheck %s --check-prefix=ATOMIC
7
8define i8 @atomicrmw_add_i8(i8 %val, ptr %ptr) {
9; NO-ATOMIC-LABEL: atomicrmw_add_i8:
10; NO-ATOMIC:         .cfi_startproc
11; NO-ATOMIC-NEXT:  ; %bb.0:
12; NO-ATOMIC-NEXT:    suba.l #12, %sp
13; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
14; NO-ATOMIC-NEXT:    move.b (19,%sp), %d0
15; NO-ATOMIC-NEXT:    and.l #255, %d0
16; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
17; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
18; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_add_1
19; NO-ATOMIC-NEXT:    adda.l #12, %sp
20; NO-ATOMIC-NEXT:    rts
21;
22; ATOMIC-LABEL: atomicrmw_add_i8:
23; ATOMIC:         .cfi_startproc
24; ATOMIC-NEXT:  ; %bb.0:
25; ATOMIC-NEXT:    suba.l #8, %sp
26; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
27; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
28; ATOMIC-NEXT:    move.b (15,%sp), %d1
29; ATOMIC-NEXT:    move.l (16,%sp), %a0
30; ATOMIC-NEXT:    move.b (%a0), %d2
31; ATOMIC-NEXT:    move.b %d2, %d0
32; ATOMIC-NEXT:  .LBB0_1: ; %atomicrmw.start
33; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
34; ATOMIC-NEXT:    move.b %d2, %d3
35; ATOMIC-NEXT:    add.b %d1, %d3
36; ATOMIC-NEXT:    cas.b %d0, %d3, (%a0)
37; ATOMIC-NEXT:    move.b %d0, %d3
38; ATOMIC-NEXT:    sub.b %d2, %d3
39; ATOMIC-NEXT:    seq %d2
40; ATOMIC-NEXT:    sub.b #1, %d2
41; ATOMIC-NEXT:    move.b %d0, %d2
42; ATOMIC-NEXT:    bne .LBB0_1
43; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
44; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
45; ATOMIC-NEXT:    adda.l #8, %sp
46; ATOMIC-NEXT:    rts
47  %old = atomicrmw add ptr %ptr, i8 %val monotonic
48  ret i8 %old
49}
50
51define i16 @atomicrmw_sub_i16(i16 %val, ptr %ptr) {
52; NO-ATOMIC-LABEL: atomicrmw_sub_i16:
53; NO-ATOMIC:         .cfi_startproc
54; NO-ATOMIC-NEXT:  ; %bb.0:
55; NO-ATOMIC-NEXT:    suba.l #12, %sp
56; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
57; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
58; NO-ATOMIC-NEXT:    and.l #65535, %d0
59; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
60; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
61; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_2
62; NO-ATOMIC-NEXT:    adda.l #12, %sp
63; NO-ATOMIC-NEXT:    rts
64;
65; ATOMIC-LABEL: atomicrmw_sub_i16:
66; ATOMIC:         .cfi_startproc
67; ATOMIC-NEXT:  ; %bb.0:
68; ATOMIC-NEXT:    suba.l #8, %sp
69; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
70; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
71; ATOMIC-NEXT:    move.w (14,%sp), %d1
72; ATOMIC-NEXT:    move.l (16,%sp), %a0
73; ATOMIC-NEXT:    move.w (%a0), %d2
74; ATOMIC-NEXT:    move.w %d2, %d0
75; ATOMIC-NEXT:  .LBB1_1: ; %atomicrmw.start
76; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
77; ATOMIC-NEXT:    move.w %d2, %d3
78; ATOMIC-NEXT:    sub.w %d1, %d3
79; ATOMIC-NEXT:    cas.w %d0, %d3, (%a0)
80; ATOMIC-NEXT:    move.w %d0, %d3
81; ATOMIC-NEXT:    sub.w %d2, %d3
82; ATOMIC-NEXT:    seq %d2
83; ATOMIC-NEXT:    sub.b #1, %d2
84; ATOMIC-NEXT:    move.w %d0, %d2
85; ATOMIC-NEXT:    bne .LBB1_1
86; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
87; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
88; ATOMIC-NEXT:    adda.l #8, %sp
89; ATOMIC-NEXT:    rts
90  %old = atomicrmw sub ptr %ptr, i16 %val acquire
91  ret i16 %old
92}
93
94define i32 @atomicrmw_and_i32(i32 %val, ptr %ptr) {
95; NO-ATOMIC-LABEL: atomicrmw_and_i32:
96; NO-ATOMIC:         .cfi_startproc
97; NO-ATOMIC-NEXT:  ; %bb.0:
98; NO-ATOMIC-NEXT:    suba.l #12, %sp
99; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
100; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
101; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
102; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_and_4
103; NO-ATOMIC-NEXT:    adda.l #12, %sp
104; NO-ATOMIC-NEXT:    rts
105;
106; ATOMIC-LABEL: atomicrmw_and_i32:
107; ATOMIC:         .cfi_startproc
108; ATOMIC-NEXT:  ; %bb.0:
109; ATOMIC-NEXT:    suba.l #8, %sp
110; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
111; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
112; ATOMIC-NEXT:    move.l (12,%sp), %d1
113; ATOMIC-NEXT:    move.l (16,%sp), %a0
114; ATOMIC-NEXT:    move.l (%a0), %d2
115; ATOMIC-NEXT:    move.l %d2, %d0
116; ATOMIC-NEXT:  .LBB2_1: ; %atomicrmw.start
117; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
118; ATOMIC-NEXT:    move.l %d2, %d3
119; ATOMIC-NEXT:    and.l %d1, %d3
120; ATOMIC-NEXT:    cas.l %d0, %d3, (%a0)
121; ATOMIC-NEXT:    move.l %d0, %d3
122; ATOMIC-NEXT:    sub.l %d2, %d3
123; ATOMIC-NEXT:    seq %d2
124; ATOMIC-NEXT:    sub.b #1, %d2
125; ATOMIC-NEXT:    move.l %d0, %d2
126; ATOMIC-NEXT:    bne .LBB2_1
127; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
128; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
129; ATOMIC-NEXT:    adda.l #8, %sp
130; ATOMIC-NEXT:    rts
131  %old = atomicrmw and ptr %ptr, i32 %val seq_cst
132  ret i32 %old
133}
134
135define i64 @atomicrmw_xor_i64(i64 %val, ptr %ptr) {
136; NO-ATOMIC-LABEL: atomicrmw_xor_i64:
137; NO-ATOMIC:         .cfi_startproc
138; NO-ATOMIC-NEXT:  ; %bb.0:
139; NO-ATOMIC-NEXT:    suba.l #20, %sp
140; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -24
141; NO-ATOMIC-NEXT:    move.l #3, (12,%sp)
142; NO-ATOMIC-NEXT:    move.l (28,%sp), (8,%sp)
143; NO-ATOMIC-NEXT:    move.l (24,%sp), (4,%sp)
144; NO-ATOMIC-NEXT:    move.l (32,%sp), (%sp)
145; NO-ATOMIC-NEXT:    jsr __atomic_fetch_xor_8
146; NO-ATOMIC-NEXT:    adda.l #20, %sp
147; NO-ATOMIC-NEXT:    rts
148;
149; ATOMIC-LABEL: atomicrmw_xor_i64:
150; ATOMIC:         .cfi_startproc
151; ATOMIC-NEXT:  ; %bb.0:
152; ATOMIC-NEXT:    suba.l #20, %sp
153; ATOMIC-NEXT:    .cfi_def_cfa_offset -24
154; ATOMIC-NEXT:    move.l #3, (12,%sp)
155; ATOMIC-NEXT:    move.l (28,%sp), (8,%sp)
156; ATOMIC-NEXT:    move.l (24,%sp), (4,%sp)
157; ATOMIC-NEXT:    move.l (32,%sp), (%sp)
158; ATOMIC-NEXT:    jsr __atomic_fetch_xor_8
159; ATOMIC-NEXT:    adda.l #20, %sp
160; ATOMIC-NEXT:    rts
161  %old = atomicrmw xor ptr %ptr, i64 %val release
162  ret i64 %old
163}
164
165define i8 @atomicrmw_or_i8(i8 %val, ptr %ptr) {
166; NO-ATOMIC-LABEL: atomicrmw_or_i8:
167; NO-ATOMIC:         .cfi_startproc
168; NO-ATOMIC-NEXT:  ; %bb.0:
169; NO-ATOMIC-NEXT:    suba.l #12, %sp
170; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
171; NO-ATOMIC-NEXT:    move.b (19,%sp), %d0
172; NO-ATOMIC-NEXT:    and.l #255, %d0
173; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
174; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
175; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_or_1
176; NO-ATOMIC-NEXT:    adda.l #12, %sp
177; NO-ATOMIC-NEXT:    rts
178;
179; ATOMIC-LABEL: atomicrmw_or_i8:
180; ATOMIC:         .cfi_startproc
181; ATOMIC-NEXT:  ; %bb.0:
182; ATOMIC-NEXT:    suba.l #8, %sp
183; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
184; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
185; ATOMIC-NEXT:    move.b (15,%sp), %d1
186; ATOMIC-NEXT:    move.l (16,%sp), %a0
187; ATOMIC-NEXT:    move.b (%a0), %d2
188; ATOMIC-NEXT:    move.b %d2, %d0
189; ATOMIC-NEXT:  .LBB4_1: ; %atomicrmw.start
190; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
191; ATOMIC-NEXT:    move.b %d2, %d3
192; ATOMIC-NEXT:    or.b %d1, %d3
193; ATOMIC-NEXT:    cas.b %d0, %d3, (%a0)
194; ATOMIC-NEXT:    move.b %d0, %d3
195; ATOMIC-NEXT:    sub.b %d2, %d3
196; ATOMIC-NEXT:    seq %d2
197; ATOMIC-NEXT:    sub.b #1, %d2
198; ATOMIC-NEXT:    move.b %d0, %d2
199; ATOMIC-NEXT:    bne .LBB4_1
200; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
201; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
202; ATOMIC-NEXT:    adda.l #8, %sp
203; ATOMIC-NEXT:    rts
204  %old = atomicrmw or ptr %ptr, i8 %val monotonic
205  ret i8 %old
206}
207
208define i16 @atmoicrmw_nand_i16(i16 %val, ptr %ptr) {
209; NO-ATOMIC-LABEL: atmoicrmw_nand_i16:
210; NO-ATOMIC:         .cfi_startproc
211; NO-ATOMIC-NEXT:  ; %bb.0:
212; NO-ATOMIC-NEXT:    suba.l #12, %sp
213; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
214; NO-ATOMIC-NEXT:    movem.l %d2, (8,%sp) ; 8-byte Folded Spill
215; NO-ATOMIC-NEXT:    move.w (18,%sp), %d2
216; NO-ATOMIC-NEXT:    move.l %d2, %d0
217; NO-ATOMIC-NEXT:    and.l #65535, %d0
218; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
219; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
220; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_nand_2
221; NO-ATOMIC-NEXT:    move.w %d2, %d0
222; NO-ATOMIC-NEXT:    movem.l (8,%sp), %d2 ; 8-byte Folded Reload
223; NO-ATOMIC-NEXT:    adda.l #12, %sp
224; NO-ATOMIC-NEXT:    rts
225;
226; ATOMIC-LABEL: atmoicrmw_nand_i16:
227; ATOMIC:         .cfi_startproc
228; ATOMIC-NEXT:  ; %bb.0:
229; ATOMIC-NEXT:    suba.l #8, %sp
230; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
231; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
232; ATOMIC-NEXT:    move.w (14,%sp), %d0
233; ATOMIC-NEXT:    move.l (16,%sp), %a0
234; ATOMIC-NEXT:    move.w (%a0), %d2
235; ATOMIC-NEXT:    move.w %d2, %d1
236; ATOMIC-NEXT:  .LBB5_1: ; %atomicrmw.start
237; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
238; ATOMIC-NEXT:    move.w %d2, %d3
239; ATOMIC-NEXT:    and.w %d0, %d3
240; ATOMIC-NEXT:    not.w %d3
241; ATOMIC-NEXT:    cas.w %d1, %d3, (%a0)
242; ATOMIC-NEXT:    move.w %d1, %d3
243; ATOMIC-NEXT:    sub.w %d2, %d3
244; ATOMIC-NEXT:    seq %d2
245; ATOMIC-NEXT:    sub.b #1, %d2
246; ATOMIC-NEXT:    move.w %d1, %d2
247; ATOMIC-NEXT:    bne .LBB5_1
248; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
249; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
250; ATOMIC-NEXT:    adda.l #8, %sp
251; ATOMIC-NEXT:    rts
252  %old = atomicrmw nand ptr %ptr, i16 %val seq_cst
253  ret i16 %val
254}
255
256define i32 @atomicrmw_min_i32(i32 %val, ptr %ptr) {
257; NO-ATOMIC-LABEL: atomicrmw_min_i32:
258; NO-ATOMIC:         .cfi_startproc
259; NO-ATOMIC-NEXT:  ; %bb.0:
260; NO-ATOMIC-NEXT:    suba.l #12, %sp
261; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
262; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
263; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
264; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_min_4
265; NO-ATOMIC-NEXT:    adda.l #12, %sp
266; NO-ATOMIC-NEXT:    rts
267;
268; ATOMIC-LABEL: atomicrmw_min_i32:
269; ATOMIC:         .cfi_startproc
270; ATOMIC-NEXT:  ; %bb.0:
271; ATOMIC-NEXT:    suba.l #8, %sp
272; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
273; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
274; ATOMIC-NEXT:    move.l (12,%sp), %d1
275; ATOMIC-NEXT:    move.l (16,%sp), %a0
276; ATOMIC-NEXT:    move.l (%a0), %d2
277; ATOMIC-NEXT:    bra .LBB6_1
278; ATOMIC-NEXT:  .LBB6_3: ; %atomicrmw.start
279; ATOMIC-NEXT:    ; in Loop: Header=BB6_1 Depth=1
280; ATOMIC-NEXT:    move.l %d2, %d0
281; ATOMIC-NEXT:    cas.l %d0, %d3, (%a0)
282; ATOMIC-NEXT:    move.l %d0, %d3
283; ATOMIC-NEXT:    sub.l %d2, %d3
284; ATOMIC-NEXT:    seq %d2
285; ATOMIC-NEXT:    sub.b #1, %d2
286; ATOMIC-NEXT:    move.l %d0, %d2
287; ATOMIC-NEXT:    beq .LBB6_4
288; ATOMIC-NEXT:  .LBB6_1: ; %atomicrmw.start
289; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
290; ATOMIC-NEXT:    move.l %d2, %d0
291; ATOMIC-NEXT:    sub.l %d1, %d0
292; ATOMIC-NEXT:    move.l %d2, %d3
293; ATOMIC-NEXT:    ble .LBB6_3
294; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
295; ATOMIC-NEXT:    ; in Loop: Header=BB6_1 Depth=1
296; ATOMIC-NEXT:    move.l %d1, %d3
297; ATOMIC-NEXT:    bra .LBB6_3
298; ATOMIC-NEXT:  .LBB6_4: ; %atomicrmw.end
299; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
300; ATOMIC-NEXT:    adda.l #8, %sp
301; ATOMIC-NEXT:    rts
302  %old = atomicrmw min ptr %ptr, i32 %val acquire
303  ret i32 %old
304}
305
306define i64 @atomicrmw_max_i64(i64 %val, ptr %ptr) {
307; NO-ATOMIC-LABEL: atomicrmw_max_i64:
308; NO-ATOMIC:         .cfi_startproc
309; NO-ATOMIC-NEXT:  ; %bb.0:
310; NO-ATOMIC-NEXT:    suba.l #52, %sp
311; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -56
312; NO-ATOMIC-NEXT:    movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill
313; NO-ATOMIC-NEXT:    move.l (60,%sp), %d3
314; NO-ATOMIC-NEXT:    move.l (56,%sp), %d4
315; NO-ATOMIC-NEXT:    move.l (64,%sp), %a2
316; NO-ATOMIC-NEXT:    move.l (4,%a2), %d1
317; NO-ATOMIC-NEXT:    move.l (%a2), %d0
318; NO-ATOMIC-NEXT:    lea (24,%sp), %a3
319; NO-ATOMIC-NEXT:    bra .LBB7_1
320; NO-ATOMIC-NEXT:  .LBB7_3: ; %atomicrmw.start
321; NO-ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
322; NO-ATOMIC-NEXT:    move.l %d1, (12,%sp)
323; NO-ATOMIC-NEXT:    move.l %d0, (8,%sp)
324; NO-ATOMIC-NEXT:    move.l #5, (20,%sp)
325; NO-ATOMIC-NEXT:    move.l #5, (16,%sp)
326; NO-ATOMIC-NEXT:    jsr __atomic_compare_exchange_8
327; NO-ATOMIC-NEXT:    move.b %d0, %d2
328; NO-ATOMIC-NEXT:    move.l (28,%sp), %d1
329; NO-ATOMIC-NEXT:    move.l (24,%sp), %d0
330; NO-ATOMIC-NEXT:    cmpi.b #0, %d2
331; NO-ATOMIC-NEXT:    bne .LBB7_4
332; NO-ATOMIC-NEXT:  .LBB7_1: ; %atomicrmw.start
333; NO-ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
334; NO-ATOMIC-NEXT:    move.l %d0, (24,%sp)
335; NO-ATOMIC-NEXT:    move.l %d1, (28,%sp)
336; NO-ATOMIC-NEXT:    move.l %a2, (%sp)
337; NO-ATOMIC-NEXT:    move.l %a3, (4,%sp)
338; NO-ATOMIC-NEXT:    move.l %d3, %d2
339; NO-ATOMIC-NEXT:    sub.l %d1, %d2
340; NO-ATOMIC-NEXT:    move.l %d4, %d2
341; NO-ATOMIC-NEXT:    subx.l %d0, %d2
342; NO-ATOMIC-NEXT:    slt %d2
343; NO-ATOMIC-NEXT:    cmpi.b #0, %d2
344; NO-ATOMIC-NEXT:    bne .LBB7_3
345; NO-ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
346; NO-ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
347; NO-ATOMIC-NEXT:    move.l %d3, %d1
348; NO-ATOMIC-NEXT:    move.l %d4, %d0
349; NO-ATOMIC-NEXT:    bra .LBB7_3
350; NO-ATOMIC-NEXT:  .LBB7_4: ; %atomicrmw.end
351; NO-ATOMIC-NEXT:    movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload
352; NO-ATOMIC-NEXT:    adda.l #52, %sp
353; NO-ATOMIC-NEXT:    rts
354;
355; ATOMIC-LABEL: atomicrmw_max_i64:
356; ATOMIC:         .cfi_startproc
357; ATOMIC-NEXT:  ; %bb.0:
358; ATOMIC-NEXT:    suba.l #52, %sp
359; ATOMIC-NEXT:    .cfi_def_cfa_offset -56
360; ATOMIC-NEXT:    movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill
361; ATOMIC-NEXT:    move.l (60,%sp), %d3
362; ATOMIC-NEXT:    move.l (56,%sp), %d4
363; ATOMIC-NEXT:    move.l (64,%sp), %a2
364; ATOMIC-NEXT:    move.l (4,%a2), %d1
365; ATOMIC-NEXT:    move.l (%a2), %d0
366; ATOMIC-NEXT:    lea (24,%sp), %a3
367; ATOMIC-NEXT:    bra .LBB7_1
368; ATOMIC-NEXT:  .LBB7_3: ; %atomicrmw.start
369; ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
370; ATOMIC-NEXT:    move.l %d1, (12,%sp)
371; ATOMIC-NEXT:    move.l %d0, (8,%sp)
372; ATOMIC-NEXT:    move.l #5, (20,%sp)
373; ATOMIC-NEXT:    move.l #5, (16,%sp)
374; ATOMIC-NEXT:    jsr __atomic_compare_exchange_8
375; ATOMIC-NEXT:    move.b %d0, %d2
376; ATOMIC-NEXT:    move.l (28,%sp), %d1
377; ATOMIC-NEXT:    move.l (24,%sp), %d0
378; ATOMIC-NEXT:    cmpi.b #0, %d2
379; ATOMIC-NEXT:    bne .LBB7_4
380; ATOMIC-NEXT:  .LBB7_1: ; %atomicrmw.start
381; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
382; ATOMIC-NEXT:    move.l %d0, (24,%sp)
383; ATOMIC-NEXT:    move.l %d1, (28,%sp)
384; ATOMIC-NEXT:    move.l %a2, (%sp)
385; ATOMIC-NEXT:    move.l %a3, (4,%sp)
386; ATOMIC-NEXT:    move.l %d3, %d2
387; ATOMIC-NEXT:    sub.l %d1, %d2
388; ATOMIC-NEXT:    move.l %d4, %d2
389; ATOMIC-NEXT:    subx.l %d0, %d2
390; ATOMIC-NEXT:    slt %d2
391; ATOMIC-NEXT:    cmpi.b #0, %d2
392; ATOMIC-NEXT:    bne .LBB7_3
393; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
394; ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
395; ATOMIC-NEXT:    move.l %d3, %d1
396; ATOMIC-NEXT:    move.l %d4, %d0
397; ATOMIC-NEXT:    bra .LBB7_3
398; ATOMIC-NEXT:  .LBB7_4: ; %atomicrmw.end
399; ATOMIC-NEXT:    movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload
400; ATOMIC-NEXT:    adda.l #52, %sp
401; ATOMIC-NEXT:    rts
402  %old = atomicrmw max ptr %ptr, i64 %val seq_cst
403  ret i64 %old
404}
405
406define i8 @atomicrmw_i8_umin(i8 %val, ptr %ptr) {
407; NO-ATOMIC-LABEL: atomicrmw_i8_umin:
408; NO-ATOMIC:         .cfi_startproc
409; NO-ATOMIC-NEXT:  ; %bb.0:
410; NO-ATOMIC-NEXT:    suba.l #12, %sp
411; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
412; NO-ATOMIC-NEXT:    move.b (19,%sp), %d0
413; NO-ATOMIC-NEXT:    and.l #255, %d0
414; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
415; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
416; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_umin_1
417; NO-ATOMIC-NEXT:    adda.l #12, %sp
418; NO-ATOMIC-NEXT:    rts
419;
420; ATOMIC-LABEL: atomicrmw_i8_umin:
421; ATOMIC:         .cfi_startproc
422; ATOMIC-NEXT:  ; %bb.0:
423; ATOMIC-NEXT:    suba.l #8, %sp
424; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
425; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
426; ATOMIC-NEXT:    move.b (15,%sp), %d1
427; ATOMIC-NEXT:    move.l (16,%sp), %a0
428; ATOMIC-NEXT:    move.b (%a0), %d2
429; ATOMIC-NEXT:    bra .LBB8_1
430; ATOMIC-NEXT:  .LBB8_3: ; %atomicrmw.start
431; ATOMIC-NEXT:    ; in Loop: Header=BB8_1 Depth=1
432; ATOMIC-NEXT:    move.b %d2, %d0
433; ATOMIC-NEXT:    cas.b %d0, %d3, (%a0)
434; ATOMIC-NEXT:    move.b %d0, %d3
435; ATOMIC-NEXT:    sub.b %d2, %d3
436; ATOMIC-NEXT:    seq %d2
437; ATOMIC-NEXT:    sub.b #1, %d2
438; ATOMIC-NEXT:    move.b %d0, %d2
439; ATOMIC-NEXT:    beq .LBB8_4
440; ATOMIC-NEXT:  .LBB8_1: ; %atomicrmw.start
441; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
442; ATOMIC-NEXT:    move.b %d2, %d0
443; ATOMIC-NEXT:    sub.b %d1, %d0
444; ATOMIC-NEXT:    move.b %d2, %d3
445; ATOMIC-NEXT:    bls .LBB8_3
446; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
447; ATOMIC-NEXT:    ; in Loop: Header=BB8_1 Depth=1
448; ATOMIC-NEXT:    move.b %d1, %d3
449; ATOMIC-NEXT:    bra .LBB8_3
450; ATOMIC-NEXT:  .LBB8_4: ; %atomicrmw.end
451; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
452; ATOMIC-NEXT:    adda.l #8, %sp
453; ATOMIC-NEXT:    rts
454  %old = atomicrmw umin ptr %ptr, i8 %val release
455  ret i8 %old
456}
457
458define i16 @atomicrmw_umax_i16(i16 %val, ptr %ptr) {
459; NO-ATOMIC-LABEL: atomicrmw_umax_i16:
460; NO-ATOMIC:         .cfi_startproc
461; NO-ATOMIC-NEXT:  ; %bb.0:
462; NO-ATOMIC-NEXT:    suba.l #12, %sp
463; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
464; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
465; NO-ATOMIC-NEXT:    and.l #65535, %d0
466; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
467; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
468; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_umax_2
469; NO-ATOMIC-NEXT:    adda.l #12, %sp
470; NO-ATOMIC-NEXT:    rts
471;
472; ATOMIC-LABEL: atomicrmw_umax_i16:
473; ATOMIC:         .cfi_startproc
474; ATOMIC-NEXT:  ; %bb.0:
475; ATOMIC-NEXT:    suba.l #8, %sp
476; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
477; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
478; ATOMIC-NEXT:    move.w (14,%sp), %d1
479; ATOMIC-NEXT:    move.l (16,%sp), %a0
480; ATOMIC-NEXT:    move.w (%a0), %d2
481; ATOMIC-NEXT:    bra .LBB9_1
482; ATOMIC-NEXT:  .LBB9_3: ; %atomicrmw.start
483; ATOMIC-NEXT:    ; in Loop: Header=BB9_1 Depth=1
484; ATOMIC-NEXT:    move.w %d2, %d0
485; ATOMIC-NEXT:    cas.w %d0, %d3, (%a0)
486; ATOMIC-NEXT:    move.w %d0, %d3
487; ATOMIC-NEXT:    sub.w %d2, %d3
488; ATOMIC-NEXT:    seq %d2
489; ATOMIC-NEXT:    sub.b #1, %d2
490; ATOMIC-NEXT:    move.w %d0, %d2
491; ATOMIC-NEXT:    beq .LBB9_4
492; ATOMIC-NEXT:  .LBB9_1: ; %atomicrmw.start
493; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
494; ATOMIC-NEXT:    move.w %d2, %d0
495; ATOMIC-NEXT:    sub.w %d1, %d0
496; ATOMIC-NEXT:    move.w %d2, %d3
497; ATOMIC-NEXT:    bhi .LBB9_3
498; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
499; ATOMIC-NEXT:    ; in Loop: Header=BB9_1 Depth=1
500; ATOMIC-NEXT:    move.w %d1, %d3
501; ATOMIC-NEXT:    bra .LBB9_3
502; ATOMIC-NEXT:  .LBB9_4: ; %atomicrmw.end
503; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
504; ATOMIC-NEXT:    adda.l #8, %sp
505; ATOMIC-NEXT:    rts
506  %old = atomicrmw umax ptr %ptr, i16 %val seq_cst
507  ret i16 %old
508}
509
510define i16 @atomicrmw_xchg_i16(i16 %val, ptr %ptr) {
511; NO-ATOMIC-LABEL: atomicrmw_xchg_i16:
512; NO-ATOMIC:         .cfi_startproc
513; NO-ATOMIC-NEXT:  ; %bb.0: ; %entry
514; NO-ATOMIC-NEXT:    suba.l #12, %sp
515; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
516; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
517; NO-ATOMIC-NEXT:    and.l #65535, %d0
518; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
519; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
520; NO-ATOMIC-NEXT:    jsr __sync_lock_test_and_set_2
521; NO-ATOMIC-NEXT:    adda.l #12, %sp
522; NO-ATOMIC-NEXT:    rts
523;
524; ATOMIC-LABEL: atomicrmw_xchg_i16:
525; ATOMIC:         .cfi_startproc
526; ATOMIC-NEXT:  ; %bb.0: ; %entry
527; ATOMIC-NEXT:    suba.l #8, %sp
528; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
529; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
530; ATOMIC-NEXT:    move.w (14,%sp), %d1
531; ATOMIC-NEXT:    move.l (16,%sp), %a0
532; ATOMIC-NEXT:    move.w (%a0), %d2
533; ATOMIC-NEXT:    move.w %d2, %d0
534; ATOMIC-NEXT:  .LBB10_1: ; %atomicrmw.start
535; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
536; ATOMIC-NEXT:    cas.w %d0, %d1, (%a0)
537; ATOMIC-NEXT:    move.w %d0, %d3
538; ATOMIC-NEXT:    sub.w %d2, %d3
539; ATOMIC-NEXT:    seq %d2
540; ATOMIC-NEXT:    sub.b #1, %d2
541; ATOMIC-NEXT:    move.w %d0, %d2
542; ATOMIC-NEXT:    bne .LBB10_1
543; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
544; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
545; ATOMIC-NEXT:    adda.l #8, %sp
546; ATOMIC-NEXT:    rts
547entry:
548  %old = atomicrmw xchg ptr %ptr, i16 %val monotonic
549  ret i16 %old
550}
551
552define i32 @atomicrmw_xchg_i32(i32 %val, ptr %ptr) {
553; NO-ATOMIC-LABEL: atomicrmw_xchg_i32:
554; NO-ATOMIC:         .cfi_startproc
555; NO-ATOMIC-NEXT:  ; %bb.0: ; %entry
556; NO-ATOMIC-NEXT:    suba.l #12, %sp
557; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
558; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
559; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
560; NO-ATOMIC-NEXT:    jsr __sync_lock_test_and_set_4
561; NO-ATOMIC-NEXT:    adda.l #12, %sp
562; NO-ATOMIC-NEXT:    rts
563;
564; ATOMIC-LABEL: atomicrmw_xchg_i32:
565; ATOMIC:         .cfi_startproc
566; ATOMIC-NEXT:  ; %bb.0: ; %entry
567; ATOMIC-NEXT:    suba.l #8, %sp
568; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
569; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
570; ATOMIC-NEXT:    move.l (12,%sp), %d1
571; ATOMIC-NEXT:    move.l (16,%sp), %a0
572; ATOMIC-NEXT:    move.l (%a0), %d2
573; ATOMIC-NEXT:    move.l %d2, %d0
574; ATOMIC-NEXT:  .LBB11_1: ; %atomicrmw.start
575; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
576; ATOMIC-NEXT:    cas.l %d0, %d1, (%a0)
577; ATOMIC-NEXT:    move.l %d0, %d3
578; ATOMIC-NEXT:    sub.l %d2, %d3
579; ATOMIC-NEXT:    seq %d2
580; ATOMIC-NEXT:    sub.b #1, %d2
581; ATOMIC-NEXT:    move.l %d0, %d2
582; ATOMIC-NEXT:    bne .LBB11_1
583; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
584; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
585; ATOMIC-NEXT:    adda.l #8, %sp
586; ATOMIC-NEXT:    rts
587entry:
588  %old = atomicrmw xchg ptr %ptr, i32 %val monotonic
589  ret i32 %old
590}
591
592define i8 @atomicrmw_sub_i8_arid(ptr align 2 %self) {
593; NO-ATOMIC-LABEL: atomicrmw_sub_i8_arid:
594; NO-ATOMIC:         .cfi_startproc
595; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
596; NO-ATOMIC-NEXT:    suba.l #12, %sp
597; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
598; NO-ATOMIC-NEXT:    move.l (16,%sp), %a0
599; NO-ATOMIC-NEXT:    move.l (%a0), %d0
600; NO-ATOMIC-NEXT:    add.l #4, %d0
601; NO-ATOMIC-NEXT:    move.l %d0, (%sp)
602; NO-ATOMIC-NEXT:    move.l #1, (4,%sp)
603; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_1
604; NO-ATOMIC-NEXT:    adda.l #12, %sp
605; NO-ATOMIC-NEXT:    rts
606;
607; ATOMIC-LABEL: atomicrmw_sub_i8_arid:
608; ATOMIC:         .cfi_startproc
609; ATOMIC-NEXT:  ; %bb.0: ; %start
610; ATOMIC-NEXT:    suba.l #4, %sp
611; ATOMIC-NEXT:    .cfi_def_cfa_offset -8
612; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
613; ATOMIC-NEXT:    move.l (8,%sp), %a0
614; ATOMIC-NEXT:    move.l (%a0), %a0
615; ATOMIC-NEXT:    move.b (4,%a0), %d1
616; ATOMIC-NEXT:    move.b %d1, %d0
617; ATOMIC-NEXT:  .LBB12_1: ; %atomicrmw.start
618; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
619; ATOMIC-NEXT:    move.b %d1, %d2
620; ATOMIC-NEXT:    add.b #-1, %d2
621; ATOMIC-NEXT:    cas.b %d0, %d2, (4,%a0)
622; ATOMIC-NEXT:    move.b %d0, %d2
623; ATOMIC-NEXT:    sub.b %d1, %d2
624; ATOMIC-NEXT:    seq %d1
625; ATOMIC-NEXT:    sub.b #1, %d1
626; ATOMIC-NEXT:    move.b %d0, %d1
627; ATOMIC-NEXT:    bne .LBB12_1
628; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
629; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
630; ATOMIC-NEXT:    adda.l #4, %sp
631; ATOMIC-NEXT:    rts
632start:
633  %self1 = load ptr, ptr %self, align 2
634  %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 4
635  %6 = atomicrmw sub ptr %_18.i.i, i8 1 release, align 4
636  ret i8 %6
637}
638
639define i16 @atomicrmw_sub_i16_arid(ptr align 2 %self) {
640; NO-ATOMIC-LABEL: atomicrmw_sub_i16_arid:
641; NO-ATOMIC:         .cfi_startproc
642; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
643; NO-ATOMIC-NEXT:    suba.l #12, %sp
644; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
645; NO-ATOMIC-NEXT:    move.l (16,%sp), %a0
646; NO-ATOMIC-NEXT:    move.l (%a0), %d0
647; NO-ATOMIC-NEXT:    add.l #4, %d0
648; NO-ATOMIC-NEXT:    move.l %d0, (%sp)
649; NO-ATOMIC-NEXT:    move.l #1, (4,%sp)
650; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_2
651; NO-ATOMIC-NEXT:    adda.l #12, %sp
652; NO-ATOMIC-NEXT:    rts
653;
654; ATOMIC-LABEL: atomicrmw_sub_i16_arid:
655; ATOMIC:         .cfi_startproc
656; ATOMIC-NEXT:  ; %bb.0: ; %start
657; ATOMIC-NEXT:    suba.l #4, %sp
658; ATOMIC-NEXT:    .cfi_def_cfa_offset -8
659; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
660; ATOMIC-NEXT:    move.l (8,%sp), %a0
661; ATOMIC-NEXT:    move.l (%a0), %a0
662; ATOMIC-NEXT:    move.w (4,%a0), %d1
663; ATOMIC-NEXT:    move.w %d1, %d0
664; ATOMIC-NEXT:  .LBB13_1: ; %atomicrmw.start
665; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
666; ATOMIC-NEXT:    move.w %d1, %d2
667; ATOMIC-NEXT:    add.w #-1, %d2
668; ATOMIC-NEXT:    cas.w %d0, %d2, (4,%a0)
669; ATOMIC-NEXT:    move.w %d0, %d2
670; ATOMIC-NEXT:    sub.w %d1, %d2
671; ATOMIC-NEXT:    seq %d1
672; ATOMIC-NEXT:    sub.b #1, %d1
673; ATOMIC-NEXT:    move.w %d0, %d1
674; ATOMIC-NEXT:    bne .LBB13_1
675; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
676; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
677; ATOMIC-NEXT:    adda.l #4, %sp
678; ATOMIC-NEXT:    rts
679start:
680  %self1 = load ptr, ptr %self, align 2
681  %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 4
682  %6 = atomicrmw sub ptr %_18.i.i, i16 1 release, align 4
683  ret i16 %6
684}
685
686define i32 @atomicrmw_sub_i32_arid(ptr align 2 %self) {
687; NO-ATOMIC-LABEL: atomicrmw_sub_i32_arid:
688; NO-ATOMIC:         .cfi_startproc
689; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
690; NO-ATOMIC-NEXT:    suba.l #12, %sp
691; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
692; NO-ATOMIC-NEXT:    move.l (16,%sp), %a0
693; NO-ATOMIC-NEXT:    move.l (%a0), %d0
694; NO-ATOMIC-NEXT:    add.l #4, %d0
695; NO-ATOMIC-NEXT:    move.l %d0, (%sp)
696; NO-ATOMIC-NEXT:    move.l #1, (4,%sp)
697; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_4
698; NO-ATOMIC-NEXT:    adda.l #12, %sp
699; NO-ATOMIC-NEXT:    rts
700;
701; ATOMIC-LABEL: atomicrmw_sub_i32_arid:
702; ATOMIC:         .cfi_startproc
703; ATOMIC-NEXT:  ; %bb.0: ; %start
704; ATOMIC-NEXT:    suba.l #4, %sp
705; ATOMIC-NEXT:    .cfi_def_cfa_offset -8
706; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
707; ATOMIC-NEXT:    move.l (8,%sp), %a0
708; ATOMIC-NEXT:    move.l (%a0), %a0
709; ATOMIC-NEXT:    move.l (4,%a0), %d1
710; ATOMIC-NEXT:    move.l %d1, %d0
711; ATOMIC-NEXT:  .LBB14_1: ; %atomicrmw.start
712; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
713; ATOMIC-NEXT:    move.l %d1, %d2
714; ATOMIC-NEXT:    add.l #-1, %d2
715; ATOMIC-NEXT:    cas.l %d0, %d2, (4,%a0)
716; ATOMIC-NEXT:    move.l %d0, %d2
717; ATOMIC-NEXT:    sub.l %d1, %d2
718; ATOMIC-NEXT:    seq %d1
719; ATOMIC-NEXT:    sub.b #1, %d1
720; ATOMIC-NEXT:    move.l %d0, %d1
721; ATOMIC-NEXT:    bne .LBB14_1
722; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
723; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
724; ATOMIC-NEXT:    adda.l #4, %sp
725; ATOMIC-NEXT:    rts
726start:
727  %self1 = load ptr, ptr %self, align 2
728  %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 4
729  %6 = atomicrmw sub ptr %_18.i.i, i32 1 release, align 4
730  ret i32 %6
731}
732