Optimized integer vector multiplication operation by replacing it with shift/xor...
[oota-llvm.git] / test / CodeGen / X86 / avx2-arith.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=+avx2 | FileCheck %s
2
3 ; CHECK: vpaddq %ymm
4 define <4 x i64> @vpaddq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
5   %x = add <4 x i64> %i, %j
6   ret <4 x i64> %x
7 }
8
9 ; CHECK: vpaddd %ymm
10 define <8 x i32> @vpaddd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
11   %x = add <8 x i32> %i, %j
12   ret <8 x i32> %x
13 }
14
15 ; CHECK: vpaddw %ymm
16 define <16 x i16> @vpaddw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
17   %x = add <16 x i16> %i, %j
18   ret <16 x i16> %x
19 }
20
21 ; CHECK: vpaddb %ymm
22 define <32 x i8> @vpaddb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
23   %x = add <32 x i8> %i, %j
24   ret <32 x i8> %x
25 }
26
27 ; CHECK: vpsubq %ymm
28 define <4 x i64> @vpsubq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
29   %x = sub <4 x i64> %i, %j
30   ret <4 x i64> %x
31 }
32
33 ; CHECK: vpsubd %ymm
34 define <8 x i32> @vpsubd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
35   %x = sub <8 x i32> %i, %j
36   ret <8 x i32> %x
37 }
38
39 ; CHECK: vpsubw %ymm
40 define <16 x i16> @vpsubw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
41   %x = sub <16 x i16> %i, %j
42   ret <16 x i16> %x
43 }
44
45 ; CHECK: vpsubb %ymm
46 define <32 x i8> @vpsubb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
47   %x = sub <32 x i8> %i, %j
48   ret <32 x i8> %x
49 }
50
51 ; CHECK: vpmulld %ymm
52 define <8 x i32> @vpmulld(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
53   %x = mul <8 x i32> %i, %j
54   ret <8 x i32> %x
55 }
56
57 ; CHECK: vpmullw %ymm
58 define <16 x i16> @vpmullw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
59   %x = mul <16 x i16> %i, %j
60   ret <16 x i16> %x
61 }
62
63 ; CHECK: vpmuludq %ymm
64 ; CHECK-NEXT: vpsrlq $32, %ymm
65 ; CHECK-NEXT: vpmuludq %ymm
66 ; CHECK-NEXT: vpsllq $32, %ymm
67 ; CHECK-NEXT: vpaddq %ymm
68 ; CHECK-NEXT: vpsrlq $32, %ymm
69 ; CHECK-NEXT: vpmuludq %ymm
70 ; CHECK-NEXT: vpsllq $32, %ymm
71 ; CHECK-NEXT: vpaddq %ymm
72 define <4 x i64> @mul-v4i64(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
73   %x = mul <4 x i64> %i, %j
74   ret <4 x i64> %x
75 }
76
77 ; CHECK: mul_const1
78 ; CHECK: vpaddd
79 ; CHECK: ret
80 define <8 x i32> @mul_const1(<8 x i32> %x) {
81   %y = mul <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
82   ret <8 x i32> %y
83 }
84
85 ; CHECK: mul_const2
86 ; CHECK: vpsllq  $2
87 ; CHECK: ret
88 define <4 x i64> @mul_const2(<4 x i64> %x) {
89   %y = mul <4 x i64> %x, <i64 4, i64 4, i64 4, i64 4>
90   ret <4 x i64> %y
91 }
92
93 ; CHECK: mul_const3
94 ; CHECK: vpsllw  $3
95 ; CHECK: ret
96 define <16 x i16> @mul_const3(<16 x i16> %x) {
97   %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>
98   ret <16 x i16> %y
99 }
100
101 ; CHECK: mul_const4
102 ; CHECK: vpxor
103 ; CHECK: vpsubq
104 ; CHECK: ret
105 define <4 x i64> @mul_const4(<4 x i64> %x) {
106   %y = mul <4 x i64> %x, <i64 -1, i64 -1, i64 -1, i64 -1>
107   ret <4 x i64> %y
108 }
109
110 ; CHECK: mul_const5
111 ; CHECK: vxorps
112 ; CHECK-NEXT: ret
113 define <8 x i32> @mul_const5(<8 x i32> %x) {
114   %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
115   ret <8 x i32> %y
116 }
117
118 ; CHECK: mul_const6
119 ; CHECK: vpmulld
120 ; CHECK: ret
121 define <8 x i32> @mul_const6(<8 x i32> %x) {
122   %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 2, i32 0, i32 2, i32 0, i32 0>
123   ret <8 x i32> %y
124 }
125
126 ; CHECK: mul_const7
127 ; CHECK: vpaddq
128 ; CHECK: vpaddq
129 ; CHECK: ret
130 define <8 x i64> @mul_const7(<8 x i64> %x) {
131   %y = mul <8 x i64> %x, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
132   ret <8 x i64> %y
133 }
134
135 ; CHECK: mul_const8
136 ; CHECK: vpsllw  $3
137 ; CHECK: ret
138 define <8 x i16> @mul_const8(<8 x i16> %x) {
139   %y = mul <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
140   ret <8 x i16> %y
141 }
142
143 ; CHECK: mul_const9
144 ; CHECK: vpmulld
145 ; CHECK: ret
146 define <8 x i32> @mul_const9(<8 x i32> %x) {
147   %y = mul <8 x i32> %x, <i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
148   ret <8 x i32> %y
149 }