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
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:
14 ; SSE-NEXT: pxor %xmm4, %xmm4
15 ; SSE-NEXT: pcmpeqd %xmm2, %xmm4
16 ; SSE-NEXT: movmskps %xmm4, %eax
17 ; SSE-NEXT: testb $1, %al
18 ; SSE-NEXT: jne .LBB0_1
19 ; SSE-NEXT: # %bb.2: # %else
20 ; SSE-NEXT: testb $2, %al
21 ; SSE-NEXT: jne .LBB0_3
22 ; SSE-NEXT: .LBB0_4: # %else2
23 ; SSE-NEXT: testb $4, %al
24 ; SSE-NEXT: jne .LBB0_5
25 ; SSE-NEXT: .LBB0_6: # %else5
26 ; SSE-NEXT: testb $8, %al
27 ; SSE-NEXT: jne .LBB0_7
28 ; SSE-NEXT: .LBB0_8: # %else8
29 ; SSE-NEXT: movaps %xmm3, %xmm0
31 ; SSE-NEXT: .LBB0_1: # %cond.load
32 ; SSE-NEXT: movq %xmm0, %rcx
33 ; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
34 ; SSE-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7]
35 ; SSE-NEXT: testb $2, %al
36 ; SSE-NEXT: je .LBB0_4
37 ; SSE-NEXT: .LBB0_3: # %cond.load1
38 ; SSE-NEXT: pextrq $1, %xmm0, %rcx
39 ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
40 ; SSE-NEXT: testb $4, %al
41 ; SSE-NEXT: je .LBB0_6
42 ; SSE-NEXT: .LBB0_5: # %cond.load4
43 ; SSE-NEXT: movq %xmm1, %rcx
44 ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
45 ; SSE-NEXT: testb $8, %al
46 ; SSE-NEXT: je .LBB0_8
47 ; SSE-NEXT: .LBB0_7: # %cond.load7
48 ; SSE-NEXT: pextrq $1, %xmm1, %rax
49 ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
50 ; SSE-NEXT: movaps %xmm3, %xmm0
53 ; AVX1-LABEL: gather_v4f32_ptr_v4i32:
55 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
56 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
57 ; AVX1-NEXT: vmovmskps %xmm1, %eax
58 ; AVX1-NEXT: testb $1, %al
59 ; AVX1-NEXT: je .LBB0_2
60 ; AVX1-NEXT: # %bb.1: # %cond.load
61 ; AVX1-NEXT: vmovq %xmm0, %rcx
62 ; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
63 ; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
64 ; AVX1-NEXT: .LBB0_2: # %else
65 ; AVX1-NEXT: testb $2, %al
66 ; AVX1-NEXT: je .LBB0_4
67 ; AVX1-NEXT: # %bb.3: # %cond.load1
68 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
69 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
70 ; AVX1-NEXT: .LBB0_4: # %else2
71 ; AVX1-NEXT: testb $4, %al
72 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
73 ; AVX1-NEXT: jne .LBB0_5
74 ; AVX1-NEXT: # %bb.6: # %else5
75 ; AVX1-NEXT: testb $8, %al
76 ; AVX1-NEXT: jne .LBB0_7
77 ; AVX1-NEXT: .LBB0_8: # %else8
78 ; AVX1-NEXT: vmovaps %xmm2, %xmm0
79 ; AVX1-NEXT: vzeroupper
81 ; AVX1-NEXT: .LBB0_5: # %cond.load4
82 ; AVX1-NEXT: vmovq %xmm0, %rcx
83 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
84 ; AVX1-NEXT: testb $8, %al
85 ; AVX1-NEXT: je .LBB0_8
86 ; AVX1-NEXT: .LBB0_7: # %cond.load7
87 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax
88 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
89 ; AVX1-NEXT: vmovaps %xmm2, %xmm0
90 ; AVX1-NEXT: vzeroupper
93 ; AVX2-LABEL: gather_v4f32_ptr_v4i32:
95 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
96 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
97 ; AVX2-NEXT: vmovmskps %xmm1, %eax
98 ; AVX2-NEXT: testb $1, %al
99 ; AVX2-NEXT: je .LBB0_2
100 ; AVX2-NEXT: # %bb.1: # %cond.load
101 ; AVX2-NEXT: vmovq %xmm0, %rcx
102 ; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
103 ; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
104 ; AVX2-NEXT: .LBB0_2: # %else
105 ; AVX2-NEXT: testb $2, %al
106 ; AVX2-NEXT: je .LBB0_4
107 ; AVX2-NEXT: # %bb.3: # %cond.load1
108 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
109 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
110 ; AVX2-NEXT: .LBB0_4: # %else2
111 ; AVX2-NEXT: testb $4, %al
112 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
113 ; AVX2-NEXT: jne .LBB0_5
114 ; AVX2-NEXT: # %bb.6: # %else5
115 ; AVX2-NEXT: testb $8, %al
116 ; AVX2-NEXT: jne .LBB0_7
117 ; AVX2-NEXT: .LBB0_8: # %else8
118 ; AVX2-NEXT: vmovaps %xmm2, %xmm0
119 ; AVX2-NEXT: vzeroupper
121 ; AVX2-NEXT: .LBB0_5: # %cond.load4
122 ; AVX2-NEXT: vmovq %xmm0, %rcx
123 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
124 ; AVX2-NEXT: testb $8, %al
125 ; AVX2-NEXT: je .LBB0_8
126 ; AVX2-NEXT: .LBB0_7: # %cond.load7
127 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax
128 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
129 ; AVX2-NEXT: vmovaps %xmm2, %xmm0
130 ; AVX2-NEXT: vzeroupper
133 ; AVX512-LABEL: gather_v4f32_ptr_v4i32:
135 ; AVX512-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2
136 ; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
137 ; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
138 ; AVX512-NEXT: vptestnmd %zmm1, %zmm1, %k0
139 ; AVX512-NEXT: kshiftlw $12, %k0, %k0
140 ; AVX512-NEXT: kshiftrw $12, %k0, %k1
141 ; AVX512-NEXT: vgatherqps (,%zmm0), %ymm2 {%k1}
142 ; AVX512-NEXT: vmovaps %xmm2, %xmm0
143 ; AVX512-NEXT: vzeroupper
145 %mask = icmp eq <4 x i32> %trigger, zeroinitializer
146 %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*> %ptr, i32 4, <4 x i1> %mask, <4 x float> %passthru)
150 define <4 x float> @gather_v4f32_v4i32_v4i32(float* %base, <4 x i32> %idx, <4 x i32> %trigger, <4 x float> %passthru) {
151 ; SSE-LABEL: gather_v4f32_v4i32_v4i32:
153 ; SSE-NEXT: movq %rdi, %xmm3
154 ; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]
155 ; SSE-NEXT: pmovsxdq %xmm0, %xmm4
156 ; SSE-NEXT: psllq $2, %xmm4
157 ; SSE-NEXT: paddq %xmm3, %xmm4
158 ; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
159 ; SSE-NEXT: pmovsxdq %xmm0, %xmm0
160 ; SSE-NEXT: pxor %xmm5, %xmm5
161 ; SSE-NEXT: pcmpeqd %xmm1, %xmm5
162 ; SSE-NEXT: movmskps %xmm5, %eax
163 ; SSE-NEXT: testb $1, %al
164 ; SSE-NEXT: je .LBB1_2
165 ; SSE-NEXT: # %bb.1: # %cond.load
166 ; SSE-NEXT: movq %xmm4, %rcx
167 ; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
168 ; SSE-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
169 ; SSE-NEXT: .LBB1_2: # %else
170 ; SSE-NEXT: psllq $2, %xmm0
171 ; SSE-NEXT: testb $2, %al
172 ; SSE-NEXT: je .LBB1_4
173 ; SSE-NEXT: # %bb.3: # %cond.load1
174 ; SSE-NEXT: pextrq $1, %xmm4, %rcx
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: testb $4, %al
179 ; SSE-NEXT: jne .LBB1_5
180 ; SSE-NEXT: # %bb.6: # %else5
181 ; SSE-NEXT: testb $8, %al
182 ; SSE-NEXT: jne .LBB1_7
183 ; SSE-NEXT: .LBB1_8: # %else8
184 ; SSE-NEXT: movaps %xmm2, %xmm0
186 ; SSE-NEXT: .LBB1_5: # %cond.load4
187 ; SSE-NEXT: movq %xmm3, %rcx
188 ; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
189 ; SSE-NEXT: testb $8, %al
190 ; SSE-NEXT: je .LBB1_8
191 ; SSE-NEXT: .LBB1_7: # %cond.load7
192 ; SSE-NEXT: pextrq $1, %xmm3, %rax
193 ; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
194 ; SSE-NEXT: movaps %xmm2, %xmm0
197 ; AVX1-LABEL: gather_v4f32_v4i32_v4i32:
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, %xmm1
211 ; AVX1-NEXT: vmovmskps %xmm1, %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, %rcx
216 ; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
217 ; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
218 ; AVX1-NEXT: .LBB1_2: # %else
219 ; AVX1-NEXT: testb $2, %al
220 ; AVX1-NEXT: je .LBB1_4
221 ; AVX1-NEXT: # %bb.3: # %cond.load1
222 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
223 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
224 ; AVX1-NEXT: .LBB1_4: # %else2
225 ; AVX1-NEXT: testb $4, %al
226 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
227 ; AVX1-NEXT: jne .LBB1_5
228 ; AVX1-NEXT: # %bb.6: # %else5
229 ; AVX1-NEXT: testb $8, %al
230 ; AVX1-NEXT: jne .LBB1_7
231 ; AVX1-NEXT: .LBB1_8: # %else8
232 ; AVX1-NEXT: vmovaps %xmm2, %xmm0
233 ; AVX1-NEXT: vzeroupper
235 ; AVX1-NEXT: .LBB1_5: # %cond.load4
236 ; AVX1-NEXT: vmovq %xmm0, %rcx
237 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
238 ; AVX1-NEXT: testb $8, %al
239 ; AVX1-NEXT: je .LBB1_8
240 ; AVX1-NEXT: .LBB1_7: # %cond.load7
241 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax
242 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
243 ; AVX1-NEXT: vmovaps %xmm2, %xmm0
244 ; AVX1-NEXT: vzeroupper
247 ; AVX2-LABEL: gather_v4f32_v4i32_v4i32:
249 ; AVX2-NEXT: vmovq %rdi, %xmm3
250 ; AVX2-NEXT: vpbroadcastq %xmm3, %ymm3
251 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
252 ; AVX2-NEXT: vpsllq $2, %ymm0, %ymm0
253 ; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0
254 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
255 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
256 ; AVX2-NEXT: vmovmskps %xmm1, %eax
257 ; AVX2-NEXT: testb $1, %al
258 ; AVX2-NEXT: je .LBB1_2
259 ; AVX2-NEXT: # %bb.1: # %cond.load
260 ; AVX2-NEXT: vmovq %xmm0, %rcx
261 ; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
262 ; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
263 ; AVX2-NEXT: .LBB1_2: # %else
264 ; AVX2-NEXT: testb $2, %al
265 ; AVX2-NEXT: je .LBB1_4
266 ; AVX2-NEXT: # %bb.3: # %cond.load1
267 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
268 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
269 ; AVX2-NEXT: .LBB1_4: # %else2
270 ; AVX2-NEXT: testb $4, %al
271 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
272 ; AVX2-NEXT: jne .LBB1_5
273 ; AVX2-NEXT: # %bb.6: # %else5
274 ; AVX2-NEXT: testb $8, %al
275 ; AVX2-NEXT: jne .LBB1_7
276 ; AVX2-NEXT: .LBB1_8: # %else8
277 ; AVX2-NEXT: vmovaps %xmm2, %xmm0
278 ; AVX2-NEXT: vzeroupper
280 ; AVX2-NEXT: .LBB1_5: # %cond.load4
281 ; AVX2-NEXT: vmovq %xmm0, %rcx
282 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
283 ; AVX2-NEXT: testb $8, %al
284 ; AVX2-NEXT: je .LBB1_8
285 ; AVX2-NEXT: .LBB1_7: # %cond.load7
286 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax
287 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
288 ; AVX2-NEXT: vmovaps %xmm2, %xmm0
289 ; AVX2-NEXT: vzeroupper
292 ; AVX512-LABEL: gather_v4f32_v4i32_v4i32:
294 ; AVX512-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
295 ; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
296 ; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
297 ; AVX512-NEXT: vptestnmd %zmm1, %zmm1, %k0
298 ; AVX512-NEXT: kshiftlw $12, %k0, %k0
299 ; AVX512-NEXT: kshiftrw $12, %k0, %k1
300 ; AVX512-NEXT: vgatherdps (%rdi,%zmm0,4), %zmm2 {%k1}
301 ; AVX512-NEXT: vmovaps %xmm2, %xmm0
302 ; AVX512-NEXT: vzeroupper
304 %vptr0 = insertelement <4 x float*> undef, float* %base, i32 0
305 %vptr1 = shufflevector <4 x float*> %vptr0, <4 x float*> undef, <4 x i32> zeroinitializer
306 %vptr2 = getelementptr float, <4 x float*> %vptr1, <4 x i32> %idx
308 %mask = icmp eq <4 x i32> %trigger, zeroinitializer
309 %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru)
313 define <4 x float> @gather_v4f32_v4i64_v4i32(float* %base, <4 x i64> %idx, <4 x i32> %trigger, <4 x float> %passthru) {
314 ; SSE-LABEL: gather_v4f32_v4i64_v4i32:
316 ; SSE-NEXT: movq %rdi, %xmm4
317 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
318 ; SSE-NEXT: psllq $2, %xmm0
319 ; SSE-NEXT: paddq %xmm4, %xmm0
320 ; SSE-NEXT: pxor %xmm5, %xmm5
321 ; SSE-NEXT: pcmpeqd %xmm2, %xmm5
322 ; SSE-NEXT: movmskps %xmm5, %eax
323 ; SSE-NEXT: testb $1, %al
324 ; SSE-NEXT: je .LBB2_2
325 ; SSE-NEXT: # %bb.1: # %cond.load
326 ; SSE-NEXT: movq %xmm0, %rcx
327 ; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
328 ; SSE-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7]
329 ; SSE-NEXT: .LBB2_2: # %else
330 ; SSE-NEXT: psllq $2, %xmm1
331 ; SSE-NEXT: testb $2, %al
332 ; SSE-NEXT: je .LBB2_4
333 ; SSE-NEXT: # %bb.3: # %cond.load1
334 ; SSE-NEXT: pextrq $1, %xmm0, %rcx
335 ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
336 ; SSE-NEXT: .LBB2_4: # %else2
337 ; SSE-NEXT: paddq %xmm1, %xmm4
338 ; SSE-NEXT: testb $4, %al
339 ; SSE-NEXT: jne .LBB2_5
340 ; SSE-NEXT: # %bb.6: # %else5
341 ; SSE-NEXT: testb $8, %al
342 ; SSE-NEXT: jne .LBB2_7
343 ; SSE-NEXT: .LBB2_8: # %else8
344 ; SSE-NEXT: movaps %xmm3, %xmm0
346 ; SSE-NEXT: .LBB2_5: # %cond.load4
347 ; SSE-NEXT: movq %xmm4, %rcx
348 ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
349 ; SSE-NEXT: testb $8, %al
350 ; SSE-NEXT: je .LBB2_8
351 ; SSE-NEXT: .LBB2_7: # %cond.load7
352 ; SSE-NEXT: pextrq $1, %xmm4, %rax
353 ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
354 ; SSE-NEXT: movaps %xmm3, %xmm0
357 ; AVX1-LABEL: gather_v4f32_v4i64_v4i32:
359 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
360 ; AVX1-NEXT: vpsllq $2, %xmm3, %xmm3
361 ; AVX1-NEXT: vmovq %rdi, %xmm4
362 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
363 ; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3
364 ; AVX1-NEXT: vpsllq $2, %xmm0, %xmm0
365 ; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0
366 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
367 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
368 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
369 ; AVX1-NEXT: vmovmskps %xmm1, %eax
370 ; AVX1-NEXT: testb $1, %al
371 ; AVX1-NEXT: je .LBB2_2
372 ; AVX1-NEXT: # %bb.1: # %cond.load
373 ; AVX1-NEXT: vmovq %xmm0, %rcx
374 ; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
375 ; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
376 ; AVX1-NEXT: .LBB2_2: # %else
377 ; AVX1-NEXT: testb $2, %al
378 ; AVX1-NEXT: je .LBB2_4
379 ; AVX1-NEXT: # %bb.3: # %cond.load1
380 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
381 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
382 ; AVX1-NEXT: .LBB2_4: # %else2
383 ; AVX1-NEXT: testb $4, %al
384 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
385 ; AVX1-NEXT: jne .LBB2_5
386 ; AVX1-NEXT: # %bb.6: # %else5
387 ; AVX1-NEXT: testb $8, %al
388 ; AVX1-NEXT: jne .LBB2_7
389 ; AVX1-NEXT: .LBB2_8: # %else8
390 ; AVX1-NEXT: vmovaps %xmm2, %xmm0
391 ; AVX1-NEXT: vzeroupper
393 ; AVX1-NEXT: .LBB2_5: # %cond.load4
394 ; AVX1-NEXT: vmovq %xmm0, %rcx
395 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
396 ; AVX1-NEXT: testb $8, %al
397 ; AVX1-NEXT: je .LBB2_8
398 ; AVX1-NEXT: .LBB2_7: # %cond.load7
399 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax
400 ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
401 ; AVX1-NEXT: vmovaps %xmm2, %xmm0
402 ; AVX1-NEXT: vzeroupper
405 ; AVX2-LABEL: gather_v4f32_v4i64_v4i32:
407 ; AVX2-NEXT: vmovq %rdi, %xmm3
408 ; AVX2-NEXT: vpbroadcastq %xmm3, %ymm3
409 ; AVX2-NEXT: vpsllq $2, %ymm0, %ymm0
410 ; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0
411 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
412 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
413 ; AVX2-NEXT: vmovmskps %xmm1, %eax
414 ; AVX2-NEXT: testb $1, %al
415 ; AVX2-NEXT: je .LBB2_2
416 ; AVX2-NEXT: # %bb.1: # %cond.load
417 ; AVX2-NEXT: vmovq %xmm0, %rcx
418 ; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
419 ; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
420 ; AVX2-NEXT: .LBB2_2: # %else
421 ; AVX2-NEXT: testb $2, %al
422 ; AVX2-NEXT: je .LBB2_4
423 ; AVX2-NEXT: # %bb.3: # %cond.load1
424 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
425 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
426 ; AVX2-NEXT: .LBB2_4: # %else2
427 ; AVX2-NEXT: testb $4, %al
428 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
429 ; AVX2-NEXT: jne .LBB2_5
430 ; AVX2-NEXT: # %bb.6: # %else5
431 ; AVX2-NEXT: testb $8, %al
432 ; AVX2-NEXT: jne .LBB2_7
433 ; AVX2-NEXT: .LBB2_8: # %else8
434 ; AVX2-NEXT: vmovaps %xmm2, %xmm0
435 ; AVX2-NEXT: vzeroupper
437 ; AVX2-NEXT: .LBB2_5: # %cond.load4
438 ; AVX2-NEXT: vmovq %xmm0, %rcx
439 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
440 ; AVX2-NEXT: testb $8, %al
441 ; AVX2-NEXT: je .LBB2_8
442 ; AVX2-NEXT: .LBB2_7: # %cond.load7
443 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax
444 ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
445 ; AVX2-NEXT: vmovaps %xmm2, %xmm0
446 ; AVX2-NEXT: vzeroupper
449 ; AVX512-LABEL: gather_v4f32_v4i64_v4i32:
451 ; AVX512-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2
452 ; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
453 ; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
454 ; AVX512-NEXT: vptestnmd %zmm1, %zmm1, %k0
455 ; AVX512-NEXT: kshiftlw $12, %k0, %k0
456 ; AVX512-NEXT: kshiftrw $12, %k0, %k1
457 ; AVX512-NEXT: vgatherqps (%rdi,%zmm0,4), %ymm2 {%k1}
458 ; AVX512-NEXT: vmovaps %xmm2, %xmm0
459 ; AVX512-NEXT: vzeroupper
461 %vptr0 = insertelement <4 x float*> undef, float* %base, i32 0
462 %vptr1 = shufflevector <4 x float*> %vptr0, <4 x float*> undef, <4 x i32> zeroinitializer
463 %vptr2 = getelementptr float, <4 x float*> %vptr1, <4 x i64> %idx
465 %mask = icmp eq <4 x i32> %trigger, zeroinitializer
466 %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru)
474 define <16 x i8> @gather_v16i8_v16i32_v16i8(i8* %base, <16 x i32> %idx, <16 x i8> %trigger, <16 x i8> %passthru) {
475 ; SSE-LABEL: gather_v16i8_v16i32_v16i8:
477 ; SSE-NEXT: movq %rdi, %xmm6
478 ; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,1,0,1]
479 ; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm0[2,3,0,1]
480 ; SSE-NEXT: pmovsxdq %xmm0, %xmm0
481 ; SSE-NEXT: paddq %xmm8, %xmm0
482 ; SSE-NEXT: pxor %xmm6, %xmm6
483 ; SSE-NEXT: pcmpeqb %xmm4, %xmm6
484 ; SSE-NEXT: pmovmskb %xmm6, %eax
485 ; SSE-NEXT: testb $1, %al
486 ; SSE-NEXT: je .LBB3_2
487 ; SSE-NEXT: # %bb.1: # %cond.load
488 ; SSE-NEXT: movq %xmm0, %rcx
489 ; SSE-NEXT: pinsrb $0, (%rcx), %xmm5
490 ; SSE-NEXT: .LBB3_2: # %else
491 ; SSE-NEXT: pmovsxdq %xmm7, %xmm4
492 ; SSE-NEXT: testb $2, %al
493 ; SSE-NEXT: je .LBB3_4
494 ; SSE-NEXT: # %bb.3: # %cond.load1
495 ; SSE-NEXT: pextrq $1, %xmm0, %rcx
496 ; SSE-NEXT: pinsrb $1, (%rcx), %xmm5
497 ; SSE-NEXT: .LBB3_4: # %else2
498 ; SSE-NEXT: paddq %xmm8, %xmm4
499 ; SSE-NEXT: testb $4, %al
500 ; SSE-NEXT: je .LBB3_6
501 ; SSE-NEXT: # %bb.5: # %cond.load4
502 ; SSE-NEXT: movq %xmm4, %rcx
503 ; SSE-NEXT: pinsrb $2, (%rcx), %xmm5
504 ; SSE-NEXT: .LBB3_6: # %else5
505 ; SSE-NEXT: pmovsxdq %xmm1, %xmm0
506 ; SSE-NEXT: testb $8, %al
507 ; SSE-NEXT: je .LBB3_8
508 ; SSE-NEXT: # %bb.7: # %cond.load7
509 ; SSE-NEXT: pextrq $1, %xmm4, %rcx
510 ; SSE-NEXT: pinsrb $3, (%rcx), %xmm5
511 ; SSE-NEXT: .LBB3_8: # %else8
512 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
513 ; SSE-NEXT: paddq %xmm8, %xmm0
514 ; SSE-NEXT: testb $16, %al
515 ; SSE-NEXT: je .LBB3_10
516 ; SSE-NEXT: # %bb.9: # %cond.load10
517 ; SSE-NEXT: movq %xmm0, %rcx
518 ; SSE-NEXT: pinsrb $4, (%rcx), %xmm5
519 ; SSE-NEXT: .LBB3_10: # %else11
520 ; SSE-NEXT: pmovsxdq %xmm1, %xmm1
521 ; SSE-NEXT: testb $32, %al
522 ; SSE-NEXT: je .LBB3_12
523 ; SSE-NEXT: # %bb.11: # %cond.load13
524 ; SSE-NEXT: pextrq $1, %xmm0, %rcx
525 ; SSE-NEXT: pinsrb $5, (%rcx), %xmm5
526 ; SSE-NEXT: .LBB3_12: # %else14
527 ; SSE-NEXT: paddq %xmm8, %xmm1
528 ; SSE-NEXT: testb $64, %al
529 ; SSE-NEXT: je .LBB3_14
530 ; SSE-NEXT: # %bb.13: # %cond.load16
531 ; SSE-NEXT: movq %xmm1, %rcx
532 ; SSE-NEXT: pinsrb $6, (%rcx), %xmm5
533 ; SSE-NEXT: .LBB3_14: # %else17
534 ; SSE-NEXT: pmovsxdq %xmm2, %xmm0
535 ; SSE-NEXT: testb $-128, %al
536 ; SSE-NEXT: je .LBB3_16
537 ; SSE-NEXT: # %bb.15: # %cond.load19
538 ; SSE-NEXT: pextrq $1, %xmm1, %rcx
539 ; SSE-NEXT: pinsrb $7, (%rcx), %xmm5
540 ; SSE-NEXT: .LBB3_16: # %else20
541 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
542 ; SSE-NEXT: paddq %xmm8, %xmm0
543 ; SSE-NEXT: testl $256, %eax # imm = 0x100
544 ; SSE-NEXT: je .LBB3_18
545 ; SSE-NEXT: # %bb.17: # %cond.load22
546 ; SSE-NEXT: movq %xmm0, %rcx
547 ; SSE-NEXT: pinsrb $8, (%rcx), %xmm5
548 ; SSE-NEXT: .LBB3_18: # %else23
549 ; SSE-NEXT: pmovsxdq %xmm1, %xmm1
550 ; SSE-NEXT: testl $512, %eax # imm = 0x200
551 ; SSE-NEXT: je .LBB3_20
552 ; SSE-NEXT: # %bb.19: # %cond.load25
553 ; SSE-NEXT: pextrq $1, %xmm0, %rcx
554 ; SSE-NEXT: pinsrb $9, (%rcx), %xmm5
555 ; SSE-NEXT: .LBB3_20: # %else26
556 ; SSE-NEXT: paddq %xmm8, %xmm1
557 ; SSE-NEXT: testl $1024, %eax # imm = 0x400
558 ; SSE-NEXT: je .LBB3_22
559 ; SSE-NEXT: # %bb.21: # %cond.load28
560 ; SSE-NEXT: movq %xmm1, %rcx
561 ; SSE-NEXT: pinsrb $10, (%rcx), %xmm5
562 ; SSE-NEXT: .LBB3_22: # %else29
563 ; SSE-NEXT: pmovsxdq %xmm3, %xmm0
564 ; SSE-NEXT: testl $2048, %eax # imm = 0x800
565 ; SSE-NEXT: je .LBB3_24
566 ; SSE-NEXT: # %bb.23: # %cond.load31
567 ; SSE-NEXT: pextrq $1, %xmm1, %rcx
568 ; SSE-NEXT: pinsrb $11, (%rcx), %xmm5
569 ; SSE-NEXT: .LBB3_24: # %else32
570 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
571 ; SSE-NEXT: paddq %xmm8, %xmm0
572 ; SSE-NEXT: testl $4096, %eax # imm = 0x1000
573 ; SSE-NEXT: je .LBB3_26
574 ; SSE-NEXT: # %bb.25: # %cond.load34
575 ; SSE-NEXT: movq %xmm0, %rcx
576 ; SSE-NEXT: pinsrb $12, (%rcx), %xmm5
577 ; SSE-NEXT: .LBB3_26: # %else35
578 ; SSE-NEXT: pmovsxdq %xmm1, %xmm1
579 ; SSE-NEXT: testl $8192, %eax # imm = 0x2000
580 ; SSE-NEXT: je .LBB3_28
581 ; SSE-NEXT: # %bb.27: # %cond.load37
582 ; SSE-NEXT: pextrq $1, %xmm0, %rcx
583 ; SSE-NEXT: pinsrb $13, (%rcx), %xmm5
584 ; SSE-NEXT: .LBB3_28: # %else38
585 ; SSE-NEXT: paddq %xmm1, %xmm8
586 ; SSE-NEXT: testl $16384, %eax # imm = 0x4000
587 ; SSE-NEXT: jne .LBB3_29
588 ; SSE-NEXT: # %bb.30: # %else41
589 ; SSE-NEXT: testl $32768, %eax # imm = 0x8000
590 ; SSE-NEXT: jne .LBB3_31
591 ; SSE-NEXT: .LBB3_32: # %else44
592 ; SSE-NEXT: movdqa %xmm5, %xmm0
594 ; SSE-NEXT: .LBB3_29: # %cond.load40
595 ; SSE-NEXT: movq %xmm8, %rcx
596 ; SSE-NEXT: pinsrb $14, (%rcx), %xmm5
597 ; SSE-NEXT: testl $32768, %eax # imm = 0x8000
598 ; SSE-NEXT: je .LBB3_32
599 ; SSE-NEXT: .LBB3_31: # %cond.load43
600 ; SSE-NEXT: pextrq $1, %xmm8, %rax
601 ; SSE-NEXT: pinsrb $15, (%rax), %xmm5
602 ; SSE-NEXT: movdqa %xmm5, %xmm0
605 ; AVX1-LABEL: gather_v16i8_v16i32_v16i8:
607 ; AVX1-NEXT: vmovq %rdi, %xmm4
608 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
609 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
610 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[2,3,0,1]
611 ; AVX1-NEXT: vpmovsxdq %xmm6, %xmm6
612 ; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm6
613 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
614 ; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0
615 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
616 ; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6
617 ; AVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm2
618 ; AVX1-NEXT: vpmovmskb %xmm2, %eax
619 ; AVX1-NEXT: testb $1, %al
620 ; AVX1-NEXT: je .LBB3_2
621 ; AVX1-NEXT: # %bb.1: # %cond.load
622 ; AVX1-NEXT: vmovq %xmm0, %rcx
623 ; AVX1-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3
624 ; AVX1-NEXT: .LBB3_2: # %else
625 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm5[2,3,0,1]
626 ; AVX1-NEXT: vpmovsxdq %xmm5, %xmm6
627 ; AVX1-NEXT: testb $2, %al
628 ; AVX1-NEXT: je .LBB3_4
629 ; AVX1-NEXT: # %bb.3: # %cond.load1
630 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
631 ; AVX1-NEXT: vpinsrb $1, (%rcx), %xmm3, %xmm3
632 ; AVX1-NEXT: .LBB3_4: # %else2
633 ; AVX1-NEXT: vpmovsxdq %xmm2, %xmm5
634 ; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm2
635 ; AVX1-NEXT: testb $4, %al
636 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
637 ; AVX1-NEXT: je .LBB3_6
638 ; AVX1-NEXT: # %bb.5: # %cond.load4
639 ; AVX1-NEXT: vmovq %xmm0, %rcx
640 ; AVX1-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3
641 ; AVX1-NEXT: .LBB3_6: # %else5
642 ; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm5
643 ; AVX1-NEXT: testb $8, %al
644 ; AVX1-NEXT: je .LBB3_8
645 ; AVX1-NEXT: # %bb.7: # %cond.load7
646 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
647 ; AVX1-NEXT: vpinsrb $3, (%rcx), %xmm3, %xmm3
648 ; AVX1-NEXT: .LBB3_8: # %else8
649 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm0
650 ; AVX1-NEXT: testb $16, %al
651 ; AVX1-NEXT: je .LBB3_10
652 ; AVX1-NEXT: # %bb.9: # %cond.load10
653 ; AVX1-NEXT: vmovq %xmm0, %rcx
654 ; AVX1-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3
655 ; AVX1-NEXT: .LBB3_10: # %else11
656 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
657 ; AVX1-NEXT: vpmovsxdq %xmm1, %xmm6
658 ; AVX1-NEXT: testb $32, %al
659 ; AVX1-NEXT: je .LBB3_12
660 ; AVX1-NEXT: # %bb.11: # %cond.load13
661 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
662 ; AVX1-NEXT: vpinsrb $5, (%rcx), %xmm3, %xmm3
663 ; AVX1-NEXT: .LBB3_12: # %else14
664 ; AVX1-NEXT: vpmovsxdq %xmm2, %xmm5
665 ; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm2
666 ; AVX1-NEXT: testb $64, %al
667 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
668 ; AVX1-NEXT: je .LBB3_14
669 ; AVX1-NEXT: # %bb.13: # %cond.load16
670 ; AVX1-NEXT: vmovq %xmm0, %rcx
671 ; AVX1-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3
672 ; AVX1-NEXT: .LBB3_14: # %else17
673 ; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm5
674 ; AVX1-NEXT: testb $-128, %al
675 ; AVX1-NEXT: je .LBB3_16
676 ; AVX1-NEXT: # %bb.15: # %cond.load19
677 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
678 ; AVX1-NEXT: vpinsrb $7, (%rcx), %xmm3, %xmm3
679 ; AVX1-NEXT: .LBB3_16: # %else20
680 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
681 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm0
682 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
683 ; AVX1-NEXT: je .LBB3_18
684 ; AVX1-NEXT: # %bb.17: # %cond.load22
685 ; AVX1-NEXT: vmovq %xmm0, %rcx
686 ; AVX1-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3
687 ; AVX1-NEXT: .LBB3_18: # %else23
688 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
689 ; AVX1-NEXT: vpmovsxdq %xmm1, %xmm1
690 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
691 ; AVX1-NEXT: je .LBB3_20
692 ; AVX1-NEXT: # %bb.19: # %cond.load25
693 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
694 ; AVX1-NEXT: vpinsrb $9, (%rcx), %xmm3, %xmm3
695 ; AVX1-NEXT: .LBB3_20: # %else26
696 ; AVX1-NEXT: vpmovsxdq %xmm2, %xmm2
697 ; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm1
698 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
699 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
700 ; AVX1-NEXT: je .LBB3_22
701 ; AVX1-NEXT: # %bb.21: # %cond.load28
702 ; AVX1-NEXT: vmovq %xmm0, %rcx
703 ; AVX1-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3
704 ; AVX1-NEXT: .LBB3_22: # %else29
705 ; AVX1-NEXT: vpaddq %xmm2, %xmm4, %xmm2
706 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
707 ; AVX1-NEXT: je .LBB3_24
708 ; AVX1-NEXT: # %bb.23: # %cond.load31
709 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
710 ; AVX1-NEXT: vpinsrb $11, (%rcx), %xmm3, %xmm3
711 ; AVX1-NEXT: .LBB3_24: # %else32
712 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm0
713 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
714 ; AVX1-NEXT: je .LBB3_26
715 ; AVX1-NEXT: # %bb.25: # %cond.load34
716 ; AVX1-NEXT: vmovq %xmm0, %rcx
717 ; AVX1-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3
718 ; AVX1-NEXT: .LBB3_26: # %else35
719 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
720 ; AVX1-NEXT: je .LBB3_28
721 ; AVX1-NEXT: # %bb.27: # %cond.load37
722 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
723 ; AVX1-NEXT: vpinsrb $13, (%rcx), %xmm3, %xmm3
724 ; AVX1-NEXT: .LBB3_28: # %else38
725 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
726 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
727 ; AVX1-NEXT: jne .LBB3_29
728 ; AVX1-NEXT: # %bb.30: # %else41
729 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
730 ; AVX1-NEXT: jne .LBB3_31
731 ; AVX1-NEXT: .LBB3_32: # %else44
732 ; AVX1-NEXT: vmovdqa %xmm3, %xmm0
733 ; AVX1-NEXT: vzeroupper
735 ; AVX1-NEXT: .LBB3_29: # %cond.load40
736 ; AVX1-NEXT: vmovq %xmm0, %rcx
737 ; AVX1-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3
738 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
739 ; AVX1-NEXT: je .LBB3_32
740 ; AVX1-NEXT: .LBB3_31: # %cond.load43
741 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax
742 ; AVX1-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3
743 ; AVX1-NEXT: vmovdqa %xmm3, %xmm0
744 ; AVX1-NEXT: vzeroupper
747 ; AVX2-LABEL: gather_v16i8_v16i32_v16i8:
749 ; AVX2-NEXT: vmovq %rdi, %xmm4
750 ; AVX2-NEXT: vpbroadcastq %xmm4, %ymm4
751 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm5
752 ; AVX2-NEXT: vpaddq %ymm5, %ymm4, %ymm5
753 ; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6
754 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm2
755 ; AVX2-NEXT: vpmovmskb %xmm2, %eax
756 ; AVX2-NEXT: testb $1, %al
757 ; AVX2-NEXT: je .LBB3_2
758 ; AVX2-NEXT: # %bb.1: # %cond.load
759 ; AVX2-NEXT: vmovq %xmm5, %rcx
760 ; AVX2-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3
761 ; AVX2-NEXT: .LBB3_2: # %else
762 ; AVX2-NEXT: testb $2, %al
763 ; AVX2-NEXT: je .LBB3_4
764 ; AVX2-NEXT: # %bb.3: # %cond.load1
765 ; AVX2-NEXT: vpextrq $1, %xmm5, %rcx
766 ; AVX2-NEXT: vpinsrb $1, (%rcx), %xmm3, %xmm3
767 ; AVX2-NEXT: .LBB3_4: # %else2
768 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
769 ; AVX2-NEXT: testb $4, %al
770 ; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm0
771 ; AVX2-NEXT: je .LBB3_6
772 ; AVX2-NEXT: # %bb.5: # %cond.load4
773 ; AVX2-NEXT: vmovq %xmm0, %rcx
774 ; AVX2-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3
775 ; AVX2-NEXT: .LBB3_6: # %else5
776 ; AVX2-NEXT: vpmovsxdq %xmm2, %ymm2
777 ; AVX2-NEXT: testb $8, %al
778 ; AVX2-NEXT: je .LBB3_8
779 ; AVX2-NEXT: # %bb.7: # %cond.load7
780 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
781 ; AVX2-NEXT: vpinsrb $3, (%rcx), %xmm3, %xmm3
782 ; AVX2-NEXT: .LBB3_8: # %else8
783 ; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm0
784 ; AVX2-NEXT: testb $16, %al
785 ; AVX2-NEXT: je .LBB3_10
786 ; AVX2-NEXT: # %bb.9: # %cond.load10
787 ; AVX2-NEXT: vmovq %xmm0, %rcx
788 ; AVX2-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3
789 ; AVX2-NEXT: .LBB3_10: # %else11
790 ; AVX2-NEXT: testb $32, %al
791 ; AVX2-NEXT: je .LBB3_12
792 ; AVX2-NEXT: # %bb.11: # %cond.load13
793 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
794 ; AVX2-NEXT: vpinsrb $5, (%rcx), %xmm3, %xmm3
795 ; AVX2-NEXT: .LBB3_12: # %else14
796 ; AVX2-NEXT: testb $64, %al
797 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
798 ; AVX2-NEXT: je .LBB3_14
799 ; AVX2-NEXT: # %bb.13: # %cond.load16
800 ; AVX2-NEXT: vmovq %xmm0, %rcx
801 ; AVX2-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3
802 ; AVX2-NEXT: .LBB3_14: # %else17
803 ; AVX2-NEXT: vpmovsxdq %xmm1, %ymm2
804 ; AVX2-NEXT: testb $-128, %al
805 ; AVX2-NEXT: je .LBB3_16
806 ; AVX2-NEXT: # %bb.15: # %cond.load19
807 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
808 ; AVX2-NEXT: vpinsrb $7, (%rcx), %xmm3, %xmm3
809 ; AVX2-NEXT: .LBB3_16: # %else20
810 ; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm0
811 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
812 ; AVX2-NEXT: je .LBB3_18
813 ; AVX2-NEXT: # %bb.17: # %cond.load22
814 ; AVX2-NEXT: vmovq %xmm0, %rcx
815 ; AVX2-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3
816 ; AVX2-NEXT: .LBB3_18: # %else23
817 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
818 ; AVX2-NEXT: je .LBB3_20
819 ; AVX2-NEXT: # %bb.19: # %cond.load25
820 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
821 ; AVX2-NEXT: vpinsrb $9, (%rcx), %xmm3, %xmm3
822 ; AVX2-NEXT: .LBB3_20: # %else26
823 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1
824 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
825 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
826 ; AVX2-NEXT: je .LBB3_22
827 ; AVX2-NEXT: # %bb.21: # %cond.load28
828 ; AVX2-NEXT: vmovq %xmm0, %rcx
829 ; AVX2-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3
830 ; AVX2-NEXT: .LBB3_22: # %else29
831 ; AVX2-NEXT: vpmovsxdq %xmm1, %ymm1
832 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
833 ; AVX2-NEXT: je .LBB3_24
834 ; AVX2-NEXT: # %bb.23: # %cond.load31
835 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
836 ; AVX2-NEXT: vpinsrb $11, (%rcx), %xmm3, %xmm3
837 ; AVX2-NEXT: .LBB3_24: # %else32
838 ; AVX2-NEXT: vpaddq %ymm1, %ymm4, %ymm0
839 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
840 ; AVX2-NEXT: je .LBB3_26
841 ; AVX2-NEXT: # %bb.25: # %cond.load34
842 ; AVX2-NEXT: vmovq %xmm0, %rcx
843 ; AVX2-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3
844 ; AVX2-NEXT: .LBB3_26: # %else35
845 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
846 ; AVX2-NEXT: je .LBB3_28
847 ; AVX2-NEXT: # %bb.27: # %cond.load37
848 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
849 ; AVX2-NEXT: vpinsrb $13, (%rcx), %xmm3, %xmm3
850 ; AVX2-NEXT: .LBB3_28: # %else38
851 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
852 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
853 ; AVX2-NEXT: jne .LBB3_29
854 ; AVX2-NEXT: # %bb.30: # %else41
855 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
856 ; AVX2-NEXT: jne .LBB3_31
857 ; AVX2-NEXT: .LBB3_32: # %else44
858 ; AVX2-NEXT: vmovdqa %xmm3, %xmm0
859 ; AVX2-NEXT: vzeroupper
861 ; AVX2-NEXT: .LBB3_29: # %cond.load40
862 ; AVX2-NEXT: vmovq %xmm0, %rcx
863 ; AVX2-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3
864 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
865 ; AVX2-NEXT: je .LBB3_32
866 ; AVX2-NEXT: .LBB3_31: # %cond.load43
867 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax
868 ; AVX2-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3
869 ; AVX2-NEXT: vmovdqa %xmm3, %xmm0
870 ; AVX2-NEXT: vzeroupper
873 ; AVX512-LABEL: gather_v16i8_v16i32_v16i8:
875 ; AVX512-NEXT: vpbroadcastq %rdi, %zmm3
876 ; AVX512-NEXT: vpmovsxdq %ymm0, %zmm4
877 ; AVX512-NEXT: vpaddq %zmm4, %zmm3, %zmm4
878 ; AVX512-NEXT: vpxor %xmm5, %xmm5, %xmm5
879 ; AVX512-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm1
880 ; AVX512-NEXT: vpmovmskb %xmm1, %eax
881 ; AVX512-NEXT: testb $1, %al
882 ; AVX512-NEXT: jne .LBB3_1
883 ; AVX512-NEXT: # %bb.2: # %else
884 ; AVX512-NEXT: testb $2, %al
885 ; AVX512-NEXT: jne .LBB3_3
886 ; AVX512-NEXT: .LBB3_4: # %else2
887 ; AVX512-NEXT: testb $4, %al
888 ; AVX512-NEXT: jne .LBB3_5
889 ; AVX512-NEXT: .LBB3_6: # %else5
890 ; AVX512-NEXT: testb $8, %al
891 ; AVX512-NEXT: je .LBB3_8
892 ; AVX512-NEXT: .LBB3_7: # %cond.load7
893 ; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm1
894 ; AVX512-NEXT: vpextrq $1, %xmm1, %rcx
895 ; AVX512-NEXT: vpinsrb $3, (%rcx), %xmm2, %xmm2
896 ; AVX512-NEXT: .LBB3_8: # %else8
897 ; AVX512-NEXT: testb $16, %al
898 ; AVX512-NEXT: vextracti32x4 $2, %zmm4, %xmm1
899 ; AVX512-NEXT: je .LBB3_10
900 ; AVX512-NEXT: # %bb.9: # %cond.load10
901 ; AVX512-NEXT: vmovq %xmm1, %rcx
902 ; AVX512-NEXT: vpinsrb $4, (%rcx), %xmm2, %xmm2
903 ; AVX512-NEXT: .LBB3_10: # %else11
904 ; AVX512-NEXT: testb $32, %al
905 ; AVX512-NEXT: je .LBB3_12
906 ; AVX512-NEXT: # %bb.11: # %cond.load13
907 ; AVX512-NEXT: vpextrq $1, %xmm1, %rcx
908 ; AVX512-NEXT: vpinsrb $5, (%rcx), %xmm2, %xmm2
909 ; AVX512-NEXT: .LBB3_12: # %else14
910 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
911 ; AVX512-NEXT: testb $64, %al
912 ; AVX512-NEXT: vextracti32x4 $3, %zmm4, %xmm0
913 ; AVX512-NEXT: je .LBB3_14
914 ; AVX512-NEXT: # %bb.13: # %cond.load16
915 ; AVX512-NEXT: vmovq %xmm0, %rcx
916 ; AVX512-NEXT: vpinsrb $6, (%rcx), %xmm2, %xmm2
917 ; AVX512-NEXT: .LBB3_14: # %else17
918 ; AVX512-NEXT: vpmovsxdq %ymm1, %zmm1
919 ; AVX512-NEXT: testb $-128, %al
920 ; AVX512-NEXT: je .LBB3_16
921 ; AVX512-NEXT: # %bb.15: # %cond.load19
922 ; AVX512-NEXT: vpextrq $1, %xmm0, %rcx
923 ; AVX512-NEXT: vpinsrb $7, (%rcx), %xmm2, %xmm2
924 ; AVX512-NEXT: .LBB3_16: # %else20
925 ; AVX512-NEXT: vpaddq %zmm1, %zmm3, %zmm0
926 ; AVX512-NEXT: testl $256, %eax # imm = 0x100
927 ; AVX512-NEXT: jne .LBB3_17
928 ; AVX512-NEXT: # %bb.18: # %else23
929 ; AVX512-NEXT: testl $512, %eax # imm = 0x200
930 ; AVX512-NEXT: jne .LBB3_19
931 ; AVX512-NEXT: .LBB3_20: # %else26
932 ; AVX512-NEXT: testl $1024, %eax # imm = 0x400
933 ; AVX512-NEXT: jne .LBB3_21
934 ; AVX512-NEXT: .LBB3_22: # %else29
935 ; AVX512-NEXT: testl $2048, %eax # imm = 0x800
936 ; AVX512-NEXT: je .LBB3_24
937 ; AVX512-NEXT: .LBB3_23: # %cond.load31
938 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
939 ; AVX512-NEXT: vpextrq $1, %xmm1, %rcx
940 ; AVX512-NEXT: vpinsrb $11, (%rcx), %xmm2, %xmm2
941 ; AVX512-NEXT: .LBB3_24: # %else32
942 ; AVX512-NEXT: testl $4096, %eax # imm = 0x1000
943 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm1
944 ; AVX512-NEXT: je .LBB3_26
945 ; AVX512-NEXT: # %bb.25: # %cond.load34
946 ; AVX512-NEXT: vmovq %xmm1, %rcx
947 ; AVX512-NEXT: vpinsrb $12, (%rcx), %xmm2, %xmm2
948 ; AVX512-NEXT: .LBB3_26: # %else35
949 ; AVX512-NEXT: testl $8192, %eax # imm = 0x2000
950 ; AVX512-NEXT: je .LBB3_28
951 ; AVX512-NEXT: # %bb.27: # %cond.load37
952 ; AVX512-NEXT: vpextrq $1, %xmm1, %rcx
953 ; AVX512-NEXT: vpinsrb $13, (%rcx), %xmm2, %xmm2
954 ; AVX512-NEXT: .LBB3_28: # %else38
955 ; AVX512-NEXT: testl $16384, %eax # imm = 0x4000
956 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm0
957 ; AVX512-NEXT: jne .LBB3_29
958 ; AVX512-NEXT: # %bb.30: # %else41
959 ; AVX512-NEXT: testl $32768, %eax # imm = 0x8000
960 ; AVX512-NEXT: jne .LBB3_31
961 ; AVX512-NEXT: .LBB3_32: # %else44
962 ; AVX512-NEXT: vmovdqa %xmm2, %xmm0
963 ; AVX512-NEXT: vzeroupper
965 ; AVX512-NEXT: .LBB3_1: # %cond.load
966 ; AVX512-NEXT: vmovq %xmm4, %rcx
967 ; AVX512-NEXT: vpinsrb $0, (%rcx), %xmm2, %xmm2
968 ; AVX512-NEXT: testb $2, %al
969 ; AVX512-NEXT: je .LBB3_4
970 ; AVX512-NEXT: .LBB3_3: # %cond.load1
971 ; AVX512-NEXT: vpextrq $1, %xmm4, %rcx
972 ; AVX512-NEXT: vpinsrb $1, (%rcx), %xmm2, %xmm2
973 ; AVX512-NEXT: testb $4, %al
974 ; AVX512-NEXT: je .LBB3_6
975 ; AVX512-NEXT: .LBB3_5: # %cond.load4
976 ; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm1
977 ; AVX512-NEXT: vmovq %xmm1, %rcx
978 ; AVX512-NEXT: vpinsrb $2, (%rcx), %xmm2, %xmm2
979 ; AVX512-NEXT: testb $8, %al
980 ; AVX512-NEXT: jne .LBB3_7
981 ; AVX512-NEXT: jmp .LBB3_8
982 ; AVX512-NEXT: .LBB3_17: # %cond.load22
983 ; AVX512-NEXT: vmovq %xmm0, %rcx
984 ; AVX512-NEXT: vpinsrb $8, (%rcx), %xmm2, %xmm2
985 ; AVX512-NEXT: testl $512, %eax # imm = 0x200
986 ; AVX512-NEXT: je .LBB3_20
987 ; AVX512-NEXT: .LBB3_19: # %cond.load25
988 ; AVX512-NEXT: vpextrq $1, %xmm0, %rcx
989 ; AVX512-NEXT: vpinsrb $9, (%rcx), %xmm2, %xmm2
990 ; AVX512-NEXT: testl $1024, %eax # imm = 0x400
991 ; AVX512-NEXT: je .LBB3_22
992 ; AVX512-NEXT: .LBB3_21: # %cond.load28
993 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
994 ; AVX512-NEXT: vmovq %xmm1, %rcx
995 ; AVX512-NEXT: vpinsrb $10, (%rcx), %xmm2, %xmm2
996 ; AVX512-NEXT: testl $2048, %eax # imm = 0x800
997 ; AVX512-NEXT: jne .LBB3_23
998 ; AVX512-NEXT: jmp .LBB3_24
999 ; AVX512-NEXT: .LBB3_29: # %cond.load40
1000 ; AVX512-NEXT: vmovq %xmm0, %rcx
1001 ; AVX512-NEXT: vpinsrb $14, (%rcx), %xmm2, %xmm2
1002 ; AVX512-NEXT: testl $32768, %eax # imm = 0x8000
1003 ; AVX512-NEXT: je .LBB3_32
1004 ; AVX512-NEXT: .LBB3_31: # %cond.load43
1005 ; AVX512-NEXT: vpextrq $1, %xmm0, %rax
1006 ; AVX512-NEXT: vpinsrb $15, (%rax), %xmm2, %xmm2
1007 ; AVX512-NEXT: vmovdqa %xmm2, %xmm0
1008 ; AVX512-NEXT: vzeroupper
1010 %vptr0 = insertelement <16 x i8*> undef, i8* %base, i32 0
1011 %vptr1 = shufflevector <16 x i8*> %vptr0, <16 x i8*> undef, <16 x i32> zeroinitializer
1012 %vptr2 = getelementptr i8, <16 x i8*> %vptr1, <16 x i32> %idx
1014 %mask = icmp eq <16 x i8> %trigger, zeroinitializer
1015 %res = call <16 x i8> @llvm.masked.gather.v16i8.v16p0i8(<16 x i8*> %vptr2, i32 4, <16 x i1> %mask, <16 x i8> %passthru)
1019 declare <2 x double> @llvm.masked.gather.v2f64.v2p0f64(<2 x double*>, i32, <2 x i1>, <2 x double>)
1020 declare <4 x double> @llvm.masked.gather.v4f64.v4p0f64(<4 x double*>, i32, <4 x i1>, <4 x double>)
1022 declare <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*>, i32, <4 x i1>, <4 x float>)
1023 declare <8 x float> @llvm.masked.gather.v8f32.v8p0f32(<8 x float*>, i32, <8 x i1>, <8 x float>)
1025 declare <16 x i8> @llvm.masked.gather.v16i8.v16p0i8(<16 x i8*>, i32, <16 x i1>, <16 x i8>)