xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/combine-64bit-vec-binop.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=SSE41
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=AVX
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine double @test1_add(double %A, double %B) {
6*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
7*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x i32>
8*9880d681SAndroid Build Coastguard Worker  %add = add <2 x i32> %1, %2
9*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x i32> %add to double
10*9880d681SAndroid Build Coastguard Worker  ret double %3
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_add
13*9880d681SAndroid Build Coastguard Worker; SSE41: paddd
14*9880d681SAndroid Build Coastguard Worker; AVX: vpaddd
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine double @test2_add(double %A, double %B) {
19*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
20*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <4 x i16>
21*9880d681SAndroid Build Coastguard Worker  %add = add <4 x i16> %1, %2
22*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <4 x i16> %add to double
23*9880d681SAndroid Build Coastguard Worker  ret double %3
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_add
26*9880d681SAndroid Build Coastguard Worker; SSE41: paddw
27*9880d681SAndroid Build Coastguard Worker; AVX: vpaddw
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine double @test3_add(double %A, double %B) {
31*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
32*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <8 x i8>
33*9880d681SAndroid Build Coastguard Worker  %add = add <8 x i8> %1, %2
34*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <8 x i8> %add to double
35*9880d681SAndroid Build Coastguard Worker  ret double %3
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_add
38*9880d681SAndroid Build Coastguard Worker; SSE41: paddb
39*9880d681SAndroid Build Coastguard Worker; AVX: vpaddb
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine double @test1_sub(double %A, double %B) {
44*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
45*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x i32>
46*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i32> %1, %2
47*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x i32> %sub to double
48*9880d681SAndroid Build Coastguard Worker  ret double %3
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_sub
51*9880d681SAndroid Build Coastguard Worker; SSE41: psubd
52*9880d681SAndroid Build Coastguard Worker; AVX: vpsubd
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine double @test2_sub(double %A, double %B) {
57*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
58*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <4 x i16>
59*9880d681SAndroid Build Coastguard Worker  %sub = sub <4 x i16> %1, %2
60*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <4 x i16> %sub to double
61*9880d681SAndroid Build Coastguard Worker  ret double %3
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_sub
64*9880d681SAndroid Build Coastguard Worker; SSE41: psubw
65*9880d681SAndroid Build Coastguard Worker; AVX: vpsubw
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine double @test3_sub(double %A, double %B) {
70*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
71*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <8 x i8>
72*9880d681SAndroid Build Coastguard Worker  %sub = sub <8 x i8> %1, %2
73*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <8 x i8> %sub to double
74*9880d681SAndroid Build Coastguard Worker  ret double %3
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_sub
77*9880d681SAndroid Build Coastguard Worker; SSE41: psubb
78*9880d681SAndroid Build Coastguard Worker; AVX: vpsubb
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine double @test1_mul(double %A, double %B) {
83*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
84*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x i32>
85*9880d681SAndroid Build Coastguard Worker  %mul = mul <2 x i32> %1, %2
86*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x i32> %mul to double
87*9880d681SAndroid Build Coastguard Worker  ret double %3
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_mul
90*9880d681SAndroid Build Coastguard Worker; SSE41: pmulld
91*9880d681SAndroid Build Coastguard Worker; AVX: vpmulld
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine double @test2_mul(double %A, double %B) {
96*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
97*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <4 x i16>
98*9880d681SAndroid Build Coastguard Worker  %mul = mul <4 x i16> %1, %2
99*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <4 x i16> %mul to double
100*9880d681SAndroid Build Coastguard Worker  ret double %3
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_mul
103*9880d681SAndroid Build Coastguard Worker; SSE41: pmullw
104*9880d681SAndroid Build Coastguard Worker; AVX: vpmullw
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; There is no legal ISD::MUL with type MVT::v8i16.
108*9880d681SAndroid Build Coastguard Workerdefine double @test3_mul(double %A, double %B) {
109*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
110*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <8 x i8>
111*9880d681SAndroid Build Coastguard Worker  %mul = mul <8 x i8> %1, %2
112*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <8 x i8> %mul to double
113*9880d681SAndroid Build Coastguard Worker  ret double %3
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_mul
116*9880d681SAndroid Build Coastguard Worker; CHECK: pmullw
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufb
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdefine double @test1_and(double %A, double %B) {
122*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
123*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x i32>
124*9880d681SAndroid Build Coastguard Worker  %and = and <2 x i32> %1, %2
125*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x i32> %and to double
126*9880d681SAndroid Build Coastguard Worker  ret double %3
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_and
129*9880d681SAndroid Build Coastguard Worker; SSE41: andps
130*9880d681SAndroid Build Coastguard Worker; AVX: vandps
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine double @test2_and(double %A, double %B) {
135*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
136*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <4 x i16>
137*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i16> %1, %2
138*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <4 x i16> %and to double
139*9880d681SAndroid Build Coastguard Worker  ret double %3
140*9880d681SAndroid Build Coastguard Worker}
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_and
142*9880d681SAndroid Build Coastguard Worker; SSE41: andps
143*9880d681SAndroid Build Coastguard Worker; AVX: vandps
144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine double @test3_and(double %A, double %B) {
148*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
149*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <8 x i8>
150*9880d681SAndroid Build Coastguard Worker  %and = and <8 x i8> %1, %2
151*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <8 x i8> %and to double
152*9880d681SAndroid Build Coastguard Worker  ret double %3
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_and
155*9880d681SAndroid Build Coastguard Worker; SSE41: andps
156*9880d681SAndroid Build Coastguard Worker; AVX: vandps
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerdefine double @test1_or(double %A, double %B) {
161*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
162*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x i32>
163*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i32> %1, %2
164*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x i32> %or to double
165*9880d681SAndroid Build Coastguard Worker  ret double %3
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_or
168*9880d681SAndroid Build Coastguard Worker; SSE41: orps
169*9880d681SAndroid Build Coastguard Worker; AVX: vorps
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine double @test2_or(double %A, double %B) {
174*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
175*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <4 x i16>
176*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i16> %1, %2
177*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <4 x i16> %or to double
178*9880d681SAndroid Build Coastguard Worker  ret double %3
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_or
181*9880d681SAndroid Build Coastguard Worker; SSE41: orps
182*9880d681SAndroid Build Coastguard Worker; AVX: vorps
183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerdefine double @test3_or(double %A, double %B) {
187*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
188*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <8 x i8>
189*9880d681SAndroid Build Coastguard Worker  %or = or <8 x i8> %1, %2
190*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <8 x i8> %or to double
191*9880d681SAndroid Build Coastguard Worker  ret double %3
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_or
194*9880d681SAndroid Build Coastguard Worker; SSE41: orps
195*9880d681SAndroid Build Coastguard Worker; AVX: vorps
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdefine double @test1_xor(double %A, double %B) {
200*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
201*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x i32>
202*9880d681SAndroid Build Coastguard Worker  %xor = xor <2 x i32> %1, %2
203*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x i32> %xor to double
204*9880d681SAndroid Build Coastguard Worker  ret double %3
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_xor
207*9880d681SAndroid Build Coastguard Worker; SSE41: xorps
208*9880d681SAndroid Build Coastguard Worker; AVX: vxorps
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workerdefine double @test2_xor(double %A, double %B) {
213*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
214*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <4 x i16>
215*9880d681SAndroid Build Coastguard Worker  %xor = xor <4 x i16> %1, %2
216*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <4 x i16> %xor to double
217*9880d681SAndroid Build Coastguard Worker  ret double %3
218*9880d681SAndroid Build Coastguard Worker}
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_xor
220*9880d681SAndroid Build Coastguard Worker; SSE41: xorps
221*9880d681SAndroid Build Coastguard Worker; AVX: vxorps
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdefine double @test3_xor(double %A, double %B) {
226*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
227*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <8 x i8>
228*9880d681SAndroid Build Coastguard Worker  %xor = xor <8 x i8> %1, %2
229*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <8 x i8> %xor to double
230*9880d681SAndroid Build Coastguard Worker  ret double %3
231*9880d681SAndroid Build Coastguard Worker}
232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_xor
233*9880d681SAndroid Build Coastguard Worker; SSE41: xorps
234*9880d681SAndroid Build Coastguard Worker; AVX: vxorps
235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Workerdefine double @test_fadd(double %A, double %B) {
239*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x float>
240*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x float>
241*9880d681SAndroid Build Coastguard Worker  %add = fadd <2 x float> %1, %2
242*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x float> %add to double
243*9880d681SAndroid Build Coastguard Worker  ret double %3
244*9880d681SAndroid Build Coastguard Worker}
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fadd
246*9880d681SAndroid Build Coastguard Worker; SSE41: addps
247*9880d681SAndroid Build Coastguard Worker; AVX: vaddps
248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Workerdefine double @test_fsub(double %A, double %B) {
251*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x float>
252*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x float>
253*9880d681SAndroid Build Coastguard Worker  %sub = fsub <2 x float> %1, %2
254*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x float> %sub to double
255*9880d681SAndroid Build Coastguard Worker  ret double %3
256*9880d681SAndroid Build Coastguard Worker}
257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fsub
258*9880d681SAndroid Build Coastguard Worker; SSE41: subps
259*9880d681SAndroid Build Coastguard Worker; AVX: vsubps
260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Workerdefine double @test_fmul(double %A, double %B) {
263*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x float>
264*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x float>
265*9880d681SAndroid Build Coastguard Worker  %mul = fmul <2 x float> %1, %2
266*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x float> %mul to double
267*9880d681SAndroid Build Coastguard Worker  ret double %3
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmul
270*9880d681SAndroid Build Coastguard Worker; SSE41: mulps
271*9880d681SAndroid Build Coastguard Worker; AVX: vmulps
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
273*9880d681SAndroid Build Coastguard Worker
274