255 lines · plain
1; Test rounding functions for z14 and above.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -verify-machineinstrs \4; RUN: | FileCheck %s5 6; Test that an f16 intrinsic can be lowered with promotion to float.7declare half @llvm.rint.f16(half %f)8define half @f0(half %f) {9; CHECK-LABEL: f0:10; CHECK: brasl %r14, __extendhfsf2@PLT11; CHECK: fiebra %f0, 0, %f0, 012; CHECK: brasl %r14, __truncsfhf2@PLT13; CHECK: br %r1414 %res = call half @llvm.rint.f16(half %f)15 ret half %res16}17 18; Test rint for f32.19declare float @llvm.rint.f32(float %f)20define float @f1(float %f) {21; CHECK-LABEL: f1:22; CHECK: fiebra %f0, 0, %f0, 023; CHECK: br %r1424 %res = call float @llvm.rint.f32(float %f)25 ret float %res26}27 28; Test rint for f64.29declare double @llvm.rint.f64(double %f)30define double @f2(double %f) {31; CHECK-LABEL: f2:32; CHECK: fidbra %f0, 0, %f0, 033; CHECK: br %r1434 %res = call double @llvm.rint.f64(double %f)35 ret double %res36}37 38; Test rint for f128.39declare fp128 @llvm.rint.f128(fp128 %f)40define void @f3(ptr %ptr) {41; CHECK-LABEL: f3:42; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)43; CHECK: wfixb [[RES:%v[0-9]+]], [[REG]], 0, 044; CHECK: vst [[RES]], 0(%r2)45; CHECK: br %r1446 %src = load fp128, ptr %ptr47 %res = call fp128 @llvm.rint.f128(fp128 %src)48 store fp128 %res, ptr %ptr49 ret void50}51 52; Test nearbyint for f32.53declare float @llvm.nearbyint.f32(float %f)54define float @f4(float %f) {55; CHECK-LABEL: f4:56; CHECK: fiebra %f0, 0, %f0, 457; CHECK: br %r1458 %res = call float @llvm.nearbyint.f32(float %f)59 ret float %res60}61 62; Test nearbyint for f64.63declare double @llvm.nearbyint.f64(double %f)64define double @f5(double %f) {65; CHECK-LABEL: f5:66; CHECK: fidbra %f0, 0, %f0, 467; CHECK: br %r1468 %res = call double @llvm.nearbyint.f64(double %f)69 ret double %res70}71 72; Test nearbyint for f128.73declare fp128 @llvm.nearbyint.f128(fp128 %f)74define void @f6(ptr %ptr) {75; CHECK-LABEL: f6:76; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)77; CHECK: wfixb [[RES:%v[0-9]+]], [[REG]], 4, 078; CHECK: vst [[RES]], 0(%r2)79; CHECK: br %r1480 %src = load fp128, ptr %ptr81 %res = call fp128 @llvm.nearbyint.f128(fp128 %src)82 store fp128 %res, ptr %ptr83 ret void84}85 86; Test floor for f32.87declare float @llvm.floor.f32(float %f)88define float @f7(float %f) {89; CHECK-LABEL: f7:90; CHECK: fiebra %f0, 7, %f0, 491; CHECK: br %r1492 %res = call float @llvm.floor.f32(float %f)93 ret float %res94}95 96; Test floor for f64.97declare double @llvm.floor.f64(double %f)98define double @f8(double %f) {99; CHECK-LABEL: f8:100; CHECK: fidbra %f0, 7, %f0, 4101; CHECK: br %r14102 %res = call double @llvm.floor.f64(double %f)103 ret double %res104}105 106; Test floor for f128.107declare fp128 @llvm.floor.f128(fp128 %f)108define void @f9(ptr %ptr) {109; CHECK-LABEL: f9:110; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)111; CHECK: wfixb [[RES:%v[0-9]+]], [[REG]], 4, 7112; CHECK: vst [[RES]], 0(%r2)113; CHECK: br %r14114 %src = load fp128, ptr %ptr115 %res = call fp128 @llvm.floor.f128(fp128 %src)116 store fp128 %res, ptr %ptr117 ret void118}119 120; Test ceil for f32.121declare float @llvm.ceil.f32(float %f)122define float @f10(float %f) {123; CHECK-LABEL: f10:124; CHECK: fiebra %f0, 6, %f0, 4125; CHECK: br %r14126 %res = call float @llvm.ceil.f32(float %f)127 ret float %res128}129 130; Test ceil for f64.131declare double @llvm.ceil.f64(double %f)132define double @f11(double %f) {133; CHECK-LABEL: f11:134; CHECK: fidbra %f0, 6, %f0, 4135; CHECK: br %r14136 %res = call double @llvm.ceil.f64(double %f)137 ret double %res138}139 140; Test ceil for f128.141declare fp128 @llvm.ceil.f128(fp128 %f)142define void @f12(ptr %ptr) {143; CHECK-LABEL: f12:144; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)145; CHECK: wfixb [[RES:%v[0-9]+]], [[REG]], 4, 6146; CHECK: vst [[RES]], 0(%r2)147; CHECK: br %r14148 %src = load fp128, ptr %ptr149 %res = call fp128 @llvm.ceil.f128(fp128 %src)150 store fp128 %res, ptr %ptr151 ret void152}153 154; Test trunc for f32.155declare float @llvm.trunc.f32(float %f)156define float @f13(float %f) {157; CHECK-LABEL: f13:158; CHECK: fiebra %f0, 5, %f0, 4159; CHECK: br %r14160 %res = call float @llvm.trunc.f32(float %f)161 ret float %res162}163 164; Test trunc for f64.165declare double @llvm.trunc.f64(double %f)166define double @f14(double %f) {167; CHECK-LABEL: f14:168; CHECK: fidbra %f0, 5, %f0, 4169; CHECK: br %r14170 %res = call double @llvm.trunc.f64(double %f)171 ret double %res172}173 174; Test trunc for f128.175declare fp128 @llvm.trunc.f128(fp128 %f)176define void @f15(ptr %ptr) {177; CHECK-LABEL: f15:178; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)179; CHECK: wfixb [[RES:%v[0-9]+]], [[REG]], 4, 5180; CHECK: vst [[RES]], 0(%r2)181; CHECK: br %r14182 %src = load fp128, ptr %ptr183 %res = call fp128 @llvm.trunc.f128(fp128 %src)184 store fp128 %res, ptr %ptr185 ret void186}187 188; Test round for f32.189declare float @llvm.round.f32(float %f)190define float @f16(float %f) {191; CHECK-LABEL: f16:192; CHECK: fiebra %f0, 1, %f0, 4193; CHECK: br %r14194 %res = call float @llvm.round.f32(float %f)195 ret float %res196}197 198; Test round for f64.199declare double @llvm.round.f64(double %f)200define double @f17(double %f) {201; CHECK-LABEL: f17:202; CHECK: fidbra %f0, 1, %f0, 4203; CHECK: br %r14204 %res = call double @llvm.round.f64(double %f)205 ret double %res206}207 208; Test round for f128.209declare fp128 @llvm.round.f128(fp128 %f)210define void @f18(ptr %ptr) {211; CHECK-LABEL: f18:212; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)213; CHECK: wfixb [[RES:%v[0-9]+]], [[REG]], 4, 1214; CHECK: vst [[RES]], 0(%r2)215; CHECK: br %r14216 %src = load fp128, ptr %ptr217 %res = call fp128 @llvm.round.f128(fp128 %src)218 store fp128 %res, ptr %ptr219 ret void220}221 222; Test roundeven for f32.223declare float @llvm.roundeven.f32(float %f)224define float @f19(float %f) {225; CHECK-LABEL: f19:226; CHECK: fiebra %f0, 4, %f0, 4227; CHECK: br %r14228 %res = call float @llvm.roundeven.f32(float %f)229 ret float %res230}231 232; Test roundeven for f64.233declare double @llvm.roundeven.f64(double %f)234define double @f20(double %f) {235; CHECK-LABEL: f20:236; CHECK: fidbra %f0, 4, %f0, 4237; CHECK: br %r14238 %res = call double @llvm.roundeven.f64(double %f)239 ret double %res240}241 242; Test roundeven for f128.243declare fp128 @llvm.roundeven.f128(fp128 %f)244define void @f21(ptr %ptr) {245; CHECK-LABEL: f21:246; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)247; CHECK: wfixb [[RES:%v[0-9]+]], [[REG]], 4, 4248; CHECK: vst [[RES]], 0(%r2)249; CHECK: br %r14250 %src = load fp128, ptr %ptr251 %res = call fp128 @llvm.roundeven.f128(fp128 %src)252 store fp128 %res, ptr %ptr253 ret void254}255