[AVX512] Enable integer arithmetic lowering for AVX512BW/VL subsets.
[oota-llvm.git] / test / CodeGen / X86 / avx512vl-arith.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512vl| FileCheck %s
2
3 ; 256-bit
4
5 ; CHECK-LABEL: vpaddq256_test
6 ; CHECK: vpaddq %ymm{{.*}}
7 ; CHECK: ret
8 define <4 x i64> @vpaddq256_test(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
9   %x = add <4 x i64> %i, %j
10   ret <4 x i64> %x
11 }
12
13 ; CHECK-LABEL: vpaddq256_fold_test
14 ; CHECK: vpaddq (%rdi), %ymm{{.*}}
15 ; CHECK: ret
16 define <4 x i64> @vpaddq256_fold_test(<4 x i64> %i, <4 x i64>* %j) nounwind {
17   %tmp = load <4 x i64>* %j, align 4
18   %x = add <4 x i64> %i, %tmp
19   ret <4 x i64> %x
20 }
21
22 ; CHECK-LABEL: vpaddq256_broadcast_test
23 ; CHECK: vpaddq LCP{{.*}}(%rip){1to4}, %ymm{{.*}}
24 ; CHECK: ret
25 define <4 x i64> @vpaddq256_broadcast_test(<4 x i64> %i) nounwind {
26   %x = add <4 x i64> %i, <i64 1, i64 1, i64 1, i64 1>
27   ret <4 x i64> %x
28 }
29
30 ; CHECK-LABEL: vpaddq256_broadcast2_test
31 ; CHECK: vpaddq (%rdi){1to4}, %ymm{{.*}}
32 ; CHECK: ret
33 define <4 x i64> @vpaddq256_broadcast2_test(<4 x i64> %i, i64* %j.ptr) nounwind {
34   %j = load i64* %j.ptr
35   %j.0 = insertelement <4 x i64> undef, i64 %j, i32 0
36   %j.v = shufflevector <4 x i64> %j.0, <4 x i64> undef, <4 x i32> zeroinitializer
37   %x = add <4 x i64> %i, %j.v
38   ret <4 x i64> %x
39 }
40
41 ; CHECK-LABEL: vpaddd256_test
42 ; CHECK: vpaddd %ymm{{.*}}
43 ; CHECK: ret
44 define <8 x i32> @vpaddd256_test(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
45   %x = add <8 x i32> %i, %j
46   ret <8 x i32> %x
47 }
48
49 ; CHECK-LABEL: vpaddd256_fold_test
50 ; CHECK: vpaddd (%rdi), %ymm{{.*}}
51 ; CHECK: ret
52 define <8 x i32> @vpaddd256_fold_test(<8 x i32> %i, <8 x i32>* %j) nounwind {
53   %tmp = load <8 x i32>* %j, align 4
54   %x = add <8 x i32> %i, %tmp
55   ret <8 x i32> %x
56 }
57
58 ; CHECK-LABEL: vpaddd256_broadcast_test
59 ; CHECK: vpaddd LCP{{.*}}(%rip){1to8}, %ymm{{.*}}
60 ; CHECK: ret
61 define <8 x i32> @vpaddd256_broadcast_test(<8 x i32> %i) nounwind {
62   %x = add <8 x i32> %i, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
63   ret <8 x i32> %x
64 }
65
66 ; CHECK-LABEL: vpaddd256_mask_test
67 ; CHECK: vpaddd %ymm{{.*%k[1-7].*}}
68 ; CHECK: ret
69 define <8 x i32> @vpaddd256_mask_test(<8 x i32> %i, <8 x i32> %j, <8 x i32> %mask1) nounwind readnone {
70   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
71   %x = add <8 x i32> %i, %j
72   %r = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %i
73   ret <8 x i32> %r
74 }
75
76 ; CHECK-LABEL: vpaddd256_maskz_test
77 ; CHECK: vpaddd %ymm{{.*{%k[1-7]} {z}.*}}
78 ; CHECK: ret
79 define <8 x i32> @vpaddd256_maskz_test(<8 x i32> %i, <8 x i32> %j, <8 x i32> %mask1) nounwind readnone {
80   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
81   %x = add <8 x i32> %i, %j
82   %r = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
83   ret <8 x i32> %r
84 }
85
86 ; CHECK-LABEL: vpaddd256_mask_fold_test
87 ; CHECK: vpaddd (%rdi), %ymm{{.*%k[1-7]}}
88 ; CHECK: ret
89 define <8 x i32> @vpaddd256_mask_fold_test(<8 x i32> %i, <8 x i32>* %j.ptr, <8 x i32> %mask1) nounwind readnone {
90   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
91   %j = load <8 x i32>* %j.ptr
92   %x = add <8 x i32> %i, %j
93   %r = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %i
94   ret <8 x i32> %r
95 }
96
97 ; CHECK-LABEL: vpaddd256_mask_broadcast_test
98 ; CHECK: vpaddd LCP{{.*}}(%rip){1to8}, %ymm{{.*{%k[1-7]}}}
99 ; CHECK: ret
100 define <8 x i32> @vpaddd256_mask_broadcast_test(<8 x i32> %i, <8 x i32> %mask1) nounwind readnone {
101   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
102   %x = add <8 x i32> %i, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
103   %r = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %i
104   ret <8 x i32> %r
105 }
106
107 ; CHECK-LABEL: vpaddd256_maskz_fold_test
108 ; CHECK: vpaddd (%rdi), %ymm{{.*{%k[1-7]} {z}}}
109 ; CHECK: ret
110 define <8 x i32> @vpaddd256_maskz_fold_test(<8 x i32> %i, <8 x i32>* %j.ptr, <8 x i32> %mask1) nounwind readnone {
111   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
112   %j = load <8 x i32>* %j.ptr
113   %x = add <8 x i32> %i, %j
114   %r = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
115   ret <8 x i32> %r
116 }
117
118 ; CHECK-LABEL: vpaddd256_maskz_broadcast_test
119 ; CHECK: vpaddd LCP{{.*}}(%rip){1to8}, %ymm{{.*{%k[1-7]} {z}}}
120 ; CHECK: ret
121 define <8 x i32> @vpaddd256_maskz_broadcast_test(<8 x i32> %i, <8 x i32> %mask1) nounwind readnone {
122   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
123   %x = add <8 x i32> %i, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
124   %r = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
125   ret <8 x i32> %r
126 }
127
128 ; CHECK-LABEL: vpsubq256_test
129 ; CHECK: vpsubq %ymm{{.*}}
130 ; CHECK: ret
131 define <4 x i64> @vpsubq256_test(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
132   %x = sub <4 x i64> %i, %j
133   ret <4 x i64> %x
134 }
135
136 ; CHECK-LABEL: vpsubd256_test
137 ; CHECK: vpsubd %ymm{{.*}}
138 ; CHECK: ret
139 define <8 x i32> @vpsubd256_test(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
140   %x = sub <8 x i32> %i, %j
141   ret <8 x i32> %x
142 }
143
144 ; CHECK-LABEL: vpmulld256_test
145 ; CHECK: vpmulld %ymm{{.*}}
146 ; CHECK: ret
147 define <8 x i32> @vpmulld256_test(<8 x i32> %i, <8 x i32> %j) {
148   %x = mul <8 x i32> %i, %j
149   ret <8 x i32> %x
150 }
151
152 ; 128-bit
153
154 ; CHECK-LABEL: vpaddq128_test
155 ; CHECK: vpaddq %xmm{{.*}}
156 ; CHECK: ret
157 define <2 x i64> @vpaddq128_test(<2 x i64> %i, <2 x i64> %j) nounwind readnone {
158   %x = add <2 x i64> %i, %j
159   ret <2 x i64> %x
160 }
161
162 ; CHECK-LABEL: vpaddq128_fold_test
163 ; CHECK: vpaddq (%rdi), %xmm{{.*}}
164 ; CHECK: ret
165 define <2 x i64> @vpaddq128_fold_test(<2 x i64> %i, <2 x i64>* %j) nounwind {
166   %tmp = load <2 x i64>* %j, align 4
167   %x = add <2 x i64> %i, %tmp
168   ret <2 x i64> %x
169 }
170
171 ; CHECK-LABEL: vpaddq128_broadcast2_test
172 ; CHECK: vpaddq (%rdi){1to2}, %xmm{{.*}}
173 ; CHECK: ret
174 define <2 x i64> @vpaddq128_broadcast2_test(<2 x i64> %i, i64* %j) nounwind {
175   %tmp = load i64* %j
176   %j.0 = insertelement <2 x i64> undef, i64 %tmp, i32 0
177   %j.1 = insertelement <2 x i64> %j.0, i64 %tmp, i32 1
178   %x = add <2 x i64> %i, %j.1
179   ret <2 x i64> %x
180 }
181
182 ; CHECK-LABEL: vpaddd128_test
183 ; CHECK: vpaddd %xmm{{.*}}
184 ; CHECK: ret
185 define <4 x i32> @vpaddd128_test(<4 x i32> %i, <4 x i32> %j) nounwind readnone {
186   %x = add <4 x i32> %i, %j
187   ret <4 x i32> %x
188 }
189
190 ; CHECK-LABEL: vpaddd128_fold_test
191 ; CHECK: vpaddd (%rdi), %xmm{{.*}}
192 ; CHECK: ret
193 define <4 x i32> @vpaddd128_fold_test(<4 x i32> %i, <4 x i32>* %j) nounwind {
194   %tmp = load <4 x i32>* %j, align 4
195   %x = add <4 x i32> %i, %tmp
196   ret <4 x i32> %x
197 }
198
199 ; CHECK-LABEL: vpaddd128_broadcast_test
200 ; CHECK: vpaddd LCP{{.*}}(%rip){1to4}, %xmm{{.*}}
201 ; CHECK: ret
202 define <4 x i32> @vpaddd128_broadcast_test(<4 x i32> %i) nounwind {
203   %x = add <4 x i32> %i, <i32 1, i32 1, i32 1, i32 1>
204   ret <4 x i32> %x
205 }
206
207 ; CHECK-LABEL: vpaddd128_mask_test
208 ; CHECK: vpaddd %xmm{{.*%k[1-7].*}}
209 ; CHECK: ret
210 define <4 x i32> @vpaddd128_mask_test(<4 x i32> %i, <4 x i32> %j, <4 x i32> %mask1) nounwind readnone {
211   %mask = icmp ne <4 x i32> %mask1, zeroinitializer
212   %x = add <4 x i32> %i, %j
213   %r = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %i
214   ret <4 x i32> %r
215 }
216
217 ; CHECK-LABEL: vpaddd128_maskz_test
218 ; CHECK: vpaddd %xmm{{.*{%k[1-7]} {z}.*}}
219 ; CHECK: ret
220 define <4 x i32> @vpaddd128_maskz_test(<4 x i32> %i, <4 x i32> %j, <4 x i32> %mask1) nounwind readnone {
221   %mask = icmp ne <4 x i32> %mask1, zeroinitializer
222   %x = add <4 x i32> %i, %j
223   %r = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
224   ret <4 x i32> %r
225 }
226
227 ; CHECK-LABEL: vpaddd128_mask_fold_test
228 ; CHECK: vpaddd (%rdi), %xmm{{.*%k[1-7]}}
229 ; CHECK: ret
230 define <4 x i32> @vpaddd128_mask_fold_test(<4 x i32> %i, <4 x i32>* %j.ptr, <4 x i32> %mask1) nounwind readnone {
231   %mask = icmp ne <4 x i32> %mask1, zeroinitializer
232   %j = load <4 x i32>* %j.ptr
233   %x = add <4 x i32> %i, %j
234   %r = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %i
235   ret <4 x i32> %r
236 }
237
238 ; CHECK-LABEL: vpaddd128_mask_broadcast_test
239 ; CHECK: vpaddd LCP{{.*}}(%rip){1to4}, %xmm{{.*{%k[1-7]}}}
240 ; CHECK: ret
241 define <4 x i32> @vpaddd128_mask_broadcast_test(<4 x i32> %i, <4 x i32> %mask1) nounwind readnone {
242   %mask = icmp ne <4 x i32> %mask1, zeroinitializer
243   %x = add <4 x i32> %i, <i32 1, i32 1, i32 1, i32 1>
244   %r = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %i
245   ret <4 x i32> %r
246 }
247
248 ; CHECK-LABEL: vpaddd128_maskz_fold_test
249 ; CHECK: vpaddd (%rdi), %xmm{{.*{%k[1-7]} {z}}}
250 ; CHECK: ret
251 define <4 x i32> @vpaddd128_maskz_fold_test(<4 x i32> %i, <4 x i32>* %j.ptr, <4 x i32> %mask1) nounwind readnone {
252   %mask = icmp ne <4 x i32> %mask1, zeroinitializer
253   %j = load <4 x i32>* %j.ptr
254   %x = add <4 x i32> %i, %j
255   %r = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
256   ret <4 x i32> %r
257 }
258
259 ; CHECK-LABEL: vpaddd128_maskz_broadcast_test
260 ; CHECK: vpaddd LCP{{.*}}(%rip){1to4}, %xmm{{.*{%k[1-7]} {z}}}
261 ; CHECK: ret
262 define <4 x i32> @vpaddd128_maskz_broadcast_test(<4 x i32> %i, <4 x i32> %mask1) nounwind readnone {
263   %mask = icmp ne <4 x i32> %mask1, zeroinitializer
264   %x = add <4 x i32> %i, <i32 1, i32 1, i32 1, i32 1>
265   %r = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
266   ret <4 x i32> %r
267 }
268
269 ; CHECK-LABEL: vpsubq128_test
270 ; CHECK: vpsubq %xmm{{.*}}
271 ; CHECK: ret
272 define <2 x i64> @vpsubq128_test(<2 x i64> %i, <2 x i64> %j) nounwind readnone {
273   %x = sub <2 x i64> %i, %j
274   ret <2 x i64> %x
275 }
276
277 ; CHECK-LABEL: vpsubd128_test
278 ; CHECK: vpsubd %xmm{{.*}}
279 ; CHECK: ret
280 define <4 x i32> @vpsubd128_test(<4 x i32> %i, <4 x i32> %j) nounwind readnone {
281   %x = sub <4 x i32> %i, %j
282   ret <4 x i32> %x
283 }
284
285 ; CHECK-LABEL: vpmulld128_test
286 ; CHECK: vpmulld %xmm{{.*}}
287 ; CHECK: ret
288 define <4 x i32> @vpmulld128_test(<4 x i32> %i, <4 x i32> %j) {
289   %x = mul <4 x i32> %i, %j
290   ret <4 x i32> %x
291 }