xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/atomic64.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker@sc64 = external global i64
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_add64() nounwind {
6*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_add64:
7*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_add64:
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw add  i64* @sc64, i64 1 acquire
10*9880d681SAndroid Build Coastguard Worker; X64:       lock
11*9880d681SAndroid Build Coastguard Worker; X64:       incq
12*9880d681SAndroid Build Coastguard Worker  %t2 = atomicrmw add  i64* @sc64, i64 3 acquire
13*9880d681SAndroid Build Coastguard Worker; X64:       lock
14*9880d681SAndroid Build Coastguard Worker; X64:       addq $3
15*9880d681SAndroid Build Coastguard Worker  %t3 = atomicrmw add  i64* @sc64, i64 5 acquire
16*9880d681SAndroid Build Coastguard Worker; X64:       lock
17*9880d681SAndroid Build Coastguard Worker; X64:       xaddq
18*9880d681SAndroid Build Coastguard Worker  %t4 = atomicrmw add  i64* @sc64, i64 %t3 acquire
19*9880d681SAndroid Build Coastguard Worker; X64:       lock
20*9880d681SAndroid Build Coastguard Worker; X64:       addq
21*9880d681SAndroid Build Coastguard Worker  ret void
22*9880d681SAndroid Build Coastguard Worker; X64:       ret
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_sub64() nounwind {
26*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_sub64:
27*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_sub64:
28*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw sub  i64* @sc64, i64 1 acquire
29*9880d681SAndroid Build Coastguard Worker; X64:       lock
30*9880d681SAndroid Build Coastguard Worker; X64:       decq
31*9880d681SAndroid Build Coastguard Worker  %t2 = atomicrmw sub  i64* @sc64, i64 3 acquire
32*9880d681SAndroid Build Coastguard Worker; X64:       lock
33*9880d681SAndroid Build Coastguard Worker; X64:       subq $3
34*9880d681SAndroid Build Coastguard Worker  %t3 = atomicrmw sub  i64* @sc64, i64 5 acquire
35*9880d681SAndroid Build Coastguard Worker; X64:       lock
36*9880d681SAndroid Build Coastguard Worker; X64:       xaddq
37*9880d681SAndroid Build Coastguard Worker  %t4 = atomicrmw sub  i64* @sc64, i64 %t3 acquire
38*9880d681SAndroid Build Coastguard Worker; X64:       lock
39*9880d681SAndroid Build Coastguard Worker; X64:       subq
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker; X64:       ret
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_and64() nounwind {
45*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_and64:
46*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_and64:
47*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw and  i64* @sc64, i64 3 acquire
48*9880d681SAndroid Build Coastguard Worker; X64:       lock
49*9880d681SAndroid Build Coastguard Worker; X64:       andq $3
50*9880d681SAndroid Build Coastguard Worker  %t2 = atomicrmw and  i64* @sc64, i64 5 acquire
51*9880d681SAndroid Build Coastguard Worker; X64:       andl
52*9880d681SAndroid Build Coastguard Worker; X64:       lock
53*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
54*9880d681SAndroid Build Coastguard Worker  %t3 = atomicrmw and  i64* @sc64, i64 %t2 acquire
55*9880d681SAndroid Build Coastguard Worker; X64:       lock
56*9880d681SAndroid Build Coastguard Worker; X64:       andq
57*9880d681SAndroid Build Coastguard Worker  ret void
58*9880d681SAndroid Build Coastguard Worker; X64:       ret
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_or64() nounwind {
62*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_or64:
63*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_or64:
64*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw or   i64* @sc64, i64 3 acquire
65*9880d681SAndroid Build Coastguard Worker; X64:       lock
66*9880d681SAndroid Build Coastguard Worker; X64:       orq $3
67*9880d681SAndroid Build Coastguard Worker  %t2 = atomicrmw or   i64* @sc64, i64 5 acquire
68*9880d681SAndroid Build Coastguard Worker; X64:       orq
69*9880d681SAndroid Build Coastguard Worker; X64:       lock
70*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
71*9880d681SAndroid Build Coastguard Worker  %t3 = atomicrmw or   i64* @sc64, i64 %t2 acquire
72*9880d681SAndroid Build Coastguard Worker; X64:       lock
73*9880d681SAndroid Build Coastguard Worker; X64:       orq
74*9880d681SAndroid Build Coastguard Worker  ret void
75*9880d681SAndroid Build Coastguard Worker; X64:       ret
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_xor64() nounwind {
79*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_xor64:
80*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_xor64:
81*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw xor  i64* @sc64, i64 3 acquire
82*9880d681SAndroid Build Coastguard Worker; X64:       lock
83*9880d681SAndroid Build Coastguard Worker; X64:       xorq $3
84*9880d681SAndroid Build Coastguard Worker  %t2 = atomicrmw xor  i64* @sc64, i64 5 acquire
85*9880d681SAndroid Build Coastguard Worker; X64:       xorq
86*9880d681SAndroid Build Coastguard Worker; X64:       lock
87*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
88*9880d681SAndroid Build Coastguard Worker  %t3 = atomicrmw xor  i64* @sc64, i64 %t2 acquire
89*9880d681SAndroid Build Coastguard Worker; X64:       lock
90*9880d681SAndroid Build Coastguard Worker; X64:       xorq
91*9880d681SAndroid Build Coastguard Worker  ret void
92*9880d681SAndroid Build Coastguard Worker; X64:       ret
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_nand64(i64 %x) nounwind {
96*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_nand64:
97*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_nand64:
98*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw nand i64* @sc64, i64 %x acquire
99*9880d681SAndroid Build Coastguard Worker; X64:       andq
100*9880d681SAndroid Build Coastguard Worker; X64:       notq
101*9880d681SAndroid Build Coastguard Worker; X64:       lock
102*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
103*9880d681SAndroid Build Coastguard Worker; X32:       andl
104*9880d681SAndroid Build Coastguard Worker; X32:       andl
105*9880d681SAndroid Build Coastguard Worker; X32:       notl
106*9880d681SAndroid Build Coastguard Worker; X32:       notl
107*9880d681SAndroid Build Coastguard Worker; X32:       lock
108*9880d681SAndroid Build Coastguard Worker; X32:       cmpxchg8b
109*9880d681SAndroid Build Coastguard Worker  ret void
110*9880d681SAndroid Build Coastguard Worker; X64:       ret
111*9880d681SAndroid Build Coastguard Worker; X32:       ret
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_max64(i64 %x) nounwind {
115*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_max64:
116*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_max64:
117*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw max  i64* @sc64, i64 %x acquire
118*9880d681SAndroid Build Coastguard Worker; X64:       subq
119*9880d681SAndroid Build Coastguard Worker; X64:       cmov
120*9880d681SAndroid Build Coastguard Worker; X64:       lock
121*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
124*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
125*9880d681SAndroid Build Coastguard Worker; X32:       cmov
126*9880d681SAndroid Build Coastguard Worker; X32:       cmov
127*9880d681SAndroid Build Coastguard Worker; X32:       cmov
128*9880d681SAndroid Build Coastguard Worker; X32:       lock
129*9880d681SAndroid Build Coastguard Worker; X32:       cmpxchg8b
130*9880d681SAndroid Build Coastguard Worker  ret void
131*9880d681SAndroid Build Coastguard Worker; X64:       ret
132*9880d681SAndroid Build Coastguard Worker; X32:       ret
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_min64(i64 %x) nounwind {
136*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_min64:
137*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_min64:
138*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw min  i64* @sc64, i64 %x acquire
139*9880d681SAndroid Build Coastguard Worker; X64:       subq
140*9880d681SAndroid Build Coastguard Worker; X64:       cmov
141*9880d681SAndroid Build Coastguard Worker; X64:       lock
142*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
145*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
146*9880d681SAndroid Build Coastguard Worker; X32:       cmov
147*9880d681SAndroid Build Coastguard Worker; X32:       cmov
148*9880d681SAndroid Build Coastguard Worker; X32:       cmov
149*9880d681SAndroid Build Coastguard Worker; X32:       lock
150*9880d681SAndroid Build Coastguard Worker; X32:       cmpxchg8b
151*9880d681SAndroid Build Coastguard Worker  ret void
152*9880d681SAndroid Build Coastguard Worker; X64:       ret
153*9880d681SAndroid Build Coastguard Worker; X32:       ret
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_umax64(i64 %x) nounwind {
157*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_umax64:
158*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_umax64:
159*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw umax i64* @sc64, i64 %x acquire
160*9880d681SAndroid Build Coastguard Worker; X64:       subq
161*9880d681SAndroid Build Coastguard Worker; X64:       cmov
162*9880d681SAndroid Build Coastguard Worker; X64:       lock
163*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
166*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
167*9880d681SAndroid Build Coastguard Worker; X32:       cmov
168*9880d681SAndroid Build Coastguard Worker; X32:       cmov
169*9880d681SAndroid Build Coastguard Worker; X32:       cmov
170*9880d681SAndroid Build Coastguard Worker; X32:       lock
171*9880d681SAndroid Build Coastguard Worker; X32:       cmpxchg8b
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker; X64:       ret
174*9880d681SAndroid Build Coastguard Worker; X32:       ret
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_umin64(i64 %x) nounwind {
178*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_umin64:
179*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_umin64:
180*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw umin i64* @sc64, i64 %x acquire
181*9880d681SAndroid Build Coastguard Worker; X64:       subq
182*9880d681SAndroid Build Coastguard Worker; X64:       cmov
183*9880d681SAndroid Build Coastguard Worker; X64:       lock
184*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
187*9880d681SAndroid Build Coastguard Worker; X32:       cmpl
188*9880d681SAndroid Build Coastguard Worker; X32:       cmov
189*9880d681SAndroid Build Coastguard Worker; X32:       cmov
190*9880d681SAndroid Build Coastguard Worker; X32:       cmov
191*9880d681SAndroid Build Coastguard Worker; X32:       lock
192*9880d681SAndroid Build Coastguard Worker; X32:       cmpxchg8b
193*9880d681SAndroid Build Coastguard Worker  ret void
194*9880d681SAndroid Build Coastguard Worker; X64:       ret
195*9880d681SAndroid Build Coastguard Worker; X32:       ret
196*9880d681SAndroid Build Coastguard Worker}
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_cmpxchg64() nounwind {
199*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_cmpxchg64:
200*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_cmpxchg64:
201*9880d681SAndroid Build Coastguard Worker  %t1 = cmpxchg i64* @sc64, i64 0, i64 1 acquire acquire
202*9880d681SAndroid Build Coastguard Worker; X64:       lock
203*9880d681SAndroid Build Coastguard Worker; X64:       cmpxchgq
204*9880d681SAndroid Build Coastguard Worker; X32:       lock
205*9880d681SAndroid Build Coastguard Worker; X32:       cmpxchg8b
206*9880d681SAndroid Build Coastguard Worker  ret void
207*9880d681SAndroid Build Coastguard Worker; X64:       ret
208*9880d681SAndroid Build Coastguard Worker; X32:       ret
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_store64(i64 %x) nounwind {
212*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_store64:
213*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_store64:
214*9880d681SAndroid Build Coastguard Worker  store atomic i64 %x, i64* @sc64 release, align 8
215*9880d681SAndroid Build Coastguard Worker; X64-NOT:   lock
216*9880d681SAndroid Build Coastguard Worker; X64:       movq
217*9880d681SAndroid Build Coastguard Worker; X32:       lock
218*9880d681SAndroid Build Coastguard Worker; X32:       cmpxchg8b
219*9880d681SAndroid Build Coastguard Worker  ret void
220*9880d681SAndroid Build Coastguard Worker; X64:       ret
221*9880d681SAndroid Build Coastguard Worker; X32:       ret
222*9880d681SAndroid Build Coastguard Worker}
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Workerdefine void @atomic_fetch_swap64(i64 %x) nounwind {
225*9880d681SAndroid Build Coastguard Worker; X64-LABEL:   atomic_fetch_swap64:
226*9880d681SAndroid Build Coastguard Worker; X32-LABEL:   atomic_fetch_swap64:
227*9880d681SAndroid Build Coastguard Worker  %t1 = atomicrmw xchg i64* @sc64, i64 %x acquire
228*9880d681SAndroid Build Coastguard Worker; X64-NOT:   lock
229*9880d681SAndroid Build Coastguard Worker; X64:       xchgq
230*9880d681SAndroid Build Coastguard Worker; X32:       lock
231*9880d681SAndroid Build Coastguard Worker; X32:       xchg8b
232*9880d681SAndroid Build Coastguard Worker  ret void
233*9880d681SAndroid Build Coastguard Worker; X64:       ret
234*9880d681SAndroid Build Coastguard Worker; X32:       ret
235*9880d681SAndroid Build Coastguard Worker}
236