AVX-512: Implemented missing encoding and intrinsics for FMA instructions
[oota-llvm.git] / test / CodeGen / X86 / avx512-gather-scatter-intrin.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s
2
3 declare <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float>, i8*, <16 x i32>, i16, i32)
4 declare void @llvm.x86.avx512.scatter.dps.512 (i8*, i16, <16 x i32>, <16 x float>, i32)
5 declare <8 x double> @llvm.x86.avx512.gather.dpd.512 (<8 x double>, i8*, <8 x i32>, i8, i32)
6 declare void @llvm.x86.avx512.scatter.dpd.512 (i8*, i8, <8 x i32>, <8 x double>, i32)
7
8 declare <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float>, i8*, <8 x i64>, i8, i32)
9 declare void @llvm.x86.avx512.scatter.qps.512 (i8*, i8, <8 x i64>, <8 x float>, i32)
10 declare <8 x double> @llvm.x86.avx512.gather.qpd.512 (<8 x double>, i8*, <8 x i64>, i8, i32)
11 declare void @llvm.x86.avx512.scatter.qpd.512 (i8*, i8, <8 x i64>, <8 x double>, i32)
12
13 define void @gather_mask_dps(<16 x i32> %ind, <16 x float> %src, i16 %mask, i8* %base, i8* %stbuf)  {
14 ; CHECK-LABEL: gather_mask_dps:
15 ; CHECK:       ## BB#0:
16 ; CHECK-NEXT:    kmovw %edi, %k1
17 ; CHECK-NEXT:    kmovw %k1, %k2
18 ; CHECK-NEXT:    vgatherdps (%rsi,%zmm0,4), %zmm1 {%k2}
19 ; CHECK-NEXT:    vpaddd {{.*}}(%rip), %zmm0, %zmm0
20 ; CHECK-NEXT:    vscatterdps %zmm1, (%rdx,%zmm0,4) {%k1}
21 ; CHECK-NEXT:    retq
22   %x = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 %mask, i32 4)
23   %ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
24   call void @llvm.x86.avx512.scatter.dps.512 (i8* %stbuf, i16 %mask, <16 x i32>%ind2, <16 x float> %x, i32 4)
25   ret void
26 }
27
28 define void @gather_mask_dpd(<8 x i32> %ind, <8 x double> %src, i8 %mask, i8* %base, i8* %stbuf)  {
29 ; CHECK-LABEL: gather_mask_dpd:
30 ; CHECK:       ## BB#0:
31 ; CHECK-NEXT:    kmovb %edi, %k1
32 ; CHECK-NEXT:    kmovw %k1, %k2
33 ; CHECK-NEXT:    vgatherdpd (%rsi,%ymm0,4), %zmm1 {%k2}
34 ; CHECK-NEXT:    vpaddd {{.*}}(%rip), %ymm0, %ymm0
35 ; CHECK-NEXT:    vscatterdpd %zmm1, (%rdx,%ymm0,4) {%k1}
36 ; CHECK-NEXT:    retq
37   %x = call <8 x double> @llvm.x86.avx512.gather.dpd.512 (<8 x double> %src, i8* %base, <8 x i32>%ind, i8 %mask, i32 4)
38   %ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
39   call void @llvm.x86.avx512.scatter.dpd.512 (i8* %stbuf, i8 %mask, <8 x i32>%ind2, <8 x double> %x, i32 4)
40   ret void
41 }
42
43 define void @gather_mask_qps(<8 x i64> %ind, <8 x float> %src, i8 %mask, i8* %base, i8* %stbuf)  {
44 ; CHECK-LABEL: gather_mask_qps:
45 ; CHECK:       ## BB#0:
46 ; CHECK-NEXT:    kmovb %edi, %k1
47 ; CHECK-NEXT:    kmovw %k1, %k2
48 ; CHECK-NEXT:    vgatherqps (%rsi,%zmm0,4), %ymm1 {%k2}
49 ; CHECK-NEXT:    vpaddq {{.*}}(%rip), %zmm0, %zmm0
50 ; CHECK-NEXT:    vscatterqps %ymm1, (%rdx,%zmm0,4) {%k1}
51 ; CHECK-NEXT:    retq
52   %x = call <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
53   %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
54   call void @llvm.x86.avx512.scatter.qps.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x float> %x, i32 4)
55   ret void
56 }
57
58 define void @gather_mask_qpd(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %base, i8* %stbuf)  {
59 ; CHECK-LABEL: gather_mask_qpd:
60 ; CHECK:       ## BB#0:
61 ; CHECK-NEXT:    kmovb %edi, %k1
62 ; CHECK-NEXT:    kmovw %k1, %k2
63 ; CHECK-NEXT:    vgatherqpd (%rsi,%zmm0,4), %zmm1 {%k2}
64 ; CHECK-NEXT:    vpaddq {{.*}}(%rip), %zmm0, %zmm0
65 ; CHECK-NEXT:    vscatterqpd %zmm1, (%rdx,%zmm0,4) {%k1}
66 ; CHECK-NEXT:    retq
67   %x = call <8 x double> @llvm.x86.avx512.gather.qpd.512 (<8 x double> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
68   %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
69   call void @llvm.x86.avx512.scatter.qpd.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x double> %x, i32 4)
70   ret void
71 }
72 ;;
73 ;; Integer Gather/Scatter
74 ;;
75 declare <16 x i32> @llvm.x86.avx512.gather.dpi.512 (<16 x i32>, i8*, <16 x i32>, i16, i32)
76 declare void @llvm.x86.avx512.scatter.dpi.512 (i8*, i16, <16 x i32>, <16 x i32>, i32)
77 declare <8 x i64> @llvm.x86.avx512.gather.dpq.512 (<8 x i64>, i8*, <8 x i32>, i8, i32)
78 declare void @llvm.x86.avx512.scatter.dpq.512 (i8*, i8, <8 x i32>, <8 x i64>, i32)
79
80 declare <8 x i32> @llvm.x86.avx512.gather.qpi.512 (<8 x i32>, i8*, <8 x i64>, i8, i32)
81 declare void @llvm.x86.avx512.scatter.qpi.512 (i8*, i8, <8 x i64>, <8 x i32>, i32)
82 declare <8 x i64> @llvm.x86.avx512.gather.qpq.512 (<8 x i64>, i8*, <8 x i64>, i8, i32)
83 declare void @llvm.x86.avx512.scatter.qpq.512 (i8*, i8, <8 x i64>, <8 x i64>, i32)
84
85 define void @gather_mask_dd(<16 x i32> %ind, <16 x i32> %src, i16 %mask, i8* %base, i8* %stbuf)  {
86 ; CHECK-LABEL: gather_mask_dd:
87 ; CHECK:       ## BB#0:
88 ; CHECK-NEXT:    kmovw %edi, %k1
89 ; CHECK-NEXT:    kmovw %k1, %k2
90 ; CHECK-NEXT:    vpgatherdd (%rsi,%zmm0,4), %zmm1 {%k2}
91 ; CHECK-NEXT:    vpaddd {{.*}}(%rip), %zmm0, %zmm0
92 ; CHECK-NEXT:    vpscatterdd %zmm1, (%rdx,%zmm0,4) {%k1}
93 ; CHECK-NEXT:    retq
94   %x = call <16 x i32> @llvm.x86.avx512.gather.dpi.512 (<16 x i32> %src, i8* %base, <16 x i32>%ind, i16 %mask, i32 4)
95   %ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
96   call void @llvm.x86.avx512.scatter.dpi.512 (i8* %stbuf, i16 %mask, <16 x i32>%ind2, <16 x i32> %x, i32 4)
97   ret void
98 }
99
100 define void @gather_mask_qd(<8 x i64> %ind, <8 x i32> %src, i8 %mask, i8* %base, i8* %stbuf)  {
101 ; CHECK-LABEL: gather_mask_qd:
102 ; CHECK:       ## BB#0:
103 ; CHECK-NEXT:    kmovb %edi, %k1
104 ; CHECK-NEXT:    kmovw %k1, %k2
105 ; CHECK-NEXT:    vpgatherqd (%rsi,%zmm0,4), %ymm1 {%k2}
106 ; CHECK-NEXT:    vpaddq {{.*}}(%rip), %zmm0, %zmm0
107 ; CHECK-NEXT:    vpscatterqd %ymm1, (%rdx,%zmm0,4) {%k1}
108 ; CHECK-NEXT:    retq
109   %x = call <8 x i32> @llvm.x86.avx512.gather.qpi.512 (<8 x i32> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
110   %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
111   call void @llvm.x86.avx512.scatter.qpi.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x i32> %x, i32 4)
112   ret void
113 }
114
115 define void @gather_mask_qq(<8 x i64> %ind, <8 x i64> %src, i8 %mask, i8* %base, i8* %stbuf)  {
116 ; CHECK-LABEL: gather_mask_qq:
117 ; CHECK:       ## BB#0:
118 ; CHECK-NEXT:    kmovb %edi, %k1
119 ; CHECK-NEXT:    kmovw %k1, %k2
120 ; CHECK-NEXT:    vpgatherqq (%rsi,%zmm0,4), %zmm1 {%k2}
121 ; CHECK-NEXT:    vpaddq {{.*}}(%rip), %zmm0, %zmm0
122 ; CHECK-NEXT:    vpscatterqq %zmm1, (%rdx,%zmm0,4) {%k1}
123 ; CHECK-NEXT:    retq
124   %x = call <8 x i64> @llvm.x86.avx512.gather.qpq.512 (<8 x i64> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
125   %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
126   call void @llvm.x86.avx512.scatter.qpq.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x i64> %x, i32 4)
127   ret void
128 }
129
130 define void @gather_mask_dq(<8 x i32> %ind, <8 x i64> %src, i8 %mask, i8* %base, i8* %stbuf)  {
131 ; CHECK-LABEL: gather_mask_dq:
132 ; CHECK:       ## BB#0:
133 ; CHECK-NEXT:    kmovb %edi, %k1
134 ; CHECK-NEXT:    kmovw %k1, %k2
135 ; CHECK-NEXT:    vpgatherdq (%rsi,%ymm0,4), %zmm1 {%k2}
136 ; CHECK-NEXT:    vpaddd {{.*}}(%rip), %ymm0, %ymm0
137 ; CHECK-NEXT:    vpscatterdq %zmm1, (%rdx,%ymm0,4) {%k1}
138 ; CHECK-NEXT:    retq
139   %x = call <8 x i64> @llvm.x86.avx512.gather.dpq.512 (<8 x i64> %src, i8* %base, <8 x i32>%ind, i8 %mask, i32 4)
140   %ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
141   call void @llvm.x86.avx512.scatter.dpq.512 (i8* %stbuf, i8 %mask, <8 x i32>%ind2, <8 x i64> %x, i32 4)
142   ret void
143 }
144
145 define void @gather_mask_dpd_execdomain(<8 x i32> %ind, <8 x double> %src, i8 %mask, i8* %base, <8 x double>* %stbuf)  {
146 ; CHECK-LABEL: gather_mask_dpd_execdomain:
147 ; CHECK:       ## BB#0:
148 ; CHECK-NEXT:    kmovb %edi, %k1
149 ; CHECK-NEXT:    vgatherdpd (%rsi,%ymm0,4), %zmm1 {%k1}
150 ; CHECK-NEXT:    vmovapd %zmm1, (%rdx)
151 ; CHECK-NEXT:    retq
152   %x = call <8 x double> @llvm.x86.avx512.gather.dpd.512 (<8 x double> %src, i8* %base, <8 x i32>%ind, i8 %mask, i32 4)
153   store <8 x double> %x, <8 x double>* %stbuf
154   ret void
155 }
156
157 define void @gather_mask_qpd_execdomain(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %base, <8 x double>* %stbuf)  {
158 ; CHECK-LABEL: gather_mask_qpd_execdomain:
159 ; CHECK:       ## BB#0:
160 ; CHECK-NEXT:    kmovb %edi, %k1
161 ; CHECK-NEXT:    vgatherqpd (%rsi,%zmm0,4), %zmm1 {%k1}
162 ; CHECK-NEXT:    vmovapd %zmm1, (%rdx)
163 ; CHECK-NEXT:    retq
164   %x = call <8 x double> @llvm.x86.avx512.gather.qpd.512 (<8 x double> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
165   store <8 x double> %x, <8 x double>* %stbuf
166   ret void
167 }
168
169 define <16 x float> @gather_mask_dps_execdomain(<16 x i32> %ind, <16 x float> %src, i16 %mask, i8* %base)  {
170 ; CHECK-LABEL: gather_mask_dps_execdomain:
171 ; CHECK:       ## BB#0:
172 ; CHECK-NEXT:    kmovw %edi, %k1
173 ; CHECK-NEXT:    vgatherdps (%rsi,%zmm0,4), %zmm1 {%k1}
174 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
175 ; CHECK-NEXT:    retq
176   %res = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 %mask, i32 4)
177   ret <16 x float> %res;
178 }
179
180 define <8 x float> @gather_mask_qps_execdomain(<8 x i64> %ind, <8 x float> %src, i8 %mask, i8* %base)  {
181 ; CHECK-LABEL: gather_mask_qps_execdomain:
182 ; CHECK:       ## BB#0:
183 ; CHECK-NEXT:    kmovb %edi, %k1
184 ; CHECK-NEXT:    vgatherqps (%rsi,%zmm0,4), %ymm1 {%k1}
185 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
186 ; CHECK-NEXT:    retq
187   %res = call <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
188   ret <8 x float> %res;
189 }
190
191 define void @scatter_mask_dpd_execdomain(<8 x i32> %ind, <8 x double>* %src, i8 %mask, i8* %base, i8* %stbuf)  {
192 ; CHECK-LABEL: scatter_mask_dpd_execdomain:
193 ; CHECK:       ## BB#0:
194 ; CHECK-NEXT:    kmovb %esi, %k1
195 ; CHECK-NEXT:    vmovapd (%rdi), %zmm1
196 ; CHECK-NEXT:    vscatterdpd %zmm1, (%rcx,%ymm0,4) {%k1}
197 ; CHECK-NEXT:    retq
198   %x = load <8 x double>, <8 x double>* %src, align 64
199   call void @llvm.x86.avx512.scatter.dpd.512 (i8* %stbuf, i8 %mask, <8 x i32>%ind, <8 x double> %x, i32 4)
200   ret void
201 }
202
203 define void @scatter_mask_qpd_execdomain(<8 x i64> %ind, <8 x double>* %src, i8 %mask, i8* %base, i8* %stbuf)  {
204 ; CHECK-LABEL: scatter_mask_qpd_execdomain:
205 ; CHECK:       ## BB#0:
206 ; CHECK-NEXT:    kmovb %esi, %k1
207 ; CHECK-NEXT:    vmovapd (%rdi), %zmm1
208 ; CHECK-NEXT:    vscatterqpd %zmm1, (%rcx,%zmm0,4) {%k1}
209 ; CHECK-NEXT:    retq
210   %x = load <8 x double>, <8 x double>* %src, align 64
211   call void @llvm.x86.avx512.scatter.qpd.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind, <8 x double> %x, i32 4)
212   ret void
213 }
214
215 define void @scatter_mask_dps_execdomain(<16 x i32> %ind, <16 x float>* %src, i16 %mask, i8* %base, i8* %stbuf)  {
216 ; CHECK-LABEL: scatter_mask_dps_execdomain:
217 ; CHECK:       ## BB#0:
218 ; CHECK-NEXT:    kmovw %esi, %k1
219 ; CHECK-NEXT:    vmovaps (%rdi), %zmm1
220 ; CHECK-NEXT:    vscatterdps %zmm1, (%rcx,%zmm0,4) {%k1}
221 ; CHECK-NEXT:    retq
222   %x = load <16 x float>, <16 x float>* %src, align 64
223   call void @llvm.x86.avx512.scatter.dps.512 (i8* %stbuf, i16 %mask, <16 x i32>%ind, <16 x float> %x, i32 4)
224   ret void
225 }
226
227 define void @scatter_mask_qps_execdomain(<8 x i64> %ind, <8 x float>* %src, i8 %mask, i8* %base, i8* %stbuf)  {
228 ; CHECK-LABEL: scatter_mask_qps_execdomain:
229 ; CHECK:       ## BB#0:
230 ; CHECK-NEXT:    kmovb %esi, %k1
231 ; CHECK-NEXT:    vmovaps (%rdi), %ymm1
232 ; CHECK-NEXT:    vscatterqps %ymm1, (%rcx,%zmm0,4) {%k1}
233 ; CHECK-NEXT:    retq
234   %x = load <8 x float>, <8 x float>* %src, align 32
235   call void @llvm.x86.avx512.scatter.qps.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind, <8 x float> %x, i32 4)
236   ret void
237 }
238
239 define void @gather_qps(<8 x i64> %ind, <8 x float> %src, i8* %base, i8* %stbuf)  {
240 ; CHECK-LABEL: gather_qps:
241 ; CHECK:       ## BB#0:
242 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
243 ; CHECK-NEXT:    kxnorw %k2, %k2, %k2
244 ; CHECK-NEXT:    vgatherqps (%rdi,%zmm0,4), %ymm1 {%k2}
245 ; CHECK-NEXT:    vpaddq {{.*}}(%rip), %zmm0, %zmm0
246 ; CHECK-NEXT:    vscatterqps %ymm1, (%rsi,%zmm0,4) {%k1}
247 ; CHECK-NEXT:    retq
248   %x = call <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float> %src, i8* %base, <8 x i64>%ind, i8 -1, i32 4)
249   %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
250   call void @llvm.x86.avx512.scatter.qps.512 (i8* %stbuf, i8 -1, <8 x i64>%ind2, <8 x float> %x, i32 4)
251   ret void
252 }
253
254 declare  void @llvm.x86.avx512.gatherpf.qps.512(i8, <8 x i64>, i8* , i32, i32);
255 declare  void @llvm.x86.avx512.scatterpf.qps.512(i8, <8 x i64>, i8* , i32, i32);
256 define void @prefetch(<8 x i64> %ind, i8* %base) {
257 ; CHECK-LABEL: prefetch:
258 ; CHECK:       ## BB#0:
259 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
260 ; CHECK-NEXT:    vgatherpf0qps (%rdi,%zmm0,4) {%k1}
261 ; CHECK-NEXT:    vgatherpf1qps (%rdi,%zmm0,4) {%k1}
262 ; CHECK-NEXT:    vscatterpf0qps (%rdi,%zmm0,2) {%k1}
263 ; CHECK-NEXT:    vscatterpf1qps (%rdi,%zmm0,2) {%k1}
264 ; CHECK-NEXT:    retq
265   call void @llvm.x86.avx512.gatherpf.qps.512(i8 -1, <8 x i64> %ind, i8* %base, i32 4, i32 0)
266   call void @llvm.x86.avx512.gatherpf.qps.512(i8 -1, <8 x i64> %ind, i8* %base, i32 4, i32 1)
267   call void @llvm.x86.avx512.scatterpf.qps.512(i8 -1, <8 x i64> %ind, i8* %base, i32 2, i32 0)
268   call void @llvm.x86.avx512.scatterpf.qps.512(i8 -1, <8 x i64> %ind, i8* %base, i32 2, i32 1)
269   ret void
270 }
271
272
273 declare <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double>, i8*, <2 x i64>, i8, i32)
274
275 define <2 x double>@test_int_x86_avx512_gather3div2_df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
276 ; CHECK-LABEL: test_int_x86_avx512_gather3div2_df:
277 ; CHECK:       ## BB#0:
278 ; CHECK-NEXT:    kmovb %esi, %k1
279 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
280 ; CHECK-NEXT:    vgatherqpd (%rdi,%xmm1,4), %xmm2 {%k1}
281 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
282 ; CHECK-NEXT:    vgatherqpd (%rdi,%xmm1,0), %xmm0 {%k1}
283 ; CHECK-NEXT:    vaddpd %xmm0, %xmm2, %xmm0
284 ; CHECK-NEXT:    retq
285   %res = call <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 4)
286   %res1 = call <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, i8 -1, i32 0)
287   %res2 = fadd <2 x double> %res, %res1
288   ret <2 x double> %res2
289 }
290
291 declare <4 x i32> @llvm.x86.avx512.gather3div2.di(<2 x i64>, i8*, <2 x i64>, i8, i32)
292
293 define <4 x i32>@test_int_x86_avx512_gather3div2_di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
294 ; CHECK-LABEL: test_int_x86_avx512_gather3div2_di:
295 ; CHECK:       ## BB#0:
296 ; CHECK-NEXT:    kmovb %esi, %k1
297 ; CHECK-NEXT:    vpgatherqq (%rdi,%xmm1,8), %xmm0 {%k1}
298 ; CHECK-NEXT:    vpaddd %xmm0, %xmm0, %xmm0
299 ; CHECK-NEXT:    retq
300   %res = call <4 x i32> @llvm.x86.avx512.gather3div2.di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 8)
301   %res1 = call <4 x i32> @llvm.x86.avx512.gather3div2.di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 8)
302   %res2 = add <4 x i32> %res, %res1
303   ret <4 x i32> %res2
304 }
305
306 declare <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double>, i8*, <4 x i64>, i8, i32)
307
308 define <4 x double>@test_int_x86_avx512_gather3div4_df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
309 ; CHECK-LABEL: test_int_x86_avx512_gather3div4_df:
310 ; CHECK:       ## BB#0:
311 ; CHECK-NEXT:    kmovb %esi, %k1
312 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
313 ; CHECK-NEXT:    vgatherqpd (%rdi,%ymm1,4), %ymm2 {%k1}
314 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
315 ; CHECK-NEXT:    vgatherqpd (%rdi,%ymm1,0), %ymm0 {%k1}
316 ; CHECK-NEXT:    vaddpd %ymm0, %ymm2, %ymm0
317 ; CHECK-NEXT:    retq
318   %res = call <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 4)
319   %res1 = call <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, i8 -1, i32 0)
320   %res2 = fadd <4 x double> %res, %res1
321   ret <4 x double> %res2
322 }
323
324 declare <8 x i32> @llvm.x86.avx512.gather3div4.di(<4 x i64>, i8*, <4 x i64>, i8, i32)
325
326 define <8 x i32>@test_int_x86_avx512_gather3div4_di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
327 ; CHECK-LABEL: test_int_x86_avx512_gather3div4_di:
328 ; CHECK:       ## BB#0:
329 ; CHECK-NEXT:    kmovb %esi, %k1
330 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
331 ; CHECK-NEXT:    vpgatherqq (%rdi,%ymm1,8), %ymm2 {%k1}
332 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
333 ; CHECK-NEXT:    vpgatherqq (%rdi,%ymm1,8), %ymm0 {%k1}
334 ; CHECK-NEXT:    vpaddd %ymm0, %ymm2, %ymm0
335 ; CHECK-NEXT:    retq
336   %res = call <8 x i32> @llvm.x86.avx512.gather3div4.di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 8)
337   %res1 = call <8 x i32> @llvm.x86.avx512.gather3div4.di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, i8 -1, i32 8)
338   %res2 = add <8 x i32> %res, %res1
339   ret <8 x i32> %res2
340 }
341
342 declare <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float>, i8*, <2 x i64>, i8, i32)
343
344 define <4 x float>@test_int_x86_avx512_gather3div4_sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
345 ; CHECK-LABEL: test_int_x86_avx512_gather3div4_sf:
346 ; CHECK:       ## BB#0:
347 ; CHECK-NEXT:    kmovb %esi, %k1
348 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
349 ; CHECK-NEXT:    vgatherqps (%rdi,%xmm1,4), %xmm2 {%k1}
350 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
351 ; CHECK-NEXT:    vgatherqps (%rdi,%xmm1,0), %xmm0 {%k1}
352 ; CHECK-NEXT:    vaddps %xmm0, %xmm2, %xmm0
353 ; CHECK-NEXT:    retq
354   %res = call <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 4)
355   %res1 = call <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, i8 -1, i32 0)
356   %res2 = fadd <4 x float> %res, %res1
357   ret <4 x float> %res2
358 }
359
360 declare <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32>, i8*, <2 x i64>, i8, i32)
361
362 define <4 x i32>@test_int_x86_avx512_gather3div4_si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
363 ; CHECK-LABEL: test_int_x86_avx512_gather3div4_si:
364 ; CHECK:       ## BB#0:
365 ; CHECK-NEXT:    kmovb %esi, %k1
366 ; CHECK-NEXT:    kxnorw %k2, %k2, %k2
367 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
368 ; CHECK-NEXT:    vpgatherqd (%rdi,%xmm1,4), %xmm2 {%k2}
369 ; CHECK-NEXT:    vpgatherqd (%rdi,%xmm1,4), %xmm0 {%k1}
370 ; CHECK-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
371 ; CHECK-NEXT:    retq
372   %res = call <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, i8 -1, i32 4)
373   %res1 = call <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 4)
374   %res2 = add <4 x i32> %res, %res1
375   ret <4 x i32> %res2
376 }
377
378 declare <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float>, i8*, <4 x i64>, i8, i32)
379
380 define <4 x float>@test_int_x86_avx512_gather3div8_sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
381 ; CHECK-LABEL: test_int_x86_avx512_gather3div8_sf:
382 ; CHECK:       ## BB#0:
383 ; CHECK-NEXT:    kmovb %esi, %k1
384 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
385 ; CHECK-NEXT:    vgatherqps (%rdi,%ymm1,4), %xmm2 {%k1}
386 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
387 ; CHECK-NEXT:    vgatherqps (%rdi,%ymm1,0), %xmm0 {%k1}
388 ; CHECK-NEXT:    vaddps %xmm0, %xmm2, %xmm0
389 ; CHECK-NEXT:    retq
390   %res = call <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 4)
391   %res1 = call <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, i8 -1, i32 0)
392   %res2 = fadd <4 x float> %res, %res1
393   ret <4 x float> %res2
394 }
395
396 declare <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32>, i8*, <4 x i64>, i8, i32)
397
398 define <4 x i32>@test_int_x86_avx512_gather3div8_si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
399 ; CHECK-LABEL: test_int_x86_avx512_gather3div8_si:
400 ; CHECK:       ## BB#0:
401 ; CHECK-NEXT:    kmovb %esi, %k1
402 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
403 ; CHECK-NEXT:    kmovw %k1, %k2
404 ; CHECK-NEXT:    vpgatherqd (%rdi,%ymm1,4), %xmm2 {%k2}
405 ; CHECK-NEXT:    vpgatherqd (%rdi,%ymm1,2), %xmm0 {%k1}
406 ; CHECK-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
407 ; CHECK-NEXT:    retq
408   %res = call <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 4)
409   %res1 = call <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 2)
410   %res2 = add <4 x i32> %res, %res1
411   ret <4 x i32> %res2
412 }
413
414 declare <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double>, i8*, <4 x i32>, i8, i32)
415
416 define <2 x double>@test_int_x86_avx512_gather3siv2_df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
417 ; CHECK-LABEL: test_int_x86_avx512_gather3siv2_df:
418 ; CHECK:       ## BB#0:
419 ; CHECK-NEXT:    kmovb %esi, %k1
420 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
421 ; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,4), %xmm2 {%k1}
422 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
423 ; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,0), %xmm0 {%k1}
424 ; CHECK-NEXT:    vaddpd %xmm0, %xmm2, %xmm0
425 ; CHECK-NEXT:    retq
426   %res = call <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 4)
427   %res1 = call <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 0)
428   %res2 = fadd <2 x double> %res, %res1
429   ret <2 x double> %res2
430 }
431
432 declare <4 x i32> @llvm.x86.avx512.gather3siv2.di(<2 x i64>, i8*, <4 x i32>, i8, i32)
433
434 define <4 x i32>@test_int_x86_avx512_gather3siv2_di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
435 ; CHECK-LABEL: test_int_x86_avx512_gather3siv2_di:
436 ; CHECK:       ## BB#0:
437 ; CHECK-NEXT:    kmovb %esi, %k1
438 ; CHECK-NEXT:    vpgatherdq (%rdi,%xmm1,8), %xmm0 {%k1}
439 ; CHECK-NEXT:    vpaddd %xmm0, %xmm0, %xmm0
440 ; CHECK-NEXT:    retq
441   %res = call <4 x i32> @llvm.x86.avx512.gather3siv2.di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
442   %res1 = call <4 x i32> @llvm.x86.avx512.gather3siv2.di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
443   %res2 = add <4 x i32> %res, %res1
444   ret <4 x i32> %res2
445 }
446
447 declare <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double>, i8*, <4 x i32>, i8, i32)
448
449 define <4 x double>@test_int_x86_avx512_gather3siv4_df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
450 ; CHECK-LABEL: test_int_x86_avx512_gather3siv4_df:
451 ; CHECK:       ## BB#0:
452 ; CHECK-NEXT:    kmovb %esi, %k1
453 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
454 ; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,4), %ymm2 {%k1}
455 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
456 ; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,0), %ymm0 {%k1}
457 ; CHECK-NEXT:    vaddpd %ymm0, %ymm2, %ymm0
458 ; CHECK-NEXT:    retq
459   %res = call <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 4)
460   %res1 = call <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 0)
461   %res2 = fadd <4 x double> %res, %res1
462   ret <4 x double> %res2
463 }
464
465 declare <8 x i32> @llvm.x86.avx512.gather3siv4.di(<4 x i64>, i8*, <4 x i32>, i8, i32)
466
467 define <8 x i32>@test_int_x86_avx512_gather3siv4_di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
468 ; CHECK-LABEL: test_int_x86_avx512_gather3siv4_di:
469 ; CHECK:       ## BB#0:
470 ; CHECK-NEXT:    kmovb %esi, %k1
471 ; CHECK-NEXT:    vpgatherdq (%rdi,%xmm1,8), %ymm0 {%k1}
472 ; CHECK-NEXT:    vpaddd %ymm0, %ymm0, %ymm0
473 ; CHECK-NEXT:    retq
474   %res = call <8 x i32> @llvm.x86.avx512.gather3siv4.di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
475   %res1 = call <8 x i32> @llvm.x86.avx512.gather3siv4.di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
476   %res2 = add <8 x i32> %res, %res1
477   ret <8 x i32> %res2
478 }
479
480 declare <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float>, i8*, <4 x i32>, i8, i32)
481
482 define <4 x float>@test_int_x86_avx512_gather3siv4_sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
483 ; CHECK-LABEL: test_int_x86_avx512_gather3siv4_sf:
484 ; CHECK:       ## BB#0:
485 ; CHECK-NEXT:    kmovb %esi, %k1
486 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
487 ; CHECK-NEXT:    vgatherdps (%rdi,%xmm1,4), %xmm2 {%k1}
488 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
489 ; CHECK-NEXT:    vgatherdps (%rdi,%xmm1,0), %xmm0 {%k1}
490 ; CHECK-NEXT:    vaddps %xmm0, %xmm2, %xmm0
491 ; CHECK-NEXT:    retq
492   %res = call <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 4)
493   %res1 = call <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 0)
494   %res2 = fadd <4 x float> %res, %res1
495   ret <4 x float> %res2
496 }
497
498 declare <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32>, i8*, <4 x i32>, i8, i32)
499
500 define <4 x i32>@test_int_x86_avx512_gather3siv4_si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
501 ; CHECK-LABEL: test_int_x86_avx512_gather3siv4_si:
502 ; CHECK:       ## BB#0:
503 ; CHECK-NEXT:    kmovb %esi, %k1
504 ; CHECK-NEXT:    kxnorw %k2, %k2, %k2
505 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
506 ; CHECK-NEXT:    vpgatherdd (%rdi,%xmm1,4), %xmm2 {%k2}
507 ; CHECK-NEXT:    vpgatherdd (%rdi,%xmm1,0), %xmm0 {%k1}
508 ; CHECK-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
509 ; CHECK-NEXT:    retq
510   %res = call <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 4)
511   %res1 = call <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 0)
512   %res2 = add <4 x i32> %res, %res1
513   ret <4 x i32> %res2
514 }
515
516 declare <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float>, i8*, <8 x i32>, i8, i32)
517
518 define <8 x float>@test_int_x86_avx512_gather3siv8_sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, i8 %x3) {
519 ; CHECK-LABEL: test_int_x86_avx512_gather3siv8_sf:
520 ; CHECK:       ## BB#0:
521 ; CHECK-NEXT:    kmovb %esi, %k1
522 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
523 ; CHECK-NEXT:    vgatherdps (%rdi,%ymm1,4), %ymm2 {%k1}
524 ; CHECK-NEXT:    kxnorw %k1, %k1, %k1
525 ; CHECK-NEXT:    vgatherdps (%rdi,%ymm1,0), %ymm0 {%k1}
526 ; CHECK-NEXT:    vaddps %ymm0, %ymm2, %ymm0
527 ; CHECK-NEXT:    retq
528   %res = call <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, i8 %x3, i32 4)
529   %res1 = call <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, i8 -1, i32 0)
530   %res2 = fadd <8 x float> %res, %res1
531   ret <8 x float> %res2
532 }
533
534 declare <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32>, i8*, <8 x i32>, i8, i32)
535
536 define <8 x i32>@test_int_x86_avx512_gather3siv8_si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, i8 %x3) {
537 ; CHECK-LABEL: test_int_x86_avx512_gather3siv8_si:
538 ; CHECK:       ## BB#0:
539 ; CHECK-NEXT:    kmovb %esi, %k1
540 ; CHECK-NEXT:    vmovaps %zmm0, %zmm2
541 ; CHECK-NEXT:    kmovw %k1, %k2
542 ; CHECK-NEXT:    vpgatherdd (%rdi,%ymm1,4), %ymm2 {%k2}
543 ; CHECK-NEXT:    vpgatherdd (%rdi,%ymm1,0), %ymm0 {%k1}
544 ; CHECK-NEXT:    vpaddd %ymm0, %ymm2, %ymm0
545 ; CHECK-NEXT:    retq
546   %res = call <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, i8 %x3, i32 4)
547   %res1 = call <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, i8 %x3, i32 0)
548   %res2 = add <8 x i32> %res, %res1
549   ret <8 x i32> %res2
550 }