[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / masked_gather.ll
blobcee52a0d01e71c1eb9ea4d01ea2a8ba36cff847f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+sse4.2 < %s | FileCheck %s --check-prefixes=ALL,SSE,SSE42
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx < %s | FileCheck %s --check-prefixes=ALL,AVX,AVX1
4 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx2 < %s | FileCheck %s --check-prefixes=ALL,AVX,AVX2
5 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx512f < %s | FileCheck %s --check-prefixes=ALL,AVX512
8 ; vXf32
11 define <4 x float> @gather_v4f32_ptr_v4i32(<4 x float*> %ptr, <4 x i32> %trigger, <4 x float> %passthru) {
12 ; SSE-LABEL: gather_v4f32_ptr_v4i32:
13 ; SSE:       # %bb.0:
14 ; SSE-NEXT:    pxor %xmm4, %xmm4
15 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm4
16 ; SSE-NEXT:    pextrb $0, %xmm4, %eax
17 ; SSE-NEXT:    testb $1, %al
18 ; SSE-NEXT:    je .LBB0_2
19 ; SSE-NEXT:  # %bb.1: # %cond.load
20 ; SSE-NEXT:    movq %xmm0, %rax
21 ; SSE-NEXT:    movss {{.*#+}} xmm5 = mem[0],zero,zero,zero
22 ; SSE-NEXT:    blendps {{.*#+}} xmm3 = xmm5[0],xmm3[1,2,3]
23 ; SSE-NEXT:  .LBB0_2: # %else
24 ; SSE-NEXT:    pextrb $4, %xmm4, %eax
25 ; SSE-NEXT:    testb $1, %al
26 ; SSE-NEXT:    je .LBB0_4
27 ; SSE-NEXT:  # %bb.3: # %cond.load1
28 ; SSE-NEXT:    pextrq $1, %xmm0, %rax
29 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
30 ; SSE-NEXT:  .LBB0_4: # %else2
31 ; SSE-NEXT:    pxor %xmm0, %xmm0
32 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
33 ; SSE-NEXT:    pextrb $8, %xmm2, %eax
34 ; SSE-NEXT:    testb $1, %al
35 ; SSE-NEXT:    je .LBB0_6
36 ; SSE-NEXT:  # %bb.5: # %cond.load4
37 ; SSE-NEXT:    movq %xmm1, %rax
38 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
39 ; SSE-NEXT:  .LBB0_6: # %else5
40 ; SSE-NEXT:    pextrb $12, %xmm2, %eax
41 ; SSE-NEXT:    testb $1, %al
42 ; SSE-NEXT:    je .LBB0_8
43 ; SSE-NEXT:  # %bb.7: # %cond.load7
44 ; SSE-NEXT:    pextrq $1, %xmm1, %rax
45 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
46 ; SSE-NEXT:  .LBB0_8: # %else8
47 ; SSE-NEXT:    movaps %xmm3, %xmm0
48 ; SSE-NEXT:    retq
50 ; AVX1-LABEL: gather_v4f32_ptr_v4i32:
51 ; AVX1:       # %bb.0:
52 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
53 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm3
54 ; AVX1-NEXT:    vpextrb $0, %xmm3, %eax
55 ; AVX1-NEXT:    testb $1, %al
56 ; AVX1-NEXT:    je .LBB0_2
57 ; AVX1-NEXT:  # %bb.1: # %cond.load
58 ; AVX1-NEXT:    vmovq %xmm0, %rax
59 ; AVX1-NEXT:    vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero
60 ; AVX1-NEXT:    vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3]
61 ; AVX1-NEXT:  .LBB0_2: # %else
62 ; AVX1-NEXT:    vpextrb $4, %xmm3, %eax
63 ; AVX1-NEXT:    testb $1, %al
64 ; AVX1-NEXT:    je .LBB0_4
65 ; AVX1-NEXT:  # %bb.3: # %cond.load1
66 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
67 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
68 ; AVX1-NEXT:  .LBB0_4: # %else2
69 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
70 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
71 ; AVX1-NEXT:    vpextrb $8, %xmm1, %eax
72 ; AVX1-NEXT:    testb $1, %al
73 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
74 ; AVX1-NEXT:    je .LBB0_6
75 ; AVX1-NEXT:  # %bb.5: # %cond.load4
76 ; AVX1-NEXT:    vmovq %xmm0, %rax
77 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
78 ; AVX1-NEXT:  .LBB0_6: # %else5
79 ; AVX1-NEXT:    vpextrb $12, %xmm1, %eax
80 ; AVX1-NEXT:    testb $1, %al
81 ; AVX1-NEXT:    je .LBB0_8
82 ; AVX1-NEXT:  # %bb.7: # %cond.load7
83 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
84 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
85 ; AVX1-NEXT:  .LBB0_8: # %else8
86 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
87 ; AVX1-NEXT:    vzeroupper
88 ; AVX1-NEXT:    retq
90 ; AVX2-LABEL: gather_v4f32_ptr_v4i32:
91 ; AVX2:       # %bb.0:
92 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
93 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm3
94 ; AVX2-NEXT:    vpextrb $0, %xmm3, %eax
95 ; AVX2-NEXT:    testb $1, %al
96 ; AVX2-NEXT:    je .LBB0_2
97 ; AVX2-NEXT:  # %bb.1: # %cond.load
98 ; AVX2-NEXT:    vmovq %xmm0, %rax
99 ; AVX2-NEXT:    vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero
100 ; AVX2-NEXT:    vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3]
101 ; AVX2-NEXT:  .LBB0_2: # %else
102 ; AVX2-NEXT:    vpextrb $4, %xmm3, %eax
103 ; AVX2-NEXT:    testb $1, %al
104 ; AVX2-NEXT:    je .LBB0_4
105 ; AVX2-NEXT:  # %bb.3: # %cond.load1
106 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
107 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
108 ; AVX2-NEXT:  .LBB0_4: # %else2
109 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
110 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
111 ; AVX2-NEXT:    vpextrb $8, %xmm1, %eax
112 ; AVX2-NEXT:    testb $1, %al
113 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
114 ; AVX2-NEXT:    je .LBB0_6
115 ; AVX2-NEXT:  # %bb.5: # %cond.load4
116 ; AVX2-NEXT:    vmovq %xmm0, %rax
117 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
118 ; AVX2-NEXT:  .LBB0_6: # %else5
119 ; AVX2-NEXT:    vpextrb $12, %xmm1, %eax
120 ; AVX2-NEXT:    testb $1, %al
121 ; AVX2-NEXT:    je .LBB0_8
122 ; AVX2-NEXT:  # %bb.7: # %cond.load7
123 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
124 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
125 ; AVX2-NEXT:  .LBB0_8: # %else8
126 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
127 ; AVX2-NEXT:    vzeroupper
128 ; AVX2-NEXT:    retq
130 ; AVX512-LABEL: gather_v4f32_ptr_v4i32:
131 ; AVX512:       # %bb.0:
132 ; AVX512-NEXT:    # kill: def $xmm2 killed $xmm2 def $ymm2
133 ; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
134 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
135 ; AVX512-NEXT:    vptestnmd %zmm1, %zmm1, %k0
136 ; AVX512-NEXT:    kshiftlw $12, %k0, %k0
137 ; AVX512-NEXT:    kshiftrw $12, %k0, %k1
138 ; AVX512-NEXT:    vgatherqps (,%zmm0), %ymm2 {%k1}
139 ; AVX512-NEXT:    vmovaps %xmm2, %xmm0
140 ; AVX512-NEXT:    vzeroupper
141 ; AVX512-NEXT:    retq
142   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
143   %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*> %ptr, i32 4, <4 x i1> %mask, <4 x float> %passthru)
144   ret <4 x float> %res
147 define <4 x float> @gather_v4f32_v4i32_v4i32(float* %base, <4 x i32> %idx, <4 x i32> %trigger, <4 x float> %passthru) {
148 ; SSE-LABEL: gather_v4f32_v4i32_v4i32:
149 ; SSE:       # %bb.0:
150 ; SSE-NEXT:    movq %rdi, %xmm3
151 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]
152 ; SSE-NEXT:    pmovsxdq %xmm0, %xmm4
153 ; SSE-NEXT:    psllq $2, %xmm4
154 ; SSE-NEXT:    paddq %xmm3, %xmm4
155 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
156 ; SSE-NEXT:    pmovsxdq %xmm0, %xmm0
157 ; SSE-NEXT:    pxor %xmm5, %xmm5
158 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm5
159 ; SSE-NEXT:    pextrb $0, %xmm5, %eax
160 ; SSE-NEXT:    testb $1, %al
161 ; SSE-NEXT:    je .LBB1_2
162 ; SSE-NEXT:  # %bb.1: # %cond.load
163 ; SSE-NEXT:    movq %xmm4, %rax
164 ; SSE-NEXT:    movss {{.*#+}} xmm6 = mem[0],zero,zero,zero
165 ; SSE-NEXT:    blendps {{.*#+}} xmm2 = xmm6[0],xmm2[1,2,3]
166 ; SSE-NEXT:  .LBB1_2: # %else
167 ; SSE-NEXT:    psllq $2, %xmm0
168 ; SSE-NEXT:    pextrb $4, %xmm5, %eax
169 ; SSE-NEXT:    testb $1, %al
170 ; SSE-NEXT:    je .LBB1_4
171 ; SSE-NEXT:  # %bb.3: # %cond.load1
172 ; SSE-NEXT:    pextrq $1, %xmm4, %rax
173 ; SSE-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
174 ; SSE-NEXT:  .LBB1_4: # %else2
175 ; SSE-NEXT:    paddq %xmm0, %xmm3
176 ; SSE-NEXT:    pxor %xmm0, %xmm0
177 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
178 ; SSE-NEXT:    pextrb $8, %xmm1, %eax
179 ; SSE-NEXT:    testb $1, %al
180 ; SSE-NEXT:    je .LBB1_6
181 ; SSE-NEXT:  # %bb.5: # %cond.load4
182 ; SSE-NEXT:    movq %xmm3, %rax
183 ; SSE-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
184 ; SSE-NEXT:  .LBB1_6: # %else5
185 ; SSE-NEXT:    pextrb $12, %xmm1, %eax
186 ; SSE-NEXT:    testb $1, %al
187 ; SSE-NEXT:    je .LBB1_8
188 ; SSE-NEXT:  # %bb.7: # %cond.load7
189 ; SSE-NEXT:    pextrq $1, %xmm3, %rax
190 ; SSE-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
191 ; SSE-NEXT:  .LBB1_8: # %else8
192 ; SSE-NEXT:    movaps %xmm2, %xmm0
193 ; SSE-NEXT:    retq
195 ; AVX1-LABEL: gather_v4f32_v4i32_v4i32:
196 ; AVX1:       # %bb.0:
197 ; AVX1-NEXT:    vmovq %rdi, %xmm3
198 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]
199 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
200 ; AVX1-NEXT:    vpmovsxdq %xmm4, %xmm4
201 ; AVX1-NEXT:    vpsllq $2, %xmm4, %xmm4
202 ; AVX1-NEXT:    vpaddq %xmm4, %xmm3, %xmm4
203 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
204 ; AVX1-NEXT:    vpsllq $2, %xmm0, %xmm0
205 ; AVX1-NEXT:    vpaddq %xmm0, %xmm3, %xmm0
206 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
207 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
208 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm3
209 ; AVX1-NEXT:    vpextrb $0, %xmm3, %eax
210 ; AVX1-NEXT:    testb $1, %al
211 ; AVX1-NEXT:    je .LBB1_2
212 ; AVX1-NEXT:  # %bb.1: # %cond.load
213 ; AVX1-NEXT:    vmovq %xmm0, %rax
214 ; AVX1-NEXT:    vmovd {{.*#+}} xmm4 = mem[0],zero,zero,zero
215 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3,4,5,6,7]
216 ; AVX1-NEXT:  .LBB1_2: # %else
217 ; AVX1-NEXT:    vpextrb $4, %xmm3, %eax
218 ; AVX1-NEXT:    testb $1, %al
219 ; AVX1-NEXT:    je .LBB1_4
220 ; AVX1-NEXT:  # %bb.3: # %cond.load1
221 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
222 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
223 ; AVX1-NEXT:  .LBB1_4: # %else2
224 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
225 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
226 ; AVX1-NEXT:    vpextrb $8, %xmm1, %eax
227 ; AVX1-NEXT:    testb $1, %al
228 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
229 ; AVX1-NEXT:    je .LBB1_6
230 ; AVX1-NEXT:  # %bb.5: # %cond.load4
231 ; AVX1-NEXT:    vmovq %xmm0, %rax
232 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
233 ; AVX1-NEXT:  .LBB1_6: # %else5
234 ; AVX1-NEXT:    vpextrb $12, %xmm1, %eax
235 ; AVX1-NEXT:    testb $1, %al
236 ; AVX1-NEXT:    je .LBB1_8
237 ; AVX1-NEXT:  # %bb.7: # %cond.load7
238 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
239 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
240 ; AVX1-NEXT:  .LBB1_8: # %else8
241 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
242 ; AVX1-NEXT:    vzeroupper
243 ; AVX1-NEXT:    retq
245 ; AVX2-LABEL: gather_v4f32_v4i32_v4i32:
246 ; AVX2:       # %bb.0:
247 ; AVX2-NEXT:    vmovq %rdi, %xmm3
248 ; AVX2-NEXT:    vpbroadcastq %xmm3, %ymm3
249 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
250 ; AVX2-NEXT:    vpsllq $2, %ymm0, %ymm0
251 ; AVX2-NEXT:    vpaddq %ymm0, %ymm3, %ymm0
252 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
253 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm3
254 ; AVX2-NEXT:    vpextrb $0, %xmm3, %eax
255 ; AVX2-NEXT:    testb $1, %al
256 ; AVX2-NEXT:    je .LBB1_2
257 ; AVX2-NEXT:  # %bb.1: # %cond.load
258 ; AVX2-NEXT:    vmovq %xmm0, %rax
259 ; AVX2-NEXT:    vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero
260 ; AVX2-NEXT:    vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3]
261 ; AVX2-NEXT:  .LBB1_2: # %else
262 ; AVX2-NEXT:    vpextrb $4, %xmm3, %eax
263 ; AVX2-NEXT:    testb $1, %al
264 ; AVX2-NEXT:    je .LBB1_4
265 ; AVX2-NEXT:  # %bb.3: # %cond.load1
266 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
267 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
268 ; AVX2-NEXT:  .LBB1_4: # %else2
269 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
270 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
271 ; AVX2-NEXT:    vpextrb $8, %xmm1, %eax
272 ; AVX2-NEXT:    testb $1, %al
273 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
274 ; AVX2-NEXT:    je .LBB1_6
275 ; AVX2-NEXT:  # %bb.5: # %cond.load4
276 ; AVX2-NEXT:    vmovq %xmm0, %rax
277 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
278 ; AVX2-NEXT:  .LBB1_6: # %else5
279 ; AVX2-NEXT:    vpextrb $12, %xmm1, %eax
280 ; AVX2-NEXT:    testb $1, %al
281 ; AVX2-NEXT:    je .LBB1_8
282 ; AVX2-NEXT:  # %bb.7: # %cond.load7
283 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
284 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
285 ; AVX2-NEXT:  .LBB1_8: # %else8
286 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
287 ; AVX2-NEXT:    vzeroupper
288 ; AVX2-NEXT:    retq
290 ; AVX512-LABEL: gather_v4f32_v4i32_v4i32:
291 ; AVX512:       # %bb.0:
292 ; AVX512-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
293 ; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
294 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
295 ; AVX512-NEXT:    vptestnmd %zmm1, %zmm1, %k0
296 ; AVX512-NEXT:    kshiftlw $12, %k0, %k0
297 ; AVX512-NEXT:    kshiftrw $12, %k0, %k1
298 ; AVX512-NEXT:    vgatherdps (%rdi,%zmm0,4), %zmm2 {%k1}
299 ; AVX512-NEXT:    vmovaps %xmm2, %xmm0
300 ; AVX512-NEXT:    vzeroupper
301 ; AVX512-NEXT:    retq
302   %vptr0 = insertelement <4 x float*> undef, float* %base, i32 0
303   %vptr1 = shufflevector <4 x float*> %vptr0, <4 x float*> undef, <4 x i32> zeroinitializer
304   %vptr2 = getelementptr float, <4 x float*> %vptr1, <4 x i32> %idx
306   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
307   %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru)
308   ret <4 x float> %res
311 define <4 x float> @gather_v4f32_v4i64_v4i32(float* %base, <4 x i64> %idx, <4 x i32> %trigger, <4 x float> %passthru) {
312 ; SSE-LABEL: gather_v4f32_v4i64_v4i32:
313 ; SSE:       # %bb.0:
314 ; SSE-NEXT:    movq %rdi, %xmm4
315 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
316 ; SSE-NEXT:    psllq $2, %xmm0
317 ; SSE-NEXT:    paddq %xmm4, %xmm0
318 ; SSE-NEXT:    pxor %xmm5, %xmm5
319 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm5
320 ; SSE-NEXT:    pextrb $0, %xmm5, %eax
321 ; SSE-NEXT:    testb $1, %al
322 ; SSE-NEXT:    je .LBB2_2
323 ; SSE-NEXT:  # %bb.1: # %cond.load
324 ; SSE-NEXT:    movq %xmm0, %rax
325 ; SSE-NEXT:    movss {{.*#+}} xmm6 = mem[0],zero,zero,zero
326 ; SSE-NEXT:    blendps {{.*#+}} xmm3 = xmm6[0],xmm3[1,2,3]
327 ; SSE-NEXT:  .LBB2_2: # %else
328 ; SSE-NEXT:    psllq $2, %xmm1
329 ; SSE-NEXT:    pextrb $4, %xmm5, %eax
330 ; SSE-NEXT:    testb $1, %al
331 ; SSE-NEXT:    je .LBB2_4
332 ; SSE-NEXT:  # %bb.3: # %cond.load1
333 ; SSE-NEXT:    pextrq $1, %xmm0, %rax
334 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
335 ; SSE-NEXT:  .LBB2_4: # %else2
336 ; SSE-NEXT:    paddq %xmm1, %xmm4
337 ; SSE-NEXT:    pxor %xmm0, %xmm0
338 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
339 ; SSE-NEXT:    pextrb $8, %xmm2, %eax
340 ; SSE-NEXT:    testb $1, %al
341 ; SSE-NEXT:    je .LBB2_6
342 ; SSE-NEXT:  # %bb.5: # %cond.load4
343 ; SSE-NEXT:    movq %xmm4, %rax
344 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
345 ; SSE-NEXT:  .LBB2_6: # %else5
346 ; SSE-NEXT:    pextrb $12, %xmm2, %eax
347 ; SSE-NEXT:    testb $1, %al
348 ; SSE-NEXT:    je .LBB2_8
349 ; SSE-NEXT:  # %bb.7: # %cond.load7
350 ; SSE-NEXT:    pextrq $1, %xmm4, %rax
351 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
352 ; SSE-NEXT:  .LBB2_8: # %else8
353 ; SSE-NEXT:    movaps %xmm3, %xmm0
354 ; SSE-NEXT:    retq
356 ; AVX1-LABEL: gather_v4f32_v4i64_v4i32:
357 ; AVX1:       # %bb.0:
358 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
359 ; AVX1-NEXT:    vpsllq $2, %xmm3, %xmm3
360 ; AVX1-NEXT:    vmovq %rdi, %xmm4
361 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
362 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
363 ; AVX1-NEXT:    vpsllq $2, %xmm0, %xmm0
364 ; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0
365 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
366 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
367 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm3
368 ; AVX1-NEXT:    vpextrb $0, %xmm3, %eax
369 ; AVX1-NEXT:    testb $1, %al
370 ; AVX1-NEXT:    je .LBB2_2
371 ; AVX1-NEXT:  # %bb.1: # %cond.load
372 ; AVX1-NEXT:    vmovq %xmm0, %rax
373 ; AVX1-NEXT:    vmovd {{.*#+}} xmm4 = mem[0],zero,zero,zero
374 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3,4,5,6,7]
375 ; AVX1-NEXT:  .LBB2_2: # %else
376 ; AVX1-NEXT:    vpextrb $4, %xmm3, %eax
377 ; AVX1-NEXT:    testb $1, %al
378 ; AVX1-NEXT:    je .LBB2_4
379 ; AVX1-NEXT:  # %bb.3: # %cond.load1
380 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
381 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
382 ; AVX1-NEXT:  .LBB2_4: # %else2
383 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
384 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
385 ; AVX1-NEXT:    vpextrb $8, %xmm1, %eax
386 ; AVX1-NEXT:    testb $1, %al
387 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
388 ; AVX1-NEXT:    je .LBB2_6
389 ; AVX1-NEXT:  # %bb.5: # %cond.load4
390 ; AVX1-NEXT:    vmovq %xmm0, %rax
391 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
392 ; AVX1-NEXT:  .LBB2_6: # %else5
393 ; AVX1-NEXT:    vpextrb $12, %xmm1, %eax
394 ; AVX1-NEXT:    testb $1, %al
395 ; AVX1-NEXT:    je .LBB2_8
396 ; AVX1-NEXT:  # %bb.7: # %cond.load7
397 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
398 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
399 ; AVX1-NEXT:  .LBB2_8: # %else8
400 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
401 ; AVX1-NEXT:    vzeroupper
402 ; AVX1-NEXT:    retq
404 ; AVX2-LABEL: gather_v4f32_v4i64_v4i32:
405 ; AVX2:       # %bb.0:
406 ; AVX2-NEXT:    vmovq %rdi, %xmm3
407 ; AVX2-NEXT:    vpbroadcastq %xmm3, %ymm3
408 ; AVX2-NEXT:    vpsllq $2, %ymm0, %ymm0
409 ; AVX2-NEXT:    vpaddq %ymm0, %ymm3, %ymm0
410 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
411 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm3
412 ; AVX2-NEXT:    vpextrb $0, %xmm3, %eax
413 ; AVX2-NEXT:    testb $1, %al
414 ; AVX2-NEXT:    je .LBB2_2
415 ; AVX2-NEXT:  # %bb.1: # %cond.load
416 ; AVX2-NEXT:    vmovq %xmm0, %rax
417 ; AVX2-NEXT:    vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero
418 ; AVX2-NEXT:    vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3]
419 ; AVX2-NEXT:  .LBB2_2: # %else
420 ; AVX2-NEXT:    vpextrb $4, %xmm3, %eax
421 ; AVX2-NEXT:    testb $1, %al
422 ; AVX2-NEXT:    je .LBB2_4
423 ; AVX2-NEXT:  # %bb.3: # %cond.load1
424 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
425 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
426 ; AVX2-NEXT:  .LBB2_4: # %else2
427 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
428 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
429 ; AVX2-NEXT:    vpextrb $8, %xmm1, %eax
430 ; AVX2-NEXT:    testb $1, %al
431 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
432 ; AVX2-NEXT:    je .LBB2_6
433 ; AVX2-NEXT:  # %bb.5: # %cond.load4
434 ; AVX2-NEXT:    vmovq %xmm0, %rax
435 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
436 ; AVX2-NEXT:  .LBB2_6: # %else5
437 ; AVX2-NEXT:    vpextrb $12, %xmm1, %eax
438 ; AVX2-NEXT:    testb $1, %al
439 ; AVX2-NEXT:    je .LBB2_8
440 ; AVX2-NEXT:  # %bb.7: # %cond.load7
441 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
442 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
443 ; AVX2-NEXT:  .LBB2_8: # %else8
444 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
445 ; AVX2-NEXT:    vzeroupper
446 ; AVX2-NEXT:    retq
448 ; AVX512-LABEL: gather_v4f32_v4i64_v4i32:
449 ; AVX512:       # %bb.0:
450 ; AVX512-NEXT:    # kill: def $xmm2 killed $xmm2 def $ymm2
451 ; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
452 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
453 ; AVX512-NEXT:    vptestnmd %zmm1, %zmm1, %k0
454 ; AVX512-NEXT:    kshiftlw $12, %k0, %k0
455 ; AVX512-NEXT:    kshiftrw $12, %k0, %k1
456 ; AVX512-NEXT:    vgatherqps (%rdi,%zmm0,4), %ymm2 {%k1}
457 ; AVX512-NEXT:    vmovaps %xmm2, %xmm0
458 ; AVX512-NEXT:    vzeroupper
459 ; AVX512-NEXT:    retq
460   %vptr0 = insertelement <4 x float*> undef, float* %base, i32 0
461   %vptr1 = shufflevector <4 x float*> %vptr0, <4 x float*> undef, <4 x i32> zeroinitializer
462   %vptr2 = getelementptr float, <4 x float*> %vptr1, <4 x i64> %idx
464   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
465   %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru)
466   ret <4 x float> %res
470 ; vXi8
473 define <16 x i8> @gather_v16i8_v16i32_v16i8(i8* %base, <16 x i32> %idx, <16 x i8> %trigger, <16 x i8> %passthru) {
474 ; SSE-LABEL: gather_v16i8_v16i32_v16i8:
475 ; SSE:       # %bb.0:
476 ; SSE-NEXT:    movq %rdi, %xmm6
477 ; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,1,0,1]
478 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[2,3,0,1]
479 ; SSE-NEXT:    pmovsxdq %xmm0, %xmm0
480 ; SSE-NEXT:    paddq %xmm8, %xmm0
481 ; SSE-NEXT:    pxor %xmm6, %xmm6
482 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm6
483 ; SSE-NEXT:    pextrb $0, %xmm6, %eax
484 ; SSE-NEXT:    testb $1, %al
485 ; SSE-NEXT:    je .LBB3_2
486 ; SSE-NEXT:  # %bb.1: # %cond.load
487 ; SSE-NEXT:    movq %xmm0, %rax
488 ; SSE-NEXT:    pinsrb $0, (%rax), %xmm5
489 ; SSE-NEXT:  .LBB3_2: # %else
490 ; SSE-NEXT:    pmovsxdq %xmm7, %xmm7
491 ; SSE-NEXT:    pextrb $1, %xmm6, %eax
492 ; SSE-NEXT:    testb $1, %al
493 ; SSE-NEXT:    je .LBB3_4
494 ; SSE-NEXT:  # %bb.3: # %cond.load1
495 ; SSE-NEXT:    pextrq $1, %xmm0, %rax
496 ; SSE-NEXT:    pinsrb $1, (%rax), %xmm5
497 ; SSE-NEXT:  .LBB3_4: # %else2
498 ; SSE-NEXT:    paddq %xmm8, %xmm7
499 ; SSE-NEXT:    pxor %xmm6, %xmm6
500 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm6
501 ; SSE-NEXT:    pextrb $2, %xmm6, %eax
502 ; SSE-NEXT:    testb $1, %al
503 ; SSE-NEXT:    je .LBB3_6
504 ; SSE-NEXT:  # %bb.5: # %cond.load4
505 ; SSE-NEXT:    movq %xmm7, %rax
506 ; SSE-NEXT:    pinsrb $2, (%rax), %xmm5
507 ; SSE-NEXT:  .LBB3_6: # %else5
508 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm0
509 ; SSE-NEXT:    pextrb $3, %xmm6, %eax
510 ; SSE-NEXT:    testb $1, %al
511 ; SSE-NEXT:    je .LBB3_8
512 ; SSE-NEXT:  # %bb.7: # %cond.load7
513 ; SSE-NEXT:    pextrq $1, %xmm7, %rax
514 ; SSE-NEXT:    pinsrb $3, (%rax), %xmm5
515 ; SSE-NEXT:  .LBB3_8: # %else8
516 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
517 ; SSE-NEXT:    paddq %xmm8, %xmm0
518 ; SSE-NEXT:    pxor %xmm6, %xmm6
519 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm6
520 ; SSE-NEXT:    pextrb $4, %xmm6, %eax
521 ; SSE-NEXT:    testb $1, %al
522 ; SSE-NEXT:    je .LBB3_10
523 ; SSE-NEXT:  # %bb.9: # %cond.load10
524 ; SSE-NEXT:    movq %xmm0, %rax
525 ; SSE-NEXT:    pinsrb $4, (%rax), %xmm5
526 ; SSE-NEXT:  .LBB3_10: # %else11
527 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm1
528 ; SSE-NEXT:    pextrb $5, %xmm6, %eax
529 ; SSE-NEXT:    testb $1, %al
530 ; SSE-NEXT:    je .LBB3_12
531 ; SSE-NEXT:  # %bb.11: # %cond.load13
532 ; SSE-NEXT:    pextrq $1, %xmm0, %rax
533 ; SSE-NEXT:    pinsrb $5, (%rax), %xmm5
534 ; SSE-NEXT:  .LBB3_12: # %else14
535 ; SSE-NEXT:    paddq %xmm8, %xmm1
536 ; SSE-NEXT:    pxor %xmm6, %xmm6
537 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm6
538 ; SSE-NEXT:    pextrb $6, %xmm6, %eax
539 ; SSE-NEXT:    testb $1, %al
540 ; SSE-NEXT:    je .LBB3_14
541 ; SSE-NEXT:  # %bb.13: # %cond.load16
542 ; SSE-NEXT:    movq %xmm1, %rax
543 ; SSE-NEXT:    pinsrb $6, (%rax), %xmm5
544 ; SSE-NEXT:  .LBB3_14: # %else17
545 ; SSE-NEXT:    pmovsxdq %xmm2, %xmm0
546 ; SSE-NEXT:    pextrb $7, %xmm6, %eax
547 ; SSE-NEXT:    testb $1, %al
548 ; SSE-NEXT:    je .LBB3_16
549 ; SSE-NEXT:  # %bb.15: # %cond.load19
550 ; SSE-NEXT:    pextrq $1, %xmm1, %rax
551 ; SSE-NEXT:    pinsrb $7, (%rax), %xmm5
552 ; SSE-NEXT:  .LBB3_16: # %else20
553 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
554 ; SSE-NEXT:    paddq %xmm8, %xmm0
555 ; SSE-NEXT:    pxor %xmm2, %xmm2
556 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm2
557 ; SSE-NEXT:    pextrb $8, %xmm2, %eax
558 ; SSE-NEXT:    testb $1, %al
559 ; SSE-NEXT:    je .LBB3_18
560 ; SSE-NEXT:  # %bb.17: # %cond.load22
561 ; SSE-NEXT:    movq %xmm0, %rax
562 ; SSE-NEXT:    pinsrb $8, (%rax), %xmm5
563 ; SSE-NEXT:  .LBB3_18: # %else23
564 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm1
565 ; SSE-NEXT:    pextrb $9, %xmm2, %eax
566 ; SSE-NEXT:    testb $1, %al
567 ; SSE-NEXT:    je .LBB3_20
568 ; SSE-NEXT:  # %bb.19: # %cond.load25
569 ; SSE-NEXT:    pextrq $1, %xmm0, %rax
570 ; SSE-NEXT:    pinsrb $9, (%rax), %xmm5
571 ; SSE-NEXT:  .LBB3_20: # %else26
572 ; SSE-NEXT:    paddq %xmm8, %xmm1
573 ; SSE-NEXT:    pxor %xmm2, %xmm2
574 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm2
575 ; SSE-NEXT:    pextrb $10, %xmm2, %eax
576 ; SSE-NEXT:    testb $1, %al
577 ; SSE-NEXT:    je .LBB3_22
578 ; SSE-NEXT:  # %bb.21: # %cond.load28
579 ; SSE-NEXT:    movq %xmm1, %rax
580 ; SSE-NEXT:    pinsrb $10, (%rax), %xmm5
581 ; SSE-NEXT:  .LBB3_22: # %else29
582 ; SSE-NEXT:    pmovsxdq %xmm3, %xmm0
583 ; SSE-NEXT:    pextrb $11, %xmm2, %eax
584 ; SSE-NEXT:    testb $1, %al
585 ; SSE-NEXT:    je .LBB3_24
586 ; SSE-NEXT:  # %bb.23: # %cond.load31
587 ; SSE-NEXT:    pextrq $1, %xmm1, %rax
588 ; SSE-NEXT:    pinsrb $11, (%rax), %xmm5
589 ; SSE-NEXT:  .LBB3_24: # %else32
590 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
591 ; SSE-NEXT:    paddq %xmm8, %xmm0
592 ; SSE-NEXT:    pxor %xmm2, %xmm2
593 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm2
594 ; SSE-NEXT:    pextrb $12, %xmm2, %eax
595 ; SSE-NEXT:    testb $1, %al
596 ; SSE-NEXT:    je .LBB3_26
597 ; SSE-NEXT:  # %bb.25: # %cond.load34
598 ; SSE-NEXT:    movq %xmm0, %rax
599 ; SSE-NEXT:    pinsrb $12, (%rax), %xmm5
600 ; SSE-NEXT:  .LBB3_26: # %else35
601 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm1
602 ; SSE-NEXT:    pextrb $13, %xmm2, %eax
603 ; SSE-NEXT:    testb $1, %al
604 ; SSE-NEXT:    je .LBB3_28
605 ; SSE-NEXT:  # %bb.27: # %cond.load37
606 ; SSE-NEXT:    pextrq $1, %xmm0, %rax
607 ; SSE-NEXT:    pinsrb $13, (%rax), %xmm5
608 ; SSE-NEXT:  .LBB3_28: # %else38
609 ; SSE-NEXT:    paddq %xmm1, %xmm8
610 ; SSE-NEXT:    pxor %xmm0, %xmm0
611 ; SSE-NEXT:    pcmpeqb %xmm0, %xmm4
612 ; SSE-NEXT:    pextrb $14, %xmm4, %eax
613 ; SSE-NEXT:    testb $1, %al
614 ; SSE-NEXT:    je .LBB3_30
615 ; SSE-NEXT:  # %bb.29: # %cond.load40
616 ; SSE-NEXT:    movq %xmm8, %rax
617 ; SSE-NEXT:    pinsrb $14, (%rax), %xmm5
618 ; SSE-NEXT:  .LBB3_30: # %else41
619 ; SSE-NEXT:    pextrb $15, %xmm4, %eax
620 ; SSE-NEXT:    testb $1, %al
621 ; SSE-NEXT:    je .LBB3_32
622 ; SSE-NEXT:  # %bb.31: # %cond.load43
623 ; SSE-NEXT:    pextrq $1, %xmm8, %rax
624 ; SSE-NEXT:    pinsrb $15, (%rax), %xmm5
625 ; SSE-NEXT:  .LBB3_32: # %else44
626 ; SSE-NEXT:    movdqa %xmm5, %xmm0
627 ; SSE-NEXT:    retq
629 ; AVX1-LABEL: gather_v16i8_v16i32_v16i8:
630 ; AVX1:       # %bb.0:
631 ; AVX1-NEXT:    vmovq %rdi, %xmm4
632 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
633 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
634 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm0[2,3,0,1]
635 ; AVX1-NEXT:    vpmovsxdq %xmm6, %xmm6
636 ; AVX1-NEXT:    vpaddq %xmm6, %xmm4, %xmm6
637 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
638 ; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0
639 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
640 ; AVX1-NEXT:    vpxor %xmm6, %xmm6, %xmm6
641 ; AVX1-NEXT:    vpcmpeqb %xmm6, %xmm2, %xmm6
642 ; AVX1-NEXT:    vpextrb $0, %xmm6, %eax
643 ; AVX1-NEXT:    testb $1, %al
644 ; AVX1-NEXT:    je .LBB3_2
645 ; AVX1-NEXT:  # %bb.1: # %cond.load
646 ; AVX1-NEXT:    vmovq %xmm0, %rax
647 ; AVX1-NEXT:    vpinsrb $0, (%rax), %xmm3, %xmm3
648 ; AVX1-NEXT:  .LBB3_2: # %else
649 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm5[2,3,0,1]
650 ; AVX1-NEXT:    vpmovsxdq %xmm5, %xmm5
651 ; AVX1-NEXT:    vpextrb $1, %xmm6, %eax
652 ; AVX1-NEXT:    testb $1, %al
653 ; AVX1-NEXT:    je .LBB3_4
654 ; AVX1-NEXT:  # %bb.3: # %cond.load1
655 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
656 ; AVX1-NEXT:    vpinsrb $1, (%rax), %xmm3, %xmm3
657 ; AVX1-NEXT:  .LBB3_4: # %else2
658 ; AVX1-NEXT:    vpmovsxdq %xmm7, %xmm6
659 ; AVX1-NEXT:    vpaddq %xmm5, %xmm4, %xmm5
660 ; AVX1-NEXT:    vpxor %xmm7, %xmm7, %xmm7
661 ; AVX1-NEXT:    vpcmpeqb %xmm7, %xmm2, %xmm7
662 ; AVX1-NEXT:    vpextrb $2, %xmm7, %eax
663 ; AVX1-NEXT:    testb $1, %al
664 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
665 ; AVX1-NEXT:    je .LBB3_6
666 ; AVX1-NEXT:  # %bb.5: # %cond.load4
667 ; AVX1-NEXT:    vmovq %xmm0, %rax
668 ; AVX1-NEXT:    vpinsrb $2, (%rax), %xmm3, %xmm3
669 ; AVX1-NEXT:  .LBB3_6: # %else5
670 ; AVX1-NEXT:    vpaddq %xmm6, %xmm4, %xmm6
671 ; AVX1-NEXT:    vpextrb $3, %xmm7, %eax
672 ; AVX1-NEXT:    testb $1, %al
673 ; AVX1-NEXT:    je .LBB3_8
674 ; AVX1-NEXT:  # %bb.7: # %cond.load7
675 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
676 ; AVX1-NEXT:    vpinsrb $3, (%rax), %xmm3, %xmm3
677 ; AVX1-NEXT:  .LBB3_8: # %else8
678 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm0
679 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
680 ; AVX1-NEXT:    vpcmpeqb %xmm5, %xmm2, %xmm5
681 ; AVX1-NEXT:    vpextrb $4, %xmm5, %eax
682 ; AVX1-NEXT:    testb $1, %al
683 ; AVX1-NEXT:    je .LBB3_10
684 ; AVX1-NEXT:  # %bb.9: # %cond.load10
685 ; AVX1-NEXT:    vmovq %xmm0, %rax
686 ; AVX1-NEXT:    vpinsrb $4, (%rax), %xmm3, %xmm3
687 ; AVX1-NEXT:  .LBB3_10: # %else11
688 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm1[2,3,0,1]
689 ; AVX1-NEXT:    vpmovsxdq %xmm1, %xmm7
690 ; AVX1-NEXT:    vpextrb $5, %xmm5, %eax
691 ; AVX1-NEXT:    testb $1, %al
692 ; AVX1-NEXT:    je .LBB3_12
693 ; AVX1-NEXT:  # %bb.11: # %cond.load13
694 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
695 ; AVX1-NEXT:    vpinsrb $5, (%rax), %xmm3, %xmm3
696 ; AVX1-NEXT:  .LBB3_12: # %else14
697 ; AVX1-NEXT:    vpmovsxdq %xmm6, %xmm6
698 ; AVX1-NEXT:    vpaddq %xmm7, %xmm4, %xmm5
699 ; AVX1-NEXT:    vpxor %xmm7, %xmm7, %xmm7
700 ; AVX1-NEXT:    vpcmpeqb %xmm7, %xmm2, %xmm7
701 ; AVX1-NEXT:    vpextrb $6, %xmm7, %eax
702 ; AVX1-NEXT:    testb $1, %al
703 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
704 ; AVX1-NEXT:    je .LBB3_14
705 ; AVX1-NEXT:  # %bb.13: # %cond.load16
706 ; AVX1-NEXT:    vmovq %xmm0, %rax
707 ; AVX1-NEXT:    vpinsrb $6, (%rax), %xmm3, %xmm3
708 ; AVX1-NEXT:  .LBB3_14: # %else17
709 ; AVX1-NEXT:    vpaddq %xmm6, %xmm4, %xmm6
710 ; AVX1-NEXT:    vpextrb $7, %xmm7, %eax
711 ; AVX1-NEXT:    testb $1, %al
712 ; AVX1-NEXT:    je .LBB3_16
713 ; AVX1-NEXT:  # %bb.15: # %cond.load19
714 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
715 ; AVX1-NEXT:    vpinsrb $7, (%rax), %xmm3, %xmm3
716 ; AVX1-NEXT:  .LBB3_16: # %else20
717 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
718 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm0
719 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
720 ; AVX1-NEXT:    vpcmpeqb %xmm5, %xmm2, %xmm5
721 ; AVX1-NEXT:    vpextrb $8, %xmm5, %eax
722 ; AVX1-NEXT:    testb $1, %al
723 ; AVX1-NEXT:    je .LBB3_18
724 ; AVX1-NEXT:  # %bb.17: # %cond.load22
725 ; AVX1-NEXT:    vmovq %xmm0, %rax
726 ; AVX1-NEXT:    vpinsrb $8, (%rax), %xmm3, %xmm3
727 ; AVX1-NEXT:  .LBB3_18: # %else23
728 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm1[2,3,0,1]
729 ; AVX1-NEXT:    vpmovsxdq %xmm1, %xmm1
730 ; AVX1-NEXT:    vpextrb $9, %xmm5, %eax
731 ; AVX1-NEXT:    testb $1, %al
732 ; AVX1-NEXT:    je .LBB3_20
733 ; AVX1-NEXT:  # %bb.19: # %cond.load25
734 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
735 ; AVX1-NEXT:    vpinsrb $9, (%rax), %xmm3, %xmm3
736 ; AVX1-NEXT:  .LBB3_20: # %else26
737 ; AVX1-NEXT:    vpmovsxdq %xmm6, %xmm5
738 ; AVX1-NEXT:    vpaddq %xmm1, %xmm4, %xmm1
739 ; AVX1-NEXT:    vpxor %xmm6, %xmm6, %xmm6
740 ; AVX1-NEXT:    vpcmpeqb %xmm6, %xmm2, %xmm6
741 ; AVX1-NEXT:    vpextrb $10, %xmm6, %eax
742 ; AVX1-NEXT:    testb $1, %al
743 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
744 ; AVX1-NEXT:    je .LBB3_22
745 ; AVX1-NEXT:  # %bb.21: # %cond.load28
746 ; AVX1-NEXT:    vmovq %xmm0, %rax
747 ; AVX1-NEXT:    vpinsrb $10, (%rax), %xmm3, %xmm3
748 ; AVX1-NEXT:  .LBB3_22: # %else29
749 ; AVX1-NEXT:    vpaddq %xmm5, %xmm4, %xmm4
750 ; AVX1-NEXT:    vpextrb $11, %xmm6, %eax
751 ; AVX1-NEXT:    testb $1, %al
752 ; AVX1-NEXT:    je .LBB3_24
753 ; AVX1-NEXT:  # %bb.23: # %cond.load31
754 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
755 ; AVX1-NEXT:    vpinsrb $11, (%rax), %xmm3, %xmm3
756 ; AVX1-NEXT:  .LBB3_24: # %else32
757 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm0
758 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
759 ; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm2, %xmm1
760 ; AVX1-NEXT:    vpextrb $12, %xmm1, %eax
761 ; AVX1-NEXT:    testb $1, %al
762 ; AVX1-NEXT:    je .LBB3_26
763 ; AVX1-NEXT:  # %bb.25: # %cond.load34
764 ; AVX1-NEXT:    vmovq %xmm0, %rax
765 ; AVX1-NEXT:    vpinsrb $12, (%rax), %xmm3, %xmm3
766 ; AVX1-NEXT:  .LBB3_26: # %else35
767 ; AVX1-NEXT:    vpextrb $13, %xmm1, %eax
768 ; AVX1-NEXT:    testb $1, %al
769 ; AVX1-NEXT:    je .LBB3_28
770 ; AVX1-NEXT:  # %bb.27: # %cond.load37
771 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
772 ; AVX1-NEXT:    vpinsrb $13, (%rax), %xmm3, %xmm3
773 ; AVX1-NEXT:  .LBB3_28: # %else38
774 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
775 ; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm2, %xmm1
776 ; AVX1-NEXT:    vpextrb $14, %xmm1, %eax
777 ; AVX1-NEXT:    testb $1, %al
778 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
779 ; AVX1-NEXT:    je .LBB3_30
780 ; AVX1-NEXT:  # %bb.29: # %cond.load40
781 ; AVX1-NEXT:    vmovq %xmm0, %rax
782 ; AVX1-NEXT:    vpinsrb $14, (%rax), %xmm3, %xmm3
783 ; AVX1-NEXT:  .LBB3_30: # %else41
784 ; AVX1-NEXT:    vpextrb $15, %xmm1, %eax
785 ; AVX1-NEXT:    testb $1, %al
786 ; AVX1-NEXT:    je .LBB3_32
787 ; AVX1-NEXT:  # %bb.31: # %cond.load43
788 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
789 ; AVX1-NEXT:    vpinsrb $15, (%rax), %xmm3, %xmm3
790 ; AVX1-NEXT:  .LBB3_32: # %else44
791 ; AVX1-NEXT:    vmovdqa %xmm3, %xmm0
792 ; AVX1-NEXT:    vzeroupper
793 ; AVX1-NEXT:    retq
795 ; AVX2-LABEL: gather_v16i8_v16i32_v16i8:
796 ; AVX2:       # %bb.0:
797 ; AVX2-NEXT:    vmovq %rdi, %xmm4
798 ; AVX2-NEXT:    vpbroadcastq %xmm4, %ymm4
799 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm5
800 ; AVX2-NEXT:    vpaddq %ymm5, %ymm4, %ymm5
801 ; AVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
802 ; AVX2-NEXT:    vpcmpeqb %xmm6, %xmm2, %xmm6
803 ; AVX2-NEXT:    vpextrb $0, %xmm6, %eax
804 ; AVX2-NEXT:    testb $1, %al
805 ; AVX2-NEXT:    je .LBB3_2
806 ; AVX2-NEXT:  # %bb.1: # %cond.load
807 ; AVX2-NEXT:    vmovq %xmm5, %rax
808 ; AVX2-NEXT:    vpinsrb $0, (%rax), %xmm3, %xmm3
809 ; AVX2-NEXT:  .LBB3_2: # %else
810 ; AVX2-NEXT:    vpextrb $1, %xmm6, %eax
811 ; AVX2-NEXT:    testb $1, %al
812 ; AVX2-NEXT:    je .LBB3_4
813 ; AVX2-NEXT:  # %bb.3: # %cond.load1
814 ; AVX2-NEXT:    vpextrq $1, %xmm5, %rax
815 ; AVX2-NEXT:    vpinsrb $1, (%rax), %xmm3, %xmm3
816 ; AVX2-NEXT:  .LBB3_4: # %else2
817 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
818 ; AVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
819 ; AVX2-NEXT:    vpcmpeqb %xmm6, %xmm2, %xmm6
820 ; AVX2-NEXT:    vpextrb $2, %xmm6, %eax
821 ; AVX2-NEXT:    testb $1, %al
822 ; AVX2-NEXT:    vextracti128 $1, %ymm5, %xmm5
823 ; AVX2-NEXT:    je .LBB3_6
824 ; AVX2-NEXT:  # %bb.5: # %cond.load4
825 ; AVX2-NEXT:    vmovq %xmm5, %rax
826 ; AVX2-NEXT:    vpinsrb $2, (%rax), %xmm3, %xmm3
827 ; AVX2-NEXT:  .LBB3_6: # %else5
828 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
829 ; AVX2-NEXT:    vpextrb $3, %xmm6, %eax
830 ; AVX2-NEXT:    testb $1, %al
831 ; AVX2-NEXT:    je .LBB3_8
832 ; AVX2-NEXT:  # %bb.7: # %cond.load7
833 ; AVX2-NEXT:    vpextrq $1, %xmm5, %rax
834 ; AVX2-NEXT:    vpinsrb $3, (%rax), %xmm3, %xmm3
835 ; AVX2-NEXT:  .LBB3_8: # %else8
836 ; AVX2-NEXT:    vpaddq %ymm0, %ymm4, %ymm0
837 ; AVX2-NEXT:    vpxor %xmm5, %xmm5, %xmm5
838 ; AVX2-NEXT:    vpcmpeqb %xmm5, %xmm2, %xmm5
839 ; AVX2-NEXT:    vpextrb $4, %xmm5, %eax
840 ; AVX2-NEXT:    testb $1, %al
841 ; AVX2-NEXT:    je .LBB3_10
842 ; AVX2-NEXT:  # %bb.9: # %cond.load10
843 ; AVX2-NEXT:    vmovq %xmm0, %rax
844 ; AVX2-NEXT:    vpinsrb $4, (%rax), %xmm3, %xmm3
845 ; AVX2-NEXT:  .LBB3_10: # %else11
846 ; AVX2-NEXT:    vpextrb $5, %xmm5, %eax
847 ; AVX2-NEXT:    testb $1, %al
848 ; AVX2-NEXT:    je .LBB3_12
849 ; AVX2-NEXT:  # %bb.11: # %cond.load13
850 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
851 ; AVX2-NEXT:    vpinsrb $5, (%rax), %xmm3, %xmm3
852 ; AVX2-NEXT:  .LBB3_12: # %else14
853 ; AVX2-NEXT:    vpxor %xmm5, %xmm5, %xmm5
854 ; AVX2-NEXT:    vpcmpeqb %xmm5, %xmm2, %xmm5
855 ; AVX2-NEXT:    vpextrb $6, %xmm5, %eax
856 ; AVX2-NEXT:    testb $1, %al
857 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
858 ; AVX2-NEXT:    je .LBB3_14
859 ; AVX2-NEXT:  # %bb.13: # %cond.load16
860 ; AVX2-NEXT:    vmovq %xmm0, %rax
861 ; AVX2-NEXT:    vpinsrb $6, (%rax), %xmm3, %xmm3
862 ; AVX2-NEXT:  .LBB3_14: # %else17
863 ; AVX2-NEXT:    vpmovsxdq %xmm1, %ymm6
864 ; AVX2-NEXT:    vpextrb $7, %xmm5, %eax
865 ; AVX2-NEXT:    testb $1, %al
866 ; AVX2-NEXT:    je .LBB3_16
867 ; AVX2-NEXT:  # %bb.15: # %cond.load19
868 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
869 ; AVX2-NEXT:    vpinsrb $7, (%rax), %xmm3, %xmm3
870 ; AVX2-NEXT:  .LBB3_16: # %else20
871 ; AVX2-NEXT:    vpaddq %ymm6, %ymm4, %ymm0
872 ; AVX2-NEXT:    vpxor %xmm5, %xmm5, %xmm5
873 ; AVX2-NEXT:    vpcmpeqb %xmm5, %xmm2, %xmm5
874 ; AVX2-NEXT:    vpextrb $8, %xmm5, %eax
875 ; AVX2-NEXT:    testb $1, %al
876 ; AVX2-NEXT:    je .LBB3_18
877 ; AVX2-NEXT:  # %bb.17: # %cond.load22
878 ; AVX2-NEXT:    vmovq %xmm0, %rax
879 ; AVX2-NEXT:    vpinsrb $8, (%rax), %xmm3, %xmm3
880 ; AVX2-NEXT:  .LBB3_18: # %else23
881 ; AVX2-NEXT:    vpextrb $9, %xmm5, %eax
882 ; AVX2-NEXT:    testb $1, %al
883 ; AVX2-NEXT:    je .LBB3_20
884 ; AVX2-NEXT:  # %bb.19: # %cond.load25
885 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
886 ; AVX2-NEXT:    vpinsrb $9, (%rax), %xmm3, %xmm3
887 ; AVX2-NEXT:  .LBB3_20: # %else26
888 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
889 ; AVX2-NEXT:    vpxor %xmm5, %xmm5, %xmm5
890 ; AVX2-NEXT:    vpcmpeqb %xmm5, %xmm2, %xmm5
891 ; AVX2-NEXT:    vpextrb $10, %xmm5, %eax
892 ; AVX2-NEXT:    testb $1, %al
893 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
894 ; AVX2-NEXT:    je .LBB3_22
895 ; AVX2-NEXT:  # %bb.21: # %cond.load28
896 ; AVX2-NEXT:    vmovq %xmm0, %rax
897 ; AVX2-NEXT:    vpinsrb $10, (%rax), %xmm3, %xmm3
898 ; AVX2-NEXT:  .LBB3_22: # %else29
899 ; AVX2-NEXT:    vpmovsxdq %xmm1, %ymm1
900 ; AVX2-NEXT:    vpextrb $11, %xmm5, %eax
901 ; AVX2-NEXT:    testb $1, %al
902 ; AVX2-NEXT:    je .LBB3_24
903 ; AVX2-NEXT:  # %bb.23: # %cond.load31
904 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
905 ; AVX2-NEXT:    vpinsrb $11, (%rax), %xmm3, %xmm3
906 ; AVX2-NEXT:  .LBB3_24: # %else32
907 ; AVX2-NEXT:    vpaddq %ymm1, %ymm4, %ymm0
908 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
909 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm2, %xmm1
910 ; AVX2-NEXT:    vpextrb $12, %xmm1, %eax
911 ; AVX2-NEXT:    testb $1, %al
912 ; AVX2-NEXT:    je .LBB3_26
913 ; AVX2-NEXT:  # %bb.25: # %cond.load34
914 ; AVX2-NEXT:    vmovq %xmm0, %rax
915 ; AVX2-NEXT:    vpinsrb $12, (%rax), %xmm3, %xmm3
916 ; AVX2-NEXT:  .LBB3_26: # %else35
917 ; AVX2-NEXT:    vpextrb $13, %xmm1, %eax
918 ; AVX2-NEXT:    testb $1, %al
919 ; AVX2-NEXT:    je .LBB3_28
920 ; AVX2-NEXT:  # %bb.27: # %cond.load37
921 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
922 ; AVX2-NEXT:    vpinsrb $13, (%rax), %xmm3, %xmm3
923 ; AVX2-NEXT:  .LBB3_28: # %else38
924 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
925 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm2, %xmm1
926 ; AVX2-NEXT:    vpextrb $14, %xmm1, %eax
927 ; AVX2-NEXT:    testb $1, %al
928 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
929 ; AVX2-NEXT:    je .LBB3_30
930 ; AVX2-NEXT:  # %bb.29: # %cond.load40
931 ; AVX2-NEXT:    vmovq %xmm0, %rax
932 ; AVX2-NEXT:    vpinsrb $14, (%rax), %xmm3, %xmm3
933 ; AVX2-NEXT:  .LBB3_30: # %else41
934 ; AVX2-NEXT:    vpextrb $15, %xmm1, %eax
935 ; AVX2-NEXT:    testb $1, %al
936 ; AVX2-NEXT:    je .LBB3_32
937 ; AVX2-NEXT:  # %bb.31: # %cond.load43
938 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
939 ; AVX2-NEXT:    vpinsrb $15, (%rax), %xmm3, %xmm3
940 ; AVX2-NEXT:  .LBB3_32: # %else44
941 ; AVX2-NEXT:    vmovdqa %xmm3, %xmm0
942 ; AVX2-NEXT:    vzeroupper
943 ; AVX2-NEXT:    retq
945 ; AVX512-LABEL: gather_v16i8_v16i32_v16i8:
946 ; AVX512:       # %bb.0:
947 ; AVX512-NEXT:    vpbroadcastq %rdi, %zmm3
948 ; AVX512-NEXT:    vpmovsxdq %ymm0, %zmm4
949 ; AVX512-NEXT:    vpaddq %zmm4, %zmm3, %zmm4
950 ; AVX512-NEXT:    vpxor %xmm5, %xmm5, %xmm5
951 ; AVX512-NEXT:    vpcmpeqb %xmm5, %xmm1, %xmm5
952 ; AVX512-NEXT:    vpmovsxbd %xmm5, %zmm5
953 ; AVX512-NEXT:    vptestmd %zmm5, %zmm5, %k0
954 ; AVX512-NEXT:    kmovw %k0, %eax
955 ; AVX512-NEXT:    testb $1, %al
956 ; AVX512-NEXT:    je .LBB3_2
957 ; AVX512-NEXT:  # %bb.1: # %cond.load
958 ; AVX512-NEXT:    vmovq %xmm4, %rax
959 ; AVX512-NEXT:    vpinsrb $0, (%rax), %xmm2, %xmm2
960 ; AVX512-NEXT:  .LBB3_2: # %else
961 ; AVX512-NEXT:    kshiftrw $1, %k0, %k0
962 ; AVX512-NEXT:    kmovw %k0, %eax
963 ; AVX512-NEXT:    testb $1, %al
964 ; AVX512-NEXT:    je .LBB3_4
965 ; AVX512-NEXT:  # %bb.3: # %cond.load1
966 ; AVX512-NEXT:    vpextrq $1, %xmm4, %rax
967 ; AVX512-NEXT:    vpinsrb $1, (%rax), %xmm2, %xmm2
968 ; AVX512-NEXT:  .LBB3_4: # %else2
969 ; AVX512-NEXT:    vpxor %xmm5, %xmm5, %xmm5
970 ; AVX512-NEXT:    vpcmpeqb %xmm5, %xmm1, %xmm5
971 ; AVX512-NEXT:    vpmovsxbd %xmm5, %zmm5
972 ; AVX512-NEXT:    vptestmd %zmm5, %zmm5, %k0
973 ; AVX512-NEXT:    kshiftrw $2, %k0, %k1
974 ; AVX512-NEXT:    kmovw %k1, %eax
975 ; AVX512-NEXT:    testb $1, %al
976 ; AVX512-NEXT:    je .LBB3_6
977 ; AVX512-NEXT:  # %bb.5: # %cond.load4
978 ; AVX512-NEXT:    vextracti128 $1, %ymm4, %xmm5
979 ; AVX512-NEXT:    vmovq %xmm5, %rax
980 ; AVX512-NEXT:    vpinsrb $2, (%rax), %xmm2, %xmm2
981 ; AVX512-NEXT:  .LBB3_6: # %else5
982 ; AVX512-NEXT:    kshiftrw $3, %k0, %k0
983 ; AVX512-NEXT:    kmovw %k0, %eax
984 ; AVX512-NEXT:    testb $1, %al
985 ; AVX512-NEXT:    je .LBB3_8
986 ; AVX512-NEXT:  # %bb.7: # %cond.load7
987 ; AVX512-NEXT:    vextracti128 $1, %ymm4, %xmm5
988 ; AVX512-NEXT:    vpextrq $1, %xmm5, %rax
989 ; AVX512-NEXT:    vpinsrb $3, (%rax), %xmm2, %xmm2
990 ; AVX512-NEXT:  .LBB3_8: # %else8
991 ; AVX512-NEXT:    vpxor %xmm5, %xmm5, %xmm5
992 ; AVX512-NEXT:    vpcmpeqb %xmm5, %xmm1, %xmm5
993 ; AVX512-NEXT:    vpmovsxbd %xmm5, %zmm5
994 ; AVX512-NEXT:    vptestmd %zmm5, %zmm5, %k0
995 ; AVX512-NEXT:    kshiftrw $4, %k0, %k1
996 ; AVX512-NEXT:    kmovw %k1, %eax
997 ; AVX512-NEXT:    testb $1, %al
998 ; AVX512-NEXT:    vextracti32x4 $2, %zmm4, %xmm5
999 ; AVX512-NEXT:    je .LBB3_10
1000 ; AVX512-NEXT:  # %bb.9: # %cond.load10
1001 ; AVX512-NEXT:    vmovq %xmm5, %rax
1002 ; AVX512-NEXT:    vpinsrb $4, (%rax), %xmm2, %xmm2
1003 ; AVX512-NEXT:  .LBB3_10: # %else11
1004 ; AVX512-NEXT:    kshiftrw $5, %k0, %k0
1005 ; AVX512-NEXT:    kmovw %k0, %eax
1006 ; AVX512-NEXT:    testb $1, %al
1007 ; AVX512-NEXT:    je .LBB3_12
1008 ; AVX512-NEXT:  # %bb.11: # %cond.load13
1009 ; AVX512-NEXT:    vpextrq $1, %xmm5, %rax
1010 ; AVX512-NEXT:    vpinsrb $5, (%rax), %xmm2, %xmm2
1011 ; AVX512-NEXT:  .LBB3_12: # %else14
1012 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
1013 ; AVX512-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1014 ; AVX512-NEXT:    vpcmpeqb %xmm5, %xmm1, %xmm5
1015 ; AVX512-NEXT:    vpmovsxbd %xmm5, %zmm5
1016 ; AVX512-NEXT:    vptestmd %zmm5, %zmm5, %k0
1017 ; AVX512-NEXT:    kshiftrw $6, %k0, %k1
1018 ; AVX512-NEXT:    kmovw %k1, %eax
1019 ; AVX512-NEXT:    testb $1, %al
1020 ; AVX512-NEXT:    vextracti32x4 $3, %zmm4, %xmm4
1021 ; AVX512-NEXT:    je .LBB3_14
1022 ; AVX512-NEXT:  # %bb.13: # %cond.load16
1023 ; AVX512-NEXT:    vmovq %xmm4, %rax
1024 ; AVX512-NEXT:    vpinsrb $6, (%rax), %xmm2, %xmm2
1025 ; AVX512-NEXT:  .LBB3_14: # %else17
1026 ; AVX512-NEXT:    vpmovsxdq %ymm0, %zmm0
1027 ; AVX512-NEXT:    kshiftrw $7, %k0, %k0
1028 ; AVX512-NEXT:    kmovw %k0, %eax
1029 ; AVX512-NEXT:    testb $1, %al
1030 ; AVX512-NEXT:    je .LBB3_16
1031 ; AVX512-NEXT:  # %bb.15: # %cond.load19
1032 ; AVX512-NEXT:    vpextrq $1, %xmm4, %rax
1033 ; AVX512-NEXT:    vpinsrb $7, (%rax), %xmm2, %xmm2
1034 ; AVX512-NEXT:  .LBB3_16: # %else20
1035 ; AVX512-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
1036 ; AVX512-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1037 ; AVX512-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm3
1038 ; AVX512-NEXT:    vpmovsxbd %xmm3, %zmm3
1039 ; AVX512-NEXT:    vptestmd %zmm3, %zmm3, %k0
1040 ; AVX512-NEXT:    kshiftrw $8, %k0, %k1
1041 ; AVX512-NEXT:    kmovw %k1, %eax
1042 ; AVX512-NEXT:    testb $1, %al
1043 ; AVX512-NEXT:    je .LBB3_18
1044 ; AVX512-NEXT:  # %bb.17: # %cond.load22
1045 ; AVX512-NEXT:    vmovq %xmm0, %rax
1046 ; AVX512-NEXT:    vpinsrb $8, (%rax), %xmm2, %xmm2
1047 ; AVX512-NEXT:  .LBB3_18: # %else23
1048 ; AVX512-NEXT:    kshiftrw $9, %k0, %k0
1049 ; AVX512-NEXT:    kmovw %k0, %eax
1050 ; AVX512-NEXT:    testb $1, %al
1051 ; AVX512-NEXT:    je .LBB3_20
1052 ; AVX512-NEXT:  # %bb.19: # %cond.load25
1053 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rax
1054 ; AVX512-NEXT:    vpinsrb $9, (%rax), %xmm2, %xmm2
1055 ; AVX512-NEXT:  .LBB3_20: # %else26
1056 ; AVX512-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1057 ; AVX512-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm3
1058 ; AVX512-NEXT:    vpmovsxbd %xmm3, %zmm3
1059 ; AVX512-NEXT:    vptestmd %zmm3, %zmm3, %k0
1060 ; AVX512-NEXT:    kshiftrw $10, %k0, %k1
1061 ; AVX512-NEXT:    kmovw %k1, %eax
1062 ; AVX512-NEXT:    testb $1, %al
1063 ; AVX512-NEXT:    je .LBB3_22
1064 ; AVX512-NEXT:  # %bb.21: # %cond.load28
1065 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm3
1066 ; AVX512-NEXT:    vmovq %xmm3, %rax
1067 ; AVX512-NEXT:    vpinsrb $10, (%rax), %xmm2, %xmm2
1068 ; AVX512-NEXT:  .LBB3_22: # %else29
1069 ; AVX512-NEXT:    kshiftrw $11, %k0, %k0
1070 ; AVX512-NEXT:    kmovw %k0, %eax
1071 ; AVX512-NEXT:    testb $1, %al
1072 ; AVX512-NEXT:    je .LBB3_24
1073 ; AVX512-NEXT:  # %bb.23: # %cond.load31
1074 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm3
1075 ; AVX512-NEXT:    vpextrq $1, %xmm3, %rax
1076 ; AVX512-NEXT:    vpinsrb $11, (%rax), %xmm2, %xmm2
1077 ; AVX512-NEXT:  .LBB3_24: # %else32
1078 ; AVX512-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1079 ; AVX512-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm3
1080 ; AVX512-NEXT:    vpmovsxbd %xmm3, %zmm3
1081 ; AVX512-NEXT:    vptestmd %zmm3, %zmm3, %k0
1082 ; AVX512-NEXT:    kshiftrw $12, %k0, %k1
1083 ; AVX512-NEXT:    kmovw %k1, %eax
1084 ; AVX512-NEXT:    testb $1, %al
1085 ; AVX512-NEXT:    vextracti32x4 $2, %zmm0, %xmm3
1086 ; AVX512-NEXT:    je .LBB3_26
1087 ; AVX512-NEXT:  # %bb.25: # %cond.load34
1088 ; AVX512-NEXT:    vmovq %xmm3, %rax
1089 ; AVX512-NEXT:    vpinsrb $12, (%rax), %xmm2, %xmm2
1090 ; AVX512-NEXT:  .LBB3_26: # %else35
1091 ; AVX512-NEXT:    kshiftrw $13, %k0, %k0
1092 ; AVX512-NEXT:    kmovw %k0, %eax
1093 ; AVX512-NEXT:    testb $1, %al
1094 ; AVX512-NEXT:    je .LBB3_28
1095 ; AVX512-NEXT:  # %bb.27: # %cond.load37
1096 ; AVX512-NEXT:    vpextrq $1, %xmm3, %rax
1097 ; AVX512-NEXT:    vpinsrb $13, (%rax), %xmm2, %xmm2
1098 ; AVX512-NEXT:  .LBB3_28: # %else38
1099 ; AVX512-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1100 ; AVX512-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm1
1101 ; AVX512-NEXT:    vpmovsxbd %xmm1, %zmm1
1102 ; AVX512-NEXT:    vptestmd %zmm1, %zmm1, %k0
1103 ; AVX512-NEXT:    kshiftrw $14, %k0, %k1
1104 ; AVX512-NEXT:    kmovw %k1, %eax
1105 ; AVX512-NEXT:    testb $1, %al
1106 ; AVX512-NEXT:    vextracti32x4 $3, %zmm0, %xmm0
1107 ; AVX512-NEXT:    je .LBB3_30
1108 ; AVX512-NEXT:  # %bb.29: # %cond.load40
1109 ; AVX512-NEXT:    vmovq %xmm0, %rax
1110 ; AVX512-NEXT:    vpinsrb $14, (%rax), %xmm2, %xmm2
1111 ; AVX512-NEXT:  .LBB3_30: # %else41
1112 ; AVX512-NEXT:    kshiftrw $15, %k0, %k0
1113 ; AVX512-NEXT:    kmovw %k0, %eax
1114 ; AVX512-NEXT:    testb $1, %al
1115 ; AVX512-NEXT:    je .LBB3_32
1116 ; AVX512-NEXT:  # %bb.31: # %cond.load43
1117 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rax
1118 ; AVX512-NEXT:    vpinsrb $15, (%rax), %xmm2, %xmm2
1119 ; AVX512-NEXT:  .LBB3_32: # %else44
1120 ; AVX512-NEXT:    vmovdqa %xmm2, %xmm0
1121 ; AVX512-NEXT:    vzeroupper
1122 ; AVX512-NEXT:    retq
1123   %vptr0 = insertelement <16 x i8*> undef, i8* %base, i32 0
1124   %vptr1 = shufflevector <16 x i8*> %vptr0, <16 x i8*> undef, <16 x i32> zeroinitializer
1125   %vptr2 = getelementptr i8, <16 x i8*> %vptr1, <16 x i32> %idx
1127   %mask = icmp eq <16 x i8> %trigger, zeroinitializer
1128   %res = call <16 x i8> @llvm.masked.gather.v16i8.v16p0i8(<16 x i8*> %vptr2, i32 4, <16 x i1> %mask, <16 x i8> %passthru)
1129   ret <16 x i8> %res
1132 declare <2 x double> @llvm.masked.gather.v2f64.v2p0f64(<2 x double*>, i32, <2 x i1>, <2 x double>)
1133 declare <4 x double> @llvm.masked.gather.v4f64.v4p0f64(<4 x double*>, i32, <4 x i1>, <4 x double>)
1135 declare <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*>, i32, <4 x i1>, <4 x float>)
1136 declare <8 x float> @llvm.masked.gather.v8f32.v8p0f32(<8 x float*>, i32, <8 x i1>, <8 x float>)
1138 declare <16 x i8> @llvm.masked.gather.v16i8.v16p0i8(<16 x i8*>, i32, <16 x i1>, <16 x i8>)