@@ -117,43 +117,41 @@ define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) {
117
117
; CHECK-LABEL: atomicrmw_uinc_wrap_i64:
118
118
; CHECK: .cfi_startproc
119
119
; CHECK-NEXT: ! %bb.0:
120
- ; CHECK-NEXT: save %sp, -96 , %sp
120
+ ; CHECK-NEXT: save %sp, -104 , %sp
121
121
; CHECK-NEXT: .cfi_def_cfa_register %fp
122
122
; CHECK-NEXT: .cfi_window_save
123
123
; CHECK-NEXT: .cfi_register %o7, %i7
124
- ; CHECK-NEXT: membar #LoadLoad | #StoreLoad | #LoadStore | #StoreStore
125
- ; CHECK-NEXT: ldd [%i0], %i4
124
+ ; CHECK-NEXT: ldd [%i0], %g2
125
+ ; CHECK-NEXT: add %fp, -8, %i3
126
+ ; CHECK-NEXT: mov 5, %i4
126
127
; CHECK-NEXT: .LBB3_1: ! %atomicrmw.start
127
128
; CHECK-NEXT: ! =>This Inner Loop Header: Depth=1
128
- ; CHECK-NEXT: mov %g0, %i3
129
- ; CHECK-NEXT: mov %g0, %g2
130
- ; CHECK-NEXT: addcc %i5, 1, %o4
131
- ; CHECK-NEXT: addxcc %i4, 0, %o3
132
- ; CHECK-NEXT: cmp %i4, %i1
133
- ; CHECK-NEXT: movcc %icc, 1, %i3
134
- ; CHECK-NEXT: cmp %i5, %i2
135
- ; CHECK-NEXT: movcc %icc, 1, %g2
136
- ; CHECK-NEXT: cmp %i4, %i1
137
- ; CHECK-NEXT: move %icc, %g2, %i3
138
- ; CHECK-NEXT: cmp %i3, 0
129
+ ; CHECK-NEXT: mov %g0, %i5
130
+ ; CHECK-NEXT: mov %g0, %g4
131
+ ; CHECK-NEXT: addcc %g3, 1, %o3
132
+ ; CHECK-NEXT: addxcc %g2, 0, %o2
133
+ ; CHECK-NEXT: cmp %g2, %i1
134
+ ; CHECK-NEXT: movcc %icc, 1, %i5
135
+ ; CHECK-NEXT: cmp %g3, %i2
136
+ ; CHECK-NEXT: movcc %icc, 1, %g4
137
+ ; CHECK-NEXT: cmp %g2, %i1
138
+ ; CHECK-NEXT: move %icc, %g4, %i5
139
+ ; CHECK-NEXT: cmp %i5, 0
140
+ ; CHECK-NEXT: movne %icc, 0, %o2
139
141
; CHECK-NEXT: movne %icc, 0, %o3
140
- ; CHECK-NEXT: movne %icc, 0, %o4
142
+ ; CHECK-NEXT: std %g2, [%fp+-8]
141
143
; CHECK-NEXT: mov %i0, %o0
142
- ; CHECK-NEXT: mov %i4, %o1
143
- ; CHECK-NEXT: call __sync_val_compare_and_swap_8
144
- ; CHECK-NEXT: mov %i5, %o2
145
- ; CHECK-NEXT: xor %o0, %i4, %i3
146
- ; CHECK-NEXT: xor %o1, %i5, %i4
147
- ; CHECK-NEXT: or %i4, %i3, %i3
148
- ; CHECK-NEXT: mov %o1, %i5
149
- ; CHECK-NEXT: cmp %i3, 0
150
- ; CHECK-NEXT: bne %icc, .LBB3_1
151
- ; CHECK-NEXT: mov %o0, %i4
144
+ ; CHECK-NEXT: mov %i3, %o1
145
+ ; CHECK-NEXT: mov %i4, %o4
146
+ ; CHECK-NEXT: call __atomic_compare_exchange_8
147
+ ; CHECK-NEXT: mov %i4, %o5
148
+ ; CHECK-NEXT: cmp %o0, 0
149
+ ; CHECK-NEXT: be %icc, .LBB3_1
150
+ ; CHECK-NEXT: ldd [%fp+-8], %g2
152
151
; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end
153
- ; CHECK-NEXT: membar #LoadLoad | #StoreLoad | #LoadStore | #StoreStore
154
- ; CHECK-NEXT: mov %i4, %i0
152
+ ; CHECK-NEXT: mov %g2, %i0
155
153
; CHECK-NEXT: ret
156
- ; CHECK-NEXT: restore %g0, %i5 , %o1
154
+ ; CHECK-NEXT: restore %g0, %g3 , %o1
157
155
%result = atomicrmw uinc_wrap ptr %ptr , i64 %val seq_cst
158
156
ret i64 %result
159
157
}
@@ -280,48 +278,46 @@ define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) {
280
278
; CHECK-LABEL: atomicrmw_udec_wrap_i64:
281
279
; CHECK: .cfi_startproc
282
280
; CHECK-NEXT: ! %bb.0:
283
- ; CHECK-NEXT: save %sp, -96 , %sp
281
+ ; CHECK-NEXT: save %sp, -104 , %sp
284
282
; CHECK-NEXT: .cfi_def_cfa_register %fp
285
283
; CHECK-NEXT: .cfi_window_save
286
284
; CHECK-NEXT: .cfi_register %o7, %i7
287
- ; CHECK-NEXT: membar #LoadLoad | #StoreLoad | #LoadStore | #StoreStore
288
- ; CHECK-NEXT: ldd [%i0], %i4
285
+ ; CHECK-NEXT: ldd [%i0], %g2
286
+ ; CHECK-NEXT: add %fp, -8, %i3
287
+ ; CHECK-NEXT: mov 5, %i4
289
288
; CHECK-NEXT: .LBB7_1: ! %atomicrmw.start
290
289
; CHECK-NEXT: ! =>This Inner Loop Header: Depth=1
291
- ; CHECK-NEXT: mov %g0, %i3
292
- ; CHECK-NEXT: mov %g0, %g2
293
- ; CHECK-NEXT: mov %g0, %g3
294
- ; CHECK-NEXT: addcc %i5, -1, %o4
295
- ; CHECK-NEXT: addxcc %i4, -1, %o3
296
- ; CHECK-NEXT: or %i5, %i4, %g4
297
- ; CHECK-NEXT: cmp %g4, 0
298
- ; CHECK-NEXT: move %icc, 1, %i3
299
- ; CHECK-NEXT: cmp %i4, %i1
300
- ; CHECK-NEXT: movgu %icc, 1, %g2
301
- ; CHECK-NEXT: cmp %i5, %i2
302
- ; CHECK-NEXT: movgu %icc, 1, %g3
303
- ; CHECK-NEXT: cmp %i4, %i1
304
- ; CHECK-NEXT: move %icc, %g3, %g2
305
- ; CHECK-NEXT: or %i3, %g2, %i3
306
- ; CHECK-NEXT: cmp %i3, 0
307
- ; CHECK-NEXT: movne %icc, %i1, %o3
308
- ; CHECK-NEXT: movne %icc, %i2, %o4
290
+ ; CHECK-NEXT: mov %g0, %i5
291
+ ; CHECK-NEXT: mov %g0, %g4
292
+ ; CHECK-NEXT: mov %g0, %l0
293
+ ; CHECK-NEXT: addcc %g3, -1, %o3
294
+ ; CHECK-NEXT: addxcc %g2, -1, %o2
295
+ ; CHECK-NEXT: or %g3, %g2, %l1
296
+ ; CHECK-NEXT: cmp %l1, 0
297
+ ; CHECK-NEXT: move %icc, 1, %i5
298
+ ; CHECK-NEXT: cmp %g2, %i1
299
+ ; CHECK-NEXT: movgu %icc, 1, %g4
300
+ ; CHECK-NEXT: cmp %g3, %i2
301
+ ; CHECK-NEXT: movgu %icc, 1, %l0
302
+ ; CHECK-NEXT: cmp %g2, %i1
303
+ ; CHECK-NEXT: move %icc, %l0, %g4
304
+ ; CHECK-NEXT: or %i5, %g4, %i5
305
+ ; CHECK-NEXT: cmp %i5, 0
306
+ ; CHECK-NEXT: movne %icc, %i1, %o2
307
+ ; CHECK-NEXT: movne %icc, %i2, %o3
308
+ ; CHECK-NEXT: std %g2, [%fp+-8]
309
309
; CHECK-NEXT: mov %i0, %o0
310
- ; CHECK-NEXT: mov %i4, %o1
311
- ; CHECK-NEXT: call __sync_val_compare_and_swap_8
312
- ; CHECK-NEXT: mov %i5, %o2
313
- ; CHECK-NEXT: xor %o0, %i4, %i3
314
- ; CHECK-NEXT: xor %o1, %i5, %i4
315
- ; CHECK-NEXT: or %i4, %i3, %i3
316
- ; CHECK-NEXT: mov %o1, %i5
317
- ; CHECK-NEXT: cmp %i3, 0
318
- ; CHECK-NEXT: bne %icc, .LBB7_1
319
- ; CHECK-NEXT: mov %o0, %i4
310
+ ; CHECK-NEXT: mov %i3, %o1
311
+ ; CHECK-NEXT: mov %i4, %o4
312
+ ; CHECK-NEXT: call __atomic_compare_exchange_8
313
+ ; CHECK-NEXT: mov %i4, %o5
314
+ ; CHECK-NEXT: cmp %o0, 0
315
+ ; CHECK-NEXT: be %icc, .LBB7_1
316
+ ; CHECK-NEXT: ldd [%fp+-8], %g2
320
317
; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end
321
- ; CHECK-NEXT: membar #LoadLoad | #StoreLoad | #LoadStore | #StoreStore
322
- ; CHECK-NEXT: mov %i4, %i0
318
+ ; CHECK-NEXT: mov %g2, %i0
323
319
; CHECK-NEXT: ret
324
- ; CHECK-NEXT: restore %g0, %i5 , %o1
320
+ ; CHECK-NEXT: restore %g0, %g3 , %o1
325
321
%result = atomicrmw udec_wrap ptr %ptr , i64 %val seq_cst
326
322
ret i64 %result
327
323
}
0 commit comments