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