xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx2-arith.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=+avx2 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddq %ymm
4*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_vpaddq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
5*9880d681SAndroid Build Coastguard Worker  %x = add <4 x i64> %i, %j
6*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %x
7*9880d681SAndroid Build Coastguard Worker}
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddd %ymm
10*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_vpaddd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
11*9880d681SAndroid Build Coastguard Worker  %x = add <8 x i32> %i, %j
12*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %x
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddw %ymm
16*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_vpaddw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
17*9880d681SAndroid Build Coastguard Worker  %x = add <16 x i16> %i, %j
18*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %x
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddb %ymm
22*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @test_vpaddb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
23*9880d681SAndroid Build Coastguard Worker  %x = add <32 x i8> %i, %j
24*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %x
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubq %ymm
28*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_vpsubq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
29*9880d681SAndroid Build Coastguard Worker  %x = sub <4 x i64> %i, %j
30*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %x
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubd %ymm
34*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_vpsubd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
35*9880d681SAndroid Build Coastguard Worker  %x = sub <8 x i32> %i, %j
36*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %x
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubw %ymm
40*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_vpsubw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
41*9880d681SAndroid Build Coastguard Worker  %x = sub <16 x i16> %i, %j
42*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %x
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubb %ymm
46*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @test_vpsubb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
47*9880d681SAndroid Build Coastguard Worker  %x = sub <32 x i8> %i, %j
48*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %x
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld %ymm
52*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_vpmulld(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
53*9880d681SAndroid Build Coastguard Worker  %x = mul <8 x i32> %i, %j
54*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %x
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; CHECK: vpmullw %ymm
58*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_vpmullw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
59*9880d681SAndroid Build Coastguard Worker  %x = mul <16 x i16> %i, %j
60*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %x
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; CHECK: mul-v16i8
64*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmovsxbw %xmm1, %ymm1
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmovsxbw %xmm0, %ymm0
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmullw %ymm1, %ymm0, %ymm0
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vextracti128 $1, %ymm0, %xmm1
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpshufb %xmm2, %xmm1, %xmm1
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpshufb %xmm2, %xmm0, %xmm0
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vzeroupper
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  retq
75*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @mul-v16i8(<16 x i8> %i, <16 x i8> %j) nounwind readnone {
76*9880d681SAndroid Build Coastguard Worker  %x = mul <16 x i8> %i, %j
77*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %x
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; CHECK: mul-v32i8
81*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vextracti128 $1, %ymm1, %xmm2
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmovsxbw %xmm2, %ymm2
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vextracti128 $1, %ymm0, %xmm3
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmovsxbw %xmm3, %ymm3
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmullw %ymm2, %ymm3, %ymm2
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vextracti128 $1, %ymm2, %xmm3
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpshufb %xmm4, %xmm3, %xmm3
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpshufb %xmm4, %xmm2, %xmm2
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmovsxbw %xmm1, %ymm1
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmovsxbw %xmm0, %ymm0
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpmullw %ymm1, %ymm0, %ymm0
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vextracti128 $1, %ymm0, %xmm1
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpshufb %xmm4, %xmm1, %xmm1
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpshufb %xmm4, %xmm0, %xmm0
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  vinserti128 $1, %xmm2, %ymm0, %ymm0
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  retq
101*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @mul-v32i8(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
102*9880d681SAndroid Build Coastguard Worker  %x = mul <32 x i8> %i, %j
103*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %x
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker; CHECK: mul-v4i64
107*9880d681SAndroid Build Coastguard Worker; CHECK: vpmuludq %ymm
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsrlq $32, %ymm
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmuludq %ymm
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsllq $32, %ymm
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpaddq %ymm
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsrlq $32, %ymm
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmuludq %ymm
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsllq $32, %ymm
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpaddq %ymm
116*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @mul-v4i64(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
117*9880d681SAndroid Build Coastguard Worker  %x = mul <4 x i64> %i, %j
118*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %x
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const1
122*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddd
123*9880d681SAndroid Build Coastguard Worker; CHECK: ret
124*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const1(<8 x i32> %x) {
125*9880d681SAndroid Build Coastguard Worker  %y = mul <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
126*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %y
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const2
130*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllq  $2
131*9880d681SAndroid Build Coastguard Worker; CHECK: ret
132*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @mul_const2(<4 x i64> %x) {
133*9880d681SAndroid Build Coastguard Worker  %y = mul <4 x i64> %x, <i64 4, i64 4, i64 4, i64 4>
134*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %y
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const3
138*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllw  $3
139*9880d681SAndroid Build Coastguard Worker; CHECK: ret
140*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @mul_const3(<16 x i16> %x) {
141*9880d681SAndroid Build Coastguard Worker  %y = mul <16 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
142*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %y
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const4
146*9880d681SAndroid Build Coastguard Worker; CHECK: vpxor
147*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubq
148*9880d681SAndroid Build Coastguard Worker; CHECK: ret
149*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @mul_const4(<4 x i64> %x) {
150*9880d681SAndroid Build Coastguard Worker  %y = mul <4 x i64> %x, <i64 -1, i64 -1, i64 -1, i64 -1>
151*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %y
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const5
155*9880d681SAndroid Build Coastguard Worker; CHECK: vxorps
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
157*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const5(<8 x i32> %x) {
158*9880d681SAndroid Build Coastguard Worker  %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
159*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %y
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const6
163*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld
164*9880d681SAndroid Build Coastguard Worker; CHECK: ret
165*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const6(<8 x i32> %x) {
166*9880d681SAndroid Build Coastguard Worker  %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 2, i32 0, i32 2, i32 0, i32 0>
167*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %y
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const7
171*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddq
172*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddq
173*9880d681SAndroid Build Coastguard Worker; CHECK: ret
174*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @mul_const7(<8 x i64> %x) {
175*9880d681SAndroid Build Coastguard Worker  %y = mul <8 x i64> %x, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
176*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %y
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const8
180*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllw  $3
181*9880d681SAndroid Build Coastguard Worker; CHECK: ret
182*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @mul_const8(<8 x i16> %x) {
183*9880d681SAndroid Build Coastguard Worker  %y = mul <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
184*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %y
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const9
188*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld
189*9880d681SAndroid Build Coastguard Worker; CHECK: ret
190*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const9(<8 x i32> %x) {
191*9880d681SAndroid Build Coastguard Worker  %y = mul <8 x i32> %x, <i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
192*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %y
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const10
196*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld
197*9880d681SAndroid Build Coastguard Worker; CHECK: ret
198*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mul_const10(<4 x i32> %x) {
199*9880d681SAndroid Build Coastguard Worker  ; %x * 0x01010101
200*9880d681SAndroid Build Coastguard Worker  %m = mul <4 x i32> %x, <i32 16843009, i32 16843009, i32 16843009, i32 16843009>
201*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %m
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const11
205*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld
206*9880d681SAndroid Build Coastguard Worker; CHECK: ret
207*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mul_const11(<4 x i32> %x) {
208*9880d681SAndroid Build Coastguard Worker  ; %x * 0x80808080
209*9880d681SAndroid Build Coastguard Worker  %m = mul <4 x i32> %x, <i32 2155905152, i32 2155905152, i32 2155905152, i32 2155905152>
210*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %m
211*9880d681SAndroid Build Coastguard Worker}
212