1*9880d681SAndroid Build Coastguard Worker; Test 16-bit signed ordered 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 comparisons with 0. 6*9880d681SAndroid Build Coastguard Workerdefine double @f1(double %a, double %b, i16 *%ptr) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 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 i16 , i16 *%ptr 13*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %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 comparisons with 1. 19*9880d681SAndroid Build Coastguard Workerdefine double @f2(double %a, double %b, i16 *%ptr) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 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 i16 , i16 *%ptr 26*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %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 a value near the high end of the signed 16-bit range. 32*9880d681SAndroid Build Coastguard Workerdefine double @f3(double %a, double %b, i16 *%ptr) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 0(%r2), 32766 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 i16 , i16 *%ptr 39*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %val, 32766 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 comparisons with -1. 45*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %a, double %b, i16 *%ptr) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 0(%r2), -1 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 49*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 50*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 51*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 52*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %val, -1 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 a value near the low end of the 16-bit signed range. 58*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %a, double %b, i16 *%ptr) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 60*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 0(%r2), -32766 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 %val = load i16 , i16 *%ptr 65*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %val, -32766 66*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 67*9880d681SAndroid Build Coastguard Worker ret double %res 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; Check the high end of the CHHSI range. 71*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %a, double %b, i16 %i1, i16 *%base) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 73*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 4094(%r3), 0 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 75*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 76*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 77*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i64 2047 78*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 79*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %val, 0 80*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 81*9880d681SAndroid Build Coastguard Worker ret double %res 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; Check the next halfword up, which needs separate address logic, 85*9880d681SAndroid Build Coastguard Workerdefine double @f7(double %a, double %b, i16 *%base) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 87*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 88*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 0(%r2), 0 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 90*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 91*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 92*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i64 2048 93*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 94*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %val, 0 95*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 96*9880d681SAndroid Build Coastguard Worker ret double %res 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; Check negative offsets, which also need separate address logic. 100*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %a, double %b, i16 *%base) { 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 102*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, -2 103*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 0(%r2), 0 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 105*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 106*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 107*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i64 -1 108*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 109*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %val, 0 110*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 111*9880d681SAndroid Build Coastguard Worker ret double %res 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; Check that CHHSI does not allow indices. 115*9880d681SAndroid Build Coastguard Workerdefine double @f9(double %a, double %b, i64 %base, i64 %index) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 117*9880d681SAndroid Build Coastguard Worker; CHECK: agr {{%r2, %r3|%r3, %r2}} 118*9880d681SAndroid Build Coastguard Worker; CHECK: chhsi 0({{%r[23]}}), 0 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14 120*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 121*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 122*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %index 123*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i16 * 124*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 125*9880d681SAndroid Build Coastguard Worker %cond = icmp slt i16 %val, 0 126*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 127*9880d681SAndroid Build Coastguard Worker ret double %res 128*9880d681SAndroid Build Coastguard Worker} 129