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