[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / X86 / avx2-arith.ll
blobe2e5cadf9d465f071403b7e4dc4521f6e7198fa0
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64
5 define <4 x i64> @test_vpaddq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
6 ; X32-LABEL: test_vpaddq:
7 ; X32:       # %bb.0:
8 ; X32-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
9 ; X32-NEXT:    retl
11 ; X64-LABEL: test_vpaddq:
12 ; X64:       # %bb.0:
13 ; X64-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
14 ; X64-NEXT:    retq
15   %x = add <4 x i64> %i, %j
16   ret <4 x i64> %x
19 define <8 x i32> @test_vpaddd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
20 ; X32-LABEL: test_vpaddd:
21 ; X32:       # %bb.0:
22 ; X32-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
23 ; X32-NEXT:    retl
25 ; X64-LABEL: test_vpaddd:
26 ; X64:       # %bb.0:
27 ; X64-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
28 ; X64-NEXT:    retq
29   %x = add <8 x i32> %i, %j
30   ret <8 x i32> %x
33 define <16 x i16> @test_vpaddw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
34 ; X32-LABEL: test_vpaddw:
35 ; X32:       # %bb.0:
36 ; X32-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
37 ; X32-NEXT:    retl
39 ; X64-LABEL: test_vpaddw:
40 ; X64:       # %bb.0:
41 ; X64-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
42 ; X64-NEXT:    retq
43   %x = add <16 x i16> %i, %j
44   ret <16 x i16> %x
47 define <32 x i8> @test_vpaddb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
48 ; X32-LABEL: test_vpaddb:
49 ; X32:       # %bb.0:
50 ; X32-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
51 ; X32-NEXT:    retl
53 ; X64-LABEL: test_vpaddb:
54 ; X64:       # %bb.0:
55 ; X64-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
56 ; X64-NEXT:    retq
57   %x = add <32 x i8> %i, %j
58   ret <32 x i8> %x
61 define <4 x i64> @test_vpsubq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
62 ; X32-LABEL: test_vpsubq:
63 ; X32:       # %bb.0:
64 ; X32-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
65 ; X32-NEXT:    retl
67 ; X64-LABEL: test_vpsubq:
68 ; X64:       # %bb.0:
69 ; X64-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
70 ; X64-NEXT:    retq
71   %x = sub <4 x i64> %i, %j
72   ret <4 x i64> %x
75 define <8 x i32> @test_vpsubd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
76 ; X32-LABEL: test_vpsubd:
77 ; X32:       # %bb.0:
78 ; X32-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
79 ; X32-NEXT:    retl
81 ; X64-LABEL: test_vpsubd:
82 ; X64:       # %bb.0:
83 ; X64-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
84 ; X64-NEXT:    retq
85   %x = sub <8 x i32> %i, %j
86   ret <8 x i32> %x
89 define <16 x i16> @test_vpsubw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
90 ; X32-LABEL: test_vpsubw:
91 ; X32:       # %bb.0:
92 ; X32-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
93 ; X32-NEXT:    retl
95 ; X64-LABEL: test_vpsubw:
96 ; X64:       # %bb.0:
97 ; X64-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
98 ; X64-NEXT:    retq
99   %x = sub <16 x i16> %i, %j
100   ret <16 x i16> %x
103 define <32 x i8> @test_vpsubb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
104 ; X32-LABEL: test_vpsubb:
105 ; X32:       # %bb.0:
106 ; X32-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
107 ; X32-NEXT:    retl
109 ; X64-LABEL: test_vpsubb:
110 ; X64:       # %bb.0:
111 ; X64-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
112 ; X64-NEXT:    retq
113   %x = sub <32 x i8> %i, %j
114   ret <32 x i8> %x
117 define <8 x i32> @test_vpmulld(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
118 ; X32-LABEL: test_vpmulld:
119 ; X32:       # %bb.0:
120 ; X32-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
121 ; X32-NEXT:    retl
123 ; X64-LABEL: test_vpmulld:
124 ; X64:       # %bb.0:
125 ; X64-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
126 ; X64-NEXT:    retq
127   %x = mul <8 x i32> %i, %j
128   ret <8 x i32> %x
131 define <16 x i16> @test_vpmullw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
132 ; X32-LABEL: test_vpmullw:
133 ; X32:       # %bb.0:
134 ; X32-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
135 ; X32-NEXT:    retl
137 ; X64-LABEL: test_vpmullw:
138 ; X64:       # %bb.0:
139 ; X64-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
140 ; X64-NEXT:    retq
141   %x = mul <16 x i16> %i, %j
142   ret <16 x i16> %x
145 define <16 x i8> @mul_v16i8(<16 x i8> %i, <16 x i8> %j) nounwind readnone {
146 ; X32-LABEL: mul_v16i8:
147 ; X32:       # %bb.0:
148 ; X32-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
149 ; X32-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
150 ; X32-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
151 ; X32-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
152 ; X32-NEXT:    vextracti128 $1, %ymm0, %xmm1
153 ; X32-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
154 ; X32-NEXT:    vzeroupper
155 ; X32-NEXT:    retl
157 ; X64-LABEL: mul_v16i8:
158 ; X64:       # %bb.0:
159 ; X64-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
160 ; X64-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
161 ; X64-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
162 ; X64-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
163 ; X64-NEXT:    vextracti128 $1, %ymm0, %xmm1
164 ; X64-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
165 ; X64-NEXT:    vzeroupper
166 ; X64-NEXT:    retq
167   %x = mul <16 x i8> %i, %j
168   ret <16 x i8> %x
171 define <32 x i8> @mul_v32i8(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
172 ; X32-LABEL: mul_v32i8:
173 ; X32:       # %bb.0:
174 ; X32-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
175 ; X32-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
176 ; X32-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
177 ; X32-NEXT:    vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
178 ; X32-NEXT:    vpand %ymm3, %ymm2, %ymm2
179 ; X32-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
180 ; X32-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
181 ; X32-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
182 ; X32-NEXT:    vpand %ymm3, %ymm0, %ymm0
183 ; X32-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
184 ; X32-NEXT:    retl
186 ; X64-LABEL: mul_v32i8:
187 ; X64:       # %bb.0:
188 ; X64-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
189 ; X64-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
190 ; X64-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
191 ; X64-NEXT:    vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
192 ; X64-NEXT:    vpand %ymm3, %ymm2, %ymm2
193 ; X64-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
194 ; X64-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
195 ; X64-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
196 ; X64-NEXT:    vpand %ymm3, %ymm0, %ymm0
197 ; X64-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
198 ; X64-NEXT:    retq
199   %x = mul <32 x i8> %i, %j
200   ret <32 x i8> %x
203 define <4 x i64> @mul_v4i64(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
204 ; X32-LABEL: mul_v4i64:
205 ; X32:       # %bb.0:
206 ; X32-NEXT:    vpsrlq $32, %ymm0, %ymm2
207 ; X32-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
208 ; X32-NEXT:    vpsrlq $32, %ymm1, %ymm3
209 ; X32-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
210 ; X32-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
211 ; X32-NEXT:    vpsllq $32, %ymm2, %ymm2
212 ; X32-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
213 ; X32-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
214 ; X32-NEXT:    retl
216 ; X64-LABEL: mul_v4i64:
217 ; X64:       # %bb.0:
218 ; X64-NEXT:    vpsrlq $32, %ymm0, %ymm2
219 ; X64-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
220 ; X64-NEXT:    vpsrlq $32, %ymm1, %ymm3
221 ; X64-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
222 ; X64-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
223 ; X64-NEXT:    vpsllq $32, %ymm2, %ymm2
224 ; X64-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
225 ; X64-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
226 ; X64-NEXT:    retq
227   %x = mul <4 x i64> %i, %j
228   ret <4 x i64> %x
231 define <8 x i32> @mul_const1(<8 x i32> %x) {
232 ; X32-LABEL: mul_const1:
233 ; X32:       # %bb.0:
234 ; X32-NEXT:    vpaddd %ymm0, %ymm0, %ymm0
235 ; X32-NEXT:    retl
237 ; X64-LABEL: mul_const1:
238 ; X64:       # %bb.0:
239 ; X64-NEXT:    vpaddd %ymm0, %ymm0, %ymm0
240 ; X64-NEXT:    retq
241   %y = mul <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
242   ret <8 x i32> %y
245 define <4 x i64> @mul_const2(<4 x i64> %x) {
246 ; X32-LABEL: mul_const2:
247 ; X32:       # %bb.0:
248 ; X32-NEXT:    vpsllq $2, %ymm0, %ymm0
249 ; X32-NEXT:    retl
251 ; X64-LABEL: mul_const2:
252 ; X64:       # %bb.0:
253 ; X64-NEXT:    vpsllq $2, %ymm0, %ymm0
254 ; X64-NEXT:    retq
255   %y = mul <4 x i64> %x, <i64 4, i64 4, i64 4, i64 4>
256   ret <4 x i64> %y
259 define <16 x i16> @mul_const3(<16 x i16> %x) {
260 ; X32-LABEL: mul_const3:
261 ; X32:       # %bb.0:
262 ; X32-NEXT:    vpsllw $3, %ymm0, %ymm0
263 ; X32-NEXT:    retl
265 ; X64-LABEL: mul_const3:
266 ; X64:       # %bb.0:
267 ; X64-NEXT:    vpsllw $3, %ymm0, %ymm0
268 ; X64-NEXT:    retq
269   %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>
270   ret <16 x i16> %y
273 define <4 x i64> @mul_const4(<4 x i64> %x) {
274 ; X32-LABEL: mul_const4:
275 ; X32:       # %bb.0:
276 ; X32-NEXT:    vpxor %xmm1, %xmm1, %xmm1
277 ; X32-NEXT:    vpsubq %ymm0, %ymm1, %ymm0
278 ; X32-NEXT:    retl
280 ; X64-LABEL: mul_const4:
281 ; X64:       # %bb.0:
282 ; X64-NEXT:    vpxor %xmm1, %xmm1, %xmm1
283 ; X64-NEXT:    vpsubq %ymm0, %ymm1, %ymm0
284 ; X64-NEXT:    retq
285   %y = mul <4 x i64> %x, <i64 -1, i64 -1, i64 -1, i64 -1>
286   ret <4 x i64> %y
289 define <8 x i32> @mul_const5(<8 x i32> %x) {
290 ; X32-LABEL: mul_const5:
291 ; X32:       # %bb.0:
292 ; X32-NEXT:    vxorps %xmm0, %xmm0, %xmm0
293 ; X32-NEXT:    retl
295 ; X64-LABEL: mul_const5:
296 ; X64:       # %bb.0:
297 ; X64-NEXT:    vxorps %xmm0, %xmm0, %xmm0
298 ; X64-NEXT:    retq
299   %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
300   ret <8 x i32> %y
303 define <8 x i32> @mul_const6(<8 x i32> %x) {
304 ; X32-LABEL: mul_const6:
305 ; X32:       # %bb.0:
306 ; X32-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
307 ; X32-NEXT:    retl
309 ; X64-LABEL: mul_const6:
310 ; X64:       # %bb.0:
311 ; X64-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
312 ; X64-NEXT:    retq
313   %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 2, i32 0, i32 2, i32 0, i32 0>
314   ret <8 x i32> %y
317 define <8 x i64> @mul_const7(<8 x i64> %x) {
318 ; X32-LABEL: mul_const7:
319 ; X32:       # %bb.0:
320 ; X32-NEXT:    vpaddq %ymm0, %ymm0, %ymm0
321 ; X32-NEXT:    vpaddq %ymm1, %ymm1, %ymm1
322 ; X32-NEXT:    retl
324 ; X64-LABEL: mul_const7:
325 ; X64:       # %bb.0:
326 ; X64-NEXT:    vpaddq %ymm0, %ymm0, %ymm0
327 ; X64-NEXT:    vpaddq %ymm1, %ymm1, %ymm1
328 ; X64-NEXT:    retq
329   %y = mul <8 x i64> %x, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
330   ret <8 x i64> %y
333 define <8 x i16> @mul_const8(<8 x i16> %x) {
334 ; X32-LABEL: mul_const8:
335 ; X32:       # %bb.0:
336 ; X32-NEXT:    vpsllw $3, %xmm0, %xmm0
337 ; X32-NEXT:    retl
339 ; X64-LABEL: mul_const8:
340 ; X64:       # %bb.0:
341 ; X64-NEXT:    vpsllw $3, %xmm0, %xmm0
342 ; X64-NEXT:    retq
343   %y = mul <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
344   ret <8 x i16> %y
347 define <8 x i32> @mul_const9(<8 x i32> %x) {
348 ; X32-LABEL: mul_const9:
349 ; X32:       # %bb.0:
350 ; X32-NEXT:    vmovdqa {{.*#+}} xmm1 = [2,0,0,0]
351 ; X32-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
352 ; X32-NEXT:    retl
354 ; X64-LABEL: mul_const9:
355 ; X64:       # %bb.0:
356 ; X64-NEXT:    vmovdqa {{.*#+}} xmm1 = [2,0,0,0]
357 ; X64-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
358 ; X64-NEXT:    retq
359   %y = mul <8 x i32> %x, <i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
360   ret <8 x i32> %y
363 ; ptr 0x01010101
364 define <4 x i32> @mul_const10(<4 x i32> %x) {
365 ; X32-LABEL: mul_const10:
366 ; X32:       # %bb.0:
367 ; X32-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [16843009,16843009,16843009,16843009]
368 ; X32-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
369 ; X32-NEXT:    retl
371 ; X64-LABEL: mul_const10:
372 ; X64:       # %bb.0:
373 ; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [16843009,16843009,16843009,16843009]
374 ; X64-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
375 ; X64-NEXT:    retq
376   %m = mul <4 x i32> %x, <i32 16843009, i32 16843009, i32 16843009, i32 16843009>
377   ret <4 x i32> %m
380 ; ptr 0x80808080
381 define <4 x i32> @mul_const11(<4 x i32> %x) {
382 ; X32-LABEL: mul_const11:
383 ; X32:       # %bb.0:
384 ; X32-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2155905152,2155905152,2155905152,2155905152]
385 ; X32-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
386 ; X32-NEXT:    retl
388 ; X64-LABEL: mul_const11:
389 ; X64:       # %bb.0:
390 ; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2155905152,2155905152,2155905152,2155905152]
391 ; X64-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
392 ; X64-NEXT:    retq
393   %m = mul <4 x i32> %x, <i32 2155905152, i32 2155905152, i32 2155905152, i32 2155905152>
394   ret <4 x i32> %m