llvm/test/CodeGen/AArch64/tailcall_misched_graph.ll: s/REQUIRE/REQUIRES/
[oota-llvm.git] / test / CodeGen / SystemZ / vec-cmp-06.ll
1 ; Test f64 and v2f64 comparisons.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
4
5 ; Test oeq.
6 define <2 x i64> @f1(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: vfcedb %v24, %v26, %v28
9 ; CHECK-NEXT: br %r14
10   %cmp = fcmp oeq <2 x double> %val1, %val2
11   %ret = sext <2 x i1> %cmp to <2 x i64>
12   ret <2 x i64> %ret
13 }
14
15 ; Test one.
16 define <2 x i64> @f2(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
17 ; CHECK-LABEL: f2:
18 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v26
19 ; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v26, %v28
20 ; CHECK: vo %v24, [[REG1]], [[REG2]]
21 ; CHECK-NEXT: br %r14
22   %cmp = fcmp one <2 x double> %val1, %val2
23   %ret = sext <2 x i1> %cmp to <2 x i64>
24   ret <2 x i64> %ret
25 }
26
27 ; Test ogt.
28 define <2 x i64> @f3(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
29 ; CHECK-LABEL: f3:
30 ; CHECK: vfchdb %v24, %v26, %v28
31 ; CHECK-NEXT: br %r14
32   %cmp = fcmp ogt <2 x double> %val1, %val2
33   %ret = sext <2 x i1> %cmp to <2 x i64>
34   ret <2 x i64> %ret
35 }
36
37 ; Test oge.
38 define <2 x i64> @f4(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
39 ; CHECK-LABEL: f4:
40 ; CHECK: vfchedb %v24, %v26, %v28
41 ; CHECK-NEXT: br %r14
42   %cmp = fcmp oge <2 x double> %val1, %val2
43   %ret = sext <2 x i1> %cmp to <2 x i64>
44   ret <2 x i64> %ret
45 }
46
47 ; Test ole.
48 define <2 x i64> @f5(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
49 ; CHECK-LABEL: f5:
50 ; CHECK: vfchedb %v24, %v28, %v26
51 ; CHECK-NEXT: br %r14
52   %cmp = fcmp ole <2 x double> %val1, %val2
53   %ret = sext <2 x i1> %cmp to <2 x i64>
54   ret <2 x i64> %ret
55 }
56
57 ; Test olt.
58 define <2 x i64> @f6(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
59 ; CHECK-LABEL: f6:
60 ; CHECK: vfchdb %v24, %v28, %v26
61 ; CHECK-NEXT: br %r14
62   %cmp = fcmp olt <2 x double> %val1, %val2
63   %ret = sext <2 x i1> %cmp to <2 x i64>
64   ret <2 x i64> %ret
65 }
66
67 ; Test ueq.
68 define <2 x i64> @f7(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
69 ; CHECK-LABEL: f7:
70 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v26
71 ; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v26, %v28
72 ; CHECK: vno %v24, [[REG1]], [[REG2]]
73 ; CHECK-NEXT: br %r14
74   %cmp = fcmp ueq <2 x double> %val1, %val2
75   %ret = sext <2 x i1> %cmp to <2 x i64>
76   ret <2 x i64> %ret
77 }
78
79 ; Test une.
80 define <2 x i64> @f8(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
81 ; CHECK-LABEL: f8:
82 ; CHECK: vfcedb [[REG:%v[0-9]+]], %v26, %v28
83 ; CHECK-NEXT: vno %v24, [[REG]], [[REG]]
84 ; CHECK-NEXT: br %r14
85   %cmp = fcmp une <2 x double> %val1, %val2
86   %ret = sext <2 x i1> %cmp to <2 x i64>
87   ret <2 x i64> %ret
88 }
89
90 ; Test ugt.
91 define <2 x i64> @f9(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {
92 ; CHECK-LABEL: f9:
93 ; CHECK: vfchedb [[REG:%v[0-9]+]], %v28, %v26
94 ; CHECK-NEXT: vno %v24, [[REG]], [[REG]]
95 ; CHECK-NEXT: br %r14
96   %cmp = fcmp ugt <2 x double> %val1, %val2
97   %ret = sext <2 x i1> %cmp to <2 x i64>
98   ret <2 x i64> %ret
99 }
100
101 ; Test uge.
102 define <2 x i64> @f10(<2 x i64> %dummy, <2 x double> %val1,
103                       <2 x double> %val2) {
104 ; CHECK-LABEL: f10:
105 ; CHECK: vfchdb [[REG:%v[0-9]+]], %v28, %v26
106 ; CHECK-NEXT: vno %v24, [[REG]], [[REG]]
107 ; CHECK-NEXT: br %r14
108   %cmp = fcmp uge <2 x double> %val1, %val2
109   %ret = sext <2 x i1> %cmp to <2 x i64>
110   ret <2 x i64> %ret
111 }
112
113 ; Test ule.
114 define <2 x i64> @f11(<2 x i64> %dummy, <2 x double> %val1,
115                       <2 x double> %val2) {
116 ; CHECK-LABEL: f11:
117 ; CHECK: vfchdb [[REG:%v[0-9]+]], %v26, %v28
118 ; CHECK-NEXT: vno %v24, [[REG]], [[REG]]
119 ; CHECK-NEXT: br %r14
120   %cmp = fcmp ule <2 x double> %val1, %val2
121   %ret = sext <2 x i1> %cmp to <2 x i64>
122   ret <2 x i64> %ret
123 }
124
125 ; Test ult.
126 define <2 x i64> @f12(<2 x i64> %dummy, <2 x double> %val1,
127                       <2 x double> %val2) {
128 ; CHECK-LABEL: f12:
129 ; CHECK: vfchedb [[REG:%v[0-9]+]], %v26, %v28
130 ; CHECK-NEXT: vno %v24, [[REG]], [[REG]]
131 ; CHECK-NEXT: br %r14
132   %cmp = fcmp ult <2 x double> %val1, %val2
133   %ret = sext <2 x i1> %cmp to <2 x i64>
134   ret <2 x i64> %ret
135 }
136
137 ; Test ord.
138 define <2 x i64> @f13(<2 x i64> %dummy, <2 x double> %val1,
139                       <2 x double> %val2) {
140 ; CHECK-LABEL: f13:
141 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v26
142 ; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v26, %v28
143 ; CHECK: vo %v24, [[REG1]], [[REG2]]
144 ; CHECK-NEXT: br %r14
145   %cmp = fcmp ord <2 x double> %val1, %val2
146   %ret = sext <2 x i1> %cmp to <2 x i64>
147   ret <2 x i64> %ret
148 }
149
150 ; Test uno.
151 define <2 x i64> @f14(<2 x i64> %dummy, <2 x double> %val1,
152                       <2 x double> %val2) {
153 ; CHECK-LABEL: f14:
154 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v26
155 ; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v26, %v28
156 ; CHECK: vno %v24, [[REG1]], [[REG2]]
157 ; CHECK-NEXT: br %r14
158   %cmp = fcmp uno <2 x double> %val1, %val2
159   %ret = sext <2 x i1> %cmp to <2 x i64>
160   ret <2 x i64> %ret
161 }
162
163 ; Test oeq selects.
164 define <2 x double> @f15(<2 x double> %val1, <2 x double> %val2,
165                          <2 x double> %val3, <2 x double> %val4) {
166 ; CHECK-LABEL: f15:
167 ; CHECK: vfcedb [[REG:%v[0-9]+]], %v24, %v26
168 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
169 ; CHECK-NEXT: br %r14
170   %cmp = fcmp oeq <2 x double> %val1, %val2
171   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
172   ret <2 x double> %ret
173 }
174
175 ; Test one selects.
176 define <2 x double> @f16(<2 x double> %val1, <2 x double> %val2,
177                          <2 x double> %val3, <2 x double> %val4) {
178 ; CHECK-LABEL: f16:
179 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24
180 ; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v24, %v26
181 ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]
182 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
183 ; CHECK-NEXT: br %r14
184   %cmp = fcmp one <2 x double> %val1, %val2
185   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
186   ret <2 x double> %ret
187 }
188
189 ; Test ogt selects.
190 define <2 x double> @f17(<2 x double> %val1, <2 x double> %val2,
191                          <2 x double> %val3, <2 x double> %val4) {
192 ; CHECK-LABEL: f17:
193 ; CHECK: vfchdb [[REG:%v[0-9]+]], %v24, %v26
194 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
195 ; CHECK-NEXT: br %r14
196   %cmp = fcmp ogt <2 x double> %val1, %val2
197   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
198   ret <2 x double> %ret
199 }
200
201 ; Test oge selects.
202 define <2 x double> @f18(<2 x double> %val1, <2 x double> %val2,
203                          <2 x double> %val3, <2 x double> %val4) {
204 ; CHECK-LABEL: f18:
205 ; CHECK: vfchedb [[REG:%v[0-9]+]], %v24, %v26
206 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
207 ; CHECK-NEXT: br %r14
208   %cmp = fcmp oge <2 x double> %val1, %val2
209   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
210   ret <2 x double> %ret
211 }
212
213 ; Test ole selects.
214 define <2 x double> @f19(<2 x double> %val1, <2 x double> %val2,
215                          <2 x double> %val3, <2 x double> %val4) {
216 ; CHECK-LABEL: f19:
217 ; CHECK: vfchedb [[REG:%v[0-9]+]], %v26, %v24
218 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
219 ; CHECK-NEXT: br %r14
220   %cmp = fcmp ole <2 x double> %val1, %val2
221   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
222   ret <2 x double> %ret
223 }
224
225 ; Test olt selects.
226 define <2 x double> @f20(<2 x double> %val1, <2 x double> %val2,
227                          <2 x double> %val3, <2 x double> %val4) {
228 ; CHECK-LABEL: f20:
229 ; CHECK: vfchdb [[REG:%v[0-9]+]], %v26, %v24
230 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
231 ; CHECK-NEXT: br %r14
232   %cmp = fcmp olt <2 x double> %val1, %val2
233   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
234   ret <2 x double> %ret
235 }
236
237 ; Test ueq selects.
238 define <2 x double> @f21(<2 x double> %val1, <2 x double> %val2,
239                          <2 x double> %val3, <2 x double> %val4) {
240 ; CHECK-LABEL: f21:
241 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24
242 ; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v24, %v26
243 ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]
244 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
245 ; CHECK-NEXT: br %r14
246   %cmp = fcmp ueq <2 x double> %val1, %val2
247   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
248   ret <2 x double> %ret
249 }
250
251 ; Test une selects.
252 define <2 x double> @f22(<2 x double> %val1, <2 x double> %val2,
253                          <2 x double> %val3, <2 x double> %val4) {
254 ; CHECK-LABEL: f22:
255 ; CHECK: vfcedb [[REG:%v[0-9]+]], %v24, %v26
256 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
257 ; CHECK-NEXT: br %r14
258   %cmp = fcmp une <2 x double> %val1, %val2
259   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
260   ret <2 x double> %ret
261 }
262
263 ; Test ugt selects.
264 define <2 x double> @f23(<2 x double> %val1, <2 x double> %val2,
265                          <2 x double> %val3, <2 x double> %val4) {
266 ; CHECK-LABEL: f23:
267 ; CHECK: vfchedb [[REG:%v[0-9]+]], %v26, %v24
268 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
269 ; CHECK-NEXT: br %r14
270   %cmp = fcmp ugt <2 x double> %val1, %val2
271   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
272   ret <2 x double> %ret
273 }
274
275 ; Test uge selects.
276 define <2 x double> @f24(<2 x double> %val1, <2 x double> %val2,
277                          <2 x double> %val3, <2 x double> %val4) {
278 ; CHECK-LABEL: f24:
279 ; CHECK: vfchdb [[REG:%v[0-9]+]], %v26, %v24
280 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
281 ; CHECK-NEXT: br %r14
282   %cmp = fcmp uge <2 x double> %val1, %val2
283   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
284   ret <2 x double> %ret
285 }
286
287 ; Test ule selects.
288 define <2 x double> @f25(<2 x double> %val1, <2 x double> %val2,
289                          <2 x double> %val3, <2 x double> %val4) {
290 ; CHECK-LABEL: f25:
291 ; CHECK: vfchdb [[REG:%v[0-9]+]], %v24, %v26
292 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
293 ; CHECK-NEXT: br %r14
294   %cmp = fcmp ule <2 x double> %val1, %val2
295   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
296   ret <2 x double> %ret
297 }
298
299 ; Test ult selects.
300 define <2 x double> @f26(<2 x double> %val1, <2 x double> %val2,
301                          <2 x double> %val3, <2 x double> %val4) {
302 ; CHECK-LABEL: f26:
303 ; CHECK: vfchedb [[REG:%v[0-9]+]], %v24, %v26
304 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
305 ; CHECK-NEXT: br %r14
306   %cmp = fcmp ult <2 x double> %val1, %val2
307   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
308   ret <2 x double> %ret
309 }
310
311 ; Test ord selects.
312 define <2 x double> @f27(<2 x double> %val1, <2 x double> %val2,
313                          <2 x double> %val3, <2 x double> %val4) {
314 ; CHECK-LABEL: f27:
315 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24
316 ; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v24, %v26
317 ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]
318 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
319 ; CHECK-NEXT: br %r14
320   %cmp = fcmp ord <2 x double> %val1, %val2
321   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
322   ret <2 x double> %ret
323 }
324
325 ; Test uno selects.
326 define <2 x double> @f28(<2 x double> %val1, <2 x double> %val2,
327                          <2 x double> %val3, <2 x double> %val4) {
328 ; CHECK-LABEL: f28:
329 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24
330 ; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v24, %v26
331 ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]
332 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
333 ; CHECK-NEXT: br %r14
334   %cmp = fcmp uno <2 x double> %val1, %val2
335   %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
336   ret <2 x double> %ret
337 }
338
339 ; Test an f64 comparison that uses vector registers.
340 define i64 @f29(i64 %a, i64 %b, double %f1, <2 x double> %vec) {
341 ; CHECK-LABEL: f29:
342 ; CHECK: wfcdb %f0, %v24
343 ; CHECK-NEXT: locgrne %r2, %r3
344 ; CHECK: br %r14
345   %f2 = extractelement <2 x double> %vec, i32 0
346   %cond = fcmp oeq double %f1, %f2
347   %res = select i1 %cond, i64 %a, i64 %b
348   ret i64 %res
349 }