934 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s3 4declare <4 x float> @llvm.x86.avx2.gather.d.ps(<4 x float>, ptr, <4 x i32>, <4 x float>, i8)5 6define <4 x float> @test_llvm_x86_avx2_gather_d_ps(ptr %b, <4 x i32> %iv, <4 x float> %mask) #0 {7; CHECK-LABEL: test_llvm_x86_avx2_gather_d_ps:8; CHECK: # %bb.0: # %entry9; CHECK-NEXT: movq %rsp, %rax10; CHECK-NEXT: movq $-1, %rcx11; CHECK-NEXT: sarq $63, %rax12; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm213; CHECK-NEXT: orq %rax, %rdi14; CHECK-NEXT: vmovq %rax, %xmm315; CHECK-NEXT: vpbroadcastq %xmm3, %xmm316; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm017; CHECK-NEXT: vgatherdps %xmm1, (%rdi,%xmm0), %xmm218; CHECK-NEXT: shlq $47, %rax19; CHECK-NEXT: vmovaps %xmm2, %xmm020; CHECK-NEXT: orq %rax, %rsp21; CHECK-NEXT: retq22entry:23 %v = call <4 x float> @llvm.x86.avx2.gather.d.ps(<4 x float> zeroinitializer, ptr %b, <4 x i32> %iv, <4 x float> %mask, i8 1)24 ret <4 x float> %v25}26 27declare <4 x float> @llvm.x86.avx2.gather.q.ps(<4 x float>, ptr, <2 x i64>, <4 x float>, i8)28 29define <4 x float> @test_llvm_x86_avx2_gather_q_ps(ptr %b, <2 x i64> %iv, <4 x float> %mask) #0 {30; CHECK-LABEL: test_llvm_x86_avx2_gather_q_ps:31; CHECK: # %bb.0: # %entry32; CHECK-NEXT: movq %rsp, %rax33; CHECK-NEXT: movq $-1, %rcx34; CHECK-NEXT: sarq $63, %rax35; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm236; CHECK-NEXT: orq %rax, %rdi37; CHECK-NEXT: vmovq %rax, %xmm338; CHECK-NEXT: vpbroadcastq %xmm3, %xmm339; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm040; CHECK-NEXT: vgatherqps %xmm1, (%rdi,%xmm0), %xmm241; CHECK-NEXT: shlq $47, %rax42; CHECK-NEXT: vmovaps %xmm2, %xmm043; CHECK-NEXT: orq %rax, %rsp44; CHECK-NEXT: retq45entry:46 %v = call <4 x float> @llvm.x86.avx2.gather.q.ps(<4 x float> zeroinitializer, ptr %b, <2 x i64> %iv, <4 x float> %mask, i8 1)47 ret <4 x float> %v48}49 50declare <2 x double> @llvm.x86.avx2.gather.d.pd(<2 x double>, ptr, <4 x i32>, <2 x double>, i8)51 52define <2 x double> @test_llvm_x86_avx2_gather_d_pd(ptr %b, <4 x i32> %iv, <2 x double> %mask) #0 {53; CHECK-LABEL: test_llvm_x86_avx2_gather_d_pd:54; CHECK: # %bb.0: # %entry55; CHECK-NEXT: movq %rsp, %rax56; CHECK-NEXT: movq $-1, %rcx57; CHECK-NEXT: sarq $63, %rax58; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm259; CHECK-NEXT: orq %rax, %rdi60; CHECK-NEXT: vmovq %rax, %xmm361; CHECK-NEXT: vpbroadcastq %xmm3, %xmm362; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm063; CHECK-NEXT: vgatherdpd %xmm1, (%rdi,%xmm0), %xmm264; CHECK-NEXT: shlq $47, %rax65; CHECK-NEXT: vmovapd %xmm2, %xmm066; CHECK-NEXT: orq %rax, %rsp67; CHECK-NEXT: retq68entry:69 %v = call <2 x double> @llvm.x86.avx2.gather.d.pd(<2 x double> zeroinitializer, ptr %b, <4 x i32> %iv, <2 x double> %mask, i8 1)70 ret <2 x double> %v71}72 73declare <2 x double> @llvm.x86.avx2.gather.q.pd(<2 x double>, ptr, <2 x i64>, <2 x double>, i8)74 75define <2 x double> @test_llvm_x86_avx2_gather_q_pd(ptr %b, <2 x i64> %iv, <2 x double> %mask) #0 {76; CHECK-LABEL: test_llvm_x86_avx2_gather_q_pd:77; CHECK: # %bb.0: # %entry78; CHECK-NEXT: movq %rsp, %rax79; CHECK-NEXT: movq $-1, %rcx80; CHECK-NEXT: sarq $63, %rax81; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm282; CHECK-NEXT: orq %rax, %rdi83; CHECK-NEXT: vmovq %rax, %xmm384; CHECK-NEXT: vpbroadcastq %xmm3, %xmm385; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm086; CHECK-NEXT: vgatherqpd %xmm1, (%rdi,%xmm0), %xmm287; CHECK-NEXT: shlq $47, %rax88; CHECK-NEXT: vmovapd %xmm2, %xmm089; CHECK-NEXT: orq %rax, %rsp90; CHECK-NEXT: retq91entry:92 %v = call <2 x double> @llvm.x86.avx2.gather.q.pd(<2 x double> zeroinitializer, ptr %b, <2 x i64> %iv, <2 x double> %mask, i8 1)93 ret <2 x double> %v94}95 96declare <8 x float> @llvm.x86.avx2.gather.d.ps.256(<8 x float>, ptr, <8 x i32>, <8 x float>, i8)97 98define <8 x float> @test_llvm_x86_avx2_gather_d_ps_256(ptr %b, <8 x i32> %iv, <8 x float> %mask) #0 {99; CHECK-LABEL: test_llvm_x86_avx2_gather_d_ps_256:100; CHECK: # %bb.0: # %entry101; CHECK-NEXT: movq %rsp, %rax102; CHECK-NEXT: movq $-1, %rcx103; CHECK-NEXT: sarq $63, %rax104; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2105; CHECK-NEXT: orq %rax, %rdi106; CHECK-NEXT: vmovq %rax, %xmm3107; CHECK-NEXT: vpbroadcastq %xmm3, %ymm3108; CHECK-NEXT: vpor %ymm0, %ymm3, %ymm0109; CHECK-NEXT: vgatherdps %ymm1, (%rdi,%ymm0), %ymm2110; CHECK-NEXT: shlq $47, %rax111; CHECK-NEXT: vmovaps %ymm2, %ymm0112; CHECK-NEXT: orq %rax, %rsp113; CHECK-NEXT: retq114entry:115 %v = call <8 x float> @llvm.x86.avx2.gather.d.ps.256(<8 x float> zeroinitializer, ptr %b, <8 x i32> %iv, <8 x float> %mask, i8 1)116 ret <8 x float> %v117}118 119declare <4 x float> @llvm.x86.avx2.gather.q.ps.256(<4 x float>, ptr, <4 x i64>, <4 x float>, i8)120 121define <4 x float> @test_llvm_x86_avx2_gather_q_ps_256(ptr %b, <4 x i64> %iv, <4 x float> %mask) #0 {122; CHECK-LABEL: test_llvm_x86_avx2_gather_q_ps_256:123; CHECK: # %bb.0: # %entry124; CHECK-NEXT: movq %rsp, %rax125; CHECK-NEXT: movq $-1, %rcx126; CHECK-NEXT: sarq $63, %rax127; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2128; CHECK-NEXT: orq %rax, %rdi129; CHECK-NEXT: vmovq %rax, %xmm3130; CHECK-NEXT: vpbroadcastq %xmm3, %ymm3131; CHECK-NEXT: vpor %ymm0, %ymm3, %ymm0132; CHECK-NEXT: vgatherqps %xmm1, (%rdi,%ymm0), %xmm2133; CHECK-NEXT: shlq $47, %rax134; CHECK-NEXT: vmovaps %xmm2, %xmm0135; CHECK-NEXT: orq %rax, %rsp136; CHECK-NEXT: vzeroupper137; CHECK-NEXT: retq138entry:139 %v = call <4 x float> @llvm.x86.avx2.gather.q.ps.256(<4 x float> zeroinitializer, ptr %b, <4 x i64> %iv, <4 x float> %mask, i8 1)140 ret <4 x float> %v141}142 143declare <4 x double> @llvm.x86.avx2.gather.d.pd.256(<4 x double>, ptr, <4 x i32>, <4 x double>, i8)144 145define <4 x double> @test_llvm_x86_avx2_gather_d_pd_256(ptr %b, <4 x i32> %iv, <4 x double> %mask) #0 {146; CHECK-LABEL: test_llvm_x86_avx2_gather_d_pd_256:147; CHECK: # %bb.0: # %entry148; CHECK-NEXT: movq %rsp, %rax149; CHECK-NEXT: movq $-1, %rcx150; CHECK-NEXT: sarq $63, %rax151; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2152; CHECK-NEXT: orq %rax, %rdi153; CHECK-NEXT: vmovq %rax, %xmm3154; CHECK-NEXT: vpbroadcastq %xmm3, %xmm3155; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm0156; CHECK-NEXT: vgatherdpd %ymm1, (%rdi,%xmm0), %ymm2157; CHECK-NEXT: shlq $47, %rax158; CHECK-NEXT: vmovapd %ymm2, %ymm0159; CHECK-NEXT: orq %rax, %rsp160; CHECK-NEXT: retq161entry:162 %v = call <4 x double> @llvm.x86.avx2.gather.d.pd.256(<4 x double> zeroinitializer, ptr %b, <4 x i32> %iv, <4 x double> %mask, i8 1)163 ret <4 x double> %v164}165 166declare <4 x double> @llvm.x86.avx2.gather.q.pd.256(<4 x double>, ptr, <4 x i64>, <4 x double>, i8)167 168define <4 x double> @test_llvm_x86_avx2_gather_q_pd_256(ptr %b, <4 x i64> %iv, <4 x double> %mask) #0 {169; CHECK-LABEL: test_llvm_x86_avx2_gather_q_pd_256:170; CHECK: # %bb.0: # %entry171; CHECK-NEXT: movq %rsp, %rax172; CHECK-NEXT: movq $-1, %rcx173; CHECK-NEXT: sarq $63, %rax174; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2175; CHECK-NEXT: orq %rax, %rdi176; CHECK-NEXT: vmovq %rax, %xmm3177; CHECK-NEXT: vpbroadcastq %xmm3, %ymm3178; CHECK-NEXT: vpor %ymm0, %ymm3, %ymm0179; CHECK-NEXT: vgatherqpd %ymm1, (%rdi,%ymm0), %ymm2180; CHECK-NEXT: shlq $47, %rax181; CHECK-NEXT: vmovapd %ymm2, %ymm0182; CHECK-NEXT: orq %rax, %rsp183; CHECK-NEXT: retq184entry:185 %v = call <4 x double> @llvm.x86.avx2.gather.q.pd.256(<4 x double> zeroinitializer, ptr %b, <4 x i64> %iv, <4 x double> %mask, i8 1)186 ret <4 x double> %v187}188 189declare <4 x i32> @llvm.x86.avx2.gather.d.d(<4 x i32>, ptr, <4 x i32>, <4 x i32>, i8)190 191define <4 x i32> @test_llvm_x86_avx2_gather_d_d(ptr %b, <4 x i32> %iv, <4 x i32> %mask) #0 {192; CHECK-LABEL: test_llvm_x86_avx2_gather_d_d:193; CHECK: # %bb.0: # %entry194; CHECK-NEXT: movq %rsp, %rax195; CHECK-NEXT: movq $-1, %rcx196; CHECK-NEXT: sarq $63, %rax197; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2198; CHECK-NEXT: orq %rax, %rdi199; CHECK-NEXT: vmovq %rax, %xmm3200; CHECK-NEXT: vpbroadcastq %xmm3, %xmm3201; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm0202; CHECK-NEXT: vpgatherdd %xmm1, (%rdi,%xmm0), %xmm2203; CHECK-NEXT: shlq $47, %rax204; CHECK-NEXT: vmovdqa %xmm2, %xmm0205; CHECK-NEXT: orq %rax, %rsp206; CHECK-NEXT: retq207entry:208 %v = call <4 x i32> @llvm.x86.avx2.gather.d.d(<4 x i32> zeroinitializer, ptr %b, <4 x i32> %iv, <4 x i32> %mask, i8 1)209 ret <4 x i32> %v210}211 212declare <4 x i32> @llvm.x86.avx2.gather.q.d(<4 x i32>, ptr, <2 x i64>, <4 x i32>, i8)213 214define <4 x i32> @test_llvm_x86_avx2_gather_q_d(ptr %b, <2 x i64> %iv, <4 x i32> %mask) #0 {215; CHECK-LABEL: test_llvm_x86_avx2_gather_q_d:216; CHECK: # %bb.0: # %entry217; CHECK-NEXT: movq %rsp, %rax218; CHECK-NEXT: movq $-1, %rcx219; CHECK-NEXT: sarq $63, %rax220; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2221; CHECK-NEXT: orq %rax, %rdi222; CHECK-NEXT: vmovq %rax, %xmm3223; CHECK-NEXT: vpbroadcastq %xmm3, %xmm3224; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm0225; CHECK-NEXT: vpgatherqd %xmm1, (%rdi,%xmm0), %xmm2226; CHECK-NEXT: shlq $47, %rax227; CHECK-NEXT: vmovdqa %xmm2, %xmm0228; CHECK-NEXT: orq %rax, %rsp229; CHECK-NEXT: retq230entry:231 %v = call <4 x i32> @llvm.x86.avx2.gather.q.d(<4 x i32> zeroinitializer, ptr %b, <2 x i64> %iv, <4 x i32> %mask, i8 1)232 ret <4 x i32> %v233}234 235declare <2 x i64> @llvm.x86.avx2.gather.d.q(<2 x i64>, ptr, <4 x i32>, <2 x i64>, i8)236 237define <2 x i64> @test_llvm_x86_avx2_gather_d_q(ptr %b, <4 x i32> %iv, <2 x i64> %mask) #0 {238; CHECK-LABEL: test_llvm_x86_avx2_gather_d_q:239; CHECK: # %bb.0: # %entry240; CHECK-NEXT: movq %rsp, %rax241; CHECK-NEXT: movq $-1, %rcx242; CHECK-NEXT: sarq $63, %rax243; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2244; CHECK-NEXT: orq %rax, %rdi245; CHECK-NEXT: vmovq %rax, %xmm3246; CHECK-NEXT: vpbroadcastq %xmm3, %xmm3247; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm0248; CHECK-NEXT: vpgatherdq %xmm1, (%rdi,%xmm0), %xmm2249; CHECK-NEXT: shlq $47, %rax250; CHECK-NEXT: vmovdqa %xmm2, %xmm0251; CHECK-NEXT: orq %rax, %rsp252; CHECK-NEXT: retq253entry:254 %v = call <2 x i64> @llvm.x86.avx2.gather.d.q(<2 x i64> zeroinitializer, ptr %b, <4 x i32> %iv, <2 x i64> %mask, i8 1)255 ret <2 x i64> %v256}257 258declare <2 x i64> @llvm.x86.avx2.gather.q.q(<2 x i64>, ptr, <2 x i64>, <2 x i64>, i8)259 260define <2 x i64> @test_llvm_x86_avx2_gather_q_q(ptr %b, <2 x i64> %iv, <2 x i64> %mask) #0 {261; CHECK-LABEL: test_llvm_x86_avx2_gather_q_q:262; CHECK: # %bb.0: # %entry263; CHECK-NEXT: movq %rsp, %rax264; CHECK-NEXT: movq $-1, %rcx265; CHECK-NEXT: sarq $63, %rax266; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2267; CHECK-NEXT: orq %rax, %rdi268; CHECK-NEXT: vmovq %rax, %xmm3269; CHECK-NEXT: vpbroadcastq %xmm3, %xmm3270; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm0271; CHECK-NEXT: vpgatherqq %xmm1, (%rdi,%xmm0), %xmm2272; CHECK-NEXT: shlq $47, %rax273; CHECK-NEXT: vmovdqa %xmm2, %xmm0274; CHECK-NEXT: orq %rax, %rsp275; CHECK-NEXT: retq276entry:277 %v = call <2 x i64> @llvm.x86.avx2.gather.q.q(<2 x i64> zeroinitializer, ptr %b, <2 x i64> %iv, <2 x i64> %mask, i8 1)278 ret <2 x i64> %v279}280 281declare <8 x i32> @llvm.x86.avx2.gather.d.d.256(<8 x i32>, ptr, <8 x i32>, <8 x i32>, i8)282 283define <8 x i32> @test_llvm_x86_avx2_gather_d_d_256(ptr %b, <8 x i32> %iv, <8 x i32> %mask) #0 {284; CHECK-LABEL: test_llvm_x86_avx2_gather_d_d_256:285; CHECK: # %bb.0: # %entry286; CHECK-NEXT: movq %rsp, %rax287; CHECK-NEXT: movq $-1, %rcx288; CHECK-NEXT: sarq $63, %rax289; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2290; CHECK-NEXT: orq %rax, %rdi291; CHECK-NEXT: vmovq %rax, %xmm3292; CHECK-NEXT: vpbroadcastq %xmm3, %ymm3293; CHECK-NEXT: vpor %ymm0, %ymm3, %ymm0294; CHECK-NEXT: vpgatherdd %ymm1, (%rdi,%ymm0), %ymm2295; CHECK-NEXT: shlq $47, %rax296; CHECK-NEXT: vmovdqa %ymm2, %ymm0297; CHECK-NEXT: orq %rax, %rsp298; CHECK-NEXT: retq299entry:300 %v = call <8 x i32> @llvm.x86.avx2.gather.d.d.256(<8 x i32> zeroinitializer, ptr %b, <8 x i32> %iv, <8 x i32> %mask, i8 1)301 ret <8 x i32> %v302}303 304declare <4 x i32> @llvm.x86.avx2.gather.q.d.256(<4 x i32>, ptr, <4 x i64>, <4 x i32>, i8)305 306define <4 x i32> @test_llvm_x86_avx2_gather_q_d_256(ptr %b, <4 x i64> %iv, <4 x i32> %mask) #0 {307; CHECK-LABEL: test_llvm_x86_avx2_gather_q_d_256:308; CHECK: # %bb.0: # %entry309; CHECK-NEXT: movq %rsp, %rax310; CHECK-NEXT: movq $-1, %rcx311; CHECK-NEXT: sarq $63, %rax312; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2313; CHECK-NEXT: orq %rax, %rdi314; CHECK-NEXT: vmovq %rax, %xmm3315; CHECK-NEXT: vpbroadcastq %xmm3, %ymm3316; CHECK-NEXT: vpor %ymm0, %ymm3, %ymm0317; CHECK-NEXT: vpgatherqd %xmm1, (%rdi,%ymm0), %xmm2318; CHECK-NEXT: shlq $47, %rax319; CHECK-NEXT: vmovdqa %xmm2, %xmm0320; CHECK-NEXT: orq %rax, %rsp321; CHECK-NEXT: vzeroupper322; CHECK-NEXT: retq323entry:324 %v = call <4 x i32> @llvm.x86.avx2.gather.q.d.256(<4 x i32> zeroinitializer, ptr %b, <4 x i64> %iv, <4 x i32> %mask, i8 1)325 ret <4 x i32> %v326}327 328declare <4 x i64> @llvm.x86.avx2.gather.d.q.256(<4 x i64>, ptr, <4 x i32>, <4 x i64>, i8)329 330define <4 x i64> @test_llvm_x86_avx2_gather_d_q_256(ptr %b, <4 x i32> %iv, <4 x i64> %mask) #0 {331; CHECK-LABEL: test_llvm_x86_avx2_gather_d_q_256:332; CHECK: # %bb.0: # %entry333; CHECK-NEXT: movq %rsp, %rax334; CHECK-NEXT: movq $-1, %rcx335; CHECK-NEXT: sarq $63, %rax336; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2337; CHECK-NEXT: orq %rax, %rdi338; CHECK-NEXT: vmovq %rax, %xmm3339; CHECK-NEXT: vpbroadcastq %xmm3, %xmm3340; CHECK-NEXT: vpor %xmm0, %xmm3, %xmm0341; CHECK-NEXT: vpgatherdq %ymm1, (%rdi,%xmm0), %ymm2342; CHECK-NEXT: shlq $47, %rax343; CHECK-NEXT: vmovdqa %ymm2, %ymm0344; CHECK-NEXT: orq %rax, %rsp345; CHECK-NEXT: retq346entry:347 %v = call <4 x i64> @llvm.x86.avx2.gather.d.q.256(<4 x i64> zeroinitializer, ptr %b, <4 x i32> %iv, <4 x i64> %mask, i8 1)348 ret <4 x i64> %v349}350 351declare <4 x i64> @llvm.x86.avx2.gather.q.q.256(<4 x i64>, ptr, <4 x i64>, <4 x i64>, i8)352 353define <4 x i64> @test_llvm_x86_avx2_gather_q_q_256(ptr %b, <4 x i64> %iv, <4 x i64> %mask) #0 {354; CHECK-LABEL: test_llvm_x86_avx2_gather_q_q_256:355; CHECK: # %bb.0: # %entry356; CHECK-NEXT: movq %rsp, %rax357; CHECK-NEXT: movq $-1, %rcx358; CHECK-NEXT: sarq $63, %rax359; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2360; CHECK-NEXT: orq %rax, %rdi361; CHECK-NEXT: vmovq %rax, %xmm3362; CHECK-NEXT: vpbroadcastq %xmm3, %ymm3363; CHECK-NEXT: vpor %ymm0, %ymm3, %ymm0364; CHECK-NEXT: vpgatherqq %ymm1, (%rdi,%ymm0), %ymm2365; CHECK-NEXT: shlq $47, %rax366; CHECK-NEXT: vmovdqa %ymm2, %ymm0367; CHECK-NEXT: orq %rax, %rsp368; CHECK-NEXT: retq369entry:370 %v = call <4 x i64> @llvm.x86.avx2.gather.q.q.256(<4 x i64> zeroinitializer, ptr %b, <4 x i64> %iv, <4 x i64> %mask, i8 1)371 ret <4 x i64> %v372}373 374declare <16 x float> @llvm.x86.avx512.gather.dps.512(<16 x float>, ptr, <16 x i32>, i16, i32)375 376define <16 x float> @test_llvm_x86_avx512_gather_dps_512(ptr %b, <16 x i32> %iv) #1 {377; CHECK-LABEL: test_llvm_x86_avx512_gather_dps_512:378; CHECK: # %bb.0: # %entry379; CHECK-NEXT: movq %rsp, %rax380; CHECK-NEXT: movq $-1, %rcx381; CHECK-NEXT: sarq $63, %rax382; CHECK-NEXT: kxnorw %k0, %k0, %k1383; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1384; CHECK-NEXT: orq %rax, %rdi385; CHECK-NEXT: vpbroadcastq %rax, %zmm2386; CHECK-NEXT: vporq %zmm0, %zmm2, %zmm0387; CHECK-NEXT: vgatherdps (%rdi,%zmm0), %zmm1 {%k1}388; CHECK-NEXT: shlq $47, %rax389; CHECK-NEXT: vmovaps %zmm1, %zmm0390; CHECK-NEXT: orq %rax, %rsp391; CHECK-NEXT: retq392entry:393 %v = call <16 x float> @llvm.x86.avx512.gather.dps.512(<16 x float> zeroinitializer, ptr %b, <16 x i32> %iv, i16 -1, i32 1)394 ret <16 x float> %v395}396 397declare <8 x double> @llvm.x86.avx512.gather.dpd.512(<8 x double>, ptr, <8 x i32>, i8, i32)398 399define <8 x double> @test_llvm_x86_avx512_gather_dpd_512(ptr %b, <8 x i32> %iv) #1 {400; CHECK-LABEL: test_llvm_x86_avx512_gather_dpd_512:401; CHECK: # %bb.0: # %entry402; CHECK-NEXT: movq %rsp, %rax403; CHECK-NEXT: movq $-1, %rcx404; CHECK-NEXT: sarq $63, %rax405; CHECK-NEXT: kxnorw %k0, %k0, %k1406; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1407; CHECK-NEXT: orq %rax, %rdi408; CHECK-NEXT: vmovq %rax, %xmm2409; CHECK-NEXT: vpbroadcastq %xmm2, %ymm2410; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0411; CHECK-NEXT: vgatherdpd (%rdi,%ymm0), %zmm1 {%k1}412; CHECK-NEXT: shlq $47, %rax413; CHECK-NEXT: vmovapd %zmm1, %zmm0414; CHECK-NEXT: orq %rax, %rsp415; CHECK-NEXT: retq416entry:417 %v = call <8 x double> @llvm.x86.avx512.gather.dpd.512(<8 x double> zeroinitializer, ptr %b, <8 x i32> %iv, i8 -1, i32 1)418 ret <8 x double> %v419}420 421declare <8 x float> @llvm.x86.avx512.gather.qps.512(<8 x float>, ptr, <8 x i64>, i8, i32)422 423define <8 x float> @test_llvm_x86_avx512_gather_qps_512(ptr %b, <8 x i64> %iv) #1 {424; CHECK-LABEL: test_llvm_x86_avx512_gather_qps_512:425; CHECK: # %bb.0: # %entry426; CHECK-NEXT: movq %rsp, %rax427; CHECK-NEXT: movq $-1, %rcx428; CHECK-NEXT: sarq $63, %rax429; CHECK-NEXT: kxnorw %k0, %k0, %k1430; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1431; CHECK-NEXT: orq %rax, %rdi432; CHECK-NEXT: vpbroadcastq %rax, %zmm2433; CHECK-NEXT: vporq %zmm0, %zmm2, %zmm0434; CHECK-NEXT: vgatherqps (%rdi,%zmm0), %ymm1 {%k1}435; CHECK-NEXT: shlq $47, %rax436; CHECK-NEXT: vmovaps %ymm1, %ymm0437; CHECK-NEXT: orq %rax, %rsp438; CHECK-NEXT: retq439entry:440 %v = call <8 x float> @llvm.x86.avx512.gather.qps.512(<8 x float> zeroinitializer, ptr %b, <8 x i64> %iv, i8 -1, i32 1)441 ret <8 x float> %v442}443 444declare <8 x double> @llvm.x86.avx512.gather.qpd.512(<8 x double>, ptr, <8 x i64>, i8, i32)445 446define <8 x double> @test_llvm_x86_avx512_gather_qpd_512(ptr %b, <8 x i64> %iv) #1 {447; CHECK-LABEL: test_llvm_x86_avx512_gather_qpd_512:448; CHECK: # %bb.0: # %entry449; CHECK-NEXT: movq %rsp, %rax450; CHECK-NEXT: movq $-1, %rcx451; CHECK-NEXT: sarq $63, %rax452; CHECK-NEXT: kxnorw %k0, %k0, %k1453; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1454; CHECK-NEXT: orq %rax, %rdi455; CHECK-NEXT: vpbroadcastq %rax, %zmm2456; CHECK-NEXT: vporq %zmm0, %zmm2, %zmm0457; CHECK-NEXT: vgatherqpd (%rdi,%zmm0), %zmm1 {%k1}458; CHECK-NEXT: shlq $47, %rax459; CHECK-NEXT: vmovapd %zmm1, %zmm0460; CHECK-NEXT: orq %rax, %rsp461; CHECK-NEXT: retq462entry:463 %v = call <8 x double> @llvm.x86.avx512.gather.qpd.512(<8 x double> zeroinitializer, ptr %b, <8 x i64> %iv, i8 -1, i32 1)464 ret <8 x double> %v465}466 467declare <16 x i32> @llvm.x86.avx512.gather.dpi.512(<16 x i32>, ptr, <16 x i32>, i16, i32)468 469define <16 x i32> @test_llvm_x86_avx512_gather_dpi_512(ptr %b, <16 x i32> %iv) #1 {470; CHECK-LABEL: test_llvm_x86_avx512_gather_dpi_512:471; CHECK: # %bb.0: # %entry472; CHECK-NEXT: movq %rsp, %rax473; CHECK-NEXT: movq $-1, %rcx474; CHECK-NEXT: sarq $63, %rax475; CHECK-NEXT: kxnorw %k0, %k0, %k1476; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1477; CHECK-NEXT: orq %rax, %rdi478; CHECK-NEXT: vpbroadcastq %rax, %zmm2479; CHECK-NEXT: vporq %zmm0, %zmm2, %zmm0480; CHECK-NEXT: vpgatherdd (%rdi,%zmm0), %zmm1 {%k1}481; CHECK-NEXT: shlq $47, %rax482; CHECK-NEXT: vmovdqa64 %zmm1, %zmm0483; CHECK-NEXT: orq %rax, %rsp484; CHECK-NEXT: retq485entry:486 %v = call <16 x i32> @llvm.x86.avx512.gather.dpi.512(<16 x i32> zeroinitializer, ptr %b, <16 x i32> %iv, i16 -1, i32 1)487 ret <16 x i32> %v488}489 490declare <8 x i64> @llvm.x86.avx512.gather.dpq.512(<8 x i64>, ptr, <8 x i32>, i8, i32)491 492define <8 x i64> @test_llvm_x86_avx512_gather_dpq_512(ptr %b, <8 x i32> %iv) #1 {493; CHECK-LABEL: test_llvm_x86_avx512_gather_dpq_512:494; CHECK: # %bb.0: # %entry495; CHECK-NEXT: movq %rsp, %rax496; CHECK-NEXT: movq $-1, %rcx497; CHECK-NEXT: sarq $63, %rax498; CHECK-NEXT: kxnorw %k0, %k0, %k1499; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1500; CHECK-NEXT: orq %rax, %rdi501; CHECK-NEXT: vmovq %rax, %xmm2502; CHECK-NEXT: vpbroadcastq %xmm2, %ymm2503; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0504; CHECK-NEXT: vpgatherdq (%rdi,%ymm0), %zmm1 {%k1}505; CHECK-NEXT: shlq $47, %rax506; CHECK-NEXT: vmovdqa64 %zmm1, %zmm0507; CHECK-NEXT: orq %rax, %rsp508; CHECK-NEXT: retq509entry:510 %v = call <8 x i64> @llvm.x86.avx512.gather.dpq.512(<8 x i64> zeroinitializer, ptr %b, <8 x i32> %iv, i8 -1, i32 1)511 ret <8 x i64> %v512}513 514 515declare <8 x i32> @llvm.x86.avx512.gather.qpi.512(<8 x i32>, ptr, <8 x i64>, i8, i32)516 517define <8 x i32> @test_llvm_x86_avx512_gather_qpi_512(ptr %b, <8 x i64> %iv) #1 {518; CHECK-LABEL: test_llvm_x86_avx512_gather_qpi_512:519; CHECK: # %bb.0: # %entry520; CHECK-NEXT: movq %rsp, %rax521; CHECK-NEXT: movq $-1, %rcx522; CHECK-NEXT: sarq $63, %rax523; CHECK-NEXT: kxnorw %k0, %k0, %k1524; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1525; CHECK-NEXT: orq %rax, %rdi526; CHECK-NEXT: vpbroadcastq %rax, %zmm2527; CHECK-NEXT: vporq %zmm0, %zmm2, %zmm0528; CHECK-NEXT: vpgatherqd (%rdi,%zmm0), %ymm1 {%k1}529; CHECK-NEXT: shlq $47, %rax530; CHECK-NEXT: vmovdqa %ymm1, %ymm0531; CHECK-NEXT: orq %rax, %rsp532; CHECK-NEXT: retq533entry:534 %v = call <8 x i32> @llvm.x86.avx512.gather.qpi.512(<8 x i32> zeroinitializer, ptr %b, <8 x i64> %iv, i8 -1, i32 1)535 ret <8 x i32> %v536}537 538declare <8 x i64> @llvm.x86.avx512.gather.qpq.512(<8 x i64>, ptr, <8 x i64>, i8, i32)539 540define <8 x i64> @test_llvm_x86_avx512_gather_qpq_512(ptr %b, <8 x i64> %iv) #1 {541; CHECK-LABEL: test_llvm_x86_avx512_gather_qpq_512:542; CHECK: # %bb.0: # %entry543; CHECK-NEXT: movq %rsp, %rax544; CHECK-NEXT: movq $-1, %rcx545; CHECK-NEXT: sarq $63, %rax546; CHECK-NEXT: kxnorw %k0, %k0, %k1547; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1548; CHECK-NEXT: orq %rax, %rdi549; CHECK-NEXT: vpbroadcastq %rax, %zmm2550; CHECK-NEXT: vporq %zmm0, %zmm2, %zmm0551; CHECK-NEXT: vpgatherqq (%rdi,%zmm0), %zmm1 {%k1}552; CHECK-NEXT: shlq $47, %rax553; CHECK-NEXT: vmovdqa64 %zmm1, %zmm0554; CHECK-NEXT: orq %rax, %rsp555; CHECK-NEXT: retq556entry:557 %v = call <8 x i64> @llvm.x86.avx512.gather.qpq.512(<8 x i64> zeroinitializer, ptr %b, <8 x i64> %iv, i8 -1, i32 1)558 ret <8 x i64> %v559}560 561declare <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float>, ptr, <4 x i32>, i8, i32)562 563define <4 x float> @test_llvm_x86_avx512_gather3siv4_sf(ptr %b, <4 x i32> %iv) #2 {564; CHECK-LABEL: test_llvm_x86_avx512_gather3siv4_sf:565; CHECK: # %bb.0: # %entry566; CHECK-NEXT: movq %rsp, %rax567; CHECK-NEXT: movq $-1, %rcx568; CHECK-NEXT: sarq $63, %rax569; CHECK-NEXT: kxnorw %k0, %k0, %k1570; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1571; CHECK-NEXT: orq %rax, %rdi572; CHECK-NEXT: vpbroadcastq %rax, %xmm2573; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0574; CHECK-NEXT: vgatherdps (%rdi,%xmm0), %xmm1 {%k1}575; CHECK-NEXT: shlq $47, %rax576; CHECK-NEXT: vmovaps %xmm1, %xmm0577; CHECK-NEXT: orq %rax, %rsp578; CHECK-NEXT: retq579entry:580 %v = call <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float> zeroinitializer, ptr %b, <4 x i32> %iv, i8 -1, i32 1)581 ret <4 x float> %v582}583 584declare <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float>, ptr, <2 x i64>, i8, i32)585 586define <4 x float> @test_llvm_x86_avx512_gather3div4_sf(ptr %b, <2 x i64> %iv) #2 {587; CHECK-LABEL: test_llvm_x86_avx512_gather3div4_sf:588; CHECK: # %bb.0: # %entry589; CHECK-NEXT: movq %rsp, %rax590; CHECK-NEXT: movq $-1, %rcx591; CHECK-NEXT: sarq $63, %rax592; CHECK-NEXT: kxnorw %k0, %k0, %k1593; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1594; CHECK-NEXT: orq %rax, %rdi595; CHECK-NEXT: vpbroadcastq %rax, %xmm2596; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0597; CHECK-NEXT: vgatherqps (%rdi,%xmm0), %xmm1 {%k1}598; CHECK-NEXT: shlq $47, %rax599; CHECK-NEXT: vmovaps %xmm1, %xmm0600; CHECK-NEXT: orq %rax, %rsp601; CHECK-NEXT: retq602entry:603 %v = call <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float> zeroinitializer, ptr %b, <2 x i64> %iv, i8 -1, i32 1)604 ret <4 x float> %v605}606 607declare <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double>, ptr, <4 x i32>, i8, i32)608 609define <2 x double> @test_llvm_x86_avx512_gather3siv2_df(ptr %b, <4 x i32> %iv) #2 {610; CHECK-LABEL: test_llvm_x86_avx512_gather3siv2_df:611; CHECK: # %bb.0: # %entry612; CHECK-NEXT: movq %rsp, %rax613; CHECK-NEXT: movq $-1, %rcx614; CHECK-NEXT: sarq $63, %rax615; CHECK-NEXT: kxnorw %k0, %k0, %k1616; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1617; CHECK-NEXT: orq %rax, %rdi618; CHECK-NEXT: vpbroadcastq %rax, %xmm2619; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0620; CHECK-NEXT: vgatherdpd (%rdi,%xmm0), %xmm1 {%k1}621; CHECK-NEXT: shlq $47, %rax622; CHECK-NEXT: vmovapd %xmm1, %xmm0623; CHECK-NEXT: orq %rax, %rsp624; CHECK-NEXT: retq625entry:626 %v = call <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double> zeroinitializer, ptr %b, <4 x i32> %iv, i8 -1, i32 1)627 ret <2 x double> %v628}629 630declare <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double>, ptr, <2 x i64>, i8, i32)631 632define <2 x double> @test_llvm_x86_avx512_gather3div2_df(ptr %b, <2 x i64> %iv) #2 {633; CHECK-LABEL: test_llvm_x86_avx512_gather3div2_df:634; CHECK: # %bb.0: # %entry635; CHECK-NEXT: movq %rsp, %rax636; CHECK-NEXT: movq $-1, %rcx637; CHECK-NEXT: sarq $63, %rax638; CHECK-NEXT: kxnorw %k0, %k0, %k1639; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1640; CHECK-NEXT: orq %rax, %rdi641; CHECK-NEXT: vpbroadcastq %rax, %xmm2642; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0643; CHECK-NEXT: vgatherqpd (%rdi,%xmm0), %xmm1 {%k1}644; CHECK-NEXT: shlq $47, %rax645; CHECK-NEXT: vmovapd %xmm1, %xmm0646; CHECK-NEXT: orq %rax, %rsp647; CHECK-NEXT: retq648entry:649 %v = call <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double> zeroinitializer, ptr %b, <2 x i64> %iv, i8 -1, i32 1)650 ret <2 x double> %v651}652 653declare <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float>, ptr, <8 x i32>, i8, i32)654 655define <8 x float> @test_llvm_x86_avx512_gather3siv8_sf(ptr %b, <8 x i32> %iv) #2 {656; CHECK-LABEL: test_llvm_x86_avx512_gather3siv8_sf:657; CHECK: # %bb.0: # %entry658; CHECK-NEXT: movq %rsp, %rax659; CHECK-NEXT: movq $-1, %rcx660; CHECK-NEXT: sarq $63, %rax661; CHECK-NEXT: kxnorw %k0, %k0, %k1662; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1663; CHECK-NEXT: orq %rax, %rdi664; CHECK-NEXT: vpbroadcastq %rax, %ymm2665; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0666; CHECK-NEXT: vgatherdps (%rdi,%ymm0), %ymm1 {%k1}667; CHECK-NEXT: shlq $47, %rax668; CHECK-NEXT: vmovaps %ymm1, %ymm0669; CHECK-NEXT: orq %rax, %rsp670; CHECK-NEXT: retq671entry:672 %v = call <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float> zeroinitializer, ptr %b, <8 x i32> %iv, i8 -1, i32 1)673 ret <8 x float> %v674}675 676declare <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float>, ptr, <4 x i64>, i8, i32)677 678define <4 x float> @test_llvm_x86_avx512_gather3div8_sf(ptr %b, <4 x i64> %iv) #2 {679; CHECK-LABEL: test_llvm_x86_avx512_gather3div8_sf:680; CHECK: # %bb.0: # %entry681; CHECK-NEXT: movq %rsp, %rax682; CHECK-NEXT: movq $-1, %rcx683; CHECK-NEXT: sarq $63, %rax684; CHECK-NEXT: kxnorw %k0, %k0, %k1685; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1686; CHECK-NEXT: orq %rax, %rdi687; CHECK-NEXT: vpbroadcastq %rax, %ymm2688; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0689; CHECK-NEXT: vgatherqps (%rdi,%ymm0), %xmm1 {%k1}690; CHECK-NEXT: shlq $47, %rax691; CHECK-NEXT: vmovaps %xmm1, %xmm0692; CHECK-NEXT: orq %rax, %rsp693; CHECK-NEXT: vzeroupper694; CHECK-NEXT: retq695entry:696 %v = call <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float> zeroinitializer, ptr %b, <4 x i64> %iv, i8 -1, i32 1)697 ret <4 x float> %v698}699 700declare <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double>, ptr, <4 x i32>, i8, i32)701 702define <4 x double> @test_llvm_x86_avx512_gather3siv4_df(ptr %b, <4 x i32> %iv) #2 {703; CHECK-LABEL: test_llvm_x86_avx512_gather3siv4_df:704; CHECK: # %bb.0: # %entry705; CHECK-NEXT: movq %rsp, %rax706; CHECK-NEXT: movq $-1, %rcx707; CHECK-NEXT: sarq $63, %rax708; CHECK-NEXT: kxnorw %k0, %k0, %k1709; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1710; CHECK-NEXT: orq %rax, %rdi711; CHECK-NEXT: vpbroadcastq %rax, %xmm2712; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0713; CHECK-NEXT: vgatherdpd (%rdi,%xmm0), %ymm1 {%k1}714; CHECK-NEXT: shlq $47, %rax715; CHECK-NEXT: vmovapd %ymm1, %ymm0716; CHECK-NEXT: orq %rax, %rsp717; CHECK-NEXT: retq718entry:719 %v = call <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double> zeroinitializer, ptr %b, <4 x i32> %iv, i8 -1, i32 1)720 ret <4 x double> %v721}722 723declare <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double>, ptr, <4 x i64>, i8, i32)724 725define <4 x double> @test_llvm_x86_avx512_gather3div4_df(ptr %b, <4 x i64> %iv) #2 {726; CHECK-LABEL: test_llvm_x86_avx512_gather3div4_df:727; CHECK: # %bb.0: # %entry728; CHECK-NEXT: movq %rsp, %rax729; CHECK-NEXT: movq $-1, %rcx730; CHECK-NEXT: sarq $63, %rax731; CHECK-NEXT: kxnorw %k0, %k0, %k1732; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1733; CHECK-NEXT: orq %rax, %rdi734; CHECK-NEXT: vpbroadcastq %rax, %ymm2735; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0736; CHECK-NEXT: vgatherqpd (%rdi,%ymm0), %ymm1 {%k1}737; CHECK-NEXT: shlq $47, %rax738; CHECK-NEXT: vmovapd %ymm1, %ymm0739; CHECK-NEXT: orq %rax, %rsp740; CHECK-NEXT: retq741entry:742 %v = call <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double> zeroinitializer, ptr %b, <4 x i64> %iv, i8 -1, i32 1)743 ret <4 x double> %v744}745 746declare <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32>, ptr, <4 x i32>, i8, i32)747 748define <4 x i32> @test_llvm_x86_avx512_gather3siv4_si(ptr %b, <4 x i32> %iv) #2 {749; CHECK-LABEL: test_llvm_x86_avx512_gather3siv4_si:750; CHECK: # %bb.0: # %entry751; CHECK-NEXT: movq %rsp, %rax752; CHECK-NEXT: movq $-1, %rcx753; CHECK-NEXT: sarq $63, %rax754; CHECK-NEXT: kxnorw %k0, %k0, %k1755; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1756; CHECK-NEXT: orq %rax, %rdi757; CHECK-NEXT: vpbroadcastq %rax, %xmm2758; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0759; CHECK-NEXT: vpgatherdd (%rdi,%xmm0), %xmm1 {%k1}760; CHECK-NEXT: shlq $47, %rax761; CHECK-NEXT: vmovdqa %xmm1, %xmm0762; CHECK-NEXT: orq %rax, %rsp763; CHECK-NEXT: retq764entry:765 %v = call <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32> zeroinitializer, ptr %b, <4 x i32> %iv, i8 -1, i32 1)766 ret <4 x i32> %v767}768 769declare <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32>, ptr, <2 x i64>, i8, i32)770 771define <4 x i32> @test_llvm_x86_avx512_gather3div4_si(ptr %b, <2 x i64> %iv) #2 {772; CHECK-LABEL: test_llvm_x86_avx512_gather3div4_si:773; CHECK: # %bb.0: # %entry774; CHECK-NEXT: movq %rsp, %rax775; CHECK-NEXT: movq $-1, %rcx776; CHECK-NEXT: sarq $63, %rax777; CHECK-NEXT: kxnorw %k0, %k0, %k1778; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1779; CHECK-NEXT: orq %rax, %rdi780; CHECK-NEXT: vpbroadcastq %rax, %xmm2781; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0782; CHECK-NEXT: vpgatherqd (%rdi,%xmm0), %xmm1 {%k1}783; CHECK-NEXT: shlq $47, %rax784; CHECK-NEXT: vmovdqa %xmm1, %xmm0785; CHECK-NEXT: orq %rax, %rsp786; CHECK-NEXT: retq787entry:788 %v = call <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32> zeroinitializer, ptr %b, <2 x i64> %iv, i8 -1, i32 1)789 ret <4 x i32> %v790}791 792declare <2 x i64> @llvm.x86.avx512.gather3siv2.di(<2 x i64>, ptr, <4 x i32>, i8, i32)793 794define <2 x i64> @test_llvm_x86_avx512_gather3siv2_di(ptr %b, <4 x i32> %iv) #2 {795; CHECK-LABEL: test_llvm_x86_avx512_gather3siv2_di:796; CHECK: # %bb.0: # %entry797; CHECK-NEXT: movq %rsp, %rax798; CHECK-NEXT: movq $-1, %rcx799; CHECK-NEXT: sarq $63, %rax800; CHECK-NEXT: kxnorw %k0, %k0, %k1801; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1802; CHECK-NEXT: orq %rax, %rdi803; CHECK-NEXT: vpbroadcastq %rax, %xmm2804; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0805; CHECK-NEXT: vpgatherdq (%rdi,%xmm0), %xmm1 {%k1}806; CHECK-NEXT: shlq $47, %rax807; CHECK-NEXT: vmovdqa %xmm1, %xmm0808; CHECK-NEXT: orq %rax, %rsp809; CHECK-NEXT: retq810entry:811 %v = call <2 x i64> @llvm.x86.avx512.gather3siv2.di(<2 x i64> zeroinitializer, ptr %b, <4 x i32> %iv, i8 -1, i32 1)812 ret <2 x i64> %v813}814 815declare <2 x i64> @llvm.x86.avx512.gather3div2.di(<2 x i64>, ptr, <2 x i64>, i8, i32)816 817define <2 x i64> @test_llvm_x86_avx512_gather3div2_di(ptr %b, <2 x i64> %iv) #2 {818; CHECK-LABEL: test_llvm_x86_avx512_gather3div2_di:819; CHECK: # %bb.0: # %entry820; CHECK-NEXT: movq %rsp, %rax821; CHECK-NEXT: movq $-1, %rcx822; CHECK-NEXT: sarq $63, %rax823; CHECK-NEXT: kxnorw %k0, %k0, %k1824; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1825; CHECK-NEXT: orq %rax, %rdi826; CHECK-NEXT: vpbroadcastq %rax, %xmm2827; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0828; CHECK-NEXT: vpgatherqq (%rdi,%xmm0), %xmm1 {%k1}829; CHECK-NEXT: shlq $47, %rax830; CHECK-NEXT: vmovdqa %xmm1, %xmm0831; CHECK-NEXT: orq %rax, %rsp832; CHECK-NEXT: retq833entry:834 %v = call <2 x i64> @llvm.x86.avx512.gather3div2.di(<2 x i64> zeroinitializer, ptr %b, <2 x i64> %iv, i8 -1, i32 1)835 ret <2 x i64> %v836}837 838declare <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32>, ptr, <8 x i32>, i8, i32)839 840define <8 x i32> @test_llvm_x86_avx512_gather3siv8_si(ptr %b, <8 x i32> %iv) #2 {841; CHECK-LABEL: test_llvm_x86_avx512_gather3siv8_si:842; CHECK: # %bb.0: # %entry843; CHECK-NEXT: movq %rsp, %rax844; CHECK-NEXT: movq $-1, %rcx845; CHECK-NEXT: sarq $63, %rax846; CHECK-NEXT: kxnorw %k0, %k0, %k1847; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1848; CHECK-NEXT: orq %rax, %rdi849; CHECK-NEXT: vpbroadcastq %rax, %ymm2850; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0851; CHECK-NEXT: vpgatherdd (%rdi,%ymm0), %ymm1 {%k1}852; CHECK-NEXT: shlq $47, %rax853; CHECK-NEXT: vmovdqa %ymm1, %ymm0854; CHECK-NEXT: orq %rax, %rsp855; CHECK-NEXT: retq856entry:857 %v = call <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32> zeroinitializer, ptr %b, <8 x i32> %iv, i8 -1, i32 1)858 ret <8 x i32> %v859}860 861declare <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32>, ptr, <4 x i64>, i8, i32)862 863define <4 x i32> @test_llvm_x86_avx512_gather3div8_si(ptr %b, <4 x i64> %iv) #2 {864; CHECK-LABEL: test_llvm_x86_avx512_gather3div8_si:865; CHECK: # %bb.0: # %entry866; CHECK-NEXT: movq %rsp, %rax867; CHECK-NEXT: movq $-1, %rcx868; CHECK-NEXT: sarq $63, %rax869; CHECK-NEXT: kxnorw %k0, %k0, %k1870; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1871; CHECK-NEXT: orq %rax, %rdi872; CHECK-NEXT: vpbroadcastq %rax, %ymm2873; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0874; CHECK-NEXT: vpgatherqd (%rdi,%ymm0), %xmm1 {%k1}875; CHECK-NEXT: shlq $47, %rax876; CHECK-NEXT: vmovdqa %xmm1, %xmm0877; CHECK-NEXT: orq %rax, %rsp878; CHECK-NEXT: vzeroupper879; CHECK-NEXT: retq880entry:881 %v = call <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32> zeroinitializer, ptr %b, <4 x i64> %iv, i8 -1, i32 1)882 ret <4 x i32> %v883}884 885declare <4 x i64> @llvm.x86.avx512.gather3siv4.di(<4 x i64>, ptr, <4 x i32>, i8, i32)886 887define <4 x i64> @test_llvm_x86_avx512_gather3siv4_di(ptr %b, <4 x i32> %iv) #2 {888; CHECK-LABEL: test_llvm_x86_avx512_gather3siv4_di:889; CHECK: # %bb.0: # %entry890; CHECK-NEXT: movq %rsp, %rax891; CHECK-NEXT: movq $-1, %rcx892; CHECK-NEXT: sarq $63, %rax893; CHECK-NEXT: kxnorw %k0, %k0, %k1894; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1895; CHECK-NEXT: orq %rax, %rdi896; CHECK-NEXT: vpbroadcastq %rax, %xmm2897; CHECK-NEXT: vpor %xmm0, %xmm2, %xmm0898; CHECK-NEXT: vpgatherdq (%rdi,%xmm0), %ymm1 {%k1}899; CHECK-NEXT: shlq $47, %rax900; CHECK-NEXT: vmovdqa %ymm1, %ymm0901; CHECK-NEXT: orq %rax, %rsp902; CHECK-NEXT: retq903entry:904 %v = call <4 x i64> @llvm.x86.avx512.gather3siv4.di(<4 x i64> zeroinitializer, ptr %b, <4 x i32> %iv, i8 -1, i32 1)905 ret <4 x i64> %v906}907 908declare <4 x i64> @llvm.x86.avx512.gather3div4.di(<4 x i64>, ptr, <4 x i64>, i8, i32)909 910define <4 x i64> @test_llvm_x86_avx512_gather3div4_di(ptr %b, <4 x i64> %iv) #2 {911; CHECK-LABEL: test_llvm_x86_avx512_gather3div4_di:912; CHECK: # %bb.0: # %entry913; CHECK-NEXT: movq %rsp, %rax914; CHECK-NEXT: movq $-1, %rcx915; CHECK-NEXT: sarq $63, %rax916; CHECK-NEXT: kxnorw %k0, %k0, %k1917; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1918; CHECK-NEXT: orq %rax, %rdi919; CHECK-NEXT: vpbroadcastq %rax, %ymm2920; CHECK-NEXT: vpor %ymm0, %ymm2, %ymm0921; CHECK-NEXT: vpgatherqq (%rdi,%ymm0), %ymm1 {%k1}922; CHECK-NEXT: shlq $47, %rax923; CHECK-NEXT: vmovdqa %ymm1, %ymm0924; CHECK-NEXT: orq %rax, %rsp925; CHECK-NEXT: retq926entry:927 %v = call <4 x i64> @llvm.x86.avx512.gather3div4.di(<4 x i64> zeroinitializer, ptr %b, <4 x i64> %iv, i8 -1, i32 1)928 ret <4 x i64> %v929}930 931attributes #0 = { nounwind speculative_load_hardening "target-features"="+avx2" }932attributes #1 = { nounwind speculative_load_hardening "target-features"="+avx512f" }933attributes #2 = { nounwind speculative_load_hardening "target-features"="+avx512vl" }934