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