1; Test floating-point strict conversion to/from 128-bit integers. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 5 6declare fp128 @llvm.experimental.constrained.sitofp.f128.i128(i128, metadata, metadata) 7declare double @llvm.experimental.constrained.sitofp.f64.i128(i128, metadata, metadata) 8declare float @llvm.experimental.constrained.sitofp.f32.i128(i128, metadata, metadata) 9 10declare fp128 @llvm.experimental.constrained.uitofp.f128.i128(i128, metadata, metadata) 11declare double @llvm.experimental.constrained.uitofp.f64.i128(i128, metadata, metadata) 12declare float @llvm.experimental.constrained.uitofp.f32.i128(i128, metadata, metadata) 13 14declare i128 @llvm.experimental.constrained.fptosi.i128.f128(fp128, metadata) 15declare i128 @llvm.experimental.constrained.fptosi.i128.f64(double, metadata) 16declare i128 @llvm.experimental.constrained.fptosi.i128.f32(float, metadata) 17 18declare i128 @llvm.experimental.constrained.fptoui.i128.f128(fp128, metadata) 19declare i128 @llvm.experimental.constrained.fptoui.i128.f64(double, metadata) 20declare i128 @llvm.experimental.constrained.fptoui.i128.f32(float, metadata) 21 22; Test signed i128->f128. 23define fp128 @f1(i128 %i) #0 { 24; CHECK-LABEL: f1: 25; CHECK: brasl %r14, __floattitf@PLT 26; CHECK: br %r14 27 %conv = call fp128 @llvm.experimental.constrained.sitofp.f128.i128(i128 %i, 28 metadata !"round.dynamic", 29 metadata !"fpexcept.strict") #0 30 ret fp128 %conv 31} 32 33; Test signed i128->f64. 34define double @f2(i128 %i) #0 { 35; CHECK-LABEL: f2: 36; CHECK: brasl %r14, __floattidf@PLT 37; CHECK: br %r14 38 %conv = call double @llvm.experimental.constrained.sitofp.f64.i128(i128 %i, 39 metadata !"round.dynamic", 40 metadata !"fpexcept.strict") #0 41 ret double %conv 42} 43 44; Test signed i128->f32. 45define float @f3(i128 %i) #0 { 46; CHECK-LABEL: f3: 47; CHECK: brasl %r14, __floattisf@PLT 48; CHECK: br %r14 49 %conv = call float @llvm.experimental.constrained.sitofp.f32.i128(i128 %i, 50 metadata !"round.dynamic", 51 metadata !"fpexcept.strict") #0 52 ret float %conv 53} 54 55; Test unsigned i128->f128. 56define fp128 @f4(i128 %i) #0 { 57; CHECK-LABEL: f4: 58; CHECK: brasl %r14, __floatuntitf@PLT 59; CHECK: br %r14 60 %conv = call fp128 @llvm.experimental.constrained.uitofp.f128.i128(i128 %i, 61 metadata !"round.dynamic", 62 metadata !"fpexcept.strict") #0 63 ret fp128 %conv 64} 65 66; Test unsigned i128->f64. 67define double @f5(i128 %i) #0 { 68; CHECK-LABEL: f5: 69; CHECK: brasl %r14, __floatuntidf@PLT 70; CHECK: br %r14 71 %conv = call double @llvm.experimental.constrained.uitofp.f64.i128(i128 %i, 72 metadata !"round.dynamic", 73 metadata !"fpexcept.strict") #0 74 ret double %conv 75} 76 77; Test unsigned i128->f32. 78define float @f6(i128 %i) #0 { 79; CHECK-LABEL: f6: 80; CHECK: brasl %r14, __floatuntisf@PLT 81; CHECK: br %r14 82 %conv = call float @llvm.experimental.constrained.uitofp.f32.i128(i128 %i, 83 metadata !"round.dynamic", 84 metadata !"fpexcept.strict") #0 85 ret float %conv 86} 87 88; Test signed f128->i128. 89define i128 @f7(fp128 %f) #0 { 90; CHECK-LABEL: f7: 91; CHECK: brasl %r14, __fixtfti@PLT 92; CHECK: br %r14 93 %conv = call i128 @llvm.experimental.constrained.fptosi.i128.f128(fp128 %f, 94 metadata !"fpexcept.strict") #0 95 ret i128 %conv 96} 97 98; Test signed f64->i128. 99define i128 @f8(double %f) #0 { 100; CHECK-LABEL: f8: 101; CHECK: brasl %r14, __fixdfti@PLT 102; CHECK: br %r14 103 %conv = call i128 @llvm.experimental.constrained.fptosi.i128.f64(double %f, 104 metadata !"fpexcept.strict") #0 105 ret i128 %conv 106} 107 108; Test signed f9->i128. 109define i128 @f9(float %f) #0 { 110; CHECK-LABEL: f9: 111; CHECK: brasl %r14, __fixsfti@PLT 112; CHECK: br %r14 113 %conv = call i128 @llvm.experimental.constrained.fptosi.i128.f32(float %f, 114 metadata !"fpexcept.strict") #0 115 ret i128 %conv 116} 117 118; Test unsigned f128->i128. 119define i128 @f10(fp128 %f) #0 { 120; CHECK-LABEL: f10: 121; CHECK: brasl %r14, __fixunstfti@PLT 122; CHECK: br %r14 123 %conv = call i128 @llvm.experimental.constrained.fptoui.i128.f128(fp128 %f, 124 metadata !"fpexcept.strict") #0 125 ret i128 %conv 126} 127 128; Test unsigned f64->i128. 129define i128 @f11(double %f) #0 { 130; CHECK-LABEL: f11: 131; CHECK: brasl %r14, __fixunsdfti@PLT 132; CHECK: br %r14 133 %conv = call i128 @llvm.experimental.constrained.fptoui.i128.f64(double %f, 134 metadata !"fpexcept.strict") #0 135 ret i128 %conv 136} 137 138; Test unsigned f32->i128. 139define i128 @f12(float %f) #0 { 140; CHECK-LABEL: f12: 141; CHECK: brasl %r14, __fixunssfti@PLT 142; CHECK: br %r14 143 %conv = call i128 @llvm.experimental.constrained.fptoui.i128.f32(float %f, 144 metadata !"fpexcept.strict") #0 145 ret i128 %conv 146} 147 148attributes #0 = { strictfp } 149