1*9880d681SAndroid Build Coastguard Worker; Test rounding functions for z196 and above. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 \ 4*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 \ 6*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; Test rint for f32. 9*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.rint.f32(float %f) 10*9880d681SAndroid Build Coastguard Workerdefine float @f1(float %f) { 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 12*9880d681SAndroid Build Coastguard Worker; CHECK: fiebr %f0, 0, %f0 13*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 14*9880d681SAndroid Build Coastguard Worker %res = call float @llvm.rint.f32(float %f) 15*9880d681SAndroid Build Coastguard Worker ret float %res 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Test rint for f64. 19*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.rint.f64(double %f) 20*9880d681SAndroid Build Coastguard Workerdefine double @f2(double %f) { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 22*9880d681SAndroid Build Coastguard Worker; CHECK-SCALAR: fidbr %f0, 0, %f0 23*9880d681SAndroid Build Coastguard Worker; CHECK-VECTOR: fidbra %f0, 0, %f0, 0 24*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 25*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.rint.f64(double %f) 26*9880d681SAndroid Build Coastguard Worker ret double %res 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; Test rint for f128. 30*9880d681SAndroid Build Coastguard Workerdeclare fp128 @llvm.rint.f128(fp128 %f) 31*9880d681SAndroid Build Coastguard Workerdefine void @f3(fp128 *%ptr) { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 33*9880d681SAndroid Build Coastguard Worker; CHECK: fixbr %f0, 0, %f0 34*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 35*9880d681SAndroid Build Coastguard Worker %src = load fp128 , fp128 *%ptr 36*9880d681SAndroid Build Coastguard Worker %res = call fp128 @llvm.rint.f128(fp128 %src) 37*9880d681SAndroid Build Coastguard Worker store fp128 %res, fp128 *%ptr 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; Test nearbyint for f32. 42*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nearbyint.f32(float %f) 43*9880d681SAndroid Build Coastguard Workerdefine float @f4(float %f) { 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 45*9880d681SAndroid Build Coastguard Worker; CHECK: fiebra %f0, 0, %f0, 4 46*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 47*9880d681SAndroid Build Coastguard Worker %res = call float @llvm.nearbyint.f32(float %f) 48*9880d681SAndroid Build Coastguard Worker ret float %res 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; Test nearbyint for f64. 52*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.nearbyint.f64(double %f) 53*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %f) { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 55*9880d681SAndroid Build Coastguard Worker; CHECK: fidbra %f0, 0, %f0, 4 56*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 57*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.nearbyint.f64(double %f) 58*9880d681SAndroid Build Coastguard Worker ret double %res 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; Test nearbyint for f128. 62*9880d681SAndroid Build Coastguard Workerdeclare fp128 @llvm.nearbyint.f128(fp128 %f) 63*9880d681SAndroid Build Coastguard Workerdefine void @f6(fp128 *%ptr) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 65*9880d681SAndroid Build Coastguard Worker; CHECK: fixbra %f0, 0, %f0, 4 66*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 67*9880d681SAndroid Build Coastguard Worker %src = load fp128 , fp128 *%ptr 68*9880d681SAndroid Build Coastguard Worker %res = call fp128 @llvm.nearbyint.f128(fp128 %src) 69*9880d681SAndroid Build Coastguard Worker store fp128 %res, fp128 *%ptr 70*9880d681SAndroid Build Coastguard Worker ret void 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; Test floor for f32. 74*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.floor.f32(float %f) 75*9880d681SAndroid Build Coastguard Workerdefine float @f7(float %f) { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 77*9880d681SAndroid Build Coastguard Worker; CHECK: fiebra %f0, 7, %f0, 4 78*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 79*9880d681SAndroid Build Coastguard Worker %res = call float @llvm.floor.f32(float %f) 80*9880d681SAndroid Build Coastguard Worker ret float %res 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; Test floor for f64. 84*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.floor.f64(double %f) 85*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %f) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 87*9880d681SAndroid Build Coastguard Worker; CHECK: fidbra %f0, 7, %f0, 4 88*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 89*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.floor.f64(double %f) 90*9880d681SAndroid Build Coastguard Worker ret double %res 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; Test floor for f128. 94*9880d681SAndroid Build Coastguard Workerdeclare fp128 @llvm.floor.f128(fp128 %f) 95*9880d681SAndroid Build Coastguard Workerdefine void @f9(fp128 *%ptr) { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 97*9880d681SAndroid Build Coastguard Worker; CHECK: fixbra %f0, 7, %f0, 4 98*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 99*9880d681SAndroid Build Coastguard Worker %src = load fp128 , fp128 *%ptr 100*9880d681SAndroid Build Coastguard Worker %res = call fp128 @llvm.floor.f128(fp128 %src) 101*9880d681SAndroid Build Coastguard Worker store fp128 %res, fp128 *%ptr 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Test ceil for f32. 106*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.ceil.f32(float %f) 107*9880d681SAndroid Build Coastguard Workerdefine float @f10(float %f) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 109*9880d681SAndroid Build Coastguard Worker; CHECK: fiebra %f0, 6, %f0, 4 110*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 111*9880d681SAndroid Build Coastguard Worker %res = call float @llvm.ceil.f32(float %f) 112*9880d681SAndroid Build Coastguard Worker ret float %res 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; Test ceil for f64. 116*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.ceil.f64(double %f) 117*9880d681SAndroid Build Coastguard Workerdefine double @f11(double %f) { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 119*9880d681SAndroid Build Coastguard Worker; CHECK: fidbra %f0, 6, %f0, 4 120*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 121*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.ceil.f64(double %f) 122*9880d681SAndroid Build Coastguard Worker ret double %res 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; Test ceil for f128. 126*9880d681SAndroid Build Coastguard Workerdeclare fp128 @llvm.ceil.f128(fp128 %f) 127*9880d681SAndroid Build Coastguard Workerdefine void @f12(fp128 *%ptr) { 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 129*9880d681SAndroid Build Coastguard Worker; CHECK: fixbra %f0, 6, %f0, 4 130*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 131*9880d681SAndroid Build Coastguard Worker %src = load fp128 , fp128 *%ptr 132*9880d681SAndroid Build Coastguard Worker %res = call fp128 @llvm.ceil.f128(fp128 %src) 133*9880d681SAndroid Build Coastguard Worker store fp128 %res, fp128 *%ptr 134*9880d681SAndroid Build Coastguard Worker ret void 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; Test trunc for f32. 138*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.trunc.f32(float %f) 139*9880d681SAndroid Build Coastguard Workerdefine float @f13(float %f) { 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 141*9880d681SAndroid Build Coastguard Worker; CHECK: fiebra %f0, 5, %f0, 4 142*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 143*9880d681SAndroid Build Coastguard Worker %res = call float @llvm.trunc.f32(float %f) 144*9880d681SAndroid Build Coastguard Worker ret float %res 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; Test trunc for f64. 148*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.trunc.f64(double %f) 149*9880d681SAndroid Build Coastguard Workerdefine double @f14(double %f) { 150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 151*9880d681SAndroid Build Coastguard Worker; CHECK: fidbra %f0, 5, %f0, 4 152*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 153*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.trunc.f64(double %f) 154*9880d681SAndroid Build Coastguard Worker ret double %res 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; Test trunc for f128. 158*9880d681SAndroid Build Coastguard Workerdeclare fp128 @llvm.trunc.f128(fp128 %f) 159*9880d681SAndroid Build Coastguard Workerdefine void @f15(fp128 *%ptr) { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 161*9880d681SAndroid Build Coastguard Worker; CHECK: fixbra %f0, 5, %f0, 4 162*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 163*9880d681SAndroid Build Coastguard Worker %src = load fp128 , fp128 *%ptr 164*9880d681SAndroid Build Coastguard Worker %res = call fp128 @llvm.trunc.f128(fp128 %src) 165*9880d681SAndroid Build Coastguard Worker store fp128 %res, fp128 *%ptr 166*9880d681SAndroid Build Coastguard Worker ret void 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; Test round for f32. 170*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.round.f32(float %f) 171*9880d681SAndroid Build Coastguard Workerdefine float @f16(float %f) { 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 173*9880d681SAndroid Build Coastguard Worker; CHECK: fiebra %f0, 1, %f0, 4 174*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 175*9880d681SAndroid Build Coastguard Worker %res = call float @llvm.round.f32(float %f) 176*9880d681SAndroid Build Coastguard Worker ret float %res 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; Test round for f64. 180*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.round.f64(double %f) 181*9880d681SAndroid Build Coastguard Workerdefine double @f17(double %f) { 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 183*9880d681SAndroid Build Coastguard Worker; CHECK: fidbra %f0, 1, %f0, 4 184*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 185*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.round.f64(double %f) 186*9880d681SAndroid Build Coastguard Worker ret double %res 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker; Test round for f128. 190*9880d681SAndroid Build Coastguard Workerdeclare fp128 @llvm.round.f128(fp128 %f) 191*9880d681SAndroid Build Coastguard Workerdefine void @f18(fp128 *%ptr) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 193*9880d681SAndroid Build Coastguard Worker; CHECK: fixbra %f0, 1, %f0, 4 194*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 195*9880d681SAndroid Build Coastguard Worker %src = load fp128 , fp128 *%ptr 196*9880d681SAndroid Build Coastguard Worker %res = call fp128 @llvm.round.f128(fp128 %src) 197*9880d681SAndroid Build Coastguard Worker store fp128 %res, fp128 *%ptr 198*9880d681SAndroid Build Coastguard Worker ret void 199*9880d681SAndroid Build Coastguard Worker} 200