1; Test f128 floating-point strict truncations/extensions on z14. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s 4 5declare float @llvm.experimental.constrained.fptrunc.f32.f128(fp128, metadata, metadata) 6declare double @llvm.experimental.constrained.fptrunc.f64.f128(fp128, metadata, metadata) 7 8declare fp128 @llvm.experimental.constrained.fpext.f128.f32(float, metadata) 9declare fp128 @llvm.experimental.constrained.fpext.f128.f64(double, metadata) 10 11; Test f128->f64. 12define double @f1(ptr %ptr) #0 { 13; CHECK-LABEL: f1: 14; CHECK: vl [[REG:%v[0-9]+]], 0(%r2) 15; CHECK: wflrx %f0, [[REG]], 0, 0 16; CHECK: br %r14 17 %val = load fp128, ptr %ptr 18 %res = call double @llvm.experimental.constrained.fptrunc.f64.f128( 19 fp128 %val, 20 metadata !"round.dynamic", 21 metadata !"fpexcept.strict") #0 22 ret double %res 23} 24 25; Test f128->f32. 26define float @f2(ptr %ptr) #0 { 27; CHECK-LABEL: f2: 28; CHECK: vl [[REG:%v[0-9]+]], 0(%r2) 29; CHECK: wflrx %f0, [[REG]], 0, 3 30; CHECK: ledbra %f0, 0, %f0, 0 31; CHECK: br %r14 32 %val = load fp128, ptr %ptr 33 %res = call float @llvm.experimental.constrained.fptrunc.f32.f128( 34 fp128 %val, 35 metadata !"round.dynamic", 36 metadata !"fpexcept.strict") #0 37 ret float %res 38} 39 40; Test f64->f128. 41define void @f3(ptr %dst, double %val) #0 { 42; CHECK-LABEL: f3: 43; CHECK: wflld [[RES:%v[0-9]+]], %f0 44; CHECK: vst [[RES]], 0(%r2) 45; CHECK: br %r14 46 %res = call fp128 @llvm.experimental.constrained.fpext.f128.f64(double %val, 47 metadata !"fpexcept.strict") #0 48 store fp128 %res, ptr %dst 49 ret void 50} 51 52; Test f32->f128. 53define void @f4(ptr %dst, float %val) #0 { 54; CHECK-LABEL: f4: 55; CHECK: ldebr %f0, %f0 56; CHECK: wflld [[RES:%v[0-9]+]], %f0 57; CHECK: vst [[RES]], 0(%r2) 58; CHECK: br %r14 59 %res = call fp128 @llvm.experimental.constrained.fpext.f128.f32(float %val, 60 metadata !"fpexcept.strict") #0 61 store fp128 %res, ptr %dst 62 ret void 63} 64 65attributes #0 = { strictfp } 66