1 ; Test 16-bit unsigned comparisons between memory and a constant.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 ; Check a value near the low end of the unsigned 16-bit range.
6 define double @f1(double %a, double %b, i16 *%ptr) {
8 ; CHECK: clhhsi 0(%r2), 1
13 %cond = icmp ugt i16 %val, 1
14 %res = select i1 %cond, double %a, double %b
18 ; Check a value near the high end of the unsigned 16-bit range.
19 define double @f2(double %a, double %b, i16 *%ptr) {
21 ; CHECK: clhhsi 0(%r2), 65534
26 %cond = icmp ult i16 %val, 65534
27 %res = select i1 %cond, double %a, double %b
31 ; Check the high end of the CLHHSI range.
32 define double @f3(double %a, double %b, i16 %i1, i16 *%base) {
34 ; CHECK: clhhsi 4094(%r3), 1
38 %ptr = getelementptr i16 *%base, i64 2047
40 %cond = icmp ugt i16 %val, 1
41 %res = select i1 %cond, double %a, double %b
45 ; Check the next halfword up, which needs separate address logic,
46 define double @f4(double %a, double %b, i16 *%base) {
48 ; CHECK: aghi %r2, 4096
49 ; CHECK: clhhsi 0(%r2), 1
53 %ptr = getelementptr i16 *%base, i64 2048
55 %cond = icmp ugt i16 %val, 1
56 %res = select i1 %cond, double %a, double %b
60 ; Check negative offsets, which also need separate address logic.
61 define double @f5(double %a, double %b, i16 *%base) {
64 ; CHECK: clhhsi 0(%r2), 1
68 %ptr = getelementptr i16 *%base, i64 -1
70 %cond = icmp ugt i16 %val, 1
71 %res = select i1 %cond, double %a, double %b
75 ; Check that CLHHSI does not allow indices.
76 define double @f6(double %a, double %b, i64 %base, i64 %index) {
78 ; CHECK: agr {{%r2, %r3|%r3, %r2}}
79 ; CHECK: clhhsi 0({{%r[23]}}), 1
83 %add = add i64 %base, %index
84 %ptr = inttoptr i64 %add to i16 *
86 %cond = icmp ugt i16 %val, 1
87 %res = select i1 %cond, double %a, double %b