[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / avx2-masked-gather.ll
blob2007b7cf76eba79229714aeae7ebc403aedef19f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mcpu=skylake -mtriple=i386-unknown-linux-gnu -mattr=+avx2 | FileCheck --check-prefix=X86 %s
3 ; RUN: llc < %s -mcpu=skylake -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 | FileCheck --check-prefix=X64 %s
4 ; RUN: llc < %s -mcpu=skx -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2,-avx512f | FileCheck --check-prefix=X64 %s
5 ; RUN: llc < %s -mcpu=skylake -mtriple=x86_64-unknown-linux-gnu -mattr=-avx2 | FileCheck --check-prefix=NOGATHER %s
7 declare <2 x i32> @llvm.masked.gather.v2i32(<2 x i32*> %ptrs, i32 %align, <2 x i1> %masks, <2 x i32> %passthro)
9 define <2 x i32> @masked_gather_v2i32(<2 x i32*>* %ptr, <2 x i1> %masks, <2 x i32> %passthro) {
10 ; X86-LABEL: masked_gather_v2i32:
11 ; X86:       # BB#0: # %entry
12 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
13 ; X86-NEXT:    vpxor %xmm2, %xmm2, %xmm2
14 ; X86-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
15 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
16 ; X86-NEXT:    vpmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
17 ; X86-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
18 ; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
19 ; X86-NEXT:    vpgatherqd %xmm0, (,%xmm2), %xmm1
20 ; X86-NEXT:    vpmovsxdq %xmm1, %xmm0
21 ; X86-NEXT:    retl
23 ; X64-LABEL: masked_gather_v2i32:
24 ; X64:       # BB#0: # %entry
25 ; X64-NEXT:    vpsllq $63, %xmm0, %xmm0
26 ; X64-NEXT:    vpxor %xmm2, %xmm2, %xmm2
27 ; X64-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
28 ; X64-NEXT:    vmovdqa (%rdi), %xmm2
29 ; X64-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
30 ; X64-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
31 ; X64-NEXT:    vpgatherqd %xmm0, (,%xmm2), %xmm1
32 ; X64-NEXT:    vpmovsxdq %xmm1, %xmm0
33 ; X64-NEXT:    retq
35 ; NOGATHER-LABEL: masked_gather_v2i32:
36 ; NOGATHER:       # BB#0: # %entry
37 ; NOGATHER-NEXT:    vmovdqa (%rdi), %xmm3
38 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
39 ; NOGATHER-NEXT:    # implicit-def: %xmm2
40 ; NOGATHER-NEXT:    testb $1, %al
41 ; NOGATHER-NEXT:    je .LBB0_2
42 ; NOGATHER-NEXT:  # BB#1: # %cond.load
43 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
44 ; NOGATHER-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
45 ; NOGATHER-NEXT:  .LBB0_2: # %else
46 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
47 ; NOGATHER-NEXT:    testb $1, %al
48 ; NOGATHER-NEXT:    je .LBB0_4
49 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
50 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
51 ; NOGATHER-NEXT:    movl (%rax), %eax
52 ; NOGATHER-NEXT:    vpinsrq $1, %rax, %xmm2, %xmm2
53 ; NOGATHER-NEXT:  .LBB0_4: # %else2
54 ; NOGATHER-NEXT:    vpsllq $63, %xmm0, %xmm0
55 ; NOGATHER-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
56 ; NOGATHER-NEXT:    retq
57 entry:
58   %ld  = load <2 x i32*>, <2 x i32*>* %ptr
59   %res = call <2 x i32> @llvm.masked.gather.v2i32(<2 x i32*> %ld, i32 0, <2 x i1> %masks, <2 x i32> %passthro)
60   ret <2 x i32> %res
63 define <4 x i32> @masked_gather_v2i32_concat(<2 x i32*>* %ptr, <2 x i1> %masks, <2 x i32> %passthro) {
64 ; X86-LABEL: masked_gather_v2i32_concat:
65 ; X86:       # BB#0: # %entry
66 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
67 ; X86-NEXT:    vpxor %xmm2, %xmm2, %xmm2
68 ; X86-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
69 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
70 ; X86-NEXT:    vpmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
71 ; X86-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
72 ; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
73 ; X86-NEXT:    vpgatherqd %xmm0, (,%xmm2), %xmm1
74 ; X86-NEXT:    vpmovsxdq %xmm1, %xmm0
75 ; X86-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
76 ; X86-NEXT:    retl
78 ; X64-LABEL: masked_gather_v2i32_concat:
79 ; X64:       # BB#0: # %entry
80 ; X64-NEXT:    vpsllq $63, %xmm0, %xmm0
81 ; X64-NEXT:    vpxor %xmm2, %xmm2, %xmm2
82 ; X64-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
83 ; X64-NEXT:    vmovdqa (%rdi), %xmm2
84 ; X64-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
85 ; X64-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
86 ; X64-NEXT:    vpgatherqd %xmm0, (,%xmm2), %xmm1
87 ; X64-NEXT:    vpmovsxdq %xmm1, %xmm0
88 ; X64-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
89 ; X64-NEXT:    retq
91 ; NOGATHER-LABEL: masked_gather_v2i32_concat:
92 ; NOGATHER:       # BB#0: # %entry
93 ; NOGATHER-NEXT:    vmovdqa (%rdi), %xmm3
94 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
95 ; NOGATHER-NEXT:    # implicit-def: %xmm2
96 ; NOGATHER-NEXT:    testb $1, %al
97 ; NOGATHER-NEXT:    je .LBB1_2
98 ; NOGATHER-NEXT:  # BB#1: # %cond.load
99 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
100 ; NOGATHER-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
101 ; NOGATHER-NEXT:  .LBB1_2: # %else
102 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
103 ; NOGATHER-NEXT:    testb $1, %al
104 ; NOGATHER-NEXT:    je .LBB1_4
105 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
106 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
107 ; NOGATHER-NEXT:    movl (%rax), %eax
108 ; NOGATHER-NEXT:    vpinsrq $1, %rax, %xmm2, %xmm2
109 ; NOGATHER-NEXT:  .LBB1_4: # %else2
110 ; NOGATHER-NEXT:    vpsllq $63, %xmm0, %xmm0
111 ; NOGATHER-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
112 ; NOGATHER-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
113 ; NOGATHER-NEXT:    retq
114 entry:
115   %ld  = load <2 x i32*>, <2 x i32*>* %ptr
116   %res = call <2 x i32> @llvm.masked.gather.v2i32(<2 x i32*> %ld, i32 0, <2 x i1> %masks, <2 x i32> %passthro)
117   %res2 = shufflevector <2 x i32> %res, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
118   ret <4 x i32> %res2
121 declare <2 x float> @llvm.masked.gather.v2float(<2 x float*> %ptrs, i32 %align, <2 x i1> %masks, <2 x float> %passthro)
123 define <2 x float> @masked_gather_v2float(<2 x float*>* %ptr, <2 x i1> %masks, <2 x float> %passthro) {
124 ; X86-LABEL: masked_gather_v2float:
125 ; X86:       # BB#0: # %entry
126 ; X86-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
127 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
128 ; X86-NEXT:    vpsrad $31, %xmm0, %xmm0
129 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
130 ; X86-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero
131 ; X86-NEXT:    vgatherdps %xmm0, (,%xmm2), %xmm1
132 ; X86-NEXT:    vmovaps %xmm1, %xmm0
133 ; X86-NEXT:    retl
135 ; X64-LABEL: masked_gather_v2float:
136 ; X64:       # BB#0: # %entry
137 ; X64-NEXT:    vmovaps (%rdi), %xmm2
138 ; X64-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
139 ; X64-NEXT:    vpslld $31, %xmm0, %xmm0
140 ; X64-NEXT:    vpsrad $31, %xmm0, %xmm0
141 ; X64-NEXT:    vgatherqps %xmm0, (,%xmm2), %xmm1
142 ; X64-NEXT:    vmovaps %xmm1, %xmm0
143 ; X64-NEXT:    retq
145 ; NOGATHER-LABEL: masked_gather_v2float:
146 ; NOGATHER:       # BB#0: # %entry
147 ; NOGATHER-NEXT:    vmovdqa (%rdi), %xmm3
148 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
149 ; NOGATHER-NEXT:    # implicit-def: %xmm2
150 ; NOGATHER-NEXT:    testb $1, %al
151 ; NOGATHER-NEXT:    je .LBB2_2
152 ; NOGATHER-NEXT:  # BB#1: # %cond.load
153 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
154 ; NOGATHER-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
155 ; NOGATHER-NEXT:  .LBB2_2: # %else
156 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
157 ; NOGATHER-NEXT:    testb $1, %al
158 ; NOGATHER-NEXT:    je .LBB2_4
159 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
160 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
161 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
162 ; NOGATHER-NEXT:  .LBB2_4: # %else2
163 ; NOGATHER-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
164 ; NOGATHER-NEXT:    vpslld $31, %xmm0, %xmm0
165 ; NOGATHER-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
166 ; NOGATHER-NEXT:    retq
167 entry:
168   %ld  = load <2 x float*>, <2 x float*>* %ptr
169   %res = call <2 x float> @llvm.masked.gather.v2float(<2 x float*> %ld, i32 0, <2 x i1> %masks, <2 x float> %passthro)
170   ret <2 x float> %res
173 define <4 x float> @masked_gather_v2float_concat(<2 x float*>* %ptr, <2 x i1> %masks, <2 x float> %passthro) {
174 ; X86-LABEL: masked_gather_v2float_concat:
175 ; X86:       # BB#0: # %entry
176 ; X86-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
177 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
178 ; X86-NEXT:    vpsrad $31, %xmm0, %xmm0
179 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
180 ; X86-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero
181 ; X86-NEXT:    vgatherdps %xmm0, (,%xmm2), %xmm1
182 ; X86-NEXT:    vmovaps %xmm1, %xmm0
183 ; X86-NEXT:    retl
185 ; X64-LABEL: masked_gather_v2float_concat:
186 ; X64:       # BB#0: # %entry
187 ; X64-NEXT:    vmovaps (%rdi), %xmm2
188 ; X64-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
189 ; X64-NEXT:    vpslld $31, %xmm0, %xmm0
190 ; X64-NEXT:    vpsrad $31, %xmm0, %xmm0
191 ; X64-NEXT:    vgatherqps %xmm0, (,%xmm2), %xmm1
192 ; X64-NEXT:    vmovaps %xmm1, %xmm0
193 ; X64-NEXT:    retq
195 ; NOGATHER-LABEL: masked_gather_v2float_concat:
196 ; NOGATHER:       # BB#0: # %entry
197 ; NOGATHER-NEXT:    vmovdqa (%rdi), %xmm3
198 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
199 ; NOGATHER-NEXT:    # implicit-def: %xmm2
200 ; NOGATHER-NEXT:    testb $1, %al
201 ; NOGATHER-NEXT:    je .LBB3_2
202 ; NOGATHER-NEXT:  # BB#1: # %cond.load
203 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
204 ; NOGATHER-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
205 ; NOGATHER-NEXT:  .LBB3_2: # %else
206 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
207 ; NOGATHER-NEXT:    testb $1, %al
208 ; NOGATHER-NEXT:    je .LBB3_4
209 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
210 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
211 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
212 ; NOGATHER-NEXT:  .LBB3_4: # %else2
213 ; NOGATHER-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
214 ; NOGATHER-NEXT:    vpslld $31, %xmm0, %xmm0
215 ; NOGATHER-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
216 ; NOGATHER-NEXT:    retq
217 entry:
218   %ld  = load <2 x float*>, <2 x float*>* %ptr
219   %res = call <2 x float> @llvm.masked.gather.v2float(<2 x float*> %ld, i32 0, <2 x i1> %masks, <2 x float> %passthro)
220   %res2 = shufflevector <2 x float> %res, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
221   ret <4 x float> %res2
225 declare <4 x i32> @llvm.masked.gather.v4i32(<4 x i32*> %ptrs, i32 %align, <4 x i1> %masks, <4 x i32> %passthro)
227 define <4 x i32> @masked_gather_v4i32(<4 x i32*> %ptrs, <4 x i1> %masks, <4 x i32> %passthro) {
228 ; X86-LABEL: masked_gather_v4i32:
229 ; X86:       # BB#0: # %entry
230 ; X86-NEXT:    vpslld $31, %xmm1, %xmm1
231 ; X86-NEXT:    vpsrad $31, %xmm1, %xmm1
232 ; X86-NEXT:    vpgatherdd %xmm1, (,%xmm0), %xmm2
233 ; X86-NEXT:    vmovdqa %xmm2, %xmm0
234 ; X86-NEXT:    retl
236 ; X64-LABEL: masked_gather_v4i32:
237 ; X64:       # BB#0: # %entry
238 ; X64-NEXT:    vpslld $31, %xmm1, %xmm1
239 ; X64-NEXT:    vpsrad $31, %xmm1, %xmm1
240 ; X64-NEXT:    vpgatherqd %xmm1, (,%ymm0), %xmm2
241 ; X64-NEXT:    vmovdqa %xmm2, %xmm0
242 ; X64-NEXT:    vzeroupper
243 ; X64-NEXT:    retq
245 ; NOGATHER-LABEL: masked_gather_v4i32:
246 ; NOGATHER:       # BB#0: # %entry
247 ; NOGATHER-NEXT:    vpextrb $0, %xmm1, %eax
248 ; NOGATHER-NEXT:    # implicit-def: %xmm3
249 ; NOGATHER-NEXT:    testb $1, %al
250 ; NOGATHER-NEXT:    je .LBB4_2
251 ; NOGATHER-NEXT:  # BB#1: # %cond.load
252 ; NOGATHER-NEXT:    vmovq %xmm0, %rax
253 ; NOGATHER-NEXT:    vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero
254 ; NOGATHER-NEXT:  .LBB4_2: # %else
255 ; NOGATHER-NEXT:    vpextrb $4, %xmm1, %eax
256 ; NOGATHER-NEXT:    testb $1, %al
257 ; NOGATHER-NEXT:    je .LBB4_4
258 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
259 ; NOGATHER-NEXT:    vpextrq $1, %xmm0, %rax
260 ; NOGATHER-NEXT:    vpinsrd $1, (%rax), %xmm3, %xmm3
261 ; NOGATHER-NEXT:  .LBB4_4: # %else2
262 ; NOGATHER-NEXT:    vpextrb $8, %xmm1, %eax
263 ; NOGATHER-NEXT:    testb $1, %al
264 ; NOGATHER-NEXT:    je .LBB4_6
265 ; NOGATHER-NEXT:  # BB#5: # %cond.load4
266 ; NOGATHER-NEXT:    vextractf128 $1, %ymm0, %xmm4
267 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
268 ; NOGATHER-NEXT:    vpinsrd $2, (%rax), %xmm3, %xmm3
269 ; NOGATHER-NEXT:  .LBB4_6: # %else5
270 ; NOGATHER-NEXT:    vpextrb $12, %xmm1, %eax
271 ; NOGATHER-NEXT:    testb $1, %al
272 ; NOGATHER-NEXT:    je .LBB4_8
273 ; NOGATHER-NEXT:  # BB#7: # %cond.load7
274 ; NOGATHER-NEXT:    vextractf128 $1, %ymm0, %xmm0
275 ; NOGATHER-NEXT:    vpextrq $1, %xmm0, %rax
276 ; NOGATHER-NEXT:    vpinsrd $3, (%rax), %xmm3, %xmm3
277 ; NOGATHER-NEXT:  .LBB4_8: # %else8
278 ; NOGATHER-NEXT:    vpslld $31, %xmm1, %xmm0
279 ; NOGATHER-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
280 ; NOGATHER-NEXT:    vzeroupper
281 ; NOGATHER-NEXT:    retq
282 entry:
283   %res = call <4 x i32> @llvm.masked.gather.v4i32(<4 x i32*> %ptrs, i32 0, <4 x i1> %masks, <4 x i32> %passthro)
284   ret <4 x i32> %res
287 declare <4 x float> @llvm.masked.gather.v4float(<4 x float*> %ptrs, i32 %align, <4 x i1> %masks, <4 x float> %passthro)
289 define <4 x float> @masked_gather_v4float(<4 x float*> %ptrs, <4 x i1> %masks, <4 x float> %passthro) {
290 ; X86-LABEL: masked_gather_v4float:
291 ; X86:       # BB#0: # %entry
292 ; X86-NEXT:    vpslld $31, %xmm1, %xmm1
293 ; X86-NEXT:    vpsrad $31, %xmm1, %xmm1
294 ; X86-NEXT:    vgatherdps %xmm1, (,%xmm0), %xmm2
295 ; X86-NEXT:    vmovaps %xmm2, %xmm0
296 ; X86-NEXT:    retl
298 ; X64-LABEL: masked_gather_v4float:
299 ; X64:       # BB#0: # %entry
300 ; X64-NEXT:    vpslld $31, %xmm1, %xmm1
301 ; X64-NEXT:    vpsrad $31, %xmm1, %xmm1
302 ; X64-NEXT:    vgatherqps %xmm1, (,%ymm0), %xmm2
303 ; X64-NEXT:    vmovaps %xmm2, %xmm0
304 ; X64-NEXT:    vzeroupper
305 ; X64-NEXT:    retq
307 ; NOGATHER-LABEL: masked_gather_v4float:
308 ; NOGATHER:       # BB#0: # %entry
309 ; NOGATHER-NEXT:    vpextrb $0, %xmm1, %eax
310 ; NOGATHER-NEXT:    # implicit-def: %xmm3
311 ; NOGATHER-NEXT:    testb $1, %al
312 ; NOGATHER-NEXT:    je .LBB5_2
313 ; NOGATHER-NEXT:  # BB#1: # %cond.load
314 ; NOGATHER-NEXT:    vmovq %xmm0, %rax
315 ; NOGATHER-NEXT:    vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero
316 ; NOGATHER-NEXT:  .LBB5_2: # %else
317 ; NOGATHER-NEXT:    vpextrb $4, %xmm1, %eax
318 ; NOGATHER-NEXT:    testb $1, %al
319 ; NOGATHER-NEXT:    je .LBB5_4
320 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
321 ; NOGATHER-NEXT:    vpextrq $1, %xmm0, %rax
322 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
323 ; NOGATHER-NEXT:  .LBB5_4: # %else2
324 ; NOGATHER-NEXT:    vpextrb $8, %xmm1, %eax
325 ; NOGATHER-NEXT:    testb $1, %al
326 ; NOGATHER-NEXT:    je .LBB5_6
327 ; NOGATHER-NEXT:  # BB#5: # %cond.load4
328 ; NOGATHER-NEXT:    vextractf128 $1, %ymm0, %xmm4
329 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
330 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
331 ; NOGATHER-NEXT:  .LBB5_6: # %else5
332 ; NOGATHER-NEXT:    vpextrb $12, %xmm1, %eax
333 ; NOGATHER-NEXT:    testb $1, %al
334 ; NOGATHER-NEXT:    je .LBB5_8
335 ; NOGATHER-NEXT:  # BB#7: # %cond.load7
336 ; NOGATHER-NEXT:    vextractf128 $1, %ymm0, %xmm0
337 ; NOGATHER-NEXT:    vpextrq $1, %xmm0, %rax
338 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
339 ; NOGATHER-NEXT:  .LBB5_8: # %else8
340 ; NOGATHER-NEXT:    vpslld $31, %xmm1, %xmm0
341 ; NOGATHER-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
342 ; NOGATHER-NEXT:    vzeroupper
343 ; NOGATHER-NEXT:    retq
344 entry:
345   %res = call <4 x float> @llvm.masked.gather.v4float(<4 x float*> %ptrs, i32 0, <4 x i1> %masks, <4 x float> %passthro)
346   ret <4 x float> %res
349 declare <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %ptrs, i32 %align, <8 x i1> %masks, <8 x i32> %passthro)
351 define <8 x i32> @masked_gather_v8i32(<8 x i32*>* %ptr, <8 x i1> %masks, <8 x i32> %passthro) {
352 ; X86-LABEL: masked_gather_v8i32:
353 ; X86:       # BB#0: # %entry
354 ; X86-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
355 ; X86-NEXT:    vpslld $31, %ymm0, %ymm0
356 ; X86-NEXT:    vpsrad $31, %ymm0, %ymm0
357 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
358 ; X86-NEXT:    vmovdqa (%eax), %ymm2
359 ; X86-NEXT:    vpgatherdd %ymm0, (,%ymm2), %ymm1
360 ; X86-NEXT:    vmovdqa %ymm1, %ymm0
361 ; X86-NEXT:    retl
363 ; X64-LABEL: masked_gather_v8i32:
364 ; X64:       # BB#0: # %entry
365 ; X64-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
366 ; X64-NEXT:    vpslld $31, %ymm0, %ymm0
367 ; X64-NEXT:    vpsrad $31, %ymm0, %ymm0
368 ; X64-NEXT:    vmovdqa (%rdi), %ymm2
369 ; X64-NEXT:    vmovdqa 32(%rdi), %ymm3
370 ; X64-NEXT:    vextracti128 $1, %ymm1, %xmm4
371 ; X64-NEXT:    vextracti128 $1, %ymm0, %xmm5
372 ; X64-NEXT:    vpgatherqd %xmm5, (,%ymm3), %xmm4
373 ; X64-NEXT:    vpgatherqd %xmm0, (,%ymm2), %xmm1
374 ; X64-NEXT:    vinserti128 $1, %xmm4, %ymm1, %ymm0
375 ; X64-NEXT:    retq
377 ; NOGATHER-LABEL: masked_gather_v8i32:
378 ; NOGATHER:       # BB#0: # %entry
379 ; NOGATHER-NEXT:    vmovdqa (%rdi), %ymm4
380 ; NOGATHER-NEXT:    vmovdqa 32(%rdi), %ymm3
381 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
382 ; NOGATHER-NEXT:    # implicit-def: %ymm2
383 ; NOGATHER-NEXT:    testb $1, %al
384 ; NOGATHER-NEXT:    je .LBB6_2
385 ; NOGATHER-NEXT:  # BB#1: # %cond.load
386 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
387 ; NOGATHER-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
388 ; NOGATHER-NEXT:  .LBB6_2: # %else
389 ; NOGATHER-NEXT:    vpextrb $2, %xmm0, %eax
390 ; NOGATHER-NEXT:    testb $1, %al
391 ; NOGATHER-NEXT:    je .LBB6_4
392 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
393 ; NOGATHER-NEXT:    vpextrq $1, %xmm4, %rax
394 ; NOGATHER-NEXT:    vpinsrd $1, (%rax), %xmm2, %xmm5
395 ; NOGATHER-NEXT:    vblendps {{.*#+}} ymm2 = ymm5[0,1,2,3],ymm2[4,5,6,7]
396 ; NOGATHER-NEXT:  .LBB6_4: # %else2
397 ; NOGATHER-NEXT:    vpextrb $4, %xmm0, %eax
398 ; NOGATHER-NEXT:    testb $1, %al
399 ; NOGATHER-NEXT:    je .LBB6_6
400 ; NOGATHER-NEXT:  # BB#5: # %cond.load4
401 ; NOGATHER-NEXT:    vextractf128 $1, %ymm4, %xmm5
402 ; NOGATHER-NEXT:    vmovq %xmm5, %rax
403 ; NOGATHER-NEXT:    vpinsrd $2, (%rax), %xmm2, %xmm5
404 ; NOGATHER-NEXT:    vblendps {{.*#+}} ymm2 = ymm5[0,1,2,3],ymm2[4,5,6,7]
405 ; NOGATHER-NEXT:  .LBB6_6: # %else5
406 ; NOGATHER-NEXT:    vpextrb $6, %xmm0, %eax
407 ; NOGATHER-NEXT:    testb $1, %al
408 ; NOGATHER-NEXT:    je .LBB6_8
409 ; NOGATHER-NEXT:  # BB#7: # %cond.load7
410 ; NOGATHER-NEXT:    vextractf128 $1, %ymm4, %xmm4
411 ; NOGATHER-NEXT:    vpextrq $1, %xmm4, %rax
412 ; NOGATHER-NEXT:    vpinsrd $3, (%rax), %xmm2, %xmm4
413 ; NOGATHER-NEXT:    vblendps {{.*#+}} ymm2 = ymm4[0,1,2,3],ymm2[4,5,6,7]
414 ; NOGATHER-NEXT:  .LBB6_8: # %else8
415 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
416 ; NOGATHER-NEXT:    testb $1, %al
417 ; NOGATHER-NEXT:    je .LBB6_10
418 ; NOGATHER-NEXT:  # BB#9: # %cond.load10
419 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
420 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm4
421 ; NOGATHER-NEXT:    vpinsrd $0, (%rax), %xmm4, %xmm4
422 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
423 ; NOGATHER-NEXT:  .LBB6_10: # %else11
424 ; NOGATHER-NEXT:    vpextrb $10, %xmm0, %eax
425 ; NOGATHER-NEXT:    testb $1, %al
426 ; NOGATHER-NEXT:    je .LBB6_12
427 ; NOGATHER-NEXT:  # BB#11: # %cond.load13
428 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
429 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm4
430 ; NOGATHER-NEXT:    vpinsrd $1, (%rax), %xmm4, %xmm4
431 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
432 ; NOGATHER-NEXT:  .LBB6_12: # %else14
433 ; NOGATHER-NEXT:    vpextrb $12, %xmm0, %eax
434 ; NOGATHER-NEXT:    testb $1, %al
435 ; NOGATHER-NEXT:    je .LBB6_14
436 ; NOGATHER-NEXT:  # BB#13: # %cond.load16
437 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm4
438 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
439 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm4
440 ; NOGATHER-NEXT:    vpinsrd $2, (%rax), %xmm4, %xmm4
441 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
442 ; NOGATHER-NEXT:  .LBB6_14: # %else17
443 ; NOGATHER-NEXT:    vpextrb $14, %xmm0, %eax
444 ; NOGATHER-NEXT:    testb $1, %al
445 ; NOGATHER-NEXT:    je .LBB6_16
446 ; NOGATHER-NEXT:  # BB#15: # %cond.load19
447 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm3
448 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
449 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm3
450 ; NOGATHER-NEXT:    vpinsrd $3, (%rax), %xmm3, %xmm3
451 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
452 ; NOGATHER-NEXT:  .LBB6_16: # %else20
453 ; NOGATHER-NEXT:    vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
454 ; NOGATHER-NEXT:    vpslld $31, %xmm3, %xmm3
455 ; NOGATHER-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
456 ; NOGATHER-NEXT:    vpslld $31, %xmm0, %xmm0
457 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
458 ; NOGATHER-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
459 ; NOGATHER-NEXT:    retq
460 entry:
461   %ld  = load <8 x i32*>, <8 x i32*>* %ptr
462   %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %ld, i32 0, <8 x i1> %masks, <8 x i32> %passthro)
463   ret <8 x i32> %res
466 declare <8 x float> @llvm.masked.gather.v8float(<8 x float*> %ptrs, i32 %align, <8 x i1> %masks, <8 x float> %passthro)
468 define <8 x float> @masked_gather_v8float(<8 x float*>* %ptr, <8 x i1> %masks, <8 x float> %passthro) {
469 ; X86-LABEL: masked_gather_v8float:
470 ; X86:       # BB#0: # %entry
471 ; X86-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
472 ; X86-NEXT:    vpslld $31, %ymm0, %ymm0
473 ; X86-NEXT:    vpsrad $31, %ymm0, %ymm0
474 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
475 ; X86-NEXT:    vmovaps (%eax), %ymm2
476 ; X86-NEXT:    vgatherdps %ymm0, (,%ymm2), %ymm1
477 ; X86-NEXT:    vmovaps %ymm1, %ymm0
478 ; X86-NEXT:    retl
480 ; X64-LABEL: masked_gather_v8float:
481 ; X64:       # BB#0: # %entry
482 ; X64-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
483 ; X64-NEXT:    vpslld $31, %ymm0, %ymm0
484 ; X64-NEXT:    vpsrad $31, %ymm0, %ymm0
485 ; X64-NEXT:    vmovaps (%rdi), %ymm2
486 ; X64-NEXT:    vmovaps 32(%rdi), %ymm3
487 ; X64-NEXT:    vextractf128 $1, %ymm1, %xmm4
488 ; X64-NEXT:    vextracti128 $1, %ymm0, %xmm5
489 ; X64-NEXT:    vgatherqps %xmm5, (,%ymm3), %xmm4
490 ; X64-NEXT:    vgatherqps %xmm0, (,%ymm2), %xmm1
491 ; X64-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm0
492 ; X64-NEXT:    retq
494 ; NOGATHER-LABEL: masked_gather_v8float:
495 ; NOGATHER:       # BB#0: # %entry
496 ; NOGATHER-NEXT:    vmovdqa (%rdi), %ymm4
497 ; NOGATHER-NEXT:    vmovdqa 32(%rdi), %ymm3
498 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
499 ; NOGATHER-NEXT:    # implicit-def: %ymm2
500 ; NOGATHER-NEXT:    testb $1, %al
501 ; NOGATHER-NEXT:    je .LBB7_2
502 ; NOGATHER-NEXT:  # BB#1: # %cond.load
503 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
504 ; NOGATHER-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
505 ; NOGATHER-NEXT:  .LBB7_2: # %else
506 ; NOGATHER-NEXT:    vpextrb $2, %xmm0, %eax
507 ; NOGATHER-NEXT:    testb $1, %al
508 ; NOGATHER-NEXT:    je .LBB7_4
509 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
510 ; NOGATHER-NEXT:    vpextrq $1, %xmm4, %rax
511 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm5 = xmm2[0],mem[0],xmm2[2,3]
512 ; NOGATHER-NEXT:    vblendps {{.*#+}} ymm2 = ymm5[0,1,2,3],ymm2[4,5,6,7]
513 ; NOGATHER-NEXT:  .LBB7_4: # %else2
514 ; NOGATHER-NEXT:    vpextrb $4, %xmm0, %eax
515 ; NOGATHER-NEXT:    testb $1, %al
516 ; NOGATHER-NEXT:    je .LBB7_6
517 ; NOGATHER-NEXT:  # BB#5: # %cond.load4
518 ; NOGATHER-NEXT:    vextractf128 $1, %ymm4, %xmm5
519 ; NOGATHER-NEXT:    vmovq %xmm5, %rax
520 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm5 = xmm2[0,1],mem[0],xmm2[3]
521 ; NOGATHER-NEXT:    vblendps {{.*#+}} ymm2 = ymm5[0,1,2,3],ymm2[4,5,6,7]
522 ; NOGATHER-NEXT:  .LBB7_6: # %else5
523 ; NOGATHER-NEXT:    vpextrb $6, %xmm0, %eax
524 ; NOGATHER-NEXT:    testb $1, %al
525 ; NOGATHER-NEXT:    je .LBB7_8
526 ; NOGATHER-NEXT:  # BB#7: # %cond.load7
527 ; NOGATHER-NEXT:    vextractf128 $1, %ymm4, %xmm4
528 ; NOGATHER-NEXT:    vpextrq $1, %xmm4, %rax
529 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm4 = xmm2[0,1,2],mem[0]
530 ; NOGATHER-NEXT:    vblendps {{.*#+}} ymm2 = ymm4[0,1,2,3],ymm2[4,5,6,7]
531 ; NOGATHER-NEXT:  .LBB7_8: # %else8
532 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
533 ; NOGATHER-NEXT:    testb $1, %al
534 ; NOGATHER-NEXT:    je .LBB7_10
535 ; NOGATHER-NEXT:  # BB#9: # %cond.load10
536 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
537 ; NOGATHER-NEXT:    vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero
538 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm5
539 ; NOGATHER-NEXT:    vblendps {{.*#+}} xmm4 = xmm4[0],xmm5[1,2,3]
540 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
541 ; NOGATHER-NEXT:  .LBB7_10: # %else11
542 ; NOGATHER-NEXT:    vpextrb $10, %xmm0, %eax
543 ; NOGATHER-NEXT:    testb $1, %al
544 ; NOGATHER-NEXT:    je .LBB7_12
545 ; NOGATHER-NEXT:  # BB#11: # %cond.load13
546 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
547 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm4
548 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm4 = xmm4[0],mem[0],xmm4[2,3]
549 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
550 ; NOGATHER-NEXT:  .LBB7_12: # %else14
551 ; NOGATHER-NEXT:    vpextrb $12, %xmm0, %eax
552 ; NOGATHER-NEXT:    testb $1, %al
553 ; NOGATHER-NEXT:    je .LBB7_14
554 ; NOGATHER-NEXT:  # BB#13: # %cond.load16
555 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm4
556 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
557 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm4
558 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm4 = xmm4[0,1],mem[0],xmm4[3]
559 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
560 ; NOGATHER-NEXT:  .LBB7_14: # %else17
561 ; NOGATHER-NEXT:    vpextrb $14, %xmm0, %eax
562 ; NOGATHER-NEXT:    testb $1, %al
563 ; NOGATHER-NEXT:    je .LBB7_16
564 ; NOGATHER-NEXT:  # BB#15: # %cond.load19
565 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm3
566 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
567 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm3
568 ; NOGATHER-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
569 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
570 ; NOGATHER-NEXT:  .LBB7_16: # %else20
571 ; NOGATHER-NEXT:    vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
572 ; NOGATHER-NEXT:    vpslld $31, %xmm3, %xmm3
573 ; NOGATHER-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
574 ; NOGATHER-NEXT:    vpslld $31, %xmm0, %xmm0
575 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
576 ; NOGATHER-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
577 ; NOGATHER-NEXT:    retq
578 entry:
579   %ld  = load <8 x float*>, <8 x float*>* %ptr
580   %res = call <8 x float> @llvm.masked.gather.v8float(<8 x float*> %ld, i32 0, <8 x i1> %masks, <8 x float> %passthro)
581   ret <8 x float> %res
584 declare <4 x i64> @llvm.masked.gather.v4i64(<4 x i64*> %ptrs, i32 %align, <4 x i1> %masks, <4 x i64> %passthro)
586 define <4 x i64> @masked_gather_v4i64(<4 x i64*>* %ptr, <4 x i1> %masks, <4 x i64> %passthro) {
587 ; X86-LABEL: masked_gather_v4i64:
588 ; X86:       # BB#0: # %entry
589 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
590 ; X86-NEXT:    vpsrad $31, %xmm0, %xmm0
591 ; X86-NEXT:    vpmovsxdq %xmm0, %ymm0
592 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
593 ; X86-NEXT:    vmovdqa (%eax), %xmm2
594 ; X86-NEXT:    vpgatherdq %ymm0, (,%xmm2), %ymm1
595 ; X86-NEXT:    vmovdqa %ymm1, %ymm0
596 ; X86-NEXT:    retl
598 ; X64-LABEL: masked_gather_v4i64:
599 ; X64:       # BB#0: # %entry
600 ; X64-NEXT:    vpslld $31, %xmm0, %xmm0
601 ; X64-NEXT:    vpsrad $31, %xmm0, %xmm0
602 ; X64-NEXT:    vpmovsxdq %xmm0, %ymm0
603 ; X64-NEXT:    vmovdqa (%rdi), %ymm2
604 ; X64-NEXT:    vpgatherqq %ymm0, (,%ymm2), %ymm1
605 ; X64-NEXT:    vmovdqa %ymm1, %ymm0
606 ; X64-NEXT:    retq
608 ; NOGATHER-LABEL: masked_gather_v4i64:
609 ; NOGATHER:       # BB#0: # %entry
610 ; NOGATHER-NEXT:    vmovdqa (%rdi), %ymm3
611 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
612 ; NOGATHER-NEXT:    # implicit-def: %ymm2
613 ; NOGATHER-NEXT:    testb $1, %al
614 ; NOGATHER-NEXT:    je .LBB8_2
615 ; NOGATHER-NEXT:  # BB#1: # %cond.load
616 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
617 ; NOGATHER-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
618 ; NOGATHER-NEXT:  .LBB8_2: # %else
619 ; NOGATHER-NEXT:    vpextrb $4, %xmm0, %eax
620 ; NOGATHER-NEXT:    testb $1, %al
621 ; NOGATHER-NEXT:    je .LBB8_4
622 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
623 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
624 ; NOGATHER-NEXT:    vpinsrq $1, (%rax), %xmm2, %xmm4
625 ; NOGATHER-NEXT:    vblendps {{.*#+}} ymm2 = ymm4[0,1,2,3],ymm2[4,5,6,7]
626 ; NOGATHER-NEXT:  .LBB8_4: # %else2
627 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
628 ; NOGATHER-NEXT:    testb $1, %al
629 ; NOGATHER-NEXT:    je .LBB8_6
630 ; NOGATHER-NEXT:  # BB#5: # %cond.load4
631 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm4
632 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
633 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm4
634 ; NOGATHER-NEXT:    vpinsrq $0, (%rax), %xmm4, %xmm4
635 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
636 ; NOGATHER-NEXT:  .LBB8_6: # %else5
637 ; NOGATHER-NEXT:    vpextrb $12, %xmm0, %eax
638 ; NOGATHER-NEXT:    testb $1, %al
639 ; NOGATHER-NEXT:    je .LBB8_8
640 ; NOGATHER-NEXT:  # BB#7: # %cond.load7
641 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm3
642 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
643 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm3
644 ; NOGATHER-NEXT:    vpinsrq $1, (%rax), %xmm3, %xmm3
645 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
646 ; NOGATHER-NEXT:  .LBB8_8: # %else8
647 ; NOGATHER-NEXT:    vpslld $31, %xmm0, %xmm0
648 ; NOGATHER-NEXT:    vpsrad $31, %xmm0, %xmm0
649 ; NOGATHER-NEXT:    vpmovsxdq %xmm0, %xmm3
650 ; NOGATHER-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
651 ; NOGATHER-NEXT:    vpmovsxdq %xmm0, %xmm0
652 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
653 ; NOGATHER-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
654 ; NOGATHER-NEXT:    retq
655 entry:
656   %ld  = load <4 x i64*>, <4 x i64*>* %ptr
657   %res = call <4 x i64> @llvm.masked.gather.v4i64(<4 x i64*> %ld, i32 0, <4 x i1> %masks, <4 x i64> %passthro)
658   ret <4 x i64> %res
661 declare <4 x double> @llvm.masked.gather.v4double(<4 x double*> %ptrs, i32 %align, <4 x i1> %masks, <4 x double> %passthro)
663 define <4 x double> @masked_gather_v4double(<4 x double*>* %ptr, <4 x i1> %masks, <4 x double> %passthro) {
664 ; X86-LABEL: masked_gather_v4double:
665 ; X86:       # BB#0: # %entry
666 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
667 ; X86-NEXT:    vpsrad $31, %xmm0, %xmm0
668 ; X86-NEXT:    vpmovsxdq %xmm0, %ymm0
669 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
670 ; X86-NEXT:    vmovapd (%eax), %xmm2
671 ; X86-NEXT:    vgatherdpd %ymm0, (,%xmm2), %ymm1
672 ; X86-NEXT:    vmovapd %ymm1, %ymm0
673 ; X86-NEXT:    retl
675 ; X64-LABEL: masked_gather_v4double:
676 ; X64:       # BB#0: # %entry
677 ; X64-NEXT:    vpslld $31, %xmm0, %xmm0
678 ; X64-NEXT:    vpsrad $31, %xmm0, %xmm0
679 ; X64-NEXT:    vpmovsxdq %xmm0, %ymm0
680 ; X64-NEXT:    vmovapd (%rdi), %ymm2
681 ; X64-NEXT:    vgatherqpd %ymm0, (,%ymm2), %ymm1
682 ; X64-NEXT:    vmovapd %ymm1, %ymm0
683 ; X64-NEXT:    retq
685 ; NOGATHER-LABEL: masked_gather_v4double:
686 ; NOGATHER:       # BB#0: # %entry
687 ; NOGATHER-NEXT:    vmovdqa (%rdi), %ymm3
688 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
689 ; NOGATHER-NEXT:    # implicit-def: %ymm2
690 ; NOGATHER-NEXT:    testb $1, %al
691 ; NOGATHER-NEXT:    je .LBB9_2
692 ; NOGATHER-NEXT:  # BB#1: # %cond.load
693 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
694 ; NOGATHER-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero
695 ; NOGATHER-NEXT:  .LBB9_2: # %else
696 ; NOGATHER-NEXT:    vpextrb $4, %xmm0, %eax
697 ; NOGATHER-NEXT:    testb $1, %al
698 ; NOGATHER-NEXT:    je .LBB9_4
699 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
700 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
701 ; NOGATHER-NEXT:    vmovhpd {{.*#+}} xmm4 = xmm2[0],mem[0]
702 ; NOGATHER-NEXT:    vblendpd {{.*#+}} ymm2 = ymm4[0,1],ymm2[2,3]
703 ; NOGATHER-NEXT:  .LBB9_4: # %else2
704 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
705 ; NOGATHER-NEXT:    testb $1, %al
706 ; NOGATHER-NEXT:    je .LBB9_6
707 ; NOGATHER-NEXT:  # BB#5: # %cond.load4
708 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm4
709 ; NOGATHER-NEXT:    vmovq %xmm4, %rax
710 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm4
711 ; NOGATHER-NEXT:    vmovlpd {{.*#+}} xmm4 = mem[0],xmm4[1]
712 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
713 ; NOGATHER-NEXT:  .LBB9_6: # %else5
714 ; NOGATHER-NEXT:    vpextrb $12, %xmm0, %eax
715 ; NOGATHER-NEXT:    testb $1, %al
716 ; NOGATHER-NEXT:    je .LBB9_8
717 ; NOGATHER-NEXT:  # BB#7: # %cond.load7
718 ; NOGATHER-NEXT:    vextractf128 $1, %ymm3, %xmm3
719 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
720 ; NOGATHER-NEXT:    vextractf128 $1, %ymm2, %xmm3
721 ; NOGATHER-NEXT:    vmovhpd {{.*#+}} xmm3 = xmm3[0],mem[0]
722 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
723 ; NOGATHER-NEXT:  .LBB9_8: # %else8
724 ; NOGATHER-NEXT:    vpslld $31, %xmm0, %xmm0
725 ; NOGATHER-NEXT:    vpsrad $31, %xmm0, %xmm0
726 ; NOGATHER-NEXT:    vpmovsxdq %xmm0, %xmm3
727 ; NOGATHER-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
728 ; NOGATHER-NEXT:    vpmovsxdq %xmm0, %xmm0
729 ; NOGATHER-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
730 ; NOGATHER-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
731 ; NOGATHER-NEXT:    retq
732 entry:
733   %ld  = load <4 x double*>, <4 x double*>* %ptr
734   %res = call <4 x double> @llvm.masked.gather.v4double(<4 x double*> %ld, i32 0, <4 x i1> %masks, <4 x double> %passthro)
735   ret <4 x double> %res
738 declare <2 x i64> @llvm.masked.gather.v2i64(<2 x i64*> %ptrs, i32 %align, <2 x i1> %masks, <2 x i64> %passthro)
740 define <2 x i64> @masked_gather_v2i64(<2 x i64*>* %ptr, <2 x i1> %masks, <2 x i64> %passthro) {
741 ; X86-LABEL: masked_gather_v2i64:
742 ; X86:       # BB#0: # %entry
743 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
744 ; X86-NEXT:    vpxor %xmm2, %xmm2, %xmm2
745 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
746 ; X86-NEXT:    vpmovzxdq {{.*#+}} xmm3 = mem[0],zero,mem[1],zero
747 ; X86-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
748 ; X86-NEXT:    vpgatherqq %xmm0, (,%xmm3), %xmm1
749 ; X86-NEXT:    vmovdqa %xmm1, %xmm0
750 ; X86-NEXT:    retl
752 ; X64-LABEL: masked_gather_v2i64:
753 ; X64:       # BB#0: # %entry
754 ; X64-NEXT:    vpsllq $63, %xmm0, %xmm0
755 ; X64-NEXT:    vpxor %xmm2, %xmm2, %xmm2
756 ; X64-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
757 ; X64-NEXT:    vmovdqa (%rdi), %xmm2
758 ; X64-NEXT:    vpgatherqq %xmm0, (,%xmm2), %xmm1
759 ; X64-NEXT:    vmovdqa %xmm1, %xmm0
760 ; X64-NEXT:    retq
762 ; NOGATHER-LABEL: masked_gather_v2i64:
763 ; NOGATHER:       # BB#0: # %entry
764 ; NOGATHER-NEXT:    vmovdqa (%rdi), %xmm3
765 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
766 ; NOGATHER-NEXT:    # implicit-def: %xmm2
767 ; NOGATHER-NEXT:    testb $1, %al
768 ; NOGATHER-NEXT:    je .LBB10_2
769 ; NOGATHER-NEXT:  # BB#1: # %cond.load
770 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
771 ; NOGATHER-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
772 ; NOGATHER-NEXT:  .LBB10_2: # %else
773 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
774 ; NOGATHER-NEXT:    testb $1, %al
775 ; NOGATHER-NEXT:    je .LBB10_4
776 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
777 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
778 ; NOGATHER-NEXT:    vpinsrq $1, (%rax), %xmm2, %xmm2
779 ; NOGATHER-NEXT:  .LBB10_4: # %else2
780 ; NOGATHER-NEXT:    vpsllq $63, %xmm0, %xmm0
781 ; NOGATHER-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
782 ; NOGATHER-NEXT:    retq
783 entry:
784   %ld  = load <2 x i64*>, <2 x i64*>* %ptr
785   %res = call <2 x i64> @llvm.masked.gather.v2i64(<2 x i64*> %ld, i32 0, <2 x i1> %masks, <2 x i64> %passthro)
786   ret <2 x i64> %res
789 declare <2 x double> @llvm.masked.gather.v2double(<2 x double*> %ptrs, i32 %align, <2 x i1> %masks, <2 x double> %passthro)
791 define <2 x double> @masked_gather_v2double(<2 x double*>* %ptr, <2 x i1> %masks, <2 x double> %passthro) {
792 ; X86-LABEL: masked_gather_v2double:
793 ; X86:       # BB#0: # %entry
794 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
795 ; X86-NEXT:    vpxor %xmm2, %xmm2, %xmm2
796 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
797 ; X86-NEXT:    vpmovzxdq {{.*#+}} xmm3 = mem[0],zero,mem[1],zero
798 ; X86-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
799 ; X86-NEXT:    vgatherqpd %xmm0, (,%xmm3), %xmm1
800 ; X86-NEXT:    vmovapd %xmm1, %xmm0
801 ; X86-NEXT:    retl
803 ; X64-LABEL: masked_gather_v2double:
804 ; X64:       # BB#0: # %entry
805 ; X64-NEXT:    vpsllq $63, %xmm0, %xmm0
806 ; X64-NEXT:    vpxor %xmm2, %xmm2, %xmm2
807 ; X64-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
808 ; X64-NEXT:    vmovapd (%rdi), %xmm2
809 ; X64-NEXT:    vgatherqpd %xmm0, (,%xmm2), %xmm1
810 ; X64-NEXT:    vmovapd %xmm1, %xmm0
811 ; X64-NEXT:    retq
813 ; NOGATHER-LABEL: masked_gather_v2double:
814 ; NOGATHER:       # BB#0: # %entry
815 ; NOGATHER-NEXT:    vmovdqa (%rdi), %xmm3
816 ; NOGATHER-NEXT:    vpextrb $0, %xmm0, %eax
817 ; NOGATHER-NEXT:    # implicit-def: %xmm2
818 ; NOGATHER-NEXT:    testb $1, %al
819 ; NOGATHER-NEXT:    je .LBB11_2
820 ; NOGATHER-NEXT:  # BB#1: # %cond.load
821 ; NOGATHER-NEXT:    vmovq %xmm3, %rax
822 ; NOGATHER-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero
823 ; NOGATHER-NEXT:  .LBB11_2: # %else
824 ; NOGATHER-NEXT:    vpextrb $8, %xmm0, %eax
825 ; NOGATHER-NEXT:    testb $1, %al
826 ; NOGATHER-NEXT:    je .LBB11_4
827 ; NOGATHER-NEXT:  # BB#3: # %cond.load1
828 ; NOGATHER-NEXT:    vpextrq $1, %xmm3, %rax
829 ; NOGATHER-NEXT:    vmovhpd {{.*#+}} xmm2 = xmm2[0],mem[0]
830 ; NOGATHER-NEXT:  .LBB11_4: # %else2
831 ; NOGATHER-NEXT:    vpsllq $63, %xmm0, %xmm0
832 ; NOGATHER-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
833 ; NOGATHER-NEXT:    retq
834 entry:
835   %ld  = load <2 x double*>, <2 x double*>* %ptr
836   %res = call <2 x double> @llvm.masked.gather.v2double(<2 x double*> %ld, i32 0, <2 x i1> %masks, <2 x double> %passthro)
837   ret <2 x double> %res