1*9880d681SAndroid Build Coastguard Worker; Test 64-bit square root. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \ 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 | FileCheck %s 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sqrt.f64(double %f) 8*9880d681SAndroid Build Coastguard Workerdeclare double @sqrt(double) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; Check register square root. 11*9880d681SAndroid Build Coastguard Workerdefine double @f1(double %val) { 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 13*9880d681SAndroid Build Coastguard Worker; CHECK: sqdbr %f0, %f0 14*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 15*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.sqrt.f64(double %val) 16*9880d681SAndroid Build Coastguard Worker ret double %res 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; Check the low end of the SQDB range. 20*9880d681SAndroid Build Coastguard Workerdefine double @f2(double *%ptr) { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 22*9880d681SAndroid Build Coastguard Worker; CHECK: sqdb %f0, 0(%r2) 23*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 24*9880d681SAndroid Build Coastguard Worker %val = load double , double *%ptr 25*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.sqrt.f64(double %val) 26*9880d681SAndroid Build Coastguard Worker ret double %res 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; Check the high end of the aligned SQDB range. 30*9880d681SAndroid Build Coastguard Workerdefine double @f3(double *%base) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 32*9880d681SAndroid Build Coastguard Worker; CHECK: sqdb %f0, 4088(%r2) 33*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 34*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 511 35*9880d681SAndroid Build Coastguard Worker %val = load double , double *%ptr 36*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.sqrt.f64(double %val) 37*9880d681SAndroid Build Coastguard Worker ret double %res 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; Check the next doubleword up, which needs separate address logic. 41*9880d681SAndroid Build Coastguard Worker; Other sequences besides this one would be OK. 42*9880d681SAndroid Build Coastguard Workerdefine double @f4(double *%base) { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 44*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 45*9880d681SAndroid Build Coastguard Worker; CHECK: sqdb %f0, 0(%r2) 46*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 47*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 512 48*9880d681SAndroid Build Coastguard Worker %val = load double , double *%ptr 49*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.sqrt.f64(double %val) 50*9880d681SAndroid Build Coastguard Worker ret double %res 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; Check negative displacements, which also need separate address logic. 54*9880d681SAndroid Build Coastguard Workerdefine double @f5(double *%base) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 56*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, -8 57*9880d681SAndroid Build Coastguard Worker; CHECK: sqdb %f0, 0(%r2) 58*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 59*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 -1 60*9880d681SAndroid Build Coastguard Worker %val = load double , double *%ptr 61*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.sqrt.f64(double %val) 62*9880d681SAndroid Build Coastguard Worker ret double %res 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; Check that SQDB allows indices. 66*9880d681SAndroid Build Coastguard Workerdefine double @f6(double *%base, i64 %index) { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 68*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r3, 3 69*9880d681SAndroid Build Coastguard Worker; CHECK: sqdb %f0, 800(%r1,%r2) 70*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 71*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr double, double *%base, i64 %index 72*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr double, double *%ptr1, i64 100 73*9880d681SAndroid Build Coastguard Worker %val = load double , double *%ptr2 74*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.sqrt.f64(double %val) 75*9880d681SAndroid Build Coastguard Worker ret double %res 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; Test a case where we spill the source of at least one SQDBR. We want 79*9880d681SAndroid Build Coastguard Worker; to use SQDB if possible. 80*9880d681SAndroid Build Coastguard Workerdefine void @f7(double *%ptr) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 82*9880d681SAndroid Build Coastguard Worker; CHECK-SCALAR: sqdb {{%f[0-9]+}}, 160(%r15) 83*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 84*9880d681SAndroid Build Coastguard Worker %val0 = load volatile double , double *%ptr 85*9880d681SAndroid Build Coastguard Worker %val1 = load volatile double , double *%ptr 86*9880d681SAndroid Build Coastguard Worker %val2 = load volatile double , double *%ptr 87*9880d681SAndroid Build Coastguard Worker %val3 = load volatile double , double *%ptr 88*9880d681SAndroid Build Coastguard Worker %val4 = load volatile double , double *%ptr 89*9880d681SAndroid Build Coastguard Worker %val5 = load volatile double , double *%ptr 90*9880d681SAndroid Build Coastguard Worker %val6 = load volatile double , double *%ptr 91*9880d681SAndroid Build Coastguard Worker %val7 = load volatile double , double *%ptr 92*9880d681SAndroid Build Coastguard Worker %val8 = load volatile double , double *%ptr 93*9880d681SAndroid Build Coastguard Worker %val9 = load volatile double , double *%ptr 94*9880d681SAndroid Build Coastguard Worker %val10 = load volatile double , double *%ptr 95*9880d681SAndroid Build Coastguard Worker %val11 = load volatile double , double *%ptr 96*9880d681SAndroid Build Coastguard Worker %val12 = load volatile double , double *%ptr 97*9880d681SAndroid Build Coastguard Worker %val13 = load volatile double , double *%ptr 98*9880d681SAndroid Build Coastguard Worker %val14 = load volatile double , double *%ptr 99*9880d681SAndroid Build Coastguard Worker %val15 = load volatile double , double *%ptr 100*9880d681SAndroid Build Coastguard Worker %val16 = load volatile double , double *%ptr 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker %sqrt0 = call double @llvm.sqrt.f64(double %val0) 103*9880d681SAndroid Build Coastguard Worker %sqrt1 = call double @llvm.sqrt.f64(double %val1) 104*9880d681SAndroid Build Coastguard Worker %sqrt2 = call double @llvm.sqrt.f64(double %val2) 105*9880d681SAndroid Build Coastguard Worker %sqrt3 = call double @llvm.sqrt.f64(double %val3) 106*9880d681SAndroid Build Coastguard Worker %sqrt4 = call double @llvm.sqrt.f64(double %val4) 107*9880d681SAndroid Build Coastguard Worker %sqrt5 = call double @llvm.sqrt.f64(double %val5) 108*9880d681SAndroid Build Coastguard Worker %sqrt6 = call double @llvm.sqrt.f64(double %val6) 109*9880d681SAndroid Build Coastguard Worker %sqrt7 = call double @llvm.sqrt.f64(double %val7) 110*9880d681SAndroid Build Coastguard Worker %sqrt8 = call double @llvm.sqrt.f64(double %val8) 111*9880d681SAndroid Build Coastguard Worker %sqrt9 = call double @llvm.sqrt.f64(double %val9) 112*9880d681SAndroid Build Coastguard Worker %sqrt10 = call double @llvm.sqrt.f64(double %val10) 113*9880d681SAndroid Build Coastguard Worker %sqrt11 = call double @llvm.sqrt.f64(double %val11) 114*9880d681SAndroid Build Coastguard Worker %sqrt12 = call double @llvm.sqrt.f64(double %val12) 115*9880d681SAndroid Build Coastguard Worker %sqrt13 = call double @llvm.sqrt.f64(double %val13) 116*9880d681SAndroid Build Coastguard Worker %sqrt14 = call double @llvm.sqrt.f64(double %val14) 117*9880d681SAndroid Build Coastguard Worker %sqrt15 = call double @llvm.sqrt.f64(double %val15) 118*9880d681SAndroid Build Coastguard Worker %sqrt16 = call double @llvm.sqrt.f64(double %val16) 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker store volatile double %val0, double *%ptr 121*9880d681SAndroid Build Coastguard Worker store volatile double %val1, double *%ptr 122*9880d681SAndroid Build Coastguard Worker store volatile double %val2, double *%ptr 123*9880d681SAndroid Build Coastguard Worker store volatile double %val3, double *%ptr 124*9880d681SAndroid Build Coastguard Worker store volatile double %val4, double *%ptr 125*9880d681SAndroid Build Coastguard Worker store volatile double %val5, double *%ptr 126*9880d681SAndroid Build Coastguard Worker store volatile double %val6, double *%ptr 127*9880d681SAndroid Build Coastguard Worker store volatile double %val7, double *%ptr 128*9880d681SAndroid Build Coastguard Worker store volatile double %val8, double *%ptr 129*9880d681SAndroid Build Coastguard Worker store volatile double %val9, double *%ptr 130*9880d681SAndroid Build Coastguard Worker store volatile double %val10, double *%ptr 131*9880d681SAndroid Build Coastguard Worker store volatile double %val11, double *%ptr 132*9880d681SAndroid Build Coastguard Worker store volatile double %val12, double *%ptr 133*9880d681SAndroid Build Coastguard Worker store volatile double %val13, double *%ptr 134*9880d681SAndroid Build Coastguard Worker store volatile double %val14, double *%ptr 135*9880d681SAndroid Build Coastguard Worker store volatile double %val15, double *%ptr 136*9880d681SAndroid Build Coastguard Worker store volatile double %val16, double *%ptr 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt0, double *%ptr 139*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt1, double *%ptr 140*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt2, double *%ptr 141*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt3, double *%ptr 142*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt4, double *%ptr 143*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt5, double *%ptr 144*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt6, double *%ptr 145*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt7, double *%ptr 146*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt8, double *%ptr 147*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt9, double *%ptr 148*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt10, double *%ptr 149*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt11, double *%ptr 150*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt12, double *%ptr 151*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt13, double *%ptr 152*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt14, double *%ptr 153*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt15, double *%ptr 154*9880d681SAndroid Build Coastguard Worker store volatile double %sqrt16, double *%ptr 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker ret void 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; Check that a call to the normal sqrt function is lowered. 160*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %dummy, double %val) { 161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 162*9880d681SAndroid Build Coastguard Worker; CHECK: sqdbr %f0, %f2 163*9880d681SAndroid Build Coastguard Worker; CHECK: cdbr %f0, %f0 164*9880d681SAndroid Build Coastguard Worker; CHECK: bnor %r14 165*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 166*9880d681SAndroid Build Coastguard Worker; CHECK: jg sqrt@PLT 167*9880d681SAndroid Build Coastguard Worker %res = tail call double @sqrt(double %val) 168*9880d681SAndroid Build Coastguard Worker ret double %res 169*9880d681SAndroid Build Coastguard Worker} 170