xref: /llvm-project/llvm/test/CodeGen/SystemZ/int-cmp-12.ll (revision 2eb027d21f882e03f0658cddbdfee31efbf08663)
19e3577ffSUlrich Weigand; Test 64-bit unsigned comparisons in which the second operand is constant.
29e3577ffSUlrich Weigand;
39e3577ffSUlrich Weigand; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
49e3577ffSUlrich Weigand
593183ee7SRichard Sandiford; Check a value near the low end of the range.  We use signed forms for
693183ee7SRichard Sandiford; comparisons with zero, or things that are equivalent to them.
79e3577ffSUlrich Weiganddefine double @f1(double %a, double %b, i64 %i1) {
8d24ab20eSStephen Lin; CHECK-LABEL: f1:
993183ee7SRichard Sandiford; CHECK: clgijh %r2, 1
109e3577ffSUlrich Weigand; CHECK: ldr %f0, %f2
119e3577ffSUlrich Weigand; CHECK: br %r14
129e3577ffSUlrich Weigand  %cond = icmp ugt i64 %i1, 1
13*2eb027d2SUlrich Weigand  %tmp = select i1 %cond, double %a, double %b
14*2eb027d2SUlrich Weigand  %res = fadd double %tmp, 1.0
159e3577ffSUlrich Weigand  ret double %res
169e3577ffSUlrich Weigand}
179e3577ffSUlrich Weigand
1893183ee7SRichard Sandiford; Check the top of the CLGIJ range.
199e3577ffSUlrich Weiganddefine double @f2(double %a, double %b, i64 %i1) {
20d24ab20eSStephen Lin; CHECK-LABEL: f2:
2193183ee7SRichard Sandiford; CHECK: clgijl %r2, 255
2293183ee7SRichard Sandiford; CHECK: ldr %f0, %f2
2393183ee7SRichard Sandiford; CHECK: br %r14
2493183ee7SRichard Sandiford  %cond = icmp ult i64 %i1, 255
25*2eb027d2SUlrich Weigand  %tmp = select i1 %cond, double %a, double %b
26*2eb027d2SUlrich Weigand  %res = fadd double %tmp, 1.0
2793183ee7SRichard Sandiford  ret double %res
2893183ee7SRichard Sandiford}
2993183ee7SRichard Sandiford
3093183ee7SRichard Sandiford; Check the next value up, which needs a separate comparison.
3193183ee7SRichard Sandiforddefine double @f3(double %a, double %b, i64 %i1) {
3293183ee7SRichard Sandiford; CHECK-LABEL: f3:
3393183ee7SRichard Sandiford; CHECK: clgfi %r2, 256
3493183ee7SRichard Sandiford; CHECK: jl
3593183ee7SRichard Sandiford; CHECK: ldr %f0, %f2
3693183ee7SRichard Sandiford; CHECK: br %r14
3793183ee7SRichard Sandiford  %cond = icmp ult i64 %i1, 256
38*2eb027d2SUlrich Weigand  %tmp = select i1 %cond, double %a, double %b
39*2eb027d2SUlrich Weigand  %res = fadd double %tmp, 1.0
4093183ee7SRichard Sandiford  ret double %res
4193183ee7SRichard Sandiford}
4293183ee7SRichard Sandiford
4393183ee7SRichard Sandiford; Check the high end of the CLGFI range.
4493183ee7SRichard Sandiforddefine double @f4(double %a, double %b, i64 %i1) {
4593183ee7SRichard Sandiford; CHECK-LABEL: f4:
469e3577ffSUlrich Weigand; CHECK: clgfi %r2, 4294967295
47586f4177SRichard Sandiford; CHECK-NEXT: jl
489e3577ffSUlrich Weigand; CHECK: ldr %f0, %f2
499e3577ffSUlrich Weigand; CHECK: br %r14
509e3577ffSUlrich Weigand  %cond = icmp ult i64 %i1, 4294967295
51*2eb027d2SUlrich Weigand  %tmp = select i1 %cond, double %a, double %b
52*2eb027d2SUlrich Weigand  %res = fadd double %tmp, 1.0
539e3577ffSUlrich Weigand  ret double %res
549e3577ffSUlrich Weigand}
559e3577ffSUlrich Weigand
561f6666a4SUlrich Weigand; Check the next value up, which can use a shifted comparison
5793183ee7SRichard Sandiforddefine double @f5(double %a, double %b, i64 %i1) {
5893183ee7SRichard Sandiford; CHECK-LABEL: f5:
591f6666a4SUlrich Weigand; CHECK: srlg [[REG:%r[0-5]]], %r2, 32
601f6666a4SUlrich Weigand; CHECK: cgije [[REG]], 0
619e3577ffSUlrich Weigand; CHECK: ldr %f0, %f2
629e3577ffSUlrich Weigand; CHECK: br %r14
639e3577ffSUlrich Weigand  %cond = icmp ult i64 %i1, 4294967296
64*2eb027d2SUlrich Weigand  %tmp = select i1 %cond, double %a, double %b
65*2eb027d2SUlrich Weigand  %res = fadd double %tmp, 1.0
669e3577ffSUlrich Weigand  ret double %res
679e3577ffSUlrich Weigand}
681f6666a4SUlrich Weigand; Check the next value up, which must use a register comparison.
691f6666a4SUlrich Weiganddefine double @f6(double %a, double %b, i64 %i1) {
701f6666a4SUlrich Weigand; CHECK-LABEL: f6:
711f6666a4SUlrich Weigand; CHECK: clgrjl %r2,
721f6666a4SUlrich Weigand; CHECK: ldr %f0, %f2
731f6666a4SUlrich Weigand; CHECK: br %r14
741f6666a4SUlrich Weigand  %cond = icmp ult i64 %i1, 4294967297
75*2eb027d2SUlrich Weigand  %tmp = select i1 %cond, double %a, double %b
76*2eb027d2SUlrich Weigand  %res = fadd double %tmp, 1.0
771f6666a4SUlrich Weigand  ret double %res
781f6666a4SUlrich Weigand}
79