179 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-linux -mcpu=skylake-avx512 < %s | FileCheck %s3 4define void @scatter_scale_512(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {5; CHECK-LABEL: scatter_scale_512:6; CHECK: # %bb.0:7; CHECK-NEXT: vpslld $31, %xmm1, %xmm18; CHECK-NEXT: vpmovd2m %xmm1, %k19; CHECK-NEXT: vpsllq $9, %ymm0, %ymm010; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm111; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}12; CHECK-NEXT: vzeroupper13; CHECK-NEXT: retq14 %gep = getelementptr inbounds [512 x i8], ptr %result, <4 x i64> %idx15 call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)16 ret void17}18 19define void @scatter_scale_16(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {20; CHECK-LABEL: scatter_scale_16:21; CHECK: # %bb.0:22; CHECK-NEXT: vpslld $31, %xmm1, %xmm123; CHECK-NEXT: vpmovd2m %xmm1, %k124; CHECK-NEXT: vpsllq $4, %ymm0, %ymm025; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm126; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}27; CHECK-NEXT: vzeroupper28; CHECK-NEXT: retq29 %gep = getelementptr inbounds [16 x i8], ptr %result, <4 x i64> %idx30 call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)31 ret void32}33 34define void @scatter_scale_8(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {35; CHECK-LABEL: scatter_scale_8:36; CHECK: # %bb.0:37; CHECK-NEXT: vpslld $31, %xmm1, %xmm138; CHECK-NEXT: vpmovd2m %xmm1, %k139; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm140; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0,8) {%k1}41; CHECK-NEXT: vzeroupper42; CHECK-NEXT: retq43 %gep = getelementptr inbounds [8 x i8], ptr %result, <4 x i64> %idx44 call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)45 ret void46}47 48define void @scatter_scale_4(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {49; CHECK-LABEL: scatter_scale_4:50; CHECK: # %bb.0:51; CHECK-NEXT: vpslld $31, %xmm1, %xmm152; CHECK-NEXT: vpmovd2m %xmm1, %k153; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm154; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0,4) {%k1}55; CHECK-NEXT: vzeroupper56; CHECK-NEXT: retq57 %gep = getelementptr inbounds [4 x i8], ptr %result, <4 x i64> %idx58 call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)59 ret void60}61 62define void @scatter_scale_3(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {63; CHECK-LABEL: scatter_scale_3:64; CHECK: # %bb.0:65; CHECK-NEXT: vpslld $31, %xmm1, %xmm166; CHECK-NEXT: vpmovd2m %xmm1, %k167; CHECK-NEXT: vpaddq %ymm0, %ymm0, %ymm168; CHECK-NEXT: vpaddq %ymm0, %ymm1, %ymm069; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm170; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}71; CHECK-NEXT: vzeroupper72; CHECK-NEXT: retq73 %gep = getelementptr inbounds [3 x i8], ptr %result, <4 x i64> %idx74 call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)75 ret void76}77 78define void @scatter_scale_1(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {79; CHECK-LABEL: scatter_scale_1:80; CHECK: # %bb.0:81; CHECK-NEXT: vpslld $31, %xmm1, %xmm182; CHECK-NEXT: vpmovd2m %xmm1, %k183; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm184; CHECK-NEXT: vscatterqpd %ymm1, (%rdi,%ymm0) {%k1}85; CHECK-NEXT: vzeroupper86; CHECK-NEXT: retq87 %gep = getelementptr inbounds [1 x i8], ptr %result, <4 x i64> %idx88 call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> zeroinitializer, <4 x ptr> %gep, i32 0, <4 x i1> %mask)89 ret void90}91 92define <4 x double> @gather_scale_512(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {93; CHECK-LABEL: gather_scale_512:94; CHECK: # %bb.0:95; CHECK-NEXT: vpslld $31, %xmm1, %xmm196; CHECK-NEXT: vpmovd2m %xmm1, %k197; CHECK-NEXT: vpsllq $9, %ymm0, %ymm198; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm099; CHECK-NEXT: vgatherqpd (%rdi,%ymm1), %ymm0 {%k1}100; CHECK-NEXT: retq101 %gep = getelementptr inbounds [512 x i8], ptr %result, <4 x i64> %idx102 %res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)103 ret <4 x double> %res104}105 106define <4 x double> @gather_scale_16(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {107; CHECK-LABEL: gather_scale_16:108; CHECK: # %bb.0:109; CHECK-NEXT: vpslld $31, %xmm1, %xmm1110; CHECK-NEXT: vpmovd2m %xmm1, %k1111; CHECK-NEXT: vpsllq $4, %ymm0, %ymm1112; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0113; CHECK-NEXT: vgatherqpd (%rdi,%ymm1), %ymm0 {%k1}114; CHECK-NEXT: retq115 %gep = getelementptr inbounds [16 x i8], ptr %result, <4 x i64> %idx116 %res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)117 ret <4 x double> %res118}119 120define <4 x double> @gather_scale_8(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {121; CHECK-LABEL: gather_scale_8:122; CHECK: # %bb.0:123; CHECK-NEXT: vpslld $31, %xmm1, %xmm1124; CHECK-NEXT: vpmovd2m %xmm1, %k1125; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1126; CHECK-NEXT: vgatherqpd (%rdi,%ymm0,8), %ymm1 {%k1}127; CHECK-NEXT: vmovapd %ymm1, %ymm0128; CHECK-NEXT: retq129 %gep = getelementptr inbounds [8 x i8], ptr %result, <4 x i64> %idx130 %res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)131 ret <4 x double> %res132}133 134define <4 x double> @gather_scale_4(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {135; CHECK-LABEL: gather_scale_4:136; CHECK: # %bb.0:137; CHECK-NEXT: vpslld $31, %xmm1, %xmm1138; CHECK-NEXT: vpmovd2m %xmm1, %k1139; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1140; CHECK-NEXT: vgatherqpd (%rdi,%ymm0,4), %ymm1 {%k1}141; CHECK-NEXT: vmovapd %ymm1, %ymm0142; CHECK-NEXT: retq143 %gep = getelementptr inbounds [4 x i8], ptr %result, <4 x i64> %idx144 %res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)145 ret <4 x double> %res146}147 148define <4 x double> @gather_scale_3(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {149; CHECK-LABEL: gather_scale_3:150; CHECK: # %bb.0:151; CHECK-NEXT: vpslld $31, %xmm1, %xmm1152; CHECK-NEXT: vpmovd2m %xmm1, %k1153; CHECK-NEXT: vpaddq %ymm0, %ymm0, %ymm1154; CHECK-NEXT: vpaddq %ymm0, %ymm1, %ymm1155; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0156; CHECK-NEXT: vgatherqpd (%rdi,%ymm1), %ymm0 {%k1}157; CHECK-NEXT: retq158 %gep = getelementptr inbounds [3 x i8], ptr %result, <4 x i64> %idx159 %res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)160 ret <4 x double> %res161}162 163define <4 x double> @gather_scale_1(ptr %result, <4 x i64> %idx, <4 x i1> %mask) {164; CHECK-LABEL: gather_scale_1:165; CHECK: # %bb.0:166; CHECK-NEXT: vpslld $31, %xmm1, %xmm1167; CHECK-NEXT: vpmovd2m %xmm1, %k1168; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1169; CHECK-NEXT: vgatherqpd (%rdi,%ymm0), %ymm1 {%k1}170; CHECK-NEXT: vmovapd %ymm1, %ymm0171; CHECK-NEXT: retq172 %gep = getelementptr inbounds [1 x i8], ptr %result, <4 x i64> %idx173 %res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> %gep, i32 0, <4 x i1> %mask, <4 x double> zeroinitializer)174 ret <4 x double> %res175}176 177declare void @llvm.masked.scatter.v4f64.v4p0(<4 x double>, <4 x ptr>, i32 immarg, <4 x i1>)178declare <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr>, i32 immarg, <4 x i1>, <4 x double>)179