1790 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.2 < %s | FileCheck %s --check-prefix=SSE3; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefix=AVX14; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefix=AVX25; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f < %s | FileCheck %s --check-prefixes=AVX512,AVX512F6; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=AVX512,AVX512VL7 8;9; vXf3210;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 415 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, %xmm420; SSE-NEXT: pcmpeqd %xmm2, %xmm421; SSE-NEXT: movmskps %xmm4, %eax22; SSE-NEXT: testb $1, %al23; SSE-NEXT: jne .LBB0_124; SSE-NEXT: # %bb.2: # %else25; SSE-NEXT: testb $2, %al26; SSE-NEXT: jne .LBB0_327; SSE-NEXT: .LBB0_4: # %else228; SSE-NEXT: testb $4, %al29; SSE-NEXT: jne .LBB0_530; SSE-NEXT: .LBB0_6: # %else531; SSE-NEXT: testb $8, %al32; SSE-NEXT: jne .LBB0_733; SSE-NEXT: .LBB0_8: # %else834; SSE-NEXT: movaps %xmm3, %xmm035; SSE-NEXT: retq36; SSE-NEXT: .LBB0_1: # %cond.load37; SSE-NEXT: movq %xmm0, %rcx38; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero39; SSE-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7]40; SSE-NEXT: testb $2, %al41; SSE-NEXT: je .LBB0_442; SSE-NEXT: .LBB0_3: # %cond.load143; SSE-NEXT: pextrq $1, %xmm0, %rcx44; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]45; SSE-NEXT: testb $4, %al46; SSE-NEXT: je .LBB0_647; SSE-NEXT: .LBB0_5: # %cond.load448; SSE-NEXT: movq %xmm1, %rcx49; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]50; SSE-NEXT: testb $8, %al51; SSE-NEXT: je .LBB0_852; SSE-NEXT: .LBB0_7: # %cond.load753; SSE-NEXT: pextrq $1, %xmm1, %rax54; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]55; SSE-NEXT: movaps %xmm3, %xmm056; SSE-NEXT: retq57;58; AVX1-LABEL: gather_v4f32_ptr_v4i32:59; AVX1: # %bb.0:60; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm361; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm162; AVX1-NEXT: vmovmskps %xmm1, %eax63; AVX1-NEXT: testb $1, %al64; AVX1-NEXT: je .LBB0_265; AVX1-NEXT: # %bb.1: # %cond.load66; AVX1-NEXT: vmovq %xmm0, %rcx67; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero68; AVX1-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]69; AVX1-NEXT: .LBB0_2: # %else70; AVX1-NEXT: testb $2, %al71; AVX1-NEXT: je .LBB0_472; AVX1-NEXT: # %bb.3: # %cond.load173; AVX1-NEXT: vpextrq $1, %xmm0, %rcx74; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]75; AVX1-NEXT: .LBB0_4: # %else276; AVX1-NEXT: testb $4, %al77; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm078; AVX1-NEXT: jne .LBB0_579; AVX1-NEXT: # %bb.6: # %else580; AVX1-NEXT: testb $8, %al81; AVX1-NEXT: jne .LBB0_782; AVX1-NEXT: .LBB0_8: # %else883; AVX1-NEXT: vmovaps %xmm2, %xmm084; AVX1-NEXT: vzeroupper85; AVX1-NEXT: retq86; AVX1-NEXT: .LBB0_5: # %cond.load487; AVX1-NEXT: vmovq %xmm0, %rcx88; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]89; AVX1-NEXT: testb $8, %al90; AVX1-NEXT: je .LBB0_891; AVX1-NEXT: .LBB0_7: # %cond.load792; AVX1-NEXT: vpextrq $1, %xmm0, %rax93; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]94; AVX1-NEXT: vmovaps %xmm2, %xmm095; AVX1-NEXT: vzeroupper96; AVX1-NEXT: retq97;98; AVX2-LABEL: gather_v4f32_ptr_v4i32:99; AVX2: # %bb.0:100; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3101; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1102; AVX2-NEXT: vmovmskps %xmm1, %eax103; AVX2-NEXT: testb $1, %al104; AVX2-NEXT: je .LBB0_2105; AVX2-NEXT: # %bb.1: # %cond.load106; AVX2-NEXT: vmovq %xmm0, %rcx107; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero108; AVX2-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]109; AVX2-NEXT: .LBB0_2: # %else110; AVX2-NEXT: testb $2, %al111; AVX2-NEXT: je .LBB0_4112; AVX2-NEXT: # %bb.3: # %cond.load1113; AVX2-NEXT: vpextrq $1, %xmm0, %rcx114; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]115; AVX2-NEXT: .LBB0_4: # %else2116; AVX2-NEXT: testb $4, %al117; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0118; AVX2-NEXT: jne .LBB0_5119; AVX2-NEXT: # %bb.6: # %else5120; AVX2-NEXT: testb $8, %al121; AVX2-NEXT: jne .LBB0_7122; AVX2-NEXT: .LBB0_8: # %else8123; AVX2-NEXT: vmovaps %xmm2, %xmm0124; AVX2-NEXT: vzeroupper125; AVX2-NEXT: retq126; AVX2-NEXT: .LBB0_5: # %cond.load4127; AVX2-NEXT: vmovq %xmm0, %rcx128; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]129; AVX2-NEXT: testb $8, %al130; AVX2-NEXT: je .LBB0_8131; AVX2-NEXT: .LBB0_7: # %cond.load7132; AVX2-NEXT: vpextrq $1, %xmm0, %rax133; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]134; AVX2-NEXT: vmovaps %xmm2, %xmm0135; AVX2-NEXT: vzeroupper136; AVX2-NEXT: retq137;138; AVX512F-LABEL: gather_v4f32_ptr_v4i32:139; AVX512F: # %bb.0:140; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1141; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k0142; AVX512F-NEXT: kmovw %k0, %eax143; AVX512F-NEXT: testb $1, %al144; AVX512F-NEXT: je .LBB0_2145; AVX512F-NEXT: # %bb.1: # %cond.load146; AVX512F-NEXT: vmovq %xmm0, %rcx147; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero148; AVX512F-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]149; AVX512F-NEXT: .LBB0_2: # %else150; AVX512F-NEXT: testb $2, %al151; AVX512F-NEXT: je .LBB0_4152; AVX512F-NEXT: # %bb.3: # %cond.load1153; AVX512F-NEXT: vpextrq $1, %xmm0, %rcx154; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]155; AVX512F-NEXT: .LBB0_4: # %else2156; AVX512F-NEXT: testb $4, %al157; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0158; AVX512F-NEXT: jne .LBB0_5159; AVX512F-NEXT: # %bb.6: # %else5160; AVX512F-NEXT: testb $8, %al161; AVX512F-NEXT: jne .LBB0_7162; AVX512F-NEXT: .LBB0_8: # %else8163; AVX512F-NEXT: vmovaps %xmm2, %xmm0164; AVX512F-NEXT: vzeroupper165; AVX512F-NEXT: retq166; AVX512F-NEXT: .LBB0_5: # %cond.load4167; AVX512F-NEXT: vmovq %xmm0, %rcx168; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]169; AVX512F-NEXT: testb $8, %al170; AVX512F-NEXT: je .LBB0_8171; AVX512F-NEXT: .LBB0_7: # %cond.load7172; AVX512F-NEXT: vpextrq $1, %xmm0, %rax173; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]174; AVX512F-NEXT: vmovaps %xmm2, %xmm0175; AVX512F-NEXT: vzeroupper176; AVX512F-NEXT: retq177;178; AVX512VL-LABEL: gather_v4f32_ptr_v4i32:179; AVX512VL: # %bb.0:180; AVX512VL-NEXT: vptestnmd %xmm1, %xmm1, %k1181; AVX512VL-NEXT: vgatherqps (,%ymm0), %xmm2 {%k1}182; AVX512VL-NEXT: vmovaps %xmm2, %xmm0183; AVX512VL-NEXT: vzeroupper184; AVX512VL-NEXT: retq185 %mask = icmp eq <4 x i32> %trigger, zeroinitializer186 %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> %res188}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, %xmm3194; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]195; SSE-NEXT: pmovsxdq %xmm0, %xmm4196; SSE-NEXT: psllq $2, %xmm4197; SSE-NEXT: paddq %xmm3, %xmm4198; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]199; SSE-NEXT: pmovsxdq %xmm0, %xmm0200; SSE-NEXT: pxor %xmm5, %xmm5201; SSE-NEXT: pcmpeqd %xmm1, %xmm5202; SSE-NEXT: movmskps %xmm5, %eax203; SSE-NEXT: testb $1, %al204; SSE-NEXT: je .LBB1_2205; SSE-NEXT: # %bb.1: # %cond.load206; SSE-NEXT: movq %xmm4, %rcx207; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero208; SSE-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]209; SSE-NEXT: .LBB1_2: # %else210; SSE-NEXT: psllq $2, %xmm0211; SSE-NEXT: testb $2, %al212; SSE-NEXT: je .LBB1_4213; SSE-NEXT: # %bb.3: # %cond.load1214; SSE-NEXT: pextrq $1, %xmm4, %rcx215; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]216; SSE-NEXT: .LBB1_4: # %else2217; SSE-NEXT: paddq %xmm0, %xmm3218; SSE-NEXT: testb $4, %al219; SSE-NEXT: jne .LBB1_5220; SSE-NEXT: # %bb.6: # %else5221; SSE-NEXT: testb $8, %al222; SSE-NEXT: jne .LBB1_7223; SSE-NEXT: .LBB1_8: # %else8224; SSE-NEXT: movaps %xmm2, %xmm0225; SSE-NEXT: retq226; SSE-NEXT: .LBB1_5: # %cond.load4227; SSE-NEXT: movq %xmm3, %rcx228; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]229; SSE-NEXT: testb $8, %al230; SSE-NEXT: je .LBB1_8231; SSE-NEXT: .LBB1_7: # %cond.load7232; SSE-NEXT: pextrq $1, %xmm3, %rax233; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]234; SSE-NEXT: movaps %xmm2, %xmm0235; SSE-NEXT: retq236;237; AVX1-LABEL: gather_v4f32_v4i32_v4i32:238; AVX1: # %bb.0:239; AVX1-NEXT: vmovq %rdi, %xmm3240; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]241; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]242; AVX1-NEXT: vpmovsxdq %xmm4, %xmm4243; AVX1-NEXT: vpsllq $2, %xmm4, %xmm4244; AVX1-NEXT: vpaddq %xmm4, %xmm3, %xmm4245; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0246; AVX1-NEXT: vpsllq $2, %xmm0, %xmm0247; AVX1-NEXT: vpaddq %xmm0, %xmm3, %xmm0248; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0249; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3250; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1251; AVX1-NEXT: vmovmskps %xmm1, %eax252; AVX1-NEXT: testb $1, %al253; AVX1-NEXT: je .LBB1_2254; AVX1-NEXT: # %bb.1: # %cond.load255; AVX1-NEXT: vmovq %xmm0, %rcx256; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero257; AVX1-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]258; AVX1-NEXT: .LBB1_2: # %else259; AVX1-NEXT: testb $2, %al260; AVX1-NEXT: je .LBB1_4261; AVX1-NEXT: # %bb.3: # %cond.load1262; AVX1-NEXT: vpextrq $1, %xmm0, %rcx263; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]264; AVX1-NEXT: .LBB1_4: # %else2265; AVX1-NEXT: testb $4, %al266; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0267; AVX1-NEXT: jne .LBB1_5268; AVX1-NEXT: # %bb.6: # %else5269; AVX1-NEXT: testb $8, %al270; AVX1-NEXT: jne .LBB1_7271; AVX1-NEXT: .LBB1_8: # %else8272; AVX1-NEXT: vmovaps %xmm2, %xmm0273; AVX1-NEXT: vzeroupper274; AVX1-NEXT: retq275; AVX1-NEXT: .LBB1_5: # %cond.load4276; AVX1-NEXT: vmovq %xmm0, %rcx277; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]278; AVX1-NEXT: testb $8, %al279; AVX1-NEXT: je .LBB1_8280; AVX1-NEXT: .LBB1_7: # %cond.load7281; AVX1-NEXT: vpextrq $1, %xmm0, %rax282; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]283; AVX1-NEXT: vmovaps %xmm2, %xmm0284; AVX1-NEXT: vzeroupper285; AVX1-NEXT: retq286;287; AVX2-LABEL: gather_v4f32_v4i32_v4i32:288; AVX2: # %bb.0:289; AVX2-NEXT: vmovq %rdi, %xmm3290; AVX2-NEXT: vpbroadcastq %xmm3, %ymm3291; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0292; AVX2-NEXT: vpsllq $2, %ymm0, %ymm0293; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0294; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3295; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1296; AVX2-NEXT: vmovmskps %xmm1, %eax297; AVX2-NEXT: testb $1, %al298; AVX2-NEXT: je .LBB1_2299; AVX2-NEXT: # %bb.1: # %cond.load300; AVX2-NEXT: vmovq %xmm0, %rcx301; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero302; AVX2-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]303; AVX2-NEXT: .LBB1_2: # %else304; AVX2-NEXT: testb $2, %al305; AVX2-NEXT: je .LBB1_4306; AVX2-NEXT: # %bb.3: # %cond.load1307; AVX2-NEXT: vpextrq $1, %xmm0, %rcx308; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]309; AVX2-NEXT: .LBB1_4: # %else2310; AVX2-NEXT: testb $4, %al311; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0312; AVX2-NEXT: jne .LBB1_5313; AVX2-NEXT: # %bb.6: # %else5314; AVX2-NEXT: testb $8, %al315; AVX2-NEXT: jne .LBB1_7316; AVX2-NEXT: .LBB1_8: # %else8317; AVX2-NEXT: vmovaps %xmm2, %xmm0318; AVX2-NEXT: vzeroupper319; AVX2-NEXT: retq320; AVX2-NEXT: .LBB1_5: # %cond.load4321; AVX2-NEXT: vmovq %xmm0, %rcx322; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]323; AVX2-NEXT: testb $8, %al324; AVX2-NEXT: je .LBB1_8325; AVX2-NEXT: .LBB1_7: # %cond.load7326; AVX2-NEXT: vpextrq $1, %xmm0, %rax327; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]328; AVX2-NEXT: vmovaps %xmm2, %xmm0329; AVX2-NEXT: vzeroupper330; AVX2-NEXT: retq331;332; AVX512F-LABEL: gather_v4f32_v4i32_v4i32:333; AVX512F: # %bb.0:334; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1335; AVX512F-NEXT: vmovq %rdi, %xmm3336; AVX512F-NEXT: vpbroadcastq %xmm3, %ymm3337; AVX512F-NEXT: vpmovsxdq %xmm0, %ymm0338; AVX512F-NEXT: vpsllq $2, %ymm0, %ymm0339; AVX512F-NEXT: vpaddq %ymm0, %ymm3, %ymm0340; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k0341; AVX512F-NEXT: kmovw %k0, %eax342; AVX512F-NEXT: testb $1, %al343; AVX512F-NEXT: je .LBB1_2344; AVX512F-NEXT: # %bb.1: # %cond.load345; AVX512F-NEXT: vmovq %xmm0, %rcx346; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero347; AVX512F-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]348; AVX512F-NEXT: .LBB1_2: # %else349; AVX512F-NEXT: testb $2, %al350; AVX512F-NEXT: je .LBB1_4351; AVX512F-NEXT: # %bb.3: # %cond.load1352; AVX512F-NEXT: vpextrq $1, %xmm0, %rcx353; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]354; AVX512F-NEXT: .LBB1_4: # %else2355; AVX512F-NEXT: testb $4, %al356; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0357; AVX512F-NEXT: jne .LBB1_5358; AVX512F-NEXT: # %bb.6: # %else5359; AVX512F-NEXT: testb $8, %al360; AVX512F-NEXT: jne .LBB1_7361; AVX512F-NEXT: .LBB1_8: # %else8362; AVX512F-NEXT: vmovaps %xmm2, %xmm0363; AVX512F-NEXT: vzeroupper364; AVX512F-NEXT: retq365; AVX512F-NEXT: .LBB1_5: # %cond.load4366; AVX512F-NEXT: vmovq %xmm0, %rcx367; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]368; AVX512F-NEXT: testb $8, %al369; AVX512F-NEXT: je .LBB1_8370; AVX512F-NEXT: .LBB1_7: # %cond.load7371; AVX512F-NEXT: vpextrq $1, %xmm0, %rax372; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]373; AVX512F-NEXT: vmovaps %xmm2, %xmm0374; AVX512F-NEXT: vzeroupper375; AVX512F-NEXT: retq376;377; AVX512VL-LABEL: gather_v4f32_v4i32_v4i32:378; AVX512VL: # %bb.0:379; AVX512VL-NEXT: vptestnmd %xmm1, %xmm1, %k1380; AVX512VL-NEXT: vgatherdps (%rdi,%xmm0,4), %xmm2 {%k1}381; AVX512VL-NEXT: vmovaps %xmm2, %xmm0382; AVX512VL-NEXT: retq383 %vptr0 = insertelement <4 x ptr> undef, ptr %base, i32 0384 %vptr1 = shufflevector <4 x ptr> %vptr0, <4 x ptr> undef, <4 x i32> zeroinitializer385 %vptr2 = getelementptr float, <4 x ptr> %vptr1, <4 x i32> %idx386 387 %mask = icmp eq <4 x i32> %trigger, zeroinitializer388 %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> %res390}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, %xmm4396; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]397; SSE-NEXT: psllq $2, %xmm0398; SSE-NEXT: paddq %xmm4, %xmm0399; SSE-NEXT: pxor %xmm5, %xmm5400; SSE-NEXT: pcmpeqd %xmm2, %xmm5401; SSE-NEXT: movmskps %xmm5, %eax402; SSE-NEXT: testb $1, %al403; SSE-NEXT: je .LBB2_2404; SSE-NEXT: # %bb.1: # %cond.load405; SSE-NEXT: movq %xmm0, %rcx406; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero407; SSE-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7]408; SSE-NEXT: .LBB2_2: # %else409; SSE-NEXT: psllq $2, %xmm1410; SSE-NEXT: testb $2, %al411; SSE-NEXT: je .LBB2_4412; SSE-NEXT: # %bb.3: # %cond.load1413; SSE-NEXT: pextrq $1, %xmm0, %rcx414; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]415; SSE-NEXT: .LBB2_4: # %else2416; SSE-NEXT: paddq %xmm1, %xmm4417; SSE-NEXT: testb $4, %al418; SSE-NEXT: jne .LBB2_5419; SSE-NEXT: # %bb.6: # %else5420; SSE-NEXT: testb $8, %al421; SSE-NEXT: jne .LBB2_7422; SSE-NEXT: .LBB2_8: # %else8423; SSE-NEXT: movaps %xmm3, %xmm0424; SSE-NEXT: retq425; SSE-NEXT: .LBB2_5: # %cond.load4426; SSE-NEXT: movq %xmm4, %rcx427; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]428; SSE-NEXT: testb $8, %al429; SSE-NEXT: je .LBB2_8430; SSE-NEXT: .LBB2_7: # %cond.load7431; SSE-NEXT: pextrq $1, %xmm4, %rax432; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]433; SSE-NEXT: movaps %xmm3, %xmm0434; SSE-NEXT: retq435;436; AVX1-LABEL: gather_v4f32_v4i64_v4i32:437; AVX1: # %bb.0:438; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3439; AVX1-NEXT: vpsllq $2, %xmm3, %xmm3440; AVX1-NEXT: vmovq %rdi, %xmm4441; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]442; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3443; AVX1-NEXT: vpsllq $2, %xmm0, %xmm0444; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0445; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0446; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3447; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1448; AVX1-NEXT: vmovmskps %xmm1, %eax449; AVX1-NEXT: testb $1, %al450; AVX1-NEXT: je .LBB2_2451; AVX1-NEXT: # %bb.1: # %cond.load452; AVX1-NEXT: vmovq %xmm0, %rcx453; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero454; AVX1-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]455; AVX1-NEXT: .LBB2_2: # %else456; AVX1-NEXT: testb $2, %al457; AVX1-NEXT: je .LBB2_4458; AVX1-NEXT: # %bb.3: # %cond.load1459; AVX1-NEXT: vpextrq $1, %xmm0, %rcx460; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]461; AVX1-NEXT: .LBB2_4: # %else2462; AVX1-NEXT: testb $4, %al463; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0464; AVX1-NEXT: jne .LBB2_5465; AVX1-NEXT: # %bb.6: # %else5466; AVX1-NEXT: testb $8, %al467; AVX1-NEXT: jne .LBB2_7468; AVX1-NEXT: .LBB2_8: # %else8469; AVX1-NEXT: vmovaps %xmm2, %xmm0470; AVX1-NEXT: vzeroupper471; AVX1-NEXT: retq472; AVX1-NEXT: .LBB2_5: # %cond.load4473; AVX1-NEXT: vmovq %xmm0, %rcx474; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]475; AVX1-NEXT: testb $8, %al476; AVX1-NEXT: je .LBB2_8477; AVX1-NEXT: .LBB2_7: # %cond.load7478; AVX1-NEXT: vpextrq $1, %xmm0, %rax479; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]480; AVX1-NEXT: vmovaps %xmm2, %xmm0481; AVX1-NEXT: vzeroupper482; AVX1-NEXT: retq483;484; AVX2-LABEL: gather_v4f32_v4i64_v4i32:485; AVX2: # %bb.0:486; AVX2-NEXT: vmovq %rdi, %xmm3487; AVX2-NEXT: vpbroadcastq %xmm3, %ymm3488; AVX2-NEXT: vpsllq $2, %ymm0, %ymm0489; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0490; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3491; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1492; AVX2-NEXT: vmovmskps %xmm1, %eax493; AVX2-NEXT: testb $1, %al494; AVX2-NEXT: je .LBB2_2495; AVX2-NEXT: # %bb.1: # %cond.load496; AVX2-NEXT: vmovq %xmm0, %rcx497; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero498; AVX2-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]499; AVX2-NEXT: .LBB2_2: # %else500; AVX2-NEXT: testb $2, %al501; AVX2-NEXT: je .LBB2_4502; AVX2-NEXT: # %bb.3: # %cond.load1503; AVX2-NEXT: vpextrq $1, %xmm0, %rcx504; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]505; AVX2-NEXT: .LBB2_4: # %else2506; AVX2-NEXT: testb $4, %al507; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0508; AVX2-NEXT: jne .LBB2_5509; AVX2-NEXT: # %bb.6: # %else5510; AVX2-NEXT: testb $8, %al511; AVX2-NEXT: jne .LBB2_7512; AVX2-NEXT: .LBB2_8: # %else8513; AVX2-NEXT: vmovaps %xmm2, %xmm0514; AVX2-NEXT: vzeroupper515; AVX2-NEXT: retq516; AVX2-NEXT: .LBB2_5: # %cond.load4517; AVX2-NEXT: vmovq %xmm0, %rcx518; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]519; AVX2-NEXT: testb $8, %al520; AVX2-NEXT: je .LBB2_8521; AVX2-NEXT: .LBB2_7: # %cond.load7522; AVX2-NEXT: vpextrq $1, %xmm0, %rax523; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]524; AVX2-NEXT: vmovaps %xmm2, %xmm0525; AVX2-NEXT: vzeroupper526; AVX2-NEXT: retq527;528; AVX512F-LABEL: gather_v4f32_v4i64_v4i32:529; AVX512F: # %bb.0:530; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1531; AVX512F-NEXT: vmovq %rdi, %xmm3532; AVX512F-NEXT: vpbroadcastq %xmm3, %ymm3533; AVX512F-NEXT: vpsllq $2, %ymm0, %ymm0534; AVX512F-NEXT: vpaddq %ymm0, %ymm3, %ymm0535; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k0536; AVX512F-NEXT: kmovw %k0, %eax537; AVX512F-NEXT: testb $1, %al538; AVX512F-NEXT: je .LBB2_2539; AVX512F-NEXT: # %bb.1: # %cond.load540; AVX512F-NEXT: vmovq %xmm0, %rcx541; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero542; AVX512F-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]543; AVX512F-NEXT: .LBB2_2: # %else544; AVX512F-NEXT: testb $2, %al545; AVX512F-NEXT: je .LBB2_4546; AVX512F-NEXT: # %bb.3: # %cond.load1547; AVX512F-NEXT: vpextrq $1, %xmm0, %rcx548; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]549; AVX512F-NEXT: .LBB2_4: # %else2550; AVX512F-NEXT: testb $4, %al551; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0552; AVX512F-NEXT: jne .LBB2_5553; AVX512F-NEXT: # %bb.6: # %else5554; AVX512F-NEXT: testb $8, %al555; AVX512F-NEXT: jne .LBB2_7556; AVX512F-NEXT: .LBB2_8: # %else8557; AVX512F-NEXT: vmovaps %xmm2, %xmm0558; AVX512F-NEXT: vzeroupper559; AVX512F-NEXT: retq560; AVX512F-NEXT: .LBB2_5: # %cond.load4561; AVX512F-NEXT: vmovq %xmm0, %rcx562; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]563; AVX512F-NEXT: testb $8, %al564; AVX512F-NEXT: je .LBB2_8565; AVX512F-NEXT: .LBB2_7: # %cond.load7566; AVX512F-NEXT: vpextrq $1, %xmm0, %rax567; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]568; AVX512F-NEXT: vmovaps %xmm2, %xmm0569; AVX512F-NEXT: vzeroupper570; AVX512F-NEXT: retq571;572; AVX512VL-LABEL: gather_v4f32_v4i64_v4i32:573; AVX512VL: # %bb.0:574; AVX512VL-NEXT: vptestnmd %xmm1, %xmm1, %k1575; AVX512VL-NEXT: vgatherqps (%rdi,%ymm0,4), %xmm2 {%k1}576; AVX512VL-NEXT: vmovaps %xmm2, %xmm0577; AVX512VL-NEXT: vzeroupper578; AVX512VL-NEXT: retq579 %vptr0 = insertelement <4 x ptr> undef, ptr %base, i32 0580 %vptr1 = shufflevector <4 x ptr> %vptr0, <4 x ptr> undef, <4 x i32> zeroinitializer581 %vptr2 = getelementptr float, <4 x ptr> %vptr1, <4 x i64> %idx582 583 %mask = icmp eq <4 x i32> %trigger, zeroinitializer584 %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> %res586}587 588;589; vXi8590;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, %xmm6596; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,1,0,1]597; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm0[2,3,2,3]598; SSE-NEXT: pmovsxdq %xmm0, %xmm0599; SSE-NEXT: paddq %xmm6, %xmm0600; SSE-NEXT: pxor %xmm8, %xmm8601; SSE-NEXT: pcmpeqb %xmm4, %xmm8602; SSE-NEXT: pmovmskb %xmm8, %eax603; SSE-NEXT: testb $1, %al604; SSE-NEXT: je .LBB3_2605; SSE-NEXT: # %bb.1: # %cond.load606; SSE-NEXT: movq %xmm0, %rcx607; SSE-NEXT: pinsrb $0, (%rcx), %xmm5608; SSE-NEXT: .LBB3_2: # %else609; SSE-NEXT: pmovsxdq %xmm7, %xmm4610; SSE-NEXT: testb $2, %al611; SSE-NEXT: je .LBB3_4612; SSE-NEXT: # %bb.3: # %cond.load1613; SSE-NEXT: pextrq $1, %xmm0, %rcx614; SSE-NEXT: pinsrb $1, (%rcx), %xmm5615; SSE-NEXT: .LBB3_4: # %else2616; SSE-NEXT: paddq %xmm6, %xmm4617; SSE-NEXT: testb $4, %al618; SSE-NEXT: je .LBB3_6619; SSE-NEXT: # %bb.5: # %cond.load4620; SSE-NEXT: movq %xmm4, %rcx621; SSE-NEXT: pinsrb $2, (%rcx), %xmm5622; SSE-NEXT: .LBB3_6: # %else5623; SSE-NEXT: pmovsxdq %xmm1, %xmm0624; SSE-NEXT: testb $8, %al625; SSE-NEXT: je .LBB3_8626; SSE-NEXT: # %bb.7: # %cond.load7627; SSE-NEXT: pextrq $1, %xmm4, %rcx628; SSE-NEXT: pinsrb $3, (%rcx), %xmm5629; SSE-NEXT: .LBB3_8: # %else8630; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]631; SSE-NEXT: paddq %xmm6, %xmm0632; SSE-NEXT: testb $16, %al633; SSE-NEXT: je .LBB3_10634; SSE-NEXT: # %bb.9: # %cond.load10635; SSE-NEXT: movq %xmm0, %rcx636; SSE-NEXT: pinsrb $4, (%rcx), %xmm5637; SSE-NEXT: .LBB3_10: # %else11638; SSE-NEXT: pmovsxdq %xmm1, %xmm1639; SSE-NEXT: testb $32, %al640; SSE-NEXT: je .LBB3_12641; SSE-NEXT: # %bb.11: # %cond.load13642; SSE-NEXT: pextrq $1, %xmm0, %rcx643; SSE-NEXT: pinsrb $5, (%rcx), %xmm5644; SSE-NEXT: .LBB3_12: # %else14645; SSE-NEXT: paddq %xmm6, %xmm1646; SSE-NEXT: testb $64, %al647; SSE-NEXT: je .LBB3_14648; SSE-NEXT: # %bb.13: # %cond.load16649; SSE-NEXT: movq %xmm1, %rcx650; SSE-NEXT: pinsrb $6, (%rcx), %xmm5651; SSE-NEXT: .LBB3_14: # %else17652; SSE-NEXT: pmovsxdq %xmm2, %xmm0653; SSE-NEXT: testb %al, %al654; SSE-NEXT: jns .LBB3_16655; SSE-NEXT: # %bb.15: # %cond.load19656; SSE-NEXT: pextrq $1, %xmm1, %rcx657; SSE-NEXT: pinsrb $7, (%rcx), %xmm5658; SSE-NEXT: .LBB3_16: # %else20659; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]660; SSE-NEXT: paddq %xmm6, %xmm0661; SSE-NEXT: testl $256, %eax # imm = 0x100662; SSE-NEXT: je .LBB3_18663; SSE-NEXT: # %bb.17: # %cond.load22664; SSE-NEXT: movq %xmm0, %rcx665; SSE-NEXT: pinsrb $8, (%rcx), %xmm5666; SSE-NEXT: .LBB3_18: # %else23667; SSE-NEXT: pmovsxdq %xmm1, %xmm1668; SSE-NEXT: testl $512, %eax # imm = 0x200669; SSE-NEXT: je .LBB3_20670; SSE-NEXT: # %bb.19: # %cond.load25671; SSE-NEXT: pextrq $1, %xmm0, %rcx672; SSE-NEXT: pinsrb $9, (%rcx), %xmm5673; SSE-NEXT: .LBB3_20: # %else26674; SSE-NEXT: paddq %xmm6, %xmm1675; SSE-NEXT: testl $1024, %eax # imm = 0x400676; SSE-NEXT: je .LBB3_22677; SSE-NEXT: # %bb.21: # %cond.load28678; SSE-NEXT: movq %xmm1, %rcx679; SSE-NEXT: pinsrb $10, (%rcx), %xmm5680; SSE-NEXT: .LBB3_22: # %else29681; SSE-NEXT: pmovsxdq %xmm3, %xmm0682; SSE-NEXT: testl $2048, %eax # imm = 0x800683; SSE-NEXT: je .LBB3_24684; SSE-NEXT: # %bb.23: # %cond.load31685; SSE-NEXT: pextrq $1, %xmm1, %rcx686; SSE-NEXT: pinsrb $11, (%rcx), %xmm5687; SSE-NEXT: .LBB3_24: # %else32688; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]689; SSE-NEXT: paddq %xmm6, %xmm0690; SSE-NEXT: testl $4096, %eax # imm = 0x1000691; SSE-NEXT: je .LBB3_26692; SSE-NEXT: # %bb.25: # %cond.load34693; SSE-NEXT: movq %xmm0, %rcx694; SSE-NEXT: pinsrb $12, (%rcx), %xmm5695; SSE-NEXT: .LBB3_26: # %else35696; SSE-NEXT: pmovsxdq %xmm1, %xmm1697; SSE-NEXT: testl $8192, %eax # imm = 0x2000698; SSE-NEXT: je .LBB3_28699; SSE-NEXT: # %bb.27: # %cond.load37700; SSE-NEXT: pextrq $1, %xmm0, %rcx701; SSE-NEXT: pinsrb $13, (%rcx), %xmm5702; SSE-NEXT: .LBB3_28: # %else38703; SSE-NEXT: paddq %xmm1, %xmm6704; SSE-NEXT: testl $16384, %eax # imm = 0x4000705; SSE-NEXT: jne .LBB3_29706; SSE-NEXT: # %bb.30: # %else41707; SSE-NEXT: testl $32768, %eax # imm = 0x8000708; SSE-NEXT: jne .LBB3_31709; SSE-NEXT: .LBB3_32: # %else44710; SSE-NEXT: movdqa %xmm5, %xmm0711; SSE-NEXT: retq712; SSE-NEXT: .LBB3_29: # %cond.load40713; SSE-NEXT: movq %xmm6, %rcx714; SSE-NEXT: pinsrb $14, (%rcx), %xmm5715; SSE-NEXT: testl $32768, %eax # imm = 0x8000716; SSE-NEXT: je .LBB3_32717; SSE-NEXT: .LBB3_31: # %cond.load43718; SSE-NEXT: pextrq $1, %xmm6, %rax719; SSE-NEXT: pinsrb $15, (%rax), %xmm5720; SSE-NEXT: movdqa %xmm5, %xmm0721; SSE-NEXT: retq722;723; AVX1-LABEL: gather_v16i8_v16i32_v16i8:724; AVX1: # %bb.0:725; AVX1-NEXT: vmovq %rdi, %xmm4726; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]727; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5728; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[2,3,2,3]729; AVX1-NEXT: vpmovsxdq %xmm6, %xmm6730; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm6731; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0732; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0733; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0734; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6735; AVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm2736; AVX1-NEXT: vpmovmskb %xmm2, %eax737; AVX1-NEXT: testb $1, %al738; AVX1-NEXT: je .LBB3_2739; AVX1-NEXT: # %bb.1: # %cond.load740; AVX1-NEXT: vmovq %xmm0, %rcx741; AVX1-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3742; AVX1-NEXT: .LBB3_2: # %else743; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm5[2,3,2,3]744; AVX1-NEXT: vpmovsxdq %xmm5, %xmm6745; AVX1-NEXT: testb $2, %al746; AVX1-NEXT: je .LBB3_4747; AVX1-NEXT: # %bb.3: # %cond.load1748; AVX1-NEXT: vpextrq $1, %xmm0, %rcx749; AVX1-NEXT: vpinsrb $1, (%rcx), %xmm3, %xmm3750; AVX1-NEXT: .LBB3_4: # %else2751; AVX1-NEXT: vpmovsxdq %xmm2, %xmm5752; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm2753; AVX1-NEXT: testb $4, %al754; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0755; AVX1-NEXT: je .LBB3_6756; AVX1-NEXT: # %bb.5: # %cond.load4757; AVX1-NEXT: vmovq %xmm0, %rcx758; AVX1-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3759; AVX1-NEXT: .LBB3_6: # %else5760; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm5761; AVX1-NEXT: testb $8, %al762; AVX1-NEXT: je .LBB3_8763; AVX1-NEXT: # %bb.7: # %cond.load7764; AVX1-NEXT: vpextrq $1, %xmm0, %rcx765; AVX1-NEXT: vpinsrb $3, (%rcx), %xmm3, %xmm3766; AVX1-NEXT: .LBB3_8: # %else8767; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm0768; AVX1-NEXT: testb $16, %al769; AVX1-NEXT: je .LBB3_10770; AVX1-NEXT: # %bb.9: # %cond.load10771; AVX1-NEXT: vmovq %xmm0, %rcx772; AVX1-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3773; AVX1-NEXT: .LBB3_10: # %else11774; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]775; AVX1-NEXT: vpmovsxdq %xmm1, %xmm6776; AVX1-NEXT: testb $32, %al777; AVX1-NEXT: je .LBB3_12778; AVX1-NEXT: # %bb.11: # %cond.load13779; AVX1-NEXT: vpextrq $1, %xmm0, %rcx780; AVX1-NEXT: vpinsrb $5, (%rcx), %xmm3, %xmm3781; AVX1-NEXT: .LBB3_12: # %else14782; AVX1-NEXT: vpmovsxdq %xmm2, %xmm5783; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm2784; AVX1-NEXT: testb $64, %al785; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0786; AVX1-NEXT: je .LBB3_14787; AVX1-NEXT: # %bb.13: # %cond.load16788; AVX1-NEXT: vmovq %xmm0, %rcx789; AVX1-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3790; AVX1-NEXT: .LBB3_14: # %else17791; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm5792; AVX1-NEXT: testb %al, %al793; AVX1-NEXT: jns .LBB3_16794; AVX1-NEXT: # %bb.15: # %cond.load19795; AVX1-NEXT: vpextrq $1, %xmm0, %rcx796; AVX1-NEXT: vpinsrb $7, (%rcx), %xmm3, %xmm3797; AVX1-NEXT: .LBB3_16: # %else20798; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1799; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm0800; AVX1-NEXT: testl $256, %eax # imm = 0x100801; AVX1-NEXT: je .LBB3_18802; AVX1-NEXT: # %bb.17: # %cond.load22803; AVX1-NEXT: vmovq %xmm0, %rcx804; AVX1-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3805; AVX1-NEXT: .LBB3_18: # %else23806; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]807; AVX1-NEXT: vpmovsxdq %xmm1, %xmm1808; AVX1-NEXT: testl $512, %eax # imm = 0x200809; AVX1-NEXT: je .LBB3_20810; AVX1-NEXT: # %bb.19: # %cond.load25811; AVX1-NEXT: vpextrq $1, %xmm0, %rcx812; AVX1-NEXT: vpinsrb $9, (%rcx), %xmm3, %xmm3813; AVX1-NEXT: .LBB3_20: # %else26814; AVX1-NEXT: vpmovsxdq %xmm2, %xmm2815; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm1816; AVX1-NEXT: testl $1024, %eax # imm = 0x400817; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0818; AVX1-NEXT: je .LBB3_22819; AVX1-NEXT: # %bb.21: # %cond.load28820; AVX1-NEXT: vmovq %xmm0, %rcx821; AVX1-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3822; AVX1-NEXT: .LBB3_22: # %else29823; AVX1-NEXT: vpaddq %xmm2, %xmm4, %xmm2824; AVX1-NEXT: testl $2048, %eax # imm = 0x800825; AVX1-NEXT: je .LBB3_24826; AVX1-NEXT: # %bb.23: # %cond.load31827; AVX1-NEXT: vpextrq $1, %xmm0, %rcx828; AVX1-NEXT: vpinsrb $11, (%rcx), %xmm3, %xmm3829; AVX1-NEXT: .LBB3_24: # %else32830; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm0831; AVX1-NEXT: testl $4096, %eax # imm = 0x1000832; AVX1-NEXT: je .LBB3_26833; AVX1-NEXT: # %bb.25: # %cond.load34834; AVX1-NEXT: vmovq %xmm0, %rcx835; AVX1-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3836; AVX1-NEXT: .LBB3_26: # %else35837; AVX1-NEXT: testl $8192, %eax # imm = 0x2000838; AVX1-NEXT: je .LBB3_28839; AVX1-NEXT: # %bb.27: # %cond.load37840; AVX1-NEXT: vpextrq $1, %xmm0, %rcx841; AVX1-NEXT: vpinsrb $13, (%rcx), %xmm3, %xmm3842; AVX1-NEXT: .LBB3_28: # %else38843; AVX1-NEXT: testl $16384, %eax # imm = 0x4000844; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0845; AVX1-NEXT: jne .LBB3_29846; AVX1-NEXT: # %bb.30: # %else41847; AVX1-NEXT: testl $32768, %eax # imm = 0x8000848; AVX1-NEXT: jne .LBB3_31849; AVX1-NEXT: .LBB3_32: # %else44850; AVX1-NEXT: vmovdqa %xmm3, %xmm0851; AVX1-NEXT: vzeroupper852; AVX1-NEXT: retq853; AVX1-NEXT: .LBB3_29: # %cond.load40854; AVX1-NEXT: vmovq %xmm0, %rcx855; AVX1-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3856; AVX1-NEXT: testl $32768, %eax # imm = 0x8000857; AVX1-NEXT: je .LBB3_32858; AVX1-NEXT: .LBB3_31: # %cond.load43859; AVX1-NEXT: vpextrq $1, %xmm0, %rax860; AVX1-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3861; AVX1-NEXT: vmovdqa %xmm3, %xmm0862; AVX1-NEXT: vzeroupper863; AVX1-NEXT: retq864;865; AVX2-LABEL: gather_v16i8_v16i32_v16i8:866; AVX2: # %bb.0:867; AVX2-NEXT: vmovq %rdi, %xmm4868; AVX2-NEXT: vpbroadcastq %xmm4, %ymm4869; AVX2-NEXT: vpmovsxdq %xmm0, %ymm5870; AVX2-NEXT: vpaddq %ymm5, %ymm4, %ymm5871; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6872; AVX2-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm2873; AVX2-NEXT: vpmovmskb %xmm2, %eax874; AVX2-NEXT: testb $1, %al875; AVX2-NEXT: je .LBB3_2876; AVX2-NEXT: # %bb.1: # %cond.load877; AVX2-NEXT: vmovq %xmm5, %rcx878; AVX2-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3879; AVX2-NEXT: .LBB3_2: # %else880; AVX2-NEXT: testb $2, %al881; AVX2-NEXT: je .LBB3_4882; AVX2-NEXT: # %bb.3: # %cond.load1883; AVX2-NEXT: vpextrq $1, %xmm5, %rcx884; AVX2-NEXT: vpinsrb $1, (%rcx), %xmm3, %xmm3885; AVX2-NEXT: .LBB3_4: # %else2886; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2887; AVX2-NEXT: testb $4, %al888; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm0889; AVX2-NEXT: je .LBB3_6890; AVX2-NEXT: # %bb.5: # %cond.load4891; AVX2-NEXT: vmovq %xmm0, %rcx892; AVX2-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3893; AVX2-NEXT: .LBB3_6: # %else5894; AVX2-NEXT: vpmovsxdq %xmm2, %ymm2895; AVX2-NEXT: testb $8, %al896; AVX2-NEXT: je .LBB3_8897; AVX2-NEXT: # %bb.7: # %cond.load7898; AVX2-NEXT: vpextrq $1, %xmm0, %rcx899; AVX2-NEXT: vpinsrb $3, (%rcx), %xmm3, %xmm3900; AVX2-NEXT: .LBB3_8: # %else8901; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm0902; AVX2-NEXT: testb $16, %al903; AVX2-NEXT: je .LBB3_10904; AVX2-NEXT: # %bb.9: # %cond.load10905; AVX2-NEXT: vmovq %xmm0, %rcx906; AVX2-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3907; AVX2-NEXT: .LBB3_10: # %else11908; AVX2-NEXT: testb $32, %al909; AVX2-NEXT: je .LBB3_12910; AVX2-NEXT: # %bb.11: # %cond.load13911; AVX2-NEXT: vpextrq $1, %xmm0, %rcx912; AVX2-NEXT: vpinsrb $5, (%rcx), %xmm3, %xmm3913; AVX2-NEXT: .LBB3_12: # %else14914; AVX2-NEXT: testb $64, %al915; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0916; AVX2-NEXT: je .LBB3_14917; AVX2-NEXT: # %bb.13: # %cond.load16918; AVX2-NEXT: vmovq %xmm0, %rcx919; AVX2-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3920; AVX2-NEXT: .LBB3_14: # %else17921; AVX2-NEXT: vpmovsxdq %xmm1, %ymm2922; AVX2-NEXT: testb %al, %al923; AVX2-NEXT: jns .LBB3_16924; AVX2-NEXT: # %bb.15: # %cond.load19925; AVX2-NEXT: vpextrq $1, %xmm0, %rcx926; AVX2-NEXT: vpinsrb $7, (%rcx), %xmm3, %xmm3927; AVX2-NEXT: .LBB3_16: # %else20928; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm0929; AVX2-NEXT: testl $256, %eax # imm = 0x100930; AVX2-NEXT: je .LBB3_18931; AVX2-NEXT: # %bb.17: # %cond.load22932; AVX2-NEXT: vmovq %xmm0, %rcx933; AVX2-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3934; AVX2-NEXT: .LBB3_18: # %else23935; AVX2-NEXT: testl $512, %eax # imm = 0x200936; AVX2-NEXT: je .LBB3_20937; AVX2-NEXT: # %bb.19: # %cond.load25938; AVX2-NEXT: vpextrq $1, %xmm0, %rcx939; AVX2-NEXT: vpinsrb $9, (%rcx), %xmm3, %xmm3940; AVX2-NEXT: .LBB3_20: # %else26941; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1942; AVX2-NEXT: testl $1024, %eax # imm = 0x400943; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0944; AVX2-NEXT: je .LBB3_22945; AVX2-NEXT: # %bb.21: # %cond.load28946; AVX2-NEXT: vmovq %xmm0, %rcx947; AVX2-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3948; AVX2-NEXT: .LBB3_22: # %else29949; AVX2-NEXT: vpmovsxdq %xmm1, %ymm1950; AVX2-NEXT: testl $2048, %eax # imm = 0x800951; AVX2-NEXT: je .LBB3_24952; AVX2-NEXT: # %bb.23: # %cond.load31953; AVX2-NEXT: vpextrq $1, %xmm0, %rcx954; AVX2-NEXT: vpinsrb $11, (%rcx), %xmm3, %xmm3955; AVX2-NEXT: .LBB3_24: # %else32956; AVX2-NEXT: vpaddq %ymm1, %ymm4, %ymm0957; AVX2-NEXT: testl $4096, %eax # imm = 0x1000958; AVX2-NEXT: je .LBB3_26959; AVX2-NEXT: # %bb.25: # %cond.load34960; AVX2-NEXT: vmovq %xmm0, %rcx961; AVX2-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3962; AVX2-NEXT: .LBB3_26: # %else35963; AVX2-NEXT: testl $8192, %eax # imm = 0x2000964; AVX2-NEXT: je .LBB3_28965; AVX2-NEXT: # %bb.27: # %cond.load37966; AVX2-NEXT: vpextrq $1, %xmm0, %rcx967; AVX2-NEXT: vpinsrb $13, (%rcx), %xmm3, %xmm3968; AVX2-NEXT: .LBB3_28: # %else38969; AVX2-NEXT: testl $16384, %eax # imm = 0x4000970; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0971; AVX2-NEXT: jne .LBB3_29972; AVX2-NEXT: # %bb.30: # %else41973; AVX2-NEXT: testl $32768, %eax # imm = 0x8000974; AVX2-NEXT: jne .LBB3_31975; AVX2-NEXT: .LBB3_32: # %else44976; AVX2-NEXT: vmovdqa %xmm3, %xmm0977; AVX2-NEXT: vzeroupper978; AVX2-NEXT: retq979; AVX2-NEXT: .LBB3_29: # %cond.load40980; AVX2-NEXT: vmovq %xmm0, %rcx981; AVX2-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3982; AVX2-NEXT: testl $32768, %eax # imm = 0x8000983; AVX2-NEXT: je .LBB3_32984; AVX2-NEXT: .LBB3_31: # %cond.load43985; AVX2-NEXT: vpextrq $1, %xmm0, %rax986; AVX2-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3987; AVX2-NEXT: vmovdqa %xmm3, %xmm0988; AVX2-NEXT: vzeroupper989; AVX2-NEXT: retq990;991; AVX512-LABEL: gather_v16i8_v16i32_v16i8:992; AVX512: # %bb.0:993; AVX512-NEXT: vpbroadcastq %rdi, %zmm3994; AVX512-NEXT: vpmovsxdq %ymm0, %zmm4995; AVX512-NEXT: vpaddq %zmm4, %zmm3, %zmm4996; AVX512-NEXT: vpxor %xmm5, %xmm5, %xmm5997; AVX512-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm1998; AVX512-NEXT: vpmovmskb %xmm1, %eax999; AVX512-NEXT: testb $1, %al1000; AVX512-NEXT: jne .LBB3_11001; AVX512-NEXT: # %bb.2: # %else1002; AVX512-NEXT: testb $2, %al1003; AVX512-NEXT: jne .LBB3_31004; AVX512-NEXT: .LBB3_4: # %else21005; AVX512-NEXT: testb $4, %al1006; AVX512-NEXT: jne .LBB3_51007; AVX512-NEXT: .LBB3_6: # %else51008; AVX512-NEXT: testb $8, %al1009; AVX512-NEXT: je .LBB3_81010; AVX512-NEXT: .LBB3_7: # %cond.load71011; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm11012; AVX512-NEXT: vpextrq $1, %xmm1, %rcx1013; AVX512-NEXT: vpinsrb $3, (%rcx), %xmm2, %xmm21014; AVX512-NEXT: .LBB3_8: # %else81015; AVX512-NEXT: testb $16, %al1016; AVX512-NEXT: vextracti32x4 $2, %zmm4, %xmm11017; AVX512-NEXT: je .LBB3_101018; AVX512-NEXT: # %bb.9: # %cond.load101019; AVX512-NEXT: vmovq %xmm1, %rcx1020; AVX512-NEXT: vpinsrb $4, (%rcx), %xmm2, %xmm21021; AVX512-NEXT: .LBB3_10: # %else111022; AVX512-NEXT: testb $32, %al1023; AVX512-NEXT: je .LBB3_121024; AVX512-NEXT: # %bb.11: # %cond.load131025; AVX512-NEXT: vpextrq $1, %xmm1, %rcx1026; AVX512-NEXT: vpinsrb $5, (%rcx), %xmm2, %xmm21027; AVX512-NEXT: .LBB3_12: # %else141028; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm11029; AVX512-NEXT: testb $64, %al1030; AVX512-NEXT: vextracti32x4 $3, %zmm4, %xmm01031; AVX512-NEXT: je .LBB3_141032; AVX512-NEXT: # %bb.13: # %cond.load161033; AVX512-NEXT: vmovq %xmm0, %rcx1034; AVX512-NEXT: vpinsrb $6, (%rcx), %xmm2, %xmm21035; AVX512-NEXT: .LBB3_14: # %else171036; AVX512-NEXT: vpmovsxdq %ymm1, %zmm11037; AVX512-NEXT: testb %al, %al1038; AVX512-NEXT: jns .LBB3_161039; AVX512-NEXT: # %bb.15: # %cond.load191040; AVX512-NEXT: vpextrq $1, %xmm0, %rcx1041; AVX512-NEXT: vpinsrb $7, (%rcx), %xmm2, %xmm21042; AVX512-NEXT: .LBB3_16: # %else201043; AVX512-NEXT: vpaddq %zmm1, %zmm3, %zmm01044; AVX512-NEXT: testl $256, %eax # imm = 0x1001045; AVX512-NEXT: jne .LBB3_171046; AVX512-NEXT: # %bb.18: # %else231047; AVX512-NEXT: testl $512, %eax # imm = 0x2001048; AVX512-NEXT: jne .LBB3_191049; AVX512-NEXT: .LBB3_20: # %else261050; AVX512-NEXT: testl $1024, %eax # imm = 0x4001051; AVX512-NEXT: jne .LBB3_211052; AVX512-NEXT: .LBB3_22: # %else291053; AVX512-NEXT: testl $2048, %eax # imm = 0x8001054; AVX512-NEXT: je .LBB3_241055; AVX512-NEXT: .LBB3_23: # %cond.load311056; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm11057; AVX512-NEXT: vpextrq $1, %xmm1, %rcx1058; AVX512-NEXT: vpinsrb $11, (%rcx), %xmm2, %xmm21059; AVX512-NEXT: .LBB3_24: # %else321060; AVX512-NEXT: testl $4096, %eax # imm = 0x10001061; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm11062; AVX512-NEXT: je .LBB3_261063; AVX512-NEXT: # %bb.25: # %cond.load341064; AVX512-NEXT: vmovq %xmm1, %rcx1065; AVX512-NEXT: vpinsrb $12, (%rcx), %xmm2, %xmm21066; AVX512-NEXT: .LBB3_26: # %else351067; AVX512-NEXT: testl $8192, %eax # imm = 0x20001068; AVX512-NEXT: je .LBB3_281069; AVX512-NEXT: # %bb.27: # %cond.load371070; AVX512-NEXT: vpextrq $1, %xmm1, %rcx1071; AVX512-NEXT: vpinsrb $13, (%rcx), %xmm2, %xmm21072; AVX512-NEXT: .LBB3_28: # %else381073; AVX512-NEXT: testl $16384, %eax # imm = 0x40001074; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm01075; AVX512-NEXT: jne .LBB3_291076; AVX512-NEXT: # %bb.30: # %else411077; AVX512-NEXT: testl $32768, %eax # imm = 0x80001078; AVX512-NEXT: jne .LBB3_311079; AVX512-NEXT: .LBB3_32: # %else441080; AVX512-NEXT: vmovdqa %xmm2, %xmm01081; AVX512-NEXT: vzeroupper1082; AVX512-NEXT: retq1083; AVX512-NEXT: .LBB3_1: # %cond.load1084; AVX512-NEXT: vmovq %xmm4, %rcx1085; AVX512-NEXT: vpinsrb $0, (%rcx), %xmm2, %xmm21086; AVX512-NEXT: testb $2, %al1087; AVX512-NEXT: je .LBB3_41088; AVX512-NEXT: .LBB3_3: # %cond.load11089; AVX512-NEXT: vpextrq $1, %xmm4, %rcx1090; AVX512-NEXT: vpinsrb $1, (%rcx), %xmm2, %xmm21091; AVX512-NEXT: testb $4, %al1092; AVX512-NEXT: je .LBB3_61093; AVX512-NEXT: .LBB3_5: # %cond.load41094; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm11095; AVX512-NEXT: vmovq %xmm1, %rcx1096; AVX512-NEXT: vpinsrb $2, (%rcx), %xmm2, %xmm21097; AVX512-NEXT: testb $8, %al1098; AVX512-NEXT: jne .LBB3_71099; AVX512-NEXT: jmp .LBB3_81100; AVX512-NEXT: .LBB3_17: # %cond.load221101; AVX512-NEXT: vmovq %xmm0, %rcx1102; AVX512-NEXT: vpinsrb $8, (%rcx), %xmm2, %xmm21103; AVX512-NEXT: testl $512, %eax # imm = 0x2001104; AVX512-NEXT: je .LBB3_201105; AVX512-NEXT: .LBB3_19: # %cond.load251106; AVX512-NEXT: vpextrq $1, %xmm0, %rcx1107; AVX512-NEXT: vpinsrb $9, (%rcx), %xmm2, %xmm21108; AVX512-NEXT: testl $1024, %eax # imm = 0x4001109; AVX512-NEXT: je .LBB3_221110; AVX512-NEXT: .LBB3_21: # %cond.load281111; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm11112; AVX512-NEXT: vmovq %xmm1, %rcx1113; AVX512-NEXT: vpinsrb $10, (%rcx), %xmm2, %xmm21114; AVX512-NEXT: testl $2048, %eax # imm = 0x8001115; AVX512-NEXT: jne .LBB3_231116; AVX512-NEXT: jmp .LBB3_241117; AVX512-NEXT: .LBB3_29: # %cond.load401118; AVX512-NEXT: vmovq %xmm0, %rcx1119; AVX512-NEXT: vpinsrb $14, (%rcx), %xmm2, %xmm21120; AVX512-NEXT: testl $32768, %eax # imm = 0x80001121; AVX512-NEXT: je .LBB3_321122; AVX512-NEXT: .LBB3_31: # %cond.load431123; AVX512-NEXT: vpextrq $1, %xmm0, %rax1124; AVX512-NEXT: vpinsrb $15, (%rax), %xmm2, %xmm21125; AVX512-NEXT: vmovdqa %xmm2, %xmm01126; AVX512-NEXT: vzeroupper1127; AVX512-NEXT: retq1128 %vptr0 = insertelement <16 x ptr> undef, ptr %base, i32 01129 %vptr1 = shufflevector <16 x ptr> %vptr0, <16 x ptr> undef, <16 x i32> zeroinitializer1130 %vptr2 = getelementptr i8, <16 x ptr> %vptr1, <16 x i32> %idx1131 1132 %mask = icmp eq <16 x i8> %trigger, zeroinitializer1133 %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> %res1135}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, %xmm31141; SSE-NEXT: movdqa %xmm0, %xmm21142; SSE-NEXT: pxor %xmm0, %xmm01143; SSE-NEXT: pcmpeqd %xmm0, %xmm11144; SSE-NEXT: pcmpeqd %xmm2, %xmm01145; SSE-NEXT: packssdw %xmm1, %xmm01146; SSE-NEXT: packsswb %xmm0, %xmm01147; SSE-NEXT: pmovmskb %xmm0, %eax1148; SSE-NEXT: testb $1, %al1149; SSE-NEXT: je .LBB4_11150; SSE-NEXT: # %bb.2: # %cond.load1151; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1152; SSE-NEXT: testb $2, %al1153; SSE-NEXT: jne .LBB4_41154; SSE-NEXT: jmp .LBB4_51155; SSE-NEXT: .LBB4_1:1156; SSE-NEXT: # implicit-def: $xmm01157; SSE-NEXT: testb $2, %al1158; SSE-NEXT: je .LBB4_51159; SSE-NEXT: .LBB4_4: # %cond.load11160; SSE-NEXT: pinsrd $1, c+12(%rip), %xmm01161; SSE-NEXT: .LBB4_5: # %else21162; SSE-NEXT: testb $4, %al1163; SSE-NEXT: jne .LBB4_61164; SSE-NEXT: # %bb.7: # %else51165; SSE-NEXT: testb $8, %al1166; SSE-NEXT: jne .LBB4_81167; SSE-NEXT: .LBB4_9: # %else81168; SSE-NEXT: testb $16, %al1169; SSE-NEXT: je .LBB4_101170; SSE-NEXT: .LBB4_11: # %cond.load101171; SSE-NEXT: pinsrd $0, c+12(%rip), %xmm11172; SSE-NEXT: testb $32, %al1173; SSE-NEXT: jne .LBB4_131174; SSE-NEXT: jmp .LBB4_141175; SSE-NEXT: .LBB4_6: # %cond.load41176; SSE-NEXT: pinsrd $2, c+12(%rip), %xmm01177; SSE-NEXT: testb $8, %al1178; SSE-NEXT: je .LBB4_91179; SSE-NEXT: .LBB4_8: # %cond.load71180; SSE-NEXT: pinsrd $3, c+12(%rip), %xmm01181; SSE-NEXT: testb $16, %al1182; SSE-NEXT: jne .LBB4_111183; SSE-NEXT: .LBB4_10:1184; SSE-NEXT: # implicit-def: $xmm11185; SSE-NEXT: testb $32, %al1186; SSE-NEXT: je .LBB4_141187; SSE-NEXT: .LBB4_13: # %cond.load131188; SSE-NEXT: pinsrd $1, c+12(%rip), %xmm11189; SSE-NEXT: .LBB4_14: # %else141190; SSE-NEXT: testb $64, %al1191; SSE-NEXT: jne .LBB4_151192; SSE-NEXT: # %bb.16: # %else171193; SSE-NEXT: testb $-128, %al1194; SSE-NEXT: je .LBB4_181195; SSE-NEXT: .LBB4_17: # %cond.load191196; SSE-NEXT: pinsrd $3, c+12(%rip), %xmm11197; SSE-NEXT: .LBB4_18: # %else201198; SSE-NEXT: pxor %xmm4, %xmm41199; SSE-NEXT: movdqa %xmm2, %xmm51200; SSE-NEXT: pcmpeqd %xmm4, %xmm51201; SSE-NEXT: pcmpeqd %xmm3, %xmm41202; SSE-NEXT: packssdw %xmm4, %xmm51203; SSE-NEXT: packsswb %xmm5, %xmm51204; SSE-NEXT: pmovmskb %xmm5, %eax1205; SSE-NEXT: testb $1, %al1206; SSE-NEXT: je .LBB4_191207; SSE-NEXT: # %bb.20: # %cond.load231208; SSE-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero1209; SSE-NEXT: testb $2, %al1210; SSE-NEXT: jne .LBB4_221211; SSE-NEXT: jmp .LBB4_231212; SSE-NEXT: .LBB4_15: # %cond.load161213; SSE-NEXT: pinsrd $2, c+12(%rip), %xmm11214; SSE-NEXT: testb $-128, %al1215; SSE-NEXT: jne .LBB4_171216; SSE-NEXT: jmp .LBB4_181217; SSE-NEXT: .LBB4_19:1218; SSE-NEXT: # implicit-def: $xmm41219; SSE-NEXT: testb $2, %al1220; SSE-NEXT: je .LBB4_231221; SSE-NEXT: .LBB4_22: # %cond.load281222; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm41223; SSE-NEXT: .LBB4_23: # %else311224; SSE-NEXT: testb $4, %al1225; SSE-NEXT: jne .LBB4_241226; SSE-NEXT: # %bb.25: # %else361227; SSE-NEXT: testb $8, %al1228; SSE-NEXT: jne .LBB4_261229; SSE-NEXT: .LBB4_27: # %else411230; SSE-NEXT: testb $16, %al1231; SSE-NEXT: je .LBB4_281232; SSE-NEXT: .LBB4_29: # %cond.load431233; SSE-NEXT: pinsrd $0, c+28(%rip), %xmm51234; SSE-NEXT: testb $32, %al1235; SSE-NEXT: jne .LBB4_311236; SSE-NEXT: jmp .LBB4_321237; SSE-NEXT: .LBB4_24: # %cond.load331238; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm41239; SSE-NEXT: testb $8, %al1240; SSE-NEXT: je .LBB4_271241; SSE-NEXT: .LBB4_26: # %cond.load381242; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm41243; SSE-NEXT: testb $16, %al1244; SSE-NEXT: jne .LBB4_291245; SSE-NEXT: .LBB4_28:1246; SSE-NEXT: # implicit-def: $xmm51247; SSE-NEXT: testb $32, %al1248; SSE-NEXT: je .LBB4_321249; SSE-NEXT: .LBB4_31: # %cond.load481250; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm51251; SSE-NEXT: .LBB4_32: # %else511252; SSE-NEXT: testb $64, %al1253; SSE-NEXT: jne .LBB4_331254; SSE-NEXT: # %bb.34: # %else561255; SSE-NEXT: testb $-128, %al1256; SSE-NEXT: je .LBB4_361257; SSE-NEXT: .LBB4_35: # %cond.load581258; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm51259; SSE-NEXT: .LBB4_36: # %else611260; SSE-NEXT: pxor %xmm6, %xmm61261; SSE-NEXT: pcmpeqd %xmm6, %xmm21262; SSE-NEXT: pcmpeqd %xmm6, %xmm31263; SSE-NEXT: packssdw %xmm3, %xmm21264; SSE-NEXT: packsswb %xmm2, %xmm21265; SSE-NEXT: pmovmskb %xmm2, %eax1266; SSE-NEXT: testb $1, %al1267; SSE-NEXT: je .LBB4_371268; SSE-NEXT: # %bb.38: # %cond.load641269; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero1270; SSE-NEXT: testb $2, %al1271; SSE-NEXT: jne .LBB4_401272; SSE-NEXT: jmp .LBB4_411273; SSE-NEXT: .LBB4_33: # %cond.load531274; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm51275; SSE-NEXT: testb $-128, %al1276; SSE-NEXT: jne .LBB4_351277; SSE-NEXT: jmp .LBB4_361278; SSE-NEXT: .LBB4_37:1279; SSE-NEXT: # implicit-def: $xmm21280; SSE-NEXT: testb $2, %al1281; SSE-NEXT: je .LBB4_411282; SSE-NEXT: .LBB4_40: # %cond.load691283; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm21284; SSE-NEXT: .LBB4_41: # %else721285; SSE-NEXT: testb $4, %al1286; SSE-NEXT: jne .LBB4_421287; SSE-NEXT: # %bb.43: # %else771288; SSE-NEXT: testb $8, %al1289; SSE-NEXT: jne .LBB4_441290; SSE-NEXT: .LBB4_45: # %else821291; SSE-NEXT: testb $16, %al1292; SSE-NEXT: je .LBB4_461293; SSE-NEXT: .LBB4_47: # %cond.load841294; SSE-NEXT: pinsrd $0, c+28(%rip), %xmm31295; SSE-NEXT: testb $32, %al1296; SSE-NEXT: jne .LBB4_491297; SSE-NEXT: jmp .LBB4_501298; SSE-NEXT: .LBB4_42: # %cond.load741299; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm21300; SSE-NEXT: testb $8, %al1301; SSE-NEXT: je .LBB4_451302; SSE-NEXT: .LBB4_44: # %cond.load791303; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm21304; SSE-NEXT: testb $16, %al1305; SSE-NEXT: jne .LBB4_471306; SSE-NEXT: .LBB4_46:1307; SSE-NEXT: # implicit-def: $xmm31308; SSE-NEXT: testb $32, %al1309; SSE-NEXT: je .LBB4_501310; SSE-NEXT: .LBB4_49: # %cond.load891311; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm31312; SSE-NEXT: .LBB4_50: # %else921313; SSE-NEXT: testb $64, %al1314; SSE-NEXT: je .LBB4_521315; SSE-NEXT: # %bb.51: # %cond.load941316; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm31317; SSE-NEXT: .LBB4_52: # %else971318; SSE-NEXT: paddd %xmm4, %xmm01319; SSE-NEXT: paddd %xmm5, %xmm11320; SSE-NEXT: testb $-128, %al1321; SSE-NEXT: je .LBB4_541322; SSE-NEXT: # %bb.53: # %cond.load991323; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm31324; SSE-NEXT: .LBB4_54: # %else1021325; SSE-NEXT: paddd %xmm3, %xmm11326; SSE-NEXT: paddd %xmm2, %xmm01327; SSE-NEXT: retq1328;1329; AVX1-LABEL: gather_v8i32_v8i32:1330; AVX1: # %bb.0:1331; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21332; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11333; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm31334; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm11335; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm11336; AVX1-NEXT: vmovmskps %ymm1, %eax1337; AVX1-NEXT: testb $1, %al1338; AVX1-NEXT: # implicit-def: $ymm11339; AVX1-NEXT: jne .LBB4_11340; AVX1-NEXT: # %bb.2: # %else1341; AVX1-NEXT: testb $2, %al1342; AVX1-NEXT: jne .LBB4_31343; AVX1-NEXT: .LBB4_4: # %else21344; AVX1-NEXT: testb $4, %al1345; AVX1-NEXT: jne .LBB4_51346; AVX1-NEXT: .LBB4_6: # %else51347; AVX1-NEXT: testb $8, %al1348; AVX1-NEXT: jne .LBB4_71349; AVX1-NEXT: .LBB4_8: # %else81350; AVX1-NEXT: testb $16, %al1351; AVX1-NEXT: jne .LBB4_91352; AVX1-NEXT: .LBB4_10: # %else111353; AVX1-NEXT: testb $32, %al1354; AVX1-NEXT: jne .LBB4_111355; AVX1-NEXT: .LBB4_12: # %else141356; AVX1-NEXT: testb $64, %al1357; AVX1-NEXT: jne .LBB4_131358; AVX1-NEXT: .LBB4_14: # %else171359; AVX1-NEXT: testb $-128, %al1360; AVX1-NEXT: je .LBB4_161361; AVX1-NEXT: .LBB4_15: # %cond.load191362; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm31363; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5,6],ymm3[7]1364; AVX1-NEXT: .LBB4_16: # %else201365; AVX1-NEXT: vxorps %xmm3, %xmm3, %xmm31366; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm41367; AVX1-NEXT: vpcmpeqd %xmm3, %xmm0, %xmm31368; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31369; AVX1-NEXT: vmovmskps %ymm3, %eax1370; AVX1-NEXT: testb $1, %al1371; AVX1-NEXT: # implicit-def: $ymm31372; AVX1-NEXT: jne .LBB4_171373; AVX1-NEXT: # %bb.18: # %else261374; AVX1-NEXT: testb $2, %al1375; AVX1-NEXT: jne .LBB4_191376; AVX1-NEXT: .LBB4_20: # %else311377; AVX1-NEXT: testb $4, %al1378; AVX1-NEXT: jne .LBB4_211379; AVX1-NEXT: .LBB4_22: # %else361380; AVX1-NEXT: testb $8, %al1381; AVX1-NEXT: jne .LBB4_231382; AVX1-NEXT: .LBB4_24: # %else411383; AVX1-NEXT: testb $16, %al1384; AVX1-NEXT: jne .LBB4_251385; AVX1-NEXT: .LBB4_26: # %else461386; AVX1-NEXT: testb $32, %al1387; AVX1-NEXT: jne .LBB4_271388; AVX1-NEXT: .LBB4_28: # %else511389; AVX1-NEXT: testb $64, %al1390; AVX1-NEXT: jne .LBB4_291391; AVX1-NEXT: .LBB4_30: # %else561392; AVX1-NEXT: testb $-128, %al1393; AVX1-NEXT: je .LBB4_321394; AVX1-NEXT: .LBB4_31: # %cond.load581395; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm41396; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5,6],ymm4[7]1397; AVX1-NEXT: .LBB4_32: # %else611398; AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm41399; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm21400; AVX1-NEXT: vpcmpeqd %xmm4, %xmm0, %xmm01401; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01402; AVX1-NEXT: vmovmskps %ymm0, %eax1403; AVX1-NEXT: testb $1, %al1404; AVX1-NEXT: # implicit-def: $ymm01405; AVX1-NEXT: jne .LBB4_331406; AVX1-NEXT: # %bb.34: # %else671407; AVX1-NEXT: testb $2, %al1408; AVX1-NEXT: jne .LBB4_351409; AVX1-NEXT: .LBB4_36: # %else721410; AVX1-NEXT: testb $4, %al1411; AVX1-NEXT: jne .LBB4_371412; AVX1-NEXT: .LBB4_38: # %else771413; AVX1-NEXT: testb $8, %al1414; AVX1-NEXT: jne .LBB4_391415; AVX1-NEXT: .LBB4_40: # %else821416; AVX1-NEXT: testb $16, %al1417; AVX1-NEXT: je .LBB4_421418; AVX1-NEXT: .LBB4_41: # %cond.load841419; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm21420; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm2[4],ymm0[5,6,7]1421; AVX1-NEXT: .LBB4_42: # %else871422; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm21423; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm41424; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm11425; AVX1-NEXT: testb $32, %al1426; AVX1-NEXT: je .LBB4_441427; AVX1-NEXT: # %bb.43: # %cond.load891428; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm31429; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm3[5],ymm0[6,7]1430; AVX1-NEXT: .LBB4_44: # %else921431; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm21432; AVX1-NEXT: testb $64, %al1433; AVX1-NEXT: je .LBB4_461434; AVX1-NEXT: # %bb.45: # %cond.load941435; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm31436; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm3[6],ymm0[7]1437; AVX1-NEXT: .LBB4_46: # %else971438; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11439; AVX1-NEXT: testb $-128, %al1440; AVX1-NEXT: je .LBB4_481441; AVX1-NEXT: # %bb.47: # %cond.load991442; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm21443; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5,6],ymm2[7]1444; AVX1-NEXT: .LBB4_48: # %else1021445; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21446; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31447; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm21448; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm01449; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01450; AVX1-NEXT: retq1451; AVX1-NEXT: .LBB4_1: # %cond.load1452; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1453; AVX1-NEXT: testb $2, %al1454; AVX1-NEXT: je .LBB4_41455; AVX1-NEXT: .LBB4_3: # %cond.load11456; AVX1-NEXT: vpinsrd $1, c+12(%rip), %xmm1, %xmm31457; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7]1458; AVX1-NEXT: testb $4, %al1459; AVX1-NEXT: je .LBB4_61460; AVX1-NEXT: .LBB4_5: # %cond.load41461; AVX1-NEXT: vpinsrd $2, c+12(%rip), %xmm1, %xmm31462; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7]1463; AVX1-NEXT: testb $8, %al1464; AVX1-NEXT: je .LBB4_81465; AVX1-NEXT: .LBB4_7: # %cond.load71466; AVX1-NEXT: vpinsrd $3, c+12(%rip), %xmm1, %xmm31467; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7]1468; AVX1-NEXT: testb $16, %al1469; AVX1-NEXT: je .LBB4_101470; AVX1-NEXT: .LBB4_9: # %cond.load101471; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm31472; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm3[4],ymm1[5,6,7]1473; AVX1-NEXT: testb $32, %al1474; AVX1-NEXT: je .LBB4_121475; AVX1-NEXT: .LBB4_11: # %cond.load131476; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm31477; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4],ymm3[5],ymm1[6,7]1478; AVX1-NEXT: testb $64, %al1479; AVX1-NEXT: je .LBB4_141480; AVX1-NEXT: .LBB4_13: # %cond.load161481; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm31482; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],ymm3[6],ymm1[7]1483; AVX1-NEXT: testb $-128, %al1484; AVX1-NEXT: jne .LBB4_151485; AVX1-NEXT: jmp .LBB4_161486; AVX1-NEXT: .LBB4_17: # %cond.load231487; AVX1-NEXT: vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero1488; AVX1-NEXT: testb $2, %al1489; AVX1-NEXT: je .LBB4_201490; AVX1-NEXT: .LBB4_19: # %cond.load281491; AVX1-NEXT: vpinsrd $1, c+28(%rip), %xmm3, %xmm41492; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]1493; AVX1-NEXT: testb $4, %al1494; AVX1-NEXT: je .LBB4_221495; AVX1-NEXT: .LBB4_21: # %cond.load331496; AVX1-NEXT: vpinsrd $2, c+28(%rip), %xmm3, %xmm41497; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]1498; AVX1-NEXT: testb $8, %al1499; AVX1-NEXT: je .LBB4_241500; AVX1-NEXT: .LBB4_23: # %cond.load381501; AVX1-NEXT: vpinsrd $3, c+28(%rip), %xmm3, %xmm41502; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]1503; AVX1-NEXT: testb $16, %al1504; AVX1-NEXT: je .LBB4_261505; AVX1-NEXT: .LBB4_25: # %cond.load431506; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm41507; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3],ymm4[4],ymm3[5,6,7]1508; AVX1-NEXT: testb $32, %al1509; AVX1-NEXT: je .LBB4_281510; AVX1-NEXT: .LBB4_27: # %cond.load481511; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm41512; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4],ymm4[5],ymm3[6,7]1513; AVX1-NEXT: testb $64, %al1514; AVX1-NEXT: je .LBB4_301515; AVX1-NEXT: .LBB4_29: # %cond.load531516; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm41517; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm4[6],ymm3[7]1518; AVX1-NEXT: testb $-128, %al1519; AVX1-NEXT: jne .LBB4_311520; AVX1-NEXT: jmp .LBB4_321521; AVX1-NEXT: .LBB4_33: # %cond.load641522; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1523; AVX1-NEXT: testb $2, %al1524; AVX1-NEXT: je .LBB4_361525; AVX1-NEXT: .LBB4_35: # %cond.load691526; AVX1-NEXT: vpinsrd $1, c+28(%rip), %xmm0, %xmm21527; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]1528; AVX1-NEXT: testb $4, %al1529; AVX1-NEXT: je .LBB4_381530; AVX1-NEXT: .LBB4_37: # %cond.load741531; AVX1-NEXT: vpinsrd $2, c+28(%rip), %xmm0, %xmm21532; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]1533; AVX1-NEXT: testb $8, %al1534; AVX1-NEXT: je .LBB4_401535; AVX1-NEXT: .LBB4_39: # %cond.load791536; AVX1-NEXT: vpinsrd $3, c+28(%rip), %xmm0, %xmm21537; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]1538; AVX1-NEXT: testb $16, %al1539; AVX1-NEXT: jne .LBB4_411540; AVX1-NEXT: jmp .LBB4_421541;1542; AVX2-LABEL: gather_v8i32_v8i32:1543; AVX2: # %bb.0:1544; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11545; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm11546; AVX2-NEXT: vmovmskps %ymm1, %eax1547; AVX2-NEXT: testb $1, %al1548; AVX2-NEXT: # implicit-def: $ymm11549; AVX2-NEXT: jne .LBB4_11550; AVX2-NEXT: # %bb.2: # %else1551; AVX2-NEXT: testb $2, %al1552; AVX2-NEXT: jne .LBB4_31553; AVX2-NEXT: .LBB4_4: # %else21554; AVX2-NEXT: testb $4, %al1555; AVX2-NEXT: jne .LBB4_51556; AVX2-NEXT: .LBB4_6: # %else51557; AVX2-NEXT: testb $8, %al1558; AVX2-NEXT: jne .LBB4_71559; AVX2-NEXT: .LBB4_8: # %else81560; AVX2-NEXT: testb $16, %al1561; AVX2-NEXT: jne .LBB4_91562; AVX2-NEXT: .LBB4_10: # %else111563; AVX2-NEXT: testb $32, %al1564; AVX2-NEXT: jne .LBB4_111565; AVX2-NEXT: .LBB4_12: # %else141566; AVX2-NEXT: testb $64, %al1567; AVX2-NEXT: jne .LBB4_131568; AVX2-NEXT: .LBB4_14: # %else171569; AVX2-NEXT: testb $-128, %al1570; AVX2-NEXT: je .LBB4_161571; AVX2-NEXT: .LBB4_15: # %cond.load191572; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm21573; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5,6],ymm2[7]1574; AVX2-NEXT: .LBB4_16: # %else201575; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21576; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm21577; AVX2-NEXT: vmovmskps %ymm2, %eax1578; AVX2-NEXT: testb $1, %al1579; AVX2-NEXT: # implicit-def: $ymm21580; AVX2-NEXT: jne .LBB4_171581; AVX2-NEXT: # %bb.18: # %else261582; AVX2-NEXT: testb $2, %al1583; AVX2-NEXT: jne .LBB4_191584; AVX2-NEXT: .LBB4_20: # %else311585; AVX2-NEXT: testb $4, %al1586; AVX2-NEXT: jne .LBB4_211587; AVX2-NEXT: .LBB4_22: # %else361588; AVX2-NEXT: testb $8, %al1589; AVX2-NEXT: jne .LBB4_231590; AVX2-NEXT: .LBB4_24: # %else411591; AVX2-NEXT: testb $16, %al1592; AVX2-NEXT: jne .LBB4_251593; AVX2-NEXT: .LBB4_26: # %else461594; AVX2-NEXT: testb $32, %al1595; AVX2-NEXT: jne .LBB4_271596; AVX2-NEXT: .LBB4_28: # %else511597; AVX2-NEXT: testb $64, %al1598; AVX2-NEXT: jne .LBB4_291599; AVX2-NEXT: .LBB4_30: # %else561600; AVX2-NEXT: testb $-128, %al1601; AVX2-NEXT: je .LBB4_321602; AVX2-NEXT: .LBB4_31: # %cond.load581603; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm31604; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5,6],ymm3[7]1605; AVX2-NEXT: .LBB4_32: # %else611606; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm31607; AVX2-NEXT: vpcmpeqd %ymm3, %ymm0, %ymm01608; AVX2-NEXT: vmovmskps %ymm0, %eax1609; AVX2-NEXT: testb $1, %al1610; AVX2-NEXT: # implicit-def: $ymm01611; AVX2-NEXT: jne .LBB4_331612; AVX2-NEXT: # %bb.34: # %else671613; AVX2-NEXT: testb $2, %al1614; AVX2-NEXT: jne .LBB4_351615; AVX2-NEXT: .LBB4_36: # %else721616; AVX2-NEXT: testb $4, %al1617; AVX2-NEXT: jne .LBB4_371618; AVX2-NEXT: .LBB4_38: # %else771619; AVX2-NEXT: testb $8, %al1620; AVX2-NEXT: jne .LBB4_391621; AVX2-NEXT: .LBB4_40: # %else821622; AVX2-NEXT: testb $16, %al1623; AVX2-NEXT: jne .LBB4_411624; AVX2-NEXT: .LBB4_42: # %else871625; AVX2-NEXT: testb $32, %al1626; AVX2-NEXT: jne .LBB4_431627; AVX2-NEXT: .LBB4_44: # %else921628; AVX2-NEXT: testb $64, %al1629; AVX2-NEXT: je .LBB4_461630; AVX2-NEXT: .LBB4_45: # %cond.load941631; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm31632; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm3[6],ymm0[7]1633; AVX2-NEXT: .LBB4_46: # %else971634; AVX2-NEXT: vpaddd %ymm2, %ymm1, %ymm11635; AVX2-NEXT: testb $-128, %al1636; AVX2-NEXT: je .LBB4_481637; AVX2-NEXT: # %bb.47: # %cond.load991638; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm21639; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5,6],ymm2[7]1640; AVX2-NEXT: .LBB4_48: # %else1021641; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm01642; AVX2-NEXT: retq1643; AVX2-NEXT: .LBB4_1: # %cond.load1644; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1645; AVX2-NEXT: testb $2, %al1646; AVX2-NEXT: je .LBB4_41647; AVX2-NEXT: .LBB4_3: # %cond.load11648; AVX2-NEXT: vpinsrd $1, c+12(%rip), %xmm1, %xmm21649; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]1650; AVX2-NEXT: testb $4, %al1651; AVX2-NEXT: je .LBB4_61652; AVX2-NEXT: .LBB4_5: # %cond.load41653; AVX2-NEXT: vpinsrd $2, c+12(%rip), %xmm1, %xmm21654; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]1655; AVX2-NEXT: testb $8, %al1656; AVX2-NEXT: je .LBB4_81657; AVX2-NEXT: .LBB4_7: # %cond.load71658; AVX2-NEXT: vpinsrd $3, c+12(%rip), %xmm1, %xmm21659; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]1660; AVX2-NEXT: testb $16, %al1661; AVX2-NEXT: je .LBB4_101662; AVX2-NEXT: .LBB4_9: # %cond.load101663; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm21664; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4],ymm1[5,6,7]1665; AVX2-NEXT: testb $32, %al1666; AVX2-NEXT: je .LBB4_121667; AVX2-NEXT: .LBB4_11: # %cond.load131668; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm21669; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4],ymm2[5],ymm1[6,7]1670; AVX2-NEXT: testb $64, %al1671; AVX2-NEXT: je .LBB4_141672; AVX2-NEXT: .LBB4_13: # %cond.load161673; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm21674; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],ymm2[6],ymm1[7]1675; AVX2-NEXT: testb $-128, %al1676; AVX2-NEXT: jne .LBB4_151677; AVX2-NEXT: jmp .LBB4_161678; AVX2-NEXT: .LBB4_17: # %cond.load231679; AVX2-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero1680; AVX2-NEXT: testb $2, %al1681; AVX2-NEXT: je .LBB4_201682; AVX2-NEXT: .LBB4_19: # %cond.load281683; AVX2-NEXT: vpinsrd $1, c+28(%rip), %xmm2, %xmm31684; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]1685; AVX2-NEXT: testb $4, %al1686; AVX2-NEXT: je .LBB4_221687; AVX2-NEXT: .LBB4_21: # %cond.load331688; AVX2-NEXT: vpinsrd $2, c+28(%rip), %xmm2, %xmm31689; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]1690; AVX2-NEXT: testb $8, %al1691; AVX2-NEXT: je .LBB4_241692; AVX2-NEXT: .LBB4_23: # %cond.load381693; AVX2-NEXT: vpinsrd $3, c+28(%rip), %xmm2, %xmm31694; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]1695; AVX2-NEXT: testb $16, %al1696; AVX2-NEXT: je .LBB4_261697; AVX2-NEXT: .LBB4_25: # %cond.load431698; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm31699; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm3[4],ymm2[5,6,7]1700; AVX2-NEXT: testb $32, %al1701; AVX2-NEXT: je .LBB4_281702; AVX2-NEXT: .LBB4_27: # %cond.load481703; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm31704; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4],ymm3[5],ymm2[6,7]1705; AVX2-NEXT: testb $64, %al1706; AVX2-NEXT: je .LBB4_301707; AVX2-NEXT: .LBB4_29: # %cond.load531708; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm31709; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5],ymm3[6],ymm2[7]1710; AVX2-NEXT: testb $-128, %al1711; AVX2-NEXT: jne .LBB4_311712; AVX2-NEXT: jmp .LBB4_321713; AVX2-NEXT: .LBB4_33: # %cond.load641714; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1715; AVX2-NEXT: testb $2, %al1716; AVX2-NEXT: je .LBB4_361717; AVX2-NEXT: .LBB4_35: # %cond.load691718; AVX2-NEXT: vpinsrd $1, c+28(%rip), %xmm0, %xmm31719; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7]1720; AVX2-NEXT: testb $4, %al1721; AVX2-NEXT: je .LBB4_381722; AVX2-NEXT: .LBB4_37: # %cond.load741723; AVX2-NEXT: vpinsrd $2, c+28(%rip), %xmm0, %xmm31724; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7]1725; AVX2-NEXT: testb $8, %al1726; AVX2-NEXT: je .LBB4_401727; AVX2-NEXT: .LBB4_39: # %cond.load791728; AVX2-NEXT: vpinsrd $3, c+28(%rip), %xmm0, %xmm31729; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7]1730; AVX2-NEXT: testb $16, %al1731; AVX2-NEXT: je .LBB4_421732; AVX2-NEXT: .LBB4_41: # %cond.load841733; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm31734; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm3[4],ymm0[5,6,7]1735; AVX2-NEXT: testb $32, %al1736; AVX2-NEXT: je .LBB4_441737; AVX2-NEXT: .LBB4_43: # %cond.load891738; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm31739; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm3[5],ymm0[6,7]1740; AVX2-NEXT: testb $64, %al1741; AVX2-NEXT: jne .LBB4_451742; AVX2-NEXT: jmp .LBB4_461743;1744; AVX512F-LABEL: gather_v8i32_v8i32:1745; AVX512F: # %bb.0:1746; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01747; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k01748; AVX512F-NEXT: kshiftlw $8, %k0, %k01749; AVX512F-NEXT: kshiftrw $8, %k0, %k11750; AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm01751; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11752; AVX512F-NEXT: kmovw %k1, %k21753; AVX512F-NEXT: vpgatherdd c+12(,%zmm0), %zmm1 {%k2}1754; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm21755; AVX512F-NEXT: vpgatherdd c+28(,%zmm0), %zmm2 {%k1}1756; AVX512F-NEXT: vpaddd %ymm2, %ymm1, %ymm01757; AVX512F-NEXT: vpaddd %ymm2, %ymm0, %ymm01758; AVX512F-NEXT: retq1759;1760; AVX512VL-LABEL: gather_v8i32_v8i32:1761; AVX512VL: # %bb.0:1762; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k11763; AVX512VL-NEXT: vpxor %xmm0, %xmm0, %xmm01764; AVX512VL-NEXT: kmovw %k1, %k21765; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11766; AVX512VL-NEXT: vpgatherdd c+12(,%ymm0), %ymm1 {%k2}1767; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm21768; AVX512VL-NEXT: vpgatherdd c+28(,%ymm0), %ymm2 {%k1}1769; AVX512VL-NEXT: vpaddd %ymm2, %ymm1, %ymm01770; AVX512VL-NEXT: vpaddd %ymm2, %ymm0, %ymm01771; AVX512VL-NEXT: retq1772 %1 = icmp eq <8 x i32> %trigger, zeroinitializer1773 %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, %31776 %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, %51778 ret <8 x i32> %61779}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