xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/atomic_add.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -verify-machineinstrs | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mattr=slow-incdec -verify-machineinstrs | FileCheck %s --check-prefix SLOW_INC
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; rdar://7103704
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine void @sub1(i32* nocapture %p, i32 %v) nounwind ssp {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub1:
9*9880d681SAndroid Build Coastguard Worker; CHECK: subl
10*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i32* %p, i32 %v monotonic
11*9880d681SAndroid Build Coastguard Worker  ret void
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine void @inc4(i64* nocapture %p) nounwind ssp {
15*9880d681SAndroid Build Coastguard Workerentry:
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc4:
17*9880d681SAndroid Build Coastguard Worker; CHECK: incq
18*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc4:
19*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incq
20*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i64* %p, i64 1 monotonic
21*9880d681SAndroid Build Coastguard Worker  ret void
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine void @add8(i64* nocapture %p) nounwind ssp {
25*9880d681SAndroid Build Coastguard Workerentry:
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add8:
27*9880d681SAndroid Build Coastguard Worker; CHECK: addq $2
28*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i64* %p, i64 2 monotonic
29*9880d681SAndroid Build Coastguard Worker  ret void
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine void @add4(i64* nocapture %p, i32 %v) nounwind ssp {
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add4:
35*9880d681SAndroid Build Coastguard Worker; CHECK: addq
36*9880d681SAndroid Build Coastguard Worker  %0 = sext i32 %v to i64		; <i64> [#uses=1]
37*9880d681SAndroid Build Coastguard Worker  %1 = atomicrmw add i64* %p, i64 %0 monotonic
38*9880d681SAndroid Build Coastguard Worker  ret void
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine void @inc3(i8* nocapture %p) nounwind ssp {
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc3:
44*9880d681SAndroid Build Coastguard Worker; CHECK: incb
45*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc3:
46*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incb
47*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i8* %p, i8 1 monotonic
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine void @add7(i8* nocapture %p) nounwind ssp {
52*9880d681SAndroid Build Coastguard Workerentry:
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add7:
54*9880d681SAndroid Build Coastguard Worker; CHECK: addb $2
55*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i8* %p, i8 2 monotonic
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine void @add3(i8* nocapture %p, i32 %v) nounwind ssp {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add3:
62*9880d681SAndroid Build Coastguard Worker; CHECK: addb
63*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %v to i8		; <i8> [#uses=1]
64*9880d681SAndroid Build Coastguard Worker  %1 = atomicrmw add i8* %p, i8 %0 monotonic
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine void @inc2(i16* nocapture %p) nounwind ssp {
69*9880d681SAndroid Build Coastguard Workerentry:
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc2:
71*9880d681SAndroid Build Coastguard Worker; CHECK: incw
72*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc2:
73*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incw
74*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i16* %p, i16 1 monotonic
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine void @add6(i16* nocapture %p) nounwind ssp {
79*9880d681SAndroid Build Coastguard Workerentry:
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add6:
81*9880d681SAndroid Build Coastguard Worker; CHECK: addw $2
82*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i16* %p, i16 2 monotonic
83*9880d681SAndroid Build Coastguard Worker  ret void
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine void @add2(i16* nocapture %p, i32 %v) nounwind ssp {
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add2:
89*9880d681SAndroid Build Coastguard Worker; CHECK: addw
90*9880d681SAndroid Build Coastguard Worker	%0 = trunc i32 %v to i16		; <i16> [#uses=1]
91*9880d681SAndroid Build Coastguard Worker  %1 = atomicrmw add i16* %p, i16 %0 monotonic
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine void @inc1(i32* nocapture %p) nounwind ssp {
96*9880d681SAndroid Build Coastguard Workerentry:
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc1:
98*9880d681SAndroid Build Coastguard Worker; CHECK: incl
99*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc1:
100*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incl
101*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i32* %p, i32 1 monotonic
102*9880d681SAndroid Build Coastguard Worker  ret void
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine void @add5(i32* nocapture %p) nounwind ssp {
106*9880d681SAndroid Build Coastguard Workerentry:
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add5:
108*9880d681SAndroid Build Coastguard Worker; CHECK: addl $2
109*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i32* %p, i32 2 monotonic
110*9880d681SAndroid Build Coastguard Worker  ret void
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine void @add1(i32* nocapture %p, i32 %v) nounwind ssp {
114*9880d681SAndroid Build Coastguard Workerentry:
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add1:
116*9880d681SAndroid Build Coastguard Worker; CHECK: addl
117*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i32* %p, i32 %v monotonic
118*9880d681SAndroid Build Coastguard Worker  ret void
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdefine void @dec4(i64* nocapture %p) nounwind ssp {
122*9880d681SAndroid Build Coastguard Workerentry:
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec4:
124*9880d681SAndroid Build Coastguard Worker; CHECK: decq
125*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec4:
126*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decq
127*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i64* %p, i64 1 monotonic
128*9880d681SAndroid Build Coastguard Worker  ret void
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine void @sub8(i64* nocapture %p) nounwind ssp {
132*9880d681SAndroid Build Coastguard Workerentry:
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub8:
134*9880d681SAndroid Build Coastguard Worker; CHECK: subq $2
135*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i64* %p, i64 2 monotonic
136*9880d681SAndroid Build Coastguard Worker  ret void
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine void @sub4(i64* nocapture %p, i32 %v) nounwind ssp {
140*9880d681SAndroid Build Coastguard Workerentry:
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub4:
142*9880d681SAndroid Build Coastguard Worker; CHECK: subq
143*9880d681SAndroid Build Coastguard Worker	%0 = sext i32 %v to i64		; <i64> [#uses=1]
144*9880d681SAndroid Build Coastguard Worker  %1 = atomicrmw sub i64* %p, i64 %0 monotonic
145*9880d681SAndroid Build Coastguard Worker  ret void
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdefine void @dec3(i8* nocapture %p) nounwind ssp {
149*9880d681SAndroid Build Coastguard Workerentry:
150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec3:
151*9880d681SAndroid Build Coastguard Worker; CHECK: decb
152*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec3:
153*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decb
154*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i8* %p, i8 1 monotonic
155*9880d681SAndroid Build Coastguard Worker  ret void
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine void @sub7(i8* nocapture %p) nounwind ssp {
159*9880d681SAndroid Build Coastguard Workerentry:
160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub7:
161*9880d681SAndroid Build Coastguard Worker; CHECK: subb $2
162*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i8* %p, i8 2 monotonic
163*9880d681SAndroid Build Coastguard Worker  ret void
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdefine void @sub3(i8* nocapture %p, i32 %v) nounwind ssp {
167*9880d681SAndroid Build Coastguard Workerentry:
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub3:
169*9880d681SAndroid Build Coastguard Worker; CHECK: subb
170*9880d681SAndroid Build Coastguard Worker	%0 = trunc i32 %v to i8		; <i8> [#uses=1]
171*9880d681SAndroid Build Coastguard Worker  %1 = atomicrmw sub i8* %p, i8 %0 monotonic
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdefine void @dec2(i16* nocapture %p) nounwind ssp {
176*9880d681SAndroid Build Coastguard Workerentry:
177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec2:
178*9880d681SAndroid Build Coastguard Worker; CHECK: decw
179*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec2:
180*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decw
181*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i16* %p, i16 1 monotonic
182*9880d681SAndroid Build Coastguard Worker  ret void
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine void @sub6(i16* nocapture %p) nounwind ssp {
186*9880d681SAndroid Build Coastguard Workerentry:
187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub6:
188*9880d681SAndroid Build Coastguard Worker; CHECK: subw $2
189*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i16* %p, i16 2 monotonic
190*9880d681SAndroid Build Coastguard Worker  ret void
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workerdefine void @sub2(i16* nocapture %p, i32 %v) nounwind ssp {
194*9880d681SAndroid Build Coastguard Workerentry:
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub2:
196*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: negl
197*9880d681SAndroid Build Coastguard Worker; CHECK: subw
198*9880d681SAndroid Build Coastguard Worker	%0 = trunc i32 %v to i16		; <i16> [#uses=1]
199*9880d681SAndroid Build Coastguard Worker  %1 = atomicrmw sub i16* %p, i16 %0 monotonic
200*9880d681SAndroid Build Coastguard Worker  ret void
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerdefine void @dec1(i32* nocapture %p) nounwind ssp {
204*9880d681SAndroid Build Coastguard Workerentry:
205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec1:
206*9880d681SAndroid Build Coastguard Worker; CHECK: decl
207*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec1:
208*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decl
209*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i32* %p, i32 1 monotonic
210*9880d681SAndroid Build Coastguard Worker  ret void
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine void @sub5(i32* nocapture %p) nounwind ssp {
214*9880d681SAndroid Build Coastguard Workerentry:
215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub5:
216*9880d681SAndroid Build Coastguard Worker; CHECK: subl $2
217*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i32* %p, i32 2 monotonic
218*9880d681SAndroid Build Coastguard Worker  ret void
219*9880d681SAndroid Build Coastguard Worker}
220