164 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s -check-prefixes=CHECK,Z142; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s -check-prefixes=CHECK,Z153;4; Check that int-to-fp conversions from a narrower type get a vector extension.5 6define void @fun0(<2 x i8> %Src, ptr %Dst) {7; CHECK-LABEL: fun0:8; CHECK: vuphb %v0, %v249; CHECK-NEXT: vuphh %v0, %v010; CHECK-NEXT: vuphf %v0, %v011; CHECK-NEXT: vcdgb %v0, %v0, 0, 012; CHECK-NEXT: vst %v0, 0(%r2), 313; CHECK-NEXT: br %r1414 %c = sitofp <2 x i8> %Src to <2 x double>15 store <2 x double> %c, ptr %Dst16 ret void17}18 19define void @fun1(<2 x i16> %Src, ptr %Dst) {20; CHECK-LABEL: fun1:21; CHECK: vuphh %v0, %v2422; CHECK-NEXT: vuphf %v0, %v023; CHECK-NEXT: vcdgb %v0, %v0, 0, 024; CHECK-NEXT: vst %v0, 0(%r2), 325; CHECK-NEXT: br %r1426 %c = sitofp <2 x i16> %Src to <2 x double>27 store <2 x double> %c, ptr %Dst28 ret void29}30 31define void @fun2(<2 x i32> %Src, ptr %Dst) {32; CHECK-LABEL: fun2:33; CHECK: vuphf %v0, %v2434; CHECK-NEXT: vcdgb %v0, %v0, 0, 035; CHECK-NEXT: vst %v0, 0(%r2), 336; CHECK-NEXT: br %r1437 %c = sitofp <2 x i32> %Src to <2 x double>38 store <2 x double> %c, ptr %Dst39 ret void40}41 42define void @fun3(<4 x i16> %Src, ptr %Dst) {43; CHECK-LABEL: fun3:44 45; Z14: vuphh %v0, %v2446; Z14-NEXT: vlgvf %r0, %v0, 347; Z14-NEXT: cefbr %f1, %r048; Z14-NEXT: vlgvf %r0, %v0, 249; Z14-NEXT: cefbr %f2, %r050; Z14-NEXT: vlgvf %r0, %v0, 151; Z14-NEXT: vmrhf %v1, %v2, %v152; Z14-NEXT: cefbr %f2, %r053; Z14-NEXT: vlgvf %r0, %v0, 054; Z14-NEXT: cefbr %f0, %r055; Z14-NEXT: vmrhf %v0, %v0, %v256; Z14-NEXT: vmrhg %v0, %v0, %v157; Z14-NEXT: vst %v0, 0(%r2), 358; Z14-NEXT: br %r1459 60; Z15: vuphh %v0, %v2461; Z15-NEXT: vcefb %v0, %v0, 0, 062; Z15-NEXT: vst %v0, 0(%r2), 363; Z15-NEXT: br %r1464 %c = sitofp <4 x i16> %Src to <4 x float>65 store <4 x float> %c, ptr %Dst66 ret void67}68 69define void @fun4(<2 x i8> %Src, ptr %Dst) {70; CHECK-LABEL: fun4:71; CHECK: larl %r1, .LCPI4_072; CHECK-NEXT: vl %v0, 0(%r1), 373; CHECK-NEXT: vperm %v0, %v0, %v24, %v074; CHECK-NEXT: vcdlgb %v0, %v0, 0, 075; CHECK-NEXT: vst %v0, 0(%r2), 376; CHECK-NEXT: br %r1477 %c = uitofp <2 x i8> %Src to <2 x double>78 store <2 x double> %c, ptr %Dst79 ret void80}81 82define void @fun5(<2 x i16> %Src, ptr %Dst) {83; CHECK-LABEL: fun5:84; CHECK: larl %r1, .LCPI5_085; CHECK-NEXT: vl %v0, 0(%r1), 386; CHECK-NEXT: vperm %v0, %v0, %v24, %v087; CHECK-NEXT: vcdlgb %v0, %v0, 0, 088; CHECK-NEXT: vst %v0, 0(%r2), 389; CHECK-NEXT: br %r1490 %c = uitofp <2 x i16> %Src to <2 x double>91 store <2 x double> %c, ptr %Dst92 ret void93}94 95define void @fun6(<2 x i32> %Src, ptr %Dst) {96; CHECK-LABEL: fun6:97; CHECK: vuplhf %v0, %v2498; CHECK-NEXT: vcdlgb %v0, %v0, 0, 099; CHECK-NEXT: vst %v0, 0(%r2), 3100; CHECK-NEXT: br %r14101 %c = uitofp <2 x i32> %Src to <2 x double>102 store <2 x double> %c, ptr %Dst103 ret void104}105 106define void @fun7(<4 x i16> %Src, ptr %Dst) {107; CHECK-LABEL: fun7:108 109; Z14: vuplhh %v0, %v24110; Z14-NEXT: vlgvf %r0, %v0, 3111; Z14-NEXT: celfbr %f1, 0, %r0, 0112; Z14-NEXT: vlgvf %r0, %v0, 2113; Z14-NEXT: celfbr %f2, 0, %r0, 0114; Z14-NEXT: vlgvf %r0, %v0, 1115; Z14-NEXT: vmrhf %v1, %v2, %v1116; Z14-NEXT: celfbr %f2, 0, %r0, 0117; Z14-NEXT: vlgvf %r0, %v0, 0118; Z14-NEXT: celfbr %f0, 0, %r0, 0119; Z14-NEXT: vmrhf %v0, %v0, %v2120; Z14-NEXT: vmrhg %v0, %v0, %v1121; Z14-NEXT: vst %v0, 0(%r2), 3122; Z14-NEXT: br %r14123 124; Z15: vuplhh %v0, %v24125; Z15-NEXT: vcelfb %v0, %v0, 0, 0126; Z15-NEXT: vst %v0, 0(%r2), 3127; Z15-NEXT: br %r14128 %c = uitofp <4 x i16> %Src to <4 x float>129 store <4 x float> %c, ptr %Dst130 ret void131}132 133; Test that this does not crash but results in scalarized conversions.134define void @fun8(<2 x i64> %dwords, ptr %ptr) {135; CHECK-LABEL: fun8136; CHECK: vlgvg137; CHECK: cxlgbr138 %conv = uitofp <2 x i64> %dwords to <2 x fp128>139 store <2 x fp128> %conv, ptr %ptr140 ret void141}142 143; Test that this results in vectorized conversions.144define void @fun9(ptr %Src, ptr %ptr) {145; CHECK-LABEL: fun9146; Z15: vl %v0, 16(%r2), 4147; Z15-NEXT: vl %v1, 0(%r2), 4148; Z15-NEXT: vuplhh %v2, %v1149; Z15-NEXT: vupllh %v1, %v1150; Z15-NEXT: vuplhh %v0, %v0151; Z15-NEXT: vcelfb %v2, %v2, 0, 0152; Z15-NEXT: vcelfb %v1, %v1, 0, 0153; Z15-NEXT: vcelfb %v0, %v0, 0, 0154; Z15-NEXT: vsteg %v0, 32(%r3), 0155; Z15-NEXT: vst %v1, 16(%r3), 4156; Z15-NEXT: vst %v2, 0(%r3), 4157; Z15-NEXT: br %r14158 159 %Val = load <10 x i16>, ptr %Src160 %conv = uitofp <10 x i16> %Val to <10 x float>161 store <10 x float> %conv, ptr %ptr162 ret void163}164