1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s -check-prefixes=CHECK,Z14 2; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s -check-prefixes=CHECK,Z15 3; 4; Check that int-to-fp conversions from a narrower type get a vector extension. 5 6define void @fun0(<2 x i8> %Src, <2 x double>* %Dst) { 7; CHECK-LABEL: fun0: 8; CHECK: vuphb %v0, %v24 9; CHECK-NEXT: vuphh %v0, %v0 10; CHECK-NEXT: vuphf %v0, %v0 11; CHECK-NEXT: vcdgb %v0, %v0, 0, 0 12; CHECK-NEXT: vst %v0, 0(%r2), 3 13; CHECK-NEXT: br %r14 14 %c = sitofp <2 x i8> %Src to <2 x double> 15 store <2 x double> %c, <2 x double>* %Dst 16 ret void 17} 18 19define void @fun1(<2 x i16> %Src, <2 x double>* %Dst) { 20; CHECK-LABEL: fun1: 21; CHECK: vuphh %v0, %v24 22; CHECK-NEXT: vuphf %v0, %v0 23; CHECK-NEXT: vcdgb %v0, %v0, 0, 0 24; CHECK-NEXT: vst %v0, 0(%r2), 3 25; CHECK-NEXT: br %r14 26 %c = sitofp <2 x i16> %Src to <2 x double> 27 store <2 x double> %c, <2 x double>* %Dst 28 ret void 29} 30 31define void @fun2(<2 x i32> %Src, <2 x double>* %Dst) { 32; CHECK-LABEL: fun2: 33; CHECK: vuphf %v0, %v24 34; CHECK-NEXT: vcdgb %v0, %v0, 0, 0 35; CHECK-NEXT: vst %v0, 0(%r2), 3 36; CHECK-NEXT: br %r14 37 %c = sitofp <2 x i32> %Src to <2 x double> 38 store <2 x double> %c, <2 x double>* %Dst 39 ret void 40} 41 42define void @fun3(<4 x i16> %Src, <4 x float>* %Dst) { 43; CHECK-LABEL: fun3: 44 45; Z14: vuphh %v0, %v24 46; Z14-NEXT: vlgvf %r0, %v0, 3 47; Z14-NEXT: cefbr %f1, %r0 48; Z14-NEXT: vlgvf %r0, %v0, 2 49; Z14-NEXT: cefbr %f2, %r0 50; Z14-NEXT: vlgvf %r0, %v0, 1 51; Z14-NEXT: vmrhf %v1, %v2, %v1 52; Z14-NEXT: cefbr %f2, %r0 53; Z14-NEXT: vlgvf %r0, %v0, 0 54; Z14-NEXT: cefbr %f0, %r0 55; Z14-NEXT: vmrhf %v0, %v0, %v2 56; Z14-NEXT: vmrhg %v0, %v0, %v1 57; Z14-NEXT: vst %v0, 0(%r2), 3 58; Z14-NEXT: br %r14 59 60; Z15: vuphh %v0, %v24 61; Z15-NEXT: vcefb %v0, %v0, 0, 0 62; Z15-NEXT: vst %v0, 0(%r2), 3 63; Z15-NEXT: br %r14 64 %c = sitofp <4 x i16> %Src to <4 x float> 65 store <4 x float> %c, <4 x float>* %Dst 66 ret void 67} 68 69define void @fun4(<2 x i8> %Src, <2 x double>* %Dst) { 70; CHECK-LABEL: fun4: 71; CHECK: vuplhb %v0, %v24 72; CHECK-NEXT: vuplhh %v0, %v0 73; CHECK-NEXT: vuplhf %v0, %v0 74; CHECK-NEXT: vcdlgb %v0, %v0, 0, 0 75; CHECK-NEXT: vst %v0, 0(%r2), 3 76; CHECK-NEXT: br %r14 77 %c = uitofp <2 x i8> %Src to <2 x double> 78 store <2 x double> %c, <2 x double>* %Dst 79 ret void 80} 81 82define void @fun5(<2 x i16> %Src, <2 x double>* %Dst) { 83; CHECK-LABEL: fun5: 84; CHECK: vuplhh %v0, %v24 85; CHECK-NEXT: vuplhf %v0, %v0 86; CHECK-NEXT: vcdlgb %v0, %v0, 0, 0 87; CHECK-NEXT: vst %v0, 0(%r2), 3 88; CHECK-NEXT: br %r14 89 %c = uitofp <2 x i16> %Src to <2 x double> 90 store <2 x double> %c, <2 x double>* %Dst 91 ret void 92} 93 94define void @fun6(<2 x i32> %Src, <2 x double>* %Dst) { 95; CHECK-LABEL: fun6: 96; CHECK: vuplhf %v0, %v24 97; CHECK-NEXT: vcdlgb %v0, %v0, 0, 0 98; CHECK-NEXT: vst %v0, 0(%r2), 3 99; CHECK-NEXT: br %r14 100 %c = uitofp <2 x i32> %Src to <2 x double> 101 store <2 x double> %c, <2 x double>* %Dst 102 ret void 103} 104 105define void @fun7(<4 x i16> %Src, <4 x float>* %Dst) { 106; CHECK-LABEL: fun7: 107 108; Z14: vuplhh %v0, %v24 109; Z14-NEXT: vlgvf %r0, %v0, 3 110; Z14-NEXT: celfbr %f1, 0, %r0, 0 111; Z14-NEXT: vlgvf %r0, %v0, 2 112; Z14-NEXT: celfbr %f2, 0, %r0, 0 113; Z14-NEXT: vlgvf %r0, %v0, 1 114; Z14-NEXT: vmrhf %v1, %v2, %v1 115; Z14-NEXT: celfbr %f2, 0, %r0, 0 116; Z14-NEXT: vlgvf %r0, %v0, 0 117; Z14-NEXT: celfbr %f0, 0, %r0, 0 118; Z14-NEXT: vmrhf %v0, %v0, %v2 119; Z14-NEXT: vmrhg %v0, %v0, %v1 120; Z14-NEXT: vst %v0, 0(%r2), 3 121; Z14-NEXT: br %r14 122 123; Z15: vuplhh %v0, %v24 124; Z15-NEXT: vcelfb %v0, %v0, 0, 0 125; Z15-NEXT: vst %v0, 0(%r2), 3 126; Z15-NEXT: br %r14 127 %c = uitofp <4 x i16> %Src to <4 x float> 128 store <4 x float> %c, <4 x float>* %Dst 129 ret void 130} 131 132