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