5579 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f < %s | FileCheck %s --check-prefixes=ALL,X64,X64-KNL3; RUN: llc -mtriple=i386-unknown-linux-gnu -mattr=+avx512f < %s | FileCheck %s --check-prefixes=ALL,X86,X86-KNL4; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq < %s | FileCheck %s --check-prefixes=ALL,X64,X64-SKX,X64-SKX-SMALL5; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq -code-model=large < %s | FileCheck %s --check-prefixes=ALL,X64,X64-SKX,X64-SKX-LARGE6; RUN: llc -mtriple=i386-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq < %s | FileCheck %s --check-prefixes=ALL,X86,X86-SKX7; RUN: opt -mtriple=x86_64-apple-darwin -passes=scalarize-masked-mem-intrin -mcpu=corei7-avx -S < %s | FileCheck %s -check-prefixes=SCALAR8; RUN: opt -mtriple=x86_64-apple-darwin -passes=scalarize-masked-mem-intrin -mcpu=corei7-avx -S < %s | FileCheck %s -check-prefixes=SCALAR9; RUN: llc -O0 -mtriple=x86_64-unknown-linux-gnu -mcpu=skx < %s -o /dev/null10 11@glob_array = internal unnamed_addr constant [16 x i32] [i32 1, i32 1, i32 2, i32 3, i32 5, i32 8, i32 13, i32 21, i32 34, i32 55, i32 89, i32 144, i32 233, i32 377, i32 610, i32 987], align 1612 13; SCALAR-LABEL: test114; SCALAR: extractelement <16 x ptr>15; SCALAR-NEXT: load float16; SCALAR-NEXT: insertelement <16 x float>17; SCALAR-NEXT: extractelement <16 x ptr>18; SCALAR-NEXT: load float19 20define <16 x float> @test1(ptr %base, <16 x i32> %ind) {21; X64-LABEL: test1:22; X64: # %bb.0:23; X64-NEXT: kxnorw %k0, %k0, %k124; X64-NEXT: vxorps %xmm1, %xmm1, %xmm125; X64-NEXT: vgatherdps (%rdi,%zmm0,4), %zmm1 {%k1}26; X64-NEXT: vmovaps %zmm1, %zmm027; X64-NEXT: retq28;29; X86-LABEL: test1:30; X86: # %bb.0:31; X86-NEXT: movl {{[0-9]+}}(%esp), %eax32; X86-NEXT: kxnorw %k0, %k0, %k133; X86-NEXT: vxorps %xmm1, %xmm1, %xmm134; X86-NEXT: vgatherdps (%eax,%zmm0,4), %zmm1 {%k1}35; X86-NEXT: vmovaps %zmm1, %zmm036; X86-NEXT: retl37 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 038 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer39 40 %sext_ind = sext <16 x i32> %ind to <16 x i64>41 %gep.random = getelementptr float, <16 x ptr> %broadcast.splat, <16 x i64> %sext_ind42 43 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)44 ret <16 x float>%res45}46 47declare <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i32>)48declare <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x float>)49declare <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> , i32, <8 x i1> , <8 x i32> )50 51 52; SCALAR-LABEL: test253; SCALAR: extractelement <16 x ptr>54; SCALAR-NEXT: load float55; SCALAR-NEXT: insertelement <16 x float>56; SCALAR-NEXT: br label %else57; SCALAR: else:58; SCALAR-NEXT: %res.phi.else = phi59; SCALAR-NEXT: and i16 %{{.*}}, 260; SCALAR-NEXT: icmp ne i16 %{{.*}}, 061; SCALAR-NEXT: br i1 %{{.*}}, label %cond.load1, label %else262 63define <16 x float> @test2(ptr %base, <16 x i32> %ind, i16 %mask) {64; X64-LABEL: test2:65; X64: # %bb.0:66; X64-NEXT: kmovw %esi, %k167; X64-NEXT: vxorps %xmm1, %xmm1, %xmm168; X64-NEXT: vgatherdps (%rdi,%zmm0,4), %zmm1 {%k1}69; X64-NEXT: vmovaps %zmm1, %zmm070; X64-NEXT: retq71;72; X86-LABEL: test2:73; X86: # %bb.0:74; X86-NEXT: movl {{[0-9]+}}(%esp), %eax75; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k176; X86-NEXT: vxorps %xmm1, %xmm1, %xmm177; X86-NEXT: vgatherdps (%eax,%zmm0,4), %zmm1 {%k1}78; X86-NEXT: vmovaps %zmm1, %zmm079; X86-NEXT: retl80 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 081 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer82 83 %sext_ind = sext <16 x i32> %ind to <16 x i64>84 %gep.random = getelementptr float, <16 x ptr> %broadcast.splat, <16 x i64> %sext_ind85 %imask = bitcast i16 %mask to <16 x i1>86 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> %imask, <16 x float>undef)87 ret <16 x float> %res88}89 90define <16 x i32> @test3(ptr %base, <16 x i32> %ind, i16 %mask) {91; X64-LABEL: test3:92; X64: # %bb.0:93; X64-NEXT: kmovw %esi, %k194; X64-NEXT: vpxor %xmm1, %xmm1, %xmm195; X64-NEXT: vpgatherdd (%rdi,%zmm0,4), %zmm1 {%k1}96; X64-NEXT: vmovdqa64 %zmm1, %zmm097; X64-NEXT: retq98;99; X86-LABEL: test3:100; X86: # %bb.0:101; X86-NEXT: movl {{[0-9]+}}(%esp), %eax102; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1103; X86-NEXT: vpxor %xmm1, %xmm1, %xmm1104; X86-NEXT: vpgatherdd (%eax,%zmm0,4), %zmm1 {%k1}105; X86-NEXT: vmovdqa64 %zmm1, %zmm0106; X86-NEXT: retl107 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 0108 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer109 110 %sext_ind = sext <16 x i32> %ind to <16 x i64>111 %gep.random = getelementptr i32, <16 x ptr> %broadcast.splat, <16 x i64> %sext_ind112 %imask = bitcast i16 %mask to <16 x i1>113 %res = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> %imask, <16 x i32>undef)114 ret <16 x i32> %res115}116 117 118define <16 x i32> @test4(ptr %base, <16 x i32> %ind, i16 %mask) {119; X64-LABEL: test4:120; X64: # %bb.0:121; X64-NEXT: kmovw %esi, %k1122; X64-NEXT: vpxor %xmm1, %xmm1, %xmm1123; X64-NEXT: kmovw %k1, %k2124; X64-NEXT: vpgatherdd (%rdi,%zmm0,4), %zmm1 {%k2}125; X64-NEXT: vmovdqa64 %zmm1, %zmm2126; X64-NEXT: vpgatherdd (%rdi,%zmm0,4), %zmm2 {%k1}127; X64-NEXT: vpaddd %zmm2, %zmm1, %zmm0128; X64-NEXT: retq129;130; X86-LABEL: test4:131; X86: # %bb.0:132; X86-NEXT: movl {{[0-9]+}}(%esp), %eax133; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1134; X86-NEXT: vpxor %xmm1, %xmm1, %xmm1135; X86-NEXT: kmovw %k1, %k2136; X86-NEXT: vpgatherdd (%eax,%zmm0,4), %zmm1 {%k2}137; X86-NEXT: vmovdqa64 %zmm1, %zmm2138; X86-NEXT: vpgatherdd (%eax,%zmm0,4), %zmm2 {%k1}139; X86-NEXT: vpaddd %zmm2, %zmm1, %zmm0140; X86-NEXT: retl141 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 0142 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer143 144 %gep.random = getelementptr i32, <16 x ptr> %broadcast.splat, <16 x i32> %ind145 %imask = bitcast i16 %mask to <16 x i1>146 %gt1 = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> %imask, <16 x i32>undef)147 %gt2 = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> %imask, <16 x i32>%gt1)148 %res = add <16 x i32> %gt1, %gt2149 ret <16 x i32> %res150}151 152 153; SCALAR-LABEL: test5154; SCALAR: and i16 %scalar_mask, 1155; SCALAR-NEXT: icmp ne i16 %{{.*}}, 0156; SCALAR-NEXT: br i1 %{{.*}}, label %cond.store, label %else157; SCALAR: cond.store:158; SCALAR-NEXT: %Elt0 = extractelement <16 x i32> %val, i64 0159; SCALAR-NEXT: %Ptr0 = extractelement <16 x ptr> %gep.random, i64 0160; SCALAR-NEXT: store i32 %Elt0, ptr %Ptr0, align 4161; SCALAR-NEXT: br label %else162; SCALAR: else:163; SCALAR-NEXT: and i16 %scalar_mask, 2164; SCALAR-NEXT: icmp ne i16 %{{.*}}, 0165; SCALAR-NEXT: br i1 %{{.*}}, label %cond.store1, label %else2166 167define void @test5(ptr %base, <16 x i32> %ind, i16 %mask, <16 x i32>%val) {168; X64-LABEL: test5:169; X64: # %bb.0:170; X64-NEXT: kmovw %esi, %k1171; X64-NEXT: kmovw %k1, %k2172; X64-NEXT: vpscatterdd %zmm1, (%rdi,%zmm0,4) {%k2}173; X64-NEXT: vpscatterdd %zmm1, (%rdi,%zmm0,4) {%k1}174; X64-NEXT: vzeroupper175; X64-NEXT: retq176;177; X86-LABEL: test5:178; X86: # %bb.0:179; X86-NEXT: movl {{[0-9]+}}(%esp), %eax180; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1181; X86-NEXT: kmovw %k1, %k2182; X86-NEXT: vpscatterdd %zmm1, (%eax,%zmm0,4) {%k2}183; X86-NEXT: vpscatterdd %zmm1, (%eax,%zmm0,4) {%k1}184; X86-NEXT: vzeroupper185; X86-NEXT: retl186 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 0187 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer188 189 %gep.random = getelementptr i32, <16 x ptr> %broadcast.splat, <16 x i32> %ind190 %imask = bitcast i16 %mask to <16 x i1>191 call void @llvm.masked.scatter.v16i32.v16p0(<16 x i32>%val, <16 x ptr> %gep.random, i32 4, <16 x i1> %imask)192 call void @llvm.masked.scatter.v16i32.v16p0(<16 x i32>%val, <16 x ptr> %gep.random, i32 4, <16 x i1> %imask)193 ret void194}195 196declare void @llvm.masked.scatter.v8i32.v8p0(<8 x i32> , <8 x ptr> , i32 , <8 x i1> )197declare void @llvm.masked.scatter.v16i32.v16p0(<16 x i32> , <16 x ptr> , i32 , <16 x i1> )198 199 200; SCALAR-LABEL: test6201; SCALAR: store i32 %Elt0, ptr %Ptr01, align 4202; SCALAR-NEXT: %Elt1 = extractelement <8 x i32> %a1, i64 1203; SCALAR-NEXT: %Ptr12 = extractelement <8 x ptr> %ptr, i64 1204; SCALAR-NEXT: store i32 %Elt1, ptr %Ptr12, align 4205; SCALAR-NEXT: %Elt2 = extractelement <8 x i32> %a1, i64 2206; SCALAR-NEXT: %Ptr23 = extractelement <8 x ptr> %ptr, i64 2207; SCALAR-NEXT: store i32 %Elt2, ptr %Ptr23, align 4208 209define <8 x i32> @test6(<8 x i32>%a1, <8 x ptr> %ptr) {210; X64-KNL-LABEL: test6:211; X64-KNL: # %bb.0:212; X64-KNL-NEXT: kxnorw %k0, %k0, %k1213; X64-KNL-NEXT: vpxor %xmm2, %xmm2, %xmm2214; X64-KNL-NEXT: kxnorw %k0, %k0, %k2215; X64-KNL-NEXT: vpgatherqd (,%zmm1), %ymm2 {%k2}216; X64-KNL-NEXT: vpscatterqd %ymm0, (,%zmm1) {%k1}217; X64-KNL-NEXT: vmovdqa %ymm2, %ymm0218; X64-KNL-NEXT: retq219;220; X86-KNL-LABEL: test6:221; X86-KNL: # %bb.0:222; X86-KNL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1223; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0224; X86-KNL-NEXT: vpxor %xmm2, %xmm2, %xmm2225; X86-KNL-NEXT: movw $255, %ax226; X86-KNL-NEXT: kmovw %eax, %k1227; X86-KNL-NEXT: kmovw %k1, %k2228; X86-KNL-NEXT: vpgatherdd (,%zmm1), %zmm2 {%k2}229; X86-KNL-NEXT: vpscatterdd %zmm0, (,%zmm1) {%k1}230; X86-KNL-NEXT: vmovdqa %ymm2, %ymm0231; X86-KNL-NEXT: retl232;233; X64-SKX-LABEL: test6:234; X64-SKX: # %bb.0:235; X64-SKX-NEXT: kxnorb %k0, %k0, %k1236; X64-SKX-NEXT: vpxor %xmm2, %xmm2, %xmm2237; X64-SKX-NEXT: kxnorb %k0, %k0, %k2238; X64-SKX-NEXT: vpgatherqd (,%zmm1), %ymm2 {%k2}239; X64-SKX-NEXT: vpscatterqd %ymm0, (,%zmm1) {%k1}240; X64-SKX-NEXT: vmovdqa %ymm2, %ymm0241; X64-SKX-NEXT: retq242;243; X86-SKX-LABEL: test6:244; X86-SKX: # %bb.0:245; X86-SKX-NEXT: kxnorb %k0, %k0, %k1246; X86-SKX-NEXT: vpxor %xmm2, %xmm2, %xmm2247; X86-SKX-NEXT: kxnorb %k0, %k0, %k2248; X86-SKX-NEXT: vpgatherdd (,%ymm1), %ymm2 {%k2}249; X86-SKX-NEXT: vpscatterdd %ymm0, (,%ymm1) {%k1}250; X86-SKX-NEXT: vmovdqa %ymm2, %ymm0251; X86-SKX-NEXT: retl252 %a = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> %ptr, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef)253 254 call void @llvm.masked.scatter.v8i32.v8p0(<8 x i32> %a1, <8 x ptr> %ptr, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)255 ret <8 x i32>%a256}257 258define <8 x i32> @test7(ptr %base, <8 x i32> %ind, i8 %mask) {259; X64-KNL-LABEL: test7:260; X64-KNL: # %bb.0:261; X64-KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0262; X64-KNL-NEXT: kmovw %esi, %k0263; X64-KNL-NEXT: kshiftlw $8, %k0, %k0264; X64-KNL-NEXT: kshiftrw $8, %k0, %k1265; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1266; X64-KNL-NEXT: kmovw %k1, %k2267; X64-KNL-NEXT: vpgatherdd (%rdi,%zmm0,4), %zmm1 {%k2}268; X64-KNL-NEXT: vmovdqa %ymm1, %ymm2269; X64-KNL-NEXT: vpgatherdd (%rdi,%zmm0,4), %zmm1 {%k1}270; X64-KNL-NEXT: vpaddd %ymm1, %ymm2, %ymm0271; X64-KNL-NEXT: retq272;273; X86-KNL-LABEL: test7:274; X86-KNL: # %bb.0:275; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0276; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax277; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %ecx278; X86-KNL-NEXT: kmovw %ecx, %k0279; X86-KNL-NEXT: kshiftlw $8, %k0, %k0280; X86-KNL-NEXT: kshiftrw $8, %k0, %k1281; X86-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1282; X86-KNL-NEXT: kmovw %k1, %k2283; X86-KNL-NEXT: vpgatherdd (%eax,%zmm0,4), %zmm1 {%k2}284; X86-KNL-NEXT: vmovdqa %ymm1, %ymm2285; X86-KNL-NEXT: vpgatherdd (%eax,%zmm0,4), %zmm1 {%k1}286; X86-KNL-NEXT: vpaddd %ymm1, %ymm2, %ymm0287; X86-KNL-NEXT: retl288;289; X64-SKX-LABEL: test7:290; X64-SKX: # %bb.0:291; X64-SKX-NEXT: kmovw %esi, %k1292; X64-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1293; X64-SKX-NEXT: kmovw %k1, %k2294; X64-SKX-NEXT: vpgatherdd (%rdi,%ymm0,4), %ymm1 {%k2}295; X64-SKX-NEXT: vmovdqa %ymm1, %ymm2296; X64-SKX-NEXT: vpgatherdd (%rdi,%ymm0,4), %ymm2 {%k1}297; X64-SKX-NEXT: vpaddd %ymm2, %ymm1, %ymm0298; X64-SKX-NEXT: retq299;300; X86-SKX-LABEL: test7:301; X86-SKX: # %bb.0:302; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax303; X86-SKX-NEXT: kmovb {{[0-9]+}}(%esp), %k1304; X86-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1305; X86-SKX-NEXT: kmovw %k1, %k2306; X86-SKX-NEXT: vpgatherdd (%eax,%ymm0,4), %ymm1 {%k2}307; X86-SKX-NEXT: vmovdqa %ymm1, %ymm2308; X86-SKX-NEXT: vpgatherdd (%eax,%ymm0,4), %ymm2 {%k1}309; X86-SKX-NEXT: vpaddd %ymm2, %ymm1, %ymm0310; X86-SKX-NEXT: retl311 %broadcast.splatinsert = insertelement <8 x ptr> undef, ptr %base, i32 0312 %broadcast.splat = shufflevector <8 x ptr> %broadcast.splatinsert, <8 x ptr> undef, <8 x i32> zeroinitializer313 314 %gep.random = getelementptr i32, <8 x ptr> %broadcast.splat, <8 x i32> %ind315 %imask = bitcast i8 %mask to <8 x i1>316 %gt1 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> %gep.random, i32 4, <8 x i1> %imask, <8 x i32>undef)317 %gt2 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> %gep.random, i32 4, <8 x i1> %imask, <8 x i32>%gt1)318 %res = add <8 x i32> %gt1, %gt2319 ret <8 x i32> %res320}321 322; No uniform base in this case, index <8 x i64> contains addresses,323; each gather call will be split into two324define <16 x i32> @test8(<16 x ptr> %ptr.random, <16 x i32> %ind, i16 %mask) {325; X64-LABEL: test8:326; X64: # %bb.0:327; X64-NEXT: kmovw %edi, %k1328; X64-NEXT: kshiftrw $8, %k1, %k2329; X64-NEXT: vpxor %xmm2, %xmm2, %xmm2330; X64-NEXT: kmovw %k2, %k3331; X64-NEXT: vpxor %xmm3, %xmm3, %xmm3332; X64-NEXT: vpgatherqd (,%zmm1), %ymm3 {%k3}333; X64-NEXT: kmovw %k1, %k3334; X64-NEXT: vpgatherqd (,%zmm0), %ymm2 {%k3}335; X64-NEXT: vinserti64x4 $1, %ymm3, %zmm2, %zmm4336; X64-NEXT: vpgatherqd (,%zmm1), %ymm3 {%k2}337; X64-NEXT: vpgatherqd (,%zmm0), %ymm2 {%k1}338; X64-NEXT: vinserti64x4 $1, %ymm3, %zmm2, %zmm0339; X64-NEXT: vpaddd %zmm0, %zmm4, %zmm0340; X64-NEXT: retq341;342; X86-LABEL: test8:343; X86: # %bb.0:344; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1345; X86-NEXT: vpxor %xmm1, %xmm1, %xmm1346; X86-NEXT: kmovw %k1, %k2347; X86-NEXT: vpgatherdd (,%zmm0), %zmm1 {%k2}348; X86-NEXT: vmovdqa64 %zmm1, %zmm2349; X86-NEXT: vpgatherdd (,%zmm0), %zmm2 {%k1}350; X86-NEXT: vpaddd %zmm2, %zmm1, %zmm0351; X86-NEXT: retl352 %imask = bitcast i16 %mask to <16 x i1>353 %gt1 = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %ptr.random, i32 4, <16 x i1> %imask, <16 x i32>undef)354 %gt2 = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %ptr.random, i32 4, <16 x i1> %imask, <16 x i32>%gt1)355 %res = add <16 x i32> %gt1, %gt2356 ret <16 x i32> %res357}358 359%struct.RT = type { i8, [10 x [20 x i32]], i8 }360%struct.ST = type { i32, double, %struct.RT }361 362; Masked gather for aggregate types363; Test9 and Test10 should give the same result (scalar and vector indices in GEP)364 365 366define <8 x i32> @test9(ptr %base, <8 x i64> %ind1, <8 x i32>%ind5) {367; X64-KNL-LABEL: test9:368; X64-KNL: # %bb.0: # %entry369; X64-KNL-NEXT: vpbroadcastq %rdi, %zmm2370; X64-KNL-NEXT: vpbroadcastq {{.*#+}} zmm3 = [824,824,824,824,824,824,824,824]371; X64-KNL-NEXT: vpmuludq %zmm3, %zmm0, %zmm4372; X64-KNL-NEXT: vpaddq %zmm4, %zmm2, %zmm2373; X64-KNL-NEXT: vpsrlq $32, %zmm0, %zmm0374; X64-KNL-NEXT: vpmuludq %zmm3, %zmm0, %zmm0375; X64-KNL-NEXT: vpsllq $32, %zmm0, %zmm0376; X64-KNL-NEXT: vpaddq %zmm0, %zmm2, %zmm0377; X64-KNL-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero378; X64-KNL-NEXT: vpmuldq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm1, %zmm1379; X64-KNL-NEXT: vpaddq %zmm1, %zmm0, %zmm1380; X64-KNL-NEXT: kxnorw %k0, %k0, %k1381; X64-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm0382; X64-KNL-NEXT: vpgatherqd 72(,%zmm1), %ymm0 {%k1}383; X64-KNL-NEXT: retq384;385; X86-KNL-LABEL: test9:386; X86-KNL: # %bb.0: # %entry387; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %ymm2388; X86-KNL-NEXT: vpbroadcastd {{.*#+}} ymm3 = [80,80,80,80,80,80,80,80]389; X86-KNL-NEXT: vpmulld %ymm3, %ymm1, %ymm1390; X86-KNL-NEXT: vpmovqd %zmm0, %ymm0391; X86-KNL-NEXT: vpbroadcastd {{.*#+}} ymm3 = [820,820,820,820,820,820,820,820]392; X86-KNL-NEXT: vpmulld %ymm3, %ymm0, %ymm0393; X86-KNL-NEXT: vpaddd %ymm0, %ymm2, %ymm0394; X86-KNL-NEXT: vpaddd %ymm1, %ymm0, %ymm1395; X86-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm0396; X86-KNL-NEXT: movw $255, %ax397; X86-KNL-NEXT: kmovw %eax, %k1398; X86-KNL-NEXT: vpgatherdd 68(,%zmm1), %zmm0 {%k1}399; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0400; X86-KNL-NEXT: retl401;402; X64-SKX-SMALL-LABEL: test9:403; X64-SKX-SMALL: # %bb.0: # %entry404; X64-SKX-SMALL-NEXT: vpbroadcastq %rdi, %zmm2405; X64-SKX-SMALL-NEXT: vpmullq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0406; X64-SKX-SMALL-NEXT: vpaddq %zmm0, %zmm2, %zmm0407; X64-SKX-SMALL-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero408; X64-SKX-SMALL-NEXT: vpmuldq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm1, %zmm1409; X64-SKX-SMALL-NEXT: vpaddq %zmm1, %zmm0, %zmm1410; X64-SKX-SMALL-NEXT: kxnorb %k0, %k0, %k1411; X64-SKX-SMALL-NEXT: vpxor %xmm0, %xmm0, %xmm0412; X64-SKX-SMALL-NEXT: vpgatherqd 72(,%zmm1), %ymm0 {%k1}413; X64-SKX-SMALL-NEXT: retq414;415; X64-SKX-LARGE-LABEL: test9:416; X64-SKX-LARGE: # %bb.0: # %entry417; X64-SKX-LARGE-NEXT: vpbroadcastq %rdi, %zmm2418; X64-SKX-LARGE-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero419; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax420; X64-SKX-LARGE-NEXT: vpmuldq (%rax){1to8}, %zmm1, %zmm1421; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax422; X64-SKX-LARGE-NEXT: vpmullq (%rax){1to8}, %zmm0, %zmm0423; X64-SKX-LARGE-NEXT: vpaddq %zmm0, %zmm2, %zmm0424; X64-SKX-LARGE-NEXT: vpaddq %zmm1, %zmm0, %zmm1425; X64-SKX-LARGE-NEXT: kxnorb %k0, %k0, %k1426; X64-SKX-LARGE-NEXT: vpxor %xmm0, %xmm0, %xmm0427; X64-SKX-LARGE-NEXT: vpgatherqd 72(,%zmm1), %ymm0 {%k1}428; X64-SKX-LARGE-NEXT: retq429;430; X86-SKX-LABEL: test9:431; X86-SKX: # %bb.0: # %entry432; X86-SKX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %ymm1, %ymm1433; X86-SKX-NEXT: vpmovqd %zmm0, %ymm0434; X86-SKX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %ymm0, %ymm0435; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to8}, %ymm0, %ymm0436; X86-SKX-NEXT: vpaddd %ymm1, %ymm0, %ymm1437; X86-SKX-NEXT: kxnorb %k0, %k0, %k1438; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0439; X86-SKX-NEXT: vpgatherdd 68(,%ymm1), %ymm0 {%k1}440; X86-SKX-NEXT: retl441entry:442 %broadcast.splatinsert = insertelement <8 x ptr> undef, ptr %base, i32 0443 %broadcast.splat = shufflevector <8 x ptr> %broadcast.splatinsert, <8 x ptr> undef, <8 x i32> zeroinitializer444 445 %arrayidx = getelementptr %struct.ST, <8 x ptr> %broadcast.splat, <8 x i64> %ind1, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>, <8 x i32><i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, <8 x i32> %ind5, <8 x i64> <i64 13, i64 13, i64 13, i64 13, i64 13, i64 13, i64 13, i64 13>446 %res = call <8 x i32 > @llvm.masked.gather.v8i32.v8p0(<8 x ptr>%arrayidx, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef)447 ret <8 x i32> %res448}449 450define <8 x i32> @test10(ptr %base, <8 x i64> %i1, <8 x i32>%ind5) {451; X64-KNL-LABEL: test10:452; X64-KNL: # %bb.0: # %entry453; X64-KNL-NEXT: vpbroadcastq %rdi, %zmm2454; X64-KNL-NEXT: vpbroadcastq {{.*#+}} zmm3 = [824,824,824,824,824,824,824,824]455; X64-KNL-NEXT: vpmuludq %zmm3, %zmm0, %zmm4456; X64-KNL-NEXT: vpaddq %zmm4, %zmm2, %zmm2457; X64-KNL-NEXT: vpsrlq $32, %zmm0, %zmm0458; X64-KNL-NEXT: vpmuludq %zmm3, %zmm0, %zmm0459; X64-KNL-NEXT: vpsllq $32, %zmm0, %zmm0460; X64-KNL-NEXT: vpaddq %zmm0, %zmm2, %zmm0461; X64-KNL-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero462; X64-KNL-NEXT: vpmuldq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm1, %zmm1463; X64-KNL-NEXT: vpaddq %zmm1, %zmm0, %zmm1464; X64-KNL-NEXT: kxnorw %k0, %k0, %k1465; X64-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm0466; X64-KNL-NEXT: vpgatherqd 72(,%zmm1), %ymm0 {%k1}467; X64-KNL-NEXT: retq468;469; X86-KNL-LABEL: test10:470; X86-KNL: # %bb.0: # %entry471; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %ymm2472; X86-KNL-NEXT: vpbroadcastd {{.*#+}} ymm3 = [80,80,80,80,80,80,80,80]473; X86-KNL-NEXT: vpmulld %ymm3, %ymm1, %ymm1474; X86-KNL-NEXT: vpmovqd %zmm0, %ymm0475; X86-KNL-NEXT: vpbroadcastd {{.*#+}} ymm3 = [820,820,820,820,820,820,820,820]476; X86-KNL-NEXT: vpmulld %ymm3, %ymm0, %ymm0477; X86-KNL-NEXT: vpaddd %ymm0, %ymm2, %ymm0478; X86-KNL-NEXT: vpaddd %ymm1, %ymm0, %ymm1479; X86-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm0480; X86-KNL-NEXT: movw $255, %ax481; X86-KNL-NEXT: kmovw %eax, %k1482; X86-KNL-NEXT: vpgatherdd 68(,%zmm1), %zmm0 {%k1}483; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0484; X86-KNL-NEXT: retl485;486; X64-SKX-SMALL-LABEL: test10:487; X64-SKX-SMALL: # %bb.0: # %entry488; X64-SKX-SMALL-NEXT: vpbroadcastq %rdi, %zmm2489; X64-SKX-SMALL-NEXT: vpmullq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0490; X64-SKX-SMALL-NEXT: vpaddq %zmm0, %zmm2, %zmm0491; X64-SKX-SMALL-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero492; X64-SKX-SMALL-NEXT: vpmuldq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm1, %zmm1493; X64-SKX-SMALL-NEXT: vpaddq %zmm1, %zmm0, %zmm1494; X64-SKX-SMALL-NEXT: kxnorb %k0, %k0, %k1495; X64-SKX-SMALL-NEXT: vpxor %xmm0, %xmm0, %xmm0496; X64-SKX-SMALL-NEXT: vpgatherqd 72(,%zmm1), %ymm0 {%k1}497; X64-SKX-SMALL-NEXT: retq498;499; X64-SKX-LARGE-LABEL: test10:500; X64-SKX-LARGE: # %bb.0: # %entry501; X64-SKX-LARGE-NEXT: vpbroadcastq %rdi, %zmm2502; X64-SKX-LARGE-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero503; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax504; X64-SKX-LARGE-NEXT: vpmuldq (%rax){1to8}, %zmm1, %zmm1505; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax506; X64-SKX-LARGE-NEXT: vpmullq (%rax){1to8}, %zmm0, %zmm0507; X64-SKX-LARGE-NEXT: vpaddq %zmm0, %zmm2, %zmm0508; X64-SKX-LARGE-NEXT: vpaddq %zmm1, %zmm0, %zmm1509; X64-SKX-LARGE-NEXT: kxnorb %k0, %k0, %k1510; X64-SKX-LARGE-NEXT: vpxor %xmm0, %xmm0, %xmm0511; X64-SKX-LARGE-NEXT: vpgatherqd 72(,%zmm1), %ymm0 {%k1}512; X64-SKX-LARGE-NEXT: retq513;514; X86-SKX-LABEL: test10:515; X86-SKX: # %bb.0: # %entry516; X86-SKX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %ymm1, %ymm1517; X86-SKX-NEXT: vpmovqd %zmm0, %ymm0518; X86-SKX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %ymm0, %ymm0519; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to8}, %ymm0, %ymm0520; X86-SKX-NEXT: vpaddd %ymm1, %ymm0, %ymm1521; X86-SKX-NEXT: kxnorb %k0, %k0, %k1522; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0523; X86-SKX-NEXT: vpgatherdd 68(,%ymm1), %ymm0 {%k1}524; X86-SKX-NEXT: retl525entry:526 %broadcast.splatinsert = insertelement <8 x ptr> undef, ptr %base, i32 0527 %broadcast.splat = shufflevector <8 x ptr> %broadcast.splatinsert, <8 x ptr> undef, <8 x i32> zeroinitializer528 529 %arrayidx = getelementptr %struct.ST, <8 x ptr> %broadcast.splat, <8 x i64> %i1, i32 2, i32 1, <8 x i32> %ind5, i64 13530 %res = call <8 x i32 > @llvm.masked.gather.v8i32.v8p0(<8 x ptr>%arrayidx, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef)531 ret <8 x i32> %res532}533 534; Splat index in GEP, requires broadcast535define <16 x float> @test11(ptr %base, i32 %ind) {536; X64-LABEL: test11:537; X64: # %bb.0:538; X64-NEXT: movslq %esi, %rax539; X64-NEXT: leaq (%rdi,%rax,4), %rax540; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1541; X64-NEXT: kxnorw %k0, %k0, %k1542; X64-NEXT: vxorps %xmm0, %xmm0, %xmm0543; X64-NEXT: vgatherdps (%rax,%zmm1,4), %zmm0 {%k1}544; X64-NEXT: retq545;546; X86-LABEL: test11:547; X86: # %bb.0:548; X86-NEXT: movl {{[0-9]+}}(%esp), %eax549; X86-NEXT: shll $2, %eax550; X86-NEXT: addl {{[0-9]+}}(%esp), %eax551; X86-NEXT: vxorps %xmm1, %xmm1, %xmm1552; X86-NEXT: kxnorw %k0, %k0, %k1553; X86-NEXT: vxorps %xmm0, %xmm0, %xmm0554; X86-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}555; X86-NEXT: retl556 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 0557 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer558 559 %gep.random = getelementptr float, <16 x ptr> %broadcast.splat, i32 %ind560 561 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)562 ret <16 x float>%res563}564 565; We are checking the uniform base here. It is taken directly from input to vgatherdps566define <16 x float> @test12(ptr %base, <16 x i32> %ind) {567; X64-LABEL: test12:568; X64: # %bb.0:569; X64-NEXT: kxnorw %k0, %k0, %k1570; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1571; X64-NEXT: vgatherdps (%rdi,%zmm0,4), %zmm1 {%k1}572; X64-NEXT: vmovaps %zmm1, %zmm0573; X64-NEXT: retq574;575; X86-LABEL: test12:576; X86: # %bb.0:577; X86-NEXT: movl {{[0-9]+}}(%esp), %eax578; X86-NEXT: kxnorw %k0, %k0, %k1579; X86-NEXT: vxorps %xmm1, %xmm1, %xmm1580; X86-NEXT: vgatherdps (%eax,%zmm0,4), %zmm1 {%k1}581; X86-NEXT: vmovaps %zmm1, %zmm0582; X86-NEXT: retl583 %sext_ind = sext <16 x i32> %ind to <16 x i64>584 %gep.random = getelementptr float, ptr%base, <16 x i64> %sext_ind585 586 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)587 ret <16 x float>%res588}589 590; The same as the previous, but the mask is undefined591define <16 x float> @test13(ptr %base, <16 x i32> %ind) {592; X64-LABEL: test13:593; X64: # %bb.0:594; X64-NEXT: kxnorw %k0, %k0, %k1595; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1596; X64-NEXT: vgatherdps (%rdi,%zmm0,4), %zmm1 {%k1}597; X64-NEXT: vmovaps %zmm1, %zmm0598; X64-NEXT: retq599;600; X86-LABEL: test13:601; X86: # %bb.0:602; X86-NEXT: movl {{[0-9]+}}(%esp), %eax603; X86-NEXT: kxnorw %k0, %k0, %k1604; X86-NEXT: vxorps %xmm1, %xmm1, %xmm1605; X86-NEXT: vgatherdps (%eax,%zmm0,4), %zmm1 {%k1}606; X86-NEXT: vmovaps %zmm1, %zmm0607; X86-NEXT: retl608 %sext_ind = sext <16 x i32> %ind to <16 x i64>609 %gep.random = getelementptr float, ptr%base, <16 x i64> %sext_ind610 611 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)612 ret <16 x float>%res613}614 615; The base pointer is not splat, can't find unform base616define <16 x float> @test14(ptr %base, i32 %ind, <16 x ptr> %vec) {617; X64-LABEL: test14:618; X64: # %bb.0:619; X64-NEXT: vmovq %xmm0, %rax620; X64-NEXT: vpbroadcastd %esi, %zmm1621; X64-NEXT: kxnorw %k0, %k0, %k1622; X64-NEXT: vpxor %xmm0, %xmm0, %xmm0623; X64-NEXT: vgatherdps (%rax,%zmm1,4), %zmm0 {%k1}624; X64-NEXT: retq625;626; X86-LABEL: test14:627; X86: # %bb.0:628; X86-NEXT: vmovd %xmm0, %eax629; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %zmm1630; X86-NEXT: kxnorw %k0, %k0, %k1631; X86-NEXT: vpxor %xmm0, %xmm0, %xmm0632; X86-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}633; X86-NEXT: retl634 %broadcast.splatinsert = insertelement <16 x ptr> %vec, ptr %base, i32 1635 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer636 637 %gep.random = getelementptr float, <16 x ptr> %broadcast.splat, i32 %ind638 639 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)640 ret <16 x float>%res641}642 643declare <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x float>)644declare <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x double>)645declare <2 x double> @llvm.masked.gather.v2f64.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x double>)646 647; Gather smaller than existing instruction648define <4 x float> @test15(ptr %base, <4 x i32> %ind, <4 x i1> %mask) {649; X64-KNL-LABEL: test15:650; X64-KNL: # %bb.0:651; X64-KNL-NEXT: vpslld $31, %xmm1, %xmm1652; X64-KNL-NEXT: vptestmd %zmm1, %zmm1, %k0653; X64-KNL-NEXT: vpmovsxdq %xmm0, %ymm0654; X64-KNL-NEXT: vpsllq $2, %ymm0, %ymm0655; X64-KNL-NEXT: vmovq %rdi, %xmm1656; X64-KNL-NEXT: vpbroadcastq %xmm1, %ymm1657; X64-KNL-NEXT: vpaddq %ymm0, %ymm1, %ymm1658; X64-KNL-NEXT: kmovw %k0, %eax659; X64-KNL-NEXT: testb $1, %al660; X64-KNL-NEXT: # implicit-def: $xmm0661; X64-KNL-NEXT: je .LBB14_2662; X64-KNL-NEXT: # %bb.1: # %cond.load663; X64-KNL-NEXT: vmovq %xmm1, %rcx664; X64-KNL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero665; X64-KNL-NEXT: .LBB14_2: # %else666; X64-KNL-NEXT: testb $2, %al667; X64-KNL-NEXT: je .LBB14_4668; X64-KNL-NEXT: # %bb.3: # %cond.load1669; X64-KNL-NEXT: vpextrq $1, %xmm1, %rcx670; X64-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]671; X64-KNL-NEXT: .LBB14_4: # %else2672; X64-KNL-NEXT: testb $4, %al673; X64-KNL-NEXT: vextracti128 $1, %ymm1, %xmm1674; X64-KNL-NEXT: jne .LBB14_5675; X64-KNL-NEXT: # %bb.6: # %else5676; X64-KNL-NEXT: testb $8, %al677; X64-KNL-NEXT: jne .LBB14_7678; X64-KNL-NEXT: .LBB14_8: # %else8679; X64-KNL-NEXT: vzeroupper680; X64-KNL-NEXT: retq681; X64-KNL-NEXT: .LBB14_5: # %cond.load4682; X64-KNL-NEXT: vmovq %xmm1, %rcx683; X64-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]684; X64-KNL-NEXT: testb $8, %al685; X64-KNL-NEXT: je .LBB14_8686; X64-KNL-NEXT: .LBB14_7: # %cond.load7687; X64-KNL-NEXT: vpextrq $1, %xmm1, %rax688; X64-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]689; X64-KNL-NEXT: vzeroupper690; X64-KNL-NEXT: retq691;692; X86-KNL-LABEL: test15:693; X86-KNL: # %bb.0:694; X86-KNL-NEXT: vpslld $31, %xmm1, %xmm1695; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k0696; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm0697; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm1698; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm1699; X86-KNL-NEXT: kmovw %k0, %eax700; X86-KNL-NEXT: testb $1, %al701; X86-KNL-NEXT: # implicit-def: $xmm0702; X86-KNL-NEXT: jne .LBB14_1703; X86-KNL-NEXT: # %bb.2: # %else704; X86-KNL-NEXT: testb $2, %al705; X86-KNL-NEXT: jne .LBB14_3706; X86-KNL-NEXT: .LBB14_4: # %else2707; X86-KNL-NEXT: testb $4, %al708; X86-KNL-NEXT: jne .LBB14_5709; X86-KNL-NEXT: .LBB14_6: # %else5710; X86-KNL-NEXT: testb $8, %al711; X86-KNL-NEXT: jne .LBB14_7712; X86-KNL-NEXT: .LBB14_8: # %else8713; X86-KNL-NEXT: vzeroupper714; X86-KNL-NEXT: retl715; X86-KNL-NEXT: .LBB14_1: # %cond.load716; X86-KNL-NEXT: vmovd %xmm1, %ecx717; X86-KNL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero718; X86-KNL-NEXT: testb $2, %al719; X86-KNL-NEXT: je .LBB14_4720; X86-KNL-NEXT: .LBB14_3: # %cond.load1721; X86-KNL-NEXT: vpextrd $1, %xmm1, %ecx722; X86-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]723; X86-KNL-NEXT: testb $4, %al724; X86-KNL-NEXT: je .LBB14_6725; X86-KNL-NEXT: .LBB14_5: # %cond.load4726; X86-KNL-NEXT: vpextrd $2, %xmm1, %ecx727; X86-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]728; X86-KNL-NEXT: testb $8, %al729; X86-KNL-NEXT: je .LBB14_8730; X86-KNL-NEXT: .LBB14_7: # %cond.load7731; X86-KNL-NEXT: vpextrd $3, %xmm1, %eax732; X86-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]733; X86-KNL-NEXT: vzeroupper734; X86-KNL-NEXT: retl735;736; X64-SKX-LABEL: test15:737; X64-SKX: # %bb.0:738; X64-SKX-NEXT: vpslld $31, %xmm1, %xmm1739; X64-SKX-NEXT: vpmovd2m %xmm1, %k1740; X64-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1741; X64-SKX-NEXT: vgatherdps (%rdi,%xmm0,4), %xmm1 {%k1}742; X64-SKX-NEXT: vmovaps %xmm1, %xmm0743; X64-SKX-NEXT: retq744;745; X86-SKX-LABEL: test15:746; X86-SKX: # %bb.0:747; X86-SKX-NEXT: vpslld $31, %xmm1, %xmm1748; X86-SKX-NEXT: vpmovd2m %xmm1, %k1749; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax750; X86-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1751; X86-SKX-NEXT: vgatherdps (%eax,%xmm0,4), %xmm1 {%k1}752; X86-SKX-NEXT: vmovaps %xmm1, %xmm0753; X86-SKX-NEXT: retl754 %sext_ind = sext <4 x i32> %ind to <4 x i64>755 %gep.random = getelementptr float, ptr %base, <4 x i64> %sext_ind756 %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %gep.random, i32 4, <4 x i1> %mask, <4 x float> undef)757 ret <4 x float>%res758}759 760; Gather smaller than existing instruction761define <4 x double> @test16(ptr %base, <4 x i32> %ind, <4 x i1> %mask, <4 x double> %src0) {762; X64-KNL-LABEL: test16:763; X64-KNL: # %bb.0:764; X64-KNL-NEXT: vpslld $31, %xmm1, %xmm1765; X64-KNL-NEXT: vptestmd %zmm1, %zmm1, %k0766; X64-KNL-NEXT: vpmovsxdq %xmm0, %ymm0767; X64-KNL-NEXT: vpsllq $3, %ymm0, %ymm0768; X64-KNL-NEXT: vmovq %rdi, %xmm1769; X64-KNL-NEXT: vpbroadcastq %xmm1, %ymm1770; X64-KNL-NEXT: vpaddq %ymm0, %ymm1, %ymm0771; X64-KNL-NEXT: kmovw %k0, %eax772; X64-KNL-NEXT: testb $1, %al773; X64-KNL-NEXT: je .LBB15_2774; X64-KNL-NEXT: # %bb.1: # %cond.load775; X64-KNL-NEXT: vmovq %xmm0, %rcx776; X64-KNL-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero777; X64-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm1[0,1],ymm2[2,3,4,5,6,7]778; X64-KNL-NEXT: .LBB15_2: # %else779; X64-KNL-NEXT: testb $2, %al780; X64-KNL-NEXT: je .LBB15_4781; X64-KNL-NEXT: # %bb.3: # %cond.load1782; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx783; X64-KNL-NEXT: vmovhps {{.*#+}} xmm1 = xmm2[0,1],mem[0,1]784; X64-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm1[0,1,2,3],ymm2[4,5,6,7]785; X64-KNL-NEXT: .LBB15_4: # %else2786; X64-KNL-NEXT: testb $4, %al787; X64-KNL-NEXT: vextracti128 $1, %ymm0, %xmm0788; X64-KNL-NEXT: jne .LBB15_5789; X64-KNL-NEXT: # %bb.6: # %else5790; X64-KNL-NEXT: testb $8, %al791; X64-KNL-NEXT: jne .LBB15_7792; X64-KNL-NEXT: .LBB15_8: # %else8793; X64-KNL-NEXT: vmovdqa %ymm2, %ymm0794; X64-KNL-NEXT: retq795; X64-KNL-NEXT: .LBB15_5: # %cond.load4796; X64-KNL-NEXT: vmovq %xmm0, %rcx797; X64-KNL-NEXT: vpbroadcastq (%rcx), %ymm1798; X64-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm1[4,5],ymm2[6,7]799; X64-KNL-NEXT: testb $8, %al800; X64-KNL-NEXT: je .LBB15_8801; X64-KNL-NEXT: .LBB15_7: # %cond.load7802; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax803; X64-KNL-NEXT: vpbroadcastq (%rax), %ymm0804; X64-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5],ymm0[6,7]805; X64-KNL-NEXT: vmovdqa %ymm2, %ymm0806; X64-KNL-NEXT: retq807;808; X86-KNL-LABEL: test16:809; X86-KNL: # %bb.0:810; X86-KNL-NEXT: vpslld $31, %xmm1, %xmm1811; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k0812; X86-KNL-NEXT: vpslld $3, %xmm0, %xmm0813; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm1814; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm0815; X86-KNL-NEXT: kmovw %k0, %eax816; X86-KNL-NEXT: testb $1, %al817; X86-KNL-NEXT: jne .LBB15_1818; X86-KNL-NEXT: # %bb.2: # %else819; X86-KNL-NEXT: testb $2, %al820; X86-KNL-NEXT: jne .LBB15_3821; X86-KNL-NEXT: .LBB15_4: # %else2822; X86-KNL-NEXT: testb $4, %al823; X86-KNL-NEXT: jne .LBB15_5824; X86-KNL-NEXT: .LBB15_6: # %else5825; X86-KNL-NEXT: testb $8, %al826; X86-KNL-NEXT: jne .LBB15_7827; X86-KNL-NEXT: .LBB15_8: # %else8828; X86-KNL-NEXT: vmovdqa %ymm2, %ymm0829; X86-KNL-NEXT: retl830; X86-KNL-NEXT: .LBB15_1: # %cond.load831; X86-KNL-NEXT: vmovd %xmm0, %ecx832; X86-KNL-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero833; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm1[0,1],ymm2[2,3,4,5,6,7]834; X86-KNL-NEXT: testb $2, %al835; X86-KNL-NEXT: je .LBB15_4836; X86-KNL-NEXT: .LBB15_3: # %cond.load1837; X86-KNL-NEXT: vpextrd $1, %xmm0, %ecx838; X86-KNL-NEXT: vmovhps {{.*#+}} xmm1 = xmm2[0,1],mem[0,1]839; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm1[0,1,2,3],ymm2[4,5,6,7]840; X86-KNL-NEXT: testb $4, %al841; X86-KNL-NEXT: je .LBB15_6842; X86-KNL-NEXT: .LBB15_5: # %cond.load4843; X86-KNL-NEXT: vpextrd $2, %xmm0, %ecx844; X86-KNL-NEXT: vpbroadcastq (%ecx), %ymm1845; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm1[4,5],ymm2[6,7]846; X86-KNL-NEXT: testb $8, %al847; X86-KNL-NEXT: je .LBB15_8848; X86-KNL-NEXT: .LBB15_7: # %cond.load7849; X86-KNL-NEXT: vpextrd $3, %xmm0, %eax850; X86-KNL-NEXT: vpbroadcastq (%eax), %ymm0851; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5],ymm0[6,7]852; X86-KNL-NEXT: vmovdqa %ymm2, %ymm0853; X86-KNL-NEXT: retl854;855; X64-SKX-LABEL: test16:856; X64-SKX: # %bb.0:857; X64-SKX-NEXT: vpslld $31, %xmm1, %xmm1858; X64-SKX-NEXT: vpmovd2m %xmm1, %k1859; X64-SKX-NEXT: vgatherdpd (%rdi,%xmm0,8), %ymm2 {%k1}860; X64-SKX-NEXT: vmovapd %ymm2, %ymm0861; X64-SKX-NEXT: retq862;863; X86-SKX-LABEL: test16:864; X86-SKX: # %bb.0:865; X86-SKX-NEXT: vpslld $31, %xmm1, %xmm1866; X86-SKX-NEXT: vpmovd2m %xmm1, %k1867; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax868; X86-SKX-NEXT: vgatherdpd (%eax,%xmm0,8), %ymm2 {%k1}869; X86-SKX-NEXT: vmovapd %ymm2, %ymm0870; X86-SKX-NEXT: retl871 %sext_ind = sext <4 x i32> %ind to <4 x i64>872 %gep.random = getelementptr double, ptr %base, <4 x i64> %sext_ind873 %res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep.random, i32 4, <4 x i1> %mask, <4 x double> %src0)874 ret <4 x double>%res875}876 877define <2 x double> @test17(ptr %base, <2 x i32> %ind, <2 x i1> %mask, <2 x double> %src0) {878; X64-KNL-LABEL: test17:879; X64-KNL: # %bb.0:880; X64-KNL-NEXT: vpsllq $63, %xmm1, %xmm1881; X64-KNL-NEXT: vptestmq %zmm1, %zmm1, %k0882; X64-KNL-NEXT: vpmovsxdq %xmm0, %xmm0883; X64-KNL-NEXT: vpsllq $3, %xmm0, %xmm0884; X64-KNL-NEXT: vmovq %rdi, %xmm1885; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm1886; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm0887; X64-KNL-NEXT: kmovw %k0, %eax888; X64-KNL-NEXT: testb $1, %al889; X64-KNL-NEXT: jne .LBB16_1890; X64-KNL-NEXT: # %bb.2: # %else891; X64-KNL-NEXT: testb $2, %al892; X64-KNL-NEXT: jne .LBB16_3893; X64-KNL-NEXT: .LBB16_4: # %else2894; X64-KNL-NEXT: vmovaps %xmm2, %xmm0895; X64-KNL-NEXT: vzeroupper896; X64-KNL-NEXT: retq897; X64-KNL-NEXT: .LBB16_1: # %cond.load898; X64-KNL-NEXT: vmovq %xmm0, %rcx899; X64-KNL-NEXT: vmovlps {{.*#+}} xmm2 = mem[0,1],xmm2[2,3]900; X64-KNL-NEXT: testb $2, %al901; X64-KNL-NEXT: je .LBB16_4902; X64-KNL-NEXT: .LBB16_3: # %cond.load1903; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax904; X64-KNL-NEXT: vmovhps {{.*#+}} xmm2 = xmm2[0,1],mem[0,1]905; X64-KNL-NEXT: vmovaps %xmm2, %xmm0906; X64-KNL-NEXT: vzeroupper907; X64-KNL-NEXT: retq908;909; X86-KNL-LABEL: test17:910; X86-KNL: # %bb.0:911; X86-KNL-NEXT: vpsllq $63, %xmm1, %xmm1912; X86-KNL-NEXT: vptestmq %zmm1, %zmm1, %k0913; X86-KNL-NEXT: vpslld $3, %xmm0, %xmm0914; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm1915; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm0916; X86-KNL-NEXT: kmovw %k0, %eax917; X86-KNL-NEXT: testb $1, %al918; X86-KNL-NEXT: jne .LBB16_1919; X86-KNL-NEXT: # %bb.2: # %else920; X86-KNL-NEXT: testb $2, %al921; X86-KNL-NEXT: jne .LBB16_3922; X86-KNL-NEXT: .LBB16_4: # %else2923; X86-KNL-NEXT: vmovaps %xmm2, %xmm0924; X86-KNL-NEXT: vzeroupper925; X86-KNL-NEXT: retl926; X86-KNL-NEXT: .LBB16_1: # %cond.load927; X86-KNL-NEXT: vmovd %xmm0, %ecx928; X86-KNL-NEXT: vmovlps {{.*#+}} xmm2 = mem[0,1],xmm2[2,3]929; X86-KNL-NEXT: testb $2, %al930; X86-KNL-NEXT: je .LBB16_4931; X86-KNL-NEXT: .LBB16_3: # %cond.load1932; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax933; X86-KNL-NEXT: vmovhps {{.*#+}} xmm2 = xmm2[0,1],mem[0,1]934; X86-KNL-NEXT: vmovaps %xmm2, %xmm0935; X86-KNL-NEXT: vzeroupper936; X86-KNL-NEXT: retl937;938; X64-SKX-LABEL: test17:939; X64-SKX: # %bb.0:940; X64-SKX-NEXT: vpsllq $63, %xmm1, %xmm1941; X64-SKX-NEXT: vpmovq2m %xmm1, %k0942; X64-SKX-NEXT: vpmovsxdq %xmm0, %xmm0943; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm1944; X64-SKX-NEXT: vpsllq $3, %xmm0, %xmm0945; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm0946; X64-SKX-NEXT: kmovw %k0, %eax947; X64-SKX-NEXT: testb $1, %al948; X64-SKX-NEXT: jne .LBB16_1949; X64-SKX-NEXT: # %bb.2: # %else950; X64-SKX-NEXT: testb $2, %al951; X64-SKX-NEXT: jne .LBB16_3952; X64-SKX-NEXT: .LBB16_4: # %else2953; X64-SKX-NEXT: vmovaps %xmm2, %xmm0954; X64-SKX-NEXT: retq955; X64-SKX-NEXT: .LBB16_1: # %cond.load956; X64-SKX-NEXT: vmovq %xmm0, %rcx957; X64-SKX-NEXT: vmovlps {{.*#+}} xmm2 = mem[0,1],xmm2[2,3]958; X64-SKX-NEXT: testb $2, %al959; X64-SKX-NEXT: je .LBB16_4960; X64-SKX-NEXT: .LBB16_3: # %cond.load1961; X64-SKX-NEXT: vpextrq $1, %xmm0, %rax962; X64-SKX-NEXT: vmovhps {{.*#+}} xmm2 = xmm2[0,1],mem[0,1]963; X64-SKX-NEXT: vmovaps %xmm2, %xmm0964; X64-SKX-NEXT: retq965;966; X86-SKX-LABEL: test17:967; X86-SKX: # %bb.0:968; X86-SKX-NEXT: vpsllq $63, %xmm1, %xmm1969; X86-SKX-NEXT: vpmovq2m %xmm1, %k0970; X86-SKX-NEXT: vpslld $3, %xmm0, %xmm0971; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm0972; X86-SKX-NEXT: kmovw %k0, %eax973; X86-SKX-NEXT: testb $1, %al974; X86-SKX-NEXT: jne .LBB16_1975; X86-SKX-NEXT: # %bb.2: # %else976; X86-SKX-NEXT: testb $2, %al977; X86-SKX-NEXT: jne .LBB16_3978; X86-SKX-NEXT: .LBB16_4: # %else2979; X86-SKX-NEXT: vmovaps %xmm2, %xmm0980; X86-SKX-NEXT: retl981; X86-SKX-NEXT: .LBB16_1: # %cond.load982; X86-SKX-NEXT: vmovd %xmm0, %ecx983; X86-SKX-NEXT: vmovlps {{.*#+}} xmm2 = mem[0,1],xmm2[2,3]984; X86-SKX-NEXT: testb $2, %al985; X86-SKX-NEXT: je .LBB16_4986; X86-SKX-NEXT: .LBB16_3: # %cond.load1987; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax988; X86-SKX-NEXT: vmovhps {{.*#+}} xmm2 = xmm2[0,1],mem[0,1]989; X86-SKX-NEXT: vmovaps %xmm2, %xmm0990; X86-SKX-NEXT: retl991 %sext_ind = sext <2 x i32> %ind to <2 x i64>992 %gep.random = getelementptr double, ptr %base, <2 x i64> %sext_ind993 %res = call <2 x double> @llvm.masked.gather.v2f64.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> %mask, <2 x double> %src0)994 ret <2 x double>%res995}996 997declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> , <4 x ptr> , i32 , <4 x i1> )998declare void @llvm.masked.scatter.v4f64.v4p0(<4 x double> , <4 x ptr> , i32 , <4 x i1> )999declare void @llvm.masked.scatter.v2i64.v2p0(<2 x i64> , <2 x ptr> , i32 , <2 x i1> )1000declare void @llvm.masked.scatter.v2i32.v2p0(<2 x i32> , <2 x ptr> , i32 , <2 x i1> )1001declare void @llvm.masked.scatter.v2f32.v2p0(<2 x float> , <2 x ptr> , i32 , <2 x i1> )1002 1003define void @test18(<4 x i32>%a1, <4 x ptr> %ptr, <4 x i1>%mask) {1004; X64-KNL-LABEL: test18:1005; X64-KNL: # %bb.0:1006; X64-KNL-NEXT: vpslld $31, %xmm2, %xmm21007; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k01008; X64-KNL-NEXT: kmovw %k0, %eax1009; X64-KNL-NEXT: testb $1, %al1010; X64-KNL-NEXT: je .LBB17_21011; X64-KNL-NEXT: # %bb.1: # %cond.store1012; X64-KNL-NEXT: vmovq %xmm1, %rcx1013; X64-KNL-NEXT: vmovss %xmm0, (%rcx)1014; X64-KNL-NEXT: .LBB17_2: # %else1015; X64-KNL-NEXT: testb $2, %al1016; X64-KNL-NEXT: je .LBB17_41017; X64-KNL-NEXT: # %bb.3: # %cond.store11018; X64-KNL-NEXT: vpextrq $1, %xmm1, %rcx1019; X64-KNL-NEXT: vextractps $1, %xmm0, (%rcx)1020; X64-KNL-NEXT: .LBB17_4: # %else21021; X64-KNL-NEXT: testb $4, %al1022; X64-KNL-NEXT: vextracti128 $1, %ymm1, %xmm11023; X64-KNL-NEXT: jne .LBB17_51024; X64-KNL-NEXT: # %bb.6: # %else41025; X64-KNL-NEXT: testb $8, %al1026; X64-KNL-NEXT: jne .LBB17_71027; X64-KNL-NEXT: .LBB17_8: # %else61028; X64-KNL-NEXT: vzeroupper1029; X64-KNL-NEXT: retq1030; X64-KNL-NEXT: .LBB17_5: # %cond.store31031; X64-KNL-NEXT: vmovq %xmm1, %rcx1032; X64-KNL-NEXT: vextractps $2, %xmm0, (%rcx)1033; X64-KNL-NEXT: testb $8, %al1034; X64-KNL-NEXT: je .LBB17_81035; X64-KNL-NEXT: .LBB17_7: # %cond.store51036; X64-KNL-NEXT: vpextrq $1, %xmm1, %rax1037; X64-KNL-NEXT: vextractps $3, %xmm0, (%rax)1038; X64-KNL-NEXT: vzeroupper1039; X64-KNL-NEXT: retq1040;1041; X86-KNL-LABEL: test18:1042; X86-KNL: # %bb.0:1043; X86-KNL-NEXT: vpslld $31, %xmm2, %xmm21044; X86-KNL-NEXT: vptestmd %zmm2, %zmm2, %k01045; X86-KNL-NEXT: kmovw %k0, %eax1046; X86-KNL-NEXT: testb $1, %al1047; X86-KNL-NEXT: jne .LBB17_11048; X86-KNL-NEXT: # %bb.2: # %else1049; X86-KNL-NEXT: testb $2, %al1050; X86-KNL-NEXT: jne .LBB17_31051; X86-KNL-NEXT: .LBB17_4: # %else21052; X86-KNL-NEXT: testb $4, %al1053; X86-KNL-NEXT: jne .LBB17_51054; X86-KNL-NEXT: .LBB17_6: # %else41055; X86-KNL-NEXT: testb $8, %al1056; X86-KNL-NEXT: jne .LBB17_71057; X86-KNL-NEXT: .LBB17_8: # %else61058; X86-KNL-NEXT: vzeroupper1059; X86-KNL-NEXT: retl1060; X86-KNL-NEXT: .LBB17_1: # %cond.store1061; X86-KNL-NEXT: vmovd %xmm1, %ecx1062; X86-KNL-NEXT: vmovss %xmm0, (%ecx)1063; X86-KNL-NEXT: testb $2, %al1064; X86-KNL-NEXT: je .LBB17_41065; X86-KNL-NEXT: .LBB17_3: # %cond.store11066; X86-KNL-NEXT: vpextrd $1, %xmm1, %ecx1067; X86-KNL-NEXT: vextractps $1, %xmm0, (%ecx)1068; X86-KNL-NEXT: testb $4, %al1069; X86-KNL-NEXT: je .LBB17_61070; X86-KNL-NEXT: .LBB17_5: # %cond.store31071; X86-KNL-NEXT: vpextrd $2, %xmm1, %ecx1072; X86-KNL-NEXT: vextractps $2, %xmm0, (%ecx)1073; X86-KNL-NEXT: testb $8, %al1074; X86-KNL-NEXT: je .LBB17_81075; X86-KNL-NEXT: .LBB17_7: # %cond.store51076; X86-KNL-NEXT: vpextrd $3, %xmm1, %eax1077; X86-KNL-NEXT: vextractps $3, %xmm0, (%eax)1078; X86-KNL-NEXT: vzeroupper1079; X86-KNL-NEXT: retl1080;1081; X64-SKX-LABEL: test18:1082; X64-SKX: # %bb.0:1083; X64-SKX-NEXT: vpslld $31, %xmm2, %xmm21084; X64-SKX-NEXT: vpmovd2m %xmm2, %k11085; X64-SKX-NEXT: vpscatterqd %xmm0, (,%ymm1) {%k1}1086; X64-SKX-NEXT: vzeroupper1087; X64-SKX-NEXT: retq1088;1089; X86-SKX-LABEL: test18:1090; X86-SKX: # %bb.0:1091; X86-SKX-NEXT: vpslld $31, %xmm2, %xmm21092; X86-SKX-NEXT: vpmovd2m %xmm2, %k11093; X86-SKX-NEXT: vpscatterdd %xmm0, (,%xmm1) {%k1}1094; X86-SKX-NEXT: retl1095 call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %a1, <4 x ptr> %ptr, i32 4, <4 x i1> %mask)1096 ret void1097}1098 1099define void @test19(<4 x double>%a1, ptr %ptr, <4 x i1>%mask, <4 x i64> %ind) {1100; X64-KNL-LABEL: test19:1101; X64-KNL: # %bb.0:1102; X64-KNL-NEXT: vpslld $31, %xmm1, %xmm11103; X64-KNL-NEXT: vptestmd %zmm1, %zmm1, %k01104; X64-KNL-NEXT: vpsllq $3, %ymm2, %ymm11105; X64-KNL-NEXT: vmovq %rdi, %xmm21106; X64-KNL-NEXT: vpbroadcastq %xmm2, %ymm21107; X64-KNL-NEXT: vpaddq %ymm1, %ymm2, %ymm11108; X64-KNL-NEXT: kmovw %k0, %eax1109; X64-KNL-NEXT: testb $1, %al1110; X64-KNL-NEXT: je .LBB18_21111; X64-KNL-NEXT: # %bb.1: # %cond.store1112; X64-KNL-NEXT: vmovq %xmm1, %rcx1113; X64-KNL-NEXT: vmovlps %xmm0, (%rcx)1114; X64-KNL-NEXT: .LBB18_2: # %else1115; X64-KNL-NEXT: testb $2, %al1116; X64-KNL-NEXT: je .LBB18_41117; X64-KNL-NEXT: # %bb.3: # %cond.store11118; X64-KNL-NEXT: vpextrq $1, %xmm1, %rcx1119; X64-KNL-NEXT: vmovhps %xmm0, (%rcx)1120; X64-KNL-NEXT: .LBB18_4: # %else21121; X64-KNL-NEXT: testb $4, %al1122; X64-KNL-NEXT: vextractf128 $1, %ymm0, %xmm01123; X64-KNL-NEXT: vextracti128 $1, %ymm1, %xmm11124; X64-KNL-NEXT: jne .LBB18_51125; X64-KNL-NEXT: # %bb.6: # %else41126; X64-KNL-NEXT: testb $8, %al1127; X64-KNL-NEXT: jne .LBB18_71128; X64-KNL-NEXT: .LBB18_8: # %else61129; X64-KNL-NEXT: vzeroupper1130; X64-KNL-NEXT: retq1131; X64-KNL-NEXT: .LBB18_5: # %cond.store31132; X64-KNL-NEXT: vmovq %xmm1, %rcx1133; X64-KNL-NEXT: vmovlps %xmm0, (%rcx)1134; X64-KNL-NEXT: testb $8, %al1135; X64-KNL-NEXT: je .LBB18_81136; X64-KNL-NEXT: .LBB18_7: # %cond.store51137; X64-KNL-NEXT: vpextrq $1, %xmm1, %rax1138; X64-KNL-NEXT: vmovhps %xmm0, (%rax)1139; X64-KNL-NEXT: vzeroupper1140; X64-KNL-NEXT: retq1141;1142; X86-KNL-LABEL: test19:1143; X86-KNL: # %bb.0:1144; X86-KNL-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm21145; X86-KNL-NEXT: vpslld $31, %xmm1, %xmm11146; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k01147; X86-KNL-NEXT: vpmovqd %zmm2, %ymm11148; X86-KNL-NEXT: vpslld $3, %xmm1, %xmm11149; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm21150; X86-KNL-NEXT: vpaddd %xmm1, %xmm2, %xmm11151; X86-KNL-NEXT: kmovw %k0, %eax1152; X86-KNL-NEXT: testb $1, %al1153; X86-KNL-NEXT: je .LBB18_21154; X86-KNL-NEXT: # %bb.1: # %cond.store1155; X86-KNL-NEXT: vmovd %xmm1, %ecx1156; X86-KNL-NEXT: vmovlps %xmm0, (%ecx)1157; X86-KNL-NEXT: .LBB18_2: # %else1158; X86-KNL-NEXT: testb $2, %al1159; X86-KNL-NEXT: je .LBB18_41160; X86-KNL-NEXT: # %bb.3: # %cond.store11161; X86-KNL-NEXT: vpextrd $1, %xmm1, %ecx1162; X86-KNL-NEXT: vmovhps %xmm0, (%ecx)1163; X86-KNL-NEXT: .LBB18_4: # %else21164; X86-KNL-NEXT: testb $4, %al1165; X86-KNL-NEXT: vextractf128 $1, %ymm0, %xmm01166; X86-KNL-NEXT: jne .LBB18_51167; X86-KNL-NEXT: # %bb.6: # %else41168; X86-KNL-NEXT: testb $8, %al1169; X86-KNL-NEXT: jne .LBB18_71170; X86-KNL-NEXT: .LBB18_8: # %else61171; X86-KNL-NEXT: vzeroupper1172; X86-KNL-NEXT: retl1173; X86-KNL-NEXT: .LBB18_5: # %cond.store31174; X86-KNL-NEXT: vpextrd $2, %xmm1, %ecx1175; X86-KNL-NEXT: vmovlps %xmm0, (%ecx)1176; X86-KNL-NEXT: testb $8, %al1177; X86-KNL-NEXT: je .LBB18_81178; X86-KNL-NEXT: .LBB18_7: # %cond.store51179; X86-KNL-NEXT: vpextrd $3, %xmm1, %eax1180; X86-KNL-NEXT: vmovhps %xmm0, (%eax)1181; X86-KNL-NEXT: vzeroupper1182; X86-KNL-NEXT: retl1183;1184; X64-SKX-LABEL: test19:1185; X64-SKX: # %bb.0:1186; X64-SKX-NEXT: vpslld $31, %xmm1, %xmm11187; X64-SKX-NEXT: vpmovd2m %xmm1, %k11188; X64-SKX-NEXT: vscatterqpd %ymm0, (%rdi,%ymm2,8) {%k1}1189; X64-SKX-NEXT: vzeroupper1190; X64-SKX-NEXT: retq1191;1192; X86-SKX-LABEL: test19:1193; X86-SKX: # %bb.0:1194; X86-SKX-NEXT: vpslld $31, %xmm1, %xmm11195; X86-SKX-NEXT: vpmovd2m %xmm1, %k11196; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax1197; X86-SKX-NEXT: vscatterqpd %ymm0, (%eax,%ymm2,8) {%k1}1198; X86-SKX-NEXT: vzeroupper1199; X86-SKX-NEXT: retl1200 %gep = getelementptr double, ptr %ptr, <4 x i64> %ind1201 call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> %a1, <4 x ptr> %gep, i32 8, <4 x i1> %mask)1202 ret void1203}1204 1205; Data type requires widening1206define void @test20(<2 x float>%a1, <2 x ptr> %ptr, <2 x i1> %mask) {1207; X64-KNL-LABEL: test20:1208; X64-KNL: # %bb.0:1209; X64-KNL-NEXT: vpsllq $63, %xmm2, %xmm21210; X64-KNL-NEXT: vptestmq %zmm2, %zmm2, %k01211; X64-KNL-NEXT: kmovw %k0, %eax1212; X64-KNL-NEXT: testb $1, %al1213; X64-KNL-NEXT: jne .LBB19_11214; X64-KNL-NEXT: # %bb.2: # %else1215; X64-KNL-NEXT: testb $2, %al1216; X64-KNL-NEXT: jne .LBB19_31217; X64-KNL-NEXT: .LBB19_4: # %else21218; X64-KNL-NEXT: vzeroupper1219; X64-KNL-NEXT: retq1220; X64-KNL-NEXT: .LBB19_1: # %cond.store1221; X64-KNL-NEXT: vmovq %xmm1, %rcx1222; X64-KNL-NEXT: vmovd %xmm0, (%rcx)1223; X64-KNL-NEXT: testb $2, %al1224; X64-KNL-NEXT: je .LBB19_41225; X64-KNL-NEXT: .LBB19_3: # %cond.store11226; X64-KNL-NEXT: vpextrq $1, %xmm1, %rax1227; X64-KNL-NEXT: vextractps $1, %xmm0, (%rax)1228; X64-KNL-NEXT: vzeroupper1229; X64-KNL-NEXT: retq1230;1231; X86-KNL-LABEL: test20:1232; X86-KNL: # %bb.0:1233; X86-KNL-NEXT: vpsllq $63, %xmm2, %xmm21234; X86-KNL-NEXT: vptestmq %zmm2, %zmm2, %k01235; X86-KNL-NEXT: kmovw %k0, %eax1236; X86-KNL-NEXT: testb $1, %al1237; X86-KNL-NEXT: jne .LBB19_11238; X86-KNL-NEXT: # %bb.2: # %else1239; X86-KNL-NEXT: testb $2, %al1240; X86-KNL-NEXT: jne .LBB19_31241; X86-KNL-NEXT: .LBB19_4: # %else21242; X86-KNL-NEXT: vzeroupper1243; X86-KNL-NEXT: retl1244; X86-KNL-NEXT: .LBB19_1: # %cond.store1245; X86-KNL-NEXT: vmovd %xmm1, %ecx1246; X86-KNL-NEXT: vmovd %xmm0, (%ecx)1247; X86-KNL-NEXT: testb $2, %al1248; X86-KNL-NEXT: je .LBB19_41249; X86-KNL-NEXT: .LBB19_3: # %cond.store11250; X86-KNL-NEXT: vpextrd $1, %xmm1, %eax1251; X86-KNL-NEXT: vextractps $1, %xmm0, (%eax)1252; X86-KNL-NEXT: vzeroupper1253; X86-KNL-NEXT: retl1254;1255; X64-SKX-LABEL: test20:1256; X64-SKX: # %bb.0:1257; X64-SKX-NEXT: vpsllq $63, %xmm2, %xmm21258; X64-SKX-NEXT: vpmovq2m %xmm2, %k01259; X64-SKX-NEXT: kmovw %k0, %eax1260; X64-SKX-NEXT: testb $1, %al1261; X64-SKX-NEXT: jne .LBB19_11262; X64-SKX-NEXT: # %bb.2: # %else1263; X64-SKX-NEXT: testb $2, %al1264; X64-SKX-NEXT: jne .LBB19_31265; X64-SKX-NEXT: .LBB19_4: # %else21266; X64-SKX-NEXT: retq1267; X64-SKX-NEXT: .LBB19_1: # %cond.store1268; X64-SKX-NEXT: vmovq %xmm1, %rcx1269; X64-SKX-NEXT: vmovd %xmm0, (%rcx)1270; X64-SKX-NEXT: testb $2, %al1271; X64-SKX-NEXT: je .LBB19_41272; X64-SKX-NEXT: .LBB19_3: # %cond.store11273; X64-SKX-NEXT: vpextrq $1, %xmm1, %rax1274; X64-SKX-NEXT: vextractps $1, %xmm0, (%rax)1275; X64-SKX-NEXT: retq1276;1277; X86-SKX-LABEL: test20:1278; X86-SKX: # %bb.0:1279; X86-SKX-NEXT: vpsllq $63, %xmm2, %xmm21280; X86-SKX-NEXT: vpmovq2m %xmm2, %k01281; X86-SKX-NEXT: kmovw %k0, %eax1282; X86-SKX-NEXT: testb $1, %al1283; X86-SKX-NEXT: jne .LBB19_11284; X86-SKX-NEXT: # %bb.2: # %else1285; X86-SKX-NEXT: testb $2, %al1286; X86-SKX-NEXT: jne .LBB19_31287; X86-SKX-NEXT: .LBB19_4: # %else21288; X86-SKX-NEXT: retl1289; X86-SKX-NEXT: .LBB19_1: # %cond.store1290; X86-SKX-NEXT: vmovd %xmm1, %ecx1291; X86-SKX-NEXT: vmovd %xmm0, (%ecx)1292; X86-SKX-NEXT: testb $2, %al1293; X86-SKX-NEXT: je .LBB19_41294; X86-SKX-NEXT: .LBB19_3: # %cond.store11295; X86-SKX-NEXT: vpextrd $1, %xmm1, %eax1296; X86-SKX-NEXT: vextractps $1, %xmm0, (%eax)1297; X86-SKX-NEXT: retl1298 call void @llvm.masked.scatter.v2f32.v2p0(<2 x float> %a1, <2 x ptr> %ptr, i32 4, <2 x i1> %mask)1299 ret void1300}1301 1302; Data type requires promotion1303define void @test21(<2 x i32>%a1, <2 x ptr> %ptr, <2 x i1>%mask) {1304; X64-KNL-LABEL: test21:1305; X64-KNL: # %bb.0:1306; X64-KNL-NEXT: vpsllq $63, %xmm2, %xmm21307; X64-KNL-NEXT: vptestmq %zmm2, %zmm2, %k01308; X64-KNL-NEXT: kmovw %k0, %eax1309; X64-KNL-NEXT: testb $1, %al1310; X64-KNL-NEXT: jne .LBB20_11311; X64-KNL-NEXT: # %bb.2: # %else1312; X64-KNL-NEXT: testb $2, %al1313; X64-KNL-NEXT: jne .LBB20_31314; X64-KNL-NEXT: .LBB20_4: # %else21315; X64-KNL-NEXT: vzeroupper1316; X64-KNL-NEXT: retq1317; X64-KNL-NEXT: .LBB20_1: # %cond.store1318; X64-KNL-NEXT: vmovq %xmm1, %rcx1319; X64-KNL-NEXT: vmovss %xmm0, (%rcx)1320; X64-KNL-NEXT: testb $2, %al1321; X64-KNL-NEXT: je .LBB20_41322; X64-KNL-NEXT: .LBB20_3: # %cond.store11323; X64-KNL-NEXT: vpextrq $1, %xmm1, %rax1324; X64-KNL-NEXT: vextractps $1, %xmm0, (%rax)1325; X64-KNL-NEXT: vzeroupper1326; X64-KNL-NEXT: retq1327;1328; X86-KNL-LABEL: test21:1329; X86-KNL: # %bb.0:1330; X86-KNL-NEXT: vpsllq $63, %xmm2, %xmm21331; X86-KNL-NEXT: vptestmq %zmm2, %zmm2, %k01332; X86-KNL-NEXT: kmovw %k0, %eax1333; X86-KNL-NEXT: testb $1, %al1334; X86-KNL-NEXT: jne .LBB20_11335; X86-KNL-NEXT: # %bb.2: # %else1336; X86-KNL-NEXT: testb $2, %al1337; X86-KNL-NEXT: jne .LBB20_31338; X86-KNL-NEXT: .LBB20_4: # %else21339; X86-KNL-NEXT: vzeroupper1340; X86-KNL-NEXT: retl1341; X86-KNL-NEXT: .LBB20_1: # %cond.store1342; X86-KNL-NEXT: vmovd %xmm1, %ecx1343; X86-KNL-NEXT: vmovss %xmm0, (%ecx)1344; X86-KNL-NEXT: testb $2, %al1345; X86-KNL-NEXT: je .LBB20_41346; X86-KNL-NEXT: .LBB20_3: # %cond.store11347; X86-KNL-NEXT: vpextrd $1, %xmm1, %eax1348; X86-KNL-NEXT: vextractps $1, %xmm0, (%eax)1349; X86-KNL-NEXT: vzeroupper1350; X86-KNL-NEXT: retl1351;1352; X64-SKX-LABEL: test21:1353; X64-SKX: # %bb.0:1354; X64-SKX-NEXT: vpsllq $63, %xmm2, %xmm21355; X64-SKX-NEXT: vpmovq2m %xmm2, %k01356; X64-SKX-NEXT: kmovw %k0, %eax1357; X64-SKX-NEXT: testb $1, %al1358; X64-SKX-NEXT: jne .LBB20_11359; X64-SKX-NEXT: # %bb.2: # %else1360; X64-SKX-NEXT: testb $2, %al1361; X64-SKX-NEXT: jne .LBB20_31362; X64-SKX-NEXT: .LBB20_4: # %else21363; X64-SKX-NEXT: retq1364; X64-SKX-NEXT: .LBB20_1: # %cond.store1365; X64-SKX-NEXT: vmovq %xmm1, %rcx1366; X64-SKX-NEXT: vmovss %xmm0, (%rcx)1367; X64-SKX-NEXT: testb $2, %al1368; X64-SKX-NEXT: je .LBB20_41369; X64-SKX-NEXT: .LBB20_3: # %cond.store11370; X64-SKX-NEXT: vpextrq $1, %xmm1, %rax1371; X64-SKX-NEXT: vextractps $1, %xmm0, (%rax)1372; X64-SKX-NEXT: retq1373;1374; X86-SKX-LABEL: test21:1375; X86-SKX: # %bb.0:1376; X86-SKX-NEXT: vpsllq $63, %xmm2, %xmm21377; X86-SKX-NEXT: vpmovq2m %xmm2, %k01378; X86-SKX-NEXT: kmovw %k0, %eax1379; X86-SKX-NEXT: testb $1, %al1380; X86-SKX-NEXT: jne .LBB20_11381; X86-SKX-NEXT: # %bb.2: # %else1382; X86-SKX-NEXT: testb $2, %al1383; X86-SKX-NEXT: jne .LBB20_31384; X86-SKX-NEXT: .LBB20_4: # %else21385; X86-SKX-NEXT: retl1386; X86-SKX-NEXT: .LBB20_1: # %cond.store1387; X86-SKX-NEXT: vmovd %xmm1, %ecx1388; X86-SKX-NEXT: vmovss %xmm0, (%ecx)1389; X86-SKX-NEXT: testb $2, %al1390; X86-SKX-NEXT: je .LBB20_41391; X86-SKX-NEXT: .LBB20_3: # %cond.store11392; X86-SKX-NEXT: vpextrd $1, %xmm1, %eax1393; X86-SKX-NEXT: vextractps $1, %xmm0, (%eax)1394; X86-SKX-NEXT: retl1395 call void @llvm.masked.scatter.v2i32.v2p0(<2 x i32> %a1, <2 x ptr> %ptr, i32 4, <2 x i1> %mask)1396 ret void1397}1398 1399; The result type requires widening1400declare <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x float>)1401 1402define <2 x float> @test22(ptr %base, <2 x i32> %ind, <2 x i1> %mask, <2 x float> %src0) {1403; X64-KNL-LABEL: test22:1404; X64-KNL: # %bb.0:1405; X64-KNL-NEXT: vpsllq $63, %xmm1, %xmm11406; X64-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01407; X64-KNL-NEXT: vpmovsxdq %xmm0, %xmm01408; X64-KNL-NEXT: vpsllq $2, %xmm0, %xmm01409; X64-KNL-NEXT: vmovq %rdi, %xmm11410; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm11411; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm01412; X64-KNL-NEXT: kmovw %k0, %eax1413; X64-KNL-NEXT: testb $1, %al1414; X64-KNL-NEXT: jne .LBB21_11415; X64-KNL-NEXT: # %bb.2: # %else1416; X64-KNL-NEXT: testb $2, %al1417; X64-KNL-NEXT: jne .LBB21_31418; X64-KNL-NEXT: .LBB21_4: # %else21419; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01420; X64-KNL-NEXT: vzeroupper1421; X64-KNL-NEXT: retq1422; X64-KNL-NEXT: .LBB21_1: # %cond.load1423; X64-KNL-NEXT: vmovq %xmm0, %rcx1424; X64-KNL-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1425; X64-KNL-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1426; X64-KNL-NEXT: testb $2, %al1427; X64-KNL-NEXT: je .LBB21_41428; X64-KNL-NEXT: .LBB21_3: # %cond.load11429; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax1430; X64-KNL-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1431; X64-KNL-NEXT: vmovaps %xmm2, %xmm01432; X64-KNL-NEXT: vzeroupper1433; X64-KNL-NEXT: retq1434;1435; X86-KNL-LABEL: test22:1436; X86-KNL: # %bb.0:1437; X86-KNL-NEXT: vpsllq $63, %xmm1, %xmm11438; X86-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01439; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm01440; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm11441; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm01442; X86-KNL-NEXT: kmovw %k0, %eax1443; X86-KNL-NEXT: testb $1, %al1444; X86-KNL-NEXT: jne .LBB21_11445; X86-KNL-NEXT: # %bb.2: # %else1446; X86-KNL-NEXT: testb $2, %al1447; X86-KNL-NEXT: jne .LBB21_31448; X86-KNL-NEXT: .LBB21_4: # %else21449; X86-KNL-NEXT: vmovdqa %xmm2, %xmm01450; X86-KNL-NEXT: vzeroupper1451; X86-KNL-NEXT: retl1452; X86-KNL-NEXT: .LBB21_1: # %cond.load1453; X86-KNL-NEXT: vmovd %xmm0, %ecx1454; X86-KNL-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1455; X86-KNL-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1456; X86-KNL-NEXT: testb $2, %al1457; X86-KNL-NEXT: je .LBB21_41458; X86-KNL-NEXT: .LBB21_3: # %cond.load11459; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax1460; X86-KNL-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1461; X86-KNL-NEXT: vmovaps %xmm2, %xmm01462; X86-KNL-NEXT: vzeroupper1463; X86-KNL-NEXT: retl1464;1465; X64-SKX-LABEL: test22:1466; X64-SKX: # %bb.0:1467; X64-SKX-NEXT: vpsllq $63, %xmm1, %xmm11468; X64-SKX-NEXT: vpmovq2m %xmm1, %k01469; X64-SKX-NEXT: vpmovsxdq %xmm0, %xmm01470; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm11471; X64-SKX-NEXT: vpsllq $2, %xmm0, %xmm01472; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm01473; X64-SKX-NEXT: kmovw %k0, %eax1474; X64-SKX-NEXT: testb $1, %al1475; X64-SKX-NEXT: jne .LBB21_11476; X64-SKX-NEXT: # %bb.2: # %else1477; X64-SKX-NEXT: testb $2, %al1478; X64-SKX-NEXT: jne .LBB21_31479; X64-SKX-NEXT: .LBB21_4: # %else21480; X64-SKX-NEXT: vmovdqa %xmm2, %xmm01481; X64-SKX-NEXT: retq1482; X64-SKX-NEXT: .LBB21_1: # %cond.load1483; X64-SKX-NEXT: vmovq %xmm0, %rcx1484; X64-SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1485; X64-SKX-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1486; X64-SKX-NEXT: testb $2, %al1487; X64-SKX-NEXT: je .LBB21_41488; X64-SKX-NEXT: .LBB21_3: # %cond.load11489; X64-SKX-NEXT: vpextrq $1, %xmm0, %rax1490; X64-SKX-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1491; X64-SKX-NEXT: vmovaps %xmm2, %xmm01492; X64-SKX-NEXT: retq1493;1494; X86-SKX-LABEL: test22:1495; X86-SKX: # %bb.0:1496; X86-SKX-NEXT: vpsllq $63, %xmm1, %xmm11497; X86-SKX-NEXT: vpmovq2m %xmm1, %k01498; X86-SKX-NEXT: vpslld $2, %xmm0, %xmm01499; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm01500; X86-SKX-NEXT: kmovw %k0, %eax1501; X86-SKX-NEXT: testb $1, %al1502; X86-SKX-NEXT: jne .LBB21_11503; X86-SKX-NEXT: # %bb.2: # %else1504; X86-SKX-NEXT: testb $2, %al1505; X86-SKX-NEXT: jne .LBB21_31506; X86-SKX-NEXT: .LBB21_4: # %else21507; X86-SKX-NEXT: vmovdqa %xmm2, %xmm01508; X86-SKX-NEXT: retl1509; X86-SKX-NEXT: .LBB21_1: # %cond.load1510; X86-SKX-NEXT: vmovd %xmm0, %ecx1511; X86-SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1512; X86-SKX-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1513; X86-SKX-NEXT: testb $2, %al1514; X86-SKX-NEXT: je .LBB21_41515; X86-SKX-NEXT: .LBB21_3: # %cond.load11516; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax1517; X86-SKX-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1518; X86-SKX-NEXT: vmovaps %xmm2, %xmm01519; X86-SKX-NEXT: retl1520 %sext_ind = sext <2 x i32> %ind to <2 x i64>1521 %gep.random = getelementptr float, ptr %base, <2 x i64> %sext_ind1522 %res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> %mask, <2 x float> %src0)1523 ret <2 x float>%res1524}1525 1526define <2 x float> @test22a(ptr %base, <2 x i64> %ind, <2 x i1> %mask, <2 x float> %src0) {1527; X64-KNL-LABEL: test22a:1528; X64-KNL: # %bb.0:1529; X64-KNL-NEXT: vpsllq $63, %xmm1, %xmm11530; X64-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01531; X64-KNL-NEXT: vpsllq $2, %xmm0, %xmm01532; X64-KNL-NEXT: vmovq %rdi, %xmm11533; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm11534; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm01535; X64-KNL-NEXT: kmovw %k0, %eax1536; X64-KNL-NEXT: testb $1, %al1537; X64-KNL-NEXT: jne .LBB22_11538; X64-KNL-NEXT: # %bb.2: # %else1539; X64-KNL-NEXT: testb $2, %al1540; X64-KNL-NEXT: jne .LBB22_31541; X64-KNL-NEXT: .LBB22_4: # %else21542; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01543; X64-KNL-NEXT: vzeroupper1544; X64-KNL-NEXT: retq1545; X64-KNL-NEXT: .LBB22_1: # %cond.load1546; X64-KNL-NEXT: vmovq %xmm0, %rcx1547; X64-KNL-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1548; X64-KNL-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1549; X64-KNL-NEXT: testb $2, %al1550; X64-KNL-NEXT: je .LBB22_41551; X64-KNL-NEXT: .LBB22_3: # %cond.load11552; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax1553; X64-KNL-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1554; X64-KNL-NEXT: vmovaps %xmm2, %xmm01555; X64-KNL-NEXT: vzeroupper1556; X64-KNL-NEXT: retq1557;1558; X86-KNL-LABEL: test22a:1559; X86-KNL: # %bb.0:1560; X86-KNL-NEXT: vpsllq $63, %xmm1, %xmm11561; X86-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01562; X86-KNL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1563; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm01564; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm11565; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm01566; X86-KNL-NEXT: kmovw %k0, %eax1567; X86-KNL-NEXT: testb $1, %al1568; X86-KNL-NEXT: jne .LBB22_11569; X86-KNL-NEXT: # %bb.2: # %else1570; X86-KNL-NEXT: testb $2, %al1571; X86-KNL-NEXT: jne .LBB22_31572; X86-KNL-NEXT: .LBB22_4: # %else21573; X86-KNL-NEXT: vmovdqa %xmm2, %xmm01574; X86-KNL-NEXT: vzeroupper1575; X86-KNL-NEXT: retl1576; X86-KNL-NEXT: .LBB22_1: # %cond.load1577; X86-KNL-NEXT: vmovd %xmm0, %ecx1578; X86-KNL-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1579; X86-KNL-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1580; X86-KNL-NEXT: testb $2, %al1581; X86-KNL-NEXT: je .LBB22_41582; X86-KNL-NEXT: .LBB22_3: # %cond.load11583; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax1584; X86-KNL-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1585; X86-KNL-NEXT: vmovaps %xmm2, %xmm01586; X86-KNL-NEXT: vzeroupper1587; X86-KNL-NEXT: retl1588;1589; X64-SKX-LABEL: test22a:1590; X64-SKX: # %bb.0:1591; X64-SKX-NEXT: vpsllq $63, %xmm1, %xmm11592; X64-SKX-NEXT: vpmovq2m %xmm1, %k01593; X64-SKX-NEXT: vpsllq $2, %xmm0, %xmm01594; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm11595; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm01596; X64-SKX-NEXT: kmovw %k0, %eax1597; X64-SKX-NEXT: testb $1, %al1598; X64-SKX-NEXT: jne .LBB22_11599; X64-SKX-NEXT: # %bb.2: # %else1600; X64-SKX-NEXT: testb $2, %al1601; X64-SKX-NEXT: jne .LBB22_31602; X64-SKX-NEXT: .LBB22_4: # %else21603; X64-SKX-NEXT: vmovdqa %xmm2, %xmm01604; X64-SKX-NEXT: retq1605; X64-SKX-NEXT: .LBB22_1: # %cond.load1606; X64-SKX-NEXT: vmovq %xmm0, %rcx1607; X64-SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1608; X64-SKX-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1609; X64-SKX-NEXT: testb $2, %al1610; X64-SKX-NEXT: je .LBB22_41611; X64-SKX-NEXT: .LBB22_3: # %cond.load11612; X64-SKX-NEXT: vpextrq $1, %xmm0, %rax1613; X64-SKX-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1614; X64-SKX-NEXT: vmovaps %xmm2, %xmm01615; X64-SKX-NEXT: retq1616;1617; X86-SKX-LABEL: test22a:1618; X86-SKX: # %bb.0:1619; X86-SKX-NEXT: vpsllq $63, %xmm1, %xmm11620; X86-SKX-NEXT: vpmovq2m %xmm1, %k01621; X86-SKX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1622; X86-SKX-NEXT: vpslld $2, %xmm0, %xmm01623; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm01624; X86-SKX-NEXT: kmovw %k0, %eax1625; X86-SKX-NEXT: testb $1, %al1626; X86-SKX-NEXT: jne .LBB22_11627; X86-SKX-NEXT: # %bb.2: # %else1628; X86-SKX-NEXT: testb $2, %al1629; X86-SKX-NEXT: jne .LBB22_31630; X86-SKX-NEXT: .LBB22_4: # %else21631; X86-SKX-NEXT: vmovdqa %xmm2, %xmm01632; X86-SKX-NEXT: retl1633; X86-SKX-NEXT: .LBB22_1: # %cond.load1634; X86-SKX-NEXT: vmovd %xmm0, %ecx1635; X86-SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1636; X86-SKX-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1637; X86-SKX-NEXT: testb $2, %al1638; X86-SKX-NEXT: je .LBB22_41639; X86-SKX-NEXT: .LBB22_3: # %cond.load11640; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax1641; X86-SKX-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]1642; X86-SKX-NEXT: vmovaps %xmm2, %xmm01643; X86-SKX-NEXT: retl1644 %gep.random = getelementptr float, ptr %base, <2 x i64> %ind1645 %res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> %mask, <2 x float> %src0)1646 ret <2 x float>%res1647}1648 1649declare <2 x i32> @llvm.masked.gather.v2i32.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x i32>)1650declare <2 x i64> @llvm.masked.gather.v2i64.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x i64>)1651 1652define <2 x i32> @test23(ptr %base, <2 x i32> %ind, <2 x i1> %mask, <2 x i32> %src0) {1653; X64-KNL-LABEL: test23:1654; X64-KNL: # %bb.0:1655; X64-KNL-NEXT: vpsllq $63, %xmm1, %xmm11656; X64-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01657; X64-KNL-NEXT: vpmovsxdq %xmm0, %xmm01658; X64-KNL-NEXT: vpsllq $2, %xmm0, %xmm01659; X64-KNL-NEXT: vmovq %rdi, %xmm11660; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm11661; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm01662; X64-KNL-NEXT: kmovw %k0, %eax1663; X64-KNL-NEXT: testb $1, %al1664; X64-KNL-NEXT: jne .LBB23_11665; X64-KNL-NEXT: # %bb.2: # %else1666; X64-KNL-NEXT: testb $2, %al1667; X64-KNL-NEXT: jne .LBB23_31668; X64-KNL-NEXT: .LBB23_4: # %else21669; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01670; X64-KNL-NEXT: vzeroupper1671; X64-KNL-NEXT: retq1672; X64-KNL-NEXT: .LBB23_1: # %cond.load1673; X64-KNL-NEXT: vmovq %xmm0, %rcx1674; X64-KNL-NEXT: vpinsrd $0, (%rcx), %xmm2, %xmm21675; X64-KNL-NEXT: testb $2, %al1676; X64-KNL-NEXT: je .LBB23_41677; X64-KNL-NEXT: .LBB23_3: # %cond.load11678; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax1679; X64-KNL-NEXT: vpinsrd $1, (%rax), %xmm2, %xmm21680; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01681; X64-KNL-NEXT: vzeroupper1682; X64-KNL-NEXT: retq1683;1684; X86-KNL-LABEL: test23:1685; X86-KNL: # %bb.0:1686; X86-KNL-NEXT: vpsllq $63, %xmm1, %xmm11687; X86-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01688; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm01689; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm11690; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm01691; X86-KNL-NEXT: kmovw %k0, %eax1692; X86-KNL-NEXT: testb $1, %al1693; X86-KNL-NEXT: jne .LBB23_11694; X86-KNL-NEXT: # %bb.2: # %else1695; X86-KNL-NEXT: testb $2, %al1696; X86-KNL-NEXT: jne .LBB23_31697; X86-KNL-NEXT: .LBB23_4: # %else21698; X86-KNL-NEXT: vmovdqa %xmm2, %xmm01699; X86-KNL-NEXT: vzeroupper1700; X86-KNL-NEXT: retl1701; X86-KNL-NEXT: .LBB23_1: # %cond.load1702; X86-KNL-NEXT: vmovd %xmm0, %ecx1703; X86-KNL-NEXT: vpinsrd $0, (%ecx), %xmm2, %xmm21704; X86-KNL-NEXT: testb $2, %al1705; X86-KNL-NEXT: je .LBB23_41706; X86-KNL-NEXT: .LBB23_3: # %cond.load11707; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax1708; X86-KNL-NEXT: vpinsrd $1, (%eax), %xmm2, %xmm21709; X86-KNL-NEXT: vmovdqa %xmm2, %xmm01710; X86-KNL-NEXT: vzeroupper1711; X86-KNL-NEXT: retl1712;1713; X64-SKX-LABEL: test23:1714; X64-SKX: # %bb.0:1715; X64-SKX-NEXT: vpsllq $63, %xmm1, %xmm11716; X64-SKX-NEXT: vpmovq2m %xmm1, %k01717; X64-SKX-NEXT: vpmovsxdq %xmm0, %xmm01718; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm11719; X64-SKX-NEXT: vpsllq $2, %xmm0, %xmm01720; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm01721; X64-SKX-NEXT: kmovw %k0, %eax1722; X64-SKX-NEXT: testb $1, %al1723; X64-SKX-NEXT: jne .LBB23_11724; X64-SKX-NEXT: # %bb.2: # %else1725; X64-SKX-NEXT: testb $2, %al1726; X64-SKX-NEXT: jne .LBB23_31727; X64-SKX-NEXT: .LBB23_4: # %else21728; X64-SKX-NEXT: vmovdqa %xmm2, %xmm01729; X64-SKX-NEXT: retq1730; X64-SKX-NEXT: .LBB23_1: # %cond.load1731; X64-SKX-NEXT: vmovq %xmm0, %rcx1732; X64-SKX-NEXT: vpinsrd $0, (%rcx), %xmm2, %xmm21733; X64-SKX-NEXT: testb $2, %al1734; X64-SKX-NEXT: je .LBB23_41735; X64-SKX-NEXT: .LBB23_3: # %cond.load11736; X64-SKX-NEXT: vpextrq $1, %xmm0, %rax1737; X64-SKX-NEXT: vpinsrd $1, (%rax), %xmm2, %xmm21738; X64-SKX-NEXT: vmovdqa %xmm2, %xmm01739; X64-SKX-NEXT: retq1740;1741; X86-SKX-LABEL: test23:1742; X86-SKX: # %bb.0:1743; X86-SKX-NEXT: vpsllq $63, %xmm1, %xmm11744; X86-SKX-NEXT: vpmovq2m %xmm1, %k01745; X86-SKX-NEXT: vpslld $2, %xmm0, %xmm01746; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm01747; X86-SKX-NEXT: kmovw %k0, %eax1748; X86-SKX-NEXT: testb $1, %al1749; X86-SKX-NEXT: jne .LBB23_11750; X86-SKX-NEXT: # %bb.2: # %else1751; X86-SKX-NEXT: testb $2, %al1752; X86-SKX-NEXT: jne .LBB23_31753; X86-SKX-NEXT: .LBB23_4: # %else21754; X86-SKX-NEXT: vmovdqa %xmm2, %xmm01755; X86-SKX-NEXT: retl1756; X86-SKX-NEXT: .LBB23_1: # %cond.load1757; X86-SKX-NEXT: vmovd %xmm0, %ecx1758; X86-SKX-NEXT: vpinsrd $0, (%ecx), %xmm2, %xmm21759; X86-SKX-NEXT: testb $2, %al1760; X86-SKX-NEXT: je .LBB23_41761; X86-SKX-NEXT: .LBB23_3: # %cond.load11762; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax1763; X86-SKX-NEXT: vpinsrd $1, (%eax), %xmm2, %xmm21764; X86-SKX-NEXT: vmovdqa %xmm2, %xmm01765; X86-SKX-NEXT: retl1766 %sext_ind = sext <2 x i32> %ind to <2 x i64>1767 %gep.random = getelementptr i32, ptr %base, <2 x i64> %sext_ind1768 %res = call <2 x i32> @llvm.masked.gather.v2i32.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> %mask, <2 x i32> %src0)1769 ret <2 x i32>%res1770}1771 1772define <2 x i32> @test23b(ptr %base, <2 x i64> %ind, <2 x i1> %mask, <2 x i32> %src0) {1773; X64-KNL-LABEL: test23b:1774; X64-KNL: # %bb.0:1775; X64-KNL-NEXT: vpsllq $63, %xmm1, %xmm11776; X64-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01777; X64-KNL-NEXT: vpsllq $2, %xmm0, %xmm01778; X64-KNL-NEXT: vmovq %rdi, %xmm11779; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm11780; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm01781; X64-KNL-NEXT: kmovw %k0, %eax1782; X64-KNL-NEXT: testb $1, %al1783; X64-KNL-NEXT: jne .LBB24_11784; X64-KNL-NEXT: # %bb.2: # %else1785; X64-KNL-NEXT: testb $2, %al1786; X64-KNL-NEXT: jne .LBB24_31787; X64-KNL-NEXT: .LBB24_4: # %else21788; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01789; X64-KNL-NEXT: vzeroupper1790; X64-KNL-NEXT: retq1791; X64-KNL-NEXT: .LBB24_1: # %cond.load1792; X64-KNL-NEXT: vmovq %xmm0, %rcx1793; X64-KNL-NEXT: vpinsrd $0, (%rcx), %xmm2, %xmm21794; X64-KNL-NEXT: testb $2, %al1795; X64-KNL-NEXT: je .LBB24_41796; X64-KNL-NEXT: .LBB24_3: # %cond.load11797; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax1798; X64-KNL-NEXT: vpinsrd $1, (%rax), %xmm2, %xmm21799; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01800; X64-KNL-NEXT: vzeroupper1801; X64-KNL-NEXT: retq1802;1803; X86-KNL-LABEL: test23b:1804; X86-KNL: # %bb.0:1805; X86-KNL-NEXT: vpsllq $63, %xmm1, %xmm11806; X86-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01807; X86-KNL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1808; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm01809; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm11810; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm01811; X86-KNL-NEXT: kmovw %k0, %eax1812; X86-KNL-NEXT: testb $1, %al1813; X86-KNL-NEXT: jne .LBB24_11814; X86-KNL-NEXT: # %bb.2: # %else1815; X86-KNL-NEXT: testb $2, %al1816; X86-KNL-NEXT: jne .LBB24_31817; X86-KNL-NEXT: .LBB24_4: # %else21818; X86-KNL-NEXT: vmovdqa %xmm2, %xmm01819; X86-KNL-NEXT: vzeroupper1820; X86-KNL-NEXT: retl1821; X86-KNL-NEXT: .LBB24_1: # %cond.load1822; X86-KNL-NEXT: vmovd %xmm0, %ecx1823; X86-KNL-NEXT: vpinsrd $0, (%ecx), %xmm2, %xmm21824; X86-KNL-NEXT: testb $2, %al1825; X86-KNL-NEXT: je .LBB24_41826; X86-KNL-NEXT: .LBB24_3: # %cond.load11827; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax1828; X86-KNL-NEXT: vpinsrd $1, (%eax), %xmm2, %xmm21829; X86-KNL-NEXT: vmovdqa %xmm2, %xmm01830; X86-KNL-NEXT: vzeroupper1831; X86-KNL-NEXT: retl1832;1833; X64-SKX-LABEL: test23b:1834; X64-SKX: # %bb.0:1835; X64-SKX-NEXT: vpsllq $63, %xmm1, %xmm11836; X64-SKX-NEXT: vpmovq2m %xmm1, %k01837; X64-SKX-NEXT: vpsllq $2, %xmm0, %xmm01838; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm11839; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm01840; X64-SKX-NEXT: kmovw %k0, %eax1841; X64-SKX-NEXT: testb $1, %al1842; X64-SKX-NEXT: jne .LBB24_11843; X64-SKX-NEXT: # %bb.2: # %else1844; X64-SKX-NEXT: testb $2, %al1845; X64-SKX-NEXT: jne .LBB24_31846; X64-SKX-NEXT: .LBB24_4: # %else21847; X64-SKX-NEXT: vmovdqa %xmm2, %xmm01848; X64-SKX-NEXT: retq1849; X64-SKX-NEXT: .LBB24_1: # %cond.load1850; X64-SKX-NEXT: vmovq %xmm0, %rcx1851; X64-SKX-NEXT: vpinsrd $0, (%rcx), %xmm2, %xmm21852; X64-SKX-NEXT: testb $2, %al1853; X64-SKX-NEXT: je .LBB24_41854; X64-SKX-NEXT: .LBB24_3: # %cond.load11855; X64-SKX-NEXT: vpextrq $1, %xmm0, %rax1856; X64-SKX-NEXT: vpinsrd $1, (%rax), %xmm2, %xmm21857; X64-SKX-NEXT: vmovdqa %xmm2, %xmm01858; X64-SKX-NEXT: retq1859;1860; X86-SKX-LABEL: test23b:1861; X86-SKX: # %bb.0:1862; X86-SKX-NEXT: vpsllq $63, %xmm1, %xmm11863; X86-SKX-NEXT: vpmovq2m %xmm1, %k01864; X86-SKX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1865; X86-SKX-NEXT: vpslld $2, %xmm0, %xmm01866; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm01867; X86-SKX-NEXT: kmovw %k0, %eax1868; X86-SKX-NEXT: testb $1, %al1869; X86-SKX-NEXT: jne .LBB24_11870; X86-SKX-NEXT: # %bb.2: # %else1871; X86-SKX-NEXT: testb $2, %al1872; X86-SKX-NEXT: jne .LBB24_31873; X86-SKX-NEXT: .LBB24_4: # %else21874; X86-SKX-NEXT: vmovdqa %xmm2, %xmm01875; X86-SKX-NEXT: retl1876; X86-SKX-NEXT: .LBB24_1: # %cond.load1877; X86-SKX-NEXT: vmovd %xmm0, %ecx1878; X86-SKX-NEXT: vpinsrd $0, (%ecx), %xmm2, %xmm21879; X86-SKX-NEXT: testb $2, %al1880; X86-SKX-NEXT: je .LBB24_41881; X86-SKX-NEXT: .LBB24_3: # %cond.load11882; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax1883; X86-SKX-NEXT: vpinsrd $1, (%eax), %xmm2, %xmm21884; X86-SKX-NEXT: vmovdqa %xmm2, %xmm01885; X86-SKX-NEXT: retl1886 %gep.random = getelementptr i32, ptr %base, <2 x i64> %ind1887 %res = call <2 x i32> @llvm.masked.gather.v2i32.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> %mask, <2 x i32> %src0)1888 ret <2 x i32>%res1889}1890 1891define <2 x i32> @test24(ptr %base, <2 x i32> %ind) {1892; X64-KNL-LABEL: test24:1893; X64-KNL: # %bb.0:1894; X64-KNL-NEXT: vpmovsxdq %xmm0, %xmm01895; X64-KNL-NEXT: vpsllq $2, %xmm0, %xmm01896; X64-KNL-NEXT: vmovq %rdi, %xmm11897; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm11898; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm01899; X64-KNL-NEXT: vmovq %xmm0, %rax1900; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx1901; X64-KNL-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1902; X64-KNL-NEXT: vpinsrd $1, (%rcx), %xmm0, %xmm01903; X64-KNL-NEXT: retq1904;1905; X86-KNL-LABEL: test24:1906; X86-KNL: # %bb.0:1907; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm01908; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm11909; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm01910; X86-KNL-NEXT: vmovd %xmm0, %eax1911; X86-KNL-NEXT: vpextrd $1, %xmm0, %ecx1912; X86-KNL-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1913; X86-KNL-NEXT: vpinsrd $1, (%ecx), %xmm0, %xmm01914; X86-KNL-NEXT: retl1915;1916; X64-SKX-LABEL: test24:1917; X64-SKX: # %bb.0:1918; X64-SKX-NEXT: vpmovsxdq %xmm0, %xmm01919; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm11920; X64-SKX-NEXT: vpsllq $2, %xmm0, %xmm01921; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm01922; X64-SKX-NEXT: vmovq %xmm0, %rax1923; X64-SKX-NEXT: vpextrq $1, %xmm0, %rcx1924; X64-SKX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1925; X64-SKX-NEXT: vpinsrd $1, (%rcx), %xmm0, %xmm01926; X64-SKX-NEXT: retq1927;1928; X86-SKX-LABEL: test24:1929; X86-SKX: # %bb.0:1930; X86-SKX-NEXT: vpslld $2, %xmm0, %xmm01931; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm01932; X86-SKX-NEXT: vmovd %xmm0, %eax1933; X86-SKX-NEXT: vpextrd $1, %xmm0, %ecx1934; X86-SKX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1935; X86-SKX-NEXT: vpinsrd $1, (%ecx), %xmm0, %xmm01936; X86-SKX-NEXT: retl1937 %sext_ind = sext <2 x i32> %ind to <2 x i64>1938 %gep.random = getelementptr i32, ptr %base, <2 x i64> %sext_ind1939 %res = call <2 x i32> @llvm.masked.gather.v2i32.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> <i1 true, i1 true>, <2 x i32> undef)1940 ret <2 x i32>%res1941}1942 1943define <2 x i64> @test25(ptr %base, <2 x i32> %ind, <2 x i1> %mask, <2 x i64> %src0) {1944; X64-KNL-LABEL: test25:1945; X64-KNL: # %bb.0:1946; X64-KNL-NEXT: vpsllq $63, %xmm1, %xmm11947; X64-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01948; X64-KNL-NEXT: vpmovsxdq %xmm0, %xmm01949; X64-KNL-NEXT: vpsllq $3, %xmm0, %xmm01950; X64-KNL-NEXT: vmovq %rdi, %xmm11951; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm11952; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm01953; X64-KNL-NEXT: kmovw %k0, %eax1954; X64-KNL-NEXT: testb $1, %al1955; X64-KNL-NEXT: jne .LBB26_11956; X64-KNL-NEXT: # %bb.2: # %else1957; X64-KNL-NEXT: testb $2, %al1958; X64-KNL-NEXT: jne .LBB26_31959; X64-KNL-NEXT: .LBB26_4: # %else21960; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01961; X64-KNL-NEXT: vzeroupper1962; X64-KNL-NEXT: retq1963; X64-KNL-NEXT: .LBB26_1: # %cond.load1964; X64-KNL-NEXT: vmovq %xmm0, %rcx1965; X64-KNL-NEXT: vpinsrq $0, (%rcx), %xmm2, %xmm21966; X64-KNL-NEXT: testb $2, %al1967; X64-KNL-NEXT: je .LBB26_41968; X64-KNL-NEXT: .LBB26_3: # %cond.load11969; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax1970; X64-KNL-NEXT: vpinsrq $1, (%rax), %xmm2, %xmm21971; X64-KNL-NEXT: vmovdqa %xmm2, %xmm01972; X64-KNL-NEXT: vzeroupper1973; X64-KNL-NEXT: retq1974;1975; X86-KNL-LABEL: test25:1976; X86-KNL: # %bb.0:1977; X86-KNL-NEXT: vpsllq $63, %xmm1, %xmm11978; X86-KNL-NEXT: vptestmq %zmm1, %zmm1, %k01979; X86-KNL-NEXT: vpslld $3, %xmm0, %xmm01980; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm11981; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm01982; X86-KNL-NEXT: kmovw %k0, %eax1983; X86-KNL-NEXT: testb $1, %al1984; X86-KNL-NEXT: jne .LBB26_11985; X86-KNL-NEXT: # %bb.2: # %else1986; X86-KNL-NEXT: testb $2, %al1987; X86-KNL-NEXT: jne .LBB26_31988; X86-KNL-NEXT: .LBB26_4: # %else21989; X86-KNL-NEXT: vmovdqa %xmm2, %xmm01990; X86-KNL-NEXT: vzeroupper1991; X86-KNL-NEXT: retl1992; X86-KNL-NEXT: .LBB26_1: # %cond.load1993; X86-KNL-NEXT: vmovd %xmm0, %ecx1994; X86-KNL-NEXT: vpinsrd $0, (%ecx), %xmm2, %xmm11995; X86-KNL-NEXT: vpinsrd $1, 4(%ecx), %xmm1, %xmm21996; X86-KNL-NEXT: testb $2, %al1997; X86-KNL-NEXT: je .LBB26_41998; X86-KNL-NEXT: .LBB26_3: # %cond.load11999; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax2000; X86-KNL-NEXT: vpinsrd $2, (%eax), %xmm2, %xmm02001; X86-KNL-NEXT: vpinsrd $3, 4(%eax), %xmm0, %xmm22002; X86-KNL-NEXT: vmovdqa %xmm2, %xmm02003; X86-KNL-NEXT: vzeroupper2004; X86-KNL-NEXT: retl2005;2006; X64-SKX-LABEL: test25:2007; X64-SKX: # %bb.0:2008; X64-SKX-NEXT: vpsllq $63, %xmm1, %xmm12009; X64-SKX-NEXT: vpmovq2m %xmm1, %k02010; X64-SKX-NEXT: vpmovsxdq %xmm0, %xmm02011; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm12012; X64-SKX-NEXT: vpsllq $3, %xmm0, %xmm02013; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm02014; X64-SKX-NEXT: kmovw %k0, %eax2015; X64-SKX-NEXT: testb $1, %al2016; X64-SKX-NEXT: jne .LBB26_12017; X64-SKX-NEXT: # %bb.2: # %else2018; X64-SKX-NEXT: testb $2, %al2019; X64-SKX-NEXT: jne .LBB26_32020; X64-SKX-NEXT: .LBB26_4: # %else22021; X64-SKX-NEXT: vmovdqa %xmm2, %xmm02022; X64-SKX-NEXT: retq2023; X64-SKX-NEXT: .LBB26_1: # %cond.load2024; X64-SKX-NEXT: vmovq %xmm0, %rcx2025; X64-SKX-NEXT: vpinsrq $0, (%rcx), %xmm2, %xmm22026; X64-SKX-NEXT: testb $2, %al2027; X64-SKX-NEXT: je .LBB26_42028; X64-SKX-NEXT: .LBB26_3: # %cond.load12029; X64-SKX-NEXT: vpextrq $1, %xmm0, %rax2030; X64-SKX-NEXT: vpinsrq $1, (%rax), %xmm2, %xmm22031; X64-SKX-NEXT: vmovdqa %xmm2, %xmm02032; X64-SKX-NEXT: retq2033;2034; X86-SKX-LABEL: test25:2035; X86-SKX: # %bb.0:2036; X86-SKX-NEXT: vpsllq $63, %xmm1, %xmm12037; X86-SKX-NEXT: vpmovq2m %xmm1, %k02038; X86-SKX-NEXT: vpslld $3, %xmm0, %xmm02039; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm02040; X86-SKX-NEXT: kmovw %k0, %eax2041; X86-SKX-NEXT: testb $1, %al2042; X86-SKX-NEXT: jne .LBB26_12043; X86-SKX-NEXT: # %bb.2: # %else2044; X86-SKX-NEXT: testb $2, %al2045; X86-SKX-NEXT: jne .LBB26_32046; X86-SKX-NEXT: .LBB26_4: # %else22047; X86-SKX-NEXT: vmovdqa %xmm2, %xmm02048; X86-SKX-NEXT: retl2049; X86-SKX-NEXT: .LBB26_1: # %cond.load2050; X86-SKX-NEXT: vmovd %xmm0, %ecx2051; X86-SKX-NEXT: vpinsrd $0, (%ecx), %xmm2, %xmm12052; X86-SKX-NEXT: vpinsrd $1, 4(%ecx), %xmm1, %xmm22053; X86-SKX-NEXT: testb $2, %al2054; X86-SKX-NEXT: je .LBB26_42055; X86-SKX-NEXT: .LBB26_3: # %cond.load12056; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax2057; X86-SKX-NEXT: vpinsrd $2, (%eax), %xmm2, %xmm02058; X86-SKX-NEXT: vpinsrd $3, 4(%eax), %xmm0, %xmm22059; X86-SKX-NEXT: vmovdqa %xmm2, %xmm02060; X86-SKX-NEXT: retl2061 %sext_ind = sext <2 x i32> %ind to <2 x i64>2062 %gep.random = getelementptr i64, ptr %base, <2 x i64> %sext_ind2063 %res = call <2 x i64> @llvm.masked.gather.v2i64.v2p0(<2 x ptr> %gep.random, i32 8, <2 x i1> %mask, <2 x i64> %src0)2064 ret <2 x i64>%res2065}2066 2067define <2 x i64> @test26(ptr %base, <2 x i32> %ind, <2 x i64> %src0) {2068; X64-KNL-LABEL: test26:2069; X64-KNL: # %bb.0:2070; X64-KNL-NEXT: vpmovsxdq %xmm0, %xmm02071; X64-KNL-NEXT: vpsllq $3, %xmm0, %xmm02072; X64-KNL-NEXT: vmovq %rdi, %xmm12073; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm12074; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm02075; X64-KNL-NEXT: vmovq %xmm0, %rax2076; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx2077; X64-KNL-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2078; X64-KNL-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero2079; X64-KNL-NEXT: vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]2080; X64-KNL-NEXT: retq2081;2082; X86-KNL-LABEL: test26:2083; X86-KNL: # %bb.0:2084; X86-KNL-NEXT: vpslld $3, %xmm0, %xmm02085; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm12086; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm02087; X86-KNL-NEXT: vmovd %xmm0, %eax2088; X86-KNL-NEXT: vpextrd $1, %xmm0, %ecx2089; X86-KNL-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2090; X86-KNL-NEXT: vpinsrd $1, 4(%eax), %xmm0, %xmm02091; X86-KNL-NEXT: vpinsrd $2, (%ecx), %xmm0, %xmm02092; X86-KNL-NEXT: vpinsrd $3, 4(%ecx), %xmm0, %xmm02093; X86-KNL-NEXT: retl2094;2095; X64-SKX-LABEL: test26:2096; X64-SKX: # %bb.0:2097; X64-SKX-NEXT: vpmovsxdq %xmm0, %xmm02098; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm12099; X64-SKX-NEXT: vpsllq $3, %xmm0, %xmm02100; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm02101; X64-SKX-NEXT: vmovq %xmm0, %rax2102; X64-SKX-NEXT: vpextrq $1, %xmm0, %rcx2103; X64-SKX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2104; X64-SKX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero2105; X64-SKX-NEXT: vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]2106; X64-SKX-NEXT: retq2107;2108; X86-SKX-LABEL: test26:2109; X86-SKX: # %bb.0:2110; X86-SKX-NEXT: vpslld $3, %xmm0, %xmm02111; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm02112; X86-SKX-NEXT: vmovd %xmm0, %eax2113; X86-SKX-NEXT: vpextrd $1, %xmm0, %ecx2114; X86-SKX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2115; X86-SKX-NEXT: vpinsrd $1, 4(%eax), %xmm0, %xmm02116; X86-SKX-NEXT: vpinsrd $2, (%ecx), %xmm0, %xmm02117; X86-SKX-NEXT: vpinsrd $3, 4(%ecx), %xmm0, %xmm02118; X86-SKX-NEXT: retl2119 %sext_ind = sext <2 x i32> %ind to <2 x i64>2120 %gep.random = getelementptr i64, ptr %base, <2 x i64> %sext_ind2121 %res = call <2 x i64> @llvm.masked.gather.v2i64.v2p0(<2 x ptr> %gep.random, i32 8, <2 x i1> <i1 true, i1 true>, <2 x i64> %src0)2122 ret <2 x i64>%res2123}2124 2125; Result type requires widening; all-ones mask2126define <2 x float> @test27(ptr %base, <2 x i32> %ind) {2127; X64-KNL-LABEL: test27:2128; X64-KNL: # %bb.0:2129; X64-KNL-NEXT: vpmovsxdq %xmm0, %xmm02130; X64-KNL-NEXT: vpsllq $2, %xmm0, %xmm02131; X64-KNL-NEXT: vmovq %rdi, %xmm12132; X64-KNL-NEXT: vpbroadcastq %xmm1, %xmm12133; X64-KNL-NEXT: vpaddq %xmm0, %xmm1, %xmm02134; X64-KNL-NEXT: vmovq %xmm0, %rax2135; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx2136; X64-KNL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2137; X64-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]2138; X64-KNL-NEXT: retq2139;2140; X86-KNL-LABEL: test27:2141; X86-KNL: # %bb.0:2142; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm02143; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm12144; X86-KNL-NEXT: vpaddd %xmm0, %xmm1, %xmm02145; X86-KNL-NEXT: vmovd %xmm0, %eax2146; X86-KNL-NEXT: vpextrd $1, %xmm0, %ecx2147; X86-KNL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2148; X86-KNL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]2149; X86-KNL-NEXT: retl2150;2151; X64-SKX-LABEL: test27:2152; X64-SKX: # %bb.0:2153; X64-SKX-NEXT: vpmovsxdq %xmm0, %xmm02154; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm12155; X64-SKX-NEXT: vpsllq $2, %xmm0, %xmm02156; X64-SKX-NEXT: vpaddq %xmm0, %xmm1, %xmm02157; X64-SKX-NEXT: vmovq %xmm0, %rax2158; X64-SKX-NEXT: vpextrq $1, %xmm0, %rcx2159; X64-SKX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2160; X64-SKX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]2161; X64-SKX-NEXT: retq2162;2163; X86-SKX-LABEL: test27:2164; X86-SKX: # %bb.0:2165; X86-SKX-NEXT: vpslld $2, %xmm0, %xmm02166; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm02167; X86-SKX-NEXT: vmovd %xmm0, %eax2168; X86-SKX-NEXT: vpextrd $1, %xmm0, %ecx2169; X86-SKX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2170; X86-SKX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]2171; X86-SKX-NEXT: retl2172 %sext_ind = sext <2 x i32> %ind to <2 x i64>2173 %gep.random = getelementptr float, ptr %base, <2 x i64> %sext_ind2174 %res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> <i1 true, i1 true>, <2 x float> undef)2175 ret <2 x float>%res2176}2177 2178; Data type requires promotion, mask is all-ones2179define void @test28(<2 x i32>%a1, <2 x ptr> %ptr) {2180; X64-LABEL: test28:2181; X64: # %bb.0:2182; X64-NEXT: vmovq %xmm1, %rax2183; X64-NEXT: vmovss %xmm0, (%rax)2184; X64-NEXT: vpextrq $1, %xmm1, %rax2185; X64-NEXT: vextractps $1, %xmm0, (%rax)2186; X64-NEXT: retq2187;2188; X86-LABEL: test28:2189; X86: # %bb.0:2190; X86-NEXT: vmovd %xmm1, %eax2191; X86-NEXT: vmovss %xmm0, (%eax)2192; X86-NEXT: vpextrd $1, %xmm1, %eax2193; X86-NEXT: vextractps $1, %xmm0, (%eax)2194; X86-NEXT: retl2195 call void @llvm.masked.scatter.v2i32.v2p0(<2 x i32> %a1, <2 x ptr> %ptr, i32 4, <2 x i1> <i1 true, i1 true>)2196 ret void2197}2198 2199; SCALAR-LABEL: test292200; SCALAR: extractelement <16 x ptr>2201; SCALAR-NEXT: load float2202; SCALAR-NEXT: insertelement <16 x float>2203; SCALAR-NEXT: extractelement <16 x ptr>2204; SCALAR-NEXT: load float2205 2206define <16 x float> @test29(ptr %base, <16 x i32> %ind) {2207; X64-LABEL: test29:2208; X64: # %bb.0:2209; X64-NEXT: vxorps %xmm1, %xmm1, %xmm12210; X64-NEXT: movw $44, %ax2211; X64-NEXT: kmovw %eax, %k12212; X64-NEXT: vgatherdps (%rdi,%zmm0,4), %zmm1 {%k1}2213; X64-NEXT: vmovaps %zmm1, %zmm02214; X64-NEXT: retq2215;2216; X86-LABEL: test29:2217; X86: # %bb.0:2218; X86-NEXT: movl {{[0-9]+}}(%esp), %eax2219; X86-NEXT: vxorps %xmm1, %xmm1, %xmm12220; X86-NEXT: movw $44, %cx2221; X86-NEXT: kmovw %ecx, %k12222; X86-NEXT: vgatherdps (%eax,%zmm0,4), %zmm1 {%k1}2223; X86-NEXT: vmovaps %zmm1, %zmm02224; X86-NEXT: retl2225 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 02226 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer2227 2228 %sext_ind = sext <16 x i32> %ind to <16 x i64>2229 %gep.random = getelementptr float, <16 x ptr> %broadcast.splat, <16 x i64> %sext_ind2230 2231 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 false, i1 false, i1 true, i1 true, i1 false, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <16 x float> undef)2232 ret <16 x float>%res2233}2234 2235declare <3 x i32> @llvm.masked.gather.v3i32.v3p0(<3 x ptr>, i32, <3 x i1>, <3 x i32>)2236define <3 x i32> @test30(<3 x ptr> %base, <3 x i32> %ind, <3 x i1> %mask, <3 x i32> %src0) {2237; X64-KNL-LABEL: test30:2238; X64-KNL: # %bb.0:2239; X64-KNL-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm22240; X64-KNL-NEXT: andl $1, %edi2241; X64-KNL-NEXT: kmovw %edi, %k02242; X64-KNL-NEXT: kmovw %esi, %k12243; X64-KNL-NEXT: kshiftlw $15, %k1, %k12244; X64-KNL-NEXT: kshiftrw $14, %k1, %k12245; X64-KNL-NEXT: korw %k1, %k0, %k02246; X64-KNL-NEXT: movw $-5, %ax2247; X64-KNL-NEXT: kmovw %eax, %k12248; X64-KNL-NEXT: kandw %k1, %k0, %k02249; X64-KNL-NEXT: kmovw %edx, %k12250; X64-KNL-NEXT: kshiftlw $15, %k1, %k12251; X64-KNL-NEXT: kshiftrw $13, %k1, %k12252; X64-KNL-NEXT: korw %k1, %k0, %k02253; X64-KNL-NEXT: movb $7, %al2254; X64-KNL-NEXT: kmovw %eax, %k12255; X64-KNL-NEXT: kandw %k1, %k0, %k02256; X64-KNL-NEXT: kshiftlw $12, %k0, %k02257; X64-KNL-NEXT: kshiftrw $12, %k0, %k12258; X64-KNL-NEXT: vpmovsxdq %xmm1, %ymm12259; X64-KNL-NEXT: vpsllq $2, %ymm1, %ymm12260; X64-KNL-NEXT: vpaddq %ymm1, %ymm0, %ymm02261; X64-KNL-NEXT: vpgatherqd (,%zmm0), %ymm2 {%k1}2262; X64-KNL-NEXT: vmovdqa %xmm2, %xmm02263; X64-KNL-NEXT: vzeroupper2264; X64-KNL-NEXT: retq2265;2266; X86-KNL-LABEL: test30:2267; X86-KNL: # %bb.0:2268; X86-KNL-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm22269; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %eax2270; X86-KNL-NEXT: andl $1, %eax2271; X86-KNL-NEXT: kmovw %eax, %k02272; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %eax2273; X86-KNL-NEXT: kmovw %eax, %k12274; X86-KNL-NEXT: kshiftlw $15, %k1, %k12275; X86-KNL-NEXT: kshiftrw $14, %k1, %k12276; X86-KNL-NEXT: korw %k1, %k0, %k02277; X86-KNL-NEXT: movw $-5, %ax2278; X86-KNL-NEXT: kmovw %eax, %k12279; X86-KNL-NEXT: kandw %k1, %k0, %k02280; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %eax2281; X86-KNL-NEXT: kmovw %eax, %k12282; X86-KNL-NEXT: kshiftlw $15, %k1, %k12283; X86-KNL-NEXT: kshiftrw $13, %k1, %k12284; X86-KNL-NEXT: korw %k1, %k0, %k02285; X86-KNL-NEXT: movb $7, %al2286; X86-KNL-NEXT: kmovw %eax, %k12287; X86-KNL-NEXT: kandw %k1, %k0, %k02288; X86-KNL-NEXT: kshiftlw $12, %k0, %k02289; X86-KNL-NEXT: kshiftrw $12, %k0, %k12290; X86-KNL-NEXT: vpslld $2, %xmm1, %xmm12291; X86-KNL-NEXT: vpaddd %xmm1, %xmm0, %xmm02292; X86-KNL-NEXT: vpgatherdd (,%zmm0), %zmm2 {%k1}2293; X86-KNL-NEXT: vmovdqa %xmm2, %xmm02294; X86-KNL-NEXT: vzeroupper2295; X86-KNL-NEXT: retl2296;2297; X64-SKX-LABEL: test30:2298; X64-SKX: # %bb.0:2299; X64-SKX-NEXT: kmovw %esi, %k02300; X64-SKX-NEXT: kshiftlb $7, %k0, %k02301; X64-SKX-NEXT: kshiftrb $6, %k0, %k02302; X64-SKX-NEXT: kmovw %edi, %k12303; X64-SKX-NEXT: kshiftlb $7, %k1, %k12304; X64-SKX-NEXT: kshiftrb $7, %k1, %k12305; X64-SKX-NEXT: korw %k0, %k1, %k02306; X64-SKX-NEXT: movb $-5, %al2307; X64-SKX-NEXT: kmovw %eax, %k12308; X64-SKX-NEXT: kandw %k1, %k0, %k02309; X64-SKX-NEXT: kmovw %edx, %k12310; X64-SKX-NEXT: kshiftlb $7, %k1, %k12311; X64-SKX-NEXT: kshiftrb $5, %k1, %k12312; X64-SKX-NEXT: korw %k1, %k0, %k02313; X64-SKX-NEXT: movb $7, %al2314; X64-SKX-NEXT: kmovw %eax, %k12315; X64-SKX-NEXT: kandw %k1, %k0, %k12316; X64-SKX-NEXT: vpmovsxdq %xmm1, %ymm12317; X64-SKX-NEXT: vpsllq $2, %ymm1, %ymm12318; X64-SKX-NEXT: vpaddq %ymm1, %ymm0, %ymm02319; X64-SKX-NEXT: vpgatherqd (,%ymm0), %xmm2 {%k1}2320; X64-SKX-NEXT: vmovdqa %xmm2, %xmm02321; X64-SKX-NEXT: vzeroupper2322; X64-SKX-NEXT: retq2323;2324; X86-SKX-LABEL: test30:2325; X86-SKX: # %bb.0:2326; X86-SKX-NEXT: movzbl {{[0-9]+}}(%esp), %eax2327; X86-SKX-NEXT: kmovw %eax, %k02328; X86-SKX-NEXT: kshiftlb $7, %k0, %k02329; X86-SKX-NEXT: kshiftrb $6, %k0, %k02330; X86-SKX-NEXT: movzbl {{[0-9]+}}(%esp), %eax2331; X86-SKX-NEXT: kmovw %eax, %k12332; X86-SKX-NEXT: kshiftlb $7, %k1, %k12333; X86-SKX-NEXT: kshiftrb $7, %k1, %k12334; X86-SKX-NEXT: korw %k0, %k1, %k02335; X86-SKX-NEXT: movb $-5, %al2336; X86-SKX-NEXT: kmovw %eax, %k12337; X86-SKX-NEXT: kandw %k1, %k0, %k02338; X86-SKX-NEXT: movzbl {{[0-9]+}}(%esp), %eax2339; X86-SKX-NEXT: kmovw %eax, %k12340; X86-SKX-NEXT: kshiftlb $7, %k1, %k12341; X86-SKX-NEXT: kshiftrb $5, %k1, %k12342; X86-SKX-NEXT: korw %k1, %k0, %k02343; X86-SKX-NEXT: movb $7, %al2344; X86-SKX-NEXT: kmovw %eax, %k12345; X86-SKX-NEXT: kandw %k1, %k0, %k12346; X86-SKX-NEXT: vpslld $2, %xmm1, %xmm12347; X86-SKX-NEXT: vpaddd %xmm1, %xmm0, %xmm02348; X86-SKX-NEXT: vpgatherdd (,%xmm0), %xmm2 {%k1}2349; X86-SKX-NEXT: vmovdqa %xmm2, %xmm02350; X86-SKX-NEXT: retl2351 %sext_ind = sext <3 x i32> %ind to <3 x i64>2352 %gep.random = getelementptr i32, <3 x ptr> %base, <3 x i64> %sext_ind2353 %res = call <3 x i32> @llvm.masked.gather.v3i32.v3p0(<3 x ptr> %gep.random, i32 4, <3 x i1> %mask, <3 x i32> %src0)2354 ret <3 x i32>%res2355}2356 2357; Non-power of 2 scatter2358declare void @llvm.masked.scatter.v3i32.v3p0(<3 x i32>, <3 x ptr>, i32, <3 x i1>)2359define void @test30b(<3 x ptr> %base, <3 x i32> %ind, <3 x i1> %mask, <3 x i32> %src0) {2360; X64-KNL-LABEL: test30b:2361; X64-KNL: # %bb.0:2362; X64-KNL-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm22363; X64-KNL-NEXT: andl $1, %edi2364; X64-KNL-NEXT: kmovw %edi, %k02365; X64-KNL-NEXT: kmovw %esi, %k12366; X64-KNL-NEXT: kshiftlw $15, %k1, %k12367; X64-KNL-NEXT: kshiftrw $14, %k1, %k12368; X64-KNL-NEXT: korw %k1, %k0, %k02369; X64-KNL-NEXT: movw $-5, %ax2370; X64-KNL-NEXT: kmovw %eax, %k12371; X64-KNL-NEXT: kandw %k1, %k0, %k02372; X64-KNL-NEXT: kmovw %edx, %k12373; X64-KNL-NEXT: kshiftlw $15, %k1, %k12374; X64-KNL-NEXT: kshiftrw $13, %k1, %k12375; X64-KNL-NEXT: korw %k1, %k0, %k02376; X64-KNL-NEXT: movb $7, %al2377; X64-KNL-NEXT: kmovw %eax, %k12378; X64-KNL-NEXT: kandw %k1, %k0, %k02379; X64-KNL-NEXT: kshiftlw $12, %k0, %k02380; X64-KNL-NEXT: kshiftrw $12, %k0, %k12381; X64-KNL-NEXT: vpmovsxdq %xmm1, %ymm12382; X64-KNL-NEXT: vpsllq $2, %ymm1, %ymm12383; X64-KNL-NEXT: vpaddq %ymm1, %ymm0, %ymm02384; X64-KNL-NEXT: vpscatterqd %ymm2, (,%zmm0) {%k1}2385; X64-KNL-NEXT: vzeroupper2386; X64-KNL-NEXT: retq2387;2388; X86-KNL-LABEL: test30b:2389; X86-KNL: # %bb.0:2390; X86-KNL-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm22391; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %eax2392; X86-KNL-NEXT: andl $1, %eax2393; X86-KNL-NEXT: kmovw %eax, %k02394; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %eax2395; X86-KNL-NEXT: kmovw %eax, %k12396; X86-KNL-NEXT: kshiftlw $15, %k1, %k12397; X86-KNL-NEXT: kshiftrw $14, %k1, %k12398; X86-KNL-NEXT: korw %k1, %k0, %k02399; X86-KNL-NEXT: movw $-5, %ax2400; X86-KNL-NEXT: kmovw %eax, %k12401; X86-KNL-NEXT: kandw %k1, %k0, %k02402; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %eax2403; X86-KNL-NEXT: kmovw %eax, %k12404; X86-KNL-NEXT: kshiftlw $15, %k1, %k12405; X86-KNL-NEXT: kshiftrw $13, %k1, %k12406; X86-KNL-NEXT: korw %k1, %k0, %k02407; X86-KNL-NEXT: movb $7, %al2408; X86-KNL-NEXT: kmovw %eax, %k12409; X86-KNL-NEXT: kandw %k1, %k0, %k02410; X86-KNL-NEXT: kshiftlw $12, %k0, %k02411; X86-KNL-NEXT: kshiftrw $12, %k0, %k12412; X86-KNL-NEXT: vpslld $2, %xmm1, %xmm12413; X86-KNL-NEXT: vpaddd %xmm1, %xmm0, %xmm02414; X86-KNL-NEXT: vpscatterdd %zmm2, (,%zmm0) {%k1}2415; X86-KNL-NEXT: vzeroupper2416; X86-KNL-NEXT: retl2417;2418; X64-SKX-LABEL: test30b:2419; X64-SKX: # %bb.0:2420; X64-SKX-NEXT: kmovw %esi, %k02421; X64-SKX-NEXT: kshiftlb $7, %k0, %k02422; X64-SKX-NEXT: kshiftrb $6, %k0, %k02423; X64-SKX-NEXT: kmovw %edi, %k12424; X64-SKX-NEXT: kshiftlb $7, %k1, %k12425; X64-SKX-NEXT: kshiftrb $7, %k1, %k12426; X64-SKX-NEXT: korw %k0, %k1, %k02427; X64-SKX-NEXT: movb $-5, %al2428; X64-SKX-NEXT: kmovw %eax, %k12429; X64-SKX-NEXT: kandw %k1, %k0, %k02430; X64-SKX-NEXT: kmovw %edx, %k12431; X64-SKX-NEXT: kshiftlb $7, %k1, %k12432; X64-SKX-NEXT: kshiftrb $5, %k1, %k12433; X64-SKX-NEXT: korw %k1, %k0, %k02434; X64-SKX-NEXT: movb $7, %al2435; X64-SKX-NEXT: kmovw %eax, %k12436; X64-SKX-NEXT: kandw %k1, %k0, %k12437; X64-SKX-NEXT: vpmovsxdq %xmm1, %ymm12438; X64-SKX-NEXT: vpsllq $2, %ymm1, %ymm12439; X64-SKX-NEXT: vpaddq %ymm1, %ymm0, %ymm02440; X64-SKX-NEXT: vpscatterqd %xmm2, (,%ymm0) {%k1}2441; X64-SKX-NEXT: vzeroupper2442; X64-SKX-NEXT: retq2443;2444; X86-SKX-LABEL: test30b:2445; X86-SKX: # %bb.0:2446; X86-SKX-NEXT: movzbl {{[0-9]+}}(%esp), %eax2447; X86-SKX-NEXT: kmovw %eax, %k02448; X86-SKX-NEXT: kshiftlb $7, %k0, %k02449; X86-SKX-NEXT: kshiftrb $6, %k0, %k02450; X86-SKX-NEXT: movzbl {{[0-9]+}}(%esp), %eax2451; X86-SKX-NEXT: kmovw %eax, %k12452; X86-SKX-NEXT: kshiftlb $7, %k1, %k12453; X86-SKX-NEXT: kshiftrb $7, %k1, %k12454; X86-SKX-NEXT: korw %k0, %k1, %k02455; X86-SKX-NEXT: movb $-5, %al2456; X86-SKX-NEXT: kmovw %eax, %k12457; X86-SKX-NEXT: kandw %k1, %k0, %k02458; X86-SKX-NEXT: movzbl {{[0-9]+}}(%esp), %eax2459; X86-SKX-NEXT: kmovw %eax, %k12460; X86-SKX-NEXT: kshiftlb $7, %k1, %k12461; X86-SKX-NEXT: kshiftrb $5, %k1, %k12462; X86-SKX-NEXT: korw %k1, %k0, %k02463; X86-SKX-NEXT: movb $7, %al2464; X86-SKX-NEXT: kmovw %eax, %k12465; X86-SKX-NEXT: kandw %k1, %k0, %k12466; X86-SKX-NEXT: vpslld $2, %xmm1, %xmm12467; X86-SKX-NEXT: vpaddd %xmm1, %xmm0, %xmm02468; X86-SKX-NEXT: vpscatterdd %xmm2, (,%xmm0) {%k1}2469; X86-SKX-NEXT: retl2470 %sext_ind = sext <3 x i32> %ind to <3 x i64>2471 %gep.random = getelementptr i32, <3 x ptr> %base, <3 x i64> %sext_ind2472 call void @llvm.masked.scatter.v3i32.v3p0(<3 x i32> %src0, <3 x ptr> %gep.random, i32 4, <3 x i1> %mask)2473 ret void2474}2475 2476declare <16 x ptr> @llvm.masked.gather.v16p0.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x ptr>)2477define <16 x ptr> @test31(<16 x ptr> %ptrs) {2478; X64-KNL-LABEL: test31:2479; X64-KNL: # %bb.0:2480; X64-KNL-NEXT: kxnorw %k0, %k0, %k12481; X64-KNL-NEXT: vpxor %xmm2, %xmm2, %xmm22482; X64-KNL-NEXT: vpxor %xmm3, %xmm3, %xmm32483; X64-KNL-NEXT: kxnorw %k0, %k0, %k22484; X64-KNL-NEXT: vpgatherqq (,%zmm0), %zmm3 {%k2}2485; X64-KNL-NEXT: vpgatherqq (,%zmm1), %zmm2 {%k1}2486; X64-KNL-NEXT: vmovdqa64 %zmm3, %zmm02487; X64-KNL-NEXT: vmovdqa64 %zmm2, %zmm12488; X64-KNL-NEXT: retq2489;2490; X86-LABEL: test31:2491; X86: # %bb.0:2492; X86-NEXT: kxnorw %k0, %k0, %k12493; X86-NEXT: vpxor %xmm1, %xmm1, %xmm12494; X86-NEXT: vpgatherdd (,%zmm0), %zmm1 {%k1}2495; X86-NEXT: vmovdqa64 %zmm1, %zmm02496; X86-NEXT: retl2497;2498; X64-SKX-LABEL: test31:2499; X64-SKX: # %bb.0:2500; X64-SKX-NEXT: kxnorb %k0, %k0, %k12501; X64-SKX-NEXT: vpxor %xmm2, %xmm2, %xmm22502; X64-SKX-NEXT: kxnorb %k0, %k0, %k22503; X64-SKX-NEXT: vpxor %xmm3, %xmm3, %xmm32504; X64-SKX-NEXT: vpgatherqq (,%zmm0), %zmm3 {%k2}2505; X64-SKX-NEXT: vpgatherqq (,%zmm1), %zmm2 {%k1}2506; X64-SKX-NEXT: vmovdqa64 %zmm3, %zmm02507; X64-SKX-NEXT: vmovdqa64 %zmm2, %zmm12508; X64-SKX-NEXT: retq2509 %res = call <16 x ptr> @llvm.masked.gather.v16p0.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x ptr> undef)2510 ret <16 x ptr>%res2511}2512 2513define <16 x i32> @test_gather_16i32(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x i32> %src0) {2514; X64-KNL-LABEL: test_gather_16i32:2515; X64-KNL: # %bb.0:2516; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22517; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22518; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12519; X64-KNL-NEXT: vextracti64x4 $1, %zmm3, %ymm22520; X64-KNL-NEXT: kshiftrw $8, %k1, %k22521; X64-KNL-NEXT: vpgatherqd (,%zmm1), %ymm2 {%k2}2522; X64-KNL-NEXT: vpgatherqd (,%zmm0), %ymm3 {%k1}2523; X64-KNL-NEXT: vinserti64x4 $1, %ymm2, %zmm3, %zmm02524; X64-KNL-NEXT: retq2525;2526; X86-KNL-LABEL: test_gather_16i32:2527; X86-KNL: # %bb.0:2528; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12529; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12530; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12531; X86-KNL-NEXT: vpgatherdd (,%zmm0), %zmm2 {%k1}2532; X86-KNL-NEXT: vmovdqa64 %zmm2, %zmm02533; X86-KNL-NEXT: retl2534;2535; X64-SKX-LABEL: test_gather_16i32:2536; X64-SKX: # %bb.0:2537; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22538; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22539; X64-SKX-NEXT: vpmovd2m %zmm2, %k12540; X64-SKX-NEXT: vextracti64x4 $1, %zmm3, %ymm22541; X64-SKX-NEXT: kshiftrw $8, %k1, %k22542; X64-SKX-NEXT: vpgatherqd (,%zmm1), %ymm2 {%k2}2543; X64-SKX-NEXT: vpgatherqd (,%zmm0), %ymm3 {%k1}2544; X64-SKX-NEXT: vinserti64x4 $1, %ymm2, %zmm3, %zmm02545; X64-SKX-NEXT: retq2546;2547; X86-SKX-LABEL: test_gather_16i32:2548; X86-SKX: # %bb.0:2549; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12550; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12551; X86-SKX-NEXT: vpmovd2m %zmm1, %k12552; X86-SKX-NEXT: vpgatherdd (,%zmm0), %zmm2 {%k1}2553; X86-SKX-NEXT: vmovdqa64 %zmm2, %zmm02554; X86-SKX-NEXT: retl2555 %res = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x i32> %src0)2556 ret <16 x i32> %res2557}2558define <16 x i64> @test_gather_16i64(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x i64> %src0) {2559; X64-KNL-LABEL: test_gather_16i64:2560; X64-KNL: # %bb.0:2561; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22562; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22563; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12564; X64-KNL-NEXT: kshiftrw $8, %k1, %k22565; X64-KNL-NEXT: vpgatherqq (,%zmm0), %zmm3 {%k1}2566; X64-KNL-NEXT: vpgatherqq (,%zmm1), %zmm4 {%k2}2567; X64-KNL-NEXT: vmovdqa64 %zmm3, %zmm02568; X64-KNL-NEXT: vmovdqa64 %zmm4, %zmm12569; X64-KNL-NEXT: retq2570;2571; X86-KNL-LABEL: test_gather_16i64:2572; X86-KNL: # %bb.0:2573; X86-KNL-NEXT: pushl %ebp2574; X86-KNL-NEXT: .cfi_def_cfa_offset 82575; X86-KNL-NEXT: .cfi_offset %ebp, -82576; X86-KNL-NEXT: movl %esp, %ebp2577; X86-KNL-NEXT: .cfi_def_cfa_register %ebp2578; X86-KNL-NEXT: andl $-64, %esp2579; X86-KNL-NEXT: subl $64, %esp2580; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12581; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12582; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12583; X86-KNL-NEXT: vmovdqa64 8(%ebp), %zmm12584; X86-KNL-NEXT: kshiftrw $8, %k1, %k22585; X86-KNL-NEXT: vpgatherdq (,%ymm0), %zmm2 {%k1}2586; X86-KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm02587; X86-KNL-NEXT: vpgatherdq (,%ymm0), %zmm1 {%k2}2588; X86-KNL-NEXT: vmovdqa64 %zmm2, %zmm02589; X86-KNL-NEXT: movl %ebp, %esp2590; X86-KNL-NEXT: popl %ebp2591; X86-KNL-NEXT: .cfi_def_cfa %esp, 42592; X86-KNL-NEXT: retl2593;2594; X64-SKX-LABEL: test_gather_16i64:2595; X64-SKX: # %bb.0:2596; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22597; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22598; X64-SKX-NEXT: vpmovd2m %zmm2, %k12599; X64-SKX-NEXT: kshiftrw $8, %k1, %k22600; X64-SKX-NEXT: vpgatherqq (,%zmm0), %zmm3 {%k1}2601; X64-SKX-NEXT: vpgatherqq (,%zmm1), %zmm4 {%k2}2602; X64-SKX-NEXT: vmovdqa64 %zmm3, %zmm02603; X64-SKX-NEXT: vmovdqa64 %zmm4, %zmm12604; X64-SKX-NEXT: retq2605;2606; X86-SKX-LABEL: test_gather_16i64:2607; X86-SKX: # %bb.0:2608; X86-SKX-NEXT: pushl %ebp2609; X86-SKX-NEXT: .cfi_def_cfa_offset 82610; X86-SKX-NEXT: .cfi_offset %ebp, -82611; X86-SKX-NEXT: movl %esp, %ebp2612; X86-SKX-NEXT: .cfi_def_cfa_register %ebp2613; X86-SKX-NEXT: andl $-64, %esp2614; X86-SKX-NEXT: subl $64, %esp2615; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12616; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12617; X86-SKX-NEXT: vpmovd2m %zmm1, %k12618; X86-SKX-NEXT: vmovdqa64 8(%ebp), %zmm12619; X86-SKX-NEXT: kshiftrw $8, %k1, %k22620; X86-SKX-NEXT: vpgatherdq (,%ymm0), %zmm2 {%k1}2621; X86-SKX-NEXT: vextracti64x4 $1, %zmm0, %ymm02622; X86-SKX-NEXT: vpgatherdq (,%ymm0), %zmm1 {%k2}2623; X86-SKX-NEXT: vmovdqa64 %zmm2, %zmm02624; X86-SKX-NEXT: movl %ebp, %esp2625; X86-SKX-NEXT: popl %ebp2626; X86-SKX-NEXT: .cfi_def_cfa %esp, 42627; X86-SKX-NEXT: retl2628 %res = call <16 x i64> @llvm.masked.gather.v16i64.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x i64> %src0)2629 ret <16 x i64> %res2630}2631declare <16 x i64> @llvm.masked.gather.v16i64.v16p0(<16 x ptr> %ptrs, i32, <16 x i1> %mask, <16 x i64> %src0)2632define <16 x float> @test_gather_16f32(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x float> %src0) {2633; X64-KNL-LABEL: test_gather_16f32:2634; X64-KNL: # %bb.0:2635; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22636; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22637; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12638; X64-KNL-NEXT: vextractf64x4 $1, %zmm3, %ymm22639; X64-KNL-NEXT: kshiftrw $8, %k1, %k22640; X64-KNL-NEXT: vgatherqps (,%zmm1), %ymm2 {%k2}2641; X64-KNL-NEXT: vgatherqps (,%zmm0), %ymm3 {%k1}2642; X64-KNL-NEXT: vinsertf64x4 $1, %ymm2, %zmm3, %zmm02643; X64-KNL-NEXT: retq2644;2645; X86-KNL-LABEL: test_gather_16f32:2646; X86-KNL: # %bb.0:2647; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12648; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12649; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12650; X86-KNL-NEXT: vgatherdps (,%zmm0), %zmm2 {%k1}2651; X86-KNL-NEXT: vmovaps %zmm2, %zmm02652; X86-KNL-NEXT: retl2653;2654; X64-SKX-LABEL: test_gather_16f32:2655; X64-SKX: # %bb.0:2656; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22657; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22658; X64-SKX-NEXT: vpmovd2m %zmm2, %k12659; X64-SKX-NEXT: vextractf64x4 $1, %zmm3, %ymm22660; X64-SKX-NEXT: kshiftrw $8, %k1, %k22661; X64-SKX-NEXT: vgatherqps (,%zmm1), %ymm2 {%k2}2662; X64-SKX-NEXT: vgatherqps (,%zmm0), %ymm3 {%k1}2663; X64-SKX-NEXT: vinsertf64x4 $1, %ymm2, %zmm3, %zmm02664; X64-SKX-NEXT: retq2665;2666; X86-SKX-LABEL: test_gather_16f32:2667; X86-SKX: # %bb.0:2668; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12669; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12670; X86-SKX-NEXT: vpmovd2m %zmm1, %k12671; X86-SKX-NEXT: vgatherdps (,%zmm0), %zmm2 {%k1}2672; X86-SKX-NEXT: vmovaps %zmm2, %zmm02673; X86-SKX-NEXT: retl2674 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x float> %src0)2675 ret <16 x float> %res2676}2677define <16 x double> @test_gather_16f64(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x double> %src0) {2678; X64-KNL-LABEL: test_gather_16f64:2679; X64-KNL: # %bb.0:2680; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22681; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22682; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12683; X64-KNL-NEXT: kshiftrw $8, %k1, %k22684; X64-KNL-NEXT: vgatherqpd (,%zmm0), %zmm3 {%k1}2685; X64-KNL-NEXT: vgatherqpd (,%zmm1), %zmm4 {%k2}2686; X64-KNL-NEXT: vmovapd %zmm3, %zmm02687; X64-KNL-NEXT: vmovapd %zmm4, %zmm12688; X64-KNL-NEXT: retq2689;2690; X86-KNL-LABEL: test_gather_16f64:2691; X86-KNL: # %bb.0:2692; X86-KNL-NEXT: pushl %ebp2693; X86-KNL-NEXT: .cfi_def_cfa_offset 82694; X86-KNL-NEXT: .cfi_offset %ebp, -82695; X86-KNL-NEXT: movl %esp, %ebp2696; X86-KNL-NEXT: .cfi_def_cfa_register %ebp2697; X86-KNL-NEXT: andl $-64, %esp2698; X86-KNL-NEXT: subl $64, %esp2699; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12700; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12701; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12702; X86-KNL-NEXT: vmovapd 8(%ebp), %zmm12703; X86-KNL-NEXT: kshiftrw $8, %k1, %k22704; X86-KNL-NEXT: vgatherdpd (,%ymm0), %zmm2 {%k1}2705; X86-KNL-NEXT: vextractf64x4 $1, %zmm0, %ymm02706; X86-KNL-NEXT: vgatherdpd (,%ymm0), %zmm1 {%k2}2707; X86-KNL-NEXT: vmovapd %zmm2, %zmm02708; X86-KNL-NEXT: movl %ebp, %esp2709; X86-KNL-NEXT: popl %ebp2710; X86-KNL-NEXT: .cfi_def_cfa %esp, 42711; X86-KNL-NEXT: retl2712;2713; X64-SKX-LABEL: test_gather_16f64:2714; X64-SKX: # %bb.0:2715; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22716; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22717; X64-SKX-NEXT: vpmovd2m %zmm2, %k12718; X64-SKX-NEXT: kshiftrw $8, %k1, %k22719; X64-SKX-NEXT: vgatherqpd (,%zmm0), %zmm3 {%k1}2720; X64-SKX-NEXT: vgatherqpd (,%zmm1), %zmm4 {%k2}2721; X64-SKX-NEXT: vmovapd %zmm3, %zmm02722; X64-SKX-NEXT: vmovapd %zmm4, %zmm12723; X64-SKX-NEXT: retq2724;2725; X86-SKX-LABEL: test_gather_16f64:2726; X86-SKX: # %bb.0:2727; X86-SKX-NEXT: pushl %ebp2728; X86-SKX-NEXT: .cfi_def_cfa_offset 82729; X86-SKX-NEXT: .cfi_offset %ebp, -82730; X86-SKX-NEXT: movl %esp, %ebp2731; X86-SKX-NEXT: .cfi_def_cfa_register %ebp2732; X86-SKX-NEXT: andl $-64, %esp2733; X86-SKX-NEXT: subl $64, %esp2734; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12735; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12736; X86-SKX-NEXT: vpmovd2m %zmm1, %k12737; X86-SKX-NEXT: vmovapd 8(%ebp), %zmm12738; X86-SKX-NEXT: kshiftrw $8, %k1, %k22739; X86-SKX-NEXT: vgatherdpd (,%ymm0), %zmm2 {%k1}2740; X86-SKX-NEXT: vextractf64x4 $1, %zmm0, %ymm02741; X86-SKX-NEXT: vgatherdpd (,%ymm0), %zmm1 {%k2}2742; X86-SKX-NEXT: vmovapd %zmm2, %zmm02743; X86-SKX-NEXT: movl %ebp, %esp2744; X86-SKX-NEXT: popl %ebp2745; X86-SKX-NEXT: .cfi_def_cfa %esp, 42746; X86-SKX-NEXT: retl2747 %res = call <16 x double> @llvm.masked.gather.v16f64.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x double> %src0)2748 ret <16 x double> %res2749}2750declare <16 x double> @llvm.masked.gather.v16f64.v16p0(<16 x ptr> %ptrs, i32, <16 x i1> %mask, <16 x double> %src0)2751define void @test_scatter_16i32(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x i32> %src0) {2752; X64-KNL-LABEL: test_scatter_16i32:2753; X64-KNL: # %bb.0:2754; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22755; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22756; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12757; X64-KNL-NEXT: kshiftrw $8, %k1, %k22758; X64-KNL-NEXT: vpscatterqd %ymm3, (,%zmm0) {%k1}2759; X64-KNL-NEXT: vextracti64x4 $1, %zmm3, %ymm02760; X64-KNL-NEXT: vpscatterqd %ymm0, (,%zmm1) {%k2}2761; X64-KNL-NEXT: vzeroupper2762; X64-KNL-NEXT: retq2763;2764; X86-KNL-LABEL: test_scatter_16i32:2765; X86-KNL: # %bb.0:2766; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12767; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12768; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12769; X86-KNL-NEXT: vpscatterdd %zmm2, (,%zmm0) {%k1}2770; X86-KNL-NEXT: vzeroupper2771; X86-KNL-NEXT: retl2772;2773; X64-SKX-LABEL: test_scatter_16i32:2774; X64-SKX: # %bb.0:2775; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22776; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22777; X64-SKX-NEXT: vpmovd2m %zmm2, %k12778; X64-SKX-NEXT: kshiftrw $8, %k1, %k22779; X64-SKX-NEXT: vpscatterqd %ymm3, (,%zmm0) {%k1}2780; X64-SKX-NEXT: vextracti64x4 $1, %zmm3, %ymm02781; X64-SKX-NEXT: vpscatterqd %ymm0, (,%zmm1) {%k2}2782; X64-SKX-NEXT: vzeroupper2783; X64-SKX-NEXT: retq2784;2785; X86-SKX-LABEL: test_scatter_16i32:2786; X86-SKX: # %bb.0:2787; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12788; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12789; X86-SKX-NEXT: vpmovd2m %zmm1, %k12790; X86-SKX-NEXT: vpscatterdd %zmm2, (,%zmm0) {%k1}2791; X86-SKX-NEXT: vzeroupper2792; X86-SKX-NEXT: retl2793 call void @llvm.masked.scatter.v16i32.v16p0(<16 x i32> %src0, <16 x ptr> %ptrs, i32 4, <16 x i1> %mask)2794 ret void2795}2796define void @test_scatter_16i64(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x i64> %src0) {2797; X64-KNL-LABEL: test_scatter_16i64:2798; X64-KNL: # %bb.0:2799; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22800; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22801; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12802; X64-KNL-NEXT: kshiftrw $8, %k1, %k22803; X64-KNL-NEXT: vpscatterqq %zmm3, (,%zmm0) {%k1}2804; X64-KNL-NEXT: vpscatterqq %zmm4, (,%zmm1) {%k2}2805; X64-KNL-NEXT: vzeroupper2806; X64-KNL-NEXT: retq2807;2808; X86-KNL-LABEL: test_scatter_16i64:2809; X86-KNL: # %bb.0:2810; X86-KNL-NEXT: pushl %ebp2811; X86-KNL-NEXT: .cfi_def_cfa_offset 82812; X86-KNL-NEXT: .cfi_offset %ebp, -82813; X86-KNL-NEXT: movl %esp, %ebp2814; X86-KNL-NEXT: .cfi_def_cfa_register %ebp2815; X86-KNL-NEXT: andl $-64, %esp2816; X86-KNL-NEXT: subl $64, %esp2817; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12818; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12819; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12820; X86-KNL-NEXT: vmovdqa64 8(%ebp), %zmm12821; X86-KNL-NEXT: kshiftrw $8, %k1, %k22822; X86-KNL-NEXT: vpscatterdq %zmm2, (,%ymm0) {%k1}2823; X86-KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm02824; X86-KNL-NEXT: vpscatterdq %zmm1, (,%ymm0) {%k2}2825; X86-KNL-NEXT: movl %ebp, %esp2826; X86-KNL-NEXT: popl %ebp2827; X86-KNL-NEXT: .cfi_def_cfa %esp, 42828; X86-KNL-NEXT: vzeroupper2829; X86-KNL-NEXT: retl2830;2831; X64-SKX-LABEL: test_scatter_16i64:2832; X64-SKX: # %bb.0:2833; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22834; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22835; X64-SKX-NEXT: vpmovd2m %zmm2, %k12836; X64-SKX-NEXT: kshiftrw $8, %k1, %k22837; X64-SKX-NEXT: vpscatterqq %zmm3, (,%zmm0) {%k1}2838; X64-SKX-NEXT: vpscatterqq %zmm4, (,%zmm1) {%k2}2839; X64-SKX-NEXT: vzeroupper2840; X64-SKX-NEXT: retq2841;2842; X86-SKX-LABEL: test_scatter_16i64:2843; X86-SKX: # %bb.0:2844; X86-SKX-NEXT: pushl %ebp2845; X86-SKX-NEXT: .cfi_def_cfa_offset 82846; X86-SKX-NEXT: .cfi_offset %ebp, -82847; X86-SKX-NEXT: movl %esp, %ebp2848; X86-SKX-NEXT: .cfi_def_cfa_register %ebp2849; X86-SKX-NEXT: andl $-64, %esp2850; X86-SKX-NEXT: subl $64, %esp2851; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12852; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12853; X86-SKX-NEXT: vpmovd2m %zmm1, %k12854; X86-SKX-NEXT: vmovdqa64 8(%ebp), %zmm12855; X86-SKX-NEXT: kshiftrw $8, %k1, %k22856; X86-SKX-NEXT: vpscatterdq %zmm2, (,%ymm0) {%k1}2857; X86-SKX-NEXT: vextracti64x4 $1, %zmm0, %ymm02858; X86-SKX-NEXT: vpscatterdq %zmm1, (,%ymm0) {%k2}2859; X86-SKX-NEXT: movl %ebp, %esp2860; X86-SKX-NEXT: popl %ebp2861; X86-SKX-NEXT: .cfi_def_cfa %esp, 42862; X86-SKX-NEXT: vzeroupper2863; X86-SKX-NEXT: retl2864 call void @llvm.masked.scatter.v16i64.v16p0(<16 x i64> %src0, <16 x ptr> %ptrs, i32 4, <16 x i1> %mask)2865 ret void2866}2867declare void @llvm.masked.scatter.v16i64.v16p0(<16 x i64> %src0, <16 x ptr> %ptrs, i32, <16 x i1> %mask)2868define void @test_scatter_16f32(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x float> %src0) {2869; X64-KNL-LABEL: test_scatter_16f32:2870; X64-KNL: # %bb.0:2871; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22872; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22873; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12874; X64-KNL-NEXT: kshiftrw $8, %k1, %k22875; X64-KNL-NEXT: vscatterqps %ymm3, (,%zmm0) {%k1}2876; X64-KNL-NEXT: vextractf64x4 $1, %zmm3, %ymm02877; X64-KNL-NEXT: vscatterqps %ymm0, (,%zmm1) {%k2}2878; X64-KNL-NEXT: vzeroupper2879; X64-KNL-NEXT: retq2880;2881; X86-KNL-LABEL: test_scatter_16f32:2882; X86-KNL: # %bb.0:2883; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12884; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12885; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12886; X86-KNL-NEXT: vscatterdps %zmm2, (,%zmm0) {%k1}2887; X86-KNL-NEXT: vzeroupper2888; X86-KNL-NEXT: retl2889;2890; X64-SKX-LABEL: test_scatter_16f32:2891; X64-SKX: # %bb.0:2892; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22893; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22894; X64-SKX-NEXT: vpmovd2m %zmm2, %k12895; X64-SKX-NEXT: kshiftrw $8, %k1, %k22896; X64-SKX-NEXT: vscatterqps %ymm3, (,%zmm0) {%k1}2897; X64-SKX-NEXT: vextractf64x4 $1, %zmm3, %ymm02898; X64-SKX-NEXT: vscatterqps %ymm0, (,%zmm1) {%k2}2899; X64-SKX-NEXT: vzeroupper2900; X64-SKX-NEXT: retq2901;2902; X86-SKX-LABEL: test_scatter_16f32:2903; X86-SKX: # %bb.0:2904; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12905; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12906; X86-SKX-NEXT: vpmovd2m %zmm1, %k12907; X86-SKX-NEXT: vscatterdps %zmm2, (,%zmm0) {%k1}2908; X86-SKX-NEXT: vzeroupper2909; X86-SKX-NEXT: retl2910 call void @llvm.masked.scatter.v16f32.v16p0(<16 x float> %src0, <16 x ptr> %ptrs, i32 4, <16 x i1> %mask)2911 ret void2912}2913declare void @llvm.masked.scatter.v16f32.v16p0(<16 x float> %src0, <16 x ptr> %ptrs, i32, <16 x i1> %mask)2914define void @test_scatter_16f64(<16 x ptr> %ptrs, <16 x i1> %mask, <16 x double> %src0) {2915; X64-KNL-LABEL: test_scatter_16f64:2916; X64-KNL: # %bb.0:2917; X64-KNL-NEXT: vpmovsxbd %xmm2, %zmm22918; X64-KNL-NEXT: vpslld $31, %zmm2, %zmm22919; X64-KNL-NEXT: vptestmd %zmm2, %zmm2, %k12920; X64-KNL-NEXT: kshiftrw $8, %k1, %k22921; X64-KNL-NEXT: vscatterqpd %zmm3, (,%zmm0) {%k1}2922; X64-KNL-NEXT: vscatterqpd %zmm4, (,%zmm1) {%k2}2923; X64-KNL-NEXT: vzeroupper2924; X64-KNL-NEXT: retq2925;2926; X86-KNL-LABEL: test_scatter_16f64:2927; X86-KNL: # %bb.0:2928; X86-KNL-NEXT: pushl %ebp2929; X86-KNL-NEXT: .cfi_def_cfa_offset 82930; X86-KNL-NEXT: .cfi_offset %ebp, -82931; X86-KNL-NEXT: movl %esp, %ebp2932; X86-KNL-NEXT: .cfi_def_cfa_register %ebp2933; X86-KNL-NEXT: andl $-64, %esp2934; X86-KNL-NEXT: subl $64, %esp2935; X86-KNL-NEXT: vpmovsxbd %xmm1, %zmm12936; X86-KNL-NEXT: vpslld $31, %zmm1, %zmm12937; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k12938; X86-KNL-NEXT: vmovapd 8(%ebp), %zmm12939; X86-KNL-NEXT: kshiftrw $8, %k1, %k22940; X86-KNL-NEXT: vscatterdpd %zmm2, (,%ymm0) {%k1}2941; X86-KNL-NEXT: vextractf64x4 $1, %zmm0, %ymm02942; X86-KNL-NEXT: vscatterdpd %zmm1, (,%ymm0) {%k2}2943; X86-KNL-NEXT: movl %ebp, %esp2944; X86-KNL-NEXT: popl %ebp2945; X86-KNL-NEXT: .cfi_def_cfa %esp, 42946; X86-KNL-NEXT: vzeroupper2947; X86-KNL-NEXT: retl2948;2949; X64-SKX-LABEL: test_scatter_16f64:2950; X64-SKX: # %bb.0:2951; X64-SKX-NEXT: vpmovsxbd %xmm2, %zmm22952; X64-SKX-NEXT: vpslld $31, %zmm2, %zmm22953; X64-SKX-NEXT: vpmovd2m %zmm2, %k12954; X64-SKX-NEXT: kshiftrw $8, %k1, %k22955; X64-SKX-NEXT: vscatterqpd %zmm3, (,%zmm0) {%k1}2956; X64-SKX-NEXT: vscatterqpd %zmm4, (,%zmm1) {%k2}2957; X64-SKX-NEXT: vzeroupper2958; X64-SKX-NEXT: retq2959;2960; X86-SKX-LABEL: test_scatter_16f64:2961; X86-SKX: # %bb.0:2962; X86-SKX-NEXT: pushl %ebp2963; X86-SKX-NEXT: .cfi_def_cfa_offset 82964; X86-SKX-NEXT: .cfi_offset %ebp, -82965; X86-SKX-NEXT: movl %esp, %ebp2966; X86-SKX-NEXT: .cfi_def_cfa_register %ebp2967; X86-SKX-NEXT: andl $-64, %esp2968; X86-SKX-NEXT: subl $64, %esp2969; X86-SKX-NEXT: vpmovsxbd %xmm1, %zmm12970; X86-SKX-NEXT: vpslld $31, %zmm1, %zmm12971; X86-SKX-NEXT: vpmovd2m %zmm1, %k12972; X86-SKX-NEXT: vmovapd 8(%ebp), %zmm12973; X86-SKX-NEXT: kshiftrw $8, %k1, %k22974; X86-SKX-NEXT: vscatterdpd %zmm2, (,%ymm0) {%k1}2975; X86-SKX-NEXT: vextractf64x4 $1, %zmm0, %ymm02976; X86-SKX-NEXT: vscatterdpd %zmm1, (,%ymm0) {%k2}2977; X86-SKX-NEXT: movl %ebp, %esp2978; X86-SKX-NEXT: popl %ebp2979; X86-SKX-NEXT: .cfi_def_cfa %esp, 42980; X86-SKX-NEXT: vzeroupper2981; X86-SKX-NEXT: retl2982 call void @llvm.masked.scatter.v16f64.v16p0(<16 x double> %src0, <16 x ptr> %ptrs, i32 4, <16 x i1> %mask)2983 ret void2984}2985declare void @llvm.masked.scatter.v16f64.v16p0(<16 x double> %src0, <16 x ptr> %ptrs, i32, <16 x i1> %mask)2986 2987define <4 x i64> @test_pr28312(<4 x ptr> %p1, <4 x i1> %k, <4 x i1> %k2,<4 x i64> %d) {2988; X64-KNL-LABEL: test_pr28312:2989; X64-KNL: # %bb.0:2990; X64-KNL-NEXT: vpslld $31, %xmm1, %xmm12991; X64-KNL-NEXT: vptestmd %zmm1, %zmm1, %k02992; X64-KNL-NEXT: kmovw %k0, %eax2993; X64-KNL-NEXT: testb $1, %al2994; X64-KNL-NEXT: # implicit-def: $ymm12995; X64-KNL-NEXT: je .LBB42_22996; X64-KNL-NEXT: # %bb.1: # %cond.load2997; X64-KNL-NEXT: vmovq %xmm0, %rcx2998; X64-KNL-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero2999; X64-KNL-NEXT: .LBB42_2: # %else3000; X64-KNL-NEXT: testb $2, %al3001; X64-KNL-NEXT: je .LBB42_43002; X64-KNL-NEXT: # %bb.3: # %cond.load13003; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx3004; X64-KNL-NEXT: vpinsrq $1, (%rcx), %xmm1, %xmm23005; X64-KNL-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]3006; X64-KNL-NEXT: .LBB42_4: # %else23007; X64-KNL-NEXT: testb $4, %al3008; X64-KNL-NEXT: vextracti128 $1, %ymm0, %xmm23009; X64-KNL-NEXT: je .LBB42_63010; X64-KNL-NEXT: # %bb.5: # %cond.load43011; X64-KNL-NEXT: vmovq %xmm2, %rcx3012; X64-KNL-NEXT: vpbroadcastq (%rcx), %ymm33013; X64-KNL-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm3[4,5],ymm1[6,7]3014; X64-KNL-NEXT: .LBB42_6: # %else53015; X64-KNL-NEXT: testb $8, %al3016; X64-KNL-NEXT: je .LBB42_83017; X64-KNL-NEXT: # %bb.7: # %cond.load73018; X64-KNL-NEXT: vpextrq $1, %xmm2, %rax3019; X64-KNL-NEXT: vpbroadcastq (%rax), %ymm33020; X64-KNL-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],ymm3[6,7]3021; X64-KNL-NEXT: .LBB42_8: # %else83022; X64-KNL-NEXT: kmovw %k0, %eax3023; X64-KNL-NEXT: testb $1, %al3024; X64-KNL-NEXT: # implicit-def: $ymm33025; X64-KNL-NEXT: jne .LBB42_93026; X64-KNL-NEXT: # %bb.10: # %else153027; X64-KNL-NEXT: testb $2, %al3028; X64-KNL-NEXT: jne .LBB42_113029; X64-KNL-NEXT: .LBB42_12: # %else213030; X64-KNL-NEXT: testb $4, %al3031; X64-KNL-NEXT: jne .LBB42_133032; X64-KNL-NEXT: .LBB42_14: # %else273033; X64-KNL-NEXT: testb $8, %al3034; X64-KNL-NEXT: je .LBB42_163035; X64-KNL-NEXT: .LBB42_15: # %cond.load293036; X64-KNL-NEXT: vpextrq $1, %xmm2, %rax3037; X64-KNL-NEXT: vpbroadcastq (%rax), %ymm43038; X64-KNL-NEXT: vpblendd {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm4[6,7]3039; X64-KNL-NEXT: .LBB42_16: # %else333040; X64-KNL-NEXT: kmovw %k0, %eax3041; X64-KNL-NEXT: testb $1, %al3042; X64-KNL-NEXT: # implicit-def: $ymm43043; X64-KNL-NEXT: jne .LBB42_173044; X64-KNL-NEXT: # %bb.18: # %else403045; X64-KNL-NEXT: testb $2, %al3046; X64-KNL-NEXT: jne .LBB42_193047; X64-KNL-NEXT: .LBB42_20: # %else463048; X64-KNL-NEXT: testb $4, %al3049; X64-KNL-NEXT: jne .LBB42_213050; X64-KNL-NEXT: .LBB42_22: # %else523051; X64-KNL-NEXT: testb $8, %al3052; X64-KNL-NEXT: je .LBB42_243053; X64-KNL-NEXT: .LBB42_23: # %cond.load543054; X64-KNL-NEXT: vpextrq $1, %xmm2, %rax3055; X64-KNL-NEXT: vpbroadcastq (%rax), %ymm03056; X64-KNL-NEXT: vpblendd {{.*#+}} ymm4 = ymm4[0,1,2,3,4,5],ymm0[6,7]3057; X64-KNL-NEXT: .LBB42_24: # %else583058; X64-KNL-NEXT: vpaddq %ymm3, %ymm1, %ymm03059; X64-KNL-NEXT: vpaddq %ymm4, %ymm0, %ymm03060; X64-KNL-NEXT: retq3061; X64-KNL-NEXT: .LBB42_9: # %cond.load113062; X64-KNL-NEXT: vmovq %xmm0, %rcx3063; X64-KNL-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero3064; X64-KNL-NEXT: testb $2, %al3065; X64-KNL-NEXT: je .LBB42_123066; X64-KNL-NEXT: .LBB42_11: # %cond.load173067; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx3068; X64-KNL-NEXT: vpinsrq $1, (%rcx), %xmm3, %xmm43069; X64-KNL-NEXT: vpblendd {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]3070; X64-KNL-NEXT: testb $4, %al3071; X64-KNL-NEXT: je .LBB42_143072; X64-KNL-NEXT: .LBB42_13: # %cond.load233073; X64-KNL-NEXT: vmovq %xmm2, %rcx3074; X64-KNL-NEXT: vpbroadcastq (%rcx), %ymm43075; X64-KNL-NEXT: vpblendd {{.*#+}} ymm3 = ymm3[0,1,2,3],ymm4[4,5],ymm3[6,7]3076; X64-KNL-NEXT: testb $8, %al3077; X64-KNL-NEXT: jne .LBB42_153078; X64-KNL-NEXT: jmp .LBB42_163079; X64-KNL-NEXT: .LBB42_17: # %cond.load363080; X64-KNL-NEXT: vmovq %xmm0, %rcx3081; X64-KNL-NEXT: vmovq {{.*#+}} xmm4 = mem[0],zero3082; X64-KNL-NEXT: testb $2, %al3083; X64-KNL-NEXT: je .LBB42_203084; X64-KNL-NEXT: .LBB42_19: # %cond.load423085; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx3086; X64-KNL-NEXT: vpinsrq $1, (%rcx), %xmm4, %xmm03087; X64-KNL-NEXT: vpblendd {{.*#+}} ymm4 = ymm0[0,1,2,3],ymm4[4,5,6,7]3088; X64-KNL-NEXT: testb $4, %al3089; X64-KNL-NEXT: je .LBB42_223090; X64-KNL-NEXT: .LBB42_21: # %cond.load483091; X64-KNL-NEXT: vmovq %xmm2, %rcx3092; X64-KNL-NEXT: vpbroadcastq (%rcx), %ymm03093; X64-KNL-NEXT: vpblendd {{.*#+}} ymm4 = ymm4[0,1,2,3],ymm0[4,5],ymm4[6,7]3094; X64-KNL-NEXT: testb $8, %al3095; X64-KNL-NEXT: jne .LBB42_233096; X64-KNL-NEXT: jmp .LBB42_243097;3098; X86-KNL-LABEL: test_pr28312:3099; X86-KNL: # %bb.0:3100; X86-KNL-NEXT: pushl %ebp3101; X86-KNL-NEXT: .cfi_def_cfa_offset 83102; X86-KNL-NEXT: .cfi_offset %ebp, -83103; X86-KNL-NEXT: movl %esp, %ebp3104; X86-KNL-NEXT: .cfi_def_cfa_register %ebp3105; X86-KNL-NEXT: pushl %ebx3106; X86-KNL-NEXT: pushl %esi3107; X86-KNL-NEXT: andl $-32, %esp3108; X86-KNL-NEXT: subl $32, %esp3109; X86-KNL-NEXT: .cfi_offset %esi, -163110; X86-KNL-NEXT: .cfi_offset %ebx, -123111; X86-KNL-NEXT: vpslld $31, %xmm1, %xmm13112; X86-KNL-NEXT: vptestmd %zmm1, %zmm1, %k03113; X86-KNL-NEXT: kmovw %k0, %ebx3114; X86-KNL-NEXT: testb $1, %bl3115; X86-KNL-NEXT: vmovd %xmm0, %eax3116; X86-KNL-NEXT: # implicit-def: $ymm13117; X86-KNL-NEXT: je .LBB42_23118; X86-KNL-NEXT: # %bb.1: # %cond.load3119; X86-KNL-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero3120; X86-KNL-NEXT: .LBB42_2: # %else3121; X86-KNL-NEXT: testb $2, %bl3122; X86-KNL-NEXT: vpextrd $1, %xmm0, %ecx3123; X86-KNL-NEXT: je .LBB42_43124; X86-KNL-NEXT: # %bb.3: # %cond.load13125; X86-KNL-NEXT: vpinsrd $2, (%ecx), %xmm1, %xmm23126; X86-KNL-NEXT: vpinsrd $3, 4(%ecx), %xmm2, %xmm23127; X86-KNL-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]3128; X86-KNL-NEXT: .LBB42_4: # %else23129; X86-KNL-NEXT: testb $4, %bl3130; X86-KNL-NEXT: vpextrd $2, %xmm0, %edx3131; X86-KNL-NEXT: je .LBB42_63132; X86-KNL-NEXT: # %bb.5: # %cond.load43133; X86-KNL-NEXT: vpbroadcastd (%edx), %ymm23134; X86-KNL-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4],ymm1[5,6,7]3135; X86-KNL-NEXT: vpbroadcastd 4(%edx), %ymm23136; X86-KNL-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4],ymm2[5],ymm1[6,7]3137; X86-KNL-NEXT: .LBB42_6: # %else53138; X86-KNL-NEXT: testb $8, %bl3139; X86-KNL-NEXT: vpextrd $3, %xmm0, %esi3140; X86-KNL-NEXT: je .LBB42_83141; X86-KNL-NEXT: # %bb.7: # %cond.load73142; X86-KNL-NEXT: vpbroadcastd (%esi), %ymm03143; X86-KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3,4,5],ymm0[6],ymm1[7]3144; X86-KNL-NEXT: vpbroadcastd 4(%esi), %ymm13145; X86-KNL-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3,4,5,6],ymm1[7]3146; X86-KNL-NEXT: .LBB42_8: # %else83147; X86-KNL-NEXT: kmovw %k0, %ebx3148; X86-KNL-NEXT: testb $1, %bl3149; X86-KNL-NEXT: # implicit-def: $ymm03150; X86-KNL-NEXT: jne .LBB42_93151; X86-KNL-NEXT: # %bb.10: # %else153152; X86-KNL-NEXT: testb $2, %bl3153; X86-KNL-NEXT: jne .LBB42_113154; X86-KNL-NEXT: .LBB42_12: # %else213155; X86-KNL-NEXT: testb $4, %bl3156; X86-KNL-NEXT: jne .LBB42_133157; X86-KNL-NEXT: .LBB42_14: # %else273158; X86-KNL-NEXT: testb $8, %bl3159; X86-KNL-NEXT: je .LBB42_163160; X86-KNL-NEXT: .LBB42_15: # %cond.load293161; X86-KNL-NEXT: vpbroadcastd (%esi), %ymm23162; X86-KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm2[6],ymm0[7]3163; X86-KNL-NEXT: vpbroadcastd 4(%esi), %ymm23164; X86-KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5,6],ymm2[7]3165; X86-KNL-NEXT: .LBB42_16: # %else333166; X86-KNL-NEXT: kmovw %k0, %ebx3167; X86-KNL-NEXT: testb $1, %bl3168; X86-KNL-NEXT: # implicit-def: $ymm23169; X86-KNL-NEXT: jne .LBB42_173170; X86-KNL-NEXT: # %bb.18: # %else403171; X86-KNL-NEXT: testb $2, %bl3172; X86-KNL-NEXT: jne .LBB42_193173; X86-KNL-NEXT: .LBB42_20: # %else463174; X86-KNL-NEXT: testb $4, %bl3175; X86-KNL-NEXT: jne .LBB42_213176; X86-KNL-NEXT: .LBB42_22: # %else523177; X86-KNL-NEXT: testb $8, %bl3178; X86-KNL-NEXT: je .LBB42_243179; X86-KNL-NEXT: .LBB42_23: # %cond.load543180; X86-KNL-NEXT: vpbroadcastd (%esi), %ymm33181; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5],ymm3[6],ymm2[7]3182; X86-KNL-NEXT: vpbroadcastd 4(%esi), %ymm33183; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5,6],ymm3[7]3184; X86-KNL-NEXT: .LBB42_24: # %else583185; X86-KNL-NEXT: vpaddq %ymm0, %ymm1, %ymm03186; X86-KNL-NEXT: vpaddq %ymm2, %ymm0, %ymm03187; X86-KNL-NEXT: leal -8(%ebp), %esp3188; X86-KNL-NEXT: popl %esi3189; X86-KNL-NEXT: popl %ebx3190; X86-KNL-NEXT: popl %ebp3191; X86-KNL-NEXT: .cfi_def_cfa %esp, 43192; X86-KNL-NEXT: retl3193; X86-KNL-NEXT: .LBB42_9: # %cond.load113194; X86-KNL-NEXT: .cfi_def_cfa %ebp, 83195; X86-KNL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero3196; X86-KNL-NEXT: testb $2, %bl3197; X86-KNL-NEXT: je .LBB42_123198; X86-KNL-NEXT: .LBB42_11: # %cond.load173199; X86-KNL-NEXT: vpinsrd $2, (%ecx), %xmm0, %xmm23200; X86-KNL-NEXT: vpinsrd $3, 4(%ecx), %xmm2, %xmm23201; X86-KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]3202; X86-KNL-NEXT: testb $4, %bl3203; X86-KNL-NEXT: je .LBB42_143204; X86-KNL-NEXT: .LBB42_13: # %cond.load233205; X86-KNL-NEXT: vpbroadcastd (%edx), %ymm23206; X86-KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm2[4],ymm0[5,6,7]3207; X86-KNL-NEXT: vpbroadcastd 4(%edx), %ymm23208; X86-KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm2[5],ymm0[6,7]3209; X86-KNL-NEXT: testb $8, %bl3210; X86-KNL-NEXT: jne .LBB42_153211; X86-KNL-NEXT: jmp .LBB42_163212; X86-KNL-NEXT: .LBB42_17: # %cond.load363213; X86-KNL-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero3214; X86-KNL-NEXT: testb $2, %bl3215; X86-KNL-NEXT: je .LBB42_203216; X86-KNL-NEXT: .LBB42_19: # %cond.load423217; X86-KNL-NEXT: vpinsrd $2, (%ecx), %xmm2, %xmm33218; X86-KNL-NEXT: vpinsrd $3, 4(%ecx), %xmm3, %xmm33219; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]3220; X86-KNL-NEXT: testb $4, %bl3221; X86-KNL-NEXT: je .LBB42_223222; X86-KNL-NEXT: .LBB42_21: # %cond.load483223; X86-KNL-NEXT: vpbroadcastd (%edx), %ymm33224; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm3[4],ymm2[5,6,7]3225; X86-KNL-NEXT: vpbroadcastd 4(%edx), %ymm33226; X86-KNL-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4],ymm3[5],ymm2[6,7]3227; X86-KNL-NEXT: testb $8, %bl3228; X86-KNL-NEXT: jne .LBB42_233229; X86-KNL-NEXT: jmp .LBB42_243230;3231; X64-SKX-LABEL: test_pr28312:3232; X64-SKX: # %bb.0:3233; X64-SKX-NEXT: vpslld $31, %xmm1, %xmm13234; X64-SKX-NEXT: vpmovd2m %xmm1, %k13235; X64-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm13236; X64-SKX-NEXT: vpgatherqq (,%ymm0), %ymm1 {%k1}3237; X64-SKX-NEXT: vpaddq %ymm1, %ymm1, %ymm03238; X64-SKX-NEXT: vpaddq %ymm1, %ymm0, %ymm03239; X64-SKX-NEXT: retq3240;3241; X86-SKX-LABEL: test_pr28312:3242; X86-SKX: # %bb.0:3243; X86-SKX-NEXT: pushl %ebp3244; X86-SKX-NEXT: .cfi_def_cfa_offset 83245; X86-SKX-NEXT: .cfi_offset %ebp, -83246; X86-SKX-NEXT: movl %esp, %ebp3247; X86-SKX-NEXT: .cfi_def_cfa_register %ebp3248; X86-SKX-NEXT: andl $-32, %esp3249; X86-SKX-NEXT: subl $32, %esp3250; X86-SKX-NEXT: vpslld $31, %xmm1, %xmm13251; X86-SKX-NEXT: vpmovd2m %xmm1, %k13252; X86-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm13253; X86-SKX-NEXT: vpgatherdq (,%xmm0), %ymm1 {%k1}3254; X86-SKX-NEXT: vpaddq %ymm1, %ymm1, %ymm03255; X86-SKX-NEXT: vpaddq %ymm1, %ymm0, %ymm03256; X86-SKX-NEXT: movl %ebp, %esp3257; X86-SKX-NEXT: popl %ebp3258; X86-SKX-NEXT: .cfi_def_cfa %esp, 43259; X86-SKX-NEXT: retl3260 %g1 = call <4 x i64> @llvm.masked.gather.v4i64.v4p0(<4 x ptr> %p1, i32 8, <4 x i1> %k, <4 x i64> undef)3261 %g2 = call <4 x i64> @llvm.masked.gather.v4i64.v4p0(<4 x ptr> %p1, i32 8, <4 x i1> %k, <4 x i64> undef)3262 %g3 = call <4 x i64> @llvm.masked.gather.v4i64.v4p0(<4 x ptr> %p1, i32 8, <4 x i1> %k, <4 x i64> undef)3263 %a = add <4 x i64> %g1, %g23264 %b = add <4 x i64> %a, %g33265 ret <4 x i64> %b3266}3267declare <4 x i64> @llvm.masked.gather.v4i64.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i64>)3268 3269define <8 x i32> @test_global_array(<8 x i64> %indxs) {3270; X64-KNL-LABEL: test_global_array:3271; X64-KNL: # %bb.0:3272; X64-KNL-NEXT: kxnorw %k0, %k0, %k13273; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm13274; X64-KNL-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3275; X64-KNL-NEXT: vmovdqa %ymm1, %ymm03276; X64-KNL-NEXT: retq3277;3278; X86-KNL-LABEL: test_global_array:3279; X86-KNL: # %bb.0:3280; X86-KNL-NEXT: kxnorw %k0, %k0, %k13281; X86-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm13282; X86-KNL-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3283; X86-KNL-NEXT: vmovdqa %ymm1, %ymm03284; X86-KNL-NEXT: retl3285;3286; X64-SKX-SMALL-LABEL: test_global_array:3287; X64-SKX-SMALL: # %bb.0:3288; X64-SKX-SMALL-NEXT: kxnorb %k0, %k0, %k13289; X64-SKX-SMALL-NEXT: vpxor %xmm1, %xmm1, %xmm13290; X64-SKX-SMALL-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3291; X64-SKX-SMALL-NEXT: vmovdqa %ymm1, %ymm03292; X64-SKX-SMALL-NEXT: retq3293;3294; X64-SKX-LARGE-LABEL: test_global_array:3295; X64-SKX-LARGE: # %bb.0:3296; X64-SKX-LARGE-NEXT: movabsq $glob_array, %rax3297; X64-SKX-LARGE-NEXT: kxnorb %k0, %k0, %k13298; X64-SKX-LARGE-NEXT: vpxor %xmm1, %xmm1, %xmm13299; X64-SKX-LARGE-NEXT: vpgatherqd (%rax,%zmm0,4), %ymm1 {%k1}3300; X64-SKX-LARGE-NEXT: vmovdqa %ymm1, %ymm03301; X64-SKX-LARGE-NEXT: retq3302;3303; X86-SKX-LABEL: test_global_array:3304; X86-SKX: # %bb.0:3305; X86-SKX-NEXT: kxnorb %k0, %k0, %k13306; X86-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm13307; X86-SKX-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3308; X86-SKX-NEXT: vmovdqa %ymm1, %ymm03309; X86-SKX-NEXT: retl3310 %p = getelementptr inbounds [16 x i32], ptr @glob_array, i64 0, <8 x i64> %indxs3311 %g = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> %p, i32 8, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef)3312 ret <8 x i32> %g3313}3314 3315define <8 x i32> @test_global_array_zeroinitializer_index(<8 x i64> %indxs) {3316; X64-KNL-LABEL: test_global_array_zeroinitializer_index:3317; X64-KNL: # %bb.0:3318; X64-KNL-NEXT: kxnorw %k0, %k0, %k13319; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm13320; X64-KNL-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3321; X64-KNL-NEXT: vmovdqa %ymm1, %ymm03322; X64-KNL-NEXT: retq3323;3324; X86-KNL-LABEL: test_global_array_zeroinitializer_index:3325; X86-KNL: # %bb.0:3326; X86-KNL-NEXT: kxnorw %k0, %k0, %k13327; X86-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm13328; X86-KNL-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3329; X86-KNL-NEXT: vmovdqa %ymm1, %ymm03330; X86-KNL-NEXT: retl3331;3332; X64-SKX-SMALL-LABEL: test_global_array_zeroinitializer_index:3333; X64-SKX-SMALL: # %bb.0:3334; X64-SKX-SMALL-NEXT: kxnorb %k0, %k0, %k13335; X64-SKX-SMALL-NEXT: vpxor %xmm1, %xmm1, %xmm13336; X64-SKX-SMALL-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3337; X64-SKX-SMALL-NEXT: vmovdqa %ymm1, %ymm03338; X64-SKX-SMALL-NEXT: retq3339;3340; X64-SKX-LARGE-LABEL: test_global_array_zeroinitializer_index:3341; X64-SKX-LARGE: # %bb.0:3342; X64-SKX-LARGE-NEXT: movabsq $glob_array, %rax3343; X64-SKX-LARGE-NEXT: kxnorb %k0, %k0, %k13344; X64-SKX-LARGE-NEXT: vpxor %xmm1, %xmm1, %xmm13345; X64-SKX-LARGE-NEXT: vpgatherqd (%rax,%zmm0,4), %ymm1 {%k1}3346; X64-SKX-LARGE-NEXT: vmovdqa %ymm1, %ymm03347; X64-SKX-LARGE-NEXT: retq3348;3349; X86-SKX-LABEL: test_global_array_zeroinitializer_index:3350; X86-SKX: # %bb.0:3351; X86-SKX-NEXT: kxnorb %k0, %k0, %k13352; X86-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm13353; X86-SKX-NEXT: vpgatherqd glob_array(,%zmm0,4), %ymm1 {%k1}3354; X86-SKX-NEXT: vmovdqa %ymm1, %ymm03355; X86-SKX-NEXT: retl3356 %p = getelementptr inbounds [16 x i32], ptr @glob_array, <8 x i64> zeroinitializer, <8 x i64> %indxs3357 %g = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> %p, i32 8, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef)3358 ret <8 x i32> %g3359}3360 3361define void @v1_scatter(<1 x i32>%a1, <1 x ptr> %ptr, <1 x i1> %mask) {3362; X64-LABEL: v1_scatter:3363; X64: # %bb.0:3364; X64-NEXT: testb $1, %dl3365; X64-NEXT: je .LBB45_23366; X64-NEXT: # %bb.1: # %cond.store3367; X64-NEXT: movl %edi, (%rsi)3368; X64-NEXT: .LBB45_2: # %else3369; X64-NEXT: retq3370;3371; X86-LABEL: v1_scatter:3372; X86: # %bb.0:3373; X86-NEXT: testb $1, {{[0-9]+}}(%esp)3374; X86-NEXT: je .LBB45_23375; X86-NEXT: # %bb.1: # %cond.store3376; X86-NEXT: movl {{[0-9]+}}(%esp), %eax3377; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx3378; X86-NEXT: movl %ecx, (%eax)3379; X86-NEXT: .LBB45_2: # %else3380; X86-NEXT: retl3381 call void @llvm.masked.scatter.v1i32.v1p0(<1 x i32> %a1, <1 x ptr> %ptr, i32 4, <1 x i1> %mask)3382 ret void3383}3384declare void @llvm.masked.scatter.v1i32.v1p0(<1 x i32>, <1 x ptr>, i32, <1 x i1>)3385 3386define <1 x i32> @v1_gather(<1 x ptr> %ptr, <1 x i1> %mask, <1 x i32> %src0) {3387; X64-LABEL: v1_gather:3388; X64: # %bb.0:3389; X64-NEXT: movl (%rdi), %eax3390; X64-NEXT: retq3391;3392; X86-LABEL: v1_gather:3393; X86: # %bb.0:3394; X86-NEXT: movl {{[0-9]+}}(%esp), %eax3395; X86-NEXT: movl (%eax), %eax3396; X86-NEXT: retl3397 %res = call <1 x i32> @llvm.masked.gather.v1i32.v1p0(<1 x ptr> %ptr, i32 4, <1 x i1> <i1 true>, <1 x i32> %src0)3398 ret <1 x i32>%res3399}3400declare <1 x i32> @llvm.masked.gather.v1i32.v1p0(<1 x ptr>, i32, <1 x i1>, <1 x i32>)3401 3402; Make sure we don't crash when the index element type is larger than i64 and we need to widen the result3403; This experienced a bad interaction when we widened and then tried to split.3404define <2 x float> @large_index(ptr %base, <2 x i128> %ind, <2 x i1> %mask, <2 x float> %src0) {3405; X64-KNL-LABEL: large_index:3406; X64-KNL: # %bb.0:3407; X64-KNL-NEXT: vpsllq $63, %xmm0, %xmm03408; X64-KNL-NEXT: vptestmq %zmm0, %zmm0, %k03409; X64-KNL-NEXT: vmovq %rcx, %xmm03410; X64-KNL-NEXT: vmovq %rsi, %xmm23411; X64-KNL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]3412; X64-KNL-NEXT: vpsllq $2, %xmm0, %xmm03413; X64-KNL-NEXT: vmovq %rdi, %xmm23414; X64-KNL-NEXT: vpbroadcastq %xmm2, %xmm23415; X64-KNL-NEXT: vpaddq %xmm0, %xmm2, %xmm03416; X64-KNL-NEXT: kmovw %k0, %eax3417; X64-KNL-NEXT: testb $1, %al3418; X64-KNL-NEXT: jne .LBB47_13419; X64-KNL-NEXT: # %bb.2: # %else3420; X64-KNL-NEXT: testb $2, %al3421; X64-KNL-NEXT: jne .LBB47_33422; X64-KNL-NEXT: .LBB47_4: # %else23423; X64-KNL-NEXT: vmovdqa %xmm1, %xmm03424; X64-KNL-NEXT: vzeroupper3425; X64-KNL-NEXT: retq3426; X64-KNL-NEXT: .LBB47_1: # %cond.load3427; X64-KNL-NEXT: vmovq %xmm0, %rcx3428; X64-KNL-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero3429; X64-KNL-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]3430; X64-KNL-NEXT: testb $2, %al3431; X64-KNL-NEXT: je .LBB47_43432; X64-KNL-NEXT: .LBB47_3: # %cond.load13433; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax3434; X64-KNL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]3435; X64-KNL-NEXT: vmovaps %xmm1, %xmm03436; X64-KNL-NEXT: vzeroupper3437; X64-KNL-NEXT: retq3438;3439; X86-KNL-LABEL: large_index:3440; X86-KNL: # %bb.0:3441; X86-KNL-NEXT: vpsllq $63, %xmm0, %xmm03442; X86-KNL-NEXT: vptestmq %zmm0, %zmm0, %k03443; X86-KNL-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero3444; X86-KNL-NEXT: vpinsrd $1, {{[0-9]+}}(%esp), %xmm0, %xmm03445; X86-KNL-NEXT: vpslld $2, %xmm0, %xmm03446; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm23447; X86-KNL-NEXT: vpaddd %xmm0, %xmm2, %xmm03448; X86-KNL-NEXT: kmovw %k0, %eax3449; X86-KNL-NEXT: testb $1, %al3450; X86-KNL-NEXT: jne .LBB47_13451; X86-KNL-NEXT: # %bb.2: # %else3452; X86-KNL-NEXT: testb $2, %al3453; X86-KNL-NEXT: jne .LBB47_33454; X86-KNL-NEXT: .LBB47_4: # %else23455; X86-KNL-NEXT: vmovdqa %xmm1, %xmm03456; X86-KNL-NEXT: vzeroupper3457; X86-KNL-NEXT: retl3458; X86-KNL-NEXT: .LBB47_1: # %cond.load3459; X86-KNL-NEXT: vmovd %xmm0, %ecx3460; X86-KNL-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero3461; X86-KNL-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]3462; X86-KNL-NEXT: testb $2, %al3463; X86-KNL-NEXT: je .LBB47_43464; X86-KNL-NEXT: .LBB47_3: # %cond.load13465; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax3466; X86-KNL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]3467; X86-KNL-NEXT: vmovaps %xmm1, %xmm03468; X86-KNL-NEXT: vzeroupper3469; X86-KNL-NEXT: retl3470;3471; X64-SKX-LABEL: large_index:3472; X64-SKX: # %bb.0:3473; X64-SKX-NEXT: vpsllq $63, %xmm0, %xmm03474; X64-SKX-NEXT: vpmovq2m %xmm0, %k03475; X64-SKX-NEXT: vmovq %rcx, %xmm03476; X64-SKX-NEXT: vmovq %rsi, %xmm23477; X64-SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]3478; X64-SKX-NEXT: vpsllq $2, %xmm0, %xmm03479; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm23480; X64-SKX-NEXT: vpaddq %xmm0, %xmm2, %xmm03481; X64-SKX-NEXT: kmovw %k0, %eax3482; X64-SKX-NEXT: testb $1, %al3483; X64-SKX-NEXT: jne .LBB47_13484; X64-SKX-NEXT: # %bb.2: # %else3485; X64-SKX-NEXT: testb $2, %al3486; X64-SKX-NEXT: jne .LBB47_33487; X64-SKX-NEXT: .LBB47_4: # %else23488; X64-SKX-NEXT: vmovdqa %xmm1, %xmm03489; X64-SKX-NEXT: retq3490; X64-SKX-NEXT: .LBB47_1: # %cond.load3491; X64-SKX-NEXT: vmovq %xmm0, %rcx3492; X64-SKX-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero3493; X64-SKX-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]3494; X64-SKX-NEXT: testb $2, %al3495; X64-SKX-NEXT: je .LBB47_43496; X64-SKX-NEXT: .LBB47_3: # %cond.load13497; X64-SKX-NEXT: vpextrq $1, %xmm0, %rax3498; X64-SKX-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]3499; X64-SKX-NEXT: vmovaps %xmm1, %xmm03500; X64-SKX-NEXT: retq3501;3502; X86-SKX-LABEL: large_index:3503; X86-SKX: # %bb.0:3504; X86-SKX-NEXT: vpsllq $63, %xmm0, %xmm03505; X86-SKX-NEXT: vpmovq2m %xmm0, %k03506; X86-SKX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero3507; X86-SKX-NEXT: vpinsrd $1, {{[0-9]+}}(%esp), %xmm0, %xmm03508; X86-SKX-NEXT: vpslld $2, %xmm0, %xmm03509; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm0, %xmm03510; X86-SKX-NEXT: kmovw %k0, %eax3511; X86-SKX-NEXT: testb $1, %al3512; X86-SKX-NEXT: jne .LBB47_13513; X86-SKX-NEXT: # %bb.2: # %else3514; X86-SKX-NEXT: testb $2, %al3515; X86-SKX-NEXT: jne .LBB47_33516; X86-SKX-NEXT: .LBB47_4: # %else23517; X86-SKX-NEXT: vmovaps %xmm1, %xmm03518; X86-SKX-NEXT: retl3519; X86-SKX-NEXT: .LBB47_1: # %cond.load3520; X86-SKX-NEXT: vmovd %xmm0, %ecx3521; X86-SKX-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero3522; X86-SKX-NEXT: vmovss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]3523; X86-SKX-NEXT: testb $2, %al3524; X86-SKX-NEXT: je .LBB47_43525; X86-SKX-NEXT: .LBB47_3: # %cond.load13526; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax3527; X86-SKX-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]3528; X86-SKX-NEXT: vmovaps %xmm1, %xmm03529; X86-SKX-NEXT: retl3530 %gep.random = getelementptr float, ptr %base, <2 x i128> %ind3531 %res = call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> %gep.random, i32 4, <2 x i1> %mask, <2 x float> %src0)3532 ret <2 x float>%res3533}3534 3535; Make sure we allow index to be sign extended from a smaller than i32 element size.3536define <16 x float> @sext_i8_index(ptr %base, <16 x i8> %ind) {3537; X64-LABEL: sext_i8_index:3538; X64: # %bb.0:3539; X64-NEXT: vpmovsxbd %xmm0, %zmm13540; X64-NEXT: kxnorw %k0, %k0, %k13541; X64-NEXT: vpxor %xmm0, %xmm0, %xmm03542; X64-NEXT: vgatherdps (%rdi,%zmm1,4), %zmm0 {%k1}3543; X64-NEXT: retq3544;3545; X86-LABEL: sext_i8_index:3546; X86: # %bb.0:3547; X86-NEXT: movl {{[0-9]+}}(%esp), %eax3548; X86-NEXT: vpmovsxbd %xmm0, %zmm13549; X86-NEXT: kxnorw %k0, %k0, %k13550; X86-NEXT: vpxor %xmm0, %xmm0, %xmm03551; X86-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}3552; X86-NEXT: retl3553 %sext_ind = sext <16 x i8> %ind to <16 x i64>3554 %gep.random = getelementptr float, ptr%base, <16 x i64> %sext_ind3555 3556 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)3557 ret <16 x float>%res3558}3559 3560; Make sure we allow index to be sign extended from a smaller than i32 element size.3561define <8 x float> @sext_v8i8_index(ptr %base, <8 x i8> %ind) {3562; X64-KNL-LABEL: sext_v8i8_index:3563; X64-KNL: # %bb.0:3564; X64-KNL-NEXT: vpmovsxbd %xmm0, %ymm13565; X64-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm03566; X64-KNL-NEXT: movw $255, %ax3567; X64-KNL-NEXT: kmovw %eax, %k13568; X64-KNL-NEXT: vgatherdps (%rdi,%zmm1,4), %zmm0 {%k1}3569; X64-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03570; X64-KNL-NEXT: retq3571;3572; X86-KNL-LABEL: sext_v8i8_index:3573; X86-KNL: # %bb.0:3574; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax3575; X86-KNL-NEXT: vpmovsxbd %xmm0, %ymm13576; X86-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm03577; X86-KNL-NEXT: movw $255, %cx3578; X86-KNL-NEXT: kmovw %ecx, %k13579; X86-KNL-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}3580; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03581; X86-KNL-NEXT: retl3582;3583; X64-SKX-LABEL: sext_v8i8_index:3584; X64-SKX: # %bb.0:3585; X64-SKX-NEXT: vpmovsxbd %xmm0, %ymm13586; X64-SKX-NEXT: kxnorb %k0, %k0, %k13587; X64-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm03588; X64-SKX-NEXT: vgatherdps (%rdi,%ymm1,4), %ymm0 {%k1}3589; X64-SKX-NEXT: retq3590;3591; X86-SKX-LABEL: sext_v8i8_index:3592; X86-SKX: # %bb.0:3593; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax3594; X86-SKX-NEXT: vpmovsxbd %xmm0, %ymm13595; X86-SKX-NEXT: kxnorb %k0, %k0, %k13596; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm03597; X86-SKX-NEXT: vgatherdps (%eax,%ymm1,4), %ymm0 {%k1}3598; X86-SKX-NEXT: retl3599 %sext_ind = sext <8 x i8> %ind to <8 x i64>3600 %gep.random = getelementptr float, ptr%base, <8 x i64> %sext_ind3601 3602 %res = call <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr> %gep.random, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x float> undef)3603 ret <8 x float>%res3604}3605declare <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x float>)3606 3607; Make sure we also allow index to be zero extended from a smaller than i32 element size.3608define <16 x float> @zext_i8_index(ptr %base, <16 x i8> %ind) {3609; X64-LABEL: zext_i8_index:3610; X64: # %bb.0:3611; X64-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero3612; X64-NEXT: kxnorw %k0, %k0, %k13613; X64-NEXT: vpxor %xmm0, %xmm0, %xmm03614; X64-NEXT: vgatherdps (%rdi,%zmm1,4), %zmm0 {%k1}3615; X64-NEXT: retq3616;3617; X86-LABEL: zext_i8_index:3618; X86: # %bb.0:3619; X86-NEXT: movl {{[0-9]+}}(%esp), %eax3620; X86-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero3621; X86-NEXT: kxnorw %k0, %k0, %k13622; X86-NEXT: vpxor %xmm0, %xmm0, %xmm03623; X86-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}3624; X86-NEXT: retl3625 %zext_ind = zext <16 x i8> %ind to <16 x i64>3626 %gep.random = getelementptr float, ptr%base, <16 x i64> %zext_ind3627 3628 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)3629 ret <16 x float>%res3630}3631 3632; Make sure we also allow index to be zero extended from a smaller than i32 element size.3633define <8 x float> @zext_v8i8_index(ptr %base, <8 x i8> %ind) {3634; X64-KNL-LABEL: zext_v8i8_index:3635; X64-KNL: # %bb.0:3636; X64-KNL-NEXT: vpmovzxbd {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero3637; X64-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm03638; X64-KNL-NEXT: movw $255, %ax3639; X64-KNL-NEXT: kmovw %eax, %k13640; X64-KNL-NEXT: vgatherdps (%rdi,%zmm1,4), %zmm0 {%k1}3641; X64-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03642; X64-KNL-NEXT: retq3643;3644; X86-KNL-LABEL: zext_v8i8_index:3645; X86-KNL: # %bb.0:3646; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax3647; X86-KNL-NEXT: vpmovzxbd {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero3648; X86-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm03649; X86-KNL-NEXT: movw $255, %cx3650; X86-KNL-NEXT: kmovw %ecx, %k13651; X86-KNL-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}3652; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03653; X86-KNL-NEXT: retl3654;3655; X64-SKX-LABEL: zext_v8i8_index:3656; X64-SKX: # %bb.0:3657; X64-SKX-NEXT: vpmovzxbd {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero3658; X64-SKX-NEXT: kxnorb %k0, %k0, %k13659; X64-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm03660; X64-SKX-NEXT: vgatherdps (%rdi,%ymm1,4), %ymm0 {%k1}3661; X64-SKX-NEXT: retq3662;3663; X86-SKX-LABEL: zext_v8i8_index:3664; X86-SKX: # %bb.0:3665; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax3666; X86-SKX-NEXT: vpmovzxbd {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero3667; X86-SKX-NEXT: kxnorb %k0, %k0, %k13668; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm03669; X86-SKX-NEXT: vgatherdps (%eax,%ymm1,4), %ymm0 {%k1}3670; X86-SKX-NEXT: retl3671 %zext_ind = zext <8 x i8> %ind to <8 x i64>3672 %gep.random = getelementptr float, ptr%base, <8 x i64> %zext_ind3673 3674 %res = call <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr> %gep.random, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x float> undef)3675 ret <8 x float>%res3676}3677 3678; Index requires promotion3679define void @test_scatter_2i32_index(<2 x double> %a1, ptr %base, <2 x i32> %ind, <2 x i1> %mask) {3680; X64-KNL-LABEL: test_scatter_2i32_index:3681; X64-KNL: # %bb.0:3682; X64-KNL-NEXT: vpsllq $63, %xmm2, %xmm23683; X64-KNL-NEXT: vptestmq %zmm2, %zmm2, %k03684; X64-KNL-NEXT: vpmovsxdq %xmm1, %xmm13685; X64-KNL-NEXT: vpsllq $3, %xmm1, %xmm13686; X64-KNL-NEXT: vmovq %rdi, %xmm23687; X64-KNL-NEXT: vpbroadcastq %xmm2, %xmm23688; X64-KNL-NEXT: vpaddq %xmm1, %xmm2, %xmm13689; X64-KNL-NEXT: kmovw %k0, %eax3690; X64-KNL-NEXT: testb $1, %al3691; X64-KNL-NEXT: jne .LBB52_13692; X64-KNL-NEXT: # %bb.2: # %else3693; X64-KNL-NEXT: testb $2, %al3694; X64-KNL-NEXT: jne .LBB52_33695; X64-KNL-NEXT: .LBB52_4: # %else23696; X64-KNL-NEXT: vzeroupper3697; X64-KNL-NEXT: retq3698; X64-KNL-NEXT: .LBB52_1: # %cond.store3699; X64-KNL-NEXT: vmovq %xmm1, %rcx3700; X64-KNL-NEXT: vmovlps %xmm0, (%rcx)3701; X64-KNL-NEXT: testb $2, %al3702; X64-KNL-NEXT: je .LBB52_43703; X64-KNL-NEXT: .LBB52_3: # %cond.store13704; X64-KNL-NEXT: vpextrq $1, %xmm1, %rax3705; X64-KNL-NEXT: vmovhps %xmm0, (%rax)3706; X64-KNL-NEXT: vzeroupper3707; X64-KNL-NEXT: retq3708;3709; X86-KNL-LABEL: test_scatter_2i32_index:3710; X86-KNL: # %bb.0:3711; X86-KNL-NEXT: vpsllq $63, %xmm2, %xmm23712; X86-KNL-NEXT: vptestmq %zmm2, %zmm2, %k03713; X86-KNL-NEXT: vpslld $3, %xmm1, %xmm13714; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm23715; X86-KNL-NEXT: vpaddd %xmm1, %xmm2, %xmm13716; X86-KNL-NEXT: kmovw %k0, %eax3717; X86-KNL-NEXT: testb $1, %al3718; X86-KNL-NEXT: jne .LBB52_13719; X86-KNL-NEXT: # %bb.2: # %else3720; X86-KNL-NEXT: testb $2, %al3721; X86-KNL-NEXT: jne .LBB52_33722; X86-KNL-NEXT: .LBB52_4: # %else23723; X86-KNL-NEXT: vzeroupper3724; X86-KNL-NEXT: retl3725; X86-KNL-NEXT: .LBB52_1: # %cond.store3726; X86-KNL-NEXT: vmovd %xmm1, %ecx3727; X86-KNL-NEXT: vmovlps %xmm0, (%ecx)3728; X86-KNL-NEXT: testb $2, %al3729; X86-KNL-NEXT: je .LBB52_43730; X86-KNL-NEXT: .LBB52_3: # %cond.store13731; X86-KNL-NEXT: vpextrd $1, %xmm1, %eax3732; X86-KNL-NEXT: vmovhps %xmm0, (%eax)3733; X86-KNL-NEXT: vzeroupper3734; X86-KNL-NEXT: retl3735;3736; X64-SKX-LABEL: test_scatter_2i32_index:3737; X64-SKX: # %bb.0:3738; X64-SKX-NEXT: vpsllq $63, %xmm2, %xmm23739; X64-SKX-NEXT: vpmovq2m %xmm2, %k03740; X64-SKX-NEXT: vpbroadcastq %rdi, %xmm23741; X64-SKX-NEXT: vpmovsxdq %xmm1, %xmm13742; X64-SKX-NEXT: vpsllq $3, %xmm1, %xmm13743; X64-SKX-NEXT: vpaddq %xmm1, %xmm2, %xmm13744; X64-SKX-NEXT: kmovw %k0, %eax3745; X64-SKX-NEXT: testb $1, %al3746; X64-SKX-NEXT: jne .LBB52_13747; X64-SKX-NEXT: # %bb.2: # %else3748; X64-SKX-NEXT: testb $2, %al3749; X64-SKX-NEXT: jne .LBB52_33750; X64-SKX-NEXT: .LBB52_4: # %else23751; X64-SKX-NEXT: retq3752; X64-SKX-NEXT: .LBB52_1: # %cond.store3753; X64-SKX-NEXT: vmovq %xmm1, %rcx3754; X64-SKX-NEXT: vmovlps %xmm0, (%rcx)3755; X64-SKX-NEXT: testb $2, %al3756; X64-SKX-NEXT: je .LBB52_43757; X64-SKX-NEXT: .LBB52_3: # %cond.store13758; X64-SKX-NEXT: vpextrq $1, %xmm1, %rax3759; X64-SKX-NEXT: vmovhps %xmm0, (%rax)3760; X64-SKX-NEXT: retq3761;3762; X86-SKX-LABEL: test_scatter_2i32_index:3763; X86-SKX: # %bb.0:3764; X86-SKX-NEXT: vpsllq $63, %xmm2, %xmm23765; X86-SKX-NEXT: vpmovq2m %xmm2, %k03766; X86-SKX-NEXT: vpslld $3, %xmm1, %xmm13767; X86-SKX-NEXT: vpaddd {{[0-9]+}}(%esp){1to4}, %xmm1, %xmm13768; X86-SKX-NEXT: kmovw %k0, %eax3769; X86-SKX-NEXT: testb $1, %al3770; X86-SKX-NEXT: jne .LBB52_13771; X86-SKX-NEXT: # %bb.2: # %else3772; X86-SKX-NEXT: testb $2, %al3773; X86-SKX-NEXT: jne .LBB52_33774; X86-SKX-NEXT: .LBB52_4: # %else23775; X86-SKX-NEXT: retl3776; X86-SKX-NEXT: .LBB52_1: # %cond.store3777; X86-SKX-NEXT: vmovd %xmm1, %ecx3778; X86-SKX-NEXT: vmovlps %xmm0, (%ecx)3779; X86-SKX-NEXT: testb $2, %al3780; X86-SKX-NEXT: je .LBB52_43781; X86-SKX-NEXT: .LBB52_3: # %cond.store13782; X86-SKX-NEXT: vpextrd $1, %xmm1, %eax3783; X86-SKX-NEXT: vmovhps %xmm0, (%eax)3784; X86-SKX-NEXT: retl3785 %gep = getelementptr double, ptr%base, <2 x i32> %ind3786 call void @llvm.masked.scatter.v2f64.v2p0(<2 x double> %a1, <2 x ptr> %gep, i32 4, <2 x i1> %mask)3787 ret void3788}3789declare void @llvm.masked.scatter.v2f64.v2p0(<2 x double>, <2 x ptr>, i32, <2 x i1>)3790 3791define <16 x float> @zext_index(ptr %base, <16 x i32> %ind) {3792; X64-KNL-LABEL: zext_index:3793; X64-KNL: # %bb.0:3794; X64-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm13795; X64-KNL-NEXT: kxnorw %k0, %k0, %k13796; X64-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm03797; X64-KNL-NEXT: vgatherdps (%rdi,%zmm1,4), %zmm0 {%k1}3798; X64-KNL-NEXT: retq3799;3800; X86-KNL-LABEL: zext_index:3801; X86-KNL: # %bb.0:3802; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax3803; X86-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}{1to16}, %zmm0, %zmm13804; X86-KNL-NEXT: kxnorw %k0, %k0, %k13805; X86-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm03806; X86-KNL-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}3807; X86-KNL-NEXT: retl3808;3809; X64-SKX-SMALL-LABEL: zext_index:3810; X64-SKX-SMALL: # %bb.0:3811; X64-SKX-SMALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm13812; X64-SKX-SMALL-NEXT: kxnorw %k0, %k0, %k13813; X64-SKX-SMALL-NEXT: vxorps %xmm0, %xmm0, %xmm03814; X64-SKX-SMALL-NEXT: vgatherdps (%rdi,%zmm1,4), %zmm0 {%k1}3815; X64-SKX-SMALL-NEXT: retq3816;3817; X64-SKX-LARGE-LABEL: zext_index:3818; X64-SKX-LARGE: # %bb.0:3819; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax3820; X64-SKX-LARGE-NEXT: vandps (%rax){1to16}, %zmm0, %zmm13821; X64-SKX-LARGE-NEXT: kxnorw %k0, %k0, %k13822; X64-SKX-LARGE-NEXT: vxorps %xmm0, %xmm0, %xmm03823; X64-SKX-LARGE-NEXT: vgatherdps (%rdi,%zmm1,4), %zmm0 {%k1}3824; X64-SKX-LARGE-NEXT: retq3825;3826; X86-SKX-LABEL: zext_index:3827; X86-SKX: # %bb.0:3828; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax3829; X86-SKX-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}{1to16}, %zmm0, %zmm13830; X86-SKX-NEXT: kxnorw %k0, %k0, %k13831; X86-SKX-NEXT: vxorps %xmm0, %xmm0, %xmm03832; X86-SKX-NEXT: vgatherdps (%eax,%zmm1,4), %zmm0 {%k1}3833; X86-SKX-NEXT: retl3834 %ind_masked = and <16 x i32> %ind, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>3835 %sext_ind = zext <16 x i32> %ind_masked to <16 x i64>3836 %gep.random = getelementptr float, ptr%base, <16 x i64> %sext_ind3837 3838 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)3839 ret <16 x float>%res3840}3841 3842define <16 x double> @test_gather_setcc_split(ptr %base, <16 x i32> %ind, <16 x i32> %cmp, <16 x double> %passthru) {3843; X64-KNL-LABEL: test_gather_setcc_split:3844; X64-KNL: # %bb.0:3845; X64-KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm43846; X64-KNL-NEXT: vptestnmd %zmm4, %zmm4, %k13847; X64-KNL-NEXT: vptestnmd %zmm1, %zmm1, %k23848; X64-KNL-NEXT: vgatherdpd (%rdi,%ymm0,8), %zmm2 {%k2}3849; X64-KNL-NEXT: vextractf64x4 $1, %zmm0, %ymm03850; X64-KNL-NEXT: vgatherdpd (%rdi,%ymm0,8), %zmm3 {%k1}3851; X64-KNL-NEXT: vmovapd %zmm2, %zmm03852; X64-KNL-NEXT: vmovapd %zmm3, %zmm13853; X64-KNL-NEXT: retq3854;3855; X86-KNL-LABEL: test_gather_setcc_split:3856; X86-KNL: # %bb.0:3857; X86-KNL-NEXT: pushl %ebp3858; X86-KNL-NEXT: .cfi_def_cfa_offset 83859; X86-KNL-NEXT: .cfi_offset %ebp, -83860; X86-KNL-NEXT: movl %esp, %ebp3861; X86-KNL-NEXT: .cfi_def_cfa_register %ebp3862; X86-KNL-NEXT: andl $-64, %esp3863; X86-KNL-NEXT: subl $64, %esp3864; X86-KNL-NEXT: vmovdqa64 %zmm1, %zmm33865; X86-KNL-NEXT: vmovapd 72(%ebp), %zmm13866; X86-KNL-NEXT: movl 8(%ebp), %eax3867; X86-KNL-NEXT: vextracti64x4 $1, %zmm3, %ymm43868; X86-KNL-NEXT: vptestnmd %zmm4, %zmm4, %k13869; X86-KNL-NEXT: vptestnmd %zmm3, %zmm3, %k23870; X86-KNL-NEXT: vgatherdpd (%eax,%ymm0,8), %zmm2 {%k2}3871; X86-KNL-NEXT: vextractf64x4 $1, %zmm0, %ymm03872; X86-KNL-NEXT: vgatherdpd (%eax,%ymm0,8), %zmm1 {%k1}3873; X86-KNL-NEXT: vmovapd %zmm2, %zmm03874; X86-KNL-NEXT: movl %ebp, %esp3875; X86-KNL-NEXT: popl %ebp3876; X86-KNL-NEXT: .cfi_def_cfa %esp, 43877; X86-KNL-NEXT: retl3878;3879; X64-SKX-LABEL: test_gather_setcc_split:3880; X64-SKX: # %bb.0:3881; X64-SKX-NEXT: vextracti64x4 $1, %zmm1, %ymm43882; X64-SKX-NEXT: vptestnmd %ymm4, %ymm4, %k13883; X64-SKX-NEXT: vptestnmd %ymm1, %ymm1, %k23884; X64-SKX-NEXT: vgatherdpd (%rdi,%ymm0,8), %zmm2 {%k2}3885; X64-SKX-NEXT: vextractf64x4 $1, %zmm0, %ymm03886; X64-SKX-NEXT: vgatherdpd (%rdi,%ymm0,8), %zmm3 {%k1}3887; X64-SKX-NEXT: vmovapd %zmm2, %zmm03888; X64-SKX-NEXT: vmovapd %zmm3, %zmm13889; X64-SKX-NEXT: retq3890;3891; X86-SKX-LABEL: test_gather_setcc_split:3892; X86-SKX: # %bb.0:3893; X86-SKX-NEXT: pushl %ebp3894; X86-SKX-NEXT: .cfi_def_cfa_offset 83895; X86-SKX-NEXT: .cfi_offset %ebp, -83896; X86-SKX-NEXT: movl %esp, %ebp3897; X86-SKX-NEXT: .cfi_def_cfa_register %ebp3898; X86-SKX-NEXT: andl $-64, %esp3899; X86-SKX-NEXT: subl $64, %esp3900; X86-SKX-NEXT: vmovapd 72(%ebp), %zmm33901; X86-SKX-NEXT: movl 8(%ebp), %eax3902; X86-SKX-NEXT: vextracti64x4 $1, %zmm1, %ymm43903; X86-SKX-NEXT: vptestnmd %ymm4, %ymm4, %k13904; X86-SKX-NEXT: vptestnmd %ymm1, %ymm1, %k23905; X86-SKX-NEXT: vgatherdpd (%eax,%ymm0,8), %zmm2 {%k2}3906; X86-SKX-NEXT: vextractf64x4 $1, %zmm0, %ymm03907; X86-SKX-NEXT: vgatherdpd (%eax,%ymm0,8), %zmm3 {%k1}3908; X86-SKX-NEXT: vmovapd %zmm2, %zmm03909; X86-SKX-NEXT: vmovapd %zmm3, %zmm13910; X86-SKX-NEXT: movl %ebp, %esp3911; X86-SKX-NEXT: popl %ebp3912; X86-SKX-NEXT: .cfi_def_cfa %esp, 43913; X86-SKX-NEXT: retl3914 %sext_ind = sext <16 x i32> %ind to <16 x i64>3915 %gep.random = getelementptr double, ptr%base, <16 x i64> %sext_ind3916 3917 %mask = icmp eq <16 x i32> %cmp, zeroinitializer3918 %res = call <16 x double> @llvm.masked.gather.v16f64.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> %mask, <16 x double> %passthru)3919 ret <16 x double>%res3920}3921 3922define void @test_scatter_setcc_split(ptr %base, <16 x i32> %ind, <16 x i32> %cmp, <16 x double> %src0) {3923; X64-KNL-LABEL: test_scatter_setcc_split:3924; X64-KNL: # %bb.0:3925; X64-KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm43926; X64-KNL-NEXT: vptestnmd %zmm4, %zmm4, %k13927; X64-KNL-NEXT: vptestnmd %zmm1, %zmm1, %k23928; X64-KNL-NEXT: vscatterdpd %zmm2, (%rdi,%ymm0,8) {%k2}3929; X64-KNL-NEXT: vextractf64x4 $1, %zmm0, %ymm03930; X64-KNL-NEXT: vscatterdpd %zmm3, (%rdi,%ymm0,8) {%k1}3931; X64-KNL-NEXT: vzeroupper3932; X64-KNL-NEXT: retq3933;3934; X86-KNL-LABEL: test_scatter_setcc_split:3935; X86-KNL: # %bb.0:3936; X86-KNL-NEXT: pushl %ebp3937; X86-KNL-NEXT: .cfi_def_cfa_offset 83938; X86-KNL-NEXT: .cfi_offset %ebp, -83939; X86-KNL-NEXT: movl %esp, %ebp3940; X86-KNL-NEXT: .cfi_def_cfa_register %ebp3941; X86-KNL-NEXT: andl $-64, %esp3942; X86-KNL-NEXT: subl $64, %esp3943; X86-KNL-NEXT: vmovapd 72(%ebp), %zmm33944; X86-KNL-NEXT: movl 8(%ebp), %eax3945; X86-KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm43946; X86-KNL-NEXT: vptestnmd %zmm4, %zmm4, %k13947; X86-KNL-NEXT: vptestnmd %zmm1, %zmm1, %k23948; X86-KNL-NEXT: vscatterdpd %zmm2, (%eax,%ymm0,8) {%k2}3949; X86-KNL-NEXT: vextractf64x4 $1, %zmm0, %ymm03950; X86-KNL-NEXT: vscatterdpd %zmm3, (%eax,%ymm0,8) {%k1}3951; X86-KNL-NEXT: movl %ebp, %esp3952; X86-KNL-NEXT: popl %ebp3953; X86-KNL-NEXT: .cfi_def_cfa %esp, 43954; X86-KNL-NEXT: vzeroupper3955; X86-KNL-NEXT: retl3956;3957; X64-SKX-LABEL: test_scatter_setcc_split:3958; X64-SKX: # %bb.0:3959; X64-SKX-NEXT: vextracti64x4 $1, %zmm1, %ymm43960; X64-SKX-NEXT: vptestnmd %ymm4, %ymm4, %k13961; X64-SKX-NEXT: vptestnmd %ymm1, %ymm1, %k23962; X64-SKX-NEXT: vscatterdpd %zmm2, (%rdi,%ymm0,8) {%k2}3963; X64-SKX-NEXT: vextractf64x4 $1, %zmm0, %ymm03964; X64-SKX-NEXT: vscatterdpd %zmm3, (%rdi,%ymm0,8) {%k1}3965; X64-SKX-NEXT: vzeroupper3966; X64-SKX-NEXT: retq3967;3968; X86-SKX-LABEL: test_scatter_setcc_split:3969; X86-SKX: # %bb.0:3970; X86-SKX-NEXT: pushl %ebp3971; X86-SKX-NEXT: .cfi_def_cfa_offset 83972; X86-SKX-NEXT: .cfi_offset %ebp, -83973; X86-SKX-NEXT: movl %esp, %ebp3974; X86-SKX-NEXT: .cfi_def_cfa_register %ebp3975; X86-SKX-NEXT: andl $-64, %esp3976; X86-SKX-NEXT: subl $64, %esp3977; X86-SKX-NEXT: vmovapd 72(%ebp), %zmm33978; X86-SKX-NEXT: movl 8(%ebp), %eax3979; X86-SKX-NEXT: vextracti64x4 $1, %zmm1, %ymm43980; X86-SKX-NEXT: vptestnmd %ymm4, %ymm4, %k13981; X86-SKX-NEXT: vptestnmd %ymm1, %ymm1, %k23982; X86-SKX-NEXT: vscatterdpd %zmm2, (%eax,%ymm0,8) {%k2}3983; X86-SKX-NEXT: vextractf64x4 $1, %zmm0, %ymm03984; X86-SKX-NEXT: vscatterdpd %zmm3, (%eax,%ymm0,8) {%k1}3985; X86-SKX-NEXT: movl %ebp, %esp3986; X86-SKX-NEXT: popl %ebp3987; X86-SKX-NEXT: .cfi_def_cfa %esp, 43988; X86-SKX-NEXT: vzeroupper3989; X86-SKX-NEXT: retl3990 %sext_ind = sext <16 x i32> %ind to <16 x i64>3991 %gep.random = getelementptr double, ptr%base, <16 x i64> %sext_ind3992 3993 %mask = icmp eq <16 x i32> %cmp, zeroinitializer3994 call void @llvm.masked.scatter.v16f64.v16p0(<16 x double> %src0, <16 x ptr> %gep.random, i32 4, <16 x i1> %mask)3995 ret void3996}3997 3998; This test case previously triggered an infinite loop when the two gathers became identical after DAG combine removed the sign extend.3999define <16 x float> @test_sext_cse(ptr %base, <16 x i32> %ind, ptr %foo) {4000; X64-LABEL: test_sext_cse:4001; X64: # %bb.0:4002; X64-NEXT: vmovaps %zmm0, (%rsi)4003; X64-NEXT: kxnorw %k0, %k0, %k14004; X64-NEXT: vxorps %xmm1, %xmm1, %xmm14005; X64-NEXT: vgatherdps (%rdi,%zmm0,4), %zmm1 {%k1}4006; X64-NEXT: vaddps %zmm1, %zmm1, %zmm04007; X64-NEXT: retq4008;4009; X86-LABEL: test_sext_cse:4010; X86: # %bb.0:4011; X86-NEXT: movl {{[0-9]+}}(%esp), %eax4012; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx4013; X86-NEXT: vmovaps %zmm0, (%ecx)4014; X86-NEXT: kxnorw %k0, %k0, %k14015; X86-NEXT: vxorps %xmm1, %xmm1, %xmm14016; X86-NEXT: vgatherdps (%eax,%zmm0,4), %zmm1 {%k1}4017; X86-NEXT: vaddps %zmm1, %zmm1, %zmm04018; X86-NEXT: retl4019 %broadcast.splatinsert = insertelement <16 x ptr> undef, ptr %base, i32 04020 %broadcast.splat = shufflevector <16 x ptr> %broadcast.splatinsert, <16 x ptr> undef, <16 x i32> zeroinitializer4021 4022 %sext_ind = sext <16 x i32> %ind to <16 x i64>4023 %gep.random = getelementptr float, <16 x ptr> %broadcast.splat, <16 x i64> %sext_ind4024 4025 store <16 x i32> %ind, ptr %foo4026 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)4027 %gep.random2 = getelementptr float, <16 x ptr> %broadcast.splat, <16 x i32> %ind4028 %res2 = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %gep.random2, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x float> undef)4029 %res3 = fadd <16 x float> %res2, %res4030 ret <16 x float>%res34031}4032 4033define void @zero_mask(<2 x double>%a1, <2 x ptr> %ptr) {4034; ALL-LABEL: zero_mask:4035; ALL: # %bb.0:4036; ALL-NEXT: ret{{[l|q]}}4037 call void @llvm.masked.scatter.v2f64.v2p0(<2 x double> %a1, <2 x ptr> %ptr, i32 4, <2 x i1> zeroinitializer)4038 ret void4039}4040 4041define <2 x i64> @gather_2i64_constant_indices(ptr %ptr, <2 x i1> %mask) {4042; X64-KNL-LABEL: gather_2i64_constant_indices:4043; X64-KNL: # %bb.0:4044; X64-KNL-NEXT: vpsllq $63, %xmm0, %xmm04045; X64-KNL-NEXT: vptestmq %zmm0, %zmm0, %k04046; X64-KNL-NEXT: vmovq %rdi, %xmm04047; X64-KNL-NEXT: vpbroadcastq %xmm0, %xmm04048; X64-KNL-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm14049; X64-KNL-NEXT: kmovw %k0, %eax4050; X64-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm04051; X64-KNL-NEXT: testb $1, %al4052; X64-KNL-NEXT: jne .LBB58_14053; X64-KNL-NEXT: # %bb.2: # %else4054; X64-KNL-NEXT: testb $2, %al4055; X64-KNL-NEXT: jne .LBB58_34056; X64-KNL-NEXT: .LBB58_4: # %else24057; X64-KNL-NEXT: vzeroupper4058; X64-KNL-NEXT: retq4059; X64-KNL-NEXT: .LBB58_1: # %cond.load4060; X64-KNL-NEXT: vmovq %xmm1, %rcx4061; X64-KNL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero4062; X64-KNL-NEXT: testb $2, %al4063; X64-KNL-NEXT: je .LBB58_44064; X64-KNL-NEXT: .LBB58_3: # %cond.load14065; X64-KNL-NEXT: vpextrq $1, %xmm1, %rax4066; X64-KNL-NEXT: vpinsrq $1, (%rax), %xmm0, %xmm04067; X64-KNL-NEXT: vzeroupper4068; X64-KNL-NEXT: retq4069;4070; X86-KNL-LABEL: gather_2i64_constant_indices:4071; X86-KNL: # %bb.0:4072; X86-KNL-NEXT: vpsllq $63, %xmm0, %xmm04073; X86-KNL-NEXT: vptestmq %zmm0, %zmm0, %k04074; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm04075; X86-KNL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm14076; X86-KNL-NEXT: kmovw %k0, %eax4077; X86-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm04078; X86-KNL-NEXT: testb $1, %al4079; X86-KNL-NEXT: jne .LBB58_14080; X86-KNL-NEXT: # %bb.2: # %else4081; X86-KNL-NEXT: testb $2, %al4082; X86-KNL-NEXT: jne .LBB58_34083; X86-KNL-NEXT: .LBB58_4: # %else24084; X86-KNL-NEXT: vzeroupper4085; X86-KNL-NEXT: retl4086; X86-KNL-NEXT: .LBB58_1: # %cond.load4087; X86-KNL-NEXT: vmovd %xmm1, %ecx4088; X86-KNL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero4089; X86-KNL-NEXT: testb $2, %al4090; X86-KNL-NEXT: je .LBB58_44091; X86-KNL-NEXT: .LBB58_3: # %cond.load14092; X86-KNL-NEXT: vpextrd $1, %xmm1, %eax4093; X86-KNL-NEXT: vpinsrd $2, (%eax), %xmm0, %xmm04094; X86-KNL-NEXT: vpinsrd $3, 4(%eax), %xmm0, %xmm04095; X86-KNL-NEXT: vzeroupper4096; X86-KNL-NEXT: retl4097;4098; X64-SKX-SMALL-LABEL: gather_2i64_constant_indices:4099; X64-SKX-SMALL: # %bb.0:4100; X64-SKX-SMALL-NEXT: vpsllq $63, %xmm0, %xmm04101; X64-SKX-SMALL-NEXT: vpmovq2m %xmm0, %k04102; X64-SKX-SMALL-NEXT: vpbroadcastq %rdi, %xmm04103; X64-SKX-SMALL-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm14104; X64-SKX-SMALL-NEXT: kmovw %k0, %eax4105; X64-SKX-SMALL-NEXT: vpxor %xmm0, %xmm0, %xmm04106; X64-SKX-SMALL-NEXT: testb $1, %al4107; X64-SKX-SMALL-NEXT: jne .LBB58_14108; X64-SKX-SMALL-NEXT: # %bb.2: # %else4109; X64-SKX-SMALL-NEXT: testb $2, %al4110; X64-SKX-SMALL-NEXT: jne .LBB58_34111; X64-SKX-SMALL-NEXT: .LBB58_4: # %else24112; X64-SKX-SMALL-NEXT: retq4113; X64-SKX-SMALL-NEXT: .LBB58_1: # %cond.load4114; X64-SKX-SMALL-NEXT: vmovq %xmm1, %rcx4115; X64-SKX-SMALL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero4116; X64-SKX-SMALL-NEXT: testb $2, %al4117; X64-SKX-SMALL-NEXT: je .LBB58_44118; X64-SKX-SMALL-NEXT: .LBB58_3: # %cond.load14119; X64-SKX-SMALL-NEXT: vpextrq $1, %xmm1, %rax4120; X64-SKX-SMALL-NEXT: vpinsrq $1, (%rax), %xmm0, %xmm04121; X64-SKX-SMALL-NEXT: retq4122;4123; X64-SKX-LARGE-LABEL: gather_2i64_constant_indices:4124; X64-SKX-LARGE: # %bb.0:4125; X64-SKX-LARGE-NEXT: vpsllq $63, %xmm0, %xmm04126; X64-SKX-LARGE-NEXT: vpmovq2m %xmm0, %k04127; X64-SKX-LARGE-NEXT: vpbroadcastq %rdi, %xmm04128; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax4129; X64-SKX-LARGE-NEXT: vpaddq (%rax), %xmm0, %xmm14130; X64-SKX-LARGE-NEXT: kmovw %k0, %eax4131; X64-SKX-LARGE-NEXT: vpxor %xmm0, %xmm0, %xmm04132; X64-SKX-LARGE-NEXT: testb $1, %al4133; X64-SKX-LARGE-NEXT: jne .LBB58_14134; X64-SKX-LARGE-NEXT: # %bb.2: # %else4135; X64-SKX-LARGE-NEXT: testb $2, %al4136; X64-SKX-LARGE-NEXT: jne .LBB58_34137; X64-SKX-LARGE-NEXT: .LBB58_4: # %else24138; X64-SKX-LARGE-NEXT: retq4139; X64-SKX-LARGE-NEXT: .LBB58_1: # %cond.load4140; X64-SKX-LARGE-NEXT: vmovq %xmm1, %rcx4141; X64-SKX-LARGE-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero4142; X64-SKX-LARGE-NEXT: testb $2, %al4143; X64-SKX-LARGE-NEXT: je .LBB58_44144; X64-SKX-LARGE-NEXT: .LBB58_3: # %cond.load14145; X64-SKX-LARGE-NEXT: vpextrq $1, %xmm1, %rax4146; X64-SKX-LARGE-NEXT: vpinsrq $1, (%rax), %xmm0, %xmm04147; X64-SKX-LARGE-NEXT: retq4148;4149; X86-SKX-LABEL: gather_2i64_constant_indices:4150; X86-SKX: # %bb.0:4151; X86-SKX-NEXT: vpsllq $63, %xmm0, %xmm04152; X86-SKX-NEXT: vpmovq2m %xmm0, %k04153; X86-SKX-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm04154; X86-SKX-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm14155; X86-SKX-NEXT: kmovw %k0, %eax4156; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm04157; X86-SKX-NEXT: testb $1, %al4158; X86-SKX-NEXT: jne .LBB58_14159; X86-SKX-NEXT: # %bb.2: # %else4160; X86-SKX-NEXT: testb $2, %al4161; X86-SKX-NEXT: jne .LBB58_34162; X86-SKX-NEXT: .LBB58_4: # %else24163; X86-SKX-NEXT: retl4164; X86-SKX-NEXT: .LBB58_1: # %cond.load4165; X86-SKX-NEXT: vmovd %xmm1, %ecx4166; X86-SKX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero4167; X86-SKX-NEXT: testb $2, %al4168; X86-SKX-NEXT: je .LBB58_44169; X86-SKX-NEXT: .LBB58_3: # %cond.load14170; X86-SKX-NEXT: vpextrd $1, %xmm1, %eax4171; X86-SKX-NEXT: vpinsrd $2, (%eax), %xmm0, %xmm04172; X86-SKX-NEXT: vpinsrd $3, 4(%eax), %xmm0, %xmm04173; X86-SKX-NEXT: retl4174 %gep = getelementptr i64, ptr %ptr, <2 x i64> <i64 0, i64 -2>4175 %res = tail call <2 x i64> @llvm.masked.gather.v2i64.v2p0(<2 x ptr> %gep, i32 8, <2 x i1> %mask, <2 x i64> zeroinitializer) #14176 ret <2 x i64> %res4177}4178 4179define <16 x i32> @gather_16i64_constant_indices(ptr %ptr, <16 x i1> %mask) {4180; X64-KNL-LABEL: gather_16i64_constant_indices:4181; X64-KNL: # %bb.0:4182; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm04183; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm04184; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k14185; X64-KNL-NEXT: vmovdqa64 {{.*#+}} zmm1 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4186; X64-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm04187; X64-KNL-NEXT: vpgatherdd (%rdi,%zmm1,4), %zmm0 {%k1}4188; X64-KNL-NEXT: retq4189;4190; X86-KNL-LABEL: gather_16i64_constant_indices:4191; X86-KNL: # %bb.0:4192; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm04193; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm04194; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k14195; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax4196; X86-KNL-NEXT: vmovdqa64 {{.*#+}} zmm1 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4197; X86-KNL-NEXT: vpxor %xmm0, %xmm0, %xmm04198; X86-KNL-NEXT: vpgatherdd (%eax,%zmm1,4), %zmm0 {%k1}4199; X86-KNL-NEXT: retl4200;4201; X64-SKX-SMALL-LABEL: gather_16i64_constant_indices:4202; X64-SKX-SMALL: # %bb.0:4203; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm04204; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm04205; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k14206; X64-SKX-SMALL-NEXT: vmovdqa64 {{.*#+}} zmm1 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4207; X64-SKX-SMALL-NEXT: vpxor %xmm0, %xmm0, %xmm04208; X64-SKX-SMALL-NEXT: vpgatherdd (%rdi,%zmm1,4), %zmm0 {%k1}4209; X64-SKX-SMALL-NEXT: retq4210;4211; X64-SKX-LARGE-LABEL: gather_16i64_constant_indices:4212; X64-SKX-LARGE: # %bb.0:4213; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm04214; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm04215; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k14216; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax4217; X64-SKX-LARGE-NEXT: vmovdqa64 (%rax), %zmm14218; X64-SKX-LARGE-NEXT: vpxor %xmm0, %xmm0, %xmm04219; X64-SKX-LARGE-NEXT: vpgatherdd (%rdi,%zmm1,4), %zmm0 {%k1}4220; X64-SKX-LARGE-NEXT: retq4221;4222; X86-SKX-LABEL: gather_16i64_constant_indices:4223; X86-SKX: # %bb.0:4224; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm04225; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm04226; X86-SKX-NEXT: vpmovd2m %zmm0, %k14227; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax4228; X86-SKX-NEXT: vmovdqa64 {{.*#+}} zmm1 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4229; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm04230; X86-SKX-NEXT: vpgatherdd (%eax,%zmm1,4), %zmm0 {%k1}4231; X86-SKX-NEXT: retl4232 %gep = getelementptr i32, ptr %ptr, <16 x i64> <i64 0, i64 -2, i64 1, i64 -8, i64 10, i64 20, i64 50, i64 65536, i64 16777215, i64 2147483647, i64 100, i64 -2000, i64 -2147483648, i64 76897723, i64 7, i64 -67897687>4233 %res = tail call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %gep, i32 4, <16 x i1> %mask, <16 x i32> zeroinitializer) #14234 ret <16 x i32> %res4235}4236 4237define void @scatter_2i64_constant_indices(ptr %ptr, <2 x i1> %mask, <2 x i32> %src0) {4238; X64-KNL-LABEL: scatter_2i64_constant_indices:4239; X64-KNL: # %bb.0:4240; X64-KNL-NEXT: vpsllq $63, %xmm0, %xmm04241; X64-KNL-NEXT: vptestmq %zmm0, %zmm0, %k04242; X64-KNL-NEXT: vmovq %rdi, %xmm04243; X64-KNL-NEXT: vpbroadcastq %xmm0, %xmm04244; X64-KNL-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04245; X64-KNL-NEXT: kmovw %k0, %eax4246; X64-KNL-NEXT: testb $1, %al4247; X64-KNL-NEXT: jne .LBB60_14248; X64-KNL-NEXT: # %bb.2: # %else4249; X64-KNL-NEXT: testb $2, %al4250; X64-KNL-NEXT: jne .LBB60_34251; X64-KNL-NEXT: .LBB60_4: # %else24252; X64-KNL-NEXT: vzeroupper4253; X64-KNL-NEXT: retq4254; X64-KNL-NEXT: .LBB60_1: # %cond.store4255; X64-KNL-NEXT: vmovq %xmm0, %rcx4256; X64-KNL-NEXT: vmovss %xmm1, (%rcx)4257; X64-KNL-NEXT: testb $2, %al4258; X64-KNL-NEXT: je .LBB60_44259; X64-KNL-NEXT: .LBB60_3: # %cond.store14260; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax4261; X64-KNL-NEXT: vextractps $1, %xmm1, (%rax)4262; X64-KNL-NEXT: vzeroupper4263; X64-KNL-NEXT: retq4264;4265; X86-KNL-LABEL: scatter_2i64_constant_indices:4266; X86-KNL: # %bb.0:4267; X86-KNL-NEXT: vpsllq $63, %xmm0, %xmm04268; X86-KNL-NEXT: vptestmq %zmm0, %zmm0, %k04269; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm04270; X86-KNL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm04271; X86-KNL-NEXT: kmovw %k0, %eax4272; X86-KNL-NEXT: testb $1, %al4273; X86-KNL-NEXT: jne .LBB60_14274; X86-KNL-NEXT: # %bb.2: # %else4275; X86-KNL-NEXT: testb $2, %al4276; X86-KNL-NEXT: jne .LBB60_34277; X86-KNL-NEXT: .LBB60_4: # %else24278; X86-KNL-NEXT: vzeroupper4279; X86-KNL-NEXT: retl4280; X86-KNL-NEXT: .LBB60_1: # %cond.store4281; X86-KNL-NEXT: vmovd %xmm0, %ecx4282; X86-KNL-NEXT: vmovss %xmm1, (%ecx)4283; X86-KNL-NEXT: testb $2, %al4284; X86-KNL-NEXT: je .LBB60_44285; X86-KNL-NEXT: .LBB60_3: # %cond.store14286; X86-KNL-NEXT: vpextrd $1, %xmm0, %eax4287; X86-KNL-NEXT: vextractps $1, %xmm1, (%eax)4288; X86-KNL-NEXT: vzeroupper4289; X86-KNL-NEXT: retl4290;4291; X64-SKX-SMALL-LABEL: scatter_2i64_constant_indices:4292; X64-SKX-SMALL: # %bb.0:4293; X64-SKX-SMALL-NEXT: vpsllq $63, %xmm0, %xmm04294; X64-SKX-SMALL-NEXT: vpmovq2m %xmm0, %k04295; X64-SKX-SMALL-NEXT: vpbroadcastq %rdi, %xmm04296; X64-SKX-SMALL-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04297; X64-SKX-SMALL-NEXT: kmovw %k0, %eax4298; X64-SKX-SMALL-NEXT: testb $1, %al4299; X64-SKX-SMALL-NEXT: jne .LBB60_14300; X64-SKX-SMALL-NEXT: # %bb.2: # %else4301; X64-SKX-SMALL-NEXT: testb $2, %al4302; X64-SKX-SMALL-NEXT: jne .LBB60_34303; X64-SKX-SMALL-NEXT: .LBB60_4: # %else24304; X64-SKX-SMALL-NEXT: retq4305; X64-SKX-SMALL-NEXT: .LBB60_1: # %cond.store4306; X64-SKX-SMALL-NEXT: vmovq %xmm0, %rcx4307; X64-SKX-SMALL-NEXT: vmovss %xmm1, (%rcx)4308; X64-SKX-SMALL-NEXT: testb $2, %al4309; X64-SKX-SMALL-NEXT: je .LBB60_44310; X64-SKX-SMALL-NEXT: .LBB60_3: # %cond.store14311; X64-SKX-SMALL-NEXT: vpextrq $1, %xmm0, %rax4312; X64-SKX-SMALL-NEXT: vextractps $1, %xmm1, (%rax)4313; X64-SKX-SMALL-NEXT: retq4314;4315; X64-SKX-LARGE-LABEL: scatter_2i64_constant_indices:4316; X64-SKX-LARGE: # %bb.0:4317; X64-SKX-LARGE-NEXT: vpsllq $63, %xmm0, %xmm04318; X64-SKX-LARGE-NEXT: vpmovq2m %xmm0, %k04319; X64-SKX-LARGE-NEXT: vpbroadcastq %rdi, %xmm04320; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax4321; X64-SKX-LARGE-NEXT: vpaddq (%rax), %xmm0, %xmm04322; X64-SKX-LARGE-NEXT: kmovw %k0, %eax4323; X64-SKX-LARGE-NEXT: testb $1, %al4324; X64-SKX-LARGE-NEXT: jne .LBB60_14325; X64-SKX-LARGE-NEXT: # %bb.2: # %else4326; X64-SKX-LARGE-NEXT: testb $2, %al4327; X64-SKX-LARGE-NEXT: jne .LBB60_34328; X64-SKX-LARGE-NEXT: .LBB60_4: # %else24329; X64-SKX-LARGE-NEXT: retq4330; X64-SKX-LARGE-NEXT: .LBB60_1: # %cond.store4331; X64-SKX-LARGE-NEXT: vmovq %xmm0, %rcx4332; X64-SKX-LARGE-NEXT: vmovss %xmm1, (%rcx)4333; X64-SKX-LARGE-NEXT: testb $2, %al4334; X64-SKX-LARGE-NEXT: je .LBB60_44335; X64-SKX-LARGE-NEXT: .LBB60_3: # %cond.store14336; X64-SKX-LARGE-NEXT: vpextrq $1, %xmm0, %rax4337; X64-SKX-LARGE-NEXT: vextractps $1, %xmm1, (%rax)4338; X64-SKX-LARGE-NEXT: retq4339;4340; X86-SKX-LABEL: scatter_2i64_constant_indices:4341; X86-SKX: # %bb.0:4342; X86-SKX-NEXT: vpsllq $63, %xmm0, %xmm04343; X86-SKX-NEXT: vpmovq2m %xmm0, %k04344; X86-SKX-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm04345; X86-SKX-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm04346; X86-SKX-NEXT: kmovw %k0, %eax4347; X86-SKX-NEXT: testb $1, %al4348; X86-SKX-NEXT: jne .LBB60_14349; X86-SKX-NEXT: # %bb.2: # %else4350; X86-SKX-NEXT: testb $2, %al4351; X86-SKX-NEXT: jne .LBB60_34352; X86-SKX-NEXT: .LBB60_4: # %else24353; X86-SKX-NEXT: retl4354; X86-SKX-NEXT: .LBB60_1: # %cond.store4355; X86-SKX-NEXT: vmovd %xmm0, %ecx4356; X86-SKX-NEXT: vmovss %xmm1, (%ecx)4357; X86-SKX-NEXT: testb $2, %al4358; X86-SKX-NEXT: je .LBB60_44359; X86-SKX-NEXT: .LBB60_3: # %cond.store14360; X86-SKX-NEXT: vpextrd $1, %xmm0, %eax4361; X86-SKX-NEXT: vextractps $1, %xmm1, (%eax)4362; X86-SKX-NEXT: retl4363 %gep = getelementptr i32, ptr %ptr, <2 x i64> <i64 0, i64 -2>4364 call void @llvm.masked.scatter.v2i32.v2p0(<2 x i32> %src0, <2 x ptr> %gep, i32 4, <2 x i1> %mask)4365 ret void4366}4367 4368define void @scatter_16i64_constant_indices(ptr %ptr, <16 x i1> %mask, <16 x i32> %src0) {4369; X64-KNL-LABEL: scatter_16i64_constant_indices:4370; X64-KNL: # %bb.0:4371; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm04372; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm04373; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k14374; X64-KNL-NEXT: vmovdqa64 {{.*#+}} zmm0 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4375; X64-KNL-NEXT: vpscatterdd %zmm1, (%rdi,%zmm0,4) {%k1}4376; X64-KNL-NEXT: vzeroupper4377; X64-KNL-NEXT: retq4378;4379; X86-KNL-LABEL: scatter_16i64_constant_indices:4380; X86-KNL: # %bb.0:4381; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm04382; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm04383; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k14384; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax4385; X86-KNL-NEXT: vmovdqa64 {{.*#+}} zmm0 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4386; X86-KNL-NEXT: vpscatterdd %zmm1, (%eax,%zmm0,4) {%k1}4387; X86-KNL-NEXT: vzeroupper4388; X86-KNL-NEXT: retl4389;4390; X64-SKX-SMALL-LABEL: scatter_16i64_constant_indices:4391; X64-SKX-SMALL: # %bb.0:4392; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm04393; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm04394; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k14395; X64-SKX-SMALL-NEXT: vmovdqa64 {{.*#+}} zmm0 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4396; X64-SKX-SMALL-NEXT: vpscatterdd %zmm1, (%rdi,%zmm0,4) {%k1}4397; X64-SKX-SMALL-NEXT: vzeroupper4398; X64-SKX-SMALL-NEXT: retq4399;4400; X64-SKX-LARGE-LABEL: scatter_16i64_constant_indices:4401; X64-SKX-LARGE: # %bb.0:4402; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm04403; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm04404; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k14405; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax4406; X64-SKX-LARGE-NEXT: vmovdqa64 (%rax), %zmm04407; X64-SKX-LARGE-NEXT: vpscatterdd %zmm1, (%rdi,%zmm0,4) {%k1}4408; X64-SKX-LARGE-NEXT: vzeroupper4409; X64-SKX-LARGE-NEXT: retq4410;4411; X86-SKX-LABEL: scatter_16i64_constant_indices:4412; X86-SKX: # %bb.0:4413; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm04414; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm04415; X86-SKX-NEXT: vpmovd2m %zmm0, %k14416; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax4417; X86-SKX-NEXT: vmovdqa64 {{.*#+}} zmm0 = [0,4294967294,1,4294967288,10,20,50,65536,16777215,2147483647,100,4294965296,2147483648,76897723,7,4227069609]4418; X86-SKX-NEXT: vpscatterdd %zmm1, (%eax,%zmm0,4) {%k1}4419; X86-SKX-NEXT: vzeroupper4420; X86-SKX-NEXT: retl4421 %gep = getelementptr i32, ptr %ptr, <16 x i64> <i64 0, i64 -2, i64 1, i64 -8, i64 10, i64 20, i64 50, i64 65536, i64 16777215, i64 2147483647, i64 100, i64 -2000, i64 -2147483648, i64 76897723, i64 7, i64 -67897687>4422 call void @llvm.masked.scatter.v16i32.v16p0(<16 x i32> %src0, <16 x ptr> %gep, i32 4, <16 x i1> %mask)4423 ret void4424}4425 4426define <4 x i32> @splat_ptr_gather(ptr %ptr, <4 x i1> %mask, <4 x i32> %passthru) {4427; X64-KNL-LABEL: splat_ptr_gather:4428; X64-KNL: # %bb.0:4429; X64-KNL-NEXT: vpslld $31, %xmm0, %xmm04430; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k04431; X64-KNL-NEXT: vmovq %rdi, %xmm04432; X64-KNL-NEXT: vpbroadcastq %xmm0, %ymm04433; X64-KNL-NEXT: kmovw %k0, %eax4434; X64-KNL-NEXT: testb $1, %al4435; X64-KNL-NEXT: je .LBB62_24436; X64-KNL-NEXT: # %bb.1: # %cond.load4437; X64-KNL-NEXT: vmovq %xmm0, %rcx4438; X64-KNL-NEXT: vpinsrd $0, (%rcx), %xmm1, %xmm14439; X64-KNL-NEXT: .LBB62_2: # %else4440; X64-KNL-NEXT: testb $2, %al4441; X64-KNL-NEXT: je .LBB62_44442; X64-KNL-NEXT: # %bb.3: # %cond.load14443; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx4444; X64-KNL-NEXT: vpinsrd $1, (%rcx), %xmm1, %xmm14445; X64-KNL-NEXT: .LBB62_4: # %else24446; X64-KNL-NEXT: testb $4, %al4447; X64-KNL-NEXT: vextracti128 $1, %ymm0, %xmm04448; X64-KNL-NEXT: jne .LBB62_54449; X64-KNL-NEXT: # %bb.6: # %else54450; X64-KNL-NEXT: testb $8, %al4451; X64-KNL-NEXT: jne .LBB62_74452; X64-KNL-NEXT: .LBB62_8: # %else84453; X64-KNL-NEXT: vmovdqa %xmm1, %xmm04454; X64-KNL-NEXT: vzeroupper4455; X64-KNL-NEXT: retq4456; X64-KNL-NEXT: .LBB62_5: # %cond.load44457; X64-KNL-NEXT: vmovq %xmm0, %rcx4458; X64-KNL-NEXT: vpinsrd $2, (%rcx), %xmm1, %xmm14459; X64-KNL-NEXT: testb $8, %al4460; X64-KNL-NEXT: je .LBB62_84461; X64-KNL-NEXT: .LBB62_7: # %cond.load74462; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax4463; X64-KNL-NEXT: vpinsrd $3, (%rax), %xmm1, %xmm14464; X64-KNL-NEXT: vmovdqa %xmm1, %xmm04465; X64-KNL-NEXT: vzeroupper4466; X64-KNL-NEXT: retq4467;4468; X86-KNL-LABEL: splat_ptr_gather:4469; X86-KNL: # %bb.0:4470; X86-KNL-NEXT: vpslld $31, %xmm0, %xmm04471; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k04472; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm04473; X86-KNL-NEXT: kmovw %k0, %eax4474; X86-KNL-NEXT: testb $1, %al4475; X86-KNL-NEXT: jne .LBB62_14476; X86-KNL-NEXT: # %bb.2: # %else4477; X86-KNL-NEXT: testb $2, %al4478; X86-KNL-NEXT: jne .LBB62_34479; X86-KNL-NEXT: .LBB62_4: # %else24480; X86-KNL-NEXT: testb $4, %al4481; X86-KNL-NEXT: jne .LBB62_54482; X86-KNL-NEXT: .LBB62_6: # %else54483; X86-KNL-NEXT: testb $8, %al4484; X86-KNL-NEXT: jne .LBB62_74485; X86-KNL-NEXT: .LBB62_8: # %else84486; X86-KNL-NEXT: vmovdqa %xmm1, %xmm04487; X86-KNL-NEXT: vzeroupper4488; X86-KNL-NEXT: retl4489; X86-KNL-NEXT: .LBB62_1: # %cond.load4490; X86-KNL-NEXT: vmovd %xmm0, %ecx4491; X86-KNL-NEXT: vpinsrd $0, (%ecx), %xmm1, %xmm14492; X86-KNL-NEXT: testb $2, %al4493; X86-KNL-NEXT: je .LBB62_44494; X86-KNL-NEXT: .LBB62_3: # %cond.load14495; X86-KNL-NEXT: vpextrd $1, %xmm0, %ecx4496; X86-KNL-NEXT: vpinsrd $1, (%ecx), %xmm1, %xmm14497; X86-KNL-NEXT: testb $4, %al4498; X86-KNL-NEXT: je .LBB62_64499; X86-KNL-NEXT: .LBB62_5: # %cond.load44500; X86-KNL-NEXT: vpextrd $2, %xmm0, %ecx4501; X86-KNL-NEXT: vpinsrd $2, (%ecx), %xmm1, %xmm14502; X86-KNL-NEXT: testb $8, %al4503; X86-KNL-NEXT: je .LBB62_84504; X86-KNL-NEXT: .LBB62_7: # %cond.load74505; X86-KNL-NEXT: vpextrd $3, %xmm0, %eax4506; X86-KNL-NEXT: vpinsrd $3, (%eax), %xmm1, %xmm14507; X86-KNL-NEXT: vmovdqa %xmm1, %xmm04508; X86-KNL-NEXT: vzeroupper4509; X86-KNL-NEXT: retl4510;4511; X64-SKX-LABEL: splat_ptr_gather:4512; X64-SKX: # %bb.0:4513; X64-SKX-NEXT: vpslld $31, %xmm0, %xmm04514; X64-SKX-NEXT: vpmovd2m %xmm0, %k14515; X64-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm04516; X64-SKX-NEXT: vpgatherdd (%rdi,%xmm0,4), %xmm1 {%k1}4517; X64-SKX-NEXT: vmovdqa %xmm1, %xmm04518; X64-SKX-NEXT: retq4519;4520; X86-SKX-LABEL: splat_ptr_gather:4521; X86-SKX: # %bb.0:4522; X86-SKX-NEXT: vpslld $31, %xmm0, %xmm04523; X86-SKX-NEXT: vpmovd2m %xmm0, %k14524; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax4525; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm04526; X86-SKX-NEXT: vpgatherdd (%eax,%xmm0,4), %xmm1 {%k1}4527; X86-SKX-NEXT: vmovdqa %xmm1, %xmm04528; X86-SKX-NEXT: retl4529 %1 = insertelement <4 x ptr> undef, ptr %ptr, i32 04530 %2 = shufflevector <4 x ptr> %1, <4 x ptr> undef, <4 x i32> zeroinitializer4531 %3 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %2, i32 4, <4 x i1> %mask, <4 x i32> %passthru)4532 ret <4 x i32> %34533}4534declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i32>)4535 4536define void @splat_ptr_scatter(ptr %ptr, <4 x i1> %mask, <4 x i32> %val) {4537; X64-KNL-LABEL: splat_ptr_scatter:4538; X64-KNL: # %bb.0:4539; X64-KNL-NEXT: vpslld $31, %xmm0, %xmm04540; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k04541; X64-KNL-NEXT: vmovq %rdi, %xmm04542; X64-KNL-NEXT: vpbroadcastq %xmm0, %ymm04543; X64-KNL-NEXT: kmovw %k0, %eax4544; X64-KNL-NEXT: testb $1, %al4545; X64-KNL-NEXT: je .LBB63_24546; X64-KNL-NEXT: # %bb.1: # %cond.store4547; X64-KNL-NEXT: vmovq %xmm0, %rcx4548; X64-KNL-NEXT: vmovss %xmm1, (%rcx)4549; X64-KNL-NEXT: .LBB63_2: # %else4550; X64-KNL-NEXT: testb $2, %al4551; X64-KNL-NEXT: je .LBB63_44552; X64-KNL-NEXT: # %bb.3: # %cond.store14553; X64-KNL-NEXT: vpextrq $1, %xmm0, %rcx4554; X64-KNL-NEXT: vextractps $1, %xmm1, (%rcx)4555; X64-KNL-NEXT: .LBB63_4: # %else24556; X64-KNL-NEXT: testb $4, %al4557; X64-KNL-NEXT: vextracti128 $1, %ymm0, %xmm04558; X64-KNL-NEXT: jne .LBB63_54559; X64-KNL-NEXT: # %bb.6: # %else44560; X64-KNL-NEXT: testb $8, %al4561; X64-KNL-NEXT: jne .LBB63_74562; X64-KNL-NEXT: .LBB63_8: # %else64563; X64-KNL-NEXT: vzeroupper4564; X64-KNL-NEXT: retq4565; X64-KNL-NEXT: .LBB63_5: # %cond.store34566; X64-KNL-NEXT: vmovq %xmm0, %rcx4567; X64-KNL-NEXT: vextractps $2, %xmm1, (%rcx)4568; X64-KNL-NEXT: testb $8, %al4569; X64-KNL-NEXT: je .LBB63_84570; X64-KNL-NEXT: .LBB63_7: # %cond.store54571; X64-KNL-NEXT: vpextrq $1, %xmm0, %rax4572; X64-KNL-NEXT: vextractps $3, %xmm1, (%rax)4573; X64-KNL-NEXT: vzeroupper4574; X64-KNL-NEXT: retq4575;4576; X86-KNL-LABEL: splat_ptr_scatter:4577; X86-KNL: # %bb.0:4578; X86-KNL-NEXT: vpslld $31, %xmm0, %xmm04579; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k04580; X86-KNL-NEXT: vpbroadcastd {{[0-9]+}}(%esp), %xmm04581; X86-KNL-NEXT: kmovw %k0, %eax4582; X86-KNL-NEXT: testb $1, %al4583; X86-KNL-NEXT: jne .LBB63_14584; X86-KNL-NEXT: # %bb.2: # %else4585; X86-KNL-NEXT: testb $2, %al4586; X86-KNL-NEXT: jne .LBB63_34587; X86-KNL-NEXT: .LBB63_4: # %else24588; X86-KNL-NEXT: testb $4, %al4589; X86-KNL-NEXT: jne .LBB63_54590; X86-KNL-NEXT: .LBB63_6: # %else44591; X86-KNL-NEXT: testb $8, %al4592; X86-KNL-NEXT: jne .LBB63_74593; X86-KNL-NEXT: .LBB63_8: # %else64594; X86-KNL-NEXT: vzeroupper4595; X86-KNL-NEXT: retl4596; X86-KNL-NEXT: .LBB63_1: # %cond.store4597; X86-KNL-NEXT: vmovd %xmm0, %ecx4598; X86-KNL-NEXT: vmovss %xmm1, (%ecx)4599; X86-KNL-NEXT: testb $2, %al4600; X86-KNL-NEXT: je .LBB63_44601; X86-KNL-NEXT: .LBB63_3: # %cond.store14602; X86-KNL-NEXT: vpextrd $1, %xmm0, %ecx4603; X86-KNL-NEXT: vextractps $1, %xmm1, (%ecx)4604; X86-KNL-NEXT: testb $4, %al4605; X86-KNL-NEXT: je .LBB63_64606; X86-KNL-NEXT: .LBB63_5: # %cond.store34607; X86-KNL-NEXT: vpextrd $2, %xmm0, %ecx4608; X86-KNL-NEXT: vextractps $2, %xmm1, (%ecx)4609; X86-KNL-NEXT: testb $8, %al4610; X86-KNL-NEXT: je .LBB63_84611; X86-KNL-NEXT: .LBB63_7: # %cond.store54612; X86-KNL-NEXT: vpextrd $3, %xmm0, %eax4613; X86-KNL-NEXT: vextractps $3, %xmm1, (%eax)4614; X86-KNL-NEXT: vzeroupper4615; X86-KNL-NEXT: retl4616;4617; X64-SKX-LABEL: splat_ptr_scatter:4618; X64-SKX: # %bb.0:4619; X64-SKX-NEXT: vpslld $31, %xmm0, %xmm04620; X64-SKX-NEXT: vpmovd2m %xmm0, %k14621; X64-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm04622; X64-SKX-NEXT: vpscatterdd %xmm1, (%rdi,%xmm0,4) {%k1}4623; X64-SKX-NEXT: retq4624;4625; X86-SKX-LABEL: splat_ptr_scatter:4626; X86-SKX: # %bb.0:4627; X86-SKX-NEXT: vpslld $31, %xmm0, %xmm04628; X86-SKX-NEXT: vpmovd2m %xmm0, %k14629; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax4630; X86-SKX-NEXT: vpxor %xmm0, %xmm0, %xmm04631; X86-SKX-NEXT: vpscatterdd %xmm1, (%eax,%xmm0,4) {%k1}4632; X86-SKX-NEXT: retl4633 %1 = insertelement <4 x ptr> undef, ptr %ptr, i32 04634 %2 = shufflevector <4 x ptr> %1, <4 x ptr> undef, <4 x i32> zeroinitializer4635 call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %val, <4 x ptr> %2, i32 4, <4 x i1> %mask)4636 ret void4637}4638 4639;4640; PR133104641; Failure to fold scaled-index into gather/scatter scale operand.4642;4643 4644define <8 x float> @scaleidx_x86gather(ptr %base, <8 x i32> %index, <8 x i32> %imask) nounwind {4645; X64-LABEL: scaleidx_x86gather:4646; X64: # %bb.0:4647; X64-NEXT: vpslld $2, %ymm0, %ymm24648; X64-NEXT: vpxor %xmm0, %xmm0, %xmm04649; X64-NEXT: vgatherdps %ymm1, (%rdi,%ymm2), %ymm04650; X64-NEXT: retq4651;4652; X86-LABEL: scaleidx_x86gather:4653; X86: # %bb.0:4654; X86-NEXT: movl {{[0-9]+}}(%esp), %eax4655; X86-NEXT: vxorps %xmm2, %xmm2, %xmm24656; X86-NEXT: vgatherdps %ymm1, (%eax,%ymm0,4), %ymm24657; X86-NEXT: vmovaps %ymm2, %ymm04658; X86-NEXT: retl4659 %mask = bitcast <8 x i32> %imask to <8 x float>4660 %scaledindex = mul <8 x i32> %index, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>4661 %v = call <8 x float> @llvm.x86.avx2.gather.d.ps.256(<8 x float> undef, ptr %base, <8 x i32> %scaledindex, <8 x float> %mask, i8 1) nounwind4662 ret <8 x float> %v4663}4664 4665define <8 x float> @scaleidx_x86gather_outofrange(ptr %base, <8 x i32> %index, <8 x i32> %imask) nounwind {4666; X64-LABEL: scaleidx_x86gather_outofrange:4667; X64: # %bb.0:4668; X64-NEXT: vpslld $2, %ymm0, %ymm24669; X64-NEXT: vpxor %xmm0, %xmm0, %xmm04670; X64-NEXT: vgatherdps %ymm1, (%rdi,%ymm2,4), %ymm04671; X64-NEXT: retq4672;4673; X86-LABEL: scaleidx_x86gather_outofrange:4674; X86: # %bb.0:4675; X86-NEXT: movl {{[0-9]+}}(%esp), %eax4676; X86-NEXT: vpslld $2, %ymm0, %ymm24677; X86-NEXT: vpxor %xmm0, %xmm0, %xmm04678; X86-NEXT: vgatherdps %ymm1, (%eax,%ymm2,4), %ymm04679; X86-NEXT: retl4680 %mask = bitcast <8 x i32> %imask to <8 x float>4681 %scaledindex = mul <8 x i32> %index, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>4682 %v = call <8 x float> @llvm.x86.avx2.gather.d.ps.256(<8 x float> undef, ptr %base, <8 x i32> %scaledindex, <8 x float> %mask, i8 4) nounwind4683 ret <8 x float> %v4684}4685declare <8 x float> @llvm.x86.avx2.gather.d.ps.256(<8 x float>, ptr, <8 x i32>, <8 x float>, i8) nounwind readonly4686 4687define void @scaleidx_x86scatter(<16 x float> %value, ptr %base, <16 x i32> %index, i16 %imask) nounwind {4688; X64-LABEL: scaleidx_x86scatter:4689; X64: # %bb.0:4690; X64-NEXT: kmovw %esi, %k14691; X64-NEXT: vpaddd %zmm1, %zmm1, %zmm14692; X64-NEXT: vscatterdps %zmm0, (%rdi,%zmm1,2) {%k1}4693; X64-NEXT: vzeroupper4694; X64-NEXT: retq4695;4696; X86-LABEL: scaleidx_x86scatter:4697; X86: # %bb.0:4698; X86-NEXT: movl {{[0-9]+}}(%esp), %eax4699; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k14700; X86-NEXT: vscatterdps %zmm0, (%eax,%zmm1,4) {%k1}4701; X86-NEXT: vzeroupper4702; X86-NEXT: retl4703 %mask = bitcast i16 %imask to <16 x i1>4704 %scaledindex = shl <16 x i32> %index, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>4705 call void @llvm.x86.avx512.mask.scatter.dps.512(ptr %base, <16 x i1> %mask, <16 x i32> %scaledindex, <16 x float> %value, i32 2)4706 ret void4707}4708declare void @llvm.x86.avx512.mask.scatter.dps.512(ptr, <16 x i1>, <16 x i32>, <16 x float>, i32)4709 4710define void @scaleidx_scatter(<8 x float> %value, ptr %base, <8 x i32> %index, i8 %imask) nounwind {4711; X64-KNL-LABEL: scaleidx_scatter:4712; X64-KNL: # %bb.0:4713; X64-KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm04714; X64-KNL-NEXT: vpaddd %ymm1, %ymm1, %ymm14715; X64-KNL-NEXT: kmovw %esi, %k04716; X64-KNL-NEXT: kshiftlw $8, %k0, %k04717; X64-KNL-NEXT: kshiftrw $8, %k0, %k14718; X64-KNL-NEXT: vscatterdps %zmm0, (%rdi,%zmm1,4) {%k1}4719; X64-KNL-NEXT: vzeroupper4720; X64-KNL-NEXT: retq4721;4722; X86-KNL-LABEL: scaleidx_scatter:4723; X86-KNL: # %bb.0:4724; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm04725; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax4726; X86-KNL-NEXT: vpaddd %ymm1, %ymm1, %ymm14727; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %ecx4728; X86-KNL-NEXT: kmovw %ecx, %k04729; X86-KNL-NEXT: kshiftlw $8, %k0, %k04730; X86-KNL-NEXT: kshiftrw $8, %k0, %k14731; X86-KNL-NEXT: vscatterdps %zmm0, (%eax,%zmm1,4) {%k1}4732; X86-KNL-NEXT: vzeroupper4733; X86-KNL-NEXT: retl4734;4735; X64-SKX-LABEL: scaleidx_scatter:4736; X64-SKX: # %bb.0:4737; X64-SKX-NEXT: vpaddd %ymm1, %ymm1, %ymm14738; X64-SKX-NEXT: kmovw %esi, %k14739; X64-SKX-NEXT: vscatterdps %ymm0, (%rdi,%ymm1,4) {%k1}4740; X64-SKX-NEXT: vzeroupper4741; X64-SKX-NEXT: retq4742;4743; X86-SKX-LABEL: scaleidx_scatter:4744; X86-SKX: # %bb.0:4745; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax4746; X86-SKX-NEXT: kmovb {{[0-9]+}}(%esp), %k14747; X86-SKX-NEXT: vscatterdps %ymm0, (%eax,%ymm1,8) {%k1}4748; X86-SKX-NEXT: vzeroupper4749; X86-SKX-NEXT: retl4750 %scaledindex = mul <8 x i32> %index, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>4751 %ptrs = getelementptr float, ptr %base, <8 x i32> %scaledindex4752 %mask = bitcast i8 %imask to <8 x i1>4753 call void @llvm.masked.scatter.v8f32.v8p0(<8 x float> %value, <8 x ptr> %ptrs, i32 1, <8 x i1> %mask)4754 ret void4755}4756 4757define void @scaleidx_scatter_outofrange(<8 x float> %value, ptr %base, <8 x i32> %index, i8 %imask) nounwind {4758; X64-KNL-LABEL: scaleidx_scatter_outofrange:4759; X64-KNL: # %bb.0:4760; X64-KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm04761; X64-KNL-NEXT: vpslld $2, %ymm1, %ymm14762; X64-KNL-NEXT: kmovw %esi, %k04763; X64-KNL-NEXT: kshiftlw $8, %k0, %k04764; X64-KNL-NEXT: kshiftrw $8, %k0, %k14765; X64-KNL-NEXT: vscatterdps %zmm0, (%rdi,%zmm1,4) {%k1}4766; X64-KNL-NEXT: vzeroupper4767; X64-KNL-NEXT: retq4768;4769; X86-KNL-LABEL: scaleidx_scatter_outofrange:4770; X86-KNL: # %bb.0:4771; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm04772; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax4773; X86-KNL-NEXT: vpslld $2, %ymm1, %ymm14774; X86-KNL-NEXT: movzbl {{[0-9]+}}(%esp), %ecx4775; X86-KNL-NEXT: kmovw %ecx, %k04776; X86-KNL-NEXT: kshiftlw $8, %k0, %k04777; X86-KNL-NEXT: kshiftrw $8, %k0, %k14778; X86-KNL-NEXT: vscatterdps %zmm0, (%eax,%zmm1,4) {%k1}4779; X86-KNL-NEXT: vzeroupper4780; X86-KNL-NEXT: retl4781;4782; X64-SKX-LABEL: scaleidx_scatter_outofrange:4783; X64-SKX: # %bb.0:4784; X64-SKX-NEXT: vpslld $2, %ymm1, %ymm14785; X64-SKX-NEXT: kmovw %esi, %k14786; X64-SKX-NEXT: vscatterdps %ymm0, (%rdi,%ymm1,4) {%k1}4787; X64-SKX-NEXT: vzeroupper4788; X64-SKX-NEXT: retq4789;4790; X86-SKX-LABEL: scaleidx_scatter_outofrange:4791; X86-SKX: # %bb.0:4792; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax4793; X86-SKX-NEXT: vpslld $2, %ymm1, %ymm14794; X86-SKX-NEXT: kmovb {{[0-9]+}}(%esp), %k14795; X86-SKX-NEXT: vscatterdps %ymm0, (%eax,%ymm1,4) {%k1}4796; X86-SKX-NEXT: vzeroupper4797; X86-SKX-NEXT: retl4798 %scaledindex = mul <8 x i32> %index, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>4799 %ptrs = getelementptr float, ptr %base, <8 x i32> %scaledindex4800 %mask = bitcast i8 %imask to <8 x i1>4801 call void @llvm.masked.scatter.v8f32.v8p0(<8 x float> %value, <8 x ptr> %ptrs, i32 2, <8 x i1> %mask)4802 ret void4803}4804declare void @llvm.masked.scatter.v8f32.v8p0(<8 x float>, <8 x ptr>, i32 immarg, <8 x i1>)4805 4806define <16 x i32> @pr163023_sext(ptr %a0, <16 x i32> %a1) {4807; X64-LABEL: pr163023_sext:4808; X64: # %bb.0:4809; X64-NEXT: kxnorw %k0, %k0, %k14810; X64-NEXT: vpxor %xmm1, %xmm1, %xmm14811; X64-NEXT: vpgatherdd (%rdi,%zmm0), %zmm1 {%k1}4812; X64-NEXT: vmovdqa64 %zmm1, %zmm04813; X64-NEXT: retq4814;4815; X86-LABEL: pr163023_sext:4816; X86: # %bb.0:4817; X86-NEXT: movl {{[0-9]+}}(%esp), %eax4818; X86-NEXT: kxnorw %k0, %k0, %k14819; X86-NEXT: vpxor %xmm1, %xmm1, %xmm14820; X86-NEXT: vpgatherdd (%eax,%zmm0), %zmm1 {%k1}4821; X86-NEXT: vmovdqa64 %zmm1, %zmm04822; X86-NEXT: retl4823 %addr.p = ptrtoint ptr %a0 to i644824 %addr.v = insertelement <1 x i64> poison, i64 %addr.p, i64 04825 %addr.splat = shufflevector <1 x i64> %addr.v, <1 x i64> poison, <16 x i32> zeroinitializer4826 %ofs = sext <16 x i32> %a1 to <16 x i64>4827 %addr = add nuw <16 x i64> %addr.splat, %ofs4828 %ptr = inttoptr <16 x i64> %addr to <16 x ptr>4829 %gather = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %ptr, i32 4, <16 x i1> splat (i1 true), <16 x i32> poison)4830 ret <16 x i32> %gather4831}4832 4833define <16 x i32> @pr163023_zext(ptr %a0, <16 x i32> %a1) {4834; X64-KNL-LABEL: pr163023_zext:4835; X64-KNL: # %bb.0:4836; X64-KNL-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero4837; X64-KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm04838; X64-KNL-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero4839; X64-KNL-NEXT: kxnorw %k0, %k0, %k14840; X64-KNL-NEXT: vpxor %xmm2, %xmm2, %xmm24841; X64-KNL-NEXT: vpxor %xmm3, %xmm3, %xmm34842; X64-KNL-NEXT: kxnorw %k0, %k0, %k24843; X64-KNL-NEXT: vpgatherqd (%rdi,%zmm0), %ymm3 {%k2}4844; X64-KNL-NEXT: vpgatherqd (%rdi,%zmm1), %ymm2 {%k1}4845; X64-KNL-NEXT: vinserti64x4 $1, %ymm3, %zmm2, %zmm04846; X64-KNL-NEXT: retq4847;4848; X86-LABEL: pr163023_zext:4849; X86: # %bb.0:4850; X86-NEXT: movl {{[0-9]+}}(%esp), %eax4851; X86-NEXT: kxnorw %k0, %k0, %k14852; X86-NEXT: vpxor %xmm1, %xmm1, %xmm14853; X86-NEXT: vpgatherdd (%eax,%zmm0), %zmm1 {%k1}4854; X86-NEXT: vmovdqa64 %zmm1, %zmm04855; X86-NEXT: retl4856;4857; X64-SKX-LABEL: pr163023_zext:4858; X64-SKX: # %bb.0:4859; X64-SKX-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero4860; X64-SKX-NEXT: vextracti64x4 $1, %zmm0, %ymm04861; X64-SKX-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero4862; X64-SKX-NEXT: kxnorb %k0, %k0, %k14863; X64-SKX-NEXT: vpxor %xmm2, %xmm2, %xmm24864; X64-SKX-NEXT: kxnorb %k0, %k0, %k24865; X64-SKX-NEXT: vpxor %xmm3, %xmm3, %xmm34866; X64-SKX-NEXT: vpgatherqd (%rdi,%zmm0), %ymm3 {%k2}4867; X64-SKX-NEXT: vpgatherqd (%rdi,%zmm1), %ymm2 {%k1}4868; X64-SKX-NEXT: vinserti64x4 $1, %ymm3, %zmm2, %zmm04869; X64-SKX-NEXT: retq4870 %addr.p = ptrtoint ptr %a0 to i644871 %addr.v = insertelement <1 x i64> poison, i64 %addr.p, i64 04872 %addr.splat = shufflevector <1 x i64> %addr.v, <1 x i64> poison, <16 x i32> zeroinitializer4873 %ofs = zext <16 x i32> %a1 to <16 x i64>4874 %addr = add nuw <16 x i64> %addr.splat, %ofs4875 %ptr = inttoptr <16 x i64> %addr to <16 x ptr>4876 %gather = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %ptr, i32 4, <16 x i1> splat (i1 true), <16 x i32> poison)4877 ret <16 x i32> %gather4878}4879 4880;4881; PR459064882; This used to cause fast-isel to generate bad copy instructions that would4883; cause an error in copyPhysReg.4884;4885 4886%struct.foo = type { ptr, i64, i16, i16, i32 }4887 4888define <8 x i64> @pr45906(<8 x ptr> %ptr) {4889; X64-KNL-LABEL: pr45906:4890; X64-KNL: # %bb.0: # %bb4891; X64-KNL-NEXT: kxnorw %k0, %k0, %k14892; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm14893; X64-KNL-NEXT: vpgatherqq 8(,%zmm0), %zmm1 {%k1}4894; X64-KNL-NEXT: vmovdqa64 %zmm1, %zmm04895; X64-KNL-NEXT: retq4896;4897; X86-KNL-LABEL: pr45906:4898; X86-KNL: # %bb.0: # %bb4899; X86-KNL-NEXT: kxnorw %k0, %k0, %k14900; X86-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm14901; X86-KNL-NEXT: vpgatherdq 4(,%ymm0), %zmm1 {%k1}4902; X86-KNL-NEXT: vmovdqa64 %zmm1, %zmm04903; X86-KNL-NEXT: retl4904;4905; X64-SKX-LABEL: pr45906:4906; X64-SKX: # %bb.0: # %bb4907; X64-SKX-NEXT: kxnorb %k0, %k0, %k14908; X64-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14909; X64-SKX-NEXT: vpgatherqq 8(,%zmm0), %zmm1 {%k1}4910; X64-SKX-NEXT: vmovdqa64 %zmm1, %zmm04911; X64-SKX-NEXT: retq4912;4913; X86-SKX-LABEL: pr45906:4914; X86-SKX: # %bb.0: # %bb4915; X86-SKX-NEXT: kxnorb %k0, %k0, %k14916; X86-SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14917; X86-SKX-NEXT: vpgatherdq 4(,%ymm0), %zmm1 {%k1}4918; X86-SKX-NEXT: vmovdqa64 %zmm1, %zmm04919; X86-SKX-NEXT: retl4920bb:4921 %tmp = getelementptr inbounds %struct.foo, <8 x ptr> %ptr, i64 0, i32 14922 %tmp1 = call <8 x i64> @llvm.masked.gather.v8i64.v8p0(<8 x ptr> %tmp, i32 8, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i64> undef)4923 ret <8 x i64> %tmp14924}4925declare <8 x i64> @llvm.masked.gather.v8i64.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i64>)4926 4927; Test gathers from struct4928%struct.pt = type { float, float, float, i32 }4929%struct.pt2 = type { float, float }4930 4931define <16 x float> @test_gather_structpt_16f32_mask_index(ptr %x, ptr %arr, <16 x i1> %mask, <16 x float> %src0) {4932; X64-KNL-LABEL: test_gather_structpt_16f32_mask_index:4933; X64-KNL: # %bb.0:4934; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm04935; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm04936; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k14937; X64-KNL-NEXT: vpslld $1, (%rsi), %zmm04938; X64-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm04939; X64-KNL-NEXT: vgatherdps (%rdi,%zmm0,8), %zmm1 {%k1}4940; X64-KNL-NEXT: vmovaps %zmm1, %zmm04941; X64-KNL-NEXT: retq4942;4943; X86-KNL-LABEL: test_gather_structpt_16f32_mask_index:4944; X86-KNL: # %bb.0:4945; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm04946; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm04947; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k14948; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax4949; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx4950; X86-KNL-NEXT: vpslld $4, (%ecx), %zmm04951; X86-KNL-NEXT: vgatherdps (%eax,%zmm0), %zmm1 {%k1}4952; X86-KNL-NEXT: vmovaps %zmm1, %zmm04953; X86-KNL-NEXT: retl4954;4955; X64-SKX-SMALL-LABEL: test_gather_structpt_16f32_mask_index:4956; X64-SKX-SMALL: # %bb.0:4957; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm04958; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm04959; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k14960; X64-SKX-SMALL-NEXT: vpslld $1, (%rsi), %zmm04961; X64-SKX-SMALL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm04962; X64-SKX-SMALL-NEXT: vgatherdps (%rdi,%zmm0,8), %zmm1 {%k1}4963; X64-SKX-SMALL-NEXT: vmovaps %zmm1, %zmm04964; X64-SKX-SMALL-NEXT: retq4965;4966; X64-SKX-LARGE-LABEL: test_gather_structpt_16f32_mask_index:4967; X64-SKX-LARGE: # %bb.0:4968; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm04969; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm04970; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k14971; X64-SKX-LARGE-NEXT: vpslld $1, (%rsi), %zmm04972; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax4973; X64-SKX-LARGE-NEXT: vpandd (%rax){1to16}, %zmm0, %zmm04974; X64-SKX-LARGE-NEXT: vgatherdps (%rdi,%zmm0,8), %zmm1 {%k1}4975; X64-SKX-LARGE-NEXT: vmovaps %zmm1, %zmm04976; X64-SKX-LARGE-NEXT: retq4977;4978; X86-SKX-LABEL: test_gather_structpt_16f32_mask_index:4979; X86-SKX: # %bb.0:4980; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm04981; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm04982; X86-SKX-NEXT: vpmovd2m %zmm0, %k14983; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax4984; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx4985; X86-SKX-NEXT: vpslld $4, (%ecx), %zmm04986; X86-SKX-NEXT: vgatherdps (%eax,%zmm0), %zmm1 {%k1}4987; X86-SKX-NEXT: vmovaps %zmm1, %zmm04988; X86-SKX-NEXT: retl4989 %wide.load = load <16 x i32>, ptr %arr, align 44990 %and = and <16 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>4991 %zext = zext <16 x i32> %and to <16 x i64>4992 %ptrs = getelementptr inbounds %struct.pt, ptr %x, <16 x i64> %zext4993 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x float> %src0)4994 ret <16 x float> %res4995}4996 4997define <16 x float> @test_gather_structpt_16f32_mask_index_offset(ptr %x, ptr %arr, <16 x i1> %mask, <16 x float> %src0) {4998; X64-KNL-LABEL: test_gather_structpt_16f32_mask_index_offset:4999; X64-KNL: # %bb.0:5000; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm05001; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm05002; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15003; X64-KNL-NEXT: vpslld $1, (%rsi), %zmm05004; X64-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm05005; X64-KNL-NEXT: vgatherdps 4(%rdi,%zmm0,8), %zmm1 {%k1}5006; X64-KNL-NEXT: vmovaps %zmm1, %zmm05007; X64-KNL-NEXT: retq5008;5009; X86-KNL-LABEL: test_gather_structpt_16f32_mask_index_offset:5010; X86-KNL: # %bb.0:5011; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm05012; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm05013; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15014; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5015; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5016; X86-KNL-NEXT: vpslld $4, (%ecx), %zmm05017; X86-KNL-NEXT: vgatherdps 4(%eax,%zmm0), %zmm1 {%k1}5018; X86-KNL-NEXT: vmovaps %zmm1, %zmm05019; X86-KNL-NEXT: retl5020;5021; X64-SKX-SMALL-LABEL: test_gather_structpt_16f32_mask_index_offset:5022; X64-SKX-SMALL: # %bb.0:5023; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm05024; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm05025; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k15026; X64-SKX-SMALL-NEXT: vpslld $1, (%rsi), %zmm05027; X64-SKX-SMALL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm05028; X64-SKX-SMALL-NEXT: vgatherdps 4(%rdi,%zmm0,8), %zmm1 {%k1}5029; X64-SKX-SMALL-NEXT: vmovaps %zmm1, %zmm05030; X64-SKX-SMALL-NEXT: retq5031;5032; X64-SKX-LARGE-LABEL: test_gather_structpt_16f32_mask_index_offset:5033; X64-SKX-LARGE: # %bb.0:5034; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm05035; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm05036; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k15037; X64-SKX-LARGE-NEXT: vpslld $1, (%rsi), %zmm05038; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5039; X64-SKX-LARGE-NEXT: vpandd (%rax){1to16}, %zmm0, %zmm05040; X64-SKX-LARGE-NEXT: vgatherdps 4(%rdi,%zmm0,8), %zmm1 {%k1}5041; X64-SKX-LARGE-NEXT: vmovaps %zmm1, %zmm05042; X64-SKX-LARGE-NEXT: retq5043;5044; X86-SKX-LABEL: test_gather_structpt_16f32_mask_index_offset:5045; X86-SKX: # %bb.0:5046; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm05047; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm05048; X86-SKX-NEXT: vpmovd2m %zmm0, %k15049; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5050; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5051; X86-SKX-NEXT: vpslld $4, (%ecx), %zmm05052; X86-SKX-NEXT: vgatherdps 4(%eax,%zmm0), %zmm1 {%k1}5053; X86-SKX-NEXT: vmovaps %zmm1, %zmm05054; X86-SKX-NEXT: retl5055 %wide.load = load <16 x i32>, ptr %arr, align 45056 %and = and <16 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5057 %zext = zext <16 x i32> %and to <16 x i64>5058 %ptrs = getelementptr inbounds %struct.pt, ptr %x, <16 x i64> %zext, i32 15059 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x float> %src0)5060 ret <16 x float> %res5061}5062 5063define {<16 x float>, <16 x float>} @test_gather_structpt_16f32_mask_index_pair(ptr %x, ptr %arr, <16 x i1> %mask, <16 x float> %src0) {5064; X64-KNL-LABEL: test_gather_structpt_16f32_mask_index_pair:5065; X64-KNL: # %bb.0:5066; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm05067; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm05068; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15069; X64-KNL-NEXT: vpslld $1, (%rsi), %zmm05070; X64-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm25071; X64-KNL-NEXT: kmovw %k1, %k25072; X64-KNL-NEXT: vmovaps %zmm1, %zmm05073; X64-KNL-NEXT: vgatherdps (%rdi,%zmm2,8), %zmm0 {%k2}5074; X64-KNL-NEXT: vgatherdps 4(%rdi,%zmm2,8), %zmm1 {%k1}5075; X64-KNL-NEXT: retq5076;5077; X86-KNL-LABEL: test_gather_structpt_16f32_mask_index_pair:5078; X86-KNL: # %bb.0:5079; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm05080; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm05081; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15082; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5083; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5084; X86-KNL-NEXT: vpslld $4, (%ecx), %zmm25085; X86-KNL-NEXT: kmovw %k1, %k25086; X86-KNL-NEXT: vmovaps %zmm1, %zmm05087; X86-KNL-NEXT: vgatherdps (%eax,%zmm2), %zmm0 {%k2}5088; X86-KNL-NEXT: vgatherdps 4(%eax,%zmm2), %zmm1 {%k1}5089; X86-KNL-NEXT: retl5090;5091; X64-SKX-SMALL-LABEL: test_gather_structpt_16f32_mask_index_pair:5092; X64-SKX-SMALL: # %bb.0:5093; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm05094; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm05095; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k15096; X64-SKX-SMALL-NEXT: vpslld $1, (%rsi), %zmm05097; X64-SKX-SMALL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm25098; X64-SKX-SMALL-NEXT: kmovw %k1, %k25099; X64-SKX-SMALL-NEXT: vmovaps %zmm1, %zmm05100; X64-SKX-SMALL-NEXT: vgatherdps (%rdi,%zmm2,8), %zmm0 {%k2}5101; X64-SKX-SMALL-NEXT: vgatherdps 4(%rdi,%zmm2,8), %zmm1 {%k1}5102; X64-SKX-SMALL-NEXT: retq5103;5104; X64-SKX-LARGE-LABEL: test_gather_structpt_16f32_mask_index_pair:5105; X64-SKX-LARGE: # %bb.0:5106; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm05107; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm05108; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k15109; X64-SKX-LARGE-NEXT: vpslld $1, (%rsi), %zmm05110; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5111; X64-SKX-LARGE-NEXT: vpandd (%rax){1to16}, %zmm0, %zmm25112; X64-SKX-LARGE-NEXT: kmovw %k1, %k25113; X64-SKX-LARGE-NEXT: vmovaps %zmm1, %zmm05114; X64-SKX-LARGE-NEXT: vgatherdps (%rdi,%zmm2,8), %zmm0 {%k2}5115; X64-SKX-LARGE-NEXT: vgatherdps 4(%rdi,%zmm2,8), %zmm1 {%k1}5116; X64-SKX-LARGE-NEXT: retq5117;5118; X86-SKX-LABEL: test_gather_structpt_16f32_mask_index_pair:5119; X86-SKX: # %bb.0:5120; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm05121; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm05122; X86-SKX-NEXT: vpmovd2m %zmm0, %k15123; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5124; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5125; X86-SKX-NEXT: vpslld $4, (%ecx), %zmm25126; X86-SKX-NEXT: kmovw %k1, %k25127; X86-SKX-NEXT: vmovaps %zmm1, %zmm05128; X86-SKX-NEXT: vgatherdps (%eax,%zmm2), %zmm0 {%k2}5129; X86-SKX-NEXT: vgatherdps 4(%eax,%zmm2), %zmm1 {%k1}5130; X86-SKX-NEXT: retl5131 %wide.load = load <16 x i32>, ptr %arr, align 45132 %and = and <16 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5133 %zext = zext <16 x i32> %and to <16 x i64>5134 %ptrs1 = getelementptr inbounds %struct.pt, ptr %x, <16 x i64> %zext5135 %res1 = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs1, i32 4, <16 x i1> %mask, <16 x float> %src0)5136 %ptrs = getelementptr inbounds %struct.pt, ptr %x, <16 x i64> %zext, i32 15137 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x float> %src0)5138 %pair1 = insertvalue {<16 x float>, <16 x float>} poison, <16 x float> %res1, 05139 %pair2 = insertvalue {<16 x float>, <16 x float>} %pair1, <16 x float> %res, 15140 ret {<16 x float>, <16 x float>} %pair25141}5142 5143define <8 x float> @test_gather_structpt2_8f32_mask_index(ptr %x, ptr %arr, <8 x i1> %mask, <8 x float> %src0) {5144; X64-KNL-LABEL: test_gather_structpt2_8f32_mask_index:5145; X64-KNL: # %bb.0:5146; X64-KNL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm15147; X64-KNL-NEXT: vpmovsxwq %xmm0, %zmm05148; X64-KNL-NEXT: vpsllq $63, %zmm0, %zmm05149; X64-KNL-NEXT: vptestmq %zmm0, %zmm0, %k15150; X64-KNL-NEXT: vbroadcastss {{.*#+}} ymm0 = [536870911,536870911,536870911,536870911,536870911,536870911,536870911,536870911]5151; X64-KNL-NEXT: vandps (%rsi), %ymm0, %ymm05152; X64-KNL-NEXT: vgatherdps (%rdi,%zmm0,8), %zmm1 {%k1}5153; X64-KNL-NEXT: vmovaps %ymm1, %ymm05154; X64-KNL-NEXT: retq5155;5156; X86-KNL-LABEL: test_gather_structpt2_8f32_mask_index:5157; X86-KNL: # %bb.0:5158; X86-KNL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm15159; X86-KNL-NEXT: vpmovsxwq %xmm0, %zmm05160; X86-KNL-NEXT: vpsllq $63, %zmm0, %zmm05161; X86-KNL-NEXT: vptestmq %zmm0, %zmm0, %k15162; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5163; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5164; X86-KNL-NEXT: vmovdqu (%ecx), %ymm05165; X86-KNL-NEXT: vpslld $3, %ymm0, %ymm05166; X86-KNL-NEXT: vgatherdps (%eax,%zmm0), %zmm1 {%k1}5167; X86-KNL-NEXT: vmovaps %ymm1, %ymm05168; X86-KNL-NEXT: retl5169;5170; X64-SKX-SMALL-LABEL: test_gather_structpt2_8f32_mask_index:5171; X64-SKX-SMALL: # %bb.0:5172; X64-SKX-SMALL-NEXT: vpmovsxwd %xmm0, %ymm05173; X64-SKX-SMALL-NEXT: vpslld $31, %ymm0, %ymm05174; X64-SKX-SMALL-NEXT: vpmovd2m %ymm0, %k15175; X64-SKX-SMALL-NEXT: vmovups (%rsi), %ymm05176; X64-SKX-SMALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm05177; X64-SKX-SMALL-NEXT: vgatherdps (%rdi,%ymm0,8), %ymm1 {%k1}5178; X64-SKX-SMALL-NEXT: vmovaps %ymm1, %ymm05179; X64-SKX-SMALL-NEXT: retq5180;5181; X64-SKX-LARGE-LABEL: test_gather_structpt2_8f32_mask_index:5182; X64-SKX-LARGE: # %bb.0:5183; X64-SKX-LARGE-NEXT: vpmovsxwd %xmm0, %ymm05184; X64-SKX-LARGE-NEXT: vpslld $31, %ymm0, %ymm05185; X64-SKX-LARGE-NEXT: vpmovd2m %ymm0, %k15186; X64-SKX-LARGE-NEXT: vmovups (%rsi), %ymm05187; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5188; X64-SKX-LARGE-NEXT: vandps (%rax){1to8}, %ymm0, %ymm05189; X64-SKX-LARGE-NEXT: vgatherdps (%rdi,%ymm0,8), %ymm1 {%k1}5190; X64-SKX-LARGE-NEXT: vmovaps %ymm1, %ymm05191; X64-SKX-LARGE-NEXT: retq5192;5193; X86-SKX-LABEL: test_gather_structpt2_8f32_mask_index:5194; X86-SKX: # %bb.0:5195; X86-SKX-NEXT: vpmovsxwd %xmm0, %ymm05196; X86-SKX-NEXT: vpslld $31, %ymm0, %ymm05197; X86-SKX-NEXT: vpmovd2m %ymm0, %k15198; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5199; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5200; X86-SKX-NEXT: vmovups (%ecx), %ymm05201; X86-SKX-NEXT: vgatherdps (%eax,%ymm0,8), %ymm1 {%k1}5202; X86-SKX-NEXT: vmovaps %ymm1, %ymm05203; X86-SKX-NEXT: retl5204 %wide.load = load <8 x i32>, ptr %arr, align 45205 %and = and <8 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5206 %zext = zext <8 x i32> %and to <8 x i64>5207 %ptrs = getelementptr inbounds %struct.pt2, ptr %x, <8 x i64> %zext5208 %res = call <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr> %ptrs, i32 4, <8 x i1> %mask, <8 x float> %src0)5209 ret <8 x float> %res5210}5211 5212define <8 x float> @test_gather_structpt2_8f32_mask_index_offset(ptr %x, ptr %arr, <8 x i1> %mask, <8 x float> %src0) {5213; X64-KNL-LABEL: test_gather_structpt2_8f32_mask_index_offset:5214; X64-KNL: # %bb.0:5215; X64-KNL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm15216; X64-KNL-NEXT: vpmovsxwq %xmm0, %zmm05217; X64-KNL-NEXT: vpsllq $63, %zmm0, %zmm05218; X64-KNL-NEXT: vptestmq %zmm0, %zmm0, %k15219; X64-KNL-NEXT: vbroadcastss {{.*#+}} ymm0 = [536870911,536870911,536870911,536870911,536870911,536870911,536870911,536870911]5220; X64-KNL-NEXT: vandps (%rsi), %ymm0, %ymm05221; X64-KNL-NEXT: vgatherdps 4(%rdi,%zmm0,8), %zmm1 {%k1}5222; X64-KNL-NEXT: vmovaps %ymm1, %ymm05223; X64-KNL-NEXT: retq5224;5225; X86-KNL-LABEL: test_gather_structpt2_8f32_mask_index_offset:5226; X86-KNL: # %bb.0:5227; X86-KNL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm15228; X86-KNL-NEXT: vpmovsxwq %xmm0, %zmm05229; X86-KNL-NEXT: vpsllq $63, %zmm0, %zmm05230; X86-KNL-NEXT: vptestmq %zmm0, %zmm0, %k15231; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5232; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5233; X86-KNL-NEXT: vmovdqu (%ecx), %ymm05234; X86-KNL-NEXT: vpslld $3, %ymm0, %ymm05235; X86-KNL-NEXT: vgatherdps 4(%eax,%zmm0), %zmm1 {%k1}5236; X86-KNL-NEXT: vmovaps %ymm1, %ymm05237; X86-KNL-NEXT: retl5238;5239; X64-SKX-SMALL-LABEL: test_gather_structpt2_8f32_mask_index_offset:5240; X64-SKX-SMALL: # %bb.0:5241; X64-SKX-SMALL-NEXT: vpmovsxwd %xmm0, %ymm05242; X64-SKX-SMALL-NEXT: vpslld $31, %ymm0, %ymm05243; X64-SKX-SMALL-NEXT: vpmovd2m %ymm0, %k15244; X64-SKX-SMALL-NEXT: vmovups (%rsi), %ymm05245; X64-SKX-SMALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm05246; X64-SKX-SMALL-NEXT: vgatherdps 4(%rdi,%ymm0,8), %ymm1 {%k1}5247; X64-SKX-SMALL-NEXT: vmovaps %ymm1, %ymm05248; X64-SKX-SMALL-NEXT: retq5249;5250; X64-SKX-LARGE-LABEL: test_gather_structpt2_8f32_mask_index_offset:5251; X64-SKX-LARGE: # %bb.0:5252; X64-SKX-LARGE-NEXT: vpmovsxwd %xmm0, %ymm05253; X64-SKX-LARGE-NEXT: vpslld $31, %ymm0, %ymm05254; X64-SKX-LARGE-NEXT: vpmovd2m %ymm0, %k15255; X64-SKX-LARGE-NEXT: vmovups (%rsi), %ymm05256; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5257; X64-SKX-LARGE-NEXT: vandps (%rax){1to8}, %ymm0, %ymm05258; X64-SKX-LARGE-NEXT: vgatherdps 4(%rdi,%ymm0,8), %ymm1 {%k1}5259; X64-SKX-LARGE-NEXT: vmovaps %ymm1, %ymm05260; X64-SKX-LARGE-NEXT: retq5261;5262; X86-SKX-LABEL: test_gather_structpt2_8f32_mask_index_offset:5263; X86-SKX: # %bb.0:5264; X86-SKX-NEXT: vpmovsxwd %xmm0, %ymm05265; X86-SKX-NEXT: vpslld $31, %ymm0, %ymm05266; X86-SKX-NEXT: vpmovd2m %ymm0, %k15267; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5268; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5269; X86-SKX-NEXT: vmovups (%ecx), %ymm05270; X86-SKX-NEXT: vgatherdps 4(%eax,%ymm0,8), %ymm1 {%k1}5271; X86-SKX-NEXT: vmovaps %ymm1, %ymm05272; X86-SKX-NEXT: retl5273 %wide.load = load <8 x i32>, ptr %arr, align 45274 %and = and <8 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5275 %zext = zext <8 x i32> %and to <8 x i64>5276 %ptrs = getelementptr inbounds %struct.pt2, ptr %x, <8 x i64> %zext, i32 15277 %res = call <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr> %ptrs, i32 4, <8 x i1> %mask, <8 x float> %src0)5278 ret <8 x float> %res5279}5280 5281define {<8 x float>, <8 x float>} @test_gather_structpt2_8f32_mask_index_pair(ptr %x, ptr %arr, <8 x i1> %mask, <8 x float> %src0) {5282; X64-KNL-LABEL: test_gather_structpt2_8f32_mask_index_pair:5283; X64-KNL: # %bb.0:5284; X64-KNL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm15285; X64-KNL-NEXT: vpmovsxwq %xmm0, %zmm05286; X64-KNL-NEXT: vpsllq $63, %zmm0, %zmm05287; X64-KNL-NEXT: vptestmq %zmm0, %zmm0, %k15288; X64-KNL-NEXT: vbroadcastss {{.*#+}} ymm0 = [536870911,536870911,536870911,536870911,536870911,536870911,536870911,536870911]5289; X64-KNL-NEXT: vandps (%rsi), %ymm0, %ymm25290; X64-KNL-NEXT: vmovaps %zmm1, %zmm05291; X64-KNL-NEXT: kmovw %k1, %k25292; X64-KNL-NEXT: vgatherdps (%rdi,%zmm2,8), %zmm0 {%k2}5293; X64-KNL-NEXT: vgatherdps 4(%rdi,%zmm2,8), %zmm1 {%k1}5294; X64-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm05295; X64-KNL-NEXT: # kill: def $ymm1 killed $ymm1 killed $zmm15296; X64-KNL-NEXT: retq5297;5298; X86-KNL-LABEL: test_gather_structpt2_8f32_mask_index_pair:5299; X86-KNL: # %bb.0:5300; X86-KNL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm15301; X86-KNL-NEXT: vpmovsxwq %xmm0, %zmm05302; X86-KNL-NEXT: vpsllq $63, %zmm0, %zmm05303; X86-KNL-NEXT: vptestmq %zmm0, %zmm0, %k15304; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5305; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5306; X86-KNL-NEXT: vmovdqu (%ecx), %ymm05307; X86-KNL-NEXT: vpslld $3, %ymm0, %ymm25308; X86-KNL-NEXT: vmovaps %zmm1, %zmm05309; X86-KNL-NEXT: kmovw %k1, %k25310; X86-KNL-NEXT: vgatherdps (%eax,%zmm2), %zmm0 {%k2}5311; X86-KNL-NEXT: vgatherdps 4(%eax,%zmm2), %zmm1 {%k1}5312; X86-KNL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm05313; X86-KNL-NEXT: # kill: def $ymm1 killed $ymm1 killed $zmm15314; X86-KNL-NEXT: retl5315;5316; X64-SKX-SMALL-LABEL: test_gather_structpt2_8f32_mask_index_pair:5317; X64-SKX-SMALL: # %bb.0:5318; X64-SKX-SMALL-NEXT: vpmovsxwd %xmm0, %ymm05319; X64-SKX-SMALL-NEXT: vpslld $31, %ymm0, %ymm05320; X64-SKX-SMALL-NEXT: vpmovd2m %ymm0, %k15321; X64-SKX-SMALL-NEXT: vmovups (%rsi), %ymm05322; X64-SKX-SMALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm25323; X64-SKX-SMALL-NEXT: kmovw %k1, %k25324; X64-SKX-SMALL-NEXT: vmovaps %ymm1, %ymm05325; X64-SKX-SMALL-NEXT: vgatherdps (%rdi,%ymm2,8), %ymm0 {%k2}5326; X64-SKX-SMALL-NEXT: vgatherdps 4(%rdi,%ymm2,8), %ymm1 {%k1}5327; X64-SKX-SMALL-NEXT: retq5328;5329; X64-SKX-LARGE-LABEL: test_gather_structpt2_8f32_mask_index_pair:5330; X64-SKX-LARGE: # %bb.0:5331; X64-SKX-LARGE-NEXT: vpmovsxwd %xmm0, %ymm05332; X64-SKX-LARGE-NEXT: vpslld $31, %ymm0, %ymm05333; X64-SKX-LARGE-NEXT: vpmovd2m %ymm0, %k15334; X64-SKX-LARGE-NEXT: vmovups (%rsi), %ymm05335; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5336; X64-SKX-LARGE-NEXT: vandps (%rax){1to8}, %ymm0, %ymm25337; X64-SKX-LARGE-NEXT: kmovw %k1, %k25338; X64-SKX-LARGE-NEXT: vmovaps %ymm1, %ymm05339; X64-SKX-LARGE-NEXT: vgatherdps (%rdi,%ymm2,8), %ymm0 {%k2}5340; X64-SKX-LARGE-NEXT: vgatherdps 4(%rdi,%ymm2,8), %ymm1 {%k1}5341; X64-SKX-LARGE-NEXT: retq5342;5343; X86-SKX-LABEL: test_gather_structpt2_8f32_mask_index_pair:5344; X86-SKX: # %bb.0:5345; X86-SKX-NEXT: vpmovsxwd %xmm0, %ymm05346; X86-SKX-NEXT: vpslld $31, %ymm0, %ymm05347; X86-SKX-NEXT: vpmovd2m %ymm0, %k15348; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5349; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5350; X86-SKX-NEXT: vmovups (%ecx), %ymm25351; X86-SKX-NEXT: kmovw %k1, %k25352; X86-SKX-NEXT: vmovaps %ymm1, %ymm05353; X86-SKX-NEXT: vgatherdps (%eax,%ymm2,8), %ymm0 {%k2}5354; X86-SKX-NEXT: vgatherdps 4(%eax,%ymm2,8), %ymm1 {%k1}5355; X86-SKX-NEXT: retl5356 %wide.load = load <8 x i32>, ptr %arr, align 45357 %and = and <8 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5358 %zext = zext <8 x i32> %and to <8 x i64>5359 %ptrs1 = getelementptr inbounds %struct.pt2, ptr %x , <8 x i64> %zext5360 %res1 = call <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr> %ptrs1, i32 4, <8 x i1> %mask, <8 x float> %src0)5361 %ptrs = getelementptr inbounds %struct.pt2, ptr %x, <8 x i64> %zext, i32 15362 %res = call <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr> %ptrs, i32 4, <8 x i1> %mask, <8 x float> %src0)5363 %pair1 = insertvalue {<8 x float>, <8 x float>} poison, <8 x float> %res1, 05364 %pair2 = insertvalue {<8 x float>, <8 x float>} %pair1, <8 x float> %res, 15365 ret {<8 x float>, <8 x float>} %pair25366}5367 5368define <16 x float> @test_gather_structpt2_16f32_mask_index(ptr %x, ptr %arr, <16 x i1> %mask, <16 x float> %src0) {5369; X64-KNL-LABEL: test_gather_structpt2_16f32_mask_index:5370; X64-KNL: # %bb.0:5371; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm05372; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm05373; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15374; X64-KNL-NEXT: vmovdqu64 (%rsi), %zmm05375; X64-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm05376; X64-KNL-NEXT: vgatherdps (%rdi,%zmm0,8), %zmm1 {%k1}5377; X64-KNL-NEXT: vmovaps %zmm1, %zmm05378; X64-KNL-NEXT: retq5379;5380; X86-KNL-LABEL: test_gather_structpt2_16f32_mask_index:5381; X86-KNL: # %bb.0:5382; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm05383; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm05384; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15385; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5386; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5387; X86-KNL-NEXT: vmovups (%ecx), %zmm05388; X86-KNL-NEXT: vgatherdps (%eax,%zmm0,8), %zmm1 {%k1}5389; X86-KNL-NEXT: vmovaps %zmm1, %zmm05390; X86-KNL-NEXT: retl5391;5392; X64-SKX-SMALL-LABEL: test_gather_structpt2_16f32_mask_index:5393; X64-SKX-SMALL: # %bb.0:5394; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm05395; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm05396; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k15397; X64-SKX-SMALL-NEXT: vmovups (%rsi), %zmm05398; X64-SKX-SMALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm05399; X64-SKX-SMALL-NEXT: vgatherdps (%rdi,%zmm0,8), %zmm1 {%k1}5400; X64-SKX-SMALL-NEXT: vmovaps %zmm1, %zmm05401; X64-SKX-SMALL-NEXT: retq5402;5403; X64-SKX-LARGE-LABEL: test_gather_structpt2_16f32_mask_index:5404; X64-SKX-LARGE: # %bb.0:5405; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm05406; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm05407; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k15408; X64-SKX-LARGE-NEXT: vmovups (%rsi), %zmm05409; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5410; X64-SKX-LARGE-NEXT: vandps (%rax){1to16}, %zmm0, %zmm05411; X64-SKX-LARGE-NEXT: vgatherdps (%rdi,%zmm0,8), %zmm1 {%k1}5412; X64-SKX-LARGE-NEXT: vmovaps %zmm1, %zmm05413; X64-SKX-LARGE-NEXT: retq5414;5415; X86-SKX-LABEL: test_gather_structpt2_16f32_mask_index:5416; X86-SKX: # %bb.0:5417; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm05418; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm05419; X86-SKX-NEXT: vpmovd2m %zmm0, %k15420; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5421; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5422; X86-SKX-NEXT: vmovups (%ecx), %zmm05423; X86-SKX-NEXT: vgatherdps (%eax,%zmm0,8), %zmm1 {%k1}5424; X86-SKX-NEXT: vmovaps %zmm1, %zmm05425; X86-SKX-NEXT: retl5426 %wide.load = load <16 x i32>, ptr %arr, align 45427 %and = and <16 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5428 %zext = zext <16 x i32> %and to <16 x i64>5429 %ptrs = getelementptr inbounds %struct.pt2, ptr %x, <16 x i64> %zext5430 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x float> %src0)5431 ret <16 x float> %res5432}5433 5434define <16 x float> @test_gather_structpt2_16f32_mask_index_offset(ptr %x, ptr %arr, <16 x i1> %mask, <16 x float> %src0) {5435; X64-KNL-LABEL: test_gather_structpt2_16f32_mask_index_offset:5436; X64-KNL: # %bb.0:5437; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm05438; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm05439; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15440; X64-KNL-NEXT: vmovdqu64 (%rsi), %zmm05441; X64-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm05442; X64-KNL-NEXT: vgatherdps 4(%rdi,%zmm0,8), %zmm1 {%k1}5443; X64-KNL-NEXT: vmovaps %zmm1, %zmm05444; X64-KNL-NEXT: retq5445;5446; X86-KNL-LABEL: test_gather_structpt2_16f32_mask_index_offset:5447; X86-KNL: # %bb.0:5448; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm05449; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm05450; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15451; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5452; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5453; X86-KNL-NEXT: vmovups (%ecx), %zmm05454; X86-KNL-NEXT: vgatherdps 4(%eax,%zmm0,8), %zmm1 {%k1}5455; X86-KNL-NEXT: vmovaps %zmm1, %zmm05456; X86-KNL-NEXT: retl5457;5458; X64-SKX-SMALL-LABEL: test_gather_structpt2_16f32_mask_index_offset:5459; X64-SKX-SMALL: # %bb.0:5460; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm05461; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm05462; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k15463; X64-SKX-SMALL-NEXT: vmovups (%rsi), %zmm05464; X64-SKX-SMALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm05465; X64-SKX-SMALL-NEXT: vgatherdps 4(%rdi,%zmm0,8), %zmm1 {%k1}5466; X64-SKX-SMALL-NEXT: vmovaps %zmm1, %zmm05467; X64-SKX-SMALL-NEXT: retq5468;5469; X64-SKX-LARGE-LABEL: test_gather_structpt2_16f32_mask_index_offset:5470; X64-SKX-LARGE: # %bb.0:5471; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm05472; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm05473; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k15474; X64-SKX-LARGE-NEXT: vmovups (%rsi), %zmm05475; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5476; X64-SKX-LARGE-NEXT: vandps (%rax){1to16}, %zmm0, %zmm05477; X64-SKX-LARGE-NEXT: vgatherdps 4(%rdi,%zmm0,8), %zmm1 {%k1}5478; X64-SKX-LARGE-NEXT: vmovaps %zmm1, %zmm05479; X64-SKX-LARGE-NEXT: retq5480;5481; X86-SKX-LABEL: test_gather_structpt2_16f32_mask_index_offset:5482; X86-SKX: # %bb.0:5483; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm05484; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm05485; X86-SKX-NEXT: vpmovd2m %zmm0, %k15486; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5487; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5488; X86-SKX-NEXT: vmovups (%ecx), %zmm05489; X86-SKX-NEXT: vgatherdps 4(%eax,%zmm0,8), %zmm1 {%k1}5490; X86-SKX-NEXT: vmovaps %zmm1, %zmm05491; X86-SKX-NEXT: retl5492 %wide.load = load <16 x i32>, ptr %arr, align 45493 %and = and <16 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5494 %zext = zext <16 x i32> %and to <16 x i64>5495 %ptrs = getelementptr inbounds %struct.pt2, ptr %x, <16 x i64> %zext, i32 15496 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x float> %src0)5497 ret <16 x float> %res5498}5499 5500define {<16 x float>, <16 x float>} @test_gather_structpt2_16f32_mask_index_pair(ptr %x, ptr %arr, <16 x i1> %mask, <16 x float> %src0) {5501; X64-KNL-LABEL: test_gather_structpt2_16f32_mask_index_pair:5502; X64-KNL: # %bb.0:5503; X64-KNL-NEXT: vpmovsxbd %xmm0, %zmm05504; X64-KNL-NEXT: vpslld $31, %zmm0, %zmm05505; X64-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15506; X64-KNL-NEXT: vmovdqu64 (%rsi), %zmm05507; X64-KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm25508; X64-KNL-NEXT: kmovw %k1, %k25509; X64-KNL-NEXT: vmovaps %zmm1, %zmm05510; X64-KNL-NEXT: vgatherdps (%rdi,%zmm2,8), %zmm0 {%k2}5511; X64-KNL-NEXT: vgatherdps 4(%rdi,%zmm2,8), %zmm1 {%k1}5512; X64-KNL-NEXT: retq5513;5514; X86-KNL-LABEL: test_gather_structpt2_16f32_mask_index_pair:5515; X86-KNL: # %bb.0:5516; X86-KNL-NEXT: vpmovsxbd %xmm0, %zmm05517; X86-KNL-NEXT: vpslld $31, %zmm0, %zmm05518; X86-KNL-NEXT: vptestmd %zmm0, %zmm0, %k15519; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %eax5520; X86-KNL-NEXT: movl {{[0-9]+}}(%esp), %ecx5521; X86-KNL-NEXT: vmovups (%ecx), %zmm25522; X86-KNL-NEXT: kmovw %k1, %k25523; X86-KNL-NEXT: vmovaps %zmm1, %zmm05524; X86-KNL-NEXT: vgatherdps (%eax,%zmm2,8), %zmm0 {%k2}5525; X86-KNL-NEXT: vgatherdps 4(%eax,%zmm2,8), %zmm1 {%k1}5526; X86-KNL-NEXT: retl5527;5528; X64-SKX-SMALL-LABEL: test_gather_structpt2_16f32_mask_index_pair:5529; X64-SKX-SMALL: # %bb.0:5530; X64-SKX-SMALL-NEXT: vpmovsxbd %xmm0, %zmm05531; X64-SKX-SMALL-NEXT: vpslld $31, %zmm0, %zmm05532; X64-SKX-SMALL-NEXT: vpmovd2m %zmm0, %k15533; X64-SKX-SMALL-NEXT: vmovups (%rsi), %zmm05534; X64-SKX-SMALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm25535; X64-SKX-SMALL-NEXT: kmovw %k1, %k25536; X64-SKX-SMALL-NEXT: vmovaps %zmm1, %zmm05537; X64-SKX-SMALL-NEXT: vgatherdps (%rdi,%zmm2,8), %zmm0 {%k2}5538; X64-SKX-SMALL-NEXT: vgatherdps 4(%rdi,%zmm2,8), %zmm1 {%k1}5539; X64-SKX-SMALL-NEXT: retq5540;5541; X64-SKX-LARGE-LABEL: test_gather_structpt2_16f32_mask_index_pair:5542; X64-SKX-LARGE: # %bb.0:5543; X64-SKX-LARGE-NEXT: vpmovsxbd %xmm0, %zmm05544; X64-SKX-LARGE-NEXT: vpslld $31, %zmm0, %zmm05545; X64-SKX-LARGE-NEXT: vpmovd2m %zmm0, %k15546; X64-SKX-LARGE-NEXT: vmovups (%rsi), %zmm05547; X64-SKX-LARGE-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax5548; X64-SKX-LARGE-NEXT: vandps (%rax){1to16}, %zmm0, %zmm25549; X64-SKX-LARGE-NEXT: kmovw %k1, %k25550; X64-SKX-LARGE-NEXT: vmovaps %zmm1, %zmm05551; X64-SKX-LARGE-NEXT: vgatherdps (%rdi,%zmm2,8), %zmm0 {%k2}5552; X64-SKX-LARGE-NEXT: vgatherdps 4(%rdi,%zmm2,8), %zmm1 {%k1}5553; X64-SKX-LARGE-NEXT: retq5554;5555; X86-SKX-LABEL: test_gather_structpt2_16f32_mask_index_pair:5556; X86-SKX: # %bb.0:5557; X86-SKX-NEXT: vpmovsxbd %xmm0, %zmm05558; X86-SKX-NEXT: vpslld $31, %zmm0, %zmm05559; X86-SKX-NEXT: vpmovd2m %zmm0, %k15560; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %eax5561; X86-SKX-NEXT: movl {{[0-9]+}}(%esp), %ecx5562; X86-SKX-NEXT: vmovups (%ecx), %zmm25563; X86-SKX-NEXT: kmovw %k1, %k25564; X86-SKX-NEXT: vmovaps %zmm1, %zmm05565; X86-SKX-NEXT: vgatherdps (%eax,%zmm2,8), %zmm0 {%k2}5566; X86-SKX-NEXT: vgatherdps 4(%eax,%zmm2,8), %zmm1 {%k1}5567; X86-SKX-NEXT: retl5568 %wide.load = load <16 x i32>, ptr %arr, align 45569 %and = and <16 x i32> %wide.load, <i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911, i32 536870911>5570 %zext = zext <16 x i32> %and to <16 x i64>5571 %ptrs1 = getelementptr inbounds %struct.pt2, ptr %x, <16 x i64> %zext5572 %res1 = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs1, i32 4, <16 x i1> %mask, <16 x float> %src0)5573 %ptrs = getelementptr inbounds %struct.pt2, ptr %x, <16 x i64> %zext, i32 15574 %res = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %ptrs, i32 4, <16 x i1> %mask, <16 x float> %src0)5575 %pair1 = insertvalue {<16 x float>, <16 x float>} poison, <16 x float> %res1, 05576 %pair2 = insertvalue {<16 x float>, <16 x float>} %pair1, <16 x float> %res, 15577 ret {<16 x float>, <16 x float>} %pair25578}5579