[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / masked_gather_scatter_widen.ll
blob03491a8ada5f1b496815373df6409801ad4cdff2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq -x86-experimental-vector-widening-legalization < %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIDEN --check-prefix=WIDEN_SKX
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f -x86-experimental-vector-widening-legalization < %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIDEN --check-prefix=WIDEN_KNL
4 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq < %s | FileCheck %s --check-prefix=CHECK --check-prefix=PROMOTE --check-prefix=PROMOTE_SKX
5 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f < %s | FileCheck %s --check-prefix=CHECK --check-prefix=PROMOTE --check-prefix=PROMOTE_KNL
6 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake -x86-experimental-vector-widening-legalization < %s | FileCheck %s --check-prefix=WIDEN_AVX2
7 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake < %s | FileCheck %s --check-prefix=PROMOTE_AVX2
9 define <2 x double> @test_gather_v2i32_index(double* %base, <2 x i32> %ind, <2 x i1> %mask, <2 x double> %src0) {
10 ; WIDEN_SKX-LABEL: test_gather_v2i32_index:
11 ; WIDEN_SKX:       # %bb.0:
12 ; WIDEN_SKX-NEXT:    vpsllq $63, %xmm1, %xmm1
13 ; WIDEN_SKX-NEXT:    vpmovq2m %xmm1, %k1
14 ; WIDEN_SKX-NEXT:    vgatherdpd (%rdi,%xmm0,8), %xmm2 {%k1}
15 ; WIDEN_SKX-NEXT:    vmovapd %xmm2, %xmm0
16 ; WIDEN_SKX-NEXT:    retq
18 ; WIDEN_KNL-LABEL: test_gather_v2i32_index:
19 ; WIDEN_KNL:       # %bb.0:
20 ; WIDEN_KNL-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
21 ; WIDEN_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
22 ; WIDEN_KNL-NEXT:    vpsllq $63, %xmm1, %xmm1
23 ; WIDEN_KNL-NEXT:    vptestmq %zmm1, %zmm1, %k0
24 ; WIDEN_KNL-NEXT:    kshiftlw $14, %k0, %k0
25 ; WIDEN_KNL-NEXT:    kshiftrw $14, %k0, %k1
26 ; WIDEN_KNL-NEXT:    vgatherdpd (%rdi,%ymm0,8), %zmm2 {%k1}
27 ; WIDEN_KNL-NEXT:    vmovapd %xmm2, %xmm0
28 ; WIDEN_KNL-NEXT:    vzeroupper
29 ; WIDEN_KNL-NEXT:    retq
31 ; PROMOTE_SKX-LABEL: test_gather_v2i32_index:
32 ; PROMOTE_SKX:       # %bb.0:
33 ; PROMOTE_SKX-NEXT:    vpsllq $32, %xmm0, %xmm0
34 ; PROMOTE_SKX-NEXT:    vpsraq $32, %xmm0, %xmm0
35 ; PROMOTE_SKX-NEXT:    vpsllq $63, %xmm1, %xmm1
36 ; PROMOTE_SKX-NEXT:    vpmovq2m %xmm1, %k1
37 ; PROMOTE_SKX-NEXT:    vgatherqpd (%rdi,%xmm0,8), %xmm2 {%k1}
38 ; PROMOTE_SKX-NEXT:    vmovapd %xmm2, %xmm0
39 ; PROMOTE_SKX-NEXT:    retq
41 ; PROMOTE_KNL-LABEL: test_gather_v2i32_index:
42 ; PROMOTE_KNL:       # %bb.0:
43 ; PROMOTE_KNL-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
44 ; PROMOTE_KNL-NEXT:    vpsllq $32, %xmm0, %xmm0
45 ; PROMOTE_KNL-NEXT:    vpsraq $32, %zmm0, %zmm0
46 ; PROMOTE_KNL-NEXT:    vpsllq $63, %xmm1, %xmm1
47 ; PROMOTE_KNL-NEXT:    vptestmq %zmm1, %zmm1, %k0
48 ; PROMOTE_KNL-NEXT:    kshiftlw $14, %k0, %k0
49 ; PROMOTE_KNL-NEXT:    kshiftrw $14, %k0, %k1
50 ; PROMOTE_KNL-NEXT:    vgatherqpd (%rdi,%zmm0,8), %zmm2 {%k1}
51 ; PROMOTE_KNL-NEXT:    vmovapd %xmm2, %xmm0
52 ; PROMOTE_KNL-NEXT:    vzeroupper
53 ; PROMOTE_KNL-NEXT:    retq
55 ; WIDEN_AVX2-LABEL: test_gather_v2i32_index:
56 ; WIDEN_AVX2:       # %bb.0:
57 ; WIDEN_AVX2-NEXT:    vpsllq $63, %xmm1, %xmm1
58 ; WIDEN_AVX2-NEXT:    vgatherdpd %xmm1, (%rdi,%xmm0,8), %xmm2
59 ; WIDEN_AVX2-NEXT:    vmovapd %xmm2, %xmm0
60 ; WIDEN_AVX2-NEXT:    retq
62 ; PROMOTE_AVX2-LABEL: test_gather_v2i32_index:
63 ; PROMOTE_AVX2:       # %bb.0:
64 ; PROMOTE_AVX2-NEXT:    vpsllq $32, %xmm0, %xmm3
65 ; PROMOTE_AVX2-NEXT:    vpsrad $31, %xmm3, %xmm3
66 ; PROMOTE_AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3]
67 ; PROMOTE_AVX2-NEXT:    vpsllq $63, %xmm1, %xmm1
68 ; PROMOTE_AVX2-NEXT:    vgatherqpd %xmm1, (%rdi,%xmm0,8), %xmm2
69 ; PROMOTE_AVX2-NEXT:    vmovapd %xmm2, %xmm0
70 ; PROMOTE_AVX2-NEXT:    retq
71   %gep.random = getelementptr double, double* %base, <2 x i32> %ind
72   %res = call <2 x double> @llvm.masked.gather.v2f64.v2p0f64(<2 x double*> %gep.random, i32 4, <2 x i1> %mask, <2 x double> %src0)
73   ret <2 x double> %res
76 define void @test_scatter_v2i32_index(<2 x double> %a1, double* %base, <2 x i32> %ind, <2 x i1> %mask) {
77 ; WIDEN_SKX-LABEL: test_scatter_v2i32_index:
78 ; WIDEN_SKX:       # %bb.0:
79 ; WIDEN_SKX-NEXT:    vpsllq $63, %xmm2, %xmm2
80 ; WIDEN_SKX-NEXT:    vpmovq2m %xmm2, %k1
81 ; WIDEN_SKX-NEXT:    vscatterdpd %xmm0, (%rdi,%xmm1,8) {%k1}
82 ; WIDEN_SKX-NEXT:    retq
84 ; WIDEN_KNL-LABEL: test_scatter_v2i32_index:
85 ; WIDEN_KNL:       # %bb.0:
86 ; WIDEN_KNL-NEXT:    # kill: def $xmm1 killed $xmm1 def $ymm1
87 ; WIDEN_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
88 ; WIDEN_KNL-NEXT:    vpsllq $63, %xmm2, %xmm2
89 ; WIDEN_KNL-NEXT:    vptestmq %zmm2, %zmm2, %k0
90 ; WIDEN_KNL-NEXT:    kshiftlw $14, %k0, %k0
91 ; WIDEN_KNL-NEXT:    kshiftrw $14, %k0, %k1
92 ; WIDEN_KNL-NEXT:    vscatterdpd %zmm0, (%rdi,%ymm1,8) {%k1}
93 ; WIDEN_KNL-NEXT:    vzeroupper
94 ; WIDEN_KNL-NEXT:    retq
96 ; PROMOTE_SKX-LABEL: test_scatter_v2i32_index:
97 ; PROMOTE_SKX:       # %bb.0:
98 ; PROMOTE_SKX-NEXT:    vpsllq $63, %xmm2, %xmm2
99 ; PROMOTE_SKX-NEXT:    vpmovq2m %xmm2, %k1
100 ; PROMOTE_SKX-NEXT:    vpsllq $32, %xmm1, %xmm1
101 ; PROMOTE_SKX-NEXT:    vpsraq $32, %xmm1, %xmm1
102 ; PROMOTE_SKX-NEXT:    vscatterqpd %xmm0, (%rdi,%xmm1,8) {%k1}
103 ; PROMOTE_SKX-NEXT:    retq
105 ; PROMOTE_KNL-LABEL: test_scatter_v2i32_index:
106 ; PROMOTE_KNL:       # %bb.0:
107 ; PROMOTE_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
108 ; PROMOTE_KNL-NEXT:    vpsllq $32, %xmm1, %xmm1
109 ; PROMOTE_KNL-NEXT:    vpsraq $32, %zmm1, %zmm1
110 ; PROMOTE_KNL-NEXT:    vpsllq $63, %xmm2, %xmm2
111 ; PROMOTE_KNL-NEXT:    vptestmq %zmm2, %zmm2, %k0
112 ; PROMOTE_KNL-NEXT:    kshiftlw $14, %k0, %k0
113 ; PROMOTE_KNL-NEXT:    kshiftrw $14, %k0, %k1
114 ; PROMOTE_KNL-NEXT:    vscatterqpd %zmm0, (%rdi,%zmm1,8) {%k1}
115 ; PROMOTE_KNL-NEXT:    vzeroupper
116 ; PROMOTE_KNL-NEXT:    retq
118 ; WIDEN_AVX2-LABEL: test_scatter_v2i32_index:
119 ; WIDEN_AVX2:       # %bb.0:
120 ; WIDEN_AVX2-NEXT:    vpmovsxdq %xmm1, %xmm1
121 ; WIDEN_AVX2-NEXT:    vpsllq $3, %xmm1, %xmm1
122 ; WIDEN_AVX2-NEXT:    vmovq %rdi, %xmm3
123 ; WIDEN_AVX2-NEXT:    vpbroadcastq %xmm3, %xmm3
124 ; WIDEN_AVX2-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
125 ; WIDEN_AVX2-NEXT:    vpextrb $0, %xmm2, %eax
126 ; WIDEN_AVX2-NEXT:    testb $1, %al
127 ; WIDEN_AVX2-NEXT:    je .LBB1_2
128 ; WIDEN_AVX2-NEXT:  # %bb.1: # %cond.store
129 ; WIDEN_AVX2-NEXT:    vmovq %xmm1, %rax
130 ; WIDEN_AVX2-NEXT:    vmovlps %xmm0, (%rax)
131 ; WIDEN_AVX2-NEXT:  .LBB1_2: # %else
132 ; WIDEN_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
133 ; WIDEN_AVX2-NEXT:    testb $1, %al
134 ; WIDEN_AVX2-NEXT:    je .LBB1_4
135 ; WIDEN_AVX2-NEXT:  # %bb.3: # %cond.store1
136 ; WIDEN_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
137 ; WIDEN_AVX2-NEXT:    vmovhps %xmm0, (%rax)
138 ; WIDEN_AVX2-NEXT:  .LBB1_4: # %else2
139 ; WIDEN_AVX2-NEXT:    retq
141 ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_index:
142 ; PROMOTE_AVX2:       # %bb.0:
143 ; PROMOTE_AVX2-NEXT:    vpsllq $32, %xmm1, %xmm3
144 ; PROMOTE_AVX2-NEXT:    vpsrad $31, %xmm3, %xmm3
145 ; PROMOTE_AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3]
146 ; PROMOTE_AVX2-NEXT:    vpsllq $3, %xmm1, %xmm1
147 ; PROMOTE_AVX2-NEXT:    vmovq %rdi, %xmm3
148 ; PROMOTE_AVX2-NEXT:    vpbroadcastq %xmm3, %xmm3
149 ; PROMOTE_AVX2-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
150 ; PROMOTE_AVX2-NEXT:    vpextrb $0, %xmm2, %eax
151 ; PROMOTE_AVX2-NEXT:    testb $1, %al
152 ; PROMOTE_AVX2-NEXT:    je .LBB1_2
153 ; PROMOTE_AVX2-NEXT:  # %bb.1: # %cond.store
154 ; PROMOTE_AVX2-NEXT:    vmovq %xmm1, %rax
155 ; PROMOTE_AVX2-NEXT:    vmovlps %xmm0, (%rax)
156 ; PROMOTE_AVX2-NEXT:  .LBB1_2: # %else
157 ; PROMOTE_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
158 ; PROMOTE_AVX2-NEXT:    testb $1, %al
159 ; PROMOTE_AVX2-NEXT:    je .LBB1_4
160 ; PROMOTE_AVX2-NEXT:  # %bb.3: # %cond.store1
161 ; PROMOTE_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
162 ; PROMOTE_AVX2-NEXT:    vmovhps %xmm0, (%rax)
163 ; PROMOTE_AVX2-NEXT:  .LBB1_4: # %else2
164 ; PROMOTE_AVX2-NEXT:    retq
165   %gep = getelementptr double, double *%base, <2 x i32> %ind
166   call void @llvm.masked.scatter.v2f64.v2p0f64(<2 x double> %a1, <2 x double*> %gep, i32 4, <2 x i1> %mask)
167   ret void
170 define <2 x i32> @test_gather_v2i32_data(<2 x i32*> %ptr, <2 x i1> %mask, <2 x i32> %src0) {
171 ; WIDEN_SKX-LABEL: test_gather_v2i32_data:
172 ; WIDEN_SKX:       # %bb.0:
173 ; WIDEN_SKX-NEXT:    vpsllq $63, %xmm1, %xmm1
174 ; WIDEN_SKX-NEXT:    vpmovq2m %xmm1, %k1
175 ; WIDEN_SKX-NEXT:    vpgatherqd (,%xmm0), %xmm2 {%k1}
176 ; WIDEN_SKX-NEXT:    vmovdqa %xmm2, %xmm0
177 ; WIDEN_SKX-NEXT:    retq
179 ; WIDEN_KNL-LABEL: test_gather_v2i32_data:
180 ; WIDEN_KNL:       # %bb.0:
181 ; WIDEN_KNL-NEXT:    # kill: def $xmm2 killed $xmm2 def $ymm2
182 ; WIDEN_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
183 ; WIDEN_KNL-NEXT:    vpsllq $63, %xmm1, %xmm1
184 ; WIDEN_KNL-NEXT:    vptestmq %zmm1, %zmm1, %k0
185 ; WIDEN_KNL-NEXT:    kshiftlw $14, %k0, %k0
186 ; WIDEN_KNL-NEXT:    kshiftrw $14, %k0, %k1
187 ; WIDEN_KNL-NEXT:    vpgatherqd (,%zmm0), %ymm2 {%k1}
188 ; WIDEN_KNL-NEXT:    vmovdqa %xmm2, %xmm0
189 ; WIDEN_KNL-NEXT:    vzeroupper
190 ; WIDEN_KNL-NEXT:    retq
192 ; PROMOTE_SKX-LABEL: test_gather_v2i32_data:
193 ; PROMOTE_SKX:       # %bb.0:
194 ; PROMOTE_SKX-NEXT:    vpsllq $63, %xmm1, %xmm1
195 ; PROMOTE_SKX-NEXT:    vpmovq2m %xmm1, %k1
196 ; PROMOTE_SKX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
197 ; PROMOTE_SKX-NEXT:    vpgatherqd (,%xmm0), %xmm1 {%k1}
198 ; PROMOTE_SKX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
199 ; PROMOTE_SKX-NEXT:    retq
201 ; PROMOTE_KNL-LABEL: test_gather_v2i32_data:
202 ; PROMOTE_KNL:       # %bb.0:
203 ; PROMOTE_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
204 ; PROMOTE_KNL-NEXT:    vpsllq $63, %xmm1, %xmm1
205 ; PROMOTE_KNL-NEXT:    vptestmq %zmm1, %zmm1, %k0
206 ; PROMOTE_KNL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
207 ; PROMOTE_KNL-NEXT:    kshiftlw $14, %k0, %k0
208 ; PROMOTE_KNL-NEXT:    kshiftrw $14, %k0, %k1
209 ; PROMOTE_KNL-NEXT:    vpgatherqd (,%zmm0), %ymm1 {%k1}
210 ; PROMOTE_KNL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
211 ; PROMOTE_KNL-NEXT:    vzeroupper
212 ; PROMOTE_KNL-NEXT:    retq
214 ; WIDEN_AVX2-LABEL: test_gather_v2i32_data:
215 ; WIDEN_AVX2:       # %bb.0:
216 ; WIDEN_AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
217 ; WIDEN_AVX2-NEXT:    vpslld $31, %xmm1, %xmm1
218 ; WIDEN_AVX2-NEXT:    vpgatherqd %xmm1, (,%xmm0), %xmm2
219 ; WIDEN_AVX2-NEXT:    vmovdqa %xmm2, %xmm0
220 ; WIDEN_AVX2-NEXT:    retq
222 ; PROMOTE_AVX2-LABEL: test_gather_v2i32_data:
223 ; PROMOTE_AVX2:       # %bb.0:
224 ; PROMOTE_AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
225 ; PROMOTE_AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
226 ; PROMOTE_AVX2-NEXT:    vpslld $31, %xmm1, %xmm1
227 ; PROMOTE_AVX2-NEXT:    vpgatherqd %xmm1, (,%xmm0), %xmm2
228 ; PROMOTE_AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero
229 ; PROMOTE_AVX2-NEXT:    retq
230   %res = call <2 x i32> @llvm.masked.gather.v2i32.v2p0i32(<2 x i32*> %ptr, i32 4, <2 x i1> %mask, <2 x i32> %src0)
231   ret <2 x i32>%res
234 define void @test_scatter_v2i32_data(<2 x i32>%a1, <2 x i32*> %ptr, <2 x i1>%mask) {
235 ; WIDEN_SKX-LABEL: test_scatter_v2i32_data:
236 ; WIDEN_SKX:       # %bb.0:
237 ; WIDEN_SKX-NEXT:    vpsllq $63, %xmm2, %xmm2
238 ; WIDEN_SKX-NEXT:    vpmovq2m %xmm2, %k1
239 ; WIDEN_SKX-NEXT:    vpscatterqd %xmm0, (,%xmm1) {%k1}
240 ; WIDEN_SKX-NEXT:    retq
242 ; WIDEN_KNL-LABEL: test_scatter_v2i32_data:
243 ; WIDEN_KNL:       # %bb.0:
244 ; WIDEN_KNL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
245 ; WIDEN_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
246 ; WIDEN_KNL-NEXT:    vpsllq $63, %xmm2, %xmm2
247 ; WIDEN_KNL-NEXT:    vptestmq %zmm2, %zmm2, %k0
248 ; WIDEN_KNL-NEXT:    kshiftlw $14, %k0, %k0
249 ; WIDEN_KNL-NEXT:    kshiftrw $14, %k0, %k1
250 ; WIDEN_KNL-NEXT:    vpscatterqd %ymm0, (,%zmm1) {%k1}
251 ; WIDEN_KNL-NEXT:    vzeroupper
252 ; WIDEN_KNL-NEXT:    retq
254 ; PROMOTE_SKX-LABEL: test_scatter_v2i32_data:
255 ; PROMOTE_SKX:       # %bb.0:
256 ; PROMOTE_SKX-NEXT:    vpsllq $63, %xmm2, %xmm2
257 ; PROMOTE_SKX-NEXT:    vpmovq2m %xmm2, %k1
258 ; PROMOTE_SKX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
259 ; PROMOTE_SKX-NEXT:    vpscatterqd %xmm0, (,%xmm1) {%k1}
260 ; PROMOTE_SKX-NEXT:    retq
262 ; PROMOTE_KNL-LABEL: test_scatter_v2i32_data:
263 ; PROMOTE_KNL:       # %bb.0:
264 ; PROMOTE_KNL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
265 ; PROMOTE_KNL-NEXT:    vpsllq $63, %xmm2, %xmm2
266 ; PROMOTE_KNL-NEXT:    vptestmq %zmm2, %zmm2, %k0
267 ; PROMOTE_KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
268 ; PROMOTE_KNL-NEXT:    kshiftlw $14, %k0, %k0
269 ; PROMOTE_KNL-NEXT:    kshiftrw $14, %k0, %k1
270 ; PROMOTE_KNL-NEXT:    vpscatterqd %ymm0, (,%zmm1) {%k1}
271 ; PROMOTE_KNL-NEXT:    vzeroupper
272 ; PROMOTE_KNL-NEXT:    retq
274 ; WIDEN_AVX2-LABEL: test_scatter_v2i32_data:
275 ; WIDEN_AVX2:       # %bb.0:
276 ; WIDEN_AVX2-NEXT:    vpextrb $0, %xmm2, %eax
277 ; WIDEN_AVX2-NEXT:    testb $1, %al
278 ; WIDEN_AVX2-NEXT:    je .LBB3_2
279 ; WIDEN_AVX2-NEXT:  # %bb.1: # %cond.store
280 ; WIDEN_AVX2-NEXT:    vmovq %xmm1, %rax
281 ; WIDEN_AVX2-NEXT:    vmovss %xmm0, (%rax)
282 ; WIDEN_AVX2-NEXT:  .LBB3_2: # %else
283 ; WIDEN_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
284 ; WIDEN_AVX2-NEXT:    testb $1, %al
285 ; WIDEN_AVX2-NEXT:    je .LBB3_4
286 ; WIDEN_AVX2-NEXT:  # %bb.3: # %cond.store1
287 ; WIDEN_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
288 ; WIDEN_AVX2-NEXT:    vextractps $1, %xmm0, (%rax)
289 ; WIDEN_AVX2-NEXT:  .LBB3_4: # %else2
290 ; WIDEN_AVX2-NEXT:    retq
292 ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data:
293 ; PROMOTE_AVX2:       # %bb.0:
294 ; PROMOTE_AVX2-NEXT:    vpextrb $0, %xmm2, %eax
295 ; PROMOTE_AVX2-NEXT:    testb $1, %al
296 ; PROMOTE_AVX2-NEXT:    je .LBB3_2
297 ; PROMOTE_AVX2-NEXT:  # %bb.1: # %cond.store
298 ; PROMOTE_AVX2-NEXT:    vmovq %xmm1, %rax
299 ; PROMOTE_AVX2-NEXT:    vmovss %xmm0, (%rax)
300 ; PROMOTE_AVX2-NEXT:  .LBB3_2: # %else
301 ; PROMOTE_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
302 ; PROMOTE_AVX2-NEXT:    testb $1, %al
303 ; PROMOTE_AVX2-NEXT:    je .LBB3_4
304 ; PROMOTE_AVX2-NEXT:  # %bb.3: # %cond.store1
305 ; PROMOTE_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
306 ; PROMOTE_AVX2-NEXT:    vextractps $2, %xmm0, (%rax)
307 ; PROMOTE_AVX2-NEXT:  .LBB3_4: # %else2
308 ; PROMOTE_AVX2-NEXT:    retq
309   call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %ptr, i32 4, <2 x i1> %mask)
310   ret void
313 define <2 x i32> @test_gather_v2i32_data_index(i32* %base, <2 x i32> %ind, <2 x i1> %mask, <2 x i32> %src0) {
314 ; WIDEN_SKX-LABEL: test_gather_v2i32_data_index:
315 ; WIDEN_SKX:       # %bb.0:
316 ; WIDEN_SKX-NEXT:    vpsllq $63, %xmm1, %xmm1
317 ; WIDEN_SKX-NEXT:    vpmovq2m %xmm1, %k1
318 ; WIDEN_SKX-NEXT:    vpgatherdd (%rdi,%xmm0,4), %xmm2 {%k1}
319 ; WIDEN_SKX-NEXT:    vmovdqa %xmm2, %xmm0
320 ; WIDEN_SKX-NEXT:    retq
322 ; WIDEN_KNL-LABEL: test_gather_v2i32_data_index:
323 ; WIDEN_KNL:       # %bb.0:
324 ; WIDEN_KNL-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
325 ; WIDEN_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
326 ; WIDEN_KNL-NEXT:    vpsllq $63, %xmm1, %xmm1
327 ; WIDEN_KNL-NEXT:    vptestmq %zmm1, %zmm1, %k0
328 ; WIDEN_KNL-NEXT:    kshiftlw $14, %k0, %k0
329 ; WIDEN_KNL-NEXT:    kshiftrw $14, %k0, %k1
330 ; WIDEN_KNL-NEXT:    vpgatherdd (%rdi,%zmm0,4), %zmm2 {%k1}
331 ; WIDEN_KNL-NEXT:    vmovdqa %xmm2, %xmm0
332 ; WIDEN_KNL-NEXT:    vzeroupper
333 ; WIDEN_KNL-NEXT:    retq
335 ; PROMOTE_SKX-LABEL: test_gather_v2i32_data_index:
336 ; PROMOTE_SKX:       # %bb.0:
337 ; PROMOTE_SKX-NEXT:    vpsllq $63, %xmm1, %xmm1
338 ; PROMOTE_SKX-NEXT:    vpmovq2m %xmm1, %k1
339 ; PROMOTE_SKX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
340 ; PROMOTE_SKX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
341 ; PROMOTE_SKX-NEXT:    vpgatherdd (%rdi,%xmm0,4), %xmm1 {%k1}
342 ; PROMOTE_SKX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
343 ; PROMOTE_SKX-NEXT:    retq
345 ; PROMOTE_KNL-LABEL: test_gather_v2i32_data_index:
346 ; PROMOTE_KNL:       # %bb.0:
347 ; PROMOTE_KNL-NEXT:    vpsllq $63, %xmm1, %xmm1
348 ; PROMOTE_KNL-NEXT:    vptestmq %zmm1, %zmm1, %k0
349 ; PROMOTE_KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
350 ; PROMOTE_KNL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
351 ; PROMOTE_KNL-NEXT:    kshiftlw $14, %k0, %k0
352 ; PROMOTE_KNL-NEXT:    kshiftrw $14, %k0, %k1
353 ; PROMOTE_KNL-NEXT:    vpgatherdd (%rdi,%zmm0,4), %zmm1 {%k1}
354 ; PROMOTE_KNL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
355 ; PROMOTE_KNL-NEXT:    vzeroupper
356 ; PROMOTE_KNL-NEXT:    retq
358 ; WIDEN_AVX2-LABEL: test_gather_v2i32_data_index:
359 ; WIDEN_AVX2:       # %bb.0:
360 ; WIDEN_AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
361 ; WIDEN_AVX2-NEXT:    vpslld $31, %xmm1, %xmm1
362 ; WIDEN_AVX2-NEXT:    vpgatherdd %xmm1, (%rdi,%xmm0,4), %xmm2
363 ; WIDEN_AVX2-NEXT:    vmovdqa %xmm2, %xmm0
364 ; WIDEN_AVX2-NEXT:    retq
366 ; PROMOTE_AVX2-LABEL: test_gather_v2i32_data_index:
367 ; PROMOTE_AVX2:       # %bb.0:
368 ; PROMOTE_AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
369 ; PROMOTE_AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
370 ; PROMOTE_AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
371 ; PROMOTE_AVX2-NEXT:    vpslld $31, %xmm1, %xmm1
372 ; PROMOTE_AVX2-NEXT:    vpgatherdd %xmm1, (%rdi,%xmm0,4), %xmm2
373 ; PROMOTE_AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero
374 ; PROMOTE_AVX2-NEXT:    retq
375   %gep.random = getelementptr i32, i32* %base, <2 x i32> %ind
376   %res = call <2 x i32> @llvm.masked.gather.v2i32.v2p0i32(<2 x i32*> %gep.random, i32 4, <2 x i1> %mask, <2 x i32> %src0)
377   ret <2 x i32> %res
380 define void @test_scatter_v2i32_data_index(<2 x i32> %a1, i32* %base, <2 x i32> %ind, <2 x i1> %mask) {
381 ; WIDEN_SKX-LABEL: test_scatter_v2i32_data_index:
382 ; WIDEN_SKX:       # %bb.0:
383 ; WIDEN_SKX-NEXT:    vpsllq $63, %xmm2, %xmm2
384 ; WIDEN_SKX-NEXT:    vpmovq2m %xmm2, %k1
385 ; WIDEN_SKX-NEXT:    vpscatterdd %xmm0, (%rdi,%xmm1,4) {%k1}
386 ; WIDEN_SKX-NEXT:    retq
388 ; WIDEN_KNL-LABEL: test_scatter_v2i32_data_index:
389 ; WIDEN_KNL:       # %bb.0:
390 ; WIDEN_KNL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
391 ; WIDEN_KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
392 ; WIDEN_KNL-NEXT:    vpsllq $63, %xmm2, %xmm2
393 ; WIDEN_KNL-NEXT:    vptestmq %zmm2, %zmm2, %k0
394 ; WIDEN_KNL-NEXT:    kshiftlw $14, %k0, %k0
395 ; WIDEN_KNL-NEXT:    kshiftrw $14, %k0, %k1
396 ; WIDEN_KNL-NEXT:    vpscatterdd %zmm0, (%rdi,%zmm1,4) {%k1}
397 ; WIDEN_KNL-NEXT:    vzeroupper
398 ; WIDEN_KNL-NEXT:    retq
400 ; PROMOTE_SKX-LABEL: test_scatter_v2i32_data_index:
401 ; PROMOTE_SKX:       # %bb.0:
402 ; PROMOTE_SKX-NEXT:    vpsllq $63, %xmm2, %xmm2
403 ; PROMOTE_SKX-NEXT:    vpmovq2m %xmm2, %k1
404 ; PROMOTE_SKX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
405 ; PROMOTE_SKX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
406 ; PROMOTE_SKX-NEXT:    vpscatterdd %xmm0, (%rdi,%xmm1,4) {%k1}
407 ; PROMOTE_SKX-NEXT:    retq
409 ; PROMOTE_KNL-LABEL: test_scatter_v2i32_data_index:
410 ; PROMOTE_KNL:       # %bb.0:
411 ; PROMOTE_KNL-NEXT:    vpsllq $63, %xmm2, %xmm2
412 ; PROMOTE_KNL-NEXT:    vptestmq %zmm2, %zmm2, %k0
413 ; PROMOTE_KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
414 ; PROMOTE_KNL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
415 ; PROMOTE_KNL-NEXT:    kshiftlw $14, %k0, %k0
416 ; PROMOTE_KNL-NEXT:    kshiftrw $14, %k0, %k1
417 ; PROMOTE_KNL-NEXT:    vpscatterdd %zmm0, (%rdi,%zmm1,4) {%k1}
418 ; PROMOTE_KNL-NEXT:    vzeroupper
419 ; PROMOTE_KNL-NEXT:    retq
421 ; WIDEN_AVX2-LABEL: test_scatter_v2i32_data_index:
422 ; WIDEN_AVX2:       # %bb.0:
423 ; WIDEN_AVX2-NEXT:    vpmovsxdq %xmm1, %xmm1
424 ; WIDEN_AVX2-NEXT:    vpsllq $2, %xmm1, %xmm1
425 ; WIDEN_AVX2-NEXT:    vmovq %rdi, %xmm3
426 ; WIDEN_AVX2-NEXT:    vpbroadcastq %xmm3, %xmm3
427 ; WIDEN_AVX2-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
428 ; WIDEN_AVX2-NEXT:    vpextrb $0, %xmm2, %eax
429 ; WIDEN_AVX2-NEXT:    testb $1, %al
430 ; WIDEN_AVX2-NEXT:    je .LBB5_2
431 ; WIDEN_AVX2-NEXT:  # %bb.1: # %cond.store
432 ; WIDEN_AVX2-NEXT:    vmovq %xmm1, %rax
433 ; WIDEN_AVX2-NEXT:    vmovss %xmm0, (%rax)
434 ; WIDEN_AVX2-NEXT:  .LBB5_2: # %else
435 ; WIDEN_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
436 ; WIDEN_AVX2-NEXT:    testb $1, %al
437 ; WIDEN_AVX2-NEXT:    je .LBB5_4
438 ; WIDEN_AVX2-NEXT:  # %bb.3: # %cond.store1
439 ; WIDEN_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
440 ; WIDEN_AVX2-NEXT:    vextractps $1, %xmm0, (%rax)
441 ; WIDEN_AVX2-NEXT:  .LBB5_4: # %else2
442 ; WIDEN_AVX2-NEXT:    retq
444 ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data_index:
445 ; PROMOTE_AVX2:       # %bb.0:
446 ; PROMOTE_AVX2-NEXT:    vpsllq $32, %xmm1, %xmm3
447 ; PROMOTE_AVX2-NEXT:    vpsrad $31, %xmm3, %xmm3
448 ; PROMOTE_AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3]
449 ; PROMOTE_AVX2-NEXT:    vpsllq $2, %xmm1, %xmm1
450 ; PROMOTE_AVX2-NEXT:    vmovq %rdi, %xmm3
451 ; PROMOTE_AVX2-NEXT:    vpbroadcastq %xmm3, %xmm3
452 ; PROMOTE_AVX2-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
453 ; PROMOTE_AVX2-NEXT:    vpextrb $0, %xmm2, %eax
454 ; PROMOTE_AVX2-NEXT:    testb $1, %al
455 ; PROMOTE_AVX2-NEXT:    je .LBB5_2
456 ; PROMOTE_AVX2-NEXT:  # %bb.1: # %cond.store
457 ; PROMOTE_AVX2-NEXT:    vmovq %xmm1, %rax
458 ; PROMOTE_AVX2-NEXT:    vmovss %xmm0, (%rax)
459 ; PROMOTE_AVX2-NEXT:  .LBB5_2: # %else
460 ; PROMOTE_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
461 ; PROMOTE_AVX2-NEXT:    testb $1, %al
462 ; PROMOTE_AVX2-NEXT:    je .LBB5_4
463 ; PROMOTE_AVX2-NEXT:  # %bb.3: # %cond.store1
464 ; PROMOTE_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
465 ; PROMOTE_AVX2-NEXT:    vextractps $2, %xmm0, (%rax)
466 ; PROMOTE_AVX2-NEXT:  .LBB5_4: # %else2
467 ; PROMOTE_AVX2-NEXT:    retq
468   %gep = getelementptr i32, i32 *%base, <2 x i32> %ind
469   call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %gep, i32 4, <2 x i1> %mask)
470   ret void
473 declare <2 x double> @llvm.masked.gather.v2f64.v2p0f64(<2 x double*>, i32, <2 x i1>, <2 x double>)
474 declare void @llvm.masked.scatter.v2f64.v2p0f64(<2 x double>, <2 x double*>, i32, <2 x i1>)
475 declare <2 x i32> @llvm.masked.gather.v2i32.v2p0i32(<2 x i32*>, i32, <2 x i1>, <2 x i32>)
476 declare void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> , <2 x i32*> , i32 , <2 x i1>)