blob: e68a0fefa0417fab98ced49b2859bc439ad2e0f3 [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Test 64-bit unsigned comparison in which the second operand is a variable.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5; Check CLGR.
6define double @f1(double %a, double %b, i64 %i1, i64 %i2) {
Stephen Lind24ab202013-07-14 06:24:09 +00007; CHECK-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00008; CHECK: clgr %r2, %r3
Richard Sandiford586f4172013-05-21 08:53:17 +00009; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000010; CHECK: ldr %f0, %f2
11; CHECK: br %r14
12 %cond = icmp ult i64 %i1, %i2
13 %res = select i1 %cond, double %a, double %b
14 ret double %res
15}
16
17; Check CLG with no displacement.
18define double @f2(double %a, double %b, i64 %i1, i64 *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +000019; CHECK-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000020; CHECK: clg %r2, 0(%r3)
Richard Sandiford586f4172013-05-21 08:53:17 +000021; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000022; CHECK: ldr %f0, %f2
23; CHECK: br %r14
24 %i2 = load i64 *%ptr
25 %cond = icmp ult i64 %i1, %i2
26 %res = select i1 %cond, double %a, double %b
27 ret double %res
28}
29
30; Check the high end of the aligned CLG range.
31define double @f3(double %a, double %b, i64 %i1, i64 *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000032; CHECK-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000033; CHECK: clg %r2, 524280(%r3)
Richard Sandiford586f4172013-05-21 08:53:17 +000034; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000035; CHECK: ldr %f0, %f2
36; CHECK: br %r14
37 %ptr = getelementptr i64 *%base, i64 65535
38 %i2 = load i64 *%ptr
39 %cond = icmp ult i64 %i1, %i2
40 %res = select i1 %cond, double %a, double %b
41 ret double %res
42}
43
44; Check the next doubleword up, which needs separate address logic.
45; Other sequences besides this one would be OK.
46define double @f4(double %a, double %b, i64 %i1, i64 *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000047; CHECK-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000048; CHECK: agfi %r3, 524288
49; CHECK: clg %r2, 0(%r3)
Richard Sandiford586f4172013-05-21 08:53:17 +000050; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000051; CHECK: ldr %f0, %f2
52; CHECK: br %r14
53 %ptr = getelementptr i64 *%base, i64 65536
54 %i2 = load i64 *%ptr
55 %cond = icmp ult i64 %i1, %i2
56 %res = select i1 %cond, double %a, double %b
57 ret double %res
58}
59
60; Check the high end of the negative aligned CLG range.
61define double @f5(double %a, double %b, i64 %i1, i64 *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000062; CHECK-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000063; CHECK: clg %r2, -8(%r3)
Richard Sandiford586f4172013-05-21 08:53:17 +000064; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000065; CHECK: ldr %f0, %f2
66; CHECK: br %r14
67 %ptr = getelementptr i64 *%base, i64 -1
68 %i2 = load i64 *%ptr
69 %cond = icmp ult i64 %i1, %i2
70 %res = select i1 %cond, double %a, double %b
71 ret double %res
72}
73
74; Check the low end of the CLG range.
75define double @f6(double %a, double %b, i64 %i1, i64 *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000076; CHECK-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000077; CHECK: clg %r2, -524288(%r3)
Richard Sandiford586f4172013-05-21 08:53:17 +000078; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000079; CHECK: ldr %f0, %f2
80; CHECK: br %r14
81 %ptr = getelementptr i64 *%base, i64 -65536
82 %i2 = load i64 *%ptr
83 %cond = icmp ult i64 %i1, %i2
84 %res = select i1 %cond, double %a, double %b
85 ret double %res
86}
87
88; Check the next doubleword down, which needs separate address logic.
89; Other sequences besides this one would be OK.
90define double @f7(double %a, double %b, i64 %i1, i64 *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000091; CHECK-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000092; CHECK: agfi %r3, -524296
93; CHECK: clg %r2, 0(%r3)
Richard Sandiford586f4172013-05-21 08:53:17 +000094; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000095; CHECK: ldr %f0, %f2
96; CHECK: br %r14
97 %ptr = getelementptr i64 *%base, i64 -65537
98 %i2 = load i64 *%ptr
99 %cond = icmp ult i64 %i1, %i2
100 %res = select i1 %cond, double %a, double %b
101 ret double %res
102}
103
104; Check that CLG allows an index.
105define double @f8(double %a, double %b, i64 %i1, i64 %base, i64 %index) {
Stephen Lind24ab202013-07-14 06:24:09 +0000106; CHECK-LABEL: f8:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000107; CHECK: clg %r2, 524280({{%r4,%r3|%r3,%r4}})
Richard Sandiford586f4172013-05-21 08:53:17 +0000108; CHECK-NEXT: jl
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000109; CHECK: ldr %f0, %f2
110; CHECK: br %r14
111 %add1 = add i64 %base, %index
112 %add2 = add i64 %add1, 524280
113 %ptr = inttoptr i64 %add2 to i64 *
114 %i2 = load i64 *%ptr
115 %cond = icmp ult i64 %i1, %i2
116 %res = select i1 %cond, double %a, double %b
117 ret double %res
118}