1*9880d681SAndroid Build Coastguard Worker; Test 64-bit signed comparison in which the second operand is a variable. 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 Worker; Check CGR. 6*9880d681SAndroid Build Coastguard Workerdefine double @f1(double %a, double %b, i64 %i1, i64 %i2) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: cgrbl %r2, %r3, 0(%r14) 9*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 10*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 11*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 12*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 13*9880d681SAndroid Build Coastguard Worker ret double %res 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; Check CG with no displacement. 17*9880d681SAndroid Build Coastguard Workerdefine double @f2(double %a, double %b, i64 %i1, i64 *%ptr) { 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 19*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, 0(%r3) 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 21*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 23*9880d681SAndroid Build Coastguard Worker %i2 = load i64 , i64 *%ptr 24*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 25*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 26*9880d681SAndroid Build Coastguard Worker ret double %res 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; Check the high end of the aligned CG range. 30*9880d681SAndroid Build Coastguard Workerdefine double @f3(double %a, double %b, i64 %i1, i64 *%base) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 32*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, 524280(%r3) 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 34*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 35*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 36*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 65535 37*9880d681SAndroid Build Coastguard Worker %i2 = load i64 , i64 *%ptr 38*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 39*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 40*9880d681SAndroid Build Coastguard Worker ret double %res 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; Check the next doubleword up, which needs separate address logic. 44*9880d681SAndroid Build Coastguard Worker; Other sequences besides this one would be OK. 45*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %a, double %b, i64 %i1, i64 *%base) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r3, 524288 48*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, 0(%r3) 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 50*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 51*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 52*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 65536 53*9880d681SAndroid Build Coastguard Worker %i2 = load i64 , i64 *%ptr 54*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 55*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 56*9880d681SAndroid Build Coastguard Worker ret double %res 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; Check the high end of the negative aligned CG range. 60*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %a, double %b, i64 %i1, i64 *%base) { 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 62*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, -8(%r3) 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 64*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 65*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 66*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 -1 67*9880d681SAndroid Build Coastguard Worker %i2 = load i64 , i64 *%ptr 68*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 69*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 70*9880d681SAndroid Build Coastguard Worker ret double %res 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; Check the low end of the CG range. 74*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %a, double %b, i64 %i1, i64 *%base) { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 76*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, -524288(%r3) 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 78*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 79*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 80*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 -65536 81*9880d681SAndroid Build Coastguard Worker %i2 = load i64 , i64 *%ptr 82*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 83*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 84*9880d681SAndroid Build Coastguard Worker ret double %res 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; Check the next doubleword down, which needs separate address logic. 88*9880d681SAndroid Build Coastguard Worker; Other sequences besides this one would be OK. 89*9880d681SAndroid Build Coastguard Workerdefine double @f7(double %a, double %b, i64 %i1, i64 *%base) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 91*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r3, -524296 92*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, 0(%r3) 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 94*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 95*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 96*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 -65537 97*9880d681SAndroid Build Coastguard Worker %i2 = load i64 , i64 *%ptr 98*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 99*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 100*9880d681SAndroid Build Coastguard Worker ret double %res 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; Check that CG allows an index. 104*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %a, double %b, i64 %i1, i64 %base, i64 %index) { 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 106*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, 524280({{%r4,%r3|%r3,%r4}}) 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 108*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 109*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 110*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %base, %index 111*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %add1, 524280 112*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add2 to i64 * 113*9880d681SAndroid Build Coastguard Worker %i2 = load i64 , i64 *%ptr 114*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 115*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 116*9880d681SAndroid Build Coastguard Worker ret double %res 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; Check the comparison can be reversed if that allows CG to be used. 120*9880d681SAndroid Build Coastguard Workerdefine double @f9(double %a, double %b, i64 %i2, i64 *%ptr) { 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 122*9880d681SAndroid Build Coastguard Worker; CHECK: cg %r2, 0(%r3) 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 124*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 125*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 126*9880d681SAndroid Build Coastguard Worker %i1 = load i64 , i64 *%ptr 127*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i64 %i1, %i2 128*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 129*9880d681SAndroid Build Coastguard Worker ret double %res 130*9880d681SAndroid Build Coastguard Worker} 131