1*9880d681SAndroid Build Coastguard Worker; Test spilling of FPRs. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; We need to save and restore 8 of the 16 FPRs and allocate an additional 6*9880d681SAndroid Build Coastguard Worker; 4-byte spill slot, rounded to 8 bytes. The frame size should be exactly 7*9880d681SAndroid Build Coastguard Worker; 160 + 8 * 8 = 232. 8*9880d681SAndroid Build Coastguard Workerdefine void @f1(float *%ptr) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r15, -232 11*9880d681SAndroid Build Coastguard Worker; CHECK: std %f8, 224(%r15) 12*9880d681SAndroid Build Coastguard Worker; CHECK: std %f9, 216(%r15) 13*9880d681SAndroid Build Coastguard Worker; CHECK: std %f10, 208(%r15) 14*9880d681SAndroid Build Coastguard Worker; CHECK: std %f11, 200(%r15) 15*9880d681SAndroid Build Coastguard Worker; CHECK: std %f12, 192(%r15) 16*9880d681SAndroid Build Coastguard Worker; CHECK: std %f13, 184(%r15) 17*9880d681SAndroid Build Coastguard Worker; CHECK: std %f14, 176(%r15) 18*9880d681SAndroid Build Coastguard Worker; CHECK: std %f15, 168(%r15) 19*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: 160(%r15) 20*9880d681SAndroid Build Coastguard Worker; CHECK: ste [[REGISTER:%f[0-9]+]], 164(%r15) 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: 160(%r15) 22*9880d681SAndroid Build Coastguard Worker; CHECK: le [[REGISTER]], 164(%r15) 23*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: 160(%r15) 24*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f8, 224(%r15) 25*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f9, 216(%r15) 26*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f10, 208(%r15) 27*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f11, 200(%r15) 28*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f12, 192(%r15) 29*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f13, 184(%r15) 30*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f14, 176(%r15) 31*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f15, 168(%r15) 32*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r15, 232 33*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 34*9880d681SAndroid Build Coastguard Worker %l0 = load volatile float , float *%ptr 35*9880d681SAndroid Build Coastguard Worker %l1 = load volatile float , float *%ptr 36*9880d681SAndroid Build Coastguard Worker %l2 = load volatile float , float *%ptr 37*9880d681SAndroid Build Coastguard Worker %l3 = load volatile float , float *%ptr 38*9880d681SAndroid Build Coastguard Worker %l4 = load volatile float , float *%ptr 39*9880d681SAndroid Build Coastguard Worker %l5 = load volatile float , float *%ptr 40*9880d681SAndroid Build Coastguard Worker %l6 = load volatile float , float *%ptr 41*9880d681SAndroid Build Coastguard Worker %l7 = load volatile float , float *%ptr 42*9880d681SAndroid Build Coastguard Worker %l8 = load volatile float , float *%ptr 43*9880d681SAndroid Build Coastguard Worker %l9 = load volatile float , float *%ptr 44*9880d681SAndroid Build Coastguard Worker %l10 = load volatile float , float *%ptr 45*9880d681SAndroid Build Coastguard Worker %l11 = load volatile float , float *%ptr 46*9880d681SAndroid Build Coastguard Worker %l12 = load volatile float , float *%ptr 47*9880d681SAndroid Build Coastguard Worker %l13 = load volatile float , float *%ptr 48*9880d681SAndroid Build Coastguard Worker %l14 = load volatile float , float *%ptr 49*9880d681SAndroid Build Coastguard Worker %l15 = load volatile float , float *%ptr 50*9880d681SAndroid Build Coastguard Worker %lx = load volatile float , float *%ptr 51*9880d681SAndroid Build Coastguard Worker store volatile float %lx, float *%ptr 52*9880d681SAndroid Build Coastguard Worker store volatile float %l15, float *%ptr 53*9880d681SAndroid Build Coastguard Worker store volatile float %l14, float *%ptr 54*9880d681SAndroid Build Coastguard Worker store volatile float %l13, float *%ptr 55*9880d681SAndroid Build Coastguard Worker store volatile float %l12, float *%ptr 56*9880d681SAndroid Build Coastguard Worker store volatile float %l11, float *%ptr 57*9880d681SAndroid Build Coastguard Worker store volatile float %l10, float *%ptr 58*9880d681SAndroid Build Coastguard Worker store volatile float %l9, float *%ptr 59*9880d681SAndroid Build Coastguard Worker store volatile float %l8, float *%ptr 60*9880d681SAndroid Build Coastguard Worker store volatile float %l7, float *%ptr 61*9880d681SAndroid Build Coastguard Worker store volatile float %l6, float *%ptr 62*9880d681SAndroid Build Coastguard Worker store volatile float %l5, float *%ptr 63*9880d681SAndroid Build Coastguard Worker store volatile float %l4, float *%ptr 64*9880d681SAndroid Build Coastguard Worker store volatile float %l3, float *%ptr 65*9880d681SAndroid Build Coastguard Worker store volatile float %l2, float *%ptr 66*9880d681SAndroid Build Coastguard Worker store volatile float %l1, float *%ptr 67*9880d681SAndroid Build Coastguard Worker store volatile float %l0, float *%ptr 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; Same for doubles, except that the full spill slot is used. 72*9880d681SAndroid Build Coastguard Workerdefine void @f2(double *%ptr) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 74*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r15, -232 75*9880d681SAndroid Build Coastguard Worker; CHECK: std %f8, 224(%r15) 76*9880d681SAndroid Build Coastguard Worker; CHECK: std %f9, 216(%r15) 77*9880d681SAndroid Build Coastguard Worker; CHECK: std %f10, 208(%r15) 78*9880d681SAndroid Build Coastguard Worker; CHECK: std %f11, 200(%r15) 79*9880d681SAndroid Build Coastguard Worker; CHECK: std %f12, 192(%r15) 80*9880d681SAndroid Build Coastguard Worker; CHECK: std %f13, 184(%r15) 81*9880d681SAndroid Build Coastguard Worker; CHECK: std %f14, 176(%r15) 82*9880d681SAndroid Build Coastguard Worker; CHECK: std %f15, 168(%r15) 83*9880d681SAndroid Build Coastguard Worker; CHECK: std [[REGISTER:%f[0-9]+]], 160(%r15) 84*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REGISTER]], 160(%r15) 85*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f8, 224(%r15) 86*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f9, 216(%r15) 87*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f10, 208(%r15) 88*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f11, 200(%r15) 89*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f12, 192(%r15) 90*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f13, 184(%r15) 91*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f14, 176(%r15) 92*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f15, 168(%r15) 93*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r15, 232 94*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 95*9880d681SAndroid Build Coastguard Worker %l0 = load volatile double , double *%ptr 96*9880d681SAndroid Build Coastguard Worker %l1 = load volatile double , double *%ptr 97*9880d681SAndroid Build Coastguard Worker %l2 = load volatile double , double *%ptr 98*9880d681SAndroid Build Coastguard Worker %l3 = load volatile double , double *%ptr 99*9880d681SAndroid Build Coastguard Worker %l4 = load volatile double , double *%ptr 100*9880d681SAndroid Build Coastguard Worker %l5 = load volatile double , double *%ptr 101*9880d681SAndroid Build Coastguard Worker %l6 = load volatile double , double *%ptr 102*9880d681SAndroid Build Coastguard Worker %l7 = load volatile double , double *%ptr 103*9880d681SAndroid Build Coastguard Worker %l8 = load volatile double , double *%ptr 104*9880d681SAndroid Build Coastguard Worker %l9 = load volatile double , double *%ptr 105*9880d681SAndroid Build Coastguard Worker %l10 = load volatile double , double *%ptr 106*9880d681SAndroid Build Coastguard Worker %l11 = load volatile double , double *%ptr 107*9880d681SAndroid Build Coastguard Worker %l12 = load volatile double , double *%ptr 108*9880d681SAndroid Build Coastguard Worker %l13 = load volatile double , double *%ptr 109*9880d681SAndroid Build Coastguard Worker %l14 = load volatile double , double *%ptr 110*9880d681SAndroid Build Coastguard Worker %l15 = load volatile double , double *%ptr 111*9880d681SAndroid Build Coastguard Worker %lx = load volatile double , double *%ptr 112*9880d681SAndroid Build Coastguard Worker store volatile double %lx, double *%ptr 113*9880d681SAndroid Build Coastguard Worker store volatile double %l15, double *%ptr 114*9880d681SAndroid Build Coastguard Worker store volatile double %l14, double *%ptr 115*9880d681SAndroid Build Coastguard Worker store volatile double %l13, double *%ptr 116*9880d681SAndroid Build Coastguard Worker store volatile double %l12, double *%ptr 117*9880d681SAndroid Build Coastguard Worker store volatile double %l11, double *%ptr 118*9880d681SAndroid Build Coastguard Worker store volatile double %l10, double *%ptr 119*9880d681SAndroid Build Coastguard Worker store volatile double %l9, double *%ptr 120*9880d681SAndroid Build Coastguard Worker store volatile double %l8, double *%ptr 121*9880d681SAndroid Build Coastguard Worker store volatile double %l7, double *%ptr 122*9880d681SAndroid Build Coastguard Worker store volatile double %l6, double *%ptr 123*9880d681SAndroid Build Coastguard Worker store volatile double %l5, double *%ptr 124*9880d681SAndroid Build Coastguard Worker store volatile double %l4, double *%ptr 125*9880d681SAndroid Build Coastguard Worker store volatile double %l3, double *%ptr 126*9880d681SAndroid Build Coastguard Worker store volatile double %l2, double *%ptr 127*9880d681SAndroid Build Coastguard Worker store volatile double %l1, double *%ptr 128*9880d681SAndroid Build Coastguard Worker store volatile double %l0, double *%ptr 129*9880d681SAndroid Build Coastguard Worker ret void 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; The long double case needs a 16-byte spill slot. 133*9880d681SAndroid Build Coastguard Workerdefine void @f3(fp128 *%ptr) { 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 135*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r15, -240 136*9880d681SAndroid Build Coastguard Worker; CHECK: std %f8, 232(%r15) 137*9880d681SAndroid Build Coastguard Worker; CHECK: std %f9, 224(%r15) 138*9880d681SAndroid Build Coastguard Worker; CHECK: std %f10, 216(%r15) 139*9880d681SAndroid Build Coastguard Worker; CHECK: std %f11, 208(%r15) 140*9880d681SAndroid Build Coastguard Worker; CHECK: std %f12, 200(%r15) 141*9880d681SAndroid Build Coastguard Worker; CHECK: std %f13, 192(%r15) 142*9880d681SAndroid Build Coastguard Worker; CHECK: std %f14, 184(%r15) 143*9880d681SAndroid Build Coastguard Worker; CHECK: std %f15, 176(%r15) 144*9880d681SAndroid Build Coastguard Worker; CHECK: std [[REGISTER1:%f[0-9]+]], 160(%r15) 145*9880d681SAndroid Build Coastguard Worker; CHECK: std [[REGISTER2:%f[0-9]+]], 168(%r15) 146*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REGISTER1]], 160(%r15) 147*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REGISTER2]], 168(%r15) 148*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f8, 232(%r15) 149*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f9, 224(%r15) 150*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f10, 216(%r15) 151*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f11, 208(%r15) 152*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f12, 200(%r15) 153*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f13, 192(%r15) 154*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f14, 184(%r15) 155*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f15, 176(%r15) 156*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r15, 240 157*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 158*9880d681SAndroid Build Coastguard Worker %l0 = load volatile fp128 , fp128 *%ptr 159*9880d681SAndroid Build Coastguard Worker %l1 = load volatile fp128 , fp128 *%ptr 160*9880d681SAndroid Build Coastguard Worker %l4 = load volatile fp128 , fp128 *%ptr 161*9880d681SAndroid Build Coastguard Worker %l5 = load volatile fp128 , fp128 *%ptr 162*9880d681SAndroid Build Coastguard Worker %l8 = load volatile fp128 , fp128 *%ptr 163*9880d681SAndroid Build Coastguard Worker %l9 = load volatile fp128 , fp128 *%ptr 164*9880d681SAndroid Build Coastguard Worker %l12 = load volatile fp128 , fp128 *%ptr 165*9880d681SAndroid Build Coastguard Worker %l13 = load volatile fp128 , fp128 *%ptr 166*9880d681SAndroid Build Coastguard Worker %lx = load volatile fp128 , fp128 *%ptr 167*9880d681SAndroid Build Coastguard Worker store volatile fp128 %lx, fp128 *%ptr 168*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l13, fp128 *%ptr 169*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l12, fp128 *%ptr 170*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l9, fp128 *%ptr 171*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l8, fp128 *%ptr 172*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l5, fp128 *%ptr 173*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l4, fp128 *%ptr 174*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l1, fp128 *%ptr 175*9880d681SAndroid Build Coastguard Worker store volatile fp128 %l0, fp128 *%ptr 176*9880d681SAndroid Build Coastguard Worker ret void 177*9880d681SAndroid Build Coastguard Worker} 178