1*9880d681SAndroid Build Coastguard Worker; Test 32-bit signed comparisons between memory and a 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 ordered comparisons with 0. 6*9880d681SAndroid Build Coastguard Workerdefine double @f1(double %a, double %b, i32 *%ptr) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 0 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 10*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 11*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 12*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 13*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 0 14*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 15*9880d681SAndroid Build Coastguard Worker ret double %res 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Check ordered comparisons with 1. 19*9880d681SAndroid Build Coastguard Workerdefine double @f2(double %a, double %b, i32 *%ptr) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 0 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14 23*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 24*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 25*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 26*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 1 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 ordered comparisons with the high end of the signed 16-bit range. 32*9880d681SAndroid Build Coastguard Workerdefine double @f3(double %a, double %b, i32 *%ptr) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 32767 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 36*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 37*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 38*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 39*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 32767 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 the next value up, which can't use CHSI. 45*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %a, double %b, i32 *%ptr) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: chsi 48*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 49*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 50*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 32768 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 ordered comparisons with -1. 56*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %a, double %b, i32 *%ptr) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 58*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), -1 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 60*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 61*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 62*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 63*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, -1 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; Check ordered comparisons with the low end of the 16-bit signed range. 69*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %a, double %b, i32 *%ptr) { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 71*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), -32768 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 73*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 74*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 75*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 76*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, -32768 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 the next value down, which can't use CHSI. 82*9880d681SAndroid Build Coastguard Workerdefine double @f7(double %a, double %b, i32 *%ptr) { 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 84*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: chsi 85*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 86*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 87*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, -32769 88*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 89*9880d681SAndroid Build Coastguard Worker ret double %res 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; Check equality comparisons with 0. 93*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %a, double %b, i32 *%ptr) { 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 95*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 0 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 97*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 98*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 99*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 100*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %val, 0 101*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 102*9880d681SAndroid Build Coastguard Worker ret double %res 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Check equality comparisons with 1. 106*9880d681SAndroid Build Coastguard Workerdefine double @f9(double %a, double %b, i32 *%ptr) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 108*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 1 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 110*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 111*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 112*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 113*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %val, 1 114*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 115*9880d681SAndroid Build Coastguard Worker ret double %res 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; Check equality comparisons with the high end of the signed 16-bit range. 119*9880d681SAndroid Build Coastguard Workerdefine double @f10(double %a, double %b, i32 *%ptr) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 121*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 32767 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 123*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 124*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 125*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 126*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %val, 32767 127*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 128*9880d681SAndroid Build Coastguard Worker ret double %res 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; Check the next value up, which can't use CHSI. 132*9880d681SAndroid Build Coastguard Workerdefine double @f11(double %a, double %b, i32 *%ptr) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 134*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: chsi 135*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 136*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 137*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %val, 32768 138*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 139*9880d681SAndroid Build Coastguard Worker ret double %res 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; Check equality comparisons with -1. 143*9880d681SAndroid Build Coastguard Workerdefine double @f12(double %a, double %b, i32 *%ptr) { 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 145*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), -1 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 147*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 148*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 149*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 150*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %val, -1 151*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 152*9880d681SAndroid Build Coastguard Worker ret double %res 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker; Check equality comparisons with the low end of the 16-bit signed range. 156*9880d681SAndroid Build Coastguard Workerdefine double @f13(double %a, double %b, i32 *%ptr) { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 158*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), -32768 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14 160*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 161*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 162*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 163*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %val, -32768 164*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 165*9880d681SAndroid Build Coastguard Worker ret double %res 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; Check the next value down, which should be treated as a positive value. 169*9880d681SAndroid Build Coastguard Workerdefine double @f14(double %a, double %b, i32 *%ptr) { 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 171*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: chsi 172*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 173*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 174*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %val, -32769 175*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 176*9880d681SAndroid Build Coastguard Worker ret double %res 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; Check the high end of the CHSI range. 180*9880d681SAndroid Build Coastguard Workerdefine double @f15(double %a, double %b, i32 %i1, i32 *%base) { 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 182*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 4092(%r3), 0 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 184*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 185*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 186*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 1023 187*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 188*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 0 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 next word up, which needs separate address logic, 194*9880d681SAndroid Build Coastguard Workerdefine double @f16(double %a, double %b, i32 *%base) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 196*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 197*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 0 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 199*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 200*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 201*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 1024 202*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 203*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 0 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 negative offsets, which also need separate address logic. 209*9880d681SAndroid Build Coastguard Workerdefine double @f17(double %a, double %b, i32 *%base) { 210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 211*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, -4 212*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0(%r2), 0 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 214*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 215*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 216*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i64 -1 217*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 218*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 0 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 that CHSI does not allow indices. 224*9880d681SAndroid Build Coastguard Workerdefine double @f18(double %a, double %b, i64 %base, i64 %index) { 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 226*9880d681SAndroid Build Coastguard Worker; CHECK: agr {{%r2, %r3|%r3, %r2}} 227*9880d681SAndroid Build Coastguard Worker; CHECK: chsi 0({{%r[23]}}), 0 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 229*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 230*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 231*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %index 232*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i32 * 233*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 234*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i32 %val, 0 235*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 236*9880d681SAndroid Build Coastguard Worker ret double %res 237*9880d681SAndroid Build Coastguard Worker} 238