[SystemZ] Try to fold shifts into TMxx
[oota-llvm.git] / test / CodeGen / SystemZ / int-cmp-15.ll
1 ; Test 8-bit unsigned comparisons between memory and constants.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 ; Check ordered comparisons near the low end of the unsigned 8-bit range.
6 define double @f1(double %a, double %b, i8 *%ptr) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: cli 0(%r2), 1
9 ; CHECK-NEXT: jh
10 ; CHECK: br %r14
11   %val = load i8 *%ptr
12   %cond = icmp ugt i8 %val, 1
13   %res = select i1 %cond, double %a, double %b
14   ret double %res
15 }
16
17 ; Check ordered comparisons near the high end of the unsigned 8-bit range.
18 define double @f2(double %a, double %b, i8 *%ptr) {
19 ; CHECK-LABEL: f2:
20 ; CHECK: cli 0(%r2), 254
21 ; CHECK-NEXT: jl
22 ; CHECK: br %r14
23   %val = load i8 *%ptr
24   %cond = icmp ult i8 %val, 254
25   %res = select i1 %cond, double %a, double %b
26   ret double %res
27 }
28
29 ; Check tests for negative bytes.
30 define double @f3(double %a, double %b, i8 *%ptr) {
31 ; CHECK-LABEL: f3:
32 ; CHECK: cli 0(%r2), 127
33 ; CHECK-NEXT: jh
34 ; CHECK: br %r14
35   %val = load i8 *%ptr
36   %cond = icmp slt i8 %val, 0
37   %res = select i1 %cond, double %a, double %b
38   ret double %res
39 }
40
41 ; ...and an alternative form.
42 define double @f4(double %a, double %b, i8 *%ptr) {
43 ; CHECK-LABEL: f4:
44 ; CHECK: cli 0(%r2), 127
45 ; CHECK-NEXT: jh
46 ; CHECK: br %r14
47   %val = load i8 *%ptr
48   %cond = icmp sle i8 %val, -1
49   %res = select i1 %cond, double %a, double %b
50   ret double %res
51 }
52
53 ; Check tests for non-negative bytes.
54 define double @f5(double %a, double %b, i8 *%ptr) {
55 ; CHECK-LABEL: f5:
56 ; CHECK: cli 0(%r2), 128
57 ; CHECK-NEXT: jl
58 ; CHECK: br %r14
59   %val = load i8 *%ptr
60   %cond = icmp sge i8 %val, 0
61   %res = select i1 %cond, double %a, double %b
62   ret double %res
63 }
64
65 ; ...and an alternative form.
66 define double @f6(double %a, double %b, i8 *%ptr) {
67 ; CHECK-LABEL: f6:
68 ; CHECK: cli 0(%r2), 128
69 ; CHECK-NEXT: jl
70 ; CHECK: br %r14
71   %val = load i8 *%ptr
72   %cond = icmp sgt i8 %val, -1
73   %res = select i1 %cond, double %a, double %b
74   ret double %res
75 }
76
77 ; Check equality comparisons at the low end of the signed 8-bit range.
78 define double @f7(double %a, double %b, i8 *%ptr) {
79 ; CHECK-LABEL: f7:
80 ; CHECK: cli 0(%r2), 128
81 ; CHECK-NEXT: je
82 ; CHECK: br %r14
83   %val = load i8 *%ptr
84   %cond = icmp eq i8 %val, -128
85   %res = select i1 %cond, double %a, double %b
86   ret double %res
87 }
88
89 ; Check equality comparisons at the low end of the unsigned 8-bit range.
90 define double @f8(double %a, double %b, i8 *%ptr) {
91 ; CHECK-LABEL: f8:
92 ; CHECK: cli 0(%r2), 0
93 ; CHECK-NEXT: je
94 ; CHECK: br %r14
95   %val = load i8 *%ptr
96   %cond = icmp eq i8 %val, 0
97   %res = select i1 %cond, double %a, double %b
98   ret double %res
99 }
100
101 ; Check equality comparisons at the high end of the signed 8-bit range.
102 define double @f9(double %a, double %b, i8 *%ptr) {
103 ; CHECK-LABEL: f9:
104 ; CHECK: cli 0(%r2), 127
105 ; CHECK-NEXT: je
106 ; CHECK: br %r14
107   %val = load i8 *%ptr
108   %cond = icmp eq i8 %val, 127
109   %res = select i1 %cond, double %a, double %b
110   ret double %res
111 }
112
113 ; Check equality comparisons at the high end of the unsigned 8-bit range.
114 define double @f10(double %a, double %b, i8 *%ptr) {
115 ; CHECK-LABEL: f10:
116 ; CHECK: cli 0(%r2), 255
117 ; CHECK-NEXT: je
118 ; CHECK: br %r14
119   %val = load i8 *%ptr
120   %cond = icmp eq i8 %val, 255
121   %res = select i1 %cond, double %a, double %b
122   ret double %res
123 }
124
125 ; Check the high end of the CLI range.
126 define double @f11(double %a, double %b, i8 *%src) {
127 ; CHECK-LABEL: f11:
128 ; CHECK: cli 4095(%r2), 127
129 ; CHECK: br %r14
130   %ptr = getelementptr i8 *%src, i64 4095
131   %val = load i8 *%ptr
132   %cond = icmp ult i8 %val, 127
133   %res = select i1 %cond, double %a, double %b
134   ret double %res
135 }
136
137 ; Check the next byte up, which should use CLIY instead of CLI.
138 define double @f12(double %a, double %b, i8 *%src) {
139 ; CHECK-LABEL: f12:
140 ; CHECK: cliy 4096(%r2), 127
141 ; CHECK: br %r14
142   %ptr = getelementptr i8 *%src, i64 4096
143   %val = load i8 *%ptr
144   %cond = icmp ult i8 %val, 127
145   %res = select i1 %cond, double %a, double %b
146   ret double %res
147 }
148
149 ; Check the high end of the CLIY range.
150 define double @f13(double %a, double %b, i8 *%src) {
151 ; CHECK-LABEL: f13:
152 ; CHECK: cliy 524287(%r2), 127
153 ; CHECK: br %r14
154   %ptr = getelementptr i8 *%src, i64 524287
155   %val = load i8 *%ptr
156   %cond = icmp ult i8 %val, 127
157   %res = select i1 %cond, double %a, double %b
158   ret double %res
159 }
160
161 ; Check the next byte up, which needs separate address logic.
162 ; Other sequences besides this one would be OK.
163 define double @f14(double %a, double %b, i8 *%src) {
164 ; CHECK-LABEL: f14:
165 ; CHECK: agfi %r2, 524288
166 ; CHECK: cli 0(%r2), 127
167 ; CHECK: br %r14
168   %ptr = getelementptr i8 *%src, i64 524288
169   %val = load i8 *%ptr
170   %cond = icmp ult i8 %val, 127
171   %res = select i1 %cond, double %a, double %b
172   ret double %res
173 }
174
175 ; Check the high end of the negative CLIY range.
176 define double @f15(double %a, double %b, i8 *%src) {
177 ; CHECK-LABEL: f15:
178 ; CHECK: cliy -1(%r2), 127
179 ; CHECK: br %r14
180   %ptr = getelementptr i8 *%src, i64 -1
181   %val = load i8 *%ptr
182   %cond = icmp ult i8 %val, 127
183   %res = select i1 %cond, double %a, double %b
184   ret double %res
185 }
186
187 ; Check the low end of the CLIY range.
188 define double @f16(double %a, double %b, i8 *%src) {
189 ; CHECK-LABEL: f16:
190 ; CHECK: cliy -524288(%r2), 127
191 ; CHECK: br %r14
192   %ptr = getelementptr i8 *%src, i64 -524288
193   %val = load i8 *%ptr
194   %cond = icmp ult i8 %val, 127
195   %res = select i1 %cond, double %a, double %b
196   ret double %res
197 }
198
199 ; Check the next byte down, which needs separate address logic.
200 ; Other sequences besides this one would be OK.
201 define double @f17(double %a, double %b, i8 *%src) {
202 ; CHECK-LABEL: f17:
203 ; CHECK: agfi %r2, -524289
204 ; CHECK: cli 0(%r2), 127
205 ; CHECK: br %r14
206   %ptr = getelementptr i8 *%src, i64 -524289
207   %val = load i8 *%ptr
208   %cond = icmp ult i8 %val, 127
209   %res = select i1 %cond, double %a, double %b
210   ret double %res
211 }
212
213 ; Check that CLI does not allow an index
214 define double @f18(double %a, double %b, i64 %base, i64 %index) {
215 ; CHECK-LABEL: f18:
216 ; CHECK: agr %r2, %r3
217 ; CHECK: cli 4095(%r2), 127
218 ; CHECK: br %r14
219   %add1 = add i64 %base, %index
220   %add2 = add i64 %add1, 4095
221   %ptr = inttoptr i64 %add2 to i8 *
222   %val = load i8 *%ptr
223   %cond = icmp ult i8 %val, 127
224   %res = select i1 %cond, double %a, double %b
225   ret double %res
226 }
227
228 ; Check that CLIY does not allow an index
229 define double @f19(double %a, double %b, i64 %base, i64 %index) {
230 ; CHECK-LABEL: f19:
231 ; CHECK: agr %r2, %r3
232 ; CHECK: cliy 4096(%r2), 127
233 ; CHECK: br %r14
234   %add1 = add i64 %base, %index
235   %add2 = add i64 %add1, 4096
236   %ptr = inttoptr i64 %add2 to i8 *
237   %val = load i8 *%ptr
238   %cond = icmp ult i8 %val, 127
239   %res = select i1 %cond, double %a, double %b
240   ret double %res
241 }