1*9880d681SAndroid Build Coastguard Worker; Test 64-bit comparison in which the second operand is a sign-extended i32. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare i64 @foo() 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Check signed register comparison. 8*9880d681SAndroid Build Coastguard Workerdefine double @f1(double %a, double %b, i64 %i1, i32 %unext) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: cgfr %r2, %r3 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 12*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 13*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 14*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 15*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 16*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 17*9880d681SAndroid Build Coastguard Worker ret double %res 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; Check unsigned register comparison, which can't use CGFR. 21*9880d681SAndroid Build Coastguard Workerdefine double @f2(double %a, double %b, i64 %i1, i32 %unext) { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cgfr 24*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 25*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 26*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i64 %i1, %i2 27*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 28*9880d681SAndroid Build Coastguard Worker ret double %res 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; Check register equality. 32*9880d681SAndroid Build Coastguard Workerdefine double @f3(double %a, double %b, i64 %i1, i32 %unext) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: cgfr %r2, %r3 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 36*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 37*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 38*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 39*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %i1, %i2 40*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 41*9880d681SAndroid Build Coastguard Worker ret double %res 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Check register inequality. 45*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %a, double %b, i64 %i1, i32 %unext) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK: cgfr %r2, %r3 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blhr %r14 49*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 50*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 51*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 52*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i64 %i1, %i2 53*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 54*9880d681SAndroid Build Coastguard Worker ret double %res 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; Check signed comparison with memory. 58*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %a, double %b, i64 %i1, i32 *%ptr) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 60*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 0(%r3) 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 62*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 63*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 64*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 65*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 66*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 67*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 68*9880d681SAndroid Build Coastguard Worker ret double %res 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; Check unsigned comparison with memory. 72*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %a, double %b, i64 %i1, i32 *%ptr) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 74*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cgf 75*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 76*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 77*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 78*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i64 %i1, %i2 79*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 80*9880d681SAndroid Build Coastguard Worker ret double %res 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; Check memory equality. 84*9880d681SAndroid Build Coastguard Workerdefine double @f7(double %a, double %b, i64 %i1, i32 *%ptr) { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 86*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 0(%r3) 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 88*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 89*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 90*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 91*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 92*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %i1, %i2 93*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 94*9880d681SAndroid Build Coastguard Worker ret double %res 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; Check memory inequality. 98*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %a, double %b, i64 %i1, i32 *%ptr) { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 100*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 0(%r3) 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blhr %r14 102*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 103*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 104*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 105*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 106*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i64 %i1, %i2 107*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 108*9880d681SAndroid Build Coastguard Worker ret double %res 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Check the high end of the aligned CGF range. 112*9880d681SAndroid Build Coastguard Workerdefine double @f9(double %a, double %b, i64 %i1, i32 *%base) { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 114*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 524284(%r3) 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 116*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 117*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 118*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 131071 119*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 120*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 121*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 122*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 123*9880d681SAndroid Build Coastguard Worker ret double %res 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; Check the next word up, which needs separate address logic. 127*9880d681SAndroid Build Coastguard Worker; Other sequences besides this one would be OK. 128*9880d681SAndroid Build Coastguard Workerdefine double @f10(double %a, double %b, i64 %i1, i32 *%base) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 130*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r3, 524288 131*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 0(%r3) 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 133*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 134*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 135*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 131072 136*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 137*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 138*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 139*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 140*9880d681SAndroid Build Coastguard Worker ret double %res 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; Check the high end of the negative aligned CGF range. 144*9880d681SAndroid Build Coastguard Workerdefine double @f11(double %a, double %b, i64 %i1, i32 *%base) { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 146*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, -4(%r3) 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 148*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 149*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 150*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 -1 151*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 152*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 153*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 154*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 155*9880d681SAndroid Build Coastguard Worker ret double %res 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; Check the low end of the CGF range. 159*9880d681SAndroid Build Coastguard Workerdefine double @f12(double %a, double %b, i64 %i1, i32 *%base) { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 161*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, -524288(%r3) 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 163*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 164*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 165*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 -131072 166*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 167*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 168*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 169*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 170*9880d681SAndroid Build Coastguard Worker ret double %res 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; Check the next word down, which needs separate address logic. 174*9880d681SAndroid Build Coastguard Worker; Other sequences besides this one would be OK. 175*9880d681SAndroid Build Coastguard Workerdefine double @f13(double %a, double %b, i64 %i1, i32 *%base) { 176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 177*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r3, -524292 178*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 0(%r3) 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 180*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 181*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 182*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 -131073 183*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 184*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 185*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 186*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 187*9880d681SAndroid Build Coastguard Worker ret double %res 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; Check that CGF allows an index. 191*9880d681SAndroid Build Coastguard Workerdefine double @f14(double %a, double %b, i64 %i1, i64 %base, i64 %index) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 193*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 524284({{%r4,%r3|%r3,%r4}}) 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 195*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 196*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 197*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %base, %index 198*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %add1, 524284 199*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add2 to i32 * 200*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 201*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 202*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 203*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 204*9880d681SAndroid Build Coastguard Worker ret double %res 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; Check that comparisons of spilled values can use CGF rather than CGFR. 208*9880d681SAndroid Build Coastguard Workerdefine i64 @f15(i32 *%ptr0) { 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 210*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 211*9880d681SAndroid Build Coastguard Worker; CHECK: cgf {{%r[0-9]+}}, 16{{[04]}}(%r15) 212*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 213*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr i32, i32 *%ptr0, i64 2 214*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr0, i64 4 215*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr i32, i32 *%ptr0, i64 6 216*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr i32, i32 *%ptr0, i64 8 217*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr i32, i32 *%ptr0, i64 10 218*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr i32, i32 *%ptr0, i64 12 219*9880d681SAndroid Build Coastguard Worker %ptr7 = getelementptr i32, i32 *%ptr0, i64 14 220*9880d681SAndroid Build Coastguard Worker %ptr8 = getelementptr i32, i32 *%ptr0, i64 16 221*9880d681SAndroid Build Coastguard Worker %ptr9 = getelementptr i32, i32 *%ptr0, i64 18 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker %val0 = load i32 , i32 *%ptr0 224*9880d681SAndroid Build Coastguard Worker %val1 = load i32 , i32 *%ptr1 225*9880d681SAndroid Build Coastguard Worker %val2 = load i32 , i32 *%ptr2 226*9880d681SAndroid Build Coastguard Worker %val3 = load i32 , i32 *%ptr3 227*9880d681SAndroid Build Coastguard Worker %val4 = load i32 , i32 *%ptr4 228*9880d681SAndroid Build Coastguard Worker %val5 = load i32 , i32 *%ptr5 229*9880d681SAndroid Build Coastguard Worker %val6 = load i32 , i32 *%ptr6 230*9880d681SAndroid Build Coastguard Worker %val7 = load i32 , i32 *%ptr7 231*9880d681SAndroid Build Coastguard Worker %val8 = load i32 , i32 *%ptr8 232*9880d681SAndroid Build Coastguard Worker %val9 = load i32 , i32 *%ptr9 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker %frob0 = add i32 %val0, 100 235*9880d681SAndroid Build Coastguard Worker %frob1 = add i32 %val1, 100 236*9880d681SAndroid Build Coastguard Worker %frob2 = add i32 %val2, 100 237*9880d681SAndroid Build Coastguard Worker %frob3 = add i32 %val3, 100 238*9880d681SAndroid Build Coastguard Worker %frob4 = add i32 %val4, 100 239*9880d681SAndroid Build Coastguard Worker %frob5 = add i32 %val5, 100 240*9880d681SAndroid Build Coastguard Worker %frob6 = add i32 %val6, 100 241*9880d681SAndroid Build Coastguard Worker %frob7 = add i32 %val7, 100 242*9880d681SAndroid Build Coastguard Worker %frob8 = add i32 %val8, 100 243*9880d681SAndroid Build Coastguard Worker %frob9 = add i32 %val9, 100 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker store i32 %frob0, i32 *%ptr0 246*9880d681SAndroid Build Coastguard Worker store i32 %frob1, i32 *%ptr1 247*9880d681SAndroid Build Coastguard Worker store i32 %frob2, i32 *%ptr2 248*9880d681SAndroid Build Coastguard Worker store i32 %frob3, i32 *%ptr3 249*9880d681SAndroid Build Coastguard Worker store i32 %frob4, i32 *%ptr4 250*9880d681SAndroid Build Coastguard Worker store i32 %frob5, i32 *%ptr5 251*9880d681SAndroid Build Coastguard Worker store i32 %frob6, i32 *%ptr6 252*9880d681SAndroid Build Coastguard Worker store i32 %frob7, i32 *%ptr7 253*9880d681SAndroid Build Coastguard Worker store i32 %frob8, i32 *%ptr8 254*9880d681SAndroid Build Coastguard Worker store i32 %frob9, i32 *%ptr9 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker %ret = call i64 @foo() 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker %ext0 = sext i32 %frob0 to i64 259*9880d681SAndroid Build Coastguard Worker %ext1 = sext i32 %frob1 to i64 260*9880d681SAndroid Build Coastguard Worker %ext2 = sext i32 %frob2 to i64 261*9880d681SAndroid Build Coastguard Worker %ext3 = sext i32 %frob3 to i64 262*9880d681SAndroid Build Coastguard Worker %ext4 = sext i32 %frob4 to i64 263*9880d681SAndroid Build Coastguard Worker %ext5 = sext i32 %frob5 to i64 264*9880d681SAndroid Build Coastguard Worker %ext6 = sext i32 %frob6 to i64 265*9880d681SAndroid Build Coastguard Worker %ext7 = sext i32 %frob7 to i64 266*9880d681SAndroid Build Coastguard Worker %ext8 = sext i32 %frob8 to i64 267*9880d681SAndroid Build Coastguard Worker %ext9 = sext i32 %frob9 to i64 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker %cmp0 = icmp slt i64 %ret, %ext0 270*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp slt i64 %ret, %ext1 271*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp slt i64 %ret, %ext2 272*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp slt i64 %ret, %ext3 273*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp slt i64 %ret, %ext4 274*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp slt i64 %ret, %ext5 275*9880d681SAndroid Build Coastguard Worker %cmp6 = icmp slt i64 %ret, %ext6 276*9880d681SAndroid Build Coastguard Worker %cmp7 = icmp slt i64 %ret, %ext7 277*9880d681SAndroid Build Coastguard Worker %cmp8 = icmp slt i64 %ret, %ext8 278*9880d681SAndroid Build Coastguard Worker %cmp9 = icmp slt i64 %ret, %ext9 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker %sel0 = select i1 %cmp0, i64 %ret, i64 0 281*9880d681SAndroid Build Coastguard Worker %sel1 = select i1 %cmp1, i64 %sel0, i64 1 282*9880d681SAndroid Build Coastguard Worker %sel2 = select i1 %cmp2, i64 %sel1, i64 2 283*9880d681SAndroid Build Coastguard Worker %sel3 = select i1 %cmp3, i64 %sel2, i64 3 284*9880d681SAndroid Build Coastguard Worker %sel4 = select i1 %cmp4, i64 %sel3, i64 4 285*9880d681SAndroid Build Coastguard Worker %sel5 = select i1 %cmp5, i64 %sel4, i64 5 286*9880d681SAndroid Build Coastguard Worker %sel6 = select i1 %cmp6, i64 %sel5, i64 6 287*9880d681SAndroid Build Coastguard Worker %sel7 = select i1 %cmp7, i64 %sel6, i64 7 288*9880d681SAndroid Build Coastguard Worker %sel8 = select i1 %cmp8, i64 %sel7, i64 8 289*9880d681SAndroid Build Coastguard Worker %sel9 = select i1 %cmp9, i64 %sel8, i64 9 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker ret i64 %sel9 292*9880d681SAndroid Build Coastguard Worker} 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker; Check the comparison can be reversed if that allows CGFR to be used. 295*9880d681SAndroid Build Coastguard Workerdefine double @f16(double %a, double %b, i64 %i1, i32 %unext) { 296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 297*9880d681SAndroid Build Coastguard Worker; CHECK: cgfr %r2, %r3 298*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 299*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 300*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 301*9880d681SAndroid Build Coastguard Worker %i2 = sext i32 %unext to i64 302*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i2, %i1 303*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 304*9880d681SAndroid Build Coastguard Worker ret double %res 305*9880d681SAndroid Build Coastguard Worker} 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker; Likewise CGF. 308*9880d681SAndroid Build Coastguard Workerdefine double @f17(double %a, double %b, i64 %i2, i32 *%ptr) { 309*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 310*9880d681SAndroid Build Coastguard Worker; CHECK: cgf %r2, 0(%r3) 311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 312*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 313*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 314*9880d681SAndroid Build Coastguard Worker %unext = load i32 , i32 *%ptr 315*9880d681SAndroid Build Coastguard Worker %i1 = sext i32 %unext to i64 316*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 317*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 318*9880d681SAndroid Build Coastguard Worker ret double %res 319*9880d681SAndroid Build Coastguard Worker} 320