xref: /llvm-project/llvm/test/CodeGen/M68k/CodeModel/Large/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 --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC
3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC
4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC
5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC
6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=ATOMIC
7; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=ATOMIC
8; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=ATOMIC
9; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC
10; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC
11; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC
12
13define i8 @atomicrmw_add_i8(i8 %val, ptr %ptr) {
14; NO-ATOMIC-LABEL: atomicrmw_add_i8:
15; NO-ATOMIC:         .cfi_startproc
16; NO-ATOMIC-NEXT:  ; %bb.0:
17; NO-ATOMIC-NEXT:    suba.l #12, %sp
18; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
19; NO-ATOMIC-NEXT:    move.b (19,%sp), %d0
20; NO-ATOMIC-NEXT:    and.l #255, %d0
21; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
22; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
23; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_add_1
24; NO-ATOMIC-NEXT:    adda.l #12, %sp
25; NO-ATOMIC-NEXT:    rts
26;
27; NO-ATOMIC-PIC-LABEL: atomicrmw_add_i8:
28; NO-ATOMIC-PIC:         .cfi_startproc
29; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
30; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
31; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
32; NO-ATOMIC-PIC-NEXT:    move.b (19,%sp), %d0
33; NO-ATOMIC-PIC-NEXT:    and.l #255, %d0
34; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
35; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
36; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_add_1@PLT,%pc)
37; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
38; NO-ATOMIC-PIC-NEXT:    rts
39;
40; ATOMIC-LABEL: atomicrmw_add_i8:
41; ATOMIC:         .cfi_startproc
42; ATOMIC-NEXT:  ; %bb.0:
43; ATOMIC-NEXT:    suba.l #8, %sp
44; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
45; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
46; ATOMIC-NEXT:    move.b (15,%sp), %d1
47; ATOMIC-NEXT:    move.l (16,%sp), %a0
48; ATOMIC-NEXT:    move.b (%a0), %d2
49; ATOMIC-NEXT:    move.b %d2, %d0
50; ATOMIC-NEXT:  .LBB0_1: ; %atomicrmw.start
51; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
52; ATOMIC-NEXT:    move.b %d2, %d3
53; ATOMIC-NEXT:    add.b %d1, %d3
54; ATOMIC-NEXT:    cas.b %d0, %d3, (%a0)
55; ATOMIC-NEXT:    move.b %d0, %d3
56; ATOMIC-NEXT:    sub.b %d2, %d3
57; ATOMIC-NEXT:    seq %d2
58; ATOMIC-NEXT:    sub.b #1, %d2
59; ATOMIC-NEXT:    move.b %d0, %d2
60; ATOMIC-NEXT:    bne .LBB0_1
61; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
62; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
63; ATOMIC-NEXT:    adda.l #8, %sp
64; ATOMIC-NEXT:    rts
65;
66; ATOMIC-PIC-LABEL: atomicrmw_add_i8:
67; ATOMIC-PIC:         .cfi_startproc
68; ATOMIC-PIC-NEXT:  ; %bb.0:
69; ATOMIC-PIC-NEXT:    suba.l #8, %sp
70; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
71; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
72; ATOMIC-PIC-NEXT:    move.b (15,%sp), %d1
73; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
74; ATOMIC-PIC-NEXT:    move.b (%a0), %d2
75; ATOMIC-PIC-NEXT:    move.b %d2, %d0
76; ATOMIC-PIC-NEXT:  .LBB0_1: ; %atomicrmw.start
77; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
78; ATOMIC-PIC-NEXT:    move.b %d2, %d3
79; ATOMIC-PIC-NEXT:    add.b %d1, %d3
80; ATOMIC-PIC-NEXT:    cas.b %d0, %d3, (%a0)
81; ATOMIC-PIC-NEXT:    move.b %d0, %d3
82; ATOMIC-PIC-NEXT:    sub.b %d2, %d3
83; ATOMIC-PIC-NEXT:    seq %d2
84; ATOMIC-PIC-NEXT:    sub.b #1, %d2
85; ATOMIC-PIC-NEXT:    move.b %d0, %d2
86; ATOMIC-PIC-NEXT:    bne .LBB0_1
87; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
88; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
89; ATOMIC-PIC-NEXT:    adda.l #8, %sp
90; ATOMIC-PIC-NEXT:    rts
91  %old = atomicrmw add ptr %ptr, i8 %val monotonic
92  ret i8 %old
93}
94
95define i16 @atomicrmw_sub_i16(i16 %val, ptr %ptr) {
96; NO-ATOMIC-LABEL: atomicrmw_sub_i16:
97; NO-ATOMIC:         .cfi_startproc
98; NO-ATOMIC-NEXT:  ; %bb.0:
99; NO-ATOMIC-NEXT:    suba.l #12, %sp
100; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
101; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
102; NO-ATOMIC-NEXT:    and.l #65535, %d0
103; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
104; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
105; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_2
106; NO-ATOMIC-NEXT:    adda.l #12, %sp
107; NO-ATOMIC-NEXT:    rts
108;
109; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i16:
110; NO-ATOMIC-PIC:         .cfi_startproc
111; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
112; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
113; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
114; NO-ATOMIC-PIC-NEXT:    move.w (18,%sp), %d0
115; NO-ATOMIC-PIC-NEXT:    and.l #65535, %d0
116; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
117; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
118; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_sub_2@PLT,%pc)
119; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
120; NO-ATOMIC-PIC-NEXT:    rts
121;
122; ATOMIC-LABEL: atomicrmw_sub_i16:
123; ATOMIC:         .cfi_startproc
124; ATOMIC-NEXT:  ; %bb.0:
125; ATOMIC-NEXT:    suba.l #8, %sp
126; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
127; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
128; ATOMIC-NEXT:    move.w (14,%sp), %d1
129; ATOMIC-NEXT:    move.l (16,%sp), %a0
130; ATOMIC-NEXT:    move.w (%a0), %d2
131; ATOMIC-NEXT:    move.w %d2, %d0
132; ATOMIC-NEXT:  .LBB1_1: ; %atomicrmw.start
133; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
134; ATOMIC-NEXT:    move.w %d2, %d3
135; ATOMIC-NEXT:    sub.w %d1, %d3
136; ATOMIC-NEXT:    cas.w %d0, %d3, (%a0)
137; ATOMIC-NEXT:    move.w %d0, %d3
138; ATOMIC-NEXT:    sub.w %d2, %d3
139; ATOMIC-NEXT:    seq %d2
140; ATOMIC-NEXT:    sub.b #1, %d2
141; ATOMIC-NEXT:    move.w %d0, %d2
142; ATOMIC-NEXT:    bne .LBB1_1
143; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
144; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
145; ATOMIC-NEXT:    adda.l #8, %sp
146; ATOMIC-NEXT:    rts
147;
148; ATOMIC-PIC-LABEL: atomicrmw_sub_i16:
149; ATOMIC-PIC:         .cfi_startproc
150; ATOMIC-PIC-NEXT:  ; %bb.0:
151; ATOMIC-PIC-NEXT:    suba.l #8, %sp
152; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
153; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
154; ATOMIC-PIC-NEXT:    move.w (14,%sp), %d1
155; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
156; ATOMIC-PIC-NEXT:    move.w (%a0), %d2
157; ATOMIC-PIC-NEXT:    move.w %d2, %d0
158; ATOMIC-PIC-NEXT:  .LBB1_1: ; %atomicrmw.start
159; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
160; ATOMIC-PIC-NEXT:    move.w %d2, %d3
161; ATOMIC-PIC-NEXT:    sub.w %d1, %d3
162; ATOMIC-PIC-NEXT:    cas.w %d0, %d3, (%a0)
163; ATOMIC-PIC-NEXT:    move.w %d0, %d3
164; ATOMIC-PIC-NEXT:    sub.w %d2, %d3
165; ATOMIC-PIC-NEXT:    seq %d2
166; ATOMIC-PIC-NEXT:    sub.b #1, %d2
167; ATOMIC-PIC-NEXT:    move.w %d0, %d2
168; ATOMIC-PIC-NEXT:    bne .LBB1_1
169; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
170; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
171; ATOMIC-PIC-NEXT:    adda.l #8, %sp
172; ATOMIC-PIC-NEXT:    rts
173  %old = atomicrmw sub ptr %ptr, i16 %val acquire
174  ret i16 %old
175}
176
177define i32 @atomicrmw_and_i32(i32 %val, ptr %ptr) {
178; NO-ATOMIC-LABEL: atomicrmw_and_i32:
179; NO-ATOMIC:         .cfi_startproc
180; NO-ATOMIC-NEXT:  ; %bb.0:
181; NO-ATOMIC-NEXT:    suba.l #12, %sp
182; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
183; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
184; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
185; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_and_4
186; NO-ATOMIC-NEXT:    adda.l #12, %sp
187; NO-ATOMIC-NEXT:    rts
188;
189; NO-ATOMIC-PIC-LABEL: atomicrmw_and_i32:
190; NO-ATOMIC-PIC:         .cfi_startproc
191; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
192; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
193; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
194; NO-ATOMIC-PIC-NEXT:    move.l (16,%sp), (4,%sp)
195; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
196; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_and_4@PLT,%pc)
197; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
198; NO-ATOMIC-PIC-NEXT:    rts
199;
200; ATOMIC-LABEL: atomicrmw_and_i32:
201; ATOMIC:         .cfi_startproc
202; ATOMIC-NEXT:  ; %bb.0:
203; ATOMIC-NEXT:    suba.l #8, %sp
204; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
205; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
206; ATOMIC-NEXT:    move.l (12,%sp), %d1
207; ATOMIC-NEXT:    move.l (16,%sp), %a0
208; ATOMIC-NEXT:    move.l (%a0), %d2
209; ATOMIC-NEXT:    move.l %d2, %d0
210; ATOMIC-NEXT:  .LBB2_1: ; %atomicrmw.start
211; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
212; ATOMIC-NEXT:    move.l %d2, %d3
213; ATOMIC-NEXT:    and.l %d1, %d3
214; ATOMIC-NEXT:    cas.l %d0, %d3, (%a0)
215; ATOMIC-NEXT:    move.l %d0, %d3
216; ATOMIC-NEXT:    sub.l %d2, %d3
217; ATOMIC-NEXT:    seq %d2
218; ATOMIC-NEXT:    sub.b #1, %d2
219; ATOMIC-NEXT:    move.l %d0, %d2
220; ATOMIC-NEXT:    bne .LBB2_1
221; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
222; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
223; ATOMIC-NEXT:    adda.l #8, %sp
224; ATOMIC-NEXT:    rts
225;
226; ATOMIC-PIC-LABEL: atomicrmw_and_i32:
227; ATOMIC-PIC:         .cfi_startproc
228; ATOMIC-PIC-NEXT:  ; %bb.0:
229; ATOMIC-PIC-NEXT:    suba.l #8, %sp
230; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
231; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
232; ATOMIC-PIC-NEXT:    move.l (12,%sp), %d1
233; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
234; ATOMIC-PIC-NEXT:    move.l (%a0), %d2
235; ATOMIC-PIC-NEXT:    move.l %d2, %d0
236; ATOMIC-PIC-NEXT:  .LBB2_1: ; %atomicrmw.start
237; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
238; ATOMIC-PIC-NEXT:    move.l %d2, %d3
239; ATOMIC-PIC-NEXT:    and.l %d1, %d3
240; ATOMIC-PIC-NEXT:    cas.l %d0, %d3, (%a0)
241; ATOMIC-PIC-NEXT:    move.l %d0, %d3
242; ATOMIC-PIC-NEXT:    sub.l %d2, %d3
243; ATOMIC-PIC-NEXT:    seq %d2
244; ATOMIC-PIC-NEXT:    sub.b #1, %d2
245; ATOMIC-PIC-NEXT:    move.l %d0, %d2
246; ATOMIC-PIC-NEXT:    bne .LBB2_1
247; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
248; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
249; ATOMIC-PIC-NEXT:    adda.l #8, %sp
250; ATOMIC-PIC-NEXT:    rts
251  %old = atomicrmw and ptr %ptr, i32 %val seq_cst
252  ret i32 %old
253}
254
255define i64 @atomicrmw_xor_i64(i64 %val, ptr %ptr) {
256; NO-ATOMIC-LABEL: atomicrmw_xor_i64:
257; NO-ATOMIC:         .cfi_startproc
258; NO-ATOMIC-NEXT:  ; %bb.0:
259; NO-ATOMIC-NEXT:    suba.l #20, %sp
260; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -24
261; NO-ATOMIC-NEXT:    move.l #3, (12,%sp)
262; NO-ATOMIC-NEXT:    move.l (28,%sp), (8,%sp)
263; NO-ATOMIC-NEXT:    move.l (24,%sp), (4,%sp)
264; NO-ATOMIC-NEXT:    move.l (32,%sp), (%sp)
265; NO-ATOMIC-NEXT:    jsr __atomic_fetch_xor_8
266; NO-ATOMIC-NEXT:    adda.l #20, %sp
267; NO-ATOMIC-NEXT:    rts
268;
269; NO-ATOMIC-PIC-LABEL: atomicrmw_xor_i64:
270; NO-ATOMIC-PIC:         .cfi_startproc
271; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
272; NO-ATOMIC-PIC-NEXT:    suba.l #20, %sp
273; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -24
274; NO-ATOMIC-PIC-NEXT:    move.l #3, (12,%sp)
275; NO-ATOMIC-PIC-NEXT:    move.l (28,%sp), (8,%sp)
276; NO-ATOMIC-PIC-NEXT:    move.l (24,%sp), (4,%sp)
277; NO-ATOMIC-PIC-NEXT:    move.l (32,%sp), (%sp)
278; NO-ATOMIC-PIC-NEXT:    jsr (__atomic_fetch_xor_8@PLT,%pc)
279; NO-ATOMIC-PIC-NEXT:    adda.l #20, %sp
280; NO-ATOMIC-PIC-NEXT:    rts
281;
282; ATOMIC-LABEL: atomicrmw_xor_i64:
283; ATOMIC:         .cfi_startproc
284; ATOMIC-NEXT:  ; %bb.0:
285; ATOMIC-NEXT:    suba.l #20, %sp
286; ATOMIC-NEXT:    .cfi_def_cfa_offset -24
287; ATOMIC-NEXT:    move.l #3, (12,%sp)
288; ATOMIC-NEXT:    move.l (28,%sp), (8,%sp)
289; ATOMIC-NEXT:    move.l (24,%sp), (4,%sp)
290; ATOMIC-NEXT:    move.l (32,%sp), (%sp)
291; ATOMIC-NEXT:    jsr __atomic_fetch_xor_8
292; ATOMIC-NEXT:    adda.l #20, %sp
293; ATOMIC-NEXT:    rts
294;
295; ATOMIC-PIC-LABEL: atomicrmw_xor_i64:
296; ATOMIC-PIC:         .cfi_startproc
297; ATOMIC-PIC-NEXT:  ; %bb.0:
298; ATOMIC-PIC-NEXT:    suba.l #20, %sp
299; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -24
300; ATOMIC-PIC-NEXT:    move.l #3, (12,%sp)
301; ATOMIC-PIC-NEXT:    move.l (28,%sp), (8,%sp)
302; ATOMIC-PIC-NEXT:    move.l (24,%sp), (4,%sp)
303; ATOMIC-PIC-NEXT:    move.l (32,%sp), (%sp)
304; ATOMIC-PIC-NEXT:    jsr (__atomic_fetch_xor_8@PLT,%pc)
305; ATOMIC-PIC-NEXT:    adda.l #20, %sp
306; ATOMIC-PIC-NEXT:    rts
307  %old = atomicrmw xor ptr %ptr, i64 %val release
308  ret i64 %old
309}
310
311define i8 @atomicrmw_or_i8(i8 %val, ptr %ptr) {
312; NO-ATOMIC-LABEL: atomicrmw_or_i8:
313; NO-ATOMIC:         .cfi_startproc
314; NO-ATOMIC-NEXT:  ; %bb.0:
315; NO-ATOMIC-NEXT:    suba.l #12, %sp
316; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
317; NO-ATOMIC-NEXT:    move.b (19,%sp), %d0
318; NO-ATOMIC-NEXT:    and.l #255, %d0
319; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
320; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
321; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_or_1
322; NO-ATOMIC-NEXT:    adda.l #12, %sp
323; NO-ATOMIC-NEXT:    rts
324;
325; NO-ATOMIC-PIC-LABEL: atomicrmw_or_i8:
326; NO-ATOMIC-PIC:         .cfi_startproc
327; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
328; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
329; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
330; NO-ATOMIC-PIC-NEXT:    move.b (19,%sp), %d0
331; NO-ATOMIC-PIC-NEXT:    and.l #255, %d0
332; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
333; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
334; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_or_1@PLT,%pc)
335; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
336; NO-ATOMIC-PIC-NEXT:    rts
337;
338; ATOMIC-LABEL: atomicrmw_or_i8:
339; ATOMIC:         .cfi_startproc
340; ATOMIC-NEXT:  ; %bb.0:
341; ATOMIC-NEXT:    suba.l #8, %sp
342; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
343; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
344; ATOMIC-NEXT:    move.b (15,%sp), %d1
345; ATOMIC-NEXT:    move.l (16,%sp), %a0
346; ATOMIC-NEXT:    move.b (%a0), %d2
347; ATOMIC-NEXT:    move.b %d2, %d0
348; ATOMIC-NEXT:  .LBB4_1: ; %atomicrmw.start
349; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
350; ATOMIC-NEXT:    move.b %d2, %d3
351; ATOMIC-NEXT:    or.b %d1, %d3
352; ATOMIC-NEXT:    cas.b %d0, %d3, (%a0)
353; ATOMIC-NEXT:    move.b %d0, %d3
354; ATOMIC-NEXT:    sub.b %d2, %d3
355; ATOMIC-NEXT:    seq %d2
356; ATOMIC-NEXT:    sub.b #1, %d2
357; ATOMIC-NEXT:    move.b %d0, %d2
358; ATOMIC-NEXT:    bne .LBB4_1
359; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
360; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
361; ATOMIC-NEXT:    adda.l #8, %sp
362; ATOMIC-NEXT:    rts
363;
364; ATOMIC-PIC-LABEL: atomicrmw_or_i8:
365; ATOMIC-PIC:         .cfi_startproc
366; ATOMIC-PIC-NEXT:  ; %bb.0:
367; ATOMIC-PIC-NEXT:    suba.l #8, %sp
368; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
369; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
370; ATOMIC-PIC-NEXT:    move.b (15,%sp), %d1
371; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
372; ATOMIC-PIC-NEXT:    move.b (%a0), %d2
373; ATOMIC-PIC-NEXT:    move.b %d2, %d0
374; ATOMIC-PIC-NEXT:  .LBB4_1: ; %atomicrmw.start
375; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
376; ATOMIC-PIC-NEXT:    move.b %d2, %d3
377; ATOMIC-PIC-NEXT:    or.b %d1, %d3
378; ATOMIC-PIC-NEXT:    cas.b %d0, %d3, (%a0)
379; ATOMIC-PIC-NEXT:    move.b %d0, %d3
380; ATOMIC-PIC-NEXT:    sub.b %d2, %d3
381; ATOMIC-PIC-NEXT:    seq %d2
382; ATOMIC-PIC-NEXT:    sub.b #1, %d2
383; ATOMIC-PIC-NEXT:    move.b %d0, %d2
384; ATOMIC-PIC-NEXT:    bne .LBB4_1
385; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
386; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
387; ATOMIC-PIC-NEXT:    adda.l #8, %sp
388; ATOMIC-PIC-NEXT:    rts
389  %old = atomicrmw or ptr %ptr, i8 %val monotonic
390  ret i8 %old
391}
392
393define i16 @atmoicrmw_nand_i16(i16 %val, ptr %ptr) {
394; NO-ATOMIC-LABEL: atmoicrmw_nand_i16:
395; NO-ATOMIC:         .cfi_startproc
396; NO-ATOMIC-NEXT:  ; %bb.0:
397; NO-ATOMIC-NEXT:    suba.l #12, %sp
398; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
399; NO-ATOMIC-NEXT:    movem.l %d2, (8,%sp) ; 8-byte Folded Spill
400; NO-ATOMIC-NEXT:    move.w (18,%sp), %d2
401; NO-ATOMIC-NEXT:    move.l %d2, %d0
402; NO-ATOMIC-NEXT:    and.l #65535, %d0
403; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
404; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
405; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_nand_2
406; NO-ATOMIC-NEXT:    move.w %d2, %d0
407; NO-ATOMIC-NEXT:    movem.l (8,%sp), %d2 ; 8-byte Folded Reload
408; NO-ATOMIC-NEXT:    adda.l #12, %sp
409; NO-ATOMIC-NEXT:    rts
410;
411; NO-ATOMIC-PIC-LABEL: atmoicrmw_nand_i16:
412; NO-ATOMIC-PIC:         .cfi_startproc
413; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
414; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
415; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
416; NO-ATOMIC-PIC-NEXT:    movem.l %d2, (8,%sp) ; 8-byte Folded Spill
417; NO-ATOMIC-PIC-NEXT:    move.w (18,%sp), %d2
418; NO-ATOMIC-PIC-NEXT:    move.l %d2, %d0
419; NO-ATOMIC-PIC-NEXT:    and.l #65535, %d0
420; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
421; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
422; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_nand_2@PLT,%pc)
423; NO-ATOMIC-PIC-NEXT:    move.w %d2, %d0
424; NO-ATOMIC-PIC-NEXT:    movem.l (8,%sp), %d2 ; 8-byte Folded Reload
425; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
426; NO-ATOMIC-PIC-NEXT:    rts
427;
428; ATOMIC-LABEL: atmoicrmw_nand_i16:
429; ATOMIC:         .cfi_startproc
430; ATOMIC-NEXT:  ; %bb.0:
431; ATOMIC-NEXT:    suba.l #8, %sp
432; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
433; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
434; ATOMIC-NEXT:    move.w (14,%sp), %d0
435; ATOMIC-NEXT:    move.l (16,%sp), %a0
436; ATOMIC-NEXT:    move.w (%a0), %d2
437; ATOMIC-NEXT:    move.w %d2, %d1
438; ATOMIC-NEXT:  .LBB5_1: ; %atomicrmw.start
439; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
440; ATOMIC-NEXT:    move.w %d2, %d3
441; ATOMIC-NEXT:    and.w %d0, %d3
442; ATOMIC-NEXT:    not.w %d3
443; ATOMIC-NEXT:    cas.w %d1, %d3, (%a0)
444; ATOMIC-NEXT:    move.w %d1, %d3
445; ATOMIC-NEXT:    sub.w %d2, %d3
446; ATOMIC-NEXT:    seq %d2
447; ATOMIC-NEXT:    sub.b #1, %d2
448; ATOMIC-NEXT:    move.w %d1, %d2
449; ATOMIC-NEXT:    bne .LBB5_1
450; ATOMIC-NEXT:  ; %bb.2: ; %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;
455; ATOMIC-PIC-LABEL: atmoicrmw_nand_i16:
456; ATOMIC-PIC:         .cfi_startproc
457; ATOMIC-PIC-NEXT:  ; %bb.0:
458; ATOMIC-PIC-NEXT:    suba.l #8, %sp
459; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
460; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
461; ATOMIC-PIC-NEXT:    move.w (14,%sp), %d0
462; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
463; ATOMIC-PIC-NEXT:    move.w (%a0), %d2
464; ATOMIC-PIC-NEXT:    move.w %d2, %d1
465; ATOMIC-PIC-NEXT:  .LBB5_1: ; %atomicrmw.start
466; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
467; ATOMIC-PIC-NEXT:    move.w %d2, %d3
468; ATOMIC-PIC-NEXT:    and.w %d0, %d3
469; ATOMIC-PIC-NEXT:    not.w %d3
470; ATOMIC-PIC-NEXT:    cas.w %d1, %d3, (%a0)
471; ATOMIC-PIC-NEXT:    move.w %d1, %d3
472; ATOMIC-PIC-NEXT:    sub.w %d2, %d3
473; ATOMIC-PIC-NEXT:    seq %d2
474; ATOMIC-PIC-NEXT:    sub.b #1, %d2
475; ATOMIC-PIC-NEXT:    move.w %d1, %d2
476; ATOMIC-PIC-NEXT:    bne .LBB5_1
477; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
478; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
479; ATOMIC-PIC-NEXT:    adda.l #8, %sp
480; ATOMIC-PIC-NEXT:    rts
481  %old = atomicrmw nand ptr %ptr, i16 %val seq_cst
482  ret i16 %val
483}
484
485define i32 @atomicrmw_min_i32(i32 %val, ptr %ptr) {
486; NO-ATOMIC-LABEL: atomicrmw_min_i32:
487; NO-ATOMIC:         .cfi_startproc
488; NO-ATOMIC-NEXT:  ; %bb.0:
489; NO-ATOMIC-NEXT:    suba.l #12, %sp
490; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
491; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
492; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
493; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_min_4
494; NO-ATOMIC-NEXT:    adda.l #12, %sp
495; NO-ATOMIC-NEXT:    rts
496;
497; NO-ATOMIC-PIC-LABEL: atomicrmw_min_i32:
498; NO-ATOMIC-PIC:         .cfi_startproc
499; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
500; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
501; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
502; NO-ATOMIC-PIC-NEXT:    move.l (16,%sp), (4,%sp)
503; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
504; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_min_4@PLT,%pc)
505; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
506; NO-ATOMIC-PIC-NEXT:    rts
507;
508; ATOMIC-LABEL: atomicrmw_min_i32:
509; ATOMIC:         .cfi_startproc
510; ATOMIC-NEXT:  ; %bb.0:
511; ATOMIC-NEXT:    suba.l #8, %sp
512; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
513; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
514; ATOMIC-NEXT:    move.l (12,%sp), %d1
515; ATOMIC-NEXT:    move.l (16,%sp), %a0
516; ATOMIC-NEXT:    move.l (%a0), %d2
517; ATOMIC-NEXT:    bra .LBB6_1
518; ATOMIC-NEXT:  .LBB6_3: ; %atomicrmw.start
519; ATOMIC-NEXT:    ; in Loop: Header=BB6_1 Depth=1
520; ATOMIC-NEXT:    move.l %d2, %d0
521; ATOMIC-NEXT:    cas.l %d0, %d3, (%a0)
522; ATOMIC-NEXT:    move.l %d0, %d3
523; ATOMIC-NEXT:    sub.l %d2, %d3
524; ATOMIC-NEXT:    seq %d2
525; ATOMIC-NEXT:    sub.b #1, %d2
526; ATOMIC-NEXT:    move.l %d0, %d2
527; ATOMIC-NEXT:    beq .LBB6_4
528; ATOMIC-NEXT:  .LBB6_1: ; %atomicrmw.start
529; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
530; ATOMIC-NEXT:    move.l %d2, %d0
531; ATOMIC-NEXT:    sub.l %d1, %d0
532; ATOMIC-NEXT:    move.l %d2, %d3
533; ATOMIC-NEXT:    ble .LBB6_3
534; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
535; ATOMIC-NEXT:    ; in Loop: Header=BB6_1 Depth=1
536; ATOMIC-NEXT:    move.l %d1, %d3
537; ATOMIC-NEXT:    bra .LBB6_3
538; ATOMIC-NEXT:  .LBB6_4: ; %atomicrmw.end
539; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
540; ATOMIC-NEXT:    adda.l #8, %sp
541; ATOMIC-NEXT:    rts
542;
543; ATOMIC-PIC-LABEL: atomicrmw_min_i32:
544; ATOMIC-PIC:         .cfi_startproc
545; ATOMIC-PIC-NEXT:  ; %bb.0:
546; ATOMIC-PIC-NEXT:    suba.l #8, %sp
547; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
548; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
549; ATOMIC-PIC-NEXT:    move.l (12,%sp), %d1
550; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
551; ATOMIC-PIC-NEXT:    move.l (%a0), %d2
552; ATOMIC-PIC-NEXT:    bra .LBB6_1
553; ATOMIC-PIC-NEXT:  .LBB6_3: ; %atomicrmw.start
554; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB6_1 Depth=1
555; ATOMIC-PIC-NEXT:    move.l %d2, %d0
556; ATOMIC-PIC-NEXT:    cas.l %d0, %d3, (%a0)
557; ATOMIC-PIC-NEXT:    move.l %d0, %d3
558; ATOMIC-PIC-NEXT:    sub.l %d2, %d3
559; ATOMIC-PIC-NEXT:    seq %d2
560; ATOMIC-PIC-NEXT:    sub.b #1, %d2
561; ATOMIC-PIC-NEXT:    move.l %d0, %d2
562; ATOMIC-PIC-NEXT:    beq .LBB6_4
563; ATOMIC-PIC-NEXT:  .LBB6_1: ; %atomicrmw.start
564; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
565; ATOMIC-PIC-NEXT:    move.l %d2, %d0
566; ATOMIC-PIC-NEXT:    sub.l %d1, %d0
567; ATOMIC-PIC-NEXT:    move.l %d2, %d3
568; ATOMIC-PIC-NEXT:    ble .LBB6_3
569; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.start
570; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB6_1 Depth=1
571; ATOMIC-PIC-NEXT:    move.l %d1, %d3
572; ATOMIC-PIC-NEXT:    bra .LBB6_3
573; ATOMIC-PIC-NEXT:  .LBB6_4: ; %atomicrmw.end
574; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
575; ATOMIC-PIC-NEXT:    adda.l #8, %sp
576; ATOMIC-PIC-NEXT:    rts
577  %old = atomicrmw min ptr %ptr, i32 %val acquire
578  ret i32 %old
579}
580
581define i64 @atomicrmw_max_i64(i64 %val, ptr %ptr) {
582; NO-ATOMIC-LABEL: atomicrmw_max_i64:
583; NO-ATOMIC:         .cfi_startproc
584; NO-ATOMIC-NEXT:  ; %bb.0:
585; NO-ATOMIC-NEXT:    suba.l #52, %sp
586; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -56
587; NO-ATOMIC-NEXT:    movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill
588; NO-ATOMIC-NEXT:    move.l (60,%sp), %d3
589; NO-ATOMIC-NEXT:    move.l (56,%sp), %d4
590; NO-ATOMIC-NEXT:    move.l (64,%sp), %a2
591; NO-ATOMIC-NEXT:    move.l (4,%a2), %d1
592; NO-ATOMIC-NEXT:    move.l (%a2), %d0
593; NO-ATOMIC-NEXT:    lea (24,%sp), %a3
594; NO-ATOMIC-NEXT:    bra .LBB7_1
595; NO-ATOMIC-NEXT:  .LBB7_3: ; %atomicrmw.start
596; NO-ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
597; NO-ATOMIC-NEXT:    move.l %d1, (12,%sp)
598; NO-ATOMIC-NEXT:    move.l %d0, (8,%sp)
599; NO-ATOMIC-NEXT:    move.l #5, (20,%sp)
600; NO-ATOMIC-NEXT:    move.l #5, (16,%sp)
601; NO-ATOMIC-NEXT:    jsr __atomic_compare_exchange_8
602; NO-ATOMIC-NEXT:    move.b %d0, %d2
603; NO-ATOMIC-NEXT:    move.l (28,%sp), %d1
604; NO-ATOMIC-NEXT:    move.l (24,%sp), %d0
605; NO-ATOMIC-NEXT:    cmpi.b #0, %d2
606; NO-ATOMIC-NEXT:    bne .LBB7_4
607; NO-ATOMIC-NEXT:  .LBB7_1: ; %atomicrmw.start
608; NO-ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
609; NO-ATOMIC-NEXT:    move.l %d0, (24,%sp)
610; NO-ATOMIC-NEXT:    move.l %d1, (28,%sp)
611; NO-ATOMIC-NEXT:    move.l %a2, (%sp)
612; NO-ATOMIC-NEXT:    move.l %a3, (4,%sp)
613; NO-ATOMIC-NEXT:    move.l %d3, %d2
614; NO-ATOMIC-NEXT:    sub.l %d1, %d2
615; NO-ATOMIC-NEXT:    move.l %d4, %d2
616; NO-ATOMIC-NEXT:    subx.l %d0, %d2
617; NO-ATOMIC-NEXT:    slt %d2
618; NO-ATOMIC-NEXT:    cmpi.b #0, %d2
619; NO-ATOMIC-NEXT:    bne .LBB7_3
620; NO-ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
621; NO-ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
622; NO-ATOMIC-NEXT:    move.l %d3, %d1
623; NO-ATOMIC-NEXT:    move.l %d4, %d0
624; NO-ATOMIC-NEXT:    bra .LBB7_3
625; NO-ATOMIC-NEXT:  .LBB7_4: ; %atomicrmw.end
626; NO-ATOMIC-NEXT:    movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload
627; NO-ATOMIC-NEXT:    adda.l #52, %sp
628; NO-ATOMIC-NEXT:    rts
629;
630; NO-ATOMIC-PIC-LABEL: atomicrmw_max_i64:
631; NO-ATOMIC-PIC:         .cfi_startproc
632; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
633; NO-ATOMIC-PIC-NEXT:    suba.l #52, %sp
634; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -56
635; NO-ATOMIC-PIC-NEXT:    movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill
636; NO-ATOMIC-PIC-NEXT:    move.l (60,%sp), %d3
637; NO-ATOMIC-PIC-NEXT:    move.l (56,%sp), %d4
638; NO-ATOMIC-PIC-NEXT:    move.l (64,%sp), %a2
639; NO-ATOMIC-PIC-NEXT:    move.l (4,%a2), %d1
640; NO-ATOMIC-PIC-NEXT:    move.l (%a2), %d0
641; NO-ATOMIC-PIC-NEXT:    lea (24,%sp), %a3
642; NO-ATOMIC-PIC-NEXT:    bra .LBB7_1
643; NO-ATOMIC-PIC-NEXT:  .LBB7_3: ; %atomicrmw.start
644; NO-ATOMIC-PIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
645; NO-ATOMIC-PIC-NEXT:    move.l %d1, (12,%sp)
646; NO-ATOMIC-PIC-NEXT:    move.l %d0, (8,%sp)
647; NO-ATOMIC-PIC-NEXT:    move.l #5, (20,%sp)
648; NO-ATOMIC-PIC-NEXT:    move.l #5, (16,%sp)
649; NO-ATOMIC-PIC-NEXT:    jsr (__atomic_compare_exchange_8@PLT,%pc)
650; NO-ATOMIC-PIC-NEXT:    move.b %d0, %d2
651; NO-ATOMIC-PIC-NEXT:    move.l (28,%sp), %d1
652; NO-ATOMIC-PIC-NEXT:    move.l (24,%sp), %d0
653; NO-ATOMIC-PIC-NEXT:    cmpi.b #0, %d2
654; NO-ATOMIC-PIC-NEXT:    bne .LBB7_4
655; NO-ATOMIC-PIC-NEXT:  .LBB7_1: ; %atomicrmw.start
656; NO-ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
657; NO-ATOMIC-PIC-NEXT:    move.l %d0, (24,%sp)
658; NO-ATOMIC-PIC-NEXT:    move.l %d1, (28,%sp)
659; NO-ATOMIC-PIC-NEXT:    move.l %a2, (%sp)
660; NO-ATOMIC-PIC-NEXT:    move.l %a3, (4,%sp)
661; NO-ATOMIC-PIC-NEXT:    move.l %d3, %d2
662; NO-ATOMIC-PIC-NEXT:    sub.l %d1, %d2
663; NO-ATOMIC-PIC-NEXT:    move.l %d4, %d2
664; NO-ATOMIC-PIC-NEXT:    subx.l %d0, %d2
665; NO-ATOMIC-PIC-NEXT:    slt %d2
666; NO-ATOMIC-PIC-NEXT:    cmpi.b #0, %d2
667; NO-ATOMIC-PIC-NEXT:    bne .LBB7_3
668; NO-ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.start
669; NO-ATOMIC-PIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
670; NO-ATOMIC-PIC-NEXT:    move.l %d3, %d1
671; NO-ATOMIC-PIC-NEXT:    move.l %d4, %d0
672; NO-ATOMIC-PIC-NEXT:    bra .LBB7_3
673; NO-ATOMIC-PIC-NEXT:  .LBB7_4: ; %atomicrmw.end
674; NO-ATOMIC-PIC-NEXT:    movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload
675; NO-ATOMIC-PIC-NEXT:    adda.l #52, %sp
676; NO-ATOMIC-PIC-NEXT:    rts
677;
678; ATOMIC-LABEL: atomicrmw_max_i64:
679; ATOMIC:         .cfi_startproc
680; ATOMIC-NEXT:  ; %bb.0:
681; ATOMIC-NEXT:    suba.l #52, %sp
682; ATOMIC-NEXT:    .cfi_def_cfa_offset -56
683; ATOMIC-NEXT:    movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill
684; ATOMIC-NEXT:    move.l (60,%sp), %d3
685; ATOMIC-NEXT:    move.l (56,%sp), %d4
686; ATOMIC-NEXT:    move.l (64,%sp), %a2
687; ATOMIC-NEXT:    move.l (4,%a2), %d1
688; ATOMIC-NEXT:    move.l (%a2), %d0
689; ATOMIC-NEXT:    lea (24,%sp), %a3
690; ATOMIC-NEXT:    bra .LBB7_1
691; ATOMIC-NEXT:  .LBB7_3: ; %atomicrmw.start
692; ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
693; ATOMIC-NEXT:    move.l %d1, (12,%sp)
694; ATOMIC-NEXT:    move.l %d0, (8,%sp)
695; ATOMIC-NEXT:    move.l #5, (20,%sp)
696; ATOMIC-NEXT:    move.l #5, (16,%sp)
697; ATOMIC-NEXT:    jsr __atomic_compare_exchange_8
698; ATOMIC-NEXT:    move.b %d0, %d2
699; ATOMIC-NEXT:    move.l (28,%sp), %d1
700; ATOMIC-NEXT:    move.l (24,%sp), %d0
701; ATOMIC-NEXT:    cmpi.b #0, %d2
702; ATOMIC-NEXT:    bne .LBB7_4
703; ATOMIC-NEXT:  .LBB7_1: ; %atomicrmw.start
704; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
705; ATOMIC-NEXT:    move.l %d0, (24,%sp)
706; ATOMIC-NEXT:    move.l %d1, (28,%sp)
707; ATOMIC-NEXT:    move.l %a2, (%sp)
708; ATOMIC-NEXT:    move.l %a3, (4,%sp)
709; ATOMIC-NEXT:    move.l %d3, %d2
710; ATOMIC-NEXT:    sub.l %d1, %d2
711; ATOMIC-NEXT:    move.l %d4, %d2
712; ATOMIC-NEXT:    subx.l %d0, %d2
713; ATOMIC-NEXT:    slt %d2
714; ATOMIC-NEXT:    cmpi.b #0, %d2
715; ATOMIC-NEXT:    bne .LBB7_3
716; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
717; ATOMIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
718; ATOMIC-NEXT:    move.l %d3, %d1
719; ATOMIC-NEXT:    move.l %d4, %d0
720; ATOMIC-NEXT:    bra .LBB7_3
721; ATOMIC-NEXT:  .LBB7_4: ; %atomicrmw.end
722; ATOMIC-NEXT:    movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload
723; ATOMIC-NEXT:    adda.l #52, %sp
724; ATOMIC-NEXT:    rts
725;
726; ATOMIC-PIC-LABEL: atomicrmw_max_i64:
727; ATOMIC-PIC:         .cfi_startproc
728; ATOMIC-PIC-NEXT:  ; %bb.0:
729; ATOMIC-PIC-NEXT:    suba.l #52, %sp
730; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -56
731; ATOMIC-PIC-NEXT:    movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill
732; ATOMIC-PIC-NEXT:    move.l (60,%sp), %d3
733; ATOMIC-PIC-NEXT:    move.l (56,%sp), %d4
734; ATOMIC-PIC-NEXT:    move.l (64,%sp), %a2
735; ATOMIC-PIC-NEXT:    move.l (4,%a2), %d1
736; ATOMIC-PIC-NEXT:    move.l (%a2), %d0
737; ATOMIC-PIC-NEXT:    lea (24,%sp), %a3
738; ATOMIC-PIC-NEXT:    bra .LBB7_1
739; ATOMIC-PIC-NEXT:  .LBB7_3: ; %atomicrmw.start
740; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
741; ATOMIC-PIC-NEXT:    move.l %d1, (12,%sp)
742; ATOMIC-PIC-NEXT:    move.l %d0, (8,%sp)
743; ATOMIC-PIC-NEXT:    move.l #5, (20,%sp)
744; ATOMIC-PIC-NEXT:    move.l #5, (16,%sp)
745; ATOMIC-PIC-NEXT:    jsr (__atomic_compare_exchange_8@PLT,%pc)
746; ATOMIC-PIC-NEXT:    move.b %d0, %d2
747; ATOMIC-PIC-NEXT:    move.l (28,%sp), %d1
748; ATOMIC-PIC-NEXT:    move.l (24,%sp), %d0
749; ATOMIC-PIC-NEXT:    cmpi.b #0, %d2
750; ATOMIC-PIC-NEXT:    bne .LBB7_4
751; ATOMIC-PIC-NEXT:  .LBB7_1: ; %atomicrmw.start
752; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
753; ATOMIC-PIC-NEXT:    move.l %d0, (24,%sp)
754; ATOMIC-PIC-NEXT:    move.l %d1, (28,%sp)
755; ATOMIC-PIC-NEXT:    move.l %a2, (%sp)
756; ATOMIC-PIC-NEXT:    move.l %a3, (4,%sp)
757; ATOMIC-PIC-NEXT:    move.l %d3, %d2
758; ATOMIC-PIC-NEXT:    sub.l %d1, %d2
759; ATOMIC-PIC-NEXT:    move.l %d4, %d2
760; ATOMIC-PIC-NEXT:    subx.l %d0, %d2
761; ATOMIC-PIC-NEXT:    slt %d2
762; ATOMIC-PIC-NEXT:    cmpi.b #0, %d2
763; ATOMIC-PIC-NEXT:    bne .LBB7_3
764; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.start
765; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB7_1 Depth=1
766; ATOMIC-PIC-NEXT:    move.l %d3, %d1
767; ATOMIC-PIC-NEXT:    move.l %d4, %d0
768; ATOMIC-PIC-NEXT:    bra .LBB7_3
769; ATOMIC-PIC-NEXT:  .LBB7_4: ; %atomicrmw.end
770; ATOMIC-PIC-NEXT:    movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload
771; ATOMIC-PIC-NEXT:    adda.l #52, %sp
772; ATOMIC-PIC-NEXT:    rts
773  %old = atomicrmw max ptr %ptr, i64 %val seq_cst
774  ret i64 %old
775}
776
777define i8 @atomicrmw_i8_umin(i8 %val, ptr %ptr) {
778; NO-ATOMIC-LABEL: atomicrmw_i8_umin:
779; NO-ATOMIC:         .cfi_startproc
780; NO-ATOMIC-NEXT:  ; %bb.0:
781; NO-ATOMIC-NEXT:    suba.l #12, %sp
782; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
783; NO-ATOMIC-NEXT:    move.b (19,%sp), %d0
784; NO-ATOMIC-NEXT:    and.l #255, %d0
785; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
786; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
787; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_umin_1
788; NO-ATOMIC-NEXT:    adda.l #12, %sp
789; NO-ATOMIC-NEXT:    rts
790;
791; NO-ATOMIC-PIC-LABEL: atomicrmw_i8_umin:
792; NO-ATOMIC-PIC:         .cfi_startproc
793; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
794; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
795; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
796; NO-ATOMIC-PIC-NEXT:    move.b (19,%sp), %d0
797; NO-ATOMIC-PIC-NEXT:    and.l #255, %d0
798; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
799; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
800; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_umin_1@PLT,%pc)
801; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
802; NO-ATOMIC-PIC-NEXT:    rts
803;
804; ATOMIC-LABEL: atomicrmw_i8_umin:
805; ATOMIC:         .cfi_startproc
806; ATOMIC-NEXT:  ; %bb.0:
807; ATOMIC-NEXT:    suba.l #8, %sp
808; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
809; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
810; ATOMIC-NEXT:    move.b (15,%sp), %d1
811; ATOMIC-NEXT:    move.l (16,%sp), %a0
812; ATOMIC-NEXT:    move.b (%a0), %d2
813; ATOMIC-NEXT:    bra .LBB8_1
814; ATOMIC-NEXT:  .LBB8_3: ; %atomicrmw.start
815; ATOMIC-NEXT:    ; in Loop: Header=BB8_1 Depth=1
816; ATOMIC-NEXT:    move.b %d2, %d0
817; ATOMIC-NEXT:    cas.b %d0, %d3, (%a0)
818; ATOMIC-NEXT:    move.b %d0, %d3
819; ATOMIC-NEXT:    sub.b %d2, %d3
820; ATOMIC-NEXT:    seq %d2
821; ATOMIC-NEXT:    sub.b #1, %d2
822; ATOMIC-NEXT:    move.b %d0, %d2
823; ATOMIC-NEXT:    beq .LBB8_4
824; ATOMIC-NEXT:  .LBB8_1: ; %atomicrmw.start
825; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
826; ATOMIC-NEXT:    move.b %d2, %d0
827; ATOMIC-NEXT:    sub.b %d1, %d0
828; ATOMIC-NEXT:    move.b %d2, %d3
829; ATOMIC-NEXT:    bls .LBB8_3
830; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
831; ATOMIC-NEXT:    ; in Loop: Header=BB8_1 Depth=1
832; ATOMIC-NEXT:    move.b %d1, %d3
833; ATOMIC-NEXT:    bra .LBB8_3
834; ATOMIC-NEXT:  .LBB8_4: ; %atomicrmw.end
835; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
836; ATOMIC-NEXT:    adda.l #8, %sp
837; ATOMIC-NEXT:    rts
838;
839; ATOMIC-PIC-LABEL: atomicrmw_i8_umin:
840; ATOMIC-PIC:         .cfi_startproc
841; ATOMIC-PIC-NEXT:  ; %bb.0:
842; ATOMIC-PIC-NEXT:    suba.l #8, %sp
843; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
844; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
845; ATOMIC-PIC-NEXT:    move.b (15,%sp), %d1
846; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
847; ATOMIC-PIC-NEXT:    move.b (%a0), %d2
848; ATOMIC-PIC-NEXT:    bra .LBB8_1
849; ATOMIC-PIC-NEXT:  .LBB8_3: ; %atomicrmw.start
850; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB8_1 Depth=1
851; ATOMIC-PIC-NEXT:    move.b %d2, %d0
852; ATOMIC-PIC-NEXT:    cas.b %d0, %d3, (%a0)
853; ATOMIC-PIC-NEXT:    move.b %d0, %d3
854; ATOMIC-PIC-NEXT:    sub.b %d2, %d3
855; ATOMIC-PIC-NEXT:    seq %d2
856; ATOMIC-PIC-NEXT:    sub.b #1, %d2
857; ATOMIC-PIC-NEXT:    move.b %d0, %d2
858; ATOMIC-PIC-NEXT:    beq .LBB8_4
859; ATOMIC-PIC-NEXT:  .LBB8_1: ; %atomicrmw.start
860; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
861; ATOMIC-PIC-NEXT:    move.b %d2, %d0
862; ATOMIC-PIC-NEXT:    sub.b %d1, %d0
863; ATOMIC-PIC-NEXT:    move.b %d2, %d3
864; ATOMIC-PIC-NEXT:    bls .LBB8_3
865; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.start
866; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB8_1 Depth=1
867; ATOMIC-PIC-NEXT:    move.b %d1, %d3
868; ATOMIC-PIC-NEXT:    bra .LBB8_3
869; ATOMIC-PIC-NEXT:  .LBB8_4: ; %atomicrmw.end
870; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
871; ATOMIC-PIC-NEXT:    adda.l #8, %sp
872; ATOMIC-PIC-NEXT:    rts
873  %old = atomicrmw umin ptr %ptr, i8 %val release
874  ret i8 %old
875}
876
877define i16 @atomicrmw_umax_i16(i16 %val, ptr %ptr) {
878; NO-ATOMIC-LABEL: atomicrmw_umax_i16:
879; NO-ATOMIC:         .cfi_startproc
880; NO-ATOMIC-NEXT:  ; %bb.0:
881; NO-ATOMIC-NEXT:    suba.l #12, %sp
882; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
883; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
884; NO-ATOMIC-NEXT:    and.l #65535, %d0
885; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
886; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
887; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_umax_2
888; NO-ATOMIC-NEXT:    adda.l #12, %sp
889; NO-ATOMIC-NEXT:    rts
890;
891; NO-ATOMIC-PIC-LABEL: atomicrmw_umax_i16:
892; NO-ATOMIC-PIC:         .cfi_startproc
893; NO-ATOMIC-PIC-NEXT:  ; %bb.0:
894; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
895; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
896; NO-ATOMIC-PIC-NEXT:    move.w (18,%sp), %d0
897; NO-ATOMIC-PIC-NEXT:    and.l #65535, %d0
898; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
899; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
900; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_umax_2@PLT,%pc)
901; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
902; NO-ATOMIC-PIC-NEXT:    rts
903;
904; ATOMIC-LABEL: atomicrmw_umax_i16:
905; ATOMIC:         .cfi_startproc
906; ATOMIC-NEXT:  ; %bb.0:
907; ATOMIC-NEXT:    suba.l #8, %sp
908; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
909; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
910; ATOMIC-NEXT:    move.w (14,%sp), %d1
911; ATOMIC-NEXT:    move.l (16,%sp), %a0
912; ATOMIC-NEXT:    move.w (%a0), %d2
913; ATOMIC-NEXT:    bra .LBB9_1
914; ATOMIC-NEXT:  .LBB9_3: ; %atomicrmw.start
915; ATOMIC-NEXT:    ; in Loop: Header=BB9_1 Depth=1
916; ATOMIC-NEXT:    move.w %d2, %d0
917; ATOMIC-NEXT:    cas.w %d0, %d3, (%a0)
918; ATOMIC-NEXT:    move.w %d0, %d3
919; ATOMIC-NEXT:    sub.w %d2, %d3
920; ATOMIC-NEXT:    seq %d2
921; ATOMIC-NEXT:    sub.b #1, %d2
922; ATOMIC-NEXT:    move.w %d0, %d2
923; ATOMIC-NEXT:    beq .LBB9_4
924; ATOMIC-NEXT:  .LBB9_1: ; %atomicrmw.start
925; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
926; ATOMIC-NEXT:    move.w %d2, %d0
927; ATOMIC-NEXT:    sub.w %d1, %d0
928; ATOMIC-NEXT:    move.w %d2, %d3
929; ATOMIC-NEXT:    bhi .LBB9_3
930; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.start
931; ATOMIC-NEXT:    ; in Loop: Header=BB9_1 Depth=1
932; ATOMIC-NEXT:    move.w %d1, %d3
933; ATOMIC-NEXT:    bra .LBB9_3
934; ATOMIC-NEXT:  .LBB9_4: ; %atomicrmw.end
935; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
936; ATOMIC-NEXT:    adda.l #8, %sp
937; ATOMIC-NEXT:    rts
938;
939; ATOMIC-PIC-LABEL: atomicrmw_umax_i16:
940; ATOMIC-PIC:         .cfi_startproc
941; ATOMIC-PIC-NEXT:  ; %bb.0:
942; ATOMIC-PIC-NEXT:    suba.l #8, %sp
943; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
944; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
945; ATOMIC-PIC-NEXT:    move.w (14,%sp), %d1
946; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
947; ATOMIC-PIC-NEXT:    move.w (%a0), %d2
948; ATOMIC-PIC-NEXT:    bra .LBB9_1
949; ATOMIC-PIC-NEXT:  .LBB9_3: ; %atomicrmw.start
950; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB9_1 Depth=1
951; ATOMIC-PIC-NEXT:    move.w %d2, %d0
952; ATOMIC-PIC-NEXT:    cas.w %d0, %d3, (%a0)
953; ATOMIC-PIC-NEXT:    move.w %d0, %d3
954; ATOMIC-PIC-NEXT:    sub.w %d2, %d3
955; ATOMIC-PIC-NEXT:    seq %d2
956; ATOMIC-PIC-NEXT:    sub.b #1, %d2
957; ATOMIC-PIC-NEXT:    move.w %d0, %d2
958; ATOMIC-PIC-NEXT:    beq .LBB9_4
959; ATOMIC-PIC-NEXT:  .LBB9_1: ; %atomicrmw.start
960; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
961; ATOMIC-PIC-NEXT:    move.w %d2, %d0
962; ATOMIC-PIC-NEXT:    sub.w %d1, %d0
963; ATOMIC-PIC-NEXT:    move.w %d2, %d3
964; ATOMIC-PIC-NEXT:    bhi .LBB9_3
965; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.start
966; ATOMIC-PIC-NEXT:    ; in Loop: Header=BB9_1 Depth=1
967; ATOMIC-PIC-NEXT:    move.w %d1, %d3
968; ATOMIC-PIC-NEXT:    bra .LBB9_3
969; ATOMIC-PIC-NEXT:  .LBB9_4: ; %atomicrmw.end
970; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
971; ATOMIC-PIC-NEXT:    adda.l #8, %sp
972; ATOMIC-PIC-NEXT:    rts
973  %old = atomicrmw umax ptr %ptr, i16 %val seq_cst
974  ret i16 %old
975}
976
977define i16 @atomicrmw_xchg_i16(i16 %val, ptr %ptr) {
978; NO-ATOMIC-LABEL: atomicrmw_xchg_i16:
979; NO-ATOMIC:         .cfi_startproc
980; NO-ATOMIC-NEXT:  ; %bb.0: ; %entry
981; NO-ATOMIC-NEXT:    suba.l #12, %sp
982; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
983; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
984; NO-ATOMIC-NEXT:    and.l #65535, %d0
985; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
986; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
987; NO-ATOMIC-NEXT:    jsr __sync_lock_test_and_set_2
988; NO-ATOMIC-NEXT:    adda.l #12, %sp
989; NO-ATOMIC-NEXT:    rts
990;
991; NO-ATOMIC-PIC-LABEL: atomicrmw_xchg_i16:
992; NO-ATOMIC-PIC:         .cfi_startproc
993; NO-ATOMIC-PIC-NEXT:  ; %bb.0: ; %entry
994; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
995; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
996; NO-ATOMIC-PIC-NEXT:    move.w (18,%sp), %d0
997; NO-ATOMIC-PIC-NEXT:    and.l #65535, %d0
998; NO-ATOMIC-PIC-NEXT:    move.l %d0, (4,%sp)
999; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
1000; NO-ATOMIC-PIC-NEXT:    jsr (__sync_lock_test_and_set_2@PLT,%pc)
1001; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
1002; NO-ATOMIC-PIC-NEXT:    rts
1003;
1004; ATOMIC-LABEL: atomicrmw_xchg_i16:
1005; ATOMIC:         .cfi_startproc
1006; ATOMIC-NEXT:  ; %bb.0: ; %entry
1007; ATOMIC-NEXT:    suba.l #8, %sp
1008; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
1009; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
1010; ATOMIC-NEXT:    move.w (14,%sp), %d1
1011; ATOMIC-NEXT:    move.l (16,%sp), %a0
1012; ATOMIC-NEXT:    move.w (%a0), %d2
1013; ATOMIC-NEXT:    move.w %d2, %d0
1014; ATOMIC-NEXT:  .LBB10_1: ; %atomicrmw.start
1015; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1016; ATOMIC-NEXT:    cas.w %d0, %d1, (%a0)
1017; ATOMIC-NEXT:    move.w %d0, %d3
1018; ATOMIC-NEXT:    sub.w %d2, %d3
1019; ATOMIC-NEXT:    seq %d2
1020; ATOMIC-NEXT:    sub.b #1, %d2
1021; ATOMIC-NEXT:    move.w %d0, %d2
1022; ATOMIC-NEXT:    bne .LBB10_1
1023; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1024; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
1025; ATOMIC-NEXT:    adda.l #8, %sp
1026; ATOMIC-NEXT:    rts
1027;
1028; ATOMIC-PIC-LABEL: atomicrmw_xchg_i16:
1029; ATOMIC-PIC:         .cfi_startproc
1030; ATOMIC-PIC-NEXT:  ; %bb.0: ; %entry
1031; ATOMIC-PIC-NEXT:    suba.l #8, %sp
1032; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
1033; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
1034; ATOMIC-PIC-NEXT:    move.w (14,%sp), %d1
1035; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
1036; ATOMIC-PIC-NEXT:    move.w (%a0), %d2
1037; ATOMIC-PIC-NEXT:    move.w %d2, %d0
1038; ATOMIC-PIC-NEXT:  .LBB10_1: ; %atomicrmw.start
1039; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1040; ATOMIC-PIC-NEXT:    cas.w %d0, %d1, (%a0)
1041; ATOMIC-PIC-NEXT:    move.w %d0, %d3
1042; ATOMIC-PIC-NEXT:    sub.w %d2, %d3
1043; ATOMIC-PIC-NEXT:    seq %d2
1044; ATOMIC-PIC-NEXT:    sub.b #1, %d2
1045; ATOMIC-PIC-NEXT:    move.w %d0, %d2
1046; ATOMIC-PIC-NEXT:    bne .LBB10_1
1047; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1048; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
1049; ATOMIC-PIC-NEXT:    adda.l #8, %sp
1050; ATOMIC-PIC-NEXT:    rts
1051entry:
1052  %old = atomicrmw xchg ptr %ptr, i16 %val monotonic
1053  ret i16 %old
1054}
1055
1056define i32 @atomicrmw_xchg_i32(i32 %val, ptr %ptr) {
1057; NO-ATOMIC-LABEL: atomicrmw_xchg_i32:
1058; NO-ATOMIC:         .cfi_startproc
1059; NO-ATOMIC-NEXT:  ; %bb.0: ; %entry
1060; NO-ATOMIC-NEXT:    suba.l #12, %sp
1061; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
1062; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
1063; NO-ATOMIC-NEXT:    move.l (20,%sp), (%sp)
1064; NO-ATOMIC-NEXT:    jsr __sync_lock_test_and_set_4
1065; NO-ATOMIC-NEXT:    adda.l #12, %sp
1066; NO-ATOMIC-NEXT:    rts
1067;
1068; NO-ATOMIC-PIC-LABEL: atomicrmw_xchg_i32:
1069; NO-ATOMIC-PIC:         .cfi_startproc
1070; NO-ATOMIC-PIC-NEXT:  ; %bb.0: ; %entry
1071; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
1072; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
1073; NO-ATOMIC-PIC-NEXT:    move.l (16,%sp), (4,%sp)
1074; NO-ATOMIC-PIC-NEXT:    move.l (20,%sp), (%sp)
1075; NO-ATOMIC-PIC-NEXT:    jsr (__sync_lock_test_and_set_4@PLT,%pc)
1076; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
1077; NO-ATOMIC-PIC-NEXT:    rts
1078;
1079; ATOMIC-LABEL: atomicrmw_xchg_i32:
1080; ATOMIC:         .cfi_startproc
1081; ATOMIC-NEXT:  ; %bb.0: ; %entry
1082; ATOMIC-NEXT:    suba.l #8, %sp
1083; ATOMIC-NEXT:    .cfi_def_cfa_offset -12
1084; ATOMIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
1085; ATOMIC-NEXT:    move.l (12,%sp), %d1
1086; ATOMIC-NEXT:    move.l (16,%sp), %a0
1087; ATOMIC-NEXT:    move.l (%a0), %d2
1088; ATOMIC-NEXT:    move.l %d2, %d0
1089; ATOMIC-NEXT:  .LBB11_1: ; %atomicrmw.start
1090; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1091; ATOMIC-NEXT:    cas.l %d0, %d1, (%a0)
1092; ATOMIC-NEXT:    move.l %d0, %d3
1093; ATOMIC-NEXT:    sub.l %d2, %d3
1094; ATOMIC-NEXT:    seq %d2
1095; ATOMIC-NEXT:    sub.b #1, %d2
1096; ATOMIC-NEXT:    move.l %d0, %d2
1097; ATOMIC-NEXT:    bne .LBB11_1
1098; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1099; ATOMIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
1100; ATOMIC-NEXT:    adda.l #8, %sp
1101; ATOMIC-NEXT:    rts
1102;
1103; ATOMIC-PIC-LABEL: atomicrmw_xchg_i32:
1104; ATOMIC-PIC:         .cfi_startproc
1105; ATOMIC-PIC-NEXT:  ; %bb.0: ; %entry
1106; ATOMIC-PIC-NEXT:    suba.l #8, %sp
1107; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -12
1108; ATOMIC-PIC-NEXT:    movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill
1109; ATOMIC-PIC-NEXT:    move.l (12,%sp), %d1
1110; ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
1111; ATOMIC-PIC-NEXT:    move.l (%a0), %d2
1112; ATOMIC-PIC-NEXT:    move.l %d2, %d0
1113; ATOMIC-PIC-NEXT:  .LBB11_1: ; %atomicrmw.start
1114; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1115; ATOMIC-PIC-NEXT:    cas.l %d0, %d1, (%a0)
1116; ATOMIC-PIC-NEXT:    move.l %d0, %d3
1117; ATOMIC-PIC-NEXT:    sub.l %d2, %d3
1118; ATOMIC-PIC-NEXT:    seq %d2
1119; ATOMIC-PIC-NEXT:    sub.b #1, %d2
1120; ATOMIC-PIC-NEXT:    move.l %d0, %d2
1121; ATOMIC-PIC-NEXT:    bne .LBB11_1
1122; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1123; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload
1124; ATOMIC-PIC-NEXT:    adda.l #8, %sp
1125; ATOMIC-PIC-NEXT:    rts
1126entry:
1127  %old = atomicrmw xchg ptr %ptr, i32 %val monotonic
1128  ret i32 %old
1129}
1130
1131define i8 @atomicrmw_sub_i8_arid(ptr align 2 %self) {
1132; NO-ATOMIC-LABEL: atomicrmw_sub_i8_arid:
1133; NO-ATOMIC:         .cfi_startproc
1134; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
1135; NO-ATOMIC-NEXT:    suba.l #12, %sp
1136; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
1137; NO-ATOMIC-NEXT:    move.l (16,%sp), %a0
1138; NO-ATOMIC-NEXT:    move.l (%a0), %d0
1139; NO-ATOMIC-NEXT:    add.l #4, %d0
1140; NO-ATOMIC-NEXT:    move.l %d0, (%sp)
1141; NO-ATOMIC-NEXT:    move.l #1, (4,%sp)
1142; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_1
1143; NO-ATOMIC-NEXT:    adda.l #12, %sp
1144; NO-ATOMIC-NEXT:    rts
1145;
1146; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i8_arid:
1147; NO-ATOMIC-PIC:         .cfi_startproc
1148; NO-ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
1149; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
1150; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
1151; NO-ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
1152; NO-ATOMIC-PIC-NEXT:    move.l (%a0), %d0
1153; NO-ATOMIC-PIC-NEXT:    add.l #4, %d0
1154; NO-ATOMIC-PIC-NEXT:    move.l %d0, (%sp)
1155; NO-ATOMIC-PIC-NEXT:    move.l #1, (4,%sp)
1156; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_sub_1@PLT,%pc)
1157; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
1158; NO-ATOMIC-PIC-NEXT:    rts
1159;
1160; ATOMIC-LABEL: atomicrmw_sub_i8_arid:
1161; ATOMIC:         .cfi_startproc
1162; ATOMIC-NEXT:  ; %bb.0: ; %start
1163; ATOMIC-NEXT:    suba.l #4, %sp
1164; ATOMIC-NEXT:    .cfi_def_cfa_offset -8
1165; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
1166; ATOMIC-NEXT:    move.l (8,%sp), %a0
1167; ATOMIC-NEXT:    move.l (%a0), %a0
1168; ATOMIC-NEXT:    move.b (4,%a0), %d1
1169; ATOMIC-NEXT:    move.b %d1, %d0
1170; ATOMIC-NEXT:  .LBB12_1: ; %atomicrmw.start
1171; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1172; ATOMIC-NEXT:    move.b %d1, %d2
1173; ATOMIC-NEXT:    add.b #-1, %d2
1174; ATOMIC-NEXT:    cas.b %d0, %d2, (4,%a0)
1175; ATOMIC-NEXT:    move.b %d0, %d2
1176; ATOMIC-NEXT:    sub.b %d1, %d2
1177; ATOMIC-NEXT:    seq %d1
1178; ATOMIC-NEXT:    sub.b #1, %d1
1179; ATOMIC-NEXT:    move.b %d0, %d1
1180; ATOMIC-NEXT:    bne .LBB12_1
1181; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1182; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
1183; ATOMIC-NEXT:    adda.l #4, %sp
1184; ATOMIC-NEXT:    rts
1185;
1186; ATOMIC-PIC-LABEL: atomicrmw_sub_i8_arid:
1187; ATOMIC-PIC:         .cfi_startproc
1188; ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
1189; ATOMIC-PIC-NEXT:    suba.l #4, %sp
1190; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -8
1191; ATOMIC-PIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
1192; ATOMIC-PIC-NEXT:    move.l (8,%sp), %a0
1193; ATOMIC-PIC-NEXT:    move.l (%a0), %a0
1194; ATOMIC-PIC-NEXT:    move.b (4,%a0), %d1
1195; ATOMIC-PIC-NEXT:    move.b %d1, %d0
1196; ATOMIC-PIC-NEXT:  .LBB12_1: ; %atomicrmw.start
1197; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1198; ATOMIC-PIC-NEXT:    move.b %d1, %d2
1199; ATOMIC-PIC-NEXT:    add.b #-1, %d2
1200; ATOMIC-PIC-NEXT:    cas.b %d0, %d2, (4,%a0)
1201; ATOMIC-PIC-NEXT:    move.b %d0, %d2
1202; ATOMIC-PIC-NEXT:    sub.b %d1, %d2
1203; ATOMIC-PIC-NEXT:    seq %d1
1204; ATOMIC-PIC-NEXT:    sub.b #1, %d1
1205; ATOMIC-PIC-NEXT:    move.b %d0, %d1
1206; ATOMIC-PIC-NEXT:    bne .LBB12_1
1207; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1208; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
1209; ATOMIC-PIC-NEXT:    adda.l #4, %sp
1210; ATOMIC-PIC-NEXT:    rts
1211start:
1212  %self1 = load ptr, ptr %self, align 2
1213  %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 4
1214  %6 = atomicrmw sub ptr %_18.i.i, i8 1 release, align 4
1215  ret i8 %6
1216}
1217
1218define i16 @atomicrmw_sub_i16_arid(ptr align 2 %self) {
1219; NO-ATOMIC-LABEL: atomicrmw_sub_i16_arid:
1220; NO-ATOMIC:         .cfi_startproc
1221; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
1222; NO-ATOMIC-NEXT:    suba.l #12, %sp
1223; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
1224; NO-ATOMIC-NEXT:    move.l (16,%sp), %a0
1225; NO-ATOMIC-NEXT:    move.l (%a0), %d0
1226; NO-ATOMIC-NEXT:    add.l #4, %d0
1227; NO-ATOMIC-NEXT:    move.l %d0, (%sp)
1228; NO-ATOMIC-NEXT:    move.l #1, (4,%sp)
1229; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_2
1230; NO-ATOMIC-NEXT:    adda.l #12, %sp
1231; NO-ATOMIC-NEXT:    rts
1232;
1233; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i16_arid:
1234; NO-ATOMIC-PIC:         .cfi_startproc
1235; NO-ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
1236; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
1237; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
1238; NO-ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
1239; NO-ATOMIC-PIC-NEXT:    move.l (%a0), %d0
1240; NO-ATOMIC-PIC-NEXT:    add.l #4, %d0
1241; NO-ATOMIC-PIC-NEXT:    move.l %d0, (%sp)
1242; NO-ATOMIC-PIC-NEXT:    move.l #1, (4,%sp)
1243; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_sub_2@PLT,%pc)
1244; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
1245; NO-ATOMIC-PIC-NEXT:    rts
1246;
1247; ATOMIC-LABEL: atomicrmw_sub_i16_arid:
1248; ATOMIC:         .cfi_startproc
1249; ATOMIC-NEXT:  ; %bb.0: ; %start
1250; ATOMIC-NEXT:    suba.l #4, %sp
1251; ATOMIC-NEXT:    .cfi_def_cfa_offset -8
1252; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
1253; ATOMIC-NEXT:    move.l (8,%sp), %a0
1254; ATOMIC-NEXT:    move.l (%a0), %a0
1255; ATOMIC-NEXT:    move.w (4,%a0), %d1
1256; ATOMIC-NEXT:    move.w %d1, %d0
1257; ATOMIC-NEXT:  .LBB13_1: ; %atomicrmw.start
1258; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1259; ATOMIC-NEXT:    move.w %d1, %d2
1260; ATOMIC-NEXT:    add.w #-1, %d2
1261; ATOMIC-NEXT:    cas.w %d0, %d2, (4,%a0)
1262; ATOMIC-NEXT:    move.w %d0, %d2
1263; ATOMIC-NEXT:    sub.w %d1, %d2
1264; ATOMIC-NEXT:    seq %d1
1265; ATOMIC-NEXT:    sub.b #1, %d1
1266; ATOMIC-NEXT:    move.w %d0, %d1
1267; ATOMIC-NEXT:    bne .LBB13_1
1268; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1269; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
1270; ATOMIC-NEXT:    adda.l #4, %sp
1271; ATOMIC-NEXT:    rts
1272;
1273; ATOMIC-PIC-LABEL: atomicrmw_sub_i16_arid:
1274; ATOMIC-PIC:         .cfi_startproc
1275; ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
1276; ATOMIC-PIC-NEXT:    suba.l #4, %sp
1277; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -8
1278; ATOMIC-PIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
1279; ATOMIC-PIC-NEXT:    move.l (8,%sp), %a0
1280; ATOMIC-PIC-NEXT:    move.l (%a0), %a0
1281; ATOMIC-PIC-NEXT:    move.w (4,%a0), %d1
1282; ATOMIC-PIC-NEXT:    move.w %d1, %d0
1283; ATOMIC-PIC-NEXT:  .LBB13_1: ; %atomicrmw.start
1284; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1285; ATOMIC-PIC-NEXT:    move.w %d1, %d2
1286; ATOMIC-PIC-NEXT:    add.w #-1, %d2
1287; ATOMIC-PIC-NEXT:    cas.w %d0, %d2, (4,%a0)
1288; ATOMIC-PIC-NEXT:    move.w %d0, %d2
1289; ATOMIC-PIC-NEXT:    sub.w %d1, %d2
1290; ATOMIC-PIC-NEXT:    seq %d1
1291; ATOMIC-PIC-NEXT:    sub.b #1, %d1
1292; ATOMIC-PIC-NEXT:    move.w %d0, %d1
1293; ATOMIC-PIC-NEXT:    bne .LBB13_1
1294; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1295; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
1296; ATOMIC-PIC-NEXT:    adda.l #4, %sp
1297; ATOMIC-PIC-NEXT:    rts
1298start:
1299  %self1 = load ptr, ptr %self, align 2
1300  %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 4
1301  %6 = atomicrmw sub ptr %_18.i.i, i16 1 release, align 4
1302  ret i16 %6
1303}
1304
1305define i32 @atomicrmw_sub_i32_arid(ptr align 2 %self) {
1306; NO-ATOMIC-LABEL: atomicrmw_sub_i32_arid:
1307; NO-ATOMIC:         .cfi_startproc
1308; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
1309; NO-ATOMIC-NEXT:    suba.l #12, %sp
1310; NO-ATOMIC-NEXT:    .cfi_def_cfa_offset -16
1311; NO-ATOMIC-NEXT:    move.l (16,%sp), %a0
1312; NO-ATOMIC-NEXT:    move.l (%a0), %d0
1313; NO-ATOMIC-NEXT:    add.l #4, %d0
1314; NO-ATOMIC-NEXT:    move.l %d0, (%sp)
1315; NO-ATOMIC-NEXT:    move.l #1, (4,%sp)
1316; NO-ATOMIC-NEXT:    jsr __sync_fetch_and_sub_4
1317; NO-ATOMIC-NEXT:    adda.l #12, %sp
1318; NO-ATOMIC-NEXT:    rts
1319;
1320; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i32_arid:
1321; NO-ATOMIC-PIC:         .cfi_startproc
1322; NO-ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
1323; NO-ATOMIC-PIC-NEXT:    suba.l #12, %sp
1324; NO-ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -16
1325; NO-ATOMIC-PIC-NEXT:    move.l (16,%sp), %a0
1326; NO-ATOMIC-PIC-NEXT:    move.l (%a0), %d0
1327; NO-ATOMIC-PIC-NEXT:    add.l #4, %d0
1328; NO-ATOMIC-PIC-NEXT:    move.l %d0, (%sp)
1329; NO-ATOMIC-PIC-NEXT:    move.l #1, (4,%sp)
1330; NO-ATOMIC-PIC-NEXT:    jsr (__sync_fetch_and_sub_4@PLT,%pc)
1331; NO-ATOMIC-PIC-NEXT:    adda.l #12, %sp
1332; NO-ATOMIC-PIC-NEXT:    rts
1333;
1334; ATOMIC-LABEL: atomicrmw_sub_i32_arid:
1335; ATOMIC:         .cfi_startproc
1336; ATOMIC-NEXT:  ; %bb.0: ; %start
1337; ATOMIC-NEXT:    suba.l #4, %sp
1338; ATOMIC-NEXT:    .cfi_def_cfa_offset -8
1339; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
1340; ATOMIC-NEXT:    move.l (8,%sp), %a0
1341; ATOMIC-NEXT:    move.l (%a0), %a0
1342; ATOMIC-NEXT:    move.l (4,%a0), %d1
1343; ATOMIC-NEXT:    move.l %d1, %d0
1344; ATOMIC-NEXT:  .LBB14_1: ; %atomicrmw.start
1345; ATOMIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1346; ATOMIC-NEXT:    move.l %d1, %d2
1347; ATOMIC-NEXT:    add.l #-1, %d2
1348; ATOMIC-NEXT:    cas.l %d0, %d2, (4,%a0)
1349; ATOMIC-NEXT:    move.l %d0, %d2
1350; ATOMIC-NEXT:    sub.l %d1, %d2
1351; ATOMIC-NEXT:    seq %d1
1352; ATOMIC-NEXT:    sub.b #1, %d1
1353; ATOMIC-NEXT:    move.l %d0, %d1
1354; ATOMIC-NEXT:    bne .LBB14_1
1355; ATOMIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1356; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
1357; ATOMIC-NEXT:    adda.l #4, %sp
1358; ATOMIC-NEXT:    rts
1359;
1360; ATOMIC-PIC-LABEL: atomicrmw_sub_i32_arid:
1361; ATOMIC-PIC:         .cfi_startproc
1362; ATOMIC-PIC-NEXT:  ; %bb.0: ; %start
1363; ATOMIC-PIC-NEXT:    suba.l #4, %sp
1364; ATOMIC-PIC-NEXT:    .cfi_def_cfa_offset -8
1365; ATOMIC-PIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
1366; ATOMIC-PIC-NEXT:    move.l (8,%sp), %a0
1367; ATOMIC-PIC-NEXT:    move.l (%a0), %a0
1368; ATOMIC-PIC-NEXT:    move.l (4,%a0), %d1
1369; ATOMIC-PIC-NEXT:    move.l %d1, %d0
1370; ATOMIC-PIC-NEXT:  .LBB14_1: ; %atomicrmw.start
1371; ATOMIC-PIC-NEXT:    ; =>This Inner Loop Header: Depth=1
1372; ATOMIC-PIC-NEXT:    move.l %d1, %d2
1373; ATOMIC-PIC-NEXT:    add.l #-1, %d2
1374; ATOMIC-PIC-NEXT:    cas.l %d0, %d2, (4,%a0)
1375; ATOMIC-PIC-NEXT:    move.l %d0, %d2
1376; ATOMIC-PIC-NEXT:    sub.l %d1, %d2
1377; ATOMIC-PIC-NEXT:    seq %d1
1378; ATOMIC-PIC-NEXT:    sub.b #1, %d1
1379; ATOMIC-PIC-NEXT:    move.l %d0, %d1
1380; ATOMIC-PIC-NEXT:    bne .LBB14_1
1381; ATOMIC-PIC-NEXT:  ; %bb.2: ; %atomicrmw.end
1382; ATOMIC-PIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
1383; ATOMIC-PIC-NEXT:    adda.l #4, %sp
1384; ATOMIC-PIC-NEXT:    rts
1385start:
1386  %self1 = load ptr, ptr %self, align 2
1387  %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 4
1388  %6 = atomicrmw sub ptr %_18.i.i, i32 1 release, align 4
1389  ret i32 %6
1390}
1391