349 lines · plain
1; Test strict rounding functions for z10.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s4 5; Test rint for f32.6declare float @llvm.experimental.constrained.rint.f32(float, metadata, metadata)7define float @f1(float %f) #0 {8; CHECK-LABEL: f1:9; CHECK: fiebr %f0, 0, %f010; CHECK: br %r1411 %res = call float @llvm.experimental.constrained.rint.f32(12 float %f,13 metadata !"round.dynamic",14 metadata !"fpexcept.strict") #015 ret float %res16}17 18; Test rint for f64.19declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)20define double @f2(double %f) #0 {21; CHECK-LABEL: f2:22; CHECK: fidbr %f0, 0, %f023; CHECK: br %r1424 %res = call double @llvm.experimental.constrained.rint.f64(25 double %f,26 metadata !"round.dynamic",27 metadata !"fpexcept.strict") #028 ret double %res29}30 31; Test rint for f128.32declare fp128 @llvm.experimental.constrained.rint.f128(fp128, metadata, metadata)33define void @f3(ptr %ptr) #0 {34; CHECK-LABEL: f3:35; CHECK: fixbr %f0, 0, %f036; CHECK: br %r1437 %src = load fp128, ptr %ptr38 %res = call fp128 @llvm.experimental.constrained.rint.f128(39 fp128 %src,40 metadata !"round.dynamic",41 metadata !"fpexcept.strict") #042 store fp128 %res, ptr %ptr43 ret void44}45 46; Test nearbyint for f16.47declare half @llvm.experimental.constrained.nearbyint.f16(half, metadata, metadata)48define half @f4_half(half %f) #0 {49; CHECK-LABEL: f4_half:50; CHECK: brasl %r14, __extendhfsf2@PLT51; CHECK: brasl %r14, nearbyintf@PLT52; CHECK: brasl %r14, __truncsfhf2@PLT53; CHECK: br %r1454 %res = call half @llvm.experimental.constrained.nearbyint.f16(55 half %f,56 metadata !"round.dynamic",57 metadata !"fpexcept.strict") #058 ret half %res59}60 61; Test nearbyint for f32.62declare float @llvm.experimental.constrained.nearbyint.f32(float, metadata, metadata)63define float @f4(float %f) #0 {64; CHECK-LABEL: f4:65; CHECK: brasl %r14, nearbyintf@PLT66; CHECK: br %r1467 %res = call float @llvm.experimental.constrained.nearbyint.f32(68 float %f,69 metadata !"round.dynamic",70 metadata !"fpexcept.strict") #071 ret float %res72}73 74; Test nearbyint for f64.75declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)76define double @f5(double %f) #0 {77; CHECK-LABEL: f5:78; CHECK: brasl %r14, nearbyint@PLT79; CHECK: br %r1480 %res = call double @llvm.experimental.constrained.nearbyint.f64(81 double %f,82 metadata !"round.dynamic",83 metadata !"fpexcept.strict") #084 ret double %res85}86 87; Test nearbyint for f128.88declare fp128 @llvm.experimental.constrained.nearbyint.f128(fp128, metadata, metadata)89define void @f6(ptr %ptr) #0 {90; CHECK-LABEL: f6:91; CHECK: brasl %r14, nearbyintl@PLT92; CHECK: br %r1493 %src = load fp128, ptr %ptr94 %res = call fp128 @llvm.experimental.constrained.nearbyint.f128(95 fp128 %src,96 metadata !"round.dynamic",97 metadata !"fpexcept.strict") #098 store fp128 %res, ptr %ptr99 ret void100}101 102; Test floor for f16.103declare half @llvm.experimental.constrained.floor.f16(half, metadata)104define half @f7_half(half %f) #0 {105; CHECK-LABEL: f7_half:106; CHECK: brasl %r14, __extendhfsf2@PLT107; CHECK: brasl %r14, floorf@PLT108; CHECK: brasl %r14, __truncsfhf2@PLT109; CHECK: br %r14110 %res = call half @llvm.experimental.constrained.floor.f16(111 half %f,112 metadata !"fpexcept.strict") #0113 ret half %res114}115 116; Test floor for f32.117declare float @llvm.experimental.constrained.floor.f32(float, metadata)118define float @f7(float %f) #0 {119; CHECK-LABEL: f7:120; CHECK: brasl %r14, floorf@PLT121; CHECK: br %r14122 %res = call float @llvm.experimental.constrained.floor.f32(123 float %f,124 metadata !"fpexcept.strict") #0125 ret float %res126}127 128; Test floor for f64.129declare double @llvm.experimental.constrained.floor.f64(double, metadata)130define double @f8(double %f) #0 {131; CHECK-LABEL: f8:132; CHECK: brasl %r14, floor@PLT133; CHECK: br %r14134 %res = call double @llvm.experimental.constrained.floor.f64(135 double %f,136 metadata !"fpexcept.strict") #0137 ret double %res138}139 140; Test floor for f128.141declare fp128 @llvm.experimental.constrained.floor.f128(fp128, metadata)142define void @f9(ptr %ptr) #0 {143; CHECK-LABEL: f9:144; CHECK: brasl %r14, floorl@PLT145; CHECK: br %r14146 %src = load fp128, ptr %ptr147 %res = call fp128 @llvm.experimental.constrained.floor.f128(148 fp128 %src,149 metadata !"fpexcept.strict") #0150 store fp128 %res, ptr %ptr151 ret void152}153 154; Test ceil for f16.155declare half @llvm.experimental.constrained.ceil.f16(half, metadata)156define half @f10_half(half %f) #0 {157; CHECK-LABEL: f10_half:158; CHECK: brasl %r14, __extendhfsf2@PLT159; CHECK: brasl %r14, ceilf@PLT160; CHECK: brasl %r14, __truncsfhf2@PLT161; CHECK: br %r14162 %res = call half @llvm.experimental.constrained.ceil.f16(163 half %f,164 metadata !"fpexcept.strict") #0165 ret half %res166}167 168; Test ceil for f32.169declare float @llvm.experimental.constrained.ceil.f32(float, metadata)170define float @f10(float %f) #0 {171; CHECK-LABEL: f10:172; CHECK: brasl %r14, ceilf@PLT173; CHECK: br %r14174 %res = call float @llvm.experimental.constrained.ceil.f32(175 float %f,176 metadata !"fpexcept.strict") #0177 ret float %res178}179 180; Test ceil for f64.181declare double @llvm.experimental.constrained.ceil.f64(double, metadata)182define double @f11(double %f) #0 {183; CHECK-LABEL: f11:184; CHECK: brasl %r14, ceil@PLT185; CHECK: br %r14186 %res = call double @llvm.experimental.constrained.ceil.f64(187 double %f,188 metadata !"fpexcept.strict") #0189 ret double %res190}191 192; Test ceil for f128.193declare fp128 @llvm.experimental.constrained.ceil.f128(fp128, metadata)194define void @f12(ptr %ptr) #0 {195; CHECK-LABEL: f12:196; CHECK: brasl %r14, ceill@PLT197; CHECK: br %r14198 %src = load fp128, ptr %ptr199 %res = call fp128 @llvm.experimental.constrained.ceil.f128(200 fp128 %src,201 metadata !"fpexcept.strict") #0202 store fp128 %res, ptr %ptr203 ret void204}205 206; Test trunc for f16.207declare half @llvm.experimental.constrained.trunc.f16(half, metadata)208define half @f13_half(half %f) #0 {209; CHECK-LABEL: f13_half:210; CHECK: brasl %r14, __extendhfsf2@PLT211; CHECK: brasl %r14, truncf@PLT212; CHECK: brasl %r14, __truncsfhf2@PLT213; CHECK: br %r14214 %res = call half @llvm.experimental.constrained.trunc.f16(215 half %f,216 metadata !"fpexcept.strict") #0217 ret half %res218}219 220; Test trunc for f32.221declare float @llvm.experimental.constrained.trunc.f32(float, metadata)222define float @f13(float %f) #0 {223; CHECK-LABEL: f13:224; CHECK: brasl %r14, truncf@PLT225; CHECK: br %r14226 %res = call float @llvm.experimental.constrained.trunc.f32(227 float %f,228 metadata !"fpexcept.strict") #0229 ret float %res230}231 232; Test trunc for f64.233declare double @llvm.experimental.constrained.trunc.f64(double, metadata)234define double @f14(double %f) #0 {235; CHECK-LABEL: f14:236; CHECK: brasl %r14, trunc@PLT237; CHECK: br %r14238 %res = call double @llvm.experimental.constrained.trunc.f64(239 double %f,240 metadata !"fpexcept.strict") #0241 ret double %res242}243 244; Test trunc for f128.245declare fp128 @llvm.experimental.constrained.trunc.f128(fp128, metadata)246define void @f15(ptr %ptr) #0 {247; CHECK-LABEL: f15:248; CHECK: brasl %r14, truncl@PLT249; CHECK: br %r14250 %src = load fp128, ptr %ptr251 %res = call fp128 @llvm.experimental.constrained.trunc.f128(252 fp128 %src,253 metadata !"fpexcept.strict") #0254 store fp128 %res, ptr %ptr255 ret void256}257 258; Test round for f16.259declare half @llvm.experimental.constrained.round.f16(half, metadata)260define half @f16_half(half %f) #0 {261; CHECK-LABEL: f16_half:262; CHECK: brasl %r14, __extendhfsf2@PLT263; CHECK: brasl %r14, roundf@PLT264; CHECK: brasl %r14, __truncsfhf2@PLT265; CHECK: br %r14266 %res = call half @llvm.experimental.constrained.round.f16(267 half %f,268 metadata !"fpexcept.strict") #0269 ret half %res270}271 272; Test round for f32.273declare float @llvm.experimental.constrained.round.f32(float, metadata)274define float @f16(float %f) #0 {275; CHECK-LABEL: f16:276; CHECK: brasl %r14, roundf@PLT277; CHECK: br %r14278 %res = call float @llvm.experimental.constrained.round.f32(279 float %f,280 metadata !"fpexcept.strict") #0281 ret float %res282}283 284; Test round for f64.285declare double @llvm.experimental.constrained.round.f64(double, metadata)286define double @f17(double %f) #0 {287; CHECK-LABEL: f17:288; CHECK: brasl %r14, round@PLT289; CHECK: br %r14290 %res = call double @llvm.experimental.constrained.round.f64(291 double %f,292 metadata !"fpexcept.strict") #0293 ret double %res294}295 296; Test round for f128.297declare fp128 @llvm.experimental.constrained.round.f128(fp128, metadata)298define void @f18(ptr %ptr) #0 {299; CHECK-LABEL: f18:300; CHECK: brasl %r14, roundl@PLT301; CHECK: br %r14302 %src = load fp128, ptr %ptr303 %res = call fp128 @llvm.experimental.constrained.round.f128(304 fp128 %src,305 metadata !"fpexcept.strict") #0306 store fp128 %res, ptr %ptr307 ret void308}309 310; Test roundeven for f32.311declare float @llvm.experimental.constrained.roundeven.f32(float, metadata)312define float @f19(float %f) #0 {313; CHECK-LABEL: f19:314; CHECK: brasl %r14, roundevenf@PLT315; CHECK: br %r14316 %res = call float @llvm.experimental.constrained.roundeven.f32(317 float %f,318 metadata !"fpexcept.strict") #0319 ret float %res320}321 322; Test roundeven for f64.323declare double @llvm.experimental.constrained.roundeven.f64(double, metadata)324define double @f20(double %f) #0 {325; CHECK-LABEL: f20:326; CHECK: brasl %r14, roundeven@PLT327; CHECK: br %r14328 %res = call double @llvm.experimental.constrained.roundeven.f64(329 double %f,330 metadata !"fpexcept.strict") #0331 ret double %res332}333 334; Test roundeven for f128.335declare fp128 @llvm.experimental.constrained.roundeven.f128(fp128, metadata)336define void @f21(ptr %ptr) #0 {337; CHECK-LABEL: f21:338; CHECK: brasl %r14, roundevenl@PLT339; CHECK: br %r14340 %src = load fp128, ptr %ptr341 %res = call fp128 @llvm.experimental.constrained.roundeven.f128(342 fp128 %src,343 metadata !"fpexcept.strict") #0344 store fp128 %res, ptr %ptr345 ret void346}347 348attributes #0 = { strictfp }349