[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / masked_gather.ll
blob559a7ec0930b994547b433f8a8c8950414d12d59
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-prefix=SSE
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx < %s | FileCheck %s --check-prefix=AVX1
4 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx2 < %s | FileCheck %s --check-prefix=AVX2
5 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx512f < %s | FileCheck %s --check-prefixes=AVX512,AVX512F
6 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=AVX512,AVX512VL
9 ; vXf32
12 %struct.a = type { [4 x i32], [4 x i8], %struct.b, i32 }
13 %struct.b = type { i32, i32 }
14 @c = external dso_local global %struct.a, align 4
16 define <4 x float> @gather_v4f32_ptr_v4i32(<4 x ptr> %ptr, <4 x i32> %trigger, <4 x float> %passthru) {
17 ; SSE-LABEL: gather_v4f32_ptr_v4i32:
18 ; SSE:       # %bb.0:
19 ; SSE-NEXT:    pxor %xmm4, %xmm4
20 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm4
21 ; SSE-NEXT:    movmskps %xmm4, %eax
22 ; SSE-NEXT:    testb $1, %al
23 ; SSE-NEXT:    jne .LBB0_1
24 ; SSE-NEXT:  # %bb.2: # %else
25 ; SSE-NEXT:    testb $2, %al
26 ; SSE-NEXT:    jne .LBB0_3
27 ; SSE-NEXT:  .LBB0_4: # %else2
28 ; SSE-NEXT:    testb $4, %al
29 ; SSE-NEXT:    jne .LBB0_5
30 ; SSE-NEXT:  .LBB0_6: # %else5
31 ; SSE-NEXT:    testb $8, %al
32 ; SSE-NEXT:    jne .LBB0_7
33 ; SSE-NEXT:  .LBB0_8: # %else8
34 ; SSE-NEXT:    movaps %xmm3, %xmm0
35 ; SSE-NEXT:    retq
36 ; SSE-NEXT:  .LBB0_1: # %cond.load
37 ; SSE-NEXT:    movq %xmm0, %rcx
38 ; SSE-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
39 ; SSE-NEXT:    pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7]
40 ; SSE-NEXT:    testb $2, %al
41 ; SSE-NEXT:    je .LBB0_4
42 ; SSE-NEXT:  .LBB0_3: # %cond.load1
43 ; SSE-NEXT:    pextrq $1, %xmm0, %rcx
44 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
45 ; SSE-NEXT:    testb $4, %al
46 ; SSE-NEXT:    je .LBB0_6
47 ; SSE-NEXT:  .LBB0_5: # %cond.load4
48 ; SSE-NEXT:    movq %xmm1, %rcx
49 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
50 ; SSE-NEXT:    testb $8, %al
51 ; SSE-NEXT:    je .LBB0_8
52 ; SSE-NEXT:  .LBB0_7: # %cond.load7
53 ; SSE-NEXT:    pextrq $1, %xmm1, %rax
54 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
55 ; SSE-NEXT:    movaps %xmm3, %xmm0
56 ; SSE-NEXT:    retq
58 ; AVX1-LABEL: gather_v4f32_ptr_v4i32:
59 ; AVX1:       # %bb.0:
60 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
61 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
62 ; AVX1-NEXT:    vmovmskps %xmm1, %eax
63 ; AVX1-NEXT:    testb $1, %al
64 ; AVX1-NEXT:    je .LBB0_2
65 ; AVX1-NEXT:  # %bb.1: # %cond.load
66 ; AVX1-NEXT:    vmovq %xmm0, %rcx
67 ; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
68 ; AVX1-NEXT:    vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
69 ; AVX1-NEXT:  .LBB0_2: # %else
70 ; AVX1-NEXT:    testb $2, %al
71 ; AVX1-NEXT:    je .LBB0_4
72 ; AVX1-NEXT:  # %bb.3: # %cond.load1
73 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
74 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
75 ; AVX1-NEXT:  .LBB0_4: # %else2
76 ; AVX1-NEXT:    testb $4, %al
77 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
78 ; AVX1-NEXT:    jne .LBB0_5
79 ; AVX1-NEXT:  # %bb.6: # %else5
80 ; AVX1-NEXT:    testb $8, %al
81 ; AVX1-NEXT:    jne .LBB0_7
82 ; AVX1-NEXT:  .LBB0_8: # %else8
83 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
84 ; AVX1-NEXT:    vzeroupper
85 ; AVX1-NEXT:    retq
86 ; AVX1-NEXT:  .LBB0_5: # %cond.load4
87 ; AVX1-NEXT:    vmovq %xmm0, %rcx
88 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
89 ; AVX1-NEXT:    testb $8, %al
90 ; AVX1-NEXT:    je .LBB0_8
91 ; AVX1-NEXT:  .LBB0_7: # %cond.load7
92 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
93 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
94 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
95 ; AVX1-NEXT:    vzeroupper
96 ; AVX1-NEXT:    retq
98 ; AVX2-LABEL: gather_v4f32_ptr_v4i32:
99 ; AVX2:       # %bb.0:
100 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
101 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
102 ; AVX2-NEXT:    vmovmskps %xmm1, %eax
103 ; AVX2-NEXT:    testb $1, %al
104 ; AVX2-NEXT:    je .LBB0_2
105 ; AVX2-NEXT:  # %bb.1: # %cond.load
106 ; AVX2-NEXT:    vmovq %xmm0, %rcx
107 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
108 ; AVX2-NEXT:    vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
109 ; AVX2-NEXT:  .LBB0_2: # %else
110 ; AVX2-NEXT:    testb $2, %al
111 ; AVX2-NEXT:    je .LBB0_4
112 ; AVX2-NEXT:  # %bb.3: # %cond.load1
113 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
114 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
115 ; AVX2-NEXT:  .LBB0_4: # %else2
116 ; AVX2-NEXT:    testb $4, %al
117 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
118 ; AVX2-NEXT:    jne .LBB0_5
119 ; AVX2-NEXT:  # %bb.6: # %else5
120 ; AVX2-NEXT:    testb $8, %al
121 ; AVX2-NEXT:    jne .LBB0_7
122 ; AVX2-NEXT:  .LBB0_8: # %else8
123 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
124 ; AVX2-NEXT:    vzeroupper
125 ; AVX2-NEXT:    retq
126 ; AVX2-NEXT:  .LBB0_5: # %cond.load4
127 ; AVX2-NEXT:    vmovq %xmm0, %rcx
128 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
129 ; AVX2-NEXT:    testb $8, %al
130 ; AVX2-NEXT:    je .LBB0_8
131 ; AVX2-NEXT:  .LBB0_7: # %cond.load7
132 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
133 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
134 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
135 ; AVX2-NEXT:    vzeroupper
136 ; AVX2-NEXT:    retq
138 ; AVX512F-LABEL: gather_v4f32_ptr_v4i32:
139 ; AVX512F:       # %bb.0:
140 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
141 ; AVX512F-NEXT:    vptestnmd %zmm1, %zmm1, %k0
142 ; AVX512F-NEXT:    kmovw %k0, %eax
143 ; AVX512F-NEXT:    testb $1, %al
144 ; AVX512F-NEXT:    je .LBB0_2
145 ; AVX512F-NEXT:  # %bb.1: # %cond.load
146 ; AVX512F-NEXT:    vmovq %xmm0, %rcx
147 ; AVX512F-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
148 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
149 ; AVX512F-NEXT:  .LBB0_2: # %else
150 ; AVX512F-NEXT:    testb $2, %al
151 ; AVX512F-NEXT:    je .LBB0_4
152 ; AVX512F-NEXT:  # %bb.3: # %cond.load1
153 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rcx
154 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
155 ; AVX512F-NEXT:  .LBB0_4: # %else2
156 ; AVX512F-NEXT:    testb $4, %al
157 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
158 ; AVX512F-NEXT:    jne .LBB0_5
159 ; AVX512F-NEXT:  # %bb.6: # %else5
160 ; AVX512F-NEXT:    testb $8, %al
161 ; AVX512F-NEXT:    jne .LBB0_7
162 ; AVX512F-NEXT:  .LBB0_8: # %else8
163 ; AVX512F-NEXT:    vmovaps %xmm2, %xmm0
164 ; AVX512F-NEXT:    vzeroupper
165 ; AVX512F-NEXT:    retq
166 ; AVX512F-NEXT:  .LBB0_5: # %cond.load4
167 ; AVX512F-NEXT:    vmovq %xmm0, %rcx
168 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
169 ; AVX512F-NEXT:    testb $8, %al
170 ; AVX512F-NEXT:    je .LBB0_8
171 ; AVX512F-NEXT:  .LBB0_7: # %cond.load7
172 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
173 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
174 ; AVX512F-NEXT:    vmovaps %xmm2, %xmm0
175 ; AVX512F-NEXT:    vzeroupper
176 ; AVX512F-NEXT:    retq
178 ; AVX512VL-LABEL: gather_v4f32_ptr_v4i32:
179 ; AVX512VL:       # %bb.0:
180 ; AVX512VL-NEXT:    vptestnmd %xmm1, %xmm1, %k1
181 ; AVX512VL-NEXT:    vgatherqps (,%ymm0), %xmm2 {%k1}
182 ; AVX512VL-NEXT:    vmovaps %xmm2, %xmm0
183 ; AVX512VL-NEXT:    vzeroupper
184 ; AVX512VL-NEXT:    retq
185   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
186   %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %ptr, i32 4, <4 x i1> %mask, <4 x float> %passthru)
187   ret <4 x float> %res
190 define <4 x float> @gather_v4f32_v4i32_v4i32(ptr %base, <4 x i32> %idx, <4 x i32> %trigger, <4 x float> %passthru) {
191 ; SSE-LABEL: gather_v4f32_v4i32_v4i32:
192 ; SSE:       # %bb.0:
193 ; SSE-NEXT:    movq %rdi, %xmm3
194 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]
195 ; SSE-NEXT:    pmovsxdq %xmm0, %xmm4
196 ; SSE-NEXT:    psllq $2, %xmm4
197 ; SSE-NEXT:    paddq %xmm3, %xmm4
198 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
199 ; SSE-NEXT:    pmovsxdq %xmm0, %xmm0
200 ; SSE-NEXT:    pxor %xmm5, %xmm5
201 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm5
202 ; SSE-NEXT:    movmskps %xmm5, %eax
203 ; SSE-NEXT:    testb $1, %al
204 ; SSE-NEXT:    je .LBB1_2
205 ; SSE-NEXT:  # %bb.1: # %cond.load
206 ; SSE-NEXT:    movq %xmm4, %rcx
207 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
208 ; SSE-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
209 ; SSE-NEXT:  .LBB1_2: # %else
210 ; SSE-NEXT:    psllq $2, %xmm0
211 ; SSE-NEXT:    testb $2, %al
212 ; SSE-NEXT:    je .LBB1_4
213 ; SSE-NEXT:  # %bb.3: # %cond.load1
214 ; SSE-NEXT:    pextrq $1, %xmm4, %rcx
215 ; SSE-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
216 ; SSE-NEXT:  .LBB1_4: # %else2
217 ; SSE-NEXT:    paddq %xmm0, %xmm3
218 ; SSE-NEXT:    testb $4, %al
219 ; SSE-NEXT:    jne .LBB1_5
220 ; SSE-NEXT:  # %bb.6: # %else5
221 ; SSE-NEXT:    testb $8, %al
222 ; SSE-NEXT:    jne .LBB1_7
223 ; SSE-NEXT:  .LBB1_8: # %else8
224 ; SSE-NEXT:    movaps %xmm2, %xmm0
225 ; SSE-NEXT:    retq
226 ; SSE-NEXT:  .LBB1_5: # %cond.load4
227 ; SSE-NEXT:    movq %xmm3, %rcx
228 ; SSE-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
229 ; SSE-NEXT:    testb $8, %al
230 ; SSE-NEXT:    je .LBB1_8
231 ; SSE-NEXT:  .LBB1_7: # %cond.load7
232 ; SSE-NEXT:    pextrq $1, %xmm3, %rax
233 ; SSE-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
234 ; SSE-NEXT:    movaps %xmm2, %xmm0
235 ; SSE-NEXT:    retq
237 ; AVX1-LABEL: gather_v4f32_v4i32_v4i32:
238 ; AVX1:       # %bb.0:
239 ; AVX1-NEXT:    vmovq %rdi, %xmm3
240 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]
241 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]
242 ; AVX1-NEXT:    vpmovsxdq %xmm4, %xmm4
243 ; AVX1-NEXT:    vpsllq $2, %xmm4, %xmm4
244 ; AVX1-NEXT:    vpaddq %xmm4, %xmm3, %xmm4
245 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
246 ; AVX1-NEXT:    vpsllq $2, %xmm0, %xmm0
247 ; AVX1-NEXT:    vpaddq %xmm0, %xmm3, %xmm0
248 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
249 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
250 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
251 ; AVX1-NEXT:    vmovmskps %xmm1, %eax
252 ; AVX1-NEXT:    testb $1, %al
253 ; AVX1-NEXT:    je .LBB1_2
254 ; AVX1-NEXT:  # %bb.1: # %cond.load
255 ; AVX1-NEXT:    vmovq %xmm0, %rcx
256 ; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
257 ; AVX1-NEXT:    vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
258 ; AVX1-NEXT:  .LBB1_2: # %else
259 ; AVX1-NEXT:    testb $2, %al
260 ; AVX1-NEXT:    je .LBB1_4
261 ; AVX1-NEXT:  # %bb.3: # %cond.load1
262 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
263 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
264 ; AVX1-NEXT:  .LBB1_4: # %else2
265 ; AVX1-NEXT:    testb $4, %al
266 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
267 ; AVX1-NEXT:    jne .LBB1_5
268 ; AVX1-NEXT:  # %bb.6: # %else5
269 ; AVX1-NEXT:    testb $8, %al
270 ; AVX1-NEXT:    jne .LBB1_7
271 ; AVX1-NEXT:  .LBB1_8: # %else8
272 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
273 ; AVX1-NEXT:    vzeroupper
274 ; AVX1-NEXT:    retq
275 ; AVX1-NEXT:  .LBB1_5: # %cond.load4
276 ; AVX1-NEXT:    vmovq %xmm0, %rcx
277 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
278 ; AVX1-NEXT:    testb $8, %al
279 ; AVX1-NEXT:    je .LBB1_8
280 ; AVX1-NEXT:  .LBB1_7: # %cond.load7
281 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
282 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
283 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
284 ; AVX1-NEXT:    vzeroupper
285 ; AVX1-NEXT:    retq
287 ; AVX2-LABEL: gather_v4f32_v4i32_v4i32:
288 ; AVX2:       # %bb.0:
289 ; AVX2-NEXT:    vmovq %rdi, %xmm3
290 ; AVX2-NEXT:    vpbroadcastq %xmm3, %ymm3
291 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
292 ; AVX2-NEXT:    vpsllq $2, %ymm0, %ymm0
293 ; AVX2-NEXT:    vpaddq %ymm0, %ymm3, %ymm0
294 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
295 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
296 ; AVX2-NEXT:    vmovmskps %xmm1, %eax
297 ; AVX2-NEXT:    testb $1, %al
298 ; AVX2-NEXT:    je .LBB1_2
299 ; AVX2-NEXT:  # %bb.1: # %cond.load
300 ; AVX2-NEXT:    vmovq %xmm0, %rcx
301 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
302 ; AVX2-NEXT:    vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
303 ; AVX2-NEXT:  .LBB1_2: # %else
304 ; AVX2-NEXT:    testb $2, %al
305 ; AVX2-NEXT:    je .LBB1_4
306 ; AVX2-NEXT:  # %bb.3: # %cond.load1
307 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
308 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
309 ; AVX2-NEXT:  .LBB1_4: # %else2
310 ; AVX2-NEXT:    testb $4, %al
311 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
312 ; AVX2-NEXT:    jne .LBB1_5
313 ; AVX2-NEXT:  # %bb.6: # %else5
314 ; AVX2-NEXT:    testb $8, %al
315 ; AVX2-NEXT:    jne .LBB1_7
316 ; AVX2-NEXT:  .LBB1_8: # %else8
317 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
318 ; AVX2-NEXT:    vzeroupper
319 ; AVX2-NEXT:    retq
320 ; AVX2-NEXT:  .LBB1_5: # %cond.load4
321 ; AVX2-NEXT:    vmovq %xmm0, %rcx
322 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
323 ; AVX2-NEXT:    testb $8, %al
324 ; AVX2-NEXT:    je .LBB1_8
325 ; AVX2-NEXT:  .LBB1_7: # %cond.load7
326 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
327 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
328 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
329 ; AVX2-NEXT:    vzeroupper
330 ; AVX2-NEXT:    retq
332 ; AVX512F-LABEL: gather_v4f32_v4i32_v4i32:
333 ; AVX512F:       # %bb.0:
334 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
335 ; AVX512F-NEXT:    vmovq %rdi, %xmm3
336 ; AVX512F-NEXT:    vpbroadcastq %xmm3, %ymm3
337 ; AVX512F-NEXT:    vpmovsxdq %xmm0, %ymm0
338 ; AVX512F-NEXT:    vpsllq $2, %ymm0, %ymm0
339 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm3, %ymm0
340 ; AVX512F-NEXT:    vptestnmd %zmm1, %zmm1, %k0
341 ; AVX512F-NEXT:    kmovw %k0, %eax
342 ; AVX512F-NEXT:    testb $1, %al
343 ; AVX512F-NEXT:    je .LBB1_2
344 ; AVX512F-NEXT:  # %bb.1: # %cond.load
345 ; AVX512F-NEXT:    vmovq %xmm0, %rcx
346 ; AVX512F-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
347 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
348 ; AVX512F-NEXT:  .LBB1_2: # %else
349 ; AVX512F-NEXT:    testb $2, %al
350 ; AVX512F-NEXT:    je .LBB1_4
351 ; AVX512F-NEXT:  # %bb.3: # %cond.load1
352 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rcx
353 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
354 ; AVX512F-NEXT:  .LBB1_4: # %else2
355 ; AVX512F-NEXT:    testb $4, %al
356 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
357 ; AVX512F-NEXT:    jne .LBB1_5
358 ; AVX512F-NEXT:  # %bb.6: # %else5
359 ; AVX512F-NEXT:    testb $8, %al
360 ; AVX512F-NEXT:    jne .LBB1_7
361 ; AVX512F-NEXT:  .LBB1_8: # %else8
362 ; AVX512F-NEXT:    vmovaps %xmm2, %xmm0
363 ; AVX512F-NEXT:    vzeroupper
364 ; AVX512F-NEXT:    retq
365 ; AVX512F-NEXT:  .LBB1_5: # %cond.load4
366 ; AVX512F-NEXT:    vmovq %xmm0, %rcx
367 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
368 ; AVX512F-NEXT:    testb $8, %al
369 ; AVX512F-NEXT:    je .LBB1_8
370 ; AVX512F-NEXT:  .LBB1_7: # %cond.load7
371 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
372 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
373 ; AVX512F-NEXT:    vmovaps %xmm2, %xmm0
374 ; AVX512F-NEXT:    vzeroupper
375 ; AVX512F-NEXT:    retq
377 ; AVX512VL-LABEL: gather_v4f32_v4i32_v4i32:
378 ; AVX512VL:       # %bb.0:
379 ; AVX512VL-NEXT:    vptestnmd %xmm1, %xmm1, %k1
380 ; AVX512VL-NEXT:    vgatherdps (%rdi,%xmm0,4), %xmm2 {%k1}
381 ; AVX512VL-NEXT:    vmovaps %xmm2, %xmm0
382 ; AVX512VL-NEXT:    retq
383   %vptr0 = insertelement <4 x ptr> undef, ptr %base, i32 0
384   %vptr1 = shufflevector <4 x ptr> %vptr0, <4 x ptr> undef, <4 x i32> zeroinitializer
385   %vptr2 = getelementptr float, <4 x ptr> %vptr1, <4 x i32> %idx
387   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
388   %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru)
389   ret <4 x float> %res
392 define <4 x float> @gather_v4f32_v4i64_v4i32(ptr %base, <4 x i64> %idx, <4 x i32> %trigger, <4 x float> %passthru) {
393 ; SSE-LABEL: gather_v4f32_v4i64_v4i32:
394 ; SSE:       # %bb.0:
395 ; SSE-NEXT:    movq %rdi, %xmm4
396 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
397 ; SSE-NEXT:    psllq $2, %xmm0
398 ; SSE-NEXT:    paddq %xmm4, %xmm0
399 ; SSE-NEXT:    pxor %xmm5, %xmm5
400 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm5
401 ; SSE-NEXT:    movmskps %xmm5, %eax
402 ; SSE-NEXT:    testb $1, %al
403 ; SSE-NEXT:    je .LBB2_2
404 ; SSE-NEXT:  # %bb.1: # %cond.load
405 ; SSE-NEXT:    movq %xmm0, %rcx
406 ; SSE-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
407 ; SSE-NEXT:    pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7]
408 ; SSE-NEXT:  .LBB2_2: # %else
409 ; SSE-NEXT:    psllq $2, %xmm1
410 ; SSE-NEXT:    testb $2, %al
411 ; SSE-NEXT:    je .LBB2_4
412 ; SSE-NEXT:  # %bb.3: # %cond.load1
413 ; SSE-NEXT:    pextrq $1, %xmm0, %rcx
414 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
415 ; SSE-NEXT:  .LBB2_4: # %else2
416 ; SSE-NEXT:    paddq %xmm1, %xmm4
417 ; SSE-NEXT:    testb $4, %al
418 ; SSE-NEXT:    jne .LBB2_5
419 ; SSE-NEXT:  # %bb.6: # %else5
420 ; SSE-NEXT:    testb $8, %al
421 ; SSE-NEXT:    jne .LBB2_7
422 ; SSE-NEXT:  .LBB2_8: # %else8
423 ; SSE-NEXT:    movaps %xmm3, %xmm0
424 ; SSE-NEXT:    retq
425 ; SSE-NEXT:  .LBB2_5: # %cond.load4
426 ; SSE-NEXT:    movq %xmm4, %rcx
427 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
428 ; SSE-NEXT:    testb $8, %al
429 ; SSE-NEXT:    je .LBB2_8
430 ; SSE-NEXT:  .LBB2_7: # %cond.load7
431 ; SSE-NEXT:    pextrq $1, %xmm4, %rax
432 ; SSE-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
433 ; SSE-NEXT:    movaps %xmm3, %xmm0
434 ; SSE-NEXT:    retq
436 ; AVX1-LABEL: gather_v4f32_v4i64_v4i32:
437 ; AVX1:       # %bb.0:
438 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
439 ; AVX1-NEXT:    vpsllq $2, %xmm3, %xmm3
440 ; AVX1-NEXT:    vmovq %rdi, %xmm4
441 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
442 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
443 ; AVX1-NEXT:    vpsllq $2, %xmm0, %xmm0
444 ; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0
445 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
446 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
447 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
448 ; AVX1-NEXT:    vmovmskps %xmm1, %eax
449 ; AVX1-NEXT:    testb $1, %al
450 ; AVX1-NEXT:    je .LBB2_2
451 ; AVX1-NEXT:  # %bb.1: # %cond.load
452 ; AVX1-NEXT:    vmovq %xmm0, %rcx
453 ; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
454 ; AVX1-NEXT:    vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
455 ; AVX1-NEXT:  .LBB2_2: # %else
456 ; AVX1-NEXT:    testb $2, %al
457 ; AVX1-NEXT:    je .LBB2_4
458 ; AVX1-NEXT:  # %bb.3: # %cond.load1
459 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
460 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
461 ; AVX1-NEXT:  .LBB2_4: # %else2
462 ; AVX1-NEXT:    testb $4, %al
463 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
464 ; AVX1-NEXT:    jne .LBB2_5
465 ; AVX1-NEXT:  # %bb.6: # %else5
466 ; AVX1-NEXT:    testb $8, %al
467 ; AVX1-NEXT:    jne .LBB2_7
468 ; AVX1-NEXT:  .LBB2_8: # %else8
469 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
470 ; AVX1-NEXT:    vzeroupper
471 ; AVX1-NEXT:    retq
472 ; AVX1-NEXT:  .LBB2_5: # %cond.load4
473 ; AVX1-NEXT:    vmovq %xmm0, %rcx
474 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
475 ; AVX1-NEXT:    testb $8, %al
476 ; AVX1-NEXT:    je .LBB2_8
477 ; AVX1-NEXT:  .LBB2_7: # %cond.load7
478 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
479 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
480 ; AVX1-NEXT:    vmovaps %xmm2, %xmm0
481 ; AVX1-NEXT:    vzeroupper
482 ; AVX1-NEXT:    retq
484 ; AVX2-LABEL: gather_v4f32_v4i64_v4i32:
485 ; AVX2:       # %bb.0:
486 ; AVX2-NEXT:    vmovq %rdi, %xmm3
487 ; AVX2-NEXT:    vpbroadcastq %xmm3, %ymm3
488 ; AVX2-NEXT:    vpsllq $2, %ymm0, %ymm0
489 ; AVX2-NEXT:    vpaddq %ymm0, %ymm3, %ymm0
490 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
491 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
492 ; AVX2-NEXT:    vmovmskps %xmm1, %eax
493 ; AVX2-NEXT:    testb $1, %al
494 ; AVX2-NEXT:    je .LBB2_2
495 ; AVX2-NEXT:  # %bb.1: # %cond.load
496 ; AVX2-NEXT:    vmovq %xmm0, %rcx
497 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
498 ; AVX2-NEXT:    vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
499 ; AVX2-NEXT:  .LBB2_2: # %else
500 ; AVX2-NEXT:    testb $2, %al
501 ; AVX2-NEXT:    je .LBB2_4
502 ; AVX2-NEXT:  # %bb.3: # %cond.load1
503 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
504 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
505 ; AVX2-NEXT:  .LBB2_4: # %else2
506 ; AVX2-NEXT:    testb $4, %al
507 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
508 ; AVX2-NEXT:    jne .LBB2_5
509 ; AVX2-NEXT:  # %bb.6: # %else5
510 ; AVX2-NEXT:    testb $8, %al
511 ; AVX2-NEXT:    jne .LBB2_7
512 ; AVX2-NEXT:  .LBB2_8: # %else8
513 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
514 ; AVX2-NEXT:    vzeroupper
515 ; AVX2-NEXT:    retq
516 ; AVX2-NEXT:  .LBB2_5: # %cond.load4
517 ; AVX2-NEXT:    vmovq %xmm0, %rcx
518 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
519 ; AVX2-NEXT:    testb $8, %al
520 ; AVX2-NEXT:    je .LBB2_8
521 ; AVX2-NEXT:  .LBB2_7: # %cond.load7
522 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
523 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
524 ; AVX2-NEXT:    vmovaps %xmm2, %xmm0
525 ; AVX2-NEXT:    vzeroupper
526 ; AVX2-NEXT:    retq
528 ; AVX512F-LABEL: gather_v4f32_v4i64_v4i32:
529 ; AVX512F:       # %bb.0:
530 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
531 ; AVX512F-NEXT:    vmovq %rdi, %xmm3
532 ; AVX512F-NEXT:    vpbroadcastq %xmm3, %ymm3
533 ; AVX512F-NEXT:    vpsllq $2, %ymm0, %ymm0
534 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm3, %ymm0
535 ; AVX512F-NEXT:    vptestnmd %zmm1, %zmm1, %k0
536 ; AVX512F-NEXT:    kmovw %k0, %eax
537 ; AVX512F-NEXT:    testb $1, %al
538 ; AVX512F-NEXT:    je .LBB2_2
539 ; AVX512F-NEXT:  # %bb.1: # %cond.load
540 ; AVX512F-NEXT:    vmovq %xmm0, %rcx
541 ; AVX512F-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
542 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
543 ; AVX512F-NEXT:  .LBB2_2: # %else
544 ; AVX512F-NEXT:    testb $2, %al
545 ; AVX512F-NEXT:    je .LBB2_4
546 ; AVX512F-NEXT:  # %bb.3: # %cond.load1
547 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rcx
548 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
549 ; AVX512F-NEXT:  .LBB2_4: # %else2
550 ; AVX512F-NEXT:    testb $4, %al
551 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
552 ; AVX512F-NEXT:    jne .LBB2_5
553 ; AVX512F-NEXT:  # %bb.6: # %else5
554 ; AVX512F-NEXT:    testb $8, %al
555 ; AVX512F-NEXT:    jne .LBB2_7
556 ; AVX512F-NEXT:  .LBB2_8: # %else8
557 ; AVX512F-NEXT:    vmovaps %xmm2, %xmm0
558 ; AVX512F-NEXT:    vzeroupper
559 ; AVX512F-NEXT:    retq
560 ; AVX512F-NEXT:  .LBB2_5: # %cond.load4
561 ; AVX512F-NEXT:    vmovq %xmm0, %rcx
562 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
563 ; AVX512F-NEXT:    testb $8, %al
564 ; AVX512F-NEXT:    je .LBB2_8
565 ; AVX512F-NEXT:  .LBB2_7: # %cond.load7
566 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
567 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
568 ; AVX512F-NEXT:    vmovaps %xmm2, %xmm0
569 ; AVX512F-NEXT:    vzeroupper
570 ; AVX512F-NEXT:    retq
572 ; AVX512VL-LABEL: gather_v4f32_v4i64_v4i32:
573 ; AVX512VL:       # %bb.0:
574 ; AVX512VL-NEXT:    vptestnmd %xmm1, %xmm1, %k1
575 ; AVX512VL-NEXT:    vgatherqps (%rdi,%ymm0,4), %xmm2 {%k1}
576 ; AVX512VL-NEXT:    vmovaps %xmm2, %xmm0
577 ; AVX512VL-NEXT:    vzeroupper
578 ; AVX512VL-NEXT:    retq
579   %vptr0 = insertelement <4 x ptr> undef, ptr %base, i32 0
580   %vptr1 = shufflevector <4 x ptr> %vptr0, <4 x ptr> undef, <4 x i32> zeroinitializer
581   %vptr2 = getelementptr float, <4 x ptr> %vptr1, <4 x i64> %idx
583   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
584   %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru)
585   ret <4 x float> %res
589 ; vXi8
592 define <16 x i8> @gather_v16i8_v16i32_v16i8(ptr %base, <16 x i32> %idx, <16 x i8> %trigger, <16 x i8> %passthru) {
593 ; SSE-LABEL: gather_v16i8_v16i32_v16i8:
594 ; SSE:       # %bb.0:
595 ; SSE-NEXT:    movq %rdi, %xmm6
596 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[0,1,0,1]
597 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[2,3,2,3]
598 ; SSE-NEXT:    pmovsxdq %xmm0, %xmm0
599 ; SSE-NEXT:    paddq %xmm6, %xmm0
600 ; SSE-NEXT:    pxor %xmm8, %xmm8
601 ; SSE-NEXT:    pcmpeqb %xmm4, %xmm8
602 ; SSE-NEXT:    pmovmskb %xmm8, %eax
603 ; SSE-NEXT:    testb $1, %al
604 ; SSE-NEXT:    je .LBB3_2
605 ; SSE-NEXT:  # %bb.1: # %cond.load
606 ; SSE-NEXT:    movq %xmm0, %rcx
607 ; SSE-NEXT:    pinsrb $0, (%rcx), %xmm5
608 ; SSE-NEXT:  .LBB3_2: # %else
609 ; SSE-NEXT:    pmovsxdq %xmm7, %xmm4
610 ; SSE-NEXT:    testb $2, %al
611 ; SSE-NEXT:    je .LBB3_4
612 ; SSE-NEXT:  # %bb.3: # %cond.load1
613 ; SSE-NEXT:    pextrq $1, %xmm0, %rcx
614 ; SSE-NEXT:    pinsrb $1, (%rcx), %xmm5
615 ; SSE-NEXT:  .LBB3_4: # %else2
616 ; SSE-NEXT:    paddq %xmm6, %xmm4
617 ; SSE-NEXT:    testb $4, %al
618 ; SSE-NEXT:    je .LBB3_6
619 ; SSE-NEXT:  # %bb.5: # %cond.load4
620 ; SSE-NEXT:    movq %xmm4, %rcx
621 ; SSE-NEXT:    pinsrb $2, (%rcx), %xmm5
622 ; SSE-NEXT:  .LBB3_6: # %else5
623 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm0
624 ; SSE-NEXT:    testb $8, %al
625 ; SSE-NEXT:    je .LBB3_8
626 ; SSE-NEXT:  # %bb.7: # %cond.load7
627 ; SSE-NEXT:    pextrq $1, %xmm4, %rcx
628 ; SSE-NEXT:    pinsrb $3, (%rcx), %xmm5
629 ; SSE-NEXT:  .LBB3_8: # %else8
630 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
631 ; SSE-NEXT:    paddq %xmm6, %xmm0
632 ; SSE-NEXT:    testb $16, %al
633 ; SSE-NEXT:    je .LBB3_10
634 ; SSE-NEXT:  # %bb.9: # %cond.load10
635 ; SSE-NEXT:    movq %xmm0, %rcx
636 ; SSE-NEXT:    pinsrb $4, (%rcx), %xmm5
637 ; SSE-NEXT:  .LBB3_10: # %else11
638 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm1
639 ; SSE-NEXT:    testb $32, %al
640 ; SSE-NEXT:    je .LBB3_12
641 ; SSE-NEXT:  # %bb.11: # %cond.load13
642 ; SSE-NEXT:    pextrq $1, %xmm0, %rcx
643 ; SSE-NEXT:    pinsrb $5, (%rcx), %xmm5
644 ; SSE-NEXT:  .LBB3_12: # %else14
645 ; SSE-NEXT:    paddq %xmm6, %xmm1
646 ; SSE-NEXT:    testb $64, %al
647 ; SSE-NEXT:    je .LBB3_14
648 ; SSE-NEXT:  # %bb.13: # %cond.load16
649 ; SSE-NEXT:    movq %xmm1, %rcx
650 ; SSE-NEXT:    pinsrb $6, (%rcx), %xmm5
651 ; SSE-NEXT:  .LBB3_14: # %else17
652 ; SSE-NEXT:    pmovsxdq %xmm2, %xmm0
653 ; SSE-NEXT:    testb %al, %al
654 ; SSE-NEXT:    jns .LBB3_16
655 ; SSE-NEXT:  # %bb.15: # %cond.load19
656 ; SSE-NEXT:    pextrq $1, %xmm1, %rcx
657 ; SSE-NEXT:    pinsrb $7, (%rcx), %xmm5
658 ; SSE-NEXT:  .LBB3_16: # %else20
659 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
660 ; SSE-NEXT:    paddq %xmm6, %xmm0
661 ; SSE-NEXT:    testl $256, %eax # imm = 0x100
662 ; SSE-NEXT:    je .LBB3_18
663 ; SSE-NEXT:  # %bb.17: # %cond.load22
664 ; SSE-NEXT:    movq %xmm0, %rcx
665 ; SSE-NEXT:    pinsrb $8, (%rcx), %xmm5
666 ; SSE-NEXT:  .LBB3_18: # %else23
667 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm1
668 ; SSE-NEXT:    testl $512, %eax # imm = 0x200
669 ; SSE-NEXT:    je .LBB3_20
670 ; SSE-NEXT:  # %bb.19: # %cond.load25
671 ; SSE-NEXT:    pextrq $1, %xmm0, %rcx
672 ; SSE-NEXT:    pinsrb $9, (%rcx), %xmm5
673 ; SSE-NEXT:  .LBB3_20: # %else26
674 ; SSE-NEXT:    paddq %xmm6, %xmm1
675 ; SSE-NEXT:    testl $1024, %eax # imm = 0x400
676 ; SSE-NEXT:    je .LBB3_22
677 ; SSE-NEXT:  # %bb.21: # %cond.load28
678 ; SSE-NEXT:    movq %xmm1, %rcx
679 ; SSE-NEXT:    pinsrb $10, (%rcx), %xmm5
680 ; SSE-NEXT:  .LBB3_22: # %else29
681 ; SSE-NEXT:    pmovsxdq %xmm3, %xmm0
682 ; SSE-NEXT:    testl $2048, %eax # imm = 0x800
683 ; SSE-NEXT:    je .LBB3_24
684 ; SSE-NEXT:  # %bb.23: # %cond.load31
685 ; SSE-NEXT:    pextrq $1, %xmm1, %rcx
686 ; SSE-NEXT:    pinsrb $11, (%rcx), %xmm5
687 ; SSE-NEXT:  .LBB3_24: # %else32
688 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
689 ; SSE-NEXT:    paddq %xmm6, %xmm0
690 ; SSE-NEXT:    testl $4096, %eax # imm = 0x1000
691 ; SSE-NEXT:    je .LBB3_26
692 ; SSE-NEXT:  # %bb.25: # %cond.load34
693 ; SSE-NEXT:    movq %xmm0, %rcx
694 ; SSE-NEXT:    pinsrb $12, (%rcx), %xmm5
695 ; SSE-NEXT:  .LBB3_26: # %else35
696 ; SSE-NEXT:    pmovsxdq %xmm1, %xmm1
697 ; SSE-NEXT:    testl $8192, %eax # imm = 0x2000
698 ; SSE-NEXT:    je .LBB3_28
699 ; SSE-NEXT:  # %bb.27: # %cond.load37
700 ; SSE-NEXT:    pextrq $1, %xmm0, %rcx
701 ; SSE-NEXT:    pinsrb $13, (%rcx), %xmm5
702 ; SSE-NEXT:  .LBB3_28: # %else38
703 ; SSE-NEXT:    paddq %xmm1, %xmm6
704 ; SSE-NEXT:    testl $16384, %eax # imm = 0x4000
705 ; SSE-NEXT:    jne .LBB3_29
706 ; SSE-NEXT:  # %bb.30: # %else41
707 ; SSE-NEXT:    testl $32768, %eax # imm = 0x8000
708 ; SSE-NEXT:    jne .LBB3_31
709 ; SSE-NEXT:  .LBB3_32: # %else44
710 ; SSE-NEXT:    movdqa %xmm5, %xmm0
711 ; SSE-NEXT:    retq
712 ; SSE-NEXT:  .LBB3_29: # %cond.load40
713 ; SSE-NEXT:    movq %xmm6, %rcx
714 ; SSE-NEXT:    pinsrb $14, (%rcx), %xmm5
715 ; SSE-NEXT:    testl $32768, %eax # imm = 0x8000
716 ; SSE-NEXT:    je .LBB3_32
717 ; SSE-NEXT:  .LBB3_31: # %cond.load43
718 ; SSE-NEXT:    pextrq $1, %xmm6, %rax
719 ; SSE-NEXT:    pinsrb $15, (%rax), %xmm5
720 ; SSE-NEXT:    movdqa %xmm5, %xmm0
721 ; SSE-NEXT:    retq
723 ; AVX1-LABEL: gather_v16i8_v16i32_v16i8:
724 ; AVX1:       # %bb.0:
725 ; AVX1-NEXT:    vmovq %rdi, %xmm4
726 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
727 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
728 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm0[2,3,2,3]
729 ; AVX1-NEXT:    vpmovsxdq %xmm6, %xmm6
730 ; AVX1-NEXT:    vpaddq %xmm6, %xmm4, %xmm6
731 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
732 ; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0
733 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
734 ; AVX1-NEXT:    vpxor %xmm6, %xmm6, %xmm6
735 ; AVX1-NEXT:    vpcmpeqb %xmm6, %xmm2, %xmm2
736 ; AVX1-NEXT:    vpmovmskb %xmm2, %eax
737 ; AVX1-NEXT:    testb $1, %al
738 ; AVX1-NEXT:    je .LBB3_2
739 ; AVX1-NEXT:  # %bb.1: # %cond.load
740 ; AVX1-NEXT:    vmovq %xmm0, %rcx
741 ; AVX1-NEXT:    vpinsrb $0, (%rcx), %xmm3, %xmm3
742 ; AVX1-NEXT:  .LBB3_2: # %else
743 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm5[2,3,2,3]
744 ; AVX1-NEXT:    vpmovsxdq %xmm5, %xmm6
745 ; AVX1-NEXT:    testb $2, %al
746 ; AVX1-NEXT:    je .LBB3_4
747 ; AVX1-NEXT:  # %bb.3: # %cond.load1
748 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
749 ; AVX1-NEXT:    vpinsrb $1, (%rcx), %xmm3, %xmm3
750 ; AVX1-NEXT:  .LBB3_4: # %else2
751 ; AVX1-NEXT:    vpmovsxdq %xmm2, %xmm5
752 ; AVX1-NEXT:    vpaddq %xmm6, %xmm4, %xmm2
753 ; AVX1-NEXT:    testb $4, %al
754 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
755 ; AVX1-NEXT:    je .LBB3_6
756 ; AVX1-NEXT:  # %bb.5: # %cond.load4
757 ; AVX1-NEXT:    vmovq %xmm0, %rcx
758 ; AVX1-NEXT:    vpinsrb $2, (%rcx), %xmm3, %xmm3
759 ; AVX1-NEXT:  .LBB3_6: # %else5
760 ; AVX1-NEXT:    vpaddq %xmm5, %xmm4, %xmm5
761 ; AVX1-NEXT:    testb $8, %al
762 ; AVX1-NEXT:    je .LBB3_8
763 ; AVX1-NEXT:  # %bb.7: # %cond.load7
764 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
765 ; AVX1-NEXT:    vpinsrb $3, (%rcx), %xmm3, %xmm3
766 ; AVX1-NEXT:  .LBB3_8: # %else8
767 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm0
768 ; AVX1-NEXT:    testb $16, %al
769 ; AVX1-NEXT:    je .LBB3_10
770 ; AVX1-NEXT:  # %bb.9: # %cond.load10
771 ; AVX1-NEXT:    vmovq %xmm0, %rcx
772 ; AVX1-NEXT:    vpinsrb $4, (%rcx), %xmm3, %xmm3
773 ; AVX1-NEXT:  .LBB3_10: # %else11
774 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
775 ; AVX1-NEXT:    vpmovsxdq %xmm1, %xmm6
776 ; AVX1-NEXT:    testb $32, %al
777 ; AVX1-NEXT:    je .LBB3_12
778 ; AVX1-NEXT:  # %bb.11: # %cond.load13
779 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
780 ; AVX1-NEXT:    vpinsrb $5, (%rcx), %xmm3, %xmm3
781 ; AVX1-NEXT:  .LBB3_12: # %else14
782 ; AVX1-NEXT:    vpmovsxdq %xmm2, %xmm5
783 ; AVX1-NEXT:    vpaddq %xmm6, %xmm4, %xmm2
784 ; AVX1-NEXT:    testb $64, %al
785 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
786 ; AVX1-NEXT:    je .LBB3_14
787 ; AVX1-NEXT:  # %bb.13: # %cond.load16
788 ; AVX1-NEXT:    vmovq %xmm0, %rcx
789 ; AVX1-NEXT:    vpinsrb $6, (%rcx), %xmm3, %xmm3
790 ; AVX1-NEXT:  .LBB3_14: # %else17
791 ; AVX1-NEXT:    vpaddq %xmm5, %xmm4, %xmm5
792 ; AVX1-NEXT:    testb %al, %al
793 ; AVX1-NEXT:    jns .LBB3_16
794 ; AVX1-NEXT:  # %bb.15: # %cond.load19
795 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
796 ; AVX1-NEXT:    vpinsrb $7, (%rcx), %xmm3, %xmm3
797 ; AVX1-NEXT:  .LBB3_16: # %else20
798 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
799 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm0
800 ; AVX1-NEXT:    testl $256, %eax # imm = 0x100
801 ; AVX1-NEXT:    je .LBB3_18
802 ; AVX1-NEXT:  # %bb.17: # %cond.load22
803 ; AVX1-NEXT:    vmovq %xmm0, %rcx
804 ; AVX1-NEXT:    vpinsrb $8, (%rcx), %xmm3, %xmm3
805 ; AVX1-NEXT:  .LBB3_18: # %else23
806 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
807 ; AVX1-NEXT:    vpmovsxdq %xmm1, %xmm1
808 ; AVX1-NEXT:    testl $512, %eax # imm = 0x200
809 ; AVX1-NEXT:    je .LBB3_20
810 ; AVX1-NEXT:  # %bb.19: # %cond.load25
811 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
812 ; AVX1-NEXT:    vpinsrb $9, (%rcx), %xmm3, %xmm3
813 ; AVX1-NEXT:  .LBB3_20: # %else26
814 ; AVX1-NEXT:    vpmovsxdq %xmm2, %xmm2
815 ; AVX1-NEXT:    vpaddq %xmm1, %xmm4, %xmm1
816 ; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
817 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
818 ; AVX1-NEXT:    je .LBB3_22
819 ; AVX1-NEXT:  # %bb.21: # %cond.load28
820 ; AVX1-NEXT:    vmovq %xmm0, %rcx
821 ; AVX1-NEXT:    vpinsrb $10, (%rcx), %xmm3, %xmm3
822 ; AVX1-NEXT:  .LBB3_22: # %else29
823 ; AVX1-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
824 ; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
825 ; AVX1-NEXT:    je .LBB3_24
826 ; AVX1-NEXT:  # %bb.23: # %cond.load31
827 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
828 ; AVX1-NEXT:    vpinsrb $11, (%rcx), %xmm3, %xmm3
829 ; AVX1-NEXT:  .LBB3_24: # %else32
830 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm0
831 ; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
832 ; AVX1-NEXT:    je .LBB3_26
833 ; AVX1-NEXT:  # %bb.25: # %cond.load34
834 ; AVX1-NEXT:    vmovq %xmm0, %rcx
835 ; AVX1-NEXT:    vpinsrb $12, (%rcx), %xmm3, %xmm3
836 ; AVX1-NEXT:  .LBB3_26: # %else35
837 ; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
838 ; AVX1-NEXT:    je .LBB3_28
839 ; AVX1-NEXT:  # %bb.27: # %cond.load37
840 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
841 ; AVX1-NEXT:    vpinsrb $13, (%rcx), %xmm3, %xmm3
842 ; AVX1-NEXT:  .LBB3_28: # %else38
843 ; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
844 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
845 ; AVX1-NEXT:    jne .LBB3_29
846 ; AVX1-NEXT:  # %bb.30: # %else41
847 ; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
848 ; AVX1-NEXT:    jne .LBB3_31
849 ; AVX1-NEXT:  .LBB3_32: # %else44
850 ; AVX1-NEXT:    vmovdqa %xmm3, %xmm0
851 ; AVX1-NEXT:    vzeroupper
852 ; AVX1-NEXT:    retq
853 ; AVX1-NEXT:  .LBB3_29: # %cond.load40
854 ; AVX1-NEXT:    vmovq %xmm0, %rcx
855 ; AVX1-NEXT:    vpinsrb $14, (%rcx), %xmm3, %xmm3
856 ; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
857 ; AVX1-NEXT:    je .LBB3_32
858 ; AVX1-NEXT:  .LBB3_31: # %cond.load43
859 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
860 ; AVX1-NEXT:    vpinsrb $15, (%rax), %xmm3, %xmm3
861 ; AVX1-NEXT:    vmovdqa %xmm3, %xmm0
862 ; AVX1-NEXT:    vzeroupper
863 ; AVX1-NEXT:    retq
865 ; AVX2-LABEL: gather_v16i8_v16i32_v16i8:
866 ; AVX2:       # %bb.0:
867 ; AVX2-NEXT:    vmovq %rdi, %xmm4
868 ; AVX2-NEXT:    vpbroadcastq %xmm4, %ymm4
869 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm5
870 ; AVX2-NEXT:    vpaddq %ymm5, %ymm4, %ymm5
871 ; AVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
872 ; AVX2-NEXT:    vpcmpeqb %xmm6, %xmm2, %xmm2
873 ; AVX2-NEXT:    vpmovmskb %xmm2, %eax
874 ; AVX2-NEXT:    testb $1, %al
875 ; AVX2-NEXT:    je .LBB3_2
876 ; AVX2-NEXT:  # %bb.1: # %cond.load
877 ; AVX2-NEXT:    vmovq %xmm5, %rcx
878 ; AVX2-NEXT:    vpinsrb $0, (%rcx), %xmm3, %xmm3
879 ; AVX2-NEXT:  .LBB3_2: # %else
880 ; AVX2-NEXT:    testb $2, %al
881 ; AVX2-NEXT:    je .LBB3_4
882 ; AVX2-NEXT:  # %bb.3: # %cond.load1
883 ; AVX2-NEXT:    vpextrq $1, %xmm5, %rcx
884 ; AVX2-NEXT:    vpinsrb $1, (%rcx), %xmm3, %xmm3
885 ; AVX2-NEXT:  .LBB3_4: # %else2
886 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
887 ; AVX2-NEXT:    testb $4, %al
888 ; AVX2-NEXT:    vextracti128 $1, %ymm5, %xmm0
889 ; AVX2-NEXT:    je .LBB3_6
890 ; AVX2-NEXT:  # %bb.5: # %cond.load4
891 ; AVX2-NEXT:    vmovq %xmm0, %rcx
892 ; AVX2-NEXT:    vpinsrb $2, (%rcx), %xmm3, %xmm3
893 ; AVX2-NEXT:  .LBB3_6: # %else5
894 ; AVX2-NEXT:    vpmovsxdq %xmm2, %ymm2
895 ; AVX2-NEXT:    testb $8, %al
896 ; AVX2-NEXT:    je .LBB3_8
897 ; AVX2-NEXT:  # %bb.7: # %cond.load7
898 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
899 ; AVX2-NEXT:    vpinsrb $3, (%rcx), %xmm3, %xmm3
900 ; AVX2-NEXT:  .LBB3_8: # %else8
901 ; AVX2-NEXT:    vpaddq %ymm2, %ymm4, %ymm0
902 ; AVX2-NEXT:    testb $16, %al
903 ; AVX2-NEXT:    je .LBB3_10
904 ; AVX2-NEXT:  # %bb.9: # %cond.load10
905 ; AVX2-NEXT:    vmovq %xmm0, %rcx
906 ; AVX2-NEXT:    vpinsrb $4, (%rcx), %xmm3, %xmm3
907 ; AVX2-NEXT:  .LBB3_10: # %else11
908 ; AVX2-NEXT:    testb $32, %al
909 ; AVX2-NEXT:    je .LBB3_12
910 ; AVX2-NEXT:  # %bb.11: # %cond.load13
911 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
912 ; AVX2-NEXT:    vpinsrb $5, (%rcx), %xmm3, %xmm3
913 ; AVX2-NEXT:  .LBB3_12: # %else14
914 ; AVX2-NEXT:    testb $64, %al
915 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
916 ; AVX2-NEXT:    je .LBB3_14
917 ; AVX2-NEXT:  # %bb.13: # %cond.load16
918 ; AVX2-NEXT:    vmovq %xmm0, %rcx
919 ; AVX2-NEXT:    vpinsrb $6, (%rcx), %xmm3, %xmm3
920 ; AVX2-NEXT:  .LBB3_14: # %else17
921 ; AVX2-NEXT:    vpmovsxdq %xmm1, %ymm2
922 ; AVX2-NEXT:    testb %al, %al
923 ; AVX2-NEXT:    jns .LBB3_16
924 ; AVX2-NEXT:  # %bb.15: # %cond.load19
925 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
926 ; AVX2-NEXT:    vpinsrb $7, (%rcx), %xmm3, %xmm3
927 ; AVX2-NEXT:  .LBB3_16: # %else20
928 ; AVX2-NEXT:    vpaddq %ymm2, %ymm4, %ymm0
929 ; AVX2-NEXT:    testl $256, %eax # imm = 0x100
930 ; AVX2-NEXT:    je .LBB3_18
931 ; AVX2-NEXT:  # %bb.17: # %cond.load22
932 ; AVX2-NEXT:    vmovq %xmm0, %rcx
933 ; AVX2-NEXT:    vpinsrb $8, (%rcx), %xmm3, %xmm3
934 ; AVX2-NEXT:  .LBB3_18: # %else23
935 ; AVX2-NEXT:    testl $512, %eax # imm = 0x200
936 ; AVX2-NEXT:    je .LBB3_20
937 ; AVX2-NEXT:  # %bb.19: # %cond.load25
938 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
939 ; AVX2-NEXT:    vpinsrb $9, (%rcx), %xmm3, %xmm3
940 ; AVX2-NEXT:  .LBB3_20: # %else26
941 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
942 ; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
943 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
944 ; AVX2-NEXT:    je .LBB3_22
945 ; AVX2-NEXT:  # %bb.21: # %cond.load28
946 ; AVX2-NEXT:    vmovq %xmm0, %rcx
947 ; AVX2-NEXT:    vpinsrb $10, (%rcx), %xmm3, %xmm3
948 ; AVX2-NEXT:  .LBB3_22: # %else29
949 ; AVX2-NEXT:    vpmovsxdq %xmm1, %ymm1
950 ; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
951 ; AVX2-NEXT:    je .LBB3_24
952 ; AVX2-NEXT:  # %bb.23: # %cond.load31
953 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
954 ; AVX2-NEXT:    vpinsrb $11, (%rcx), %xmm3, %xmm3
955 ; AVX2-NEXT:  .LBB3_24: # %else32
956 ; AVX2-NEXT:    vpaddq %ymm1, %ymm4, %ymm0
957 ; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
958 ; AVX2-NEXT:    je .LBB3_26
959 ; AVX2-NEXT:  # %bb.25: # %cond.load34
960 ; AVX2-NEXT:    vmovq %xmm0, %rcx
961 ; AVX2-NEXT:    vpinsrb $12, (%rcx), %xmm3, %xmm3
962 ; AVX2-NEXT:  .LBB3_26: # %else35
963 ; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
964 ; AVX2-NEXT:    je .LBB3_28
965 ; AVX2-NEXT:  # %bb.27: # %cond.load37
966 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
967 ; AVX2-NEXT:    vpinsrb $13, (%rcx), %xmm3, %xmm3
968 ; AVX2-NEXT:  .LBB3_28: # %else38
969 ; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
970 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
971 ; AVX2-NEXT:    jne .LBB3_29
972 ; AVX2-NEXT:  # %bb.30: # %else41
973 ; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
974 ; AVX2-NEXT:    jne .LBB3_31
975 ; AVX2-NEXT:  .LBB3_32: # %else44
976 ; AVX2-NEXT:    vmovdqa %xmm3, %xmm0
977 ; AVX2-NEXT:    vzeroupper
978 ; AVX2-NEXT:    retq
979 ; AVX2-NEXT:  .LBB3_29: # %cond.load40
980 ; AVX2-NEXT:    vmovq %xmm0, %rcx
981 ; AVX2-NEXT:    vpinsrb $14, (%rcx), %xmm3, %xmm3
982 ; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
983 ; AVX2-NEXT:    je .LBB3_32
984 ; AVX2-NEXT:  .LBB3_31: # %cond.load43
985 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
986 ; AVX2-NEXT:    vpinsrb $15, (%rax), %xmm3, %xmm3
987 ; AVX2-NEXT:    vmovdqa %xmm3, %xmm0
988 ; AVX2-NEXT:    vzeroupper
989 ; AVX2-NEXT:    retq
991 ; AVX512-LABEL: gather_v16i8_v16i32_v16i8:
992 ; AVX512:       # %bb.0:
993 ; AVX512-NEXT:    vpbroadcastq %rdi, %zmm3
994 ; AVX512-NEXT:    vpmovsxdq %ymm0, %zmm4
995 ; AVX512-NEXT:    vpaddq %zmm4, %zmm3, %zmm4
996 ; AVX512-NEXT:    vpxor %xmm5, %xmm5, %xmm5
997 ; AVX512-NEXT:    vpcmpeqb %xmm5, %xmm1, %xmm1
998 ; AVX512-NEXT:    vpmovmskb %xmm1, %eax
999 ; AVX512-NEXT:    testb $1, %al
1000 ; AVX512-NEXT:    jne .LBB3_1
1001 ; AVX512-NEXT:  # %bb.2: # %else
1002 ; AVX512-NEXT:    testb $2, %al
1003 ; AVX512-NEXT:    jne .LBB3_3
1004 ; AVX512-NEXT:  .LBB3_4: # %else2
1005 ; AVX512-NEXT:    testb $4, %al
1006 ; AVX512-NEXT:    jne .LBB3_5
1007 ; AVX512-NEXT:  .LBB3_6: # %else5
1008 ; AVX512-NEXT:    testb $8, %al
1009 ; AVX512-NEXT:    je .LBB3_8
1010 ; AVX512-NEXT:  .LBB3_7: # %cond.load7
1011 ; AVX512-NEXT:    vextracti128 $1, %ymm4, %xmm1
1012 ; AVX512-NEXT:    vpextrq $1, %xmm1, %rcx
1013 ; AVX512-NEXT:    vpinsrb $3, (%rcx), %xmm2, %xmm2
1014 ; AVX512-NEXT:  .LBB3_8: # %else8
1015 ; AVX512-NEXT:    testb $16, %al
1016 ; AVX512-NEXT:    vextracti32x4 $2, %zmm4, %xmm1
1017 ; AVX512-NEXT:    je .LBB3_10
1018 ; AVX512-NEXT:  # %bb.9: # %cond.load10
1019 ; AVX512-NEXT:    vmovq %xmm1, %rcx
1020 ; AVX512-NEXT:    vpinsrb $4, (%rcx), %xmm2, %xmm2
1021 ; AVX512-NEXT:  .LBB3_10: # %else11
1022 ; AVX512-NEXT:    testb $32, %al
1023 ; AVX512-NEXT:    je .LBB3_12
1024 ; AVX512-NEXT:  # %bb.11: # %cond.load13
1025 ; AVX512-NEXT:    vpextrq $1, %xmm1, %rcx
1026 ; AVX512-NEXT:    vpinsrb $5, (%rcx), %xmm2, %xmm2
1027 ; AVX512-NEXT:  .LBB3_12: # %else14
1028 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1029 ; AVX512-NEXT:    testb $64, %al
1030 ; AVX512-NEXT:    vextracti32x4 $3, %zmm4, %xmm0
1031 ; AVX512-NEXT:    je .LBB3_14
1032 ; AVX512-NEXT:  # %bb.13: # %cond.load16
1033 ; AVX512-NEXT:    vmovq %xmm0, %rcx
1034 ; AVX512-NEXT:    vpinsrb $6, (%rcx), %xmm2, %xmm2
1035 ; AVX512-NEXT:  .LBB3_14: # %else17
1036 ; AVX512-NEXT:    vpmovsxdq %ymm1, %zmm1
1037 ; AVX512-NEXT:    testb %al, %al
1038 ; AVX512-NEXT:    jns .LBB3_16
1039 ; AVX512-NEXT:  # %bb.15: # %cond.load19
1040 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rcx
1041 ; AVX512-NEXT:    vpinsrb $7, (%rcx), %xmm2, %xmm2
1042 ; AVX512-NEXT:  .LBB3_16: # %else20
1043 ; AVX512-NEXT:    vpaddq %zmm1, %zmm3, %zmm0
1044 ; AVX512-NEXT:    testl $256, %eax # imm = 0x100
1045 ; AVX512-NEXT:    jne .LBB3_17
1046 ; AVX512-NEXT:  # %bb.18: # %else23
1047 ; AVX512-NEXT:    testl $512, %eax # imm = 0x200
1048 ; AVX512-NEXT:    jne .LBB3_19
1049 ; AVX512-NEXT:  .LBB3_20: # %else26
1050 ; AVX512-NEXT:    testl $1024, %eax # imm = 0x400
1051 ; AVX512-NEXT:    jne .LBB3_21
1052 ; AVX512-NEXT:  .LBB3_22: # %else29
1053 ; AVX512-NEXT:    testl $2048, %eax # imm = 0x800
1054 ; AVX512-NEXT:    je .LBB3_24
1055 ; AVX512-NEXT:  .LBB3_23: # %cond.load31
1056 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1057 ; AVX512-NEXT:    vpextrq $1, %xmm1, %rcx
1058 ; AVX512-NEXT:    vpinsrb $11, (%rcx), %xmm2, %xmm2
1059 ; AVX512-NEXT:  .LBB3_24: # %else32
1060 ; AVX512-NEXT:    testl $4096, %eax # imm = 0x1000
1061 ; AVX512-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
1062 ; AVX512-NEXT:    je .LBB3_26
1063 ; AVX512-NEXT:  # %bb.25: # %cond.load34
1064 ; AVX512-NEXT:    vmovq %xmm1, %rcx
1065 ; AVX512-NEXT:    vpinsrb $12, (%rcx), %xmm2, %xmm2
1066 ; AVX512-NEXT:  .LBB3_26: # %else35
1067 ; AVX512-NEXT:    testl $8192, %eax # imm = 0x2000
1068 ; AVX512-NEXT:    je .LBB3_28
1069 ; AVX512-NEXT:  # %bb.27: # %cond.load37
1070 ; AVX512-NEXT:    vpextrq $1, %xmm1, %rcx
1071 ; AVX512-NEXT:    vpinsrb $13, (%rcx), %xmm2, %xmm2
1072 ; AVX512-NEXT:  .LBB3_28: # %else38
1073 ; AVX512-NEXT:    testl $16384, %eax # imm = 0x4000
1074 ; AVX512-NEXT:    vextracti32x4 $3, %zmm0, %xmm0
1075 ; AVX512-NEXT:    jne .LBB3_29
1076 ; AVX512-NEXT:  # %bb.30: # %else41
1077 ; AVX512-NEXT:    testl $32768, %eax # imm = 0x8000
1078 ; AVX512-NEXT:    jne .LBB3_31
1079 ; AVX512-NEXT:  .LBB3_32: # %else44
1080 ; AVX512-NEXT:    vmovdqa %xmm2, %xmm0
1081 ; AVX512-NEXT:    vzeroupper
1082 ; AVX512-NEXT:    retq
1083 ; AVX512-NEXT:  .LBB3_1: # %cond.load
1084 ; AVX512-NEXT:    vmovq %xmm4, %rcx
1085 ; AVX512-NEXT:    vpinsrb $0, (%rcx), %xmm2, %xmm2
1086 ; AVX512-NEXT:    testb $2, %al
1087 ; AVX512-NEXT:    je .LBB3_4
1088 ; AVX512-NEXT:  .LBB3_3: # %cond.load1
1089 ; AVX512-NEXT:    vpextrq $1, %xmm4, %rcx
1090 ; AVX512-NEXT:    vpinsrb $1, (%rcx), %xmm2, %xmm2
1091 ; AVX512-NEXT:    testb $4, %al
1092 ; AVX512-NEXT:    je .LBB3_6
1093 ; AVX512-NEXT:  .LBB3_5: # %cond.load4
1094 ; AVX512-NEXT:    vextracti128 $1, %ymm4, %xmm1
1095 ; AVX512-NEXT:    vmovq %xmm1, %rcx
1096 ; AVX512-NEXT:    vpinsrb $2, (%rcx), %xmm2, %xmm2
1097 ; AVX512-NEXT:    testb $8, %al
1098 ; AVX512-NEXT:    jne .LBB3_7
1099 ; AVX512-NEXT:    jmp .LBB3_8
1100 ; AVX512-NEXT:  .LBB3_17: # %cond.load22
1101 ; AVX512-NEXT:    vmovq %xmm0, %rcx
1102 ; AVX512-NEXT:    vpinsrb $8, (%rcx), %xmm2, %xmm2
1103 ; AVX512-NEXT:    testl $512, %eax # imm = 0x200
1104 ; AVX512-NEXT:    je .LBB3_20
1105 ; AVX512-NEXT:  .LBB3_19: # %cond.load25
1106 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rcx
1107 ; AVX512-NEXT:    vpinsrb $9, (%rcx), %xmm2, %xmm2
1108 ; AVX512-NEXT:    testl $1024, %eax # imm = 0x400
1109 ; AVX512-NEXT:    je .LBB3_22
1110 ; AVX512-NEXT:  .LBB3_21: # %cond.load28
1111 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1112 ; AVX512-NEXT:    vmovq %xmm1, %rcx
1113 ; AVX512-NEXT:    vpinsrb $10, (%rcx), %xmm2, %xmm2
1114 ; AVX512-NEXT:    testl $2048, %eax # imm = 0x800
1115 ; AVX512-NEXT:    jne .LBB3_23
1116 ; AVX512-NEXT:    jmp .LBB3_24
1117 ; AVX512-NEXT:  .LBB3_29: # %cond.load40
1118 ; AVX512-NEXT:    vmovq %xmm0, %rcx
1119 ; AVX512-NEXT:    vpinsrb $14, (%rcx), %xmm2, %xmm2
1120 ; AVX512-NEXT:    testl $32768, %eax # imm = 0x8000
1121 ; AVX512-NEXT:    je .LBB3_32
1122 ; AVX512-NEXT:  .LBB3_31: # %cond.load43
1123 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rax
1124 ; AVX512-NEXT:    vpinsrb $15, (%rax), %xmm2, %xmm2
1125 ; AVX512-NEXT:    vmovdqa %xmm2, %xmm0
1126 ; AVX512-NEXT:    vzeroupper
1127 ; AVX512-NEXT:    retq
1128   %vptr0 = insertelement <16 x ptr> undef, ptr %base, i32 0
1129   %vptr1 = shufflevector <16 x ptr> %vptr0, <16 x ptr> undef, <16 x i32> zeroinitializer
1130   %vptr2 = getelementptr i8, <16 x ptr> %vptr1, <16 x i32> %idx
1132   %mask = icmp eq <16 x i8> %trigger, zeroinitializer
1133   %res = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %vptr2, i32 4, <16 x i1> %mask, <16 x i8> %passthru)
1134   ret <16 x i8> %res
1137 define <8 x i32> @gather_v8i32_v8i32(<8 x i32> %trigger) {
1138 ; SSE-LABEL: gather_v8i32_v8i32:
1139 ; SSE:       # %bb.0:
1140 ; SSE-NEXT:    movdqa %xmm1, %xmm3
1141 ; SSE-NEXT:    movdqa %xmm0, %xmm2
1142 ; SSE-NEXT:    pxor %xmm0, %xmm0
1143 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
1144 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
1145 ; SSE-NEXT:    packssdw %xmm1, %xmm0
1146 ; SSE-NEXT:    packsswb %xmm0, %xmm0
1147 ; SSE-NEXT:    pmovmskb %xmm0, %eax
1148 ; SSE-NEXT:    testb $1, %al
1149 ; SSE-NEXT:    je .LBB4_1
1150 ; SSE-NEXT:  # %bb.2: # %cond.load
1151 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1152 ; SSE-NEXT:    testb $2, %al
1153 ; SSE-NEXT:    jne .LBB4_4
1154 ; SSE-NEXT:    jmp .LBB4_5
1155 ; SSE-NEXT:  .LBB4_1:
1156 ; SSE-NEXT:    # implicit-def: $xmm0
1157 ; SSE-NEXT:    testb $2, %al
1158 ; SSE-NEXT:    je .LBB4_5
1159 ; SSE-NEXT:  .LBB4_4: # %cond.load1
1160 ; SSE-NEXT:    pinsrd $1, c+12(%rip), %xmm0
1161 ; SSE-NEXT:  .LBB4_5: # %else2
1162 ; SSE-NEXT:    testb $4, %al
1163 ; SSE-NEXT:    jne .LBB4_6
1164 ; SSE-NEXT:  # %bb.7: # %else5
1165 ; SSE-NEXT:    testb $8, %al
1166 ; SSE-NEXT:    jne .LBB4_8
1167 ; SSE-NEXT:  .LBB4_9: # %else8
1168 ; SSE-NEXT:    testb $16, %al
1169 ; SSE-NEXT:    je .LBB4_10
1170 ; SSE-NEXT:  .LBB4_11: # %cond.load10
1171 ; SSE-NEXT:    pinsrd $0, c+12(%rip), %xmm1
1172 ; SSE-NEXT:    testb $32, %al
1173 ; SSE-NEXT:    jne .LBB4_13
1174 ; SSE-NEXT:    jmp .LBB4_14
1175 ; SSE-NEXT:  .LBB4_6: # %cond.load4
1176 ; SSE-NEXT:    pinsrd $2, c+12(%rip), %xmm0
1177 ; SSE-NEXT:    testb $8, %al
1178 ; SSE-NEXT:    je .LBB4_9
1179 ; SSE-NEXT:  .LBB4_8: # %cond.load7
1180 ; SSE-NEXT:    pinsrd $3, c+12(%rip), %xmm0
1181 ; SSE-NEXT:    testb $16, %al
1182 ; SSE-NEXT:    jne .LBB4_11
1183 ; SSE-NEXT:  .LBB4_10:
1184 ; SSE-NEXT:    # implicit-def: $xmm1
1185 ; SSE-NEXT:    testb $32, %al
1186 ; SSE-NEXT:    je .LBB4_14
1187 ; SSE-NEXT:  .LBB4_13: # %cond.load13
1188 ; SSE-NEXT:    pinsrd $1, c+12(%rip), %xmm1
1189 ; SSE-NEXT:  .LBB4_14: # %else14
1190 ; SSE-NEXT:    testb $64, %al
1191 ; SSE-NEXT:    jne .LBB4_15
1192 ; SSE-NEXT:  # %bb.16: # %else17
1193 ; SSE-NEXT:    testb $-128, %al
1194 ; SSE-NEXT:    je .LBB4_18
1195 ; SSE-NEXT:  .LBB4_17: # %cond.load19
1196 ; SSE-NEXT:    pinsrd $3, c+12(%rip), %xmm1
1197 ; SSE-NEXT:  .LBB4_18: # %else20
1198 ; SSE-NEXT:    pxor %xmm4, %xmm4
1199 ; SSE-NEXT:    movdqa %xmm2, %xmm5
1200 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
1201 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
1202 ; SSE-NEXT:    packssdw %xmm4, %xmm5
1203 ; SSE-NEXT:    packsswb %xmm5, %xmm5
1204 ; SSE-NEXT:    pmovmskb %xmm5, %eax
1205 ; SSE-NEXT:    testb $1, %al
1206 ; SSE-NEXT:    je .LBB4_19
1207 ; SSE-NEXT:  # %bb.20: # %cond.load23
1208 ; SSE-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
1209 ; SSE-NEXT:    testb $2, %al
1210 ; SSE-NEXT:    jne .LBB4_22
1211 ; SSE-NEXT:    jmp .LBB4_23
1212 ; SSE-NEXT:  .LBB4_15: # %cond.load16
1213 ; SSE-NEXT:    pinsrd $2, c+12(%rip), %xmm1
1214 ; SSE-NEXT:    testb $-128, %al
1215 ; SSE-NEXT:    jne .LBB4_17
1216 ; SSE-NEXT:    jmp .LBB4_18
1217 ; SSE-NEXT:  .LBB4_19:
1218 ; SSE-NEXT:    # implicit-def: $xmm4
1219 ; SSE-NEXT:    testb $2, %al
1220 ; SSE-NEXT:    je .LBB4_23
1221 ; SSE-NEXT:  .LBB4_22: # %cond.load28
1222 ; SSE-NEXT:    pinsrd $1, c+28(%rip), %xmm4
1223 ; SSE-NEXT:  .LBB4_23: # %else31
1224 ; SSE-NEXT:    testb $4, %al
1225 ; SSE-NEXT:    jne .LBB4_24
1226 ; SSE-NEXT:  # %bb.25: # %else36
1227 ; SSE-NEXT:    testb $8, %al
1228 ; SSE-NEXT:    jne .LBB4_26
1229 ; SSE-NEXT:  .LBB4_27: # %else41
1230 ; SSE-NEXT:    testb $16, %al
1231 ; SSE-NEXT:    je .LBB4_28
1232 ; SSE-NEXT:  .LBB4_29: # %cond.load43
1233 ; SSE-NEXT:    pinsrd $0, c+28(%rip), %xmm5
1234 ; SSE-NEXT:    testb $32, %al
1235 ; SSE-NEXT:    jne .LBB4_31
1236 ; SSE-NEXT:    jmp .LBB4_32
1237 ; SSE-NEXT:  .LBB4_24: # %cond.load33
1238 ; SSE-NEXT:    pinsrd $2, c+28(%rip), %xmm4
1239 ; SSE-NEXT:    testb $8, %al
1240 ; SSE-NEXT:    je .LBB4_27
1241 ; SSE-NEXT:  .LBB4_26: # %cond.load38
1242 ; SSE-NEXT:    pinsrd $3, c+28(%rip), %xmm4
1243 ; SSE-NEXT:    testb $16, %al
1244 ; SSE-NEXT:    jne .LBB4_29
1245 ; SSE-NEXT:  .LBB4_28:
1246 ; SSE-NEXT:    # implicit-def: $xmm5
1247 ; SSE-NEXT:    testb $32, %al
1248 ; SSE-NEXT:    je .LBB4_32
1249 ; SSE-NEXT:  .LBB4_31: # %cond.load48
1250 ; SSE-NEXT:    pinsrd $1, c+28(%rip), %xmm5
1251 ; SSE-NEXT:  .LBB4_32: # %else51
1252 ; SSE-NEXT:    testb $64, %al
1253 ; SSE-NEXT:    jne .LBB4_33
1254 ; SSE-NEXT:  # %bb.34: # %else56
1255 ; SSE-NEXT:    testb $-128, %al
1256 ; SSE-NEXT:    je .LBB4_36
1257 ; SSE-NEXT:  .LBB4_35: # %cond.load58
1258 ; SSE-NEXT:    pinsrd $3, c+28(%rip), %xmm5
1259 ; SSE-NEXT:  .LBB4_36: # %else61
1260 ; SSE-NEXT:    pxor %xmm6, %xmm6
1261 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm2
1262 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm3
1263 ; SSE-NEXT:    packssdw %xmm3, %xmm2
1264 ; SSE-NEXT:    packsswb %xmm2, %xmm2
1265 ; SSE-NEXT:    pmovmskb %xmm2, %eax
1266 ; SSE-NEXT:    testb $1, %al
1267 ; SSE-NEXT:    je .LBB4_37
1268 ; SSE-NEXT:  # %bb.38: # %cond.load64
1269 ; SSE-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
1270 ; SSE-NEXT:    testb $2, %al
1271 ; SSE-NEXT:    jne .LBB4_40
1272 ; SSE-NEXT:    jmp .LBB4_41
1273 ; SSE-NEXT:  .LBB4_33: # %cond.load53
1274 ; SSE-NEXT:    pinsrd $2, c+28(%rip), %xmm5
1275 ; SSE-NEXT:    testb $-128, %al
1276 ; SSE-NEXT:    jne .LBB4_35
1277 ; SSE-NEXT:    jmp .LBB4_36
1278 ; SSE-NEXT:  .LBB4_37:
1279 ; SSE-NEXT:    # implicit-def: $xmm2
1280 ; SSE-NEXT:    testb $2, %al
1281 ; SSE-NEXT:    je .LBB4_41
1282 ; SSE-NEXT:  .LBB4_40: # %cond.load69
1283 ; SSE-NEXT:    pinsrd $1, c+28(%rip), %xmm2
1284 ; SSE-NEXT:  .LBB4_41: # %else72
1285 ; SSE-NEXT:    testb $4, %al
1286 ; SSE-NEXT:    jne .LBB4_42
1287 ; SSE-NEXT:  # %bb.43: # %else77
1288 ; SSE-NEXT:    testb $8, %al
1289 ; SSE-NEXT:    jne .LBB4_44
1290 ; SSE-NEXT:  .LBB4_45: # %else82
1291 ; SSE-NEXT:    testb $16, %al
1292 ; SSE-NEXT:    je .LBB4_46
1293 ; SSE-NEXT:  .LBB4_47: # %cond.load84
1294 ; SSE-NEXT:    pinsrd $0, c+28(%rip), %xmm3
1295 ; SSE-NEXT:    testb $32, %al
1296 ; SSE-NEXT:    jne .LBB4_49
1297 ; SSE-NEXT:    jmp .LBB4_50
1298 ; SSE-NEXT:  .LBB4_42: # %cond.load74
1299 ; SSE-NEXT:    pinsrd $2, c+28(%rip), %xmm2
1300 ; SSE-NEXT:    testb $8, %al
1301 ; SSE-NEXT:    je .LBB4_45
1302 ; SSE-NEXT:  .LBB4_44: # %cond.load79
1303 ; SSE-NEXT:    pinsrd $3, c+28(%rip), %xmm2
1304 ; SSE-NEXT:    testb $16, %al
1305 ; SSE-NEXT:    jne .LBB4_47
1306 ; SSE-NEXT:  .LBB4_46:
1307 ; SSE-NEXT:    # implicit-def: $xmm3
1308 ; SSE-NEXT:    testb $32, %al
1309 ; SSE-NEXT:    je .LBB4_50
1310 ; SSE-NEXT:  .LBB4_49: # %cond.load89
1311 ; SSE-NEXT:    pinsrd $1, c+28(%rip), %xmm3
1312 ; SSE-NEXT:  .LBB4_50: # %else92
1313 ; SSE-NEXT:    testb $64, %al
1314 ; SSE-NEXT:    je .LBB4_52
1315 ; SSE-NEXT:  # %bb.51: # %cond.load94
1316 ; SSE-NEXT:    pinsrd $2, c+28(%rip), %xmm3
1317 ; SSE-NEXT:  .LBB4_52: # %else97
1318 ; SSE-NEXT:    paddd %xmm4, %xmm0
1319 ; SSE-NEXT:    paddd %xmm5, %xmm1
1320 ; SSE-NEXT:    testb $-128, %al
1321 ; SSE-NEXT:    je .LBB4_54
1322 ; SSE-NEXT:  # %bb.53: # %cond.load99
1323 ; SSE-NEXT:    pinsrd $3, c+28(%rip), %xmm3
1324 ; SSE-NEXT:  .LBB4_54: # %else102
1325 ; SSE-NEXT:    paddd %xmm3, %xmm1
1326 ; SSE-NEXT:    paddd %xmm2, %xmm0
1327 ; SSE-NEXT:    retq
1329 ; AVX1-LABEL: gather_v8i32_v8i32:
1330 ; AVX1:       # %bb.0:
1331 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1332 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1333 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm2, %xmm3
1334 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm1
1335 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1336 ; AVX1-NEXT:    vmovmskps %ymm1, %eax
1337 ; AVX1-NEXT:    testb $1, %al
1338 ; AVX1-NEXT:    # implicit-def: $ymm1
1339 ; AVX1-NEXT:    jne .LBB4_1
1340 ; AVX1-NEXT:  # %bb.2: # %else
1341 ; AVX1-NEXT:    testb $2, %al
1342 ; AVX1-NEXT:    jne .LBB4_3
1343 ; AVX1-NEXT:  .LBB4_4: # %else2
1344 ; AVX1-NEXT:    testb $4, %al
1345 ; AVX1-NEXT:    jne .LBB4_5
1346 ; AVX1-NEXT:  .LBB4_6: # %else5
1347 ; AVX1-NEXT:    testb $8, %al
1348 ; AVX1-NEXT:    jne .LBB4_7
1349 ; AVX1-NEXT:  .LBB4_8: # %else8
1350 ; AVX1-NEXT:    testb $16, %al
1351 ; AVX1-NEXT:    jne .LBB4_9
1352 ; AVX1-NEXT:  .LBB4_10: # %else11
1353 ; AVX1-NEXT:    testb $32, %al
1354 ; AVX1-NEXT:    jne .LBB4_11
1355 ; AVX1-NEXT:  .LBB4_12: # %else14
1356 ; AVX1-NEXT:    testb $64, %al
1357 ; AVX1-NEXT:    jne .LBB4_13
1358 ; AVX1-NEXT:  .LBB4_14: # %else17
1359 ; AVX1-NEXT:    testb $-128, %al
1360 ; AVX1-NEXT:    je .LBB4_16
1361 ; AVX1-NEXT:  .LBB4_15: # %cond.load19
1362 ; AVX1-NEXT:    vbroadcastss c+12(%rip), %ymm3
1363 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5,6],ymm3[7]
1364 ; AVX1-NEXT:  .LBB4_16: # %else20
1365 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1366 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm4
1367 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm3
1368 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1369 ; AVX1-NEXT:    vmovmskps %ymm3, %eax
1370 ; AVX1-NEXT:    testb $1, %al
1371 ; AVX1-NEXT:    # implicit-def: $ymm3
1372 ; AVX1-NEXT:    jne .LBB4_17
1373 ; AVX1-NEXT:  # %bb.18: # %else26
1374 ; AVX1-NEXT:    testb $2, %al
1375 ; AVX1-NEXT:    jne .LBB4_19
1376 ; AVX1-NEXT:  .LBB4_20: # %else31
1377 ; AVX1-NEXT:    testb $4, %al
1378 ; AVX1-NEXT:    jne .LBB4_21
1379 ; AVX1-NEXT:  .LBB4_22: # %else36
1380 ; AVX1-NEXT:    testb $8, %al
1381 ; AVX1-NEXT:    jne .LBB4_23
1382 ; AVX1-NEXT:  .LBB4_24: # %else41
1383 ; AVX1-NEXT:    testb $16, %al
1384 ; AVX1-NEXT:    jne .LBB4_25
1385 ; AVX1-NEXT:  .LBB4_26: # %else46
1386 ; AVX1-NEXT:    testb $32, %al
1387 ; AVX1-NEXT:    jne .LBB4_27
1388 ; AVX1-NEXT:  .LBB4_28: # %else51
1389 ; AVX1-NEXT:    testb $64, %al
1390 ; AVX1-NEXT:    jne .LBB4_29
1391 ; AVX1-NEXT:  .LBB4_30: # %else56
1392 ; AVX1-NEXT:    testb $-128, %al
1393 ; AVX1-NEXT:    je .LBB4_32
1394 ; AVX1-NEXT:  .LBB4_31: # %cond.load58
1395 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm4
1396 ; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5,6],ymm4[7]
1397 ; AVX1-NEXT:  .LBB4_32: # %else61
1398 ; AVX1-NEXT:    vxorps %xmm4, %xmm4, %xmm4
1399 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm2
1400 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm0, %xmm0
1401 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1402 ; AVX1-NEXT:    vmovmskps %ymm0, %eax
1403 ; AVX1-NEXT:    testb $1, %al
1404 ; AVX1-NEXT:    # implicit-def: $ymm0
1405 ; AVX1-NEXT:    jne .LBB4_33
1406 ; AVX1-NEXT:  # %bb.34: # %else67
1407 ; AVX1-NEXT:    testb $2, %al
1408 ; AVX1-NEXT:    jne .LBB4_35
1409 ; AVX1-NEXT:  .LBB4_36: # %else72
1410 ; AVX1-NEXT:    testb $4, %al
1411 ; AVX1-NEXT:    jne .LBB4_37
1412 ; AVX1-NEXT:  .LBB4_38: # %else77
1413 ; AVX1-NEXT:    testb $8, %al
1414 ; AVX1-NEXT:    jne .LBB4_39
1415 ; AVX1-NEXT:  .LBB4_40: # %else82
1416 ; AVX1-NEXT:    testb $16, %al
1417 ; AVX1-NEXT:    je .LBB4_42
1418 ; AVX1-NEXT:  .LBB4_41: # %cond.load84
1419 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm2
1420 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm2[4],ymm0[5,6,7]
1421 ; AVX1-NEXT:  .LBB4_42: # %else87
1422 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1423 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1424 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
1425 ; AVX1-NEXT:    testb $32, %al
1426 ; AVX1-NEXT:    je .LBB4_44
1427 ; AVX1-NEXT:  # %bb.43: # %cond.load89
1428 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm3
1429 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm3[5],ymm0[6,7]
1430 ; AVX1-NEXT:  .LBB4_44: # %else92
1431 ; AVX1-NEXT:    vpaddd %xmm2, %xmm4, %xmm2
1432 ; AVX1-NEXT:    testb $64, %al
1433 ; AVX1-NEXT:    je .LBB4_46
1434 ; AVX1-NEXT:  # %bb.45: # %cond.load94
1435 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm3
1436 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm3[6],ymm0[7]
1437 ; AVX1-NEXT:  .LBB4_46: # %else97
1438 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1439 ; AVX1-NEXT:    testb $-128, %al
1440 ; AVX1-NEXT:    je .LBB4_48
1441 ; AVX1-NEXT:  # %bb.47: # %cond.load99
1442 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm2
1443 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5,6],ymm2[7]
1444 ; AVX1-NEXT:  .LBB4_48: # %else102
1445 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1446 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1447 ; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
1448 ; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
1449 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1450 ; AVX1-NEXT:    retq
1451 ; AVX1-NEXT:  .LBB4_1: # %cond.load
1452 ; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1453 ; AVX1-NEXT:    testb $2, %al
1454 ; AVX1-NEXT:    je .LBB4_4
1455 ; AVX1-NEXT:  .LBB4_3: # %cond.load1
1456 ; AVX1-NEXT:    vpinsrd $1, c+12(%rip), %xmm1, %xmm3
1457 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7]
1458 ; AVX1-NEXT:    testb $4, %al
1459 ; AVX1-NEXT:    je .LBB4_6
1460 ; AVX1-NEXT:  .LBB4_5: # %cond.load4
1461 ; AVX1-NEXT:    vpinsrd $2, c+12(%rip), %xmm1, %xmm3
1462 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7]
1463 ; AVX1-NEXT:    testb $8, %al
1464 ; AVX1-NEXT:    je .LBB4_8
1465 ; AVX1-NEXT:  .LBB4_7: # %cond.load7
1466 ; AVX1-NEXT:    vpinsrd $3, c+12(%rip), %xmm1, %xmm3
1467 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7]
1468 ; AVX1-NEXT:    testb $16, %al
1469 ; AVX1-NEXT:    je .LBB4_10
1470 ; AVX1-NEXT:  .LBB4_9: # %cond.load10
1471 ; AVX1-NEXT:    vbroadcastss c+12(%rip), %ymm3
1472 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm3[4],ymm1[5,6,7]
1473 ; AVX1-NEXT:    testb $32, %al
1474 ; AVX1-NEXT:    je .LBB4_12
1475 ; AVX1-NEXT:  .LBB4_11: # %cond.load13
1476 ; AVX1-NEXT:    vbroadcastss c+12(%rip), %ymm3
1477 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4],ymm3[5],ymm1[6,7]
1478 ; AVX1-NEXT:    testb $64, %al
1479 ; AVX1-NEXT:    je .LBB4_14
1480 ; AVX1-NEXT:  .LBB4_13: # %cond.load16
1481 ; AVX1-NEXT:    vbroadcastss c+12(%rip), %ymm3
1482 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],ymm3[6],ymm1[7]
1483 ; AVX1-NEXT:    testb $-128, %al
1484 ; AVX1-NEXT:    jne .LBB4_15
1485 ; AVX1-NEXT:    jmp .LBB4_16
1486 ; AVX1-NEXT:  .LBB4_17: # %cond.load23
1487 ; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero
1488 ; AVX1-NEXT:    testb $2, %al
1489 ; AVX1-NEXT:    je .LBB4_20
1490 ; AVX1-NEXT:  .LBB4_19: # %cond.load28
1491 ; AVX1-NEXT:    vpinsrd $1, c+28(%rip), %xmm3, %xmm4
1492 ; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]
1493 ; AVX1-NEXT:    testb $4, %al
1494 ; AVX1-NEXT:    je .LBB4_22
1495 ; AVX1-NEXT:  .LBB4_21: # %cond.load33
1496 ; AVX1-NEXT:    vpinsrd $2, c+28(%rip), %xmm3, %xmm4
1497 ; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]
1498 ; AVX1-NEXT:    testb $8, %al
1499 ; AVX1-NEXT:    je .LBB4_24
1500 ; AVX1-NEXT:  .LBB4_23: # %cond.load38
1501 ; AVX1-NEXT:    vpinsrd $3, c+28(%rip), %xmm3, %xmm4
1502 ; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]
1503 ; AVX1-NEXT:    testb $16, %al
1504 ; AVX1-NEXT:    je .LBB4_26
1505 ; AVX1-NEXT:  .LBB4_25: # %cond.load43
1506 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm4
1507 ; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3],ymm4[4],ymm3[5,6,7]
1508 ; AVX1-NEXT:    testb $32, %al
1509 ; AVX1-NEXT:    je .LBB4_28
1510 ; AVX1-NEXT:  .LBB4_27: # %cond.load48
1511 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm4
1512 ; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4],ymm4[5],ymm3[6,7]
1513 ; AVX1-NEXT:    testb $64, %al
1514 ; AVX1-NEXT:    je .LBB4_30
1515 ; AVX1-NEXT:  .LBB4_29: # %cond.load53
1516 ; AVX1-NEXT:    vbroadcastss c+28(%rip), %ymm4
1517 ; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm4[6],ymm3[7]
1518 ; AVX1-NEXT:    testb $-128, %al
1519 ; AVX1-NEXT:    jne .LBB4_31
1520 ; AVX1-NEXT:    jmp .LBB4_32
1521 ; AVX1-NEXT:  .LBB4_33: # %cond.load64
1522 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1523 ; AVX1-NEXT:    testb $2, %al
1524 ; AVX1-NEXT:    je .LBB4_36
1525 ; AVX1-NEXT:  .LBB4_35: # %cond.load69
1526 ; AVX1-NEXT:    vpinsrd $1, c+28(%rip), %xmm0, %xmm2
1527 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
1528 ; AVX1-NEXT:    testb $4, %al
1529 ; AVX1-NEXT:    je .LBB4_38
1530 ; AVX1-NEXT:  .LBB4_37: # %cond.load74
1531 ; AVX1-NEXT:    vpinsrd $2, c+28(%rip), %xmm0, %xmm2
1532 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
1533 ; AVX1-NEXT:    testb $8, %al
1534 ; AVX1-NEXT:    je .LBB4_40
1535 ; AVX1-NEXT:  .LBB4_39: # %cond.load79
1536 ; AVX1-NEXT:    vpinsrd $3, c+28(%rip), %xmm0, %xmm2
1537 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
1538 ; AVX1-NEXT:    testb $16, %al
1539 ; AVX1-NEXT:    jne .LBB4_41
1540 ; AVX1-NEXT:    jmp .LBB4_42
1542 ; AVX2-LABEL: gather_v8i32_v8i32:
1543 ; AVX2:       # %bb.0:
1544 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1545 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm1
1546 ; AVX2-NEXT:    vmovmskps %ymm1, %eax
1547 ; AVX2-NEXT:    testb $1, %al
1548 ; AVX2-NEXT:    # implicit-def: $ymm1
1549 ; AVX2-NEXT:    jne .LBB4_1
1550 ; AVX2-NEXT:  # %bb.2: # %else
1551 ; AVX2-NEXT:    testb $2, %al
1552 ; AVX2-NEXT:    jne .LBB4_3
1553 ; AVX2-NEXT:  .LBB4_4: # %else2
1554 ; AVX2-NEXT:    testb $4, %al
1555 ; AVX2-NEXT:    jne .LBB4_5
1556 ; AVX2-NEXT:  .LBB4_6: # %else5
1557 ; AVX2-NEXT:    testb $8, %al
1558 ; AVX2-NEXT:    jne .LBB4_7
1559 ; AVX2-NEXT:  .LBB4_8: # %else8
1560 ; AVX2-NEXT:    testb $16, %al
1561 ; AVX2-NEXT:    jne .LBB4_9
1562 ; AVX2-NEXT:  .LBB4_10: # %else11
1563 ; AVX2-NEXT:    testb $32, %al
1564 ; AVX2-NEXT:    jne .LBB4_11
1565 ; AVX2-NEXT:  .LBB4_12: # %else14
1566 ; AVX2-NEXT:    testb $64, %al
1567 ; AVX2-NEXT:    jne .LBB4_13
1568 ; AVX2-NEXT:  .LBB4_14: # %else17
1569 ; AVX2-NEXT:    testb $-128, %al
1570 ; AVX2-NEXT:    je .LBB4_16
1571 ; AVX2-NEXT:  .LBB4_15: # %cond.load19
1572 ; AVX2-NEXT:    vpbroadcastd c+12(%rip), %ymm2
1573 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5,6],ymm2[7]
1574 ; AVX2-NEXT:  .LBB4_16: # %else20
1575 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1576 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm2
1577 ; AVX2-NEXT:    vmovmskps %ymm2, %eax
1578 ; AVX2-NEXT:    testb $1, %al
1579 ; AVX2-NEXT:    # implicit-def: $ymm2
1580 ; AVX2-NEXT:    jne .LBB4_17
1581 ; AVX2-NEXT:  # %bb.18: # %else26
1582 ; AVX2-NEXT:    testb $2, %al
1583 ; AVX2-NEXT:    jne .LBB4_19
1584 ; AVX2-NEXT:  .LBB4_20: # %else31
1585 ; AVX2-NEXT:    testb $4, %al
1586 ; AVX2-NEXT:    jne .LBB4_21
1587 ; AVX2-NEXT:  .LBB4_22: # %else36
1588 ; AVX2-NEXT:    testb $8, %al
1589 ; AVX2-NEXT:    jne .LBB4_23
1590 ; AVX2-NEXT:  .LBB4_24: # %else41
1591 ; AVX2-NEXT:    testb $16, %al
1592 ; AVX2-NEXT:    jne .LBB4_25
1593 ; AVX2-NEXT:  .LBB4_26: # %else46
1594 ; AVX2-NEXT:    testb $32, %al
1595 ; AVX2-NEXT:    jne .LBB4_27
1596 ; AVX2-NEXT:  .LBB4_28: # %else51
1597 ; AVX2-NEXT:    testb $64, %al
1598 ; AVX2-NEXT:    jne .LBB4_29
1599 ; AVX2-NEXT:  .LBB4_30: # %else56
1600 ; AVX2-NEXT:    testb $-128, %al
1601 ; AVX2-NEXT:    je .LBB4_32
1602 ; AVX2-NEXT:  .LBB4_31: # %cond.load58
1603 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm3
1604 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5,6],ymm3[7]
1605 ; AVX2-NEXT:  .LBB4_32: # %else61
1606 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1607 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm0, %ymm0
1608 ; AVX2-NEXT:    vmovmskps %ymm0, %eax
1609 ; AVX2-NEXT:    testb $1, %al
1610 ; AVX2-NEXT:    # implicit-def: $ymm0
1611 ; AVX2-NEXT:    jne .LBB4_33
1612 ; AVX2-NEXT:  # %bb.34: # %else67
1613 ; AVX2-NEXT:    testb $2, %al
1614 ; AVX2-NEXT:    jne .LBB4_35
1615 ; AVX2-NEXT:  .LBB4_36: # %else72
1616 ; AVX2-NEXT:    testb $4, %al
1617 ; AVX2-NEXT:    jne .LBB4_37
1618 ; AVX2-NEXT:  .LBB4_38: # %else77
1619 ; AVX2-NEXT:    testb $8, %al
1620 ; AVX2-NEXT:    jne .LBB4_39
1621 ; AVX2-NEXT:  .LBB4_40: # %else82
1622 ; AVX2-NEXT:    testb $16, %al
1623 ; AVX2-NEXT:    jne .LBB4_41
1624 ; AVX2-NEXT:  .LBB4_42: # %else87
1625 ; AVX2-NEXT:    testb $32, %al
1626 ; AVX2-NEXT:    jne .LBB4_43
1627 ; AVX2-NEXT:  .LBB4_44: # %else92
1628 ; AVX2-NEXT:    testb $64, %al
1629 ; AVX2-NEXT:    je .LBB4_46
1630 ; AVX2-NEXT:  .LBB4_45: # %cond.load94
1631 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm3
1632 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm3[6],ymm0[7]
1633 ; AVX2-NEXT:  .LBB4_46: # %else97
1634 ; AVX2-NEXT:    vpaddd %ymm2, %ymm1, %ymm1
1635 ; AVX2-NEXT:    testb $-128, %al
1636 ; AVX2-NEXT:    je .LBB4_48
1637 ; AVX2-NEXT:  # %bb.47: # %cond.load99
1638 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm2
1639 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5,6],ymm2[7]
1640 ; AVX2-NEXT:  .LBB4_48: # %else102
1641 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
1642 ; AVX2-NEXT:    retq
1643 ; AVX2-NEXT:  .LBB4_1: # %cond.load
1644 ; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1645 ; AVX2-NEXT:    testb $2, %al
1646 ; AVX2-NEXT:    je .LBB4_4
1647 ; AVX2-NEXT:  .LBB4_3: # %cond.load1
1648 ; AVX2-NEXT:    vpinsrd $1, c+12(%rip), %xmm1, %xmm2
1649 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1650 ; AVX2-NEXT:    testb $4, %al
1651 ; AVX2-NEXT:    je .LBB4_6
1652 ; AVX2-NEXT:  .LBB4_5: # %cond.load4
1653 ; AVX2-NEXT:    vpinsrd $2, c+12(%rip), %xmm1, %xmm2
1654 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1655 ; AVX2-NEXT:    testb $8, %al
1656 ; AVX2-NEXT:    je .LBB4_8
1657 ; AVX2-NEXT:  .LBB4_7: # %cond.load7
1658 ; AVX2-NEXT:    vpinsrd $3, c+12(%rip), %xmm1, %xmm2
1659 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1660 ; AVX2-NEXT:    testb $16, %al
1661 ; AVX2-NEXT:    je .LBB4_10
1662 ; AVX2-NEXT:  .LBB4_9: # %cond.load10
1663 ; AVX2-NEXT:    vpbroadcastd c+12(%rip), %ymm2
1664 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4],ymm1[5,6,7]
1665 ; AVX2-NEXT:    testb $32, %al
1666 ; AVX2-NEXT:    je .LBB4_12
1667 ; AVX2-NEXT:  .LBB4_11: # %cond.load13
1668 ; AVX2-NEXT:    vpbroadcastd c+12(%rip), %ymm2
1669 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4],ymm2[5],ymm1[6,7]
1670 ; AVX2-NEXT:    testb $64, %al
1671 ; AVX2-NEXT:    je .LBB4_14
1672 ; AVX2-NEXT:  .LBB4_13: # %cond.load16
1673 ; AVX2-NEXT:    vpbroadcastd c+12(%rip), %ymm2
1674 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],ymm2[6],ymm1[7]
1675 ; AVX2-NEXT:    testb $-128, %al
1676 ; AVX2-NEXT:    jne .LBB4_15
1677 ; AVX2-NEXT:    jmp .LBB4_16
1678 ; AVX2-NEXT:  .LBB4_17: # %cond.load23
1679 ; AVX2-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
1680 ; AVX2-NEXT:    testb $2, %al
1681 ; AVX2-NEXT:    je .LBB4_20
1682 ; AVX2-NEXT:  .LBB4_19: # %cond.load28
1683 ; AVX2-NEXT:    vpinsrd $1, c+28(%rip), %xmm2, %xmm3
1684 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]
1685 ; AVX2-NEXT:    testb $4, %al
1686 ; AVX2-NEXT:    je .LBB4_22
1687 ; AVX2-NEXT:  .LBB4_21: # %cond.load33
1688 ; AVX2-NEXT:    vpinsrd $2, c+28(%rip), %xmm2, %xmm3
1689 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]
1690 ; AVX2-NEXT:    testb $8, %al
1691 ; AVX2-NEXT:    je .LBB4_24
1692 ; AVX2-NEXT:  .LBB4_23: # %cond.load38
1693 ; AVX2-NEXT:    vpinsrd $3, c+28(%rip), %xmm2, %xmm3
1694 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]
1695 ; AVX2-NEXT:    testb $16, %al
1696 ; AVX2-NEXT:    je .LBB4_26
1697 ; AVX2-NEXT:  .LBB4_25: # %cond.load43
1698 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm3
1699 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm3[4],ymm2[5,6,7]
1700 ; AVX2-NEXT:    testb $32, %al
1701 ; AVX2-NEXT:    je .LBB4_28
1702 ; AVX2-NEXT:  .LBB4_27: # %cond.load48
1703 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm3
1704 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4],ymm3[5],ymm2[6,7]
1705 ; AVX2-NEXT:    testb $64, %al
1706 ; AVX2-NEXT:    je .LBB4_30
1707 ; AVX2-NEXT:  .LBB4_29: # %cond.load53
1708 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm3
1709 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5],ymm3[6],ymm2[7]
1710 ; AVX2-NEXT:    testb $-128, %al
1711 ; AVX2-NEXT:    jne .LBB4_31
1712 ; AVX2-NEXT:    jmp .LBB4_32
1713 ; AVX2-NEXT:  .LBB4_33: # %cond.load64
1714 ; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1715 ; AVX2-NEXT:    testb $2, %al
1716 ; AVX2-NEXT:    je .LBB4_36
1717 ; AVX2-NEXT:  .LBB4_35: # %cond.load69
1718 ; AVX2-NEXT:    vpinsrd $1, c+28(%rip), %xmm0, %xmm3
1719 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7]
1720 ; AVX2-NEXT:    testb $4, %al
1721 ; AVX2-NEXT:    je .LBB4_38
1722 ; AVX2-NEXT:  .LBB4_37: # %cond.load74
1723 ; AVX2-NEXT:    vpinsrd $2, c+28(%rip), %xmm0, %xmm3
1724 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7]
1725 ; AVX2-NEXT:    testb $8, %al
1726 ; AVX2-NEXT:    je .LBB4_40
1727 ; AVX2-NEXT:  .LBB4_39: # %cond.load79
1728 ; AVX2-NEXT:    vpinsrd $3, c+28(%rip), %xmm0, %xmm3
1729 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7]
1730 ; AVX2-NEXT:    testb $16, %al
1731 ; AVX2-NEXT:    je .LBB4_42
1732 ; AVX2-NEXT:  .LBB4_41: # %cond.load84
1733 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm3
1734 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm3[4],ymm0[5,6,7]
1735 ; AVX2-NEXT:    testb $32, %al
1736 ; AVX2-NEXT:    je .LBB4_44
1737 ; AVX2-NEXT:  .LBB4_43: # %cond.load89
1738 ; AVX2-NEXT:    vpbroadcastd c+28(%rip), %ymm3
1739 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm3[5],ymm0[6,7]
1740 ; AVX2-NEXT:    testb $64, %al
1741 ; AVX2-NEXT:    jne .LBB4_45
1742 ; AVX2-NEXT:    jmp .LBB4_46
1744 ; AVX512F-LABEL: gather_v8i32_v8i32:
1745 ; AVX512F:       # %bb.0:
1746 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1747 ; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1748 ; AVX512F-NEXT:    kshiftlw $8, %k0, %k0
1749 ; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
1750 ; AVX512F-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1751 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1752 ; AVX512F-NEXT:    kmovw %k1, %k2
1753 ; AVX512F-NEXT:    vpgatherdd c+12(,%zmm0), %zmm1 {%k2}
1754 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1755 ; AVX512F-NEXT:    vpgatherdd c+28(,%zmm0), %zmm2 {%k1}
1756 ; AVX512F-NEXT:    vpaddd %ymm2, %ymm1, %ymm0
1757 ; AVX512F-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
1758 ; AVX512F-NEXT:    retq
1760 ; AVX512VL-LABEL: gather_v8i32_v8i32:
1761 ; AVX512VL:       # %bb.0:
1762 ; AVX512VL-NEXT:    vptestnmd %ymm0, %ymm0, %k1
1763 ; AVX512VL-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1764 ; AVX512VL-NEXT:    kmovw %k1, %k2
1765 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1766 ; AVX512VL-NEXT:    vpgatherdd c+12(,%ymm0), %ymm1 {%k2}
1767 ; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1768 ; AVX512VL-NEXT:    vpgatherdd c+28(,%ymm0), %ymm2 {%k1}
1769 ; AVX512VL-NEXT:    vpaddd %ymm2, %ymm1, %ymm0
1770 ; AVX512VL-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
1771 ; AVX512VL-NEXT:    retq
1772   %1 = icmp eq <8 x i32> %trigger, zeroinitializer
1773   %2 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> getelementptr (%struct.a, <8 x ptr> <ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c>, <8 x i64> zeroinitializer, i32 0, <8 x i64> <i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3>), i32 4, <8 x i1> %1, <8 x i32> undef)
1774   %3 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> getelementptr (%struct.a, <8 x ptr> <ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c>, <8 x i64> zeroinitializer, i32 3), i32 4, <8 x i1> %1, <8 x i32> undef)
1775   %4 = add <8 x i32> %2, %3
1776   %5 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> getelementptr (%struct.a, <8 x ptr> <ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c>, <8 x i64> zeroinitializer, i32 3), i32 4, <8 x i1> %1, <8 x i32> undef)
1777   %6 = add <8 x i32> %4, %5
1778   ret <8 x i32> %6
1781 declare <2 x double> @llvm.masked.gather.v2f64.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x double>)
1782 declare <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x double>)
1784 declare <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x float>)
1785 declare <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x float>)
1787 declare <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i8>)
1789 declare <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i32>)