1*9880d681SAndroid Build Coastguard Worker; Test 16-bit unsigned 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 a value near the low end of the unsigned 16-bit range. 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: clhhsi 0(%r2), 1 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %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 ugt i16 %val, 1 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 a value near the high end of the unsigned 16-bit range. 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: clhhsi 0(%r2), 65534 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %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 ult i16 %val, 65534 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 the high end of the CLHHSI range. 32*9880d681SAndroid Build Coastguard Workerdefine double @f3(double %a, double %b, i16 %i1, i16 *%base) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: clhhsi 4094(%r3), 1 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 36*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 37*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 38*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i64 2047 39*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 40*9880d681SAndroid Build Coastguard Worker %cond = icmp ugt i16 %val, 1 41*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 42*9880d681SAndroid Build Coastguard Worker ret double %res 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; Check the next halfword up, which needs separate address logic, 46*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %a, double %b, i16 *%base) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 48*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 49*9880d681SAndroid Build Coastguard Worker; CHECK: clhhsi 0(%r2), 1 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 51*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 52*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 53*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i64 2048 54*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 55*9880d681SAndroid Build Coastguard Worker %cond = icmp ugt i16 %val, 1 56*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 57*9880d681SAndroid Build Coastguard Worker ret double %res 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; Check negative offsets, which also need separate address logic. 61*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %a, double %b, i16 *%base) { 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 63*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, -2 64*9880d681SAndroid Build Coastguard Worker; CHECK: clhhsi 0(%r2), 1 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 66*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 67*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 68*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i64 -1 69*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 70*9880d681SAndroid Build Coastguard Worker %cond = icmp ugt i16 %val, 1 71*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 72*9880d681SAndroid Build Coastguard Worker ret double %res 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; Check that CLHHSI does not allow indices. 76*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %a, double %b, i64 %base, i64 %index) { 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 78*9880d681SAndroid Build Coastguard Worker; CHECK: agr {{%r2, %r3|%r3, %r2}} 79*9880d681SAndroid Build Coastguard Worker; CHECK: clhhsi 0({{%r[23]}}), 1 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14 81*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 82*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 83*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %index 84*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i16 * 85*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr 86*9880d681SAndroid Build Coastguard Worker %cond = icmp ugt i16 %val, 1 87*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %a, double %b 88*9880d681SAndroid Build Coastguard Worker ret double %res 89*9880d681SAndroid Build Coastguard Worker} 90