Home | History | Annotate | Download | only in SystemZ
      1 ; Test 16-bit unsigned comparisons between memory and a constant.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      4 
      5 ; Check a value near the low end of the unsigned 16-bit range.
      6 define double @f1(double %a, double %b, i16 *%ptr) {
      7 ; CHECK-LABEL: f1:
      8 ; CHECK: clhhsi 0(%r2), 1
      9 ; CHECK-NEXT: jh
     10 ; CHECK: ldr %f0, %f2
     11 ; CHECK: br %r14
     12   %val = load i16 *%ptr
     13   %cond = icmp ugt i16 %val, 1
     14   %res = select i1 %cond, double %a, double %b
     15   ret double %res
     16 }
     17 
     18 ; Check a value near the high end of the unsigned 16-bit range.
     19 define double @f2(double %a, double %b, i16 *%ptr) {
     20 ; CHECK-LABEL: f2:
     21 ; CHECK: clhhsi 0(%r2), 65534
     22 ; CHECK-NEXT: jl
     23 ; CHECK: ldr %f0, %f2
     24 ; CHECK: br %r14
     25   %val = load i16 *%ptr
     26   %cond = icmp ult i16 %val, 65534
     27   %res = select i1 %cond, double %a, double %b
     28   ret double %res
     29 }
     30 
     31 ; Check the high end of the CLHHSI range.
     32 define double @f3(double %a, double %b, i16 %i1, i16 *%base) {
     33 ; CHECK-LABEL: f3:
     34 ; CHECK: clhhsi 4094(%r3), 1
     35 ; CHECK-NEXT: jh
     36 ; CHECK: ldr %f0, %f2
     37 ; CHECK: br %r14
     38   %ptr = getelementptr i16 *%base, i64 2047
     39   %val = load i16 *%ptr
     40   %cond = icmp ugt i16 %val, 1
     41   %res = select i1 %cond, double %a, double %b
     42   ret double %res
     43 }
     44 
     45 ; Check the next halfword up, which needs separate address logic,
     46 define double @f4(double %a, double %b, i16 *%base) {
     47 ; CHECK-LABEL: f4:
     48 ; CHECK: aghi %r2, 4096
     49 ; CHECK: clhhsi 0(%r2), 1
     50 ; CHECK-NEXT: jh
     51 ; CHECK: ldr %f0, %f2
     52 ; CHECK: br %r14
     53   %ptr = getelementptr i16 *%base, i64 2048
     54   %val = load i16 *%ptr
     55   %cond = icmp ugt i16 %val, 1
     56   %res = select i1 %cond, double %a, double %b
     57   ret double %res
     58 }
     59 
     60 ; Check negative offsets, which also need separate address logic.
     61 define double @f5(double %a, double %b, i16 *%base) {
     62 ; CHECK-LABEL: f5:
     63 ; CHECK: aghi %r2, -2
     64 ; CHECK: clhhsi 0(%r2), 1
     65 ; CHECK-NEXT: jh
     66 ; CHECK: ldr %f0, %f2
     67 ; CHECK: br %r14
     68   %ptr = getelementptr i16 *%base, i64 -1
     69   %val = load i16 *%ptr
     70   %cond = icmp ugt i16 %val, 1
     71   %res = select i1 %cond, double %a, double %b
     72   ret double %res
     73 }
     74 
     75 ; Check that CLHHSI does not allow indices.
     76 define double @f6(double %a, double %b, i64 %base, i64 %index) {
     77 ; CHECK-LABEL: f6:
     78 ; CHECK: agr {{%r2, %r3|%r3, %r2}}
     79 ; CHECK: clhhsi 0({{%r[23]}}), 1
     80 ; CHECK-NEXT: jh
     81 ; CHECK: ldr %f0, %f2
     82 ; CHECK: br %r14
     83   %add = add i64 %base, %index
     84   %ptr = inttoptr i64 %add to i16 *
     85   %val = load i16 *%ptr
     86   %cond = icmp ugt i16 %val, 1
     87   %res = select i1 %cond, double %a, double %b
     88   ret double %res
     89 }
     90