1*9880d681SAndroid Build Coastguard Worker; Test 32-bit signed comparison in which the second operand is constant. 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 comparisons with 0. 6*9880d681SAndroid Build Coastguard Workerdefine double @f1(double %a, double %b, i32 %i1) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: cijl %r2, 0 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 i32 %i1, 0 12*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 13*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 14*9880d681SAndroid Build Coastguard Worker ret double %res 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; Check comparisons with 2. 18*9880d681SAndroid Build Coastguard Workerdefine double @f2(double %a, double %b, i32 %i1) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 20*9880d681SAndroid Build Coastguard Worker; CHECK: cijl %r2, 2 21*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 23*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, 2 24*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 25*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 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 CIJ range. 30*9880d681SAndroid Build Coastguard Workerdefine double @f3(double %a, double %b, i32 %i1) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 32*9880d681SAndroid Build Coastguard Worker; CHECK: cijl %r2, 127 33*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 34*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 35*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, 127 36*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 37*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 38*9880d681SAndroid Build Coastguard Worker ret double %res 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; Check the next value up, which must use CHI instead. 42*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %a, double %b, i32 %i1) { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 44*9880d681SAndroid Build Coastguard Worker; CHECK: chi %r2, 128 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jl 46*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 47*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 48*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, 128 49*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 50*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 51*9880d681SAndroid Build Coastguard Worker ret double %res 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; Check the high end of the CHI range. 55*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %a, double %b, i32 %i1) { 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 57*9880d681SAndroid Build Coastguard Worker; CHECK: chi %r2, 32767 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jl 59*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 60*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 61*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, 32767 62*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 63*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 64*9880d681SAndroid Build Coastguard Worker ret double %res 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; Check the next value up, which must use CFI. 68*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %a, double %b, i32 %i1) { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 70*9880d681SAndroid Build Coastguard Worker; CHECK: cfi %r2, 32768 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jl 72*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 73*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 74*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, 32768 75*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 76*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 77*9880d681SAndroid Build Coastguard Worker ret double %res 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; Check the high end of the signed 32-bit range. 81*9880d681SAndroid Build Coastguard Workerdefine double @f7(double %a, double %b, i32 %i1) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 83*9880d681SAndroid Build Coastguard Worker; CHECK: cfi %r2, 2147483647 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 85*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 86*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 87*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %i1, 2147483647 88*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 89*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 90*9880d681SAndroid Build Coastguard Worker ret double %res 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; Check the next value up, which should be treated as a negative value. 94*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %a, double %b, i32 %i1) { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 96*9880d681SAndroid Build Coastguard Worker; CHECK: cfi %r2, -2147483648 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 98*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 99*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 100*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %i1, 2147483648 101*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 102*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 103*9880d681SAndroid Build Coastguard Worker ret double %res 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; Check the high end of the negative CIJ range. 107*9880d681SAndroid Build Coastguard Workerdefine double @f9(double %a, double %b, i32 %i1) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 109*9880d681SAndroid Build Coastguard Worker; CHECK: cijl %r2, -1 110*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 111*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 112*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, -1 113*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 114*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 115*9880d681SAndroid Build Coastguard Worker ret double %res 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; Check the low end of the CIJ range. 119*9880d681SAndroid Build Coastguard Workerdefine double @f10(double %a, double %b, i32 %i1) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 121*9880d681SAndroid Build Coastguard Worker; CHECK: cijl %r2, -128 122*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 123*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 124*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, -128 125*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 126*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 127*9880d681SAndroid Build Coastguard Worker ret double %res 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; Check the next value down, which must use CHI instead. 131*9880d681SAndroid Build Coastguard Workerdefine double @f11(double %a, double %b, i32 %i1) { 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 133*9880d681SAndroid Build Coastguard Worker; CHECK: chi %r2, -129 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jl 135*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 136*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 137*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, -129 138*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 139*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 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 low end of the CHI range. 144*9880d681SAndroid Build Coastguard Workerdefine double @f12(double %a, double %b, i32 %i1) { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 146*9880d681SAndroid Build Coastguard Worker; CHECK: chi %r2, -32768 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jl 148*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 149*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 150*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, -32768 151*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 152*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 153*9880d681SAndroid Build Coastguard Worker ret double %res 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker; Check the next value down, which must use CFI instead. 157*9880d681SAndroid Build Coastguard Workerdefine double @f13(double %a, double %b, i32 %i1) { 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 159*9880d681SAndroid Build Coastguard Worker; CHECK: cfi %r2, -32769 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jl 161*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 162*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 163*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, -32769 164*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 165*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 166*9880d681SAndroid Build Coastguard Worker ret double %res 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; Check the low end of the signed 32-bit range. 170*9880d681SAndroid Build Coastguard Workerdefine double @f14(double %a, double %b, i32 %i1) { 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 172*9880d681SAndroid Build Coastguard Worker; CHECK: cfi %r2, -2147483648 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 174*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 175*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 176*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %i1, -2147483648 177*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 178*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 179*9880d681SAndroid Build Coastguard Worker ret double %res 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; Check the next value down, which should be treated as a positive value. 183*9880d681SAndroid Build Coastguard Workerdefine double @f15(double %a, double %b, i32 %i1) { 184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 185*9880d681SAndroid Build Coastguard Worker; CHECK: cfi %r2, 2147483647 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 187*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 188*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 189*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %i1, -2147483649 190*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 191*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 192*9880d681SAndroid Build Coastguard Worker ret double %res 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; Check that < 1 becomes <= 0. 196*9880d681SAndroid Build Coastguard Workerdefine double @f16(double %a, double %b, i32 %i1) { 197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 198*9880d681SAndroid Build Coastguard Worker; CHECK: cijle %r2, 0 199*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 200*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 201*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %i1, 1 202*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 203*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 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 >= 1 becomes > 0. 208*9880d681SAndroid Build Coastguard Workerdefine double @f17(double %a, double %b, i32 %i1) { 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 210*9880d681SAndroid Build Coastguard Worker; CHECK: cijh %r2, 0 211*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 212*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 213*9880d681SAndroid Build Coastguard Worker %cond = icmp sge i32 %i1, 1 214*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 215*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 216*9880d681SAndroid Build Coastguard Worker ret double %res 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker; Check that > -1 becomes >= 0. 220*9880d681SAndroid Build Coastguard Workerdefine double @f18(double %a, double %b, i32 %i1) { 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 222*9880d681SAndroid Build Coastguard Worker; CHECK: cijhe %r2, 0 223*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 224*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 225*9880d681SAndroid Build Coastguard Worker %cond = icmp sgt i32 %i1, -1 226*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 227*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 228*9880d681SAndroid Build Coastguard Worker ret double %res 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker; Check that <= -1 becomes < 0. 232*9880d681SAndroid Build Coastguard Workerdefine double @f19(double %a, double %b, i32 %i1) { 233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19: 234*9880d681SAndroid Build Coastguard Worker; CHECK: cijl %r2, 0 235*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 236*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 237*9880d681SAndroid Build Coastguard Worker %cond = icmp sle i32 %i1, -1 238*9880d681SAndroid Build Coastguard Worker %tmp = select i1 %cond, double %a, double %b 239*9880d681SAndroid Build Coastguard Worker %res = fadd double %tmp, 1.0 240*9880d681SAndroid Build Coastguard Worker ret double %res 241*9880d681SAndroid Build Coastguard Worker} 242