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
13 define 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
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
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
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
95 define 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
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
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
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
177 define 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
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
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
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
255 define 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
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
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
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
311 define 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
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
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
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
393 define 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
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
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
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
485 define 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
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
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
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
581 define 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
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
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
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
777 define 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
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
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
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
877 define 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
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
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
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
977 define 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
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
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
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
1052 %old = atomicrmw xchg ptr %ptr, i16 %val monotonic
1056 define 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
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
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
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
1127 %old = atomicrmw xchg ptr %ptr, i32 %val monotonic
1131 define 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
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
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
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
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
1218 define 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
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
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
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
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
1305 define 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
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
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
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
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