1*9880d681SAndroid Build Coastguard Worker; Test the handling of base + index + 12-bit displacement addresses for 2*9880d681SAndroid Build Coastguard Worker; large frames, in cases where no 20-bit form exists. The tests here 3*9880d681SAndroid Build Coastguard Worker; assume z10 register pressure, without the high words being available. 4*9880d681SAndroid Build Coastguard Worker; 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | \ 6*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck -check-prefix=CHECK-NOFP %s 7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -disable-fp-elim | \ 8*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck -check-prefix=CHECK-FP %s 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdeclare void @foo(float *%ptr1, float *%ptr2) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; This file tests what happens when a displacement is converted from 13*9880d681SAndroid Build Coastguard Worker; being relative to the start of a frame object to being relative to 14*9880d681SAndroid Build Coastguard Worker; the frame itself. In some cases the test is only possible if two 15*9880d681SAndroid Build Coastguard Worker; objects are allocated. 16*9880d681SAndroid Build Coastguard Worker; 17*9880d681SAndroid Build Coastguard Worker; Rather than rely on a particular order for those objects, the tests 18*9880d681SAndroid Build Coastguard Worker; instead allocate two objects of the same size and apply the test to 19*9880d681SAndroid Build Coastguard Worker; both of them. For consistency, all tests follow this model, even if 20*9880d681SAndroid Build Coastguard Worker; one object would actually be enough. 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; First check the highest in-range offset after conversion, which is 4092 23*9880d681SAndroid Build Coastguard Worker; for word-addressing instructions like LDEB. 24*9880d681SAndroid Build Coastguard Worker; 25*9880d681SAndroid Build Coastguard Worker; The last in-range doubleword offset is 4088. Since the frame has two 26*9880d681SAndroid Build Coastguard Worker; emergency spill slots at 160(%r15), the amount that we need to allocate 27*9880d681SAndroid Build Coastguard Worker; in order to put another object at offset 4088 is (4088 - 176) / 4 = 978 28*9880d681SAndroid Build Coastguard Worker; words. 29*9880d681SAndroid Build Coastguard Workerdefine void @f1(double *%dst) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f1: 31*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4092(%r15) 32*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 33*9880d681SAndroid Build Coastguard Worker; 34*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f1: 35*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4092(%r11) 36*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 37*9880d681SAndroid Build Coastguard Worker %region1 = alloca [978 x float], align 8 38*9880d681SAndroid Build Coastguard Worker %region2 = alloca [978 x float], align 8 39*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0 40*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0 41*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 42*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 1 43*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 1 44*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 45*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 46*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 47*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 48*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 49*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; Test the first out-of-range offset. 54*9880d681SAndroid Build Coastguard Workerdefine void @f2(double *%dst) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f2: 56*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 4096 57*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0(%r1,%r15) 58*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 59*9880d681SAndroid Build Coastguard Worker; 60*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f2: 61*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 4096 62*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0(%r1,%r11) 63*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 64*9880d681SAndroid Build Coastguard Worker %region1 = alloca [978 x float], align 8 65*9880d681SAndroid Build Coastguard Worker %region2 = alloca [978 x float], align 8 66*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0 67*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0 68*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 69*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 2 70*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 2 71*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 72*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 73*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 74*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 75*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 76*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; Test the next offset after that. 81*9880d681SAndroid Build Coastguard Workerdefine void @f3(double *%dst) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f3: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 4096 84*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4(%r1,%r15) 85*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 86*9880d681SAndroid Build Coastguard Worker; 87*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f3: 88*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 4096 89*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4(%r1,%r11) 90*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 91*9880d681SAndroid Build Coastguard Worker %region1 = alloca [978 x float], align 8 92*9880d681SAndroid Build Coastguard Worker %region2 = alloca [978 x float], align 8 93*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0 94*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0 95*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 96*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 3 97*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 3 98*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 99*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 100*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 101*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 102*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 103*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 104*9880d681SAndroid Build Coastguard Worker ret void 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; Add 4096 bytes (1024 words) to the size of each object and repeat. 108*9880d681SAndroid Build Coastguard Workerdefine void @f4(double *%dst) { 109*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f4: 110*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 4096 111*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4092(%r1,%r15) 112*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 113*9880d681SAndroid Build Coastguard Worker; 114*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f4: 115*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 4096 116*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4092(%r1,%r11) 117*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 118*9880d681SAndroid Build Coastguard Worker %region1 = alloca [2002 x float], align 8 119*9880d681SAndroid Build Coastguard Worker %region2 = alloca [2002 x float], align 8 120*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 0 121*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 0 122*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 123*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 1 124*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 1 125*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 126*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 127*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 128*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 129*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 130*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 131*9880d681SAndroid Build Coastguard Worker ret void 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; ...as above. 135*9880d681SAndroid Build Coastguard Workerdefine void @f5(double *%dst) { 136*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f5: 137*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 8192 138*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0(%r1,%r15) 139*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 140*9880d681SAndroid Build Coastguard Worker; 141*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f5: 142*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 8192 143*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0(%r1,%r11) 144*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 145*9880d681SAndroid Build Coastguard Worker %region1 = alloca [2002 x float], align 8 146*9880d681SAndroid Build Coastguard Worker %region2 = alloca [2002 x float], align 8 147*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 0 148*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 0 149*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 150*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 2 151*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 2 152*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 153*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 154*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 155*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 156*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 157*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 158*9880d681SAndroid Build Coastguard Worker ret void 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker; ...as above. 162*9880d681SAndroid Build Coastguard Workerdefine void @f6(double *%dst) { 163*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f6: 164*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 8192 165*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4(%r1,%r15) 166*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 167*9880d681SAndroid Build Coastguard Worker; 168*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f6: 169*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 8192 170*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4(%r1,%r11) 171*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 172*9880d681SAndroid Build Coastguard Worker %region1 = alloca [2002 x float], align 8 173*9880d681SAndroid Build Coastguard Worker %region2 = alloca [2002 x float], align 8 174*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 0 175*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 0 176*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 177*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 3 178*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 3 179*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 180*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 181*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 182*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 183*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 184*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 185*9880d681SAndroid Build Coastguard Worker ret void 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; Now try an offset of 4092 from the start of the object, with the object 189*9880d681SAndroid Build Coastguard Worker; being at offset 8192. This time we need objects of (8192 - 168) / 4 = 2004 190*9880d681SAndroid Build Coastguard Worker; words. 191*9880d681SAndroid Build Coastguard Workerdefine void @f7(double *%dst) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f7: 193*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 8192 194*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4092(%r1,%r15) 195*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 196*9880d681SAndroid Build Coastguard Worker; 197*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f7: 198*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 8192 199*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4092(%r1,%r11) 200*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 201*9880d681SAndroid Build Coastguard Worker %region1 = alloca [2004 x float], align 8 202*9880d681SAndroid Build Coastguard Worker %region2 = alloca [2004 x float], align 8 203*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [2004 x float], [2004 x float]* %region1, i64 0, i64 0 204*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [2004 x float], [2004 x float]* %region2, i64 0, i64 0 205*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 206*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [2004 x float], [2004 x float]* %region1, i64 0, i64 1023 207*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [2004 x float], [2004 x float]* %region2, i64 0, i64 1023 208*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 209*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 210*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 211*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 212*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 213*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 214*9880d681SAndroid Build Coastguard Worker ret void 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker; Keep the object-relative offset the same but bump the size of the 218*9880d681SAndroid Build Coastguard Worker; objects by one doubleword. 219*9880d681SAndroid Build Coastguard Workerdefine void @f8(double *%dst) { 220*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f8: 221*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 12288 222*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4(%r1,%r15) 223*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 224*9880d681SAndroid Build Coastguard Worker; 225*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f8: 226*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 12288 227*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4(%r1,%r11) 228*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 229*9880d681SAndroid Build Coastguard Worker %region1 = alloca [2006 x float], align 8 230*9880d681SAndroid Build Coastguard Worker %region2 = alloca [2006 x float], align 8 231*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 0 232*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 0 233*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 234*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 1023 235*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 1023 236*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 237*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 238*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 239*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 240*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 241*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 242*9880d681SAndroid Build Coastguard Worker ret void 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker; Check a case where the original displacement is out of range. The backend 246*9880d681SAndroid Build Coastguard Worker; should force an LAY from the outset. We don't yet do any kind of anchor 247*9880d681SAndroid Build Coastguard Worker; optimization, so there should be no offset on the LDEB itself. 248*9880d681SAndroid Build Coastguard Workerdefine void @f9(double *%dst) { 249*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f9: 250*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 12296(%r15) 251*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0(%r1) 252*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 253*9880d681SAndroid Build Coastguard Worker; 254*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f9: 255*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 12296(%r11) 256*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0(%r1) 257*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 258*9880d681SAndroid Build Coastguard Worker %region1 = alloca [2006 x float], align 8 259*9880d681SAndroid Build Coastguard Worker %region2 = alloca [2006 x float], align 8 260*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 0 261*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 0 262*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 263*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 1024 264*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 1024 265*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 266*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 267*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 268*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 269*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 270*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 271*9880d681SAndroid Build Coastguard Worker ret void 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker; Repeat f2 in a case that needs the emergency spill slots, because all 275*9880d681SAndroid Build Coastguard Worker; call-clobbered and allocated call-saved registers are live. Note that 276*9880d681SAndroid Build Coastguard Worker; %vptr and %dst are copied to call-saved registers, freeing up %r2 and 277*9880d681SAndroid Build Coastguard Worker; %r3 during the main test. 278*9880d681SAndroid Build Coastguard Workerdefine void @f10(i32 *%vptr, double *%dst) { 279*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f10: 280*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r15) 281*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi [[REGISTER]], 4096 282*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r15) 283*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lg [[REGISTER]], [[OFFSET]](%r15) 284*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 285*9880d681SAndroid Build Coastguard Worker; 286*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f10: 287*9880d681SAndroid Build Coastguard Worker; CHECK-FP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r11) 288*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi [[REGISTER]], 4096 289*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r11) 290*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lg [[REGISTER]], [[OFFSET]](%r11) 291*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 292*9880d681SAndroid Build Coastguard Worker %region1 = alloca [978 x float], align 8 293*9880d681SAndroid Build Coastguard Worker %region2 = alloca [978 x float], align 8 294*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0 295*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0 296*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 297*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 2 298*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 2 299*9880d681SAndroid Build Coastguard Worker %i0 = load volatile i32 , i32 *%vptr 300*9880d681SAndroid Build Coastguard Worker %i1 = load volatile i32 , i32 *%vptr 301*9880d681SAndroid Build Coastguard Worker %i2 = load volatile i32 , i32 *%vptr 302*9880d681SAndroid Build Coastguard Worker %i3 = load volatile i32 , i32 *%vptr 303*9880d681SAndroid Build Coastguard Worker %i4 = load volatile i32 , i32 *%vptr 304*9880d681SAndroid Build Coastguard Worker %i5 = load volatile i32 , i32 *%vptr 305*9880d681SAndroid Build Coastguard Worker %i14 = load volatile i32 , i32 *%vptr 306*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 307*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 308*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 309*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 310*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 311*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 312*9880d681SAndroid Build Coastguard Worker store volatile i32 %i0, i32 *%vptr 313*9880d681SAndroid Build Coastguard Worker store volatile i32 %i1, i32 *%vptr 314*9880d681SAndroid Build Coastguard Worker store volatile i32 %i2, i32 *%vptr 315*9880d681SAndroid Build Coastguard Worker store volatile i32 %i3, i32 *%vptr 316*9880d681SAndroid Build Coastguard Worker store volatile i32 %i4, i32 *%vptr 317*9880d681SAndroid Build Coastguard Worker store volatile i32 %i5, i32 *%vptr 318*9880d681SAndroid Build Coastguard Worker store volatile i32 %i14, i32 *%vptr 319*9880d681SAndroid Build Coastguard Worker ret void 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker; Repeat f2 in a case where the index register is already occupied. 323*9880d681SAndroid Build Coastguard Workerdefine void @f11(double *%dst, i64 %index) { 324*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f11: 325*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lgr [[REGISTER:%r[1-9][0-5]?]], %r3 326*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 4096(%r15) 327*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r1) 328*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14 329*9880d681SAndroid Build Coastguard Worker; 330*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f11: 331*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lgr [[REGISTER:%r[1-9][0-5]?]], %r3 332*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 4096(%r11) 333*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r1) 334*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14 335*9880d681SAndroid Build Coastguard Worker %region1 = alloca [978 x float], align 8 336*9880d681SAndroid Build Coastguard Worker %region2 = alloca [978 x float], align 8 337*9880d681SAndroid Build Coastguard Worker %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0 338*9880d681SAndroid Build Coastguard Worker %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0 339*9880d681SAndroid Build Coastguard Worker call void @foo(float *%start1, float *%start2) 340*9880d681SAndroid Build Coastguard Worker %elem1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 2 341*9880d681SAndroid Build Coastguard Worker %elem2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 2 342*9880d681SAndroid Build Coastguard Worker %base1 = ptrtoint float *%elem1 to i64 343*9880d681SAndroid Build Coastguard Worker %base2 = ptrtoint float *%elem2 to i64 344*9880d681SAndroid Build Coastguard Worker %addr1 = add i64 %base1, %index 345*9880d681SAndroid Build Coastguard Worker %addr2 = add i64 %base2, %index 346*9880d681SAndroid Build Coastguard Worker %ptr1 = inttoptr i64 %addr1 to float * 347*9880d681SAndroid Build Coastguard Worker %ptr2 = inttoptr i64 %addr2 to float * 348*9880d681SAndroid Build Coastguard Worker %float1 = load float , float *%ptr1 349*9880d681SAndroid Build Coastguard Worker %float2 = load float , float *%ptr2 350*9880d681SAndroid Build Coastguard Worker %double1 = fpext float %float1 to double 351*9880d681SAndroid Build Coastguard Worker %double2 = fpext float %float2 to double 352*9880d681SAndroid Build Coastguard Worker store volatile double %double1, double *%dst 353*9880d681SAndroid Build Coastguard Worker store volatile double %double2, double *%dst 354*9880d681SAndroid Build Coastguard Worker ret void 355*9880d681SAndroid Build Coastguard Worker} 356