94 lines · plain
1; Test f128 floating-point strict truncations/extensions on z14.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s4 5declare half @llvm.experimental.constrained.fptrunc.f16.f128(fp128, metadata, metadata)6declare float @llvm.experimental.constrained.fptrunc.f32.f128(fp128, metadata, metadata)7declare double @llvm.experimental.constrained.fptrunc.f64.f128(fp128, metadata, metadata)8 9declare fp128 @llvm.experimental.constrained.fpext.f128.f16(half, metadata)10declare fp128 @llvm.experimental.constrained.fpext.f128.f32(float, metadata)11declare fp128 @llvm.experimental.constrained.fpext.f128.f64(double, metadata)12 13; Test f128->f64.14define double @f1(ptr %ptr) #0 {15; CHECK-LABEL: f1:16; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)17; CHECK: wflrx %f0, [[REG]], 0, 018; CHECK: br %r1419 %val = load fp128, ptr %ptr20 %res = call double @llvm.experimental.constrained.fptrunc.f64.f128(21 fp128 %val,22 metadata !"round.dynamic",23 metadata !"fpexcept.strict") #024 ret double %res25}26 27; Test f128->f16.28define half @f2_half(ptr %ptr) #0 {29; CHECK-LABEL: f2_half:30; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)31; CHECK: vst %v0, 160(%r15), 332; CHECK: brasl %r14, __trunctfhf2@PLT33; CHECK: br %r1434 %val = load fp128, ptr %ptr35 %res = call half @llvm.experimental.constrained.fptrunc.f16.f128(36 fp128 %val,37 metadata !"round.dynamic",38 metadata !"fpexcept.strict") #039 ret half %res40}41 42; Test f128->f32.43define float @f2(ptr %ptr) #0 {44; CHECK-LABEL: f2:45; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)46; CHECK: wflrx %f0, [[REG]], 0, 347; CHECK: ledbra %f0, 0, %f0, 048; CHECK: br %r1449 %val = load fp128, ptr %ptr50 %res = call float @llvm.experimental.constrained.fptrunc.f32.f128(51 fp128 %val,52 metadata !"round.dynamic",53 metadata !"fpexcept.strict") #054 ret float %res55}56 57; Test f64->f128.58define void @f3(ptr %dst, double %val) #0 {59; CHECK-LABEL: f3:60; CHECK: wflld [[RES:%v[0-9]+]], %f061; CHECK: vst [[RES]], 0(%r2)62; CHECK: br %r1463 %res = call fp128 @llvm.experimental.constrained.fpext.f128.f64(double %val,64 metadata !"fpexcept.strict") #065 store fp128 %res, ptr %dst66 ret void67}68 69; Test f32->f128.70define void @f4(ptr %dst, float %val) #0 {71; CHECK-LABEL: f4:72; CHECK: ldebr %f0, %f073; CHECK: wflld [[RES:%v[0-9]+]], %f074; CHECK: vst [[RES]], 0(%r2)75; CHECK: br %r1476 %res = call fp128 @llvm.experimental.constrained.fpext.f128.f32(float %val,77 metadata !"fpexcept.strict") #078 store fp128 %res, ptr %dst79 ret void80}81 82; Test f16->f128.83define void @f5(ptr %dst, half %val) #0 {84; CHECK-LABEL: f5:85; CHECK: brasl %r14, __extendhftf2@PLT86; CHECK: br %r1487 %res = call fp128 @llvm.experimental.constrained.fpext.f128.f16(half %val,88 metadata !"fpexcept.strict") #089 store fp128 %res, ptr %dst90 ret void91}92 93attributes #0 = { strictfp }94