324 lines · plain
1; Test strict rounding functions for z196 and above.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 \4; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 \6; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s7 8; Test rint for f32.9declare float @llvm.experimental.constrained.rint.f32(float, metadata, metadata)10define float @f1(float %f) #0 {11; CHECK-LABEL: f1:12; CHECK: fiebr %f0, 0, %f013; CHECK: br %r1414 %res = call float @llvm.experimental.constrained.rint.f32(15 float %f,16 metadata !"round.dynamic",17 metadata !"fpexcept.strict") #018 ret float %res19}20 21; Test rint for f64.22declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)23define double @f2(double %f) #0 {24; CHECK-LABEL: f2:25; CHECK-SCALAR: fidbr %f0, 0, %f026; CHECK-VECTOR: fidbra %f0, 0, %f0, 027; CHECK: br %r1428 %res = call double @llvm.experimental.constrained.rint.f64(29 double %f,30 metadata !"round.dynamic",31 metadata !"fpexcept.strict") #032 ret double %res33}34 35; Test rint for f128.36declare fp128 @llvm.experimental.constrained.rint.f128(fp128, metadata, metadata)37define void @f3(ptr %ptr) #0 {38; CHECK-LABEL: f3:39; CHECK: fixbr %f0, 0, %f040; CHECK: br %r1441 %src = load fp128, ptr %ptr42 %res = call fp128 @llvm.experimental.constrained.rint.f128(43 fp128 %src,44 metadata !"round.dynamic",45 metadata !"fpexcept.strict") #046 store fp128 %res, ptr %ptr47 ret void48}49 50; Test nearbyint for f32.51declare float @llvm.experimental.constrained.nearbyint.f32(float, metadata, metadata)52define float @f4(float %f) #0 {53; CHECK-LABEL: f4:54; CHECK: fiebra %f0, 0, %f0, 455; CHECK: br %r1456 %res = call float @llvm.experimental.constrained.nearbyint.f32(57 float %f,58 metadata !"round.dynamic",59 metadata !"fpexcept.strict") #060 ret float %res61}62 63; Test nearbyint for f64.64declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)65define double @f5(double %f) #0 {66; CHECK-LABEL: f5:67; CHECK: fidbra %f0, 0, %f0, 468; CHECK: br %r1469 %res = call double @llvm.experimental.constrained.nearbyint.f64(70 double %f,71 metadata !"round.dynamic",72 metadata !"fpexcept.strict") #073 ret double %res74}75 76; Test nearbyint for f128.77declare fp128 @llvm.experimental.constrained.nearbyint.f128(fp128, metadata, metadata)78define void @f6(ptr %ptr) #0 {79; CHECK-LABEL: f6:80; CHECK: fixbra %f0, 0, %f0, 481; CHECK: br %r1482 %src = load fp128, ptr %ptr83 %res = call fp128 @llvm.experimental.constrained.nearbyint.f128(84 fp128 %src,85 metadata !"round.dynamic",86 metadata !"fpexcept.strict") #087 store fp128 %res, ptr %ptr88 ret void89}90 91; Test floor for f32.92declare float @llvm.experimental.constrained.floor.f32(float, metadata)93define float @f7(float %f) #0 {94; CHECK-LABEL: f7:95; CHECK: fiebra %f0, 7, %f0, 496; CHECK: br %r1497 %res = call float @llvm.experimental.constrained.floor.f32(98 float %f,99 metadata !"fpexcept.strict") #0100 ret float %res101}102 103; Test floor for f64.104declare double @llvm.experimental.constrained.floor.f64(double, metadata)105define double @f8(double %f) #0 {106; CHECK-LABEL: f8:107; CHECK: fidbra %f0, 7, %f0, 4108; CHECK: br %r14109 %res = call double @llvm.experimental.constrained.floor.f64(110 double %f,111 metadata !"fpexcept.strict") #0112 ret double %res113}114 115; Test floor for f128.116declare fp128 @llvm.experimental.constrained.floor.f128(fp128, metadata)117define void @f9(ptr %ptr) #0 {118; CHECK-LABEL: f9:119; CHECK: fixbra %f0, 7, %f0, 4120; CHECK: br %r14121 %src = load fp128, ptr %ptr122 %res = call fp128 @llvm.experimental.constrained.floor.f128(123 fp128 %src,124 metadata !"fpexcept.strict") #0125 store fp128 %res, ptr %ptr126 ret void127}128 129; Test ceil for f32.130declare float @llvm.experimental.constrained.ceil.f32(float, metadata)131define float @f10(float %f) #0 {132; CHECK-LABEL: f10:133; CHECK: fiebra %f0, 6, %f0, 4134; CHECK: br %r14135 %res = call float @llvm.experimental.constrained.ceil.f32(136 float %f,137 metadata !"fpexcept.strict") #0138 ret float %res139}140 141; Test ceil for f64.142declare double @llvm.experimental.constrained.ceil.f64(double, metadata)143define double @f11(double %f) #0 {144; CHECK-LABEL: f11:145; CHECK: fidbra %f0, 6, %f0, 4146; CHECK: br %r14147 %res = call double @llvm.experimental.constrained.ceil.f64(148 double %f,149 metadata !"fpexcept.strict") #0150 ret double %res151}152 153; Test ceil for f128.154declare fp128 @llvm.experimental.constrained.ceil.f128(fp128, metadata)155define void @f12(ptr %ptr) #0 {156; CHECK-LABEL: f12:157; CHECK: fixbra %f0, 6, %f0, 4158; CHECK: br %r14159 %src = load fp128, ptr %ptr160 %res = call fp128 @llvm.experimental.constrained.ceil.f128(161 fp128 %src,162 metadata !"fpexcept.strict") #0163 store fp128 %res, ptr %ptr164 ret void165}166 167; Test trunc for f16.168declare half @llvm.experimental.constrained.trunc.f16(half, metadata)169define half @f13_half(half %f) #0 {170; CHECK-LABEL: f13_half:171; CHECK: brasl %r14, __extendhfsf2@PLT172; CHECK: fiebra %f0, 5, %f0, 4173; CHECK: brasl %r14, __truncsfhf2@PLT174; CHECK: br %r14175 %res = call half @llvm.experimental.constrained.trunc.f16(176 half %f,177 metadata !"fpexcept.strict") #0178 ret half %res179}180 181; Test trunc for f32.182declare float @llvm.experimental.constrained.trunc.f32(float, metadata)183define float @f13(float %f) #0 {184; CHECK-LABEL: f13:185; CHECK: fiebra %f0, 5, %f0, 4186; CHECK: br %r14187 %res = call float @llvm.experimental.constrained.trunc.f32(188 float %f,189 metadata !"fpexcept.strict") #0190 ret float %res191}192 193; Test trunc for f64.194declare double @llvm.experimental.constrained.trunc.f64(double, metadata)195define double @f14(double %f) #0 {196; CHECK-LABEL: f14:197; CHECK: fidbra %f0, 5, %f0, 4198; CHECK: br %r14199 %res = call double @llvm.experimental.constrained.trunc.f64(200 double %f,201 metadata !"fpexcept.strict") #0202 ret double %res203}204 205; Test trunc for f128.206declare fp128 @llvm.experimental.constrained.trunc.f128(fp128, metadata)207define void @f15(ptr %ptr) #0 {208; CHECK-LABEL: f15:209; CHECK: fixbra %f0, 5, %f0, 4210; CHECK: br %r14211 %src = load fp128, ptr %ptr212 %res = call fp128 @llvm.experimental.constrained.trunc.f128(213 fp128 %src,214 metadata !"fpexcept.strict") #0215 store fp128 %res, ptr %ptr216 ret void217}218 219; Test round for f16.220declare half @llvm.experimental.constrained.round.f16(half, metadata)221define half @f16_half(half %f) #0 {222; CHECK-LABEL: f16_half:223; CHECK: brasl %r14, __extendhfsf2@PLT224; CHECK: fiebra %f0, 1, %f0, 4225; CHECK: brasl %r14, __truncsfhf2@PLT226; CHECK: br %r14227 %res = call half @llvm.experimental.constrained.round.f16(228 half %f,229 metadata !"fpexcept.strict") #0230 ret half %res231}232 233; Test round for f32.234declare float @llvm.experimental.constrained.round.f32(float, metadata)235define float @f16(float %f) #0 {236; CHECK-LABEL: f16:237; CHECK: fiebra %f0, 1, %f0, 4238; CHECK: br %r14239 %res = call float @llvm.experimental.constrained.round.f32(240 float %f,241 metadata !"fpexcept.strict") #0242 ret float %res243}244 245; Test round for f64.246declare double @llvm.experimental.constrained.round.f64(double, metadata)247define double @f17(double %f) #0 {248; CHECK-LABEL: f17:249; CHECK: fidbra %f0, 1, %f0, 4250; CHECK: br %r14251 %res = call double @llvm.experimental.constrained.round.f64(252 double %f,253 metadata !"fpexcept.strict") #0254 ret double %res255}256 257; Test round for f128.258declare fp128 @llvm.experimental.constrained.round.f128(fp128, metadata)259define void @f18(ptr %ptr) #0 {260; CHECK-LABEL: f18:261; CHECK: fixbra %f0, 1, %f0, 4262; CHECK: br %r14263 %src = load fp128, ptr %ptr264 %res = call fp128 @llvm.experimental.constrained.round.f128(265 fp128 %src,266 metadata !"fpexcept.strict") #0267 store fp128 %res, ptr %ptr268 ret void269}270 271; Test roundeven for f16.272declare half @llvm.experimental.constrained.roundeven.f16(half, metadata)273define half @f19_half(half %f) #0 {274; CHECK-LABEL: f19_half:275; CHECK: brasl %r14, __extendhfsf2@PLT276; CHECK: fiebra %f0, 4, %f0, 4277; CHECK: brasl %r14, __truncsfhf2@PLT278; CHECK: br %r14279 %res = call half @llvm.experimental.constrained.roundeven.f16(280 half %f,281 metadata !"fpexcept.strict") #0282 ret half %res283}284 285; Test roundeven for f32.286declare float @llvm.experimental.constrained.roundeven.f32(float, metadata)287define float @f19(float %f) #0 {288; CHECK-LABEL: f19:289; CHECK: fiebra %f0, 4, %f0, 4290; CHECK: br %r14291 %res = call float @llvm.experimental.constrained.roundeven.f32(292 float %f,293 metadata !"fpexcept.strict") #0294 ret float %res295}296 297; Test roundeven for f64.298declare double @llvm.experimental.constrained.roundeven.f64(double, metadata)299define double @f20(double %f) #0 {300; CHECK-LABEL: f20:301; CHECK: fidbra %f0, 4, %f0, 4302; CHECK: br %r14303 %res = call double @llvm.experimental.constrained.roundeven.f64(304 double %f,305 metadata !"fpexcept.strict") #0306 ret double %res307}308 309; Test roundeven for f128.310declare fp128 @llvm.experimental.constrained.roundeven.f128(fp128, metadata)311define void @f21(ptr %ptr) #0 {312; CHECK-LABEL: f21:313; CHECK: fixbra %f0, 4, %f0, 4314; CHECK: br %r14315 %src = load fp128, ptr %ptr316 %res = call fp128 @llvm.experimental.constrained.roundeven.f128(317 fp128 %src,318 metadata !"fpexcept.strict") #0319 store fp128 %res, ptr %ptr320 ret void321}322 323attributes #0 = { strictfp }324