xref: /llvm-project/llvm/test/CodeGen/X86/masked_gather.ll (revision 2f005df066e07d93e3d6aa04748c158f883197b7)
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
7
8;
9; vXf32
10;
11
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
15
16define <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
57;
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
97;
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
137;
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
177;
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
188}
189
190define <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
236;
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
286;
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
331;
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
376;
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
386
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
390}
391
392define <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
435;
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
483;
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
527;
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
571;
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
582
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
586}
587
588;
589; vXi8
590;
591
592define <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
722;
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
864;
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
990;
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
1131
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
1135}
1136
1137define <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
1328;
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
1541;
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
1743;
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
1759;
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
1779}
1780
1781declare <2 x double> @llvm.masked.gather.v2f64.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x double>)
1782declare <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x double>)
1783
1784declare <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x float>)
1785declare <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x float>)
1786
1787declare <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i8>)
1788
1789declare <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i32>)
1790