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