201 lines · plain
1; Test replications of a scalar register value, represented as splats.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s4 5; Test v16i8 splat of the first element.6define <16 x i8> @f1(i8 %scalar) {7; CHECK-LABEL: f1:8; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r29; CHECK: vrepb %v24, [[REG]], 710; CHECK: br %r1411 %val = insertelement <16 x i8> undef, i8 %scalar, i32 012 %ret = shufflevector <16 x i8> %val, <16 x i8> undef,13 <16 x i32> zeroinitializer14 ret <16 x i8> %ret15}16 17; Test v16i8 splat of the last element.18define <16 x i8> @f2(i8 %scalar) {19; CHECK-LABEL: f2:20; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r221; CHECK: vrepb %v24, [[REG]], 722; CHECK: br %r1423 %val = insertelement <16 x i8> undef, i8 %scalar, i32 1524 %ret = shufflevector <16 x i8> %val, <16 x i8> undef,25 <16 x i32> <i32 15, i32 15, i32 15, i32 15,26 i32 15, i32 15, i32 15, i32 15,27 i32 15, i32 15, i32 15, i32 15,28 i32 15, i32 15, i32 15, i32 15>29 ret <16 x i8> %ret30}31 32; Test v16i8 splat of an arbitrary element, using the second operand of33; the shufflevector.34define <16 x i8> @f3(i8 %scalar) {35; CHECK-LABEL: f3:36; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r237; CHECK: vrepb %v24, [[REG]], 738; CHECK: br %r1439 %val = insertelement <16 x i8> undef, i8 %scalar, i32 440 %ret = shufflevector <16 x i8> undef, <16 x i8> %val,41 <16 x i32> <i32 20, i32 20, i32 20, i32 20,42 i32 20, i32 20, i32 20, i32 20,43 i32 20, i32 20, i32 20, i32 20,44 i32 20, i32 20, i32 20, i32 20>45 ret <16 x i8> %ret46}47 48; Test v8i16 splat of the first element.49define <8 x i16> @f4(i16 %scalar) {50; CHECK-LABEL: f4:51; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r252; CHECK: vreph %v24, [[REG]], 353; CHECK: br %r1454 %val = insertelement <8 x i16> undef, i16 %scalar, i32 055 %ret = shufflevector <8 x i16> %val, <8 x i16> undef,56 <8 x i32> zeroinitializer57 ret <8 x i16> %ret58}59 60; Test v8i16 splat of the last element.61define <8 x i16> @f5(i16 %scalar) {62; CHECK-LABEL: f5:63; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r264; CHECK: vreph %v24, [[REG]], 365; CHECK: br %r1466 %val = insertelement <8 x i16> undef, i16 %scalar, i32 767 %ret = shufflevector <8 x i16> %val, <8 x i16> undef,68 <8 x i32> <i32 7, i32 7, i32 7, i32 7,69 i32 7, i32 7, i32 7, i32 7>70 ret <8 x i16> %ret71}72 73; Test v8i16 splat of an arbitrary element, using the second operand of74; the shufflevector.75define <8 x i16> @f6(i16 %scalar) {76; CHECK-LABEL: f6:77; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r278; CHECK: vreph %v24, [[REG]], 379; CHECK: br %r1480 %val = insertelement <8 x i16> undef, i16 %scalar, i32 281 %ret = shufflevector <8 x i16> undef, <8 x i16> %val,82 <8 x i32> <i32 10, i32 10, i32 10, i32 10,83 i32 10, i32 10, i32 10, i32 10>84 ret <8 x i16> %ret85}86 87; Test v4i32 splat of the first element.88define <4 x i32> @f7(i32 %scalar) {89; CHECK-LABEL: f7:90; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r291; CHECK: vrepf %v24, [[REG]], 192; CHECK: br %r1493 %val = insertelement <4 x i32> undef, i32 %scalar, i32 094 %ret = shufflevector <4 x i32> %val, <4 x i32> undef,95 <4 x i32> zeroinitializer96 ret <4 x i32> %ret97}98 99; Test v4i32 splat of the last element.100define <4 x i32> @f8(i32 %scalar) {101; CHECK-LABEL: f8:102; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2103; CHECK: vrepf %v24, [[REG]], 1104; CHECK: br %r14105 %val = insertelement <4 x i32> undef, i32 %scalar, i32 3106 %ret = shufflevector <4 x i32> %val, <4 x i32> undef,107 <4 x i32> <i32 3, i32 3, i32 3, i32 3>108 ret <4 x i32> %ret109}110 111; Test v4i32 splat of an arbitrary element, using the second operand of112; the shufflevector.113define <4 x i32> @f9(i32 %scalar) {114; CHECK-LABEL: f9:115; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2116; CHECK: vrepf %v24, [[REG]], 1117; CHECK: br %r14118 %val = insertelement <4 x i32> undef, i32 %scalar, i32 1119 %ret = shufflevector <4 x i32> undef, <4 x i32> %val,120 <4 x i32> <i32 5, i32 5, i32 5, i32 5>121 ret <4 x i32> %ret122}123 124; Test v2i64 splat of the first element.125define <2 x i64> @f10(i64 %scalar) {126; CHECK-LABEL: f10:127; CHECK: vlvgp %v24, %r2, %r2128; CHECK: br %r14129 %val = insertelement <2 x i64> undef, i64 %scalar, i32 0130 %ret = shufflevector <2 x i64> %val, <2 x i64> undef,131 <2 x i32> zeroinitializer132 ret <2 x i64> %ret133}134 135; Test v2i64 splat of the last element.136define <2 x i64> @f11(i64 %scalar) {137; CHECK-LABEL: f11:138; CHECK: vlvgp %v24, %r2, %r2139; CHECK: br %r14140 %val = insertelement <2 x i64> undef, i64 %scalar, i32 1141 %ret = shufflevector <2 x i64> %val, <2 x i64> undef,142 <2 x i32> <i32 1, i32 1>143 ret <2 x i64> %ret144}145 146; Test v4f32 splat of the first element.147define <4 x float> @f12(float %scalar) {148; CHECK-LABEL: f12:149; CHECK: vrepf %v24, %v0, 0150; CHECK: br %r14151 %val = insertelement <4 x float> undef, float %scalar, i32 0152 %ret = shufflevector <4 x float> %val, <4 x float> undef,153 <4 x i32> zeroinitializer154 ret <4 x float> %ret155}156 157; Test v4f32 splat of the last element.158define <4 x float> @f13(float %scalar) {159; CHECK-LABEL: f13:160; CHECK: vrepf %v24, %v0, 0161; CHECK: br %r14162 %val = insertelement <4 x float> undef, float %scalar, i32 3163 %ret = shufflevector <4 x float> %val, <4 x float> undef,164 <4 x i32> <i32 3, i32 3, i32 3, i32 3>165 ret <4 x float> %ret166}167 168; Test v4f32 splat of an arbitrary element, using the second operand of169; the shufflevector.170define <4 x float> @f14(float %scalar) {171; CHECK-LABEL: f14:172; CHECK: vrepf %v24, %v0, 0173; CHECK: br %r14174 %val = insertelement <4 x float> undef, float %scalar, i32 1175 %ret = shufflevector <4 x float> undef, <4 x float> %val,176 <4 x i32> <i32 5, i32 5, i32 5, i32 5>177 ret <4 x float> %ret178}179 180; Test v2f64 splat of the first element.181define <2 x double> @f15(double %scalar) {182; CHECK-LABEL: f15:183; CHECK: vrepg %v24, %v0, 0184; CHECK: br %r14185 %val = insertelement <2 x double> undef, double %scalar, i32 0186 %ret = shufflevector <2 x double> %val, <2 x double> undef,187 <2 x i32> zeroinitializer188 ret <2 x double> %ret189}190 191; Test v2f64 splat of the last element.192define <2 x double> @f16(double %scalar) {193; CHECK-LABEL: f16:194; CHECK: vrepg %v24, %v0, 0195; CHECK: br %r14196 %val = insertelement <2 x double> undef, double %scalar, i32 1197 %ret = shufflevector <2 x double> %val, <2 x double> undef,198 <2 x i32> <i32 1, i32 1>199 ret <2 x double> %ret200}201