[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-compare-instructions.ll
blobbd665955eb99d834ac5cc55f69d86f8c13564f82
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon %s -o - | FileCheck %s
3 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon -global-isel -global-isel-abort=2 %s -o - | FileCheck %s --check-prefix=GISEL
5 define <8 x i8> @cmeq8xi8(<8 x i8> %A, <8 x i8> %B) {
6 ; CHECK-LABEL: cmeq8xi8:
7 ; CHECK:       // %bb.0:
8 ; CHECK-NEXT:    cmeq v0.8b, v0.8b, v1.8b
9 ; CHECK-NEXT:    ret
11 ; GISEL-LABEL: cmeq8xi8:
12 ; GISEL:       // %bb.0:
13 ; GISEL-NEXT:    cmeq v0.8b, v0.8b, v1.8b
14 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
15 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
16 ; GISEL-NEXT:    ret
17   %tmp3 = icmp eq <8 x i8> %A, %B;
18   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
19   ret <8 x i8> %tmp4
22 define <16 x i8> @cmeq16xi8(<16 x i8> %A, <16 x i8> %B) {
23 ; CHECK-LABEL: cmeq16xi8:
24 ; CHECK:       // %bb.0:
25 ; CHECK-NEXT:    cmeq v0.16b, v0.16b, v1.16b
26 ; CHECK-NEXT:    ret
28 ; GISEL-LABEL: cmeq16xi8:
29 ; GISEL:       // %bb.0:
30 ; GISEL-NEXT:    cmeq v0.16b, v0.16b, v1.16b
31 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
32 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
33 ; GISEL-NEXT:    ret
34   %tmp3 = icmp eq <16 x i8> %A, %B;
35   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
36   ret <16 x i8> %tmp4
39 define <4 x i16> @cmeq4xi16(<4 x i16> %A, <4 x i16> %B) {
40 ; CHECK-LABEL: cmeq4xi16:
41 ; CHECK:       // %bb.0:
42 ; CHECK-NEXT:    cmeq v0.4h, v0.4h, v1.4h
43 ; CHECK-NEXT:    ret
45 ; GISEL-LABEL: cmeq4xi16:
46 ; GISEL:       // %bb.0:
47 ; GISEL-NEXT:    cmeq v0.4h, v0.4h, v1.4h
48 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
49 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
50 ; GISEL-NEXT:    ret
51   %tmp3 = icmp eq <4 x i16> %A, %B;
52   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
53   ret <4 x i16> %tmp4
56 define <8 x i16> @cmeq8xi16(<8 x i16> %A, <8 x i16> %B) {
57 ; CHECK-LABEL: cmeq8xi16:
58 ; CHECK:       // %bb.0:
59 ; CHECK-NEXT:    cmeq v0.8h, v0.8h, v1.8h
60 ; CHECK-NEXT:    ret
62 ; GISEL-LABEL: cmeq8xi16:
63 ; GISEL:       // %bb.0:
64 ; GISEL-NEXT:    cmeq v0.8h, v0.8h, v1.8h
65 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
66 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
67 ; GISEL-NEXT:    ret
68   %tmp3 = icmp eq <8 x i16> %A, %B;
69   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
70   ret <8 x i16> %tmp4
73 define <2 x i32> @cmeq2xi32(<2 x i32> %A, <2 x i32> %B) {
74 ; CHECK-LABEL: cmeq2xi32:
75 ; CHECK:       // %bb.0:
76 ; CHECK-NEXT:    cmeq v0.2s, v0.2s, v1.2s
77 ; CHECK-NEXT:    ret
79 ; GISEL-LABEL: cmeq2xi32:
80 ; GISEL:       // %bb.0:
81 ; GISEL-NEXT:    cmeq v0.2s, v0.2s, v1.2s
82 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
83 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
84 ; GISEL-NEXT:    ret
85   %tmp3 = icmp eq <2 x i32> %A, %B;
86   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
87   ret <2 x i32> %tmp4
90 define <4 x i32> @cmeq4xi32(<4 x i32> %A, <4 x i32> %B) {
91 ; CHECK-LABEL: cmeq4xi32:
92 ; CHECK:       // %bb.0:
93 ; CHECK-NEXT:    cmeq v0.4s, v0.4s, v1.4s
94 ; CHECK-NEXT:    ret
96 ; GISEL-LABEL: cmeq4xi32:
97 ; GISEL:       // %bb.0:
98 ; GISEL-NEXT:    cmeq v0.4s, v0.4s, v1.4s
99 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
100 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
101 ; GISEL-NEXT:    ret
102   %tmp3 = icmp eq <4 x i32> %A, %B;
103   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
104   ret <4 x i32> %tmp4
107 define <2 x i64> @cmeq2xi64(<2 x i64> %A, <2 x i64> %B) {
108 ; CHECK-LABEL: cmeq2xi64:
109 ; CHECK:       // %bb.0:
110 ; CHECK-NEXT:    cmeq v0.2d, v0.2d, v1.2d
111 ; CHECK-NEXT:    ret
113 ; GISEL-LABEL: cmeq2xi64:
114 ; GISEL:       // %bb.0:
115 ; GISEL-NEXT:    cmeq v0.2d, v0.2d, v1.2d
116 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
117 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
118 ; GISEL-NEXT:    ret
119   %tmp3 = icmp eq <2 x i64> %A, %B;
120   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
121   ret <2 x i64> %tmp4
124 define <8 x i8> @cmne8xi8(<8 x i8> %A, <8 x i8> %B) {
125 ; CHECK-LABEL: cmne8xi8:
126 ; CHECK:       // %bb.0:
127 ; CHECK-NEXT:    cmeq v0.8b, v0.8b, v1.8b
128 ; CHECK-NEXT:    mvn v0.8b, v0.8b
129 ; CHECK-NEXT:    ret
131 ; GISEL-LABEL: cmne8xi8:
132 ; GISEL:       // %bb.0:
133 ; GISEL-NEXT:    cmeq v0.8b, v0.8b, v1.8b
134 ; GISEL-NEXT:    mvn v0.8b, v0.8b
135 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
136 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
137 ; GISEL-NEXT:    ret
138   %tmp3 = icmp ne <8 x i8> %A, %B;
139   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
140   ret <8 x i8> %tmp4
143 define <16 x i8> @cmne16xi8(<16 x i8> %A, <16 x i8> %B) {
144 ; CHECK-LABEL: cmne16xi8:
145 ; CHECK:       // %bb.0:
146 ; CHECK-NEXT:    cmeq v0.16b, v0.16b, v1.16b
147 ; CHECK-NEXT:    mvn v0.16b, v0.16b
148 ; CHECK-NEXT:    ret
150 ; GISEL-LABEL: cmne16xi8:
151 ; GISEL:       // %bb.0:
152 ; GISEL-NEXT:    cmeq v0.16b, v0.16b, v1.16b
153 ; GISEL-NEXT:    mvn v0.16b, v0.16b
154 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
155 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
156 ; GISEL-NEXT:    ret
157   %tmp3 = icmp ne <16 x i8> %A, %B;
158   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
159   ret <16 x i8> %tmp4
162 define <4 x i16> @cmne4xi16(<4 x i16> %A, <4 x i16> %B) {
163 ; CHECK-LABEL: cmne4xi16:
164 ; CHECK:       // %bb.0:
165 ; CHECK-NEXT:    cmeq v0.4h, v0.4h, v1.4h
166 ; CHECK-NEXT:    mvn v0.8b, v0.8b
167 ; CHECK-NEXT:    ret
169 ; GISEL-LABEL: cmne4xi16:
170 ; GISEL:       // %bb.0:
171 ; GISEL-NEXT:    cmeq v0.4h, v0.4h, v1.4h
172 ; GISEL-NEXT:    mvn v0.8b, v0.8b
173 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
174 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
175 ; GISEL-NEXT:    ret
176   %tmp3 = icmp ne <4 x i16> %A, %B;
177   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
178   ret <4 x i16> %tmp4
181 define <8 x i16> @cmne8xi16(<8 x i16> %A, <8 x i16> %B) {
182 ; CHECK-LABEL: cmne8xi16:
183 ; CHECK:       // %bb.0:
184 ; CHECK-NEXT:    cmeq v0.8h, v0.8h, v1.8h
185 ; CHECK-NEXT:    mvn v0.16b, v0.16b
186 ; CHECK-NEXT:    ret
188 ; GISEL-LABEL: cmne8xi16:
189 ; GISEL:       // %bb.0:
190 ; GISEL-NEXT:    cmeq v0.8h, v0.8h, v1.8h
191 ; GISEL-NEXT:    mvn v0.16b, v0.16b
192 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
193 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
194 ; GISEL-NEXT:    ret
195   %tmp3 = icmp ne <8 x i16> %A, %B;
196   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
197   ret <8 x i16> %tmp4
200 define <2 x i32> @cmne2xi32(<2 x i32> %A, <2 x i32> %B) {
201 ; CHECK-LABEL: cmne2xi32:
202 ; CHECK:       // %bb.0:
203 ; CHECK-NEXT:    cmeq v0.2s, v0.2s, v1.2s
204 ; CHECK-NEXT:    mvn v0.8b, v0.8b
205 ; CHECK-NEXT:    ret
207 ; GISEL-LABEL: cmne2xi32:
208 ; GISEL:       // %bb.0:
209 ; GISEL-NEXT:    cmeq v0.2s, v0.2s, v1.2s
210 ; GISEL-NEXT:    mvn v0.8b, v0.8b
211 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
212 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
213 ; GISEL-NEXT:    ret
214   %tmp3 = icmp ne <2 x i32> %A, %B;
215   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
216   ret <2 x i32> %tmp4
219 define <4 x i32> @cmne4xi32(<4 x i32> %A, <4 x i32> %B) {
220 ; CHECK-LABEL: cmne4xi32:
221 ; CHECK:       // %bb.0:
222 ; CHECK-NEXT:    cmeq v0.4s, v0.4s, v1.4s
223 ; CHECK-NEXT:    mvn v0.16b, v0.16b
224 ; CHECK-NEXT:    ret
226 ; GISEL-LABEL: cmne4xi32:
227 ; GISEL:       // %bb.0:
228 ; GISEL-NEXT:    cmeq v0.4s, v0.4s, v1.4s
229 ; GISEL-NEXT:    mvn v0.16b, v0.16b
230 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
231 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
232 ; GISEL-NEXT:    ret
233   %tmp3 = icmp ne <4 x i32> %A, %B;
234   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
235   ret <4 x i32> %tmp4
238 define <2 x i64> @cmne2xi64(<2 x i64> %A, <2 x i64> %B) {
239 ; CHECK-LABEL: cmne2xi64:
240 ; CHECK:       // %bb.0:
241 ; CHECK-NEXT:    cmeq v0.2d, v0.2d, v1.2d
242 ; CHECK-NEXT:    mvn v0.16b, v0.16b
243 ; CHECK-NEXT:    ret
245 ; GISEL-LABEL: cmne2xi64:
246 ; GISEL:       // %bb.0:
247 ; GISEL-NEXT:    cmeq v0.2d, v0.2d, v1.2d
248 ; GISEL-NEXT:    mvn v0.16b, v0.16b
249 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
250 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
251 ; GISEL-NEXT:    ret
252   %tmp3 = icmp ne <2 x i64> %A, %B;
253   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
254   ret <2 x i64> %tmp4
257 define <8 x i8> @cmgt8xi8(<8 x i8> %A, <8 x i8> %B) {
258 ; CHECK-LABEL: cmgt8xi8:
259 ; CHECK:       // %bb.0:
260 ; CHECK-NEXT:    cmgt v0.8b, v0.8b, v1.8b
261 ; CHECK-NEXT:    ret
263 ; GISEL-LABEL: cmgt8xi8:
264 ; GISEL:       // %bb.0:
265 ; GISEL-NEXT:    cmgt v0.8b, v0.8b, v1.8b
266 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
267 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
268 ; GISEL-NEXT:    ret
269   %tmp3 = icmp sgt <8 x i8> %A, %B;
270   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
271   ret <8 x i8> %tmp4
274 define <16 x i8> @cmgt16xi8(<16 x i8> %A, <16 x i8> %B) {
275 ; CHECK-LABEL: cmgt16xi8:
276 ; CHECK:       // %bb.0:
277 ; CHECK-NEXT:    cmgt v0.16b, v0.16b, v1.16b
278 ; CHECK-NEXT:    ret
280 ; GISEL-LABEL: cmgt16xi8:
281 ; GISEL:       // %bb.0:
282 ; GISEL-NEXT:    cmgt v0.16b, v0.16b, v1.16b
283 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
284 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
285 ; GISEL-NEXT:    ret
286   %tmp3 = icmp sgt <16 x i8> %A, %B;
287   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
288   ret <16 x i8> %tmp4
291 define <4 x i16> @cmgt4xi16(<4 x i16> %A, <4 x i16> %B) {
292 ; CHECK-LABEL: cmgt4xi16:
293 ; CHECK:       // %bb.0:
294 ; CHECK-NEXT:    cmgt v0.4h, v0.4h, v1.4h
295 ; CHECK-NEXT:    ret
297 ; GISEL-LABEL: cmgt4xi16:
298 ; GISEL:       // %bb.0:
299 ; GISEL-NEXT:    cmgt v0.4h, v0.4h, v1.4h
300 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
301 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
302 ; GISEL-NEXT:    ret
303   %tmp3 = icmp sgt <4 x i16> %A, %B;
304   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
305   ret <4 x i16> %tmp4
308 define <8 x i16> @cmgt8xi16(<8 x i16> %A, <8 x i16> %B) {
309 ; CHECK-LABEL: cmgt8xi16:
310 ; CHECK:       // %bb.0:
311 ; CHECK-NEXT:    cmgt v0.8h, v0.8h, v1.8h
312 ; CHECK-NEXT:    ret
314 ; GISEL-LABEL: cmgt8xi16:
315 ; GISEL:       // %bb.0:
316 ; GISEL-NEXT:    cmgt v0.8h, v0.8h, v1.8h
317 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
318 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
319 ; GISEL-NEXT:    ret
320   %tmp3 = icmp sgt <8 x i16> %A, %B;
321   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
322   ret <8 x i16> %tmp4
325 define <2 x i32> @cmgt2xi32(<2 x i32> %A, <2 x i32> %B) {
326 ; CHECK-LABEL: cmgt2xi32:
327 ; CHECK:       // %bb.0:
328 ; CHECK-NEXT:    cmgt v0.2s, v0.2s, v1.2s
329 ; CHECK-NEXT:    ret
331 ; GISEL-LABEL: cmgt2xi32:
332 ; GISEL:       // %bb.0:
333 ; GISEL-NEXT:    cmgt v0.2s, v0.2s, v1.2s
334 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
335 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
336 ; GISEL-NEXT:    ret
337   %tmp3 = icmp sgt <2 x i32> %A, %B;
338   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
339   ret <2 x i32> %tmp4
342 define <4 x i32> @cmgt4xi32(<4 x i32> %A, <4 x i32> %B) {
343 ; CHECK-LABEL: cmgt4xi32:
344 ; CHECK:       // %bb.0:
345 ; CHECK-NEXT:    cmgt v0.4s, v0.4s, v1.4s
346 ; CHECK-NEXT:    ret
348 ; GISEL-LABEL: cmgt4xi32:
349 ; GISEL:       // %bb.0:
350 ; GISEL-NEXT:    cmgt v0.4s, v0.4s, v1.4s
351 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
352 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
353 ; GISEL-NEXT:    ret
354   %tmp3 = icmp sgt <4 x i32> %A, %B;
355   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
356   ret <4 x i32> %tmp4
359 define <2 x i64> @cmgt2xi64(<2 x i64> %A, <2 x i64> %B) {
360 ; CHECK-LABEL: cmgt2xi64:
361 ; CHECK:       // %bb.0:
362 ; CHECK-NEXT:    cmgt v0.2d, v0.2d, v1.2d
363 ; CHECK-NEXT:    ret
365 ; GISEL-LABEL: cmgt2xi64:
366 ; GISEL:       // %bb.0:
367 ; GISEL-NEXT:    cmgt v0.2d, v0.2d, v1.2d
368 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
369 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
370 ; GISEL-NEXT:    ret
371   %tmp3 = icmp sgt <2 x i64> %A, %B;
372   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
373   ret <2 x i64> %tmp4
376 ; LT implemented as GT, so check reversed operands.
377 define <8 x i8> @cmlt8xi8(<8 x i8> %A, <8 x i8> %B) {
378 ; CHECK-LABEL: cmlt8xi8:
379 ; CHECK:       // %bb.0:
380 ; CHECK-NEXT:    cmgt v0.8b, v1.8b, v0.8b
381 ; CHECK-NEXT:    ret
383 ; GISEL-LABEL: cmlt8xi8:
384 ; GISEL:       // %bb.0:
385 ; GISEL-NEXT:    cmgt v0.8b, v1.8b, v0.8b
386 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
387 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
388 ; GISEL-NEXT:    ret
389   %tmp3 = icmp slt <8 x i8> %A, %B;
390   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
391   ret <8 x i8> %tmp4
394 ; LT implemented as GT, so check reversed operands.
395 define <16 x i8> @cmlt16xi8(<16 x i8> %A, <16 x i8> %B) {
396 ; CHECK-LABEL: cmlt16xi8:
397 ; CHECK:       // %bb.0:
398 ; CHECK-NEXT:    cmgt v0.16b, v1.16b, v0.16b
399 ; CHECK-NEXT:    ret
401 ; GISEL-LABEL: cmlt16xi8:
402 ; GISEL:       // %bb.0:
403 ; GISEL-NEXT:    cmgt v0.16b, v1.16b, v0.16b
404 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
405 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
406 ; GISEL-NEXT:    ret
407   %tmp3 = icmp slt <16 x i8> %A, %B;
408   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
409   ret <16 x i8> %tmp4
412 ; LT implemented as GT, so check reversed operands.
413 define <4 x i16> @cmlt4xi16(<4 x i16> %A, <4 x i16> %B) {
414 ; CHECK-LABEL: cmlt4xi16:
415 ; CHECK:       // %bb.0:
416 ; CHECK-NEXT:    cmgt v0.4h, v1.4h, v0.4h
417 ; CHECK-NEXT:    ret
419 ; GISEL-LABEL: cmlt4xi16:
420 ; GISEL:       // %bb.0:
421 ; GISEL-NEXT:    cmgt v0.4h, v1.4h, v0.4h
422 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
423 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
424 ; GISEL-NEXT:    ret
425   %tmp3 = icmp slt <4 x i16> %A, %B;
426   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
427   ret <4 x i16> %tmp4
430 ; LT implemented as GT, so check reversed operands.
431 define <8 x i16> @cmlt8xi16(<8 x i16> %A, <8 x i16> %B) {
432 ; CHECK-LABEL: cmlt8xi16:
433 ; CHECK:       // %bb.0:
434 ; CHECK-NEXT:    cmgt v0.8h, v1.8h, v0.8h
435 ; CHECK-NEXT:    ret
437 ; GISEL-LABEL: cmlt8xi16:
438 ; GISEL:       // %bb.0:
439 ; GISEL-NEXT:    cmgt v0.8h, v1.8h, v0.8h
440 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
441 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
442 ; GISEL-NEXT:    ret
443   %tmp3 = icmp slt <8 x i16> %A, %B;
444   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
445   ret <8 x i16> %tmp4
448 ; LT implemented as GT, so check reversed operands.
449 define <2 x i32> @cmlt2xi32(<2 x i32> %A, <2 x i32> %B) {
450 ; CHECK-LABEL: cmlt2xi32:
451 ; CHECK:       // %bb.0:
452 ; CHECK-NEXT:    cmgt v0.2s, v1.2s, v0.2s
453 ; CHECK-NEXT:    ret
455 ; GISEL-LABEL: cmlt2xi32:
456 ; GISEL:       // %bb.0:
457 ; GISEL-NEXT:    cmgt v0.2s, v1.2s, v0.2s
458 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
459 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
460 ; GISEL-NEXT:    ret
461   %tmp3 = icmp slt <2 x i32> %A, %B;
462   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
463   ret <2 x i32> %tmp4
466 ; LT implemented as GT, so check reversed operands.
467 define <4 x i32> @cmlt4xi32(<4 x i32> %A, <4 x i32> %B) {
468 ; CHECK-LABEL: cmlt4xi32:
469 ; CHECK:       // %bb.0:
470 ; CHECK-NEXT:    cmgt v0.4s, v1.4s, v0.4s
471 ; CHECK-NEXT:    ret
473 ; GISEL-LABEL: cmlt4xi32:
474 ; GISEL:       // %bb.0:
475 ; GISEL-NEXT:    cmgt v0.4s, v1.4s, v0.4s
476 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
477 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
478 ; GISEL-NEXT:    ret
479   %tmp3 = icmp slt <4 x i32> %A, %B;
480   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
481   ret <4 x i32> %tmp4
484 ; LT implemented as GT, so check reversed operands.
485 define <2 x i64> @cmlt2xi64(<2 x i64> %A, <2 x i64> %B) {
486 ; CHECK-LABEL: cmlt2xi64:
487 ; CHECK:       // %bb.0:
488 ; CHECK-NEXT:    cmgt v0.2d, v1.2d, v0.2d
489 ; CHECK-NEXT:    ret
491 ; GISEL-LABEL: cmlt2xi64:
492 ; GISEL:       // %bb.0:
493 ; GISEL-NEXT:    cmgt v0.2d, v1.2d, v0.2d
494 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
495 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
496 ; GISEL-NEXT:    ret
497   %tmp3 = icmp slt <2 x i64> %A, %B;
498   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
499   ret <2 x i64> %tmp4
502 define <8 x i8> @cmge8xi8(<8 x i8> %A, <8 x i8> %B) {
503 ; CHECK-LABEL: cmge8xi8:
504 ; CHECK:       // %bb.0:
505 ; CHECK-NEXT:    cmge v0.8b, v0.8b, v1.8b
506 ; CHECK-NEXT:    ret
508 ; GISEL-LABEL: cmge8xi8:
509 ; GISEL:       // %bb.0:
510 ; GISEL-NEXT:    cmge v0.8b, v0.8b, v1.8b
511 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
512 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
513 ; GISEL-NEXT:    ret
514   %tmp3 = icmp sge <8 x i8> %A, %B;
515   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
516   ret <8 x i8> %tmp4
519 define <16 x i8> @cmge16xi8(<16 x i8> %A, <16 x i8> %B) {
520 ; CHECK-LABEL: cmge16xi8:
521 ; CHECK:       // %bb.0:
522 ; CHECK-NEXT:    cmge v0.16b, v0.16b, v1.16b
523 ; CHECK-NEXT:    ret
525 ; GISEL-LABEL: cmge16xi8:
526 ; GISEL:       // %bb.0:
527 ; GISEL-NEXT:    cmge v0.16b, v0.16b, v1.16b
528 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
529 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
530 ; GISEL-NEXT:    ret
531   %tmp3 = icmp sge <16 x i8> %A, %B;
532   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
533   ret <16 x i8> %tmp4
536 define <4 x i16> @cmge4xi16(<4 x i16> %A, <4 x i16> %B) {
537 ; CHECK-LABEL: cmge4xi16:
538 ; CHECK:       // %bb.0:
539 ; CHECK-NEXT:    cmge v0.4h, v0.4h, v1.4h
540 ; CHECK-NEXT:    ret
542 ; GISEL-LABEL: cmge4xi16:
543 ; GISEL:       // %bb.0:
544 ; GISEL-NEXT:    cmge v0.4h, v0.4h, v1.4h
545 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
546 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
547 ; GISEL-NEXT:    ret
548   %tmp3 = icmp sge <4 x i16> %A, %B;
549   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
550   ret <4 x i16> %tmp4
553 define <8 x i16> @cmge8xi16(<8 x i16> %A, <8 x i16> %B) {
554 ; CHECK-LABEL: cmge8xi16:
555 ; CHECK:       // %bb.0:
556 ; CHECK-NEXT:    cmge v0.8h, v0.8h, v1.8h
557 ; CHECK-NEXT:    ret
559 ; GISEL-LABEL: cmge8xi16:
560 ; GISEL:       // %bb.0:
561 ; GISEL-NEXT:    cmge v0.8h, v0.8h, v1.8h
562 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
563 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
564 ; GISEL-NEXT:    ret
565   %tmp3 = icmp sge <8 x i16> %A, %B;
566   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
567   ret <8 x i16> %tmp4
570 define <2 x i32> @cmge2xi32(<2 x i32> %A, <2 x i32> %B) {
571 ; CHECK-LABEL: cmge2xi32:
572 ; CHECK:       // %bb.0:
573 ; CHECK-NEXT:    cmge v0.2s, v0.2s, v1.2s
574 ; CHECK-NEXT:    ret
576 ; GISEL-LABEL: cmge2xi32:
577 ; GISEL:       // %bb.0:
578 ; GISEL-NEXT:    cmge v0.2s, v0.2s, v1.2s
579 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
580 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
581 ; GISEL-NEXT:    ret
582   %tmp3 = icmp sge <2 x i32> %A, %B;
583   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
584   ret <2 x i32> %tmp4
587 define <4 x i32> @cmge4xi32(<4 x i32> %A, <4 x i32> %B) {
588 ; CHECK-LABEL: cmge4xi32:
589 ; CHECK:       // %bb.0:
590 ; CHECK-NEXT:    cmge v0.4s, v0.4s, v1.4s
591 ; CHECK-NEXT:    ret
593 ; GISEL-LABEL: cmge4xi32:
594 ; GISEL:       // %bb.0:
595 ; GISEL-NEXT:    cmge v0.4s, v0.4s, v1.4s
596 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
597 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
598 ; GISEL-NEXT:    ret
599   %tmp3 = icmp sge <4 x i32> %A, %B;
600   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
601   ret <4 x i32> %tmp4
604 define <2 x i64> @cmge2xi64(<2 x i64> %A, <2 x i64> %B) {
605 ; CHECK-LABEL: cmge2xi64:
606 ; CHECK:       // %bb.0:
607 ; CHECK-NEXT:    cmge v0.2d, v0.2d, v1.2d
608 ; CHECK-NEXT:    ret
610 ; GISEL-LABEL: cmge2xi64:
611 ; GISEL:       // %bb.0:
612 ; GISEL-NEXT:    cmge v0.2d, v0.2d, v1.2d
613 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
614 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
615 ; GISEL-NEXT:    ret
616   %tmp3 = icmp sge <2 x i64> %A, %B;
617   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
618   ret <2 x i64> %tmp4
621 ; LE implemented as GE, so check reversed operands.
622 define <8 x i8> @cmle8xi8(<8 x i8> %A, <8 x i8> %B) {
623 ; CHECK-LABEL: cmle8xi8:
624 ; CHECK:       // %bb.0:
625 ; CHECK-NEXT:    cmge v0.8b, v1.8b, v0.8b
626 ; CHECK-NEXT:    ret
628 ; GISEL-LABEL: cmle8xi8:
629 ; GISEL:       // %bb.0:
630 ; GISEL-NEXT:    cmge v0.8b, v1.8b, v0.8b
631 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
632 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
633 ; GISEL-NEXT:    ret
634   %tmp3 = icmp sle <8 x i8> %A, %B;
635   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
636   ret <8 x i8> %tmp4
639 ; LE implemented as GE, so check reversed operands.
640 define <16 x i8> @cmle16xi8(<16 x i8> %A, <16 x i8> %B) {
641 ; CHECK-LABEL: cmle16xi8:
642 ; CHECK:       // %bb.0:
643 ; CHECK-NEXT:    cmge v0.16b, v1.16b, v0.16b
644 ; CHECK-NEXT:    ret
646 ; GISEL-LABEL: cmle16xi8:
647 ; GISEL:       // %bb.0:
648 ; GISEL-NEXT:    cmge v0.16b, v1.16b, v0.16b
649 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
650 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
651 ; GISEL-NEXT:    ret
652   %tmp3 = icmp sle <16 x i8> %A, %B;
653   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
654   ret <16 x i8> %tmp4
657 ; LE implemented as GE, so check reversed operands.
658 define <4 x i16> @cmle4xi16(<4 x i16> %A, <4 x i16> %B) {
659 ; CHECK-LABEL: cmle4xi16:
660 ; CHECK:       // %bb.0:
661 ; CHECK-NEXT:    cmge v0.4h, v1.4h, v0.4h
662 ; CHECK-NEXT:    ret
664 ; GISEL-LABEL: cmle4xi16:
665 ; GISEL:       // %bb.0:
666 ; GISEL-NEXT:    cmge v0.4h, v1.4h, v0.4h
667 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
668 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
669 ; GISEL-NEXT:    ret
670   %tmp3 = icmp sle <4 x i16> %A, %B;
671   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
672   ret <4 x i16> %tmp4
675 ; LE implemented as GE, so check reversed operands.
676 define <8 x i16> @cmle8xi16(<8 x i16> %A, <8 x i16> %B) {
677 ; CHECK-LABEL: cmle8xi16:
678 ; CHECK:       // %bb.0:
679 ; CHECK-NEXT:    cmge v0.8h, v1.8h, v0.8h
680 ; CHECK-NEXT:    ret
682 ; GISEL-LABEL: cmle8xi16:
683 ; GISEL:       // %bb.0:
684 ; GISEL-NEXT:    cmge v0.8h, v1.8h, v0.8h
685 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
686 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
687 ; GISEL-NEXT:    ret
688   %tmp3 = icmp sle <8 x i16> %A, %B;
689   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
690   ret <8 x i16> %tmp4
693 ; LE implemented as GE, so check reversed operands.
694 define <2 x i32> @cmle2xi32(<2 x i32> %A, <2 x i32> %B) {
695 ; CHECK-LABEL: cmle2xi32:
696 ; CHECK:       // %bb.0:
697 ; CHECK-NEXT:    cmge v0.2s, v1.2s, v0.2s
698 ; CHECK-NEXT:    ret
700 ; GISEL-LABEL: cmle2xi32:
701 ; GISEL:       // %bb.0:
702 ; GISEL-NEXT:    cmge v0.2s, v1.2s, v0.2s
703 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
704 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
705 ; GISEL-NEXT:    ret
706   %tmp3 = icmp sle <2 x i32> %A, %B;
707   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
708   ret <2 x i32> %tmp4
711 ; LE implemented as GE, so check reversed operands.
712 define <4 x i32> @cmle4xi32(<4 x i32> %A, <4 x i32> %B) {
713 ; CHECK-LABEL: cmle4xi32:
714 ; CHECK:       // %bb.0:
715 ; CHECK-NEXT:    cmge v0.4s, v1.4s, v0.4s
716 ; CHECK-NEXT:    ret
718 ; GISEL-LABEL: cmle4xi32:
719 ; GISEL:       // %bb.0:
720 ; GISEL-NEXT:    cmge v0.4s, v1.4s, v0.4s
721 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
722 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
723 ; GISEL-NEXT:    ret
724   %tmp3 = icmp sle <4 x i32> %A, %B;
725   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
726   ret <4 x i32> %tmp4
729 ; LE implemented as GE, so check reversed operands.
730 define <2 x i64> @cmle2xi64(<2 x i64> %A, <2 x i64> %B) {
731 ; CHECK-LABEL: cmle2xi64:
732 ; CHECK:       // %bb.0:
733 ; CHECK-NEXT:    cmge v0.2d, v1.2d, v0.2d
734 ; CHECK-NEXT:    ret
736 ; GISEL-LABEL: cmle2xi64:
737 ; GISEL:       // %bb.0:
738 ; GISEL-NEXT:    cmge v0.2d, v1.2d, v0.2d
739 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
740 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
741 ; GISEL-NEXT:    ret
742   %tmp3 = icmp sle <2 x i64> %A, %B;
743   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
744   ret <2 x i64> %tmp4
747 define <8 x i8> @cmhi8xi8(<8 x i8> %A, <8 x i8> %B) {
748 ; CHECK-LABEL: cmhi8xi8:
749 ; CHECK:       // %bb.0:
750 ; CHECK-NEXT:    cmhi v0.8b, v0.8b, v1.8b
751 ; CHECK-NEXT:    ret
753 ; GISEL-LABEL: cmhi8xi8:
754 ; GISEL:       // %bb.0:
755 ; GISEL-NEXT:    cmhi v0.8b, v0.8b, v1.8b
756 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
757 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
758 ; GISEL-NEXT:    ret
759   %tmp3 = icmp ugt <8 x i8> %A, %B;
760   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
761   ret <8 x i8> %tmp4
764 define <16 x i8> @cmhi16xi8(<16 x i8> %A, <16 x i8> %B) {
765 ; CHECK-LABEL: cmhi16xi8:
766 ; CHECK:       // %bb.0:
767 ; CHECK-NEXT:    cmhi v0.16b, v0.16b, v1.16b
768 ; CHECK-NEXT:    ret
770 ; GISEL-LABEL: cmhi16xi8:
771 ; GISEL:       // %bb.0:
772 ; GISEL-NEXT:    cmhi v0.16b, v0.16b, v1.16b
773 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
774 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
775 ; GISEL-NEXT:    ret
776   %tmp3 = icmp ugt <16 x i8> %A, %B;
777   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
778   ret <16 x i8> %tmp4
781 define <4 x i16> @cmhi4xi16(<4 x i16> %A, <4 x i16> %B) {
782 ; CHECK-LABEL: cmhi4xi16:
783 ; CHECK:       // %bb.0:
784 ; CHECK-NEXT:    cmhi v0.4h, v0.4h, v1.4h
785 ; CHECK-NEXT:    ret
787 ; GISEL-LABEL: cmhi4xi16:
788 ; GISEL:       // %bb.0:
789 ; GISEL-NEXT:    cmhi v0.4h, v0.4h, v1.4h
790 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
791 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
792 ; GISEL-NEXT:    ret
793   %tmp3 = icmp ugt <4 x i16> %A, %B;
794   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
795   ret <4 x i16> %tmp4
798 define <8 x i16> @cmhi8xi16(<8 x i16> %A, <8 x i16> %B) {
799 ; CHECK-LABEL: cmhi8xi16:
800 ; CHECK:       // %bb.0:
801 ; CHECK-NEXT:    cmhi v0.8h, v0.8h, v1.8h
802 ; CHECK-NEXT:    ret
804 ; GISEL-LABEL: cmhi8xi16:
805 ; GISEL:       // %bb.0:
806 ; GISEL-NEXT:    cmhi v0.8h, v0.8h, v1.8h
807 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
808 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
809 ; GISEL-NEXT:    ret
810   %tmp3 = icmp ugt <8 x i16> %A, %B;
811   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
812   ret <8 x i16> %tmp4
815 define <2 x i32> @cmhi2xi32(<2 x i32> %A, <2 x i32> %B) {
816 ; CHECK-LABEL: cmhi2xi32:
817 ; CHECK:       // %bb.0:
818 ; CHECK-NEXT:    cmhi v0.2s, v0.2s, v1.2s
819 ; CHECK-NEXT:    ret
821 ; GISEL-LABEL: cmhi2xi32:
822 ; GISEL:       // %bb.0:
823 ; GISEL-NEXT:    cmhi v0.2s, v0.2s, v1.2s
824 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
825 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
826 ; GISEL-NEXT:    ret
827   %tmp3 = icmp ugt <2 x i32> %A, %B;
828   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
829   ret <2 x i32> %tmp4
832 define <4 x i32> @cmhi4xi32(<4 x i32> %A, <4 x i32> %B) {
833 ; CHECK-LABEL: cmhi4xi32:
834 ; CHECK:       // %bb.0:
835 ; CHECK-NEXT:    cmhi v0.4s, v0.4s, v1.4s
836 ; CHECK-NEXT:    ret
838 ; GISEL-LABEL: cmhi4xi32:
839 ; GISEL:       // %bb.0:
840 ; GISEL-NEXT:    cmhi v0.4s, v0.4s, v1.4s
841 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
842 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
843 ; GISEL-NEXT:    ret
844   %tmp3 = icmp ugt <4 x i32> %A, %B;
845   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
846   ret <4 x i32> %tmp4
849 define <2 x i64> @cmhi2xi64(<2 x i64> %A, <2 x i64> %B) {
850 ; CHECK-LABEL: cmhi2xi64:
851 ; CHECK:       // %bb.0:
852 ; CHECK-NEXT:    cmhi v0.2d, v0.2d, v1.2d
853 ; CHECK-NEXT:    ret
855 ; GISEL-LABEL: cmhi2xi64:
856 ; GISEL:       // %bb.0:
857 ; GISEL-NEXT:    cmhi v0.2d, v0.2d, v1.2d
858 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
859 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
860 ; GISEL-NEXT:    ret
861   %tmp3 = icmp ugt <2 x i64> %A, %B;
862   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
863   ret <2 x i64> %tmp4
866 ; LO implemented as HI, so check reversed operands.
867 define <8 x i8> @cmlo8xi8(<8 x i8> %A, <8 x i8> %B) {
868 ; CHECK-LABEL: cmlo8xi8:
869 ; CHECK:       // %bb.0:
870 ; CHECK-NEXT:    cmhi v0.8b, v1.8b, v0.8b
871 ; CHECK-NEXT:    ret
873 ; GISEL-LABEL: cmlo8xi8:
874 ; GISEL:       // %bb.0:
875 ; GISEL-NEXT:    cmhi v0.8b, v1.8b, v0.8b
876 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
877 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
878 ; GISEL-NEXT:    ret
879   %tmp3 = icmp ult <8 x i8> %A, %B;
880   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
881   ret <8 x i8> %tmp4
884 ; LO implemented as HI, so check reversed operands.
885 define <16 x i8> @cmlo16xi8(<16 x i8> %A, <16 x i8> %B) {
886 ; CHECK-LABEL: cmlo16xi8:
887 ; CHECK:       // %bb.0:
888 ; CHECK-NEXT:    cmhi v0.16b, v1.16b, v0.16b
889 ; CHECK-NEXT:    ret
891 ; GISEL-LABEL: cmlo16xi8:
892 ; GISEL:       // %bb.0:
893 ; GISEL-NEXT:    cmhi v0.16b, v1.16b, v0.16b
894 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
895 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
896 ; GISEL-NEXT:    ret
897   %tmp3 = icmp ult <16 x i8> %A, %B;
898   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
899   ret <16 x i8> %tmp4
902 ; LO implemented as HI, so check reversed operands.
903 define <4 x i16> @cmlo4xi16(<4 x i16> %A, <4 x i16> %B) {
904 ; CHECK-LABEL: cmlo4xi16:
905 ; CHECK:       // %bb.0:
906 ; CHECK-NEXT:    cmhi v0.4h, v1.4h, v0.4h
907 ; CHECK-NEXT:    ret
909 ; GISEL-LABEL: cmlo4xi16:
910 ; GISEL:       // %bb.0:
911 ; GISEL-NEXT:    cmhi v0.4h, v1.4h, v0.4h
912 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
913 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
914 ; GISEL-NEXT:    ret
915   %tmp3 = icmp ult <4 x i16> %A, %B;
916   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
917   ret <4 x i16> %tmp4
920 ; LO implemented as HI, so check reversed operands.
921 define <8 x i16> @cmlo8xi16(<8 x i16> %A, <8 x i16> %B) {
922 ; CHECK-LABEL: cmlo8xi16:
923 ; CHECK:       // %bb.0:
924 ; CHECK-NEXT:    cmhi v0.8h, v1.8h, v0.8h
925 ; CHECK-NEXT:    ret
927 ; GISEL-LABEL: cmlo8xi16:
928 ; GISEL:       // %bb.0:
929 ; GISEL-NEXT:    cmhi v0.8h, v1.8h, v0.8h
930 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
931 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
932 ; GISEL-NEXT:    ret
933   %tmp3 = icmp ult <8 x i16> %A, %B;
934   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
935   ret <8 x i16> %tmp4
938 ; LO implemented as HI, so check reversed operands.
939 define <2 x i32> @cmlo2xi32(<2 x i32> %A, <2 x i32> %B) {
940 ; CHECK-LABEL: cmlo2xi32:
941 ; CHECK:       // %bb.0:
942 ; CHECK-NEXT:    cmhi v0.2s, v1.2s, v0.2s
943 ; CHECK-NEXT:    ret
945 ; GISEL-LABEL: cmlo2xi32:
946 ; GISEL:       // %bb.0:
947 ; GISEL-NEXT:    cmhi v0.2s, v1.2s, v0.2s
948 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
949 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
950 ; GISEL-NEXT:    ret
951   %tmp3 = icmp ult <2 x i32> %A, %B;
952   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
953   ret <2 x i32> %tmp4
956 ; LO implemented as HI, so check reversed operands.
957 define <4 x i32> @cmlo4xi32(<4 x i32> %A, <4 x i32> %B) {
958 ; CHECK-LABEL: cmlo4xi32:
959 ; CHECK:       // %bb.0:
960 ; CHECK-NEXT:    cmhi v0.4s, v1.4s, v0.4s
961 ; CHECK-NEXT:    ret
963 ; GISEL-LABEL: cmlo4xi32:
964 ; GISEL:       // %bb.0:
965 ; GISEL-NEXT:    cmhi v0.4s, v1.4s, v0.4s
966 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
967 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
968 ; GISEL-NEXT:    ret
969   %tmp3 = icmp ult <4 x i32> %A, %B;
970   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
971   ret <4 x i32> %tmp4
974 ; LO implemented as HI, so check reversed operands.
975 define <2 x i64> @cmlo2xi64(<2 x i64> %A, <2 x i64> %B) {
976 ; CHECK-LABEL: cmlo2xi64:
977 ; CHECK:       // %bb.0:
978 ; CHECK-NEXT:    cmhi v0.2d, v1.2d, v0.2d
979 ; CHECK-NEXT:    ret
981 ; GISEL-LABEL: cmlo2xi64:
982 ; GISEL:       // %bb.0:
983 ; GISEL-NEXT:    cmhi v0.2d, v1.2d, v0.2d
984 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
985 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
986 ; GISEL-NEXT:    ret
987   %tmp3 = icmp ult <2 x i64> %A, %B;
988   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
989   ret <2 x i64> %tmp4
992 define <8 x i8> @cmhs8xi8(<8 x i8> %A, <8 x i8> %B) {
993 ; CHECK-LABEL: cmhs8xi8:
994 ; CHECK:       // %bb.0:
995 ; CHECK-NEXT:    cmhs v0.8b, v0.8b, v1.8b
996 ; CHECK-NEXT:    ret
998 ; GISEL-LABEL: cmhs8xi8:
999 ; GISEL:       // %bb.0:
1000 ; GISEL-NEXT:    cmhs v0.8b, v0.8b, v1.8b
1001 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
1002 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1003 ; GISEL-NEXT:    ret
1004   %tmp3 = icmp uge <8 x i8> %A, %B;
1005   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1006   ret <8 x i8> %tmp4
1009 define <16 x i8> @cmhs16xi8(<16 x i8> %A, <16 x i8> %B) {
1010 ; CHECK-LABEL: cmhs16xi8:
1011 ; CHECK:       // %bb.0:
1012 ; CHECK-NEXT:    cmhs v0.16b, v0.16b, v1.16b
1013 ; CHECK-NEXT:    ret
1015 ; GISEL-LABEL: cmhs16xi8:
1016 ; GISEL:       // %bb.0:
1017 ; GISEL-NEXT:    cmhs v0.16b, v0.16b, v1.16b
1018 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
1019 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1020 ; GISEL-NEXT:    ret
1021   %tmp3 = icmp uge <16 x i8> %A, %B;
1022   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1023   ret <16 x i8> %tmp4
1026 define <4 x i16> @cmhs4xi16(<4 x i16> %A, <4 x i16> %B) {
1027 ; CHECK-LABEL: cmhs4xi16:
1028 ; CHECK:       // %bb.0:
1029 ; CHECK-NEXT:    cmhs v0.4h, v0.4h, v1.4h
1030 ; CHECK-NEXT:    ret
1032 ; GISEL-LABEL: cmhs4xi16:
1033 ; GISEL:       // %bb.0:
1034 ; GISEL-NEXT:    cmhs v0.4h, v0.4h, v1.4h
1035 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
1036 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1037 ; GISEL-NEXT:    ret
1038   %tmp3 = icmp uge <4 x i16> %A, %B;
1039   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1040   ret <4 x i16> %tmp4
1043 define <8 x i16> @cmhs8xi16(<8 x i16> %A, <8 x i16> %B) {
1044 ; CHECK-LABEL: cmhs8xi16:
1045 ; CHECK:       // %bb.0:
1046 ; CHECK-NEXT:    cmhs v0.8h, v0.8h, v1.8h
1047 ; CHECK-NEXT:    ret
1049 ; GISEL-LABEL: cmhs8xi16:
1050 ; GISEL:       // %bb.0:
1051 ; GISEL-NEXT:    cmhs v0.8h, v0.8h, v1.8h
1052 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
1053 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1054 ; GISEL-NEXT:    ret
1055   %tmp3 = icmp uge <8 x i16> %A, %B;
1056   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1057   ret <8 x i16> %tmp4
1060 define <2 x i32> @cmhs2xi32(<2 x i32> %A, <2 x i32> %B) {
1061 ; CHECK-LABEL: cmhs2xi32:
1062 ; CHECK:       // %bb.0:
1063 ; CHECK-NEXT:    cmhs v0.2s, v0.2s, v1.2s
1064 ; CHECK-NEXT:    ret
1066 ; GISEL-LABEL: cmhs2xi32:
1067 ; GISEL:       // %bb.0:
1068 ; GISEL-NEXT:    cmhs v0.2s, v0.2s, v1.2s
1069 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
1070 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1071 ; GISEL-NEXT:    ret
1072   %tmp3 = icmp uge <2 x i32> %A, %B;
1073   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1074   ret <2 x i32> %tmp4
1077 define <4 x i32> @cmhs4xi32(<4 x i32> %A, <4 x i32> %B) {
1078 ; CHECK-LABEL: cmhs4xi32:
1079 ; CHECK:       // %bb.0:
1080 ; CHECK-NEXT:    cmhs v0.4s, v0.4s, v1.4s
1081 ; CHECK-NEXT:    ret
1083 ; GISEL-LABEL: cmhs4xi32:
1084 ; GISEL:       // %bb.0:
1085 ; GISEL-NEXT:    cmhs v0.4s, v0.4s, v1.4s
1086 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
1087 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1088 ; GISEL-NEXT:    ret
1089   %tmp3 = icmp uge <4 x i32> %A, %B;
1090   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1091   ret <4 x i32> %tmp4
1094 define <2 x i64> @cmhs2xi64(<2 x i64> %A, <2 x i64> %B) {
1095 ; CHECK-LABEL: cmhs2xi64:
1096 ; CHECK:       // %bb.0:
1097 ; CHECK-NEXT:    cmhs v0.2d, v0.2d, v1.2d
1098 ; CHECK-NEXT:    ret
1100 ; GISEL-LABEL: cmhs2xi64:
1101 ; GISEL:       // %bb.0:
1102 ; GISEL-NEXT:    cmhs v0.2d, v0.2d, v1.2d
1103 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
1104 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1105 ; GISEL-NEXT:    ret
1106   %tmp3 = icmp uge <2 x i64> %A, %B;
1107   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1108   ret <2 x i64> %tmp4
1111 ; LS implemented as HS, so check reversed operands.
1112 define <8 x i8> @cmls8xi8(<8 x i8> %A, <8 x i8> %B) {
1113 ; CHECK-LABEL: cmls8xi8:
1114 ; CHECK:       // %bb.0:
1115 ; CHECK-NEXT:    cmhs v0.8b, v1.8b, v0.8b
1116 ; CHECK-NEXT:    ret
1118 ; GISEL-LABEL: cmls8xi8:
1119 ; GISEL:       // %bb.0:
1120 ; GISEL-NEXT:    cmhs v0.8b, v1.8b, v0.8b
1121 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
1122 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1123 ; GISEL-NEXT:    ret
1124   %tmp3 = icmp ule <8 x i8> %A, %B;
1125   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1126   ret <8 x i8> %tmp4
1129 ; LS implemented as HS, so check reversed operands.
1130 define <16 x i8> @cmls16xi8(<16 x i8> %A, <16 x i8> %B) {
1131 ; CHECK-LABEL: cmls16xi8:
1132 ; CHECK:       // %bb.0:
1133 ; CHECK-NEXT:    cmhs v0.16b, v1.16b, v0.16b
1134 ; CHECK-NEXT:    ret
1136 ; GISEL-LABEL: cmls16xi8:
1137 ; GISEL:       // %bb.0:
1138 ; GISEL-NEXT:    cmhs v0.16b, v1.16b, v0.16b
1139 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
1140 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1141 ; GISEL-NEXT:    ret
1142   %tmp3 = icmp ule <16 x i8> %A, %B;
1143   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1144   ret <16 x i8> %tmp4
1147 ; LS implemented as HS, so check reversed operands.
1148 define <4 x i16> @cmls4xi16(<4 x i16> %A, <4 x i16> %B) {
1149 ; CHECK-LABEL: cmls4xi16:
1150 ; CHECK:       // %bb.0:
1151 ; CHECK-NEXT:    cmhs v0.4h, v1.4h, v0.4h
1152 ; CHECK-NEXT:    ret
1154 ; GISEL-LABEL: cmls4xi16:
1155 ; GISEL:       // %bb.0:
1156 ; GISEL-NEXT:    cmhs v0.4h, v1.4h, v0.4h
1157 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
1158 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1159 ; GISEL-NEXT:    ret
1160   %tmp3 = icmp ule <4 x i16> %A, %B;
1161   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1162   ret <4 x i16> %tmp4
1165 ; LS implemented as HS, so check reversed operands.
1166 define <8 x i16> @cmls8xi16(<8 x i16> %A, <8 x i16> %B) {
1167 ; CHECK-LABEL: cmls8xi16:
1168 ; CHECK:       // %bb.0:
1169 ; CHECK-NEXT:    cmhs v0.8h, v1.8h, v0.8h
1170 ; CHECK-NEXT:    ret
1172 ; GISEL-LABEL: cmls8xi16:
1173 ; GISEL:       // %bb.0:
1174 ; GISEL-NEXT:    cmhs v0.8h, v1.8h, v0.8h
1175 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
1176 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1177 ; GISEL-NEXT:    ret
1178   %tmp3 = icmp ule <8 x i16> %A, %B;
1179   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1180   ret <8 x i16> %tmp4
1183 ; LS implemented as HS, so check reversed operands.
1184 define <2 x i32> @cmls2xi32(<2 x i32> %A, <2 x i32> %B) {
1185 ; CHECK-LABEL: cmls2xi32:
1186 ; CHECK:       // %bb.0:
1187 ; CHECK-NEXT:    cmhs v0.2s, v1.2s, v0.2s
1188 ; CHECK-NEXT:    ret
1190 ; GISEL-LABEL: cmls2xi32:
1191 ; GISEL:       // %bb.0:
1192 ; GISEL-NEXT:    cmhs v0.2s, v1.2s, v0.2s
1193 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
1194 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1195 ; GISEL-NEXT:    ret
1196   %tmp3 = icmp ule <2 x i32> %A, %B;
1197   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1198   ret <2 x i32> %tmp4
1201 ; LS implemented as HS, so check reversed operands.
1202 define <4 x i32> @cmls4xi32(<4 x i32> %A, <4 x i32> %B) {
1203 ; CHECK-LABEL: cmls4xi32:
1204 ; CHECK:       // %bb.0:
1205 ; CHECK-NEXT:    cmhs v0.4s, v1.4s, v0.4s
1206 ; CHECK-NEXT:    ret
1208 ; GISEL-LABEL: cmls4xi32:
1209 ; GISEL:       // %bb.0:
1210 ; GISEL-NEXT:    cmhs v0.4s, v1.4s, v0.4s
1211 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
1212 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1213 ; GISEL-NEXT:    ret
1214   %tmp3 = icmp ule <4 x i32> %A, %B;
1215   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1216   ret <4 x i32> %tmp4
1219 ; LS implemented as HS, so check reversed operands.
1220 define <2 x i64> @cmls2xi64(<2 x i64> %A, <2 x i64> %B) {
1221 ; CHECK-LABEL: cmls2xi64:
1222 ; CHECK:       // %bb.0:
1223 ; CHECK-NEXT:    cmhs v0.2d, v1.2d, v0.2d
1224 ; CHECK-NEXT:    ret
1226 ; GISEL-LABEL: cmls2xi64:
1227 ; GISEL:       // %bb.0:
1228 ; GISEL-NEXT:    cmhs v0.2d, v1.2d, v0.2d
1229 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
1230 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1231 ; GISEL-NEXT:    ret
1232   %tmp3 = icmp ule <2 x i64> %A, %B;
1233   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1234   ret <2 x i64> %tmp4
1237 define <8 x i8> @cmtst8xi8(<8 x i8> %A, <8 x i8> %B) {
1238 ; CHECK-LABEL: cmtst8xi8:
1239 ; CHECK:       // %bb.0:
1240 ; CHECK-NEXT:    cmtst v0.8b, v0.8b, v1.8b
1241 ; CHECK-NEXT:    ret
1243 ; GISEL-LABEL: cmtst8xi8:
1244 ; GISEL:       // %bb.0:
1245 ; GISEL-NEXT:    movi v2.2d, #0000000000000000
1246 ; GISEL-NEXT:    and v0.8b, v0.8b, v1.8b
1247 ; GISEL-NEXT:    cmeq v0.8b, v0.8b, v2.8b
1248 ; GISEL-NEXT:    mvn v0.8b, v0.8b
1249 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
1250 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1251 ; GISEL-NEXT:    ret
1252   %tmp3 = and <8 x i8> %A, %B
1253   %tmp4 = icmp ne <8 x i8> %tmp3, zeroinitializer
1254   %tmp5 = sext <8 x i1> %tmp4 to <8 x i8>
1255   ret <8 x i8> %tmp5
1258 define <16 x i8> @cmtst16xi8(<16 x i8> %A, <16 x i8> %B) {
1259 ; CHECK-LABEL: cmtst16xi8:
1260 ; CHECK:       // %bb.0:
1261 ; CHECK-NEXT:    cmtst v0.16b, v0.16b, v1.16b
1262 ; CHECK-NEXT:    ret
1264 ; GISEL-LABEL: cmtst16xi8:
1265 ; GISEL:       // %bb.0:
1266 ; GISEL-NEXT:    movi v2.2d, #0000000000000000
1267 ; GISEL-NEXT:    and v0.16b, v0.16b, v1.16b
1268 ; GISEL-NEXT:    cmeq v0.16b, v0.16b, v2.16b
1269 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1270 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
1271 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1272 ; GISEL-NEXT:    ret
1273   %tmp3 = and <16 x i8> %A, %B
1274   %tmp4 = icmp ne <16 x i8> %tmp3, zeroinitializer
1275   %tmp5 = sext <16 x i1> %tmp4 to <16 x i8>
1276   ret <16 x i8> %tmp5
1279 define <4 x i16> @cmtst4xi16(<4 x i16> %A, <4 x i16> %B) {
1280 ; CHECK-LABEL: cmtst4xi16:
1281 ; CHECK:       // %bb.0:
1282 ; CHECK-NEXT:    cmtst v0.4h, v0.4h, v1.4h
1283 ; CHECK-NEXT:    ret
1285 ; GISEL-LABEL: cmtst4xi16:
1286 ; GISEL:       // %bb.0:
1287 ; GISEL-NEXT:    movi v2.2d, #0000000000000000
1288 ; GISEL-NEXT:    and v0.8b, v0.8b, v1.8b
1289 ; GISEL-NEXT:    cmeq v0.4h, v0.4h, v2.4h
1290 ; GISEL-NEXT:    mvn v0.8b, v0.8b
1291 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
1292 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1293 ; GISEL-NEXT:    ret
1294   %tmp3 = and <4 x i16> %A, %B
1295   %tmp4 = icmp ne <4 x i16> %tmp3, zeroinitializer
1296   %tmp5 = sext <4 x i1> %tmp4 to <4 x i16>
1297   ret <4 x i16> %tmp5
1300 define <8 x i16> @cmtst8xi16(<8 x i16> %A, <8 x i16> %B) {
1301 ; CHECK-LABEL: cmtst8xi16:
1302 ; CHECK:       // %bb.0:
1303 ; CHECK-NEXT:    cmtst v0.8h, v0.8h, v1.8h
1304 ; CHECK-NEXT:    ret
1306 ; GISEL-LABEL: cmtst8xi16:
1307 ; GISEL:       // %bb.0:
1308 ; GISEL-NEXT:    movi v2.2d, #0000000000000000
1309 ; GISEL-NEXT:    and v0.16b, v0.16b, v1.16b
1310 ; GISEL-NEXT:    cmeq v0.8h, v0.8h, v2.8h
1311 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1312 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
1313 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1314 ; GISEL-NEXT:    ret
1315   %tmp3 = and <8 x i16> %A, %B
1316   %tmp4 = icmp ne <8 x i16> %tmp3, zeroinitializer
1317   %tmp5 = sext <8 x i1> %tmp4 to <8 x i16>
1318   ret <8 x i16> %tmp5
1321 define <2 x i32> @cmtst2xi32(<2 x i32> %A, <2 x i32> %B) {
1322 ; CHECK-LABEL: cmtst2xi32:
1323 ; CHECK:       // %bb.0:
1324 ; CHECK-NEXT:    cmtst v0.2s, v0.2s, v1.2s
1325 ; CHECK-NEXT:    ret
1327 ; GISEL-LABEL: cmtst2xi32:
1328 ; GISEL:       // %bb.0:
1329 ; GISEL-NEXT:    movi v2.2d, #0000000000000000
1330 ; GISEL-NEXT:    and v0.8b, v0.8b, v1.8b
1331 ; GISEL-NEXT:    cmeq v0.2s, v0.2s, v2.2s
1332 ; GISEL-NEXT:    mvn v0.8b, v0.8b
1333 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
1334 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1335 ; GISEL-NEXT:    ret
1336   %tmp3 = and <2 x i32> %A, %B
1337   %tmp4 = icmp ne <2 x i32> %tmp3, zeroinitializer
1338   %tmp5 = sext <2 x i1> %tmp4 to <2 x i32>
1339   ret <2 x i32> %tmp5
1342 define <4 x i32> @cmtst4xi32(<4 x i32> %A, <4 x i32> %B) {
1343 ; CHECK-LABEL: cmtst4xi32:
1344 ; CHECK:       // %bb.0:
1345 ; CHECK-NEXT:    cmtst v0.4s, v0.4s, v1.4s
1346 ; CHECK-NEXT:    ret
1348 ; GISEL-LABEL: cmtst4xi32:
1349 ; GISEL:       // %bb.0:
1350 ; GISEL-NEXT:    movi v2.2d, #0000000000000000
1351 ; GISEL-NEXT:    and v0.16b, v0.16b, v1.16b
1352 ; GISEL-NEXT:    cmeq v0.4s, v0.4s, v2.4s
1353 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1354 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
1355 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1356 ; GISEL-NEXT:    ret
1357   %tmp3 = and <4 x i32> %A, %B
1358   %tmp4 = icmp ne <4 x i32> %tmp3, zeroinitializer
1359   %tmp5 = sext <4 x i1> %tmp4 to <4 x i32>
1360   ret <4 x i32> %tmp5
1363 define <2 x i64> @cmtst2xi64(<2 x i64> %A, <2 x i64> %B) {
1364 ; CHECK-LABEL: cmtst2xi64:
1365 ; CHECK:       // %bb.0:
1366 ; CHECK-NEXT:    cmtst v0.2d, v0.2d, v1.2d
1367 ; CHECK-NEXT:    ret
1369 ; GISEL-LABEL: cmtst2xi64:
1370 ; GISEL:       // %bb.0:
1371 ; GISEL-NEXT:    movi v2.2d, #0000000000000000
1372 ; GISEL-NEXT:    and v0.16b, v0.16b, v1.16b
1373 ; GISEL-NEXT:    cmeq v0.2d, v0.2d, v2.2d
1374 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1375 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
1376 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1377 ; GISEL-NEXT:    ret
1378   %tmp3 = and <2 x i64> %A, %B
1379   %tmp4 = icmp ne <2 x i64> %tmp3, zeroinitializer
1380   %tmp5 = sext <2 x i1> %tmp4 to <2 x i64>
1381   ret <2 x i64> %tmp5
1386 define <8 x i8> @cmeqz8xi8(<8 x i8> %A) {
1387 ; CHECK-LABEL: cmeqz8xi8:
1388 ; CHECK:       // %bb.0:
1389 ; CHECK-NEXT:    cmeq v0.8b, v0.8b, #0
1390 ; CHECK-NEXT:    ret
1392 ; GISEL-LABEL: cmeqz8xi8:
1393 ; GISEL:       // %bb.0:
1394 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1395 ; GISEL-NEXT:    cmeq v0.8b, v0.8b, v1.8b
1396 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
1397 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1398 ; GISEL-NEXT:    ret
1399   %tmp3 = icmp eq <8 x i8> %A, zeroinitializer;
1400   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1401   ret <8 x i8> %tmp4
1404 define <16 x i8> @cmeqz16xi8(<16 x i8> %A) {
1405 ; CHECK-LABEL: cmeqz16xi8:
1406 ; CHECK:       // %bb.0:
1407 ; CHECK-NEXT:    cmeq v0.16b, v0.16b, #0
1408 ; CHECK-NEXT:    ret
1410 ; GISEL-LABEL: cmeqz16xi8:
1411 ; GISEL:       // %bb.0:
1412 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1413 ; GISEL-NEXT:    cmeq v0.16b, v0.16b, v1.16b
1414 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
1415 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1416 ; GISEL-NEXT:    ret
1417   %tmp3 = icmp eq <16 x i8> %A, zeroinitializer;
1418   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1419   ret <16 x i8> %tmp4
1422 define <4 x i16> @cmeqz4xi16(<4 x i16> %A) {
1423 ; CHECK-LABEL: cmeqz4xi16:
1424 ; CHECK:       // %bb.0:
1425 ; CHECK-NEXT:    cmeq v0.4h, v0.4h, #0
1426 ; CHECK-NEXT:    ret
1428 ; GISEL-LABEL: cmeqz4xi16:
1429 ; GISEL:       // %bb.0:
1430 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1431 ; GISEL-NEXT:    cmeq v0.4h, v0.4h, v1.4h
1432 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
1433 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1434 ; GISEL-NEXT:    ret
1435   %tmp3 = icmp eq <4 x i16> %A, zeroinitializer;
1436   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1437   ret <4 x i16> %tmp4
1440 define <8 x i16> @cmeqz8xi16(<8 x i16> %A) {
1441 ; CHECK-LABEL: cmeqz8xi16:
1442 ; CHECK:       // %bb.0:
1443 ; CHECK-NEXT:    cmeq v0.8h, v0.8h, #0
1444 ; CHECK-NEXT:    ret
1446 ; GISEL-LABEL: cmeqz8xi16:
1447 ; GISEL:       // %bb.0:
1448 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1449 ; GISEL-NEXT:    cmeq v0.8h, v0.8h, v1.8h
1450 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
1451 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1452 ; GISEL-NEXT:    ret
1453   %tmp3 = icmp eq <8 x i16> %A, zeroinitializer;
1454   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1455   ret <8 x i16> %tmp4
1458 define <2 x i32> @cmeqz2xi32(<2 x i32> %A) {
1459 ; CHECK-LABEL: cmeqz2xi32:
1460 ; CHECK:       // %bb.0:
1461 ; CHECK-NEXT:    cmeq v0.2s, v0.2s, #0
1462 ; CHECK-NEXT:    ret
1464 ; GISEL-LABEL: cmeqz2xi32:
1465 ; GISEL:       // %bb.0:
1466 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1467 ; GISEL-NEXT:    cmeq v0.2s, v0.2s, v1.2s
1468 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
1469 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1470 ; GISEL-NEXT:    ret
1471   %tmp3 = icmp eq <2 x i32> %A, zeroinitializer;
1472   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1473   ret <2 x i32> %tmp4
1476 define <4 x i32> @cmeqz4xi32(<4 x i32> %A) {
1477 ; CHECK-LABEL: cmeqz4xi32:
1478 ; CHECK:       // %bb.0:
1479 ; CHECK-NEXT:    cmeq v0.4s, v0.4s, #0
1480 ; CHECK-NEXT:    ret
1482 ; GISEL-LABEL: cmeqz4xi32:
1483 ; GISEL:       // %bb.0:
1484 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1485 ; GISEL-NEXT:    cmeq v0.4s, v0.4s, v1.4s
1486 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
1487 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1488 ; GISEL-NEXT:    ret
1489   %tmp3 = icmp eq <4 x i32> %A, zeroinitializer;
1490   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1491   ret <4 x i32> %tmp4
1494 define <2 x i64> @cmeqz2xi64(<2 x i64> %A) {
1495 ; CHECK-LABEL: cmeqz2xi64:
1496 ; CHECK:       // %bb.0:
1497 ; CHECK-NEXT:    cmeq v0.2d, v0.2d, #0
1498 ; CHECK-NEXT:    ret
1500 ; GISEL-LABEL: cmeqz2xi64:
1501 ; GISEL:       // %bb.0:
1502 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1503 ; GISEL-NEXT:    cmeq v0.2d, v0.2d, v1.2d
1504 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
1505 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1506 ; GISEL-NEXT:    ret
1507   %tmp3 = icmp eq <2 x i64> %A, zeroinitializer;
1508   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1509   ret <2 x i64> %tmp4
1513 define <8 x i8> @cmgez8xi8(<8 x i8> %A) {
1514 ; CHECK-LABEL: cmgez8xi8:
1515 ; CHECK:       // %bb.0:
1516 ; CHECK-NEXT:    cmge v0.8b, v0.8b, #0
1517 ; CHECK-NEXT:    ret
1519 ; GISEL-LABEL: cmgez8xi8:
1520 ; GISEL:       // %bb.0:
1521 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1522 ; GISEL-NEXT:    cmge v0.8b, v0.8b, v1.8b
1523 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
1524 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1525 ; GISEL-NEXT:    ret
1526   %tmp3 = icmp sge <8 x i8> %A, zeroinitializer;
1527   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1528   ret <8 x i8> %tmp4
1531 define <16 x i8> @cmgez16xi8(<16 x i8> %A) {
1532 ; CHECK-LABEL: cmgez16xi8:
1533 ; CHECK:       // %bb.0:
1534 ; CHECK-NEXT:    cmge v0.16b, v0.16b, #0
1535 ; CHECK-NEXT:    ret
1537 ; GISEL-LABEL: cmgez16xi8:
1538 ; GISEL:       // %bb.0:
1539 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1540 ; GISEL-NEXT:    cmge v0.16b, v0.16b, v1.16b
1541 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
1542 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1543 ; GISEL-NEXT:    ret
1544   %tmp3 = icmp sge <16 x i8> %A, zeroinitializer;
1545   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1546   ret <16 x i8> %tmp4
1549 define <4 x i16> @cmgez4xi16(<4 x i16> %A) {
1550 ; CHECK-LABEL: cmgez4xi16:
1551 ; CHECK:       // %bb.0:
1552 ; CHECK-NEXT:    cmge v0.4h, v0.4h, #0
1553 ; CHECK-NEXT:    ret
1555 ; GISEL-LABEL: cmgez4xi16:
1556 ; GISEL:       // %bb.0:
1557 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1558 ; GISEL-NEXT:    cmge v0.4h, v0.4h, v1.4h
1559 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
1560 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1561 ; GISEL-NEXT:    ret
1562   %tmp3 = icmp sge <4 x i16> %A, zeroinitializer;
1563   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1564   ret <4 x i16> %tmp4
1567 define <8 x i16> @cmgez8xi16(<8 x i16> %A) {
1568 ; CHECK-LABEL: cmgez8xi16:
1569 ; CHECK:       // %bb.0:
1570 ; CHECK-NEXT:    cmge v0.8h, v0.8h, #0
1571 ; CHECK-NEXT:    ret
1573 ; GISEL-LABEL: cmgez8xi16:
1574 ; GISEL:       // %bb.0:
1575 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1576 ; GISEL-NEXT:    cmge v0.8h, v0.8h, v1.8h
1577 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
1578 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1579 ; GISEL-NEXT:    ret
1580   %tmp3 = icmp sge <8 x i16> %A, zeroinitializer;
1581   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1582   ret <8 x i16> %tmp4
1585 define <2 x i32> @cmgez2xi32(<2 x i32> %A) {
1586 ; CHECK-LABEL: cmgez2xi32:
1587 ; CHECK:       // %bb.0:
1588 ; CHECK-NEXT:    cmge v0.2s, v0.2s, #0
1589 ; CHECK-NEXT:    ret
1591 ; GISEL-LABEL: cmgez2xi32:
1592 ; GISEL:       // %bb.0:
1593 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1594 ; GISEL-NEXT:    cmge v0.2s, v0.2s, v1.2s
1595 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
1596 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1597 ; GISEL-NEXT:    ret
1598   %tmp3 = icmp sge <2 x i32> %A, zeroinitializer;
1599   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1600   ret <2 x i32> %tmp4
1603 define <4 x i32> @cmgez4xi32(<4 x i32> %A) {
1604 ; CHECK-LABEL: cmgez4xi32:
1605 ; CHECK:       // %bb.0:
1606 ; CHECK-NEXT:    cmge v0.4s, v0.4s, #0
1607 ; CHECK-NEXT:    ret
1609 ; GISEL-LABEL: cmgez4xi32:
1610 ; GISEL:       // %bb.0:
1611 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1612 ; GISEL-NEXT:    cmge v0.4s, v0.4s, v1.4s
1613 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
1614 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1615 ; GISEL-NEXT:    ret
1616   %tmp3 = icmp sge <4 x i32> %A, zeroinitializer;
1617   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1618   ret <4 x i32> %tmp4
1621 define <2 x i64> @cmgez2xi64(<2 x i64> %A) {
1622 ; CHECK-LABEL: cmgez2xi64:
1623 ; CHECK:       // %bb.0:
1624 ; CHECK-NEXT:    cmge v0.2d, v0.2d, #0
1625 ; CHECK-NEXT:    ret
1627 ; GISEL-LABEL: cmgez2xi64:
1628 ; GISEL:       // %bb.0:
1629 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1630 ; GISEL-NEXT:    cmge v0.2d, v0.2d, v1.2d
1631 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
1632 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1633 ; GISEL-NEXT:    ret
1634   %tmp3 = icmp sge <2 x i64> %A, zeroinitializer;
1635   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1636   ret <2 x i64> %tmp4
1640 define <8 x i8> @cmgez8xi8_alt(<8 x i8> %A) {
1641 ; CHECK-LABEL: cmgez8xi8_alt:
1642 ; CHECK:       // %bb.0:
1643 ; CHECK-NEXT:    cmge v0.8b, v0.8b, #0
1644 ; CHECK-NEXT:    ret
1646 ; GISEL-LABEL: cmgez8xi8_alt:
1647 ; GISEL:       // %bb.0:
1648 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1649 ; GISEL-NEXT:    mvn v0.8b, v0.8b
1650 ; GISEL-NEXT:    ret
1651   %sign = ashr <8 x i8> %A, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
1652   %not = xor <8 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1653   ret <8 x i8> %not
1656 define <16 x i8> @cmgez16xi8_alt(<16 x i8> %A) {
1657 ; CHECK-LABEL: cmgez16xi8_alt:
1658 ; CHECK:       // %bb.0:
1659 ; CHECK-NEXT:    cmge v0.16b, v0.16b, #0
1660 ; CHECK-NEXT:    ret
1662 ; GISEL-LABEL: cmgez16xi8_alt:
1663 ; GISEL:       // %bb.0:
1664 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1665 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1666 ; GISEL-NEXT:    ret
1667   %sign = ashr <16 x i8> %A, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
1668   %not = xor <16 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1669   ret <16 x i8> %not
1672 define <4 x i16> @cmgez4xi16_alt(<4 x i16> %A) {
1673 ; CHECK-LABEL: cmgez4xi16_alt:
1674 ; CHECK:       // %bb.0:
1675 ; CHECK-NEXT:    cmge v0.4h, v0.4h, #0
1676 ; CHECK-NEXT:    ret
1678 ; GISEL-LABEL: cmgez4xi16_alt:
1679 ; GISEL:       // %bb.0:
1680 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1681 ; GISEL-NEXT:    mvn v0.8b, v0.8b
1682 ; GISEL-NEXT:    ret
1683   %sign = ashr <4 x i16> %A, <i16 15, i16 15, i16 15, i16 15>
1684   %not = xor <4 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1>
1685   ret <4 x i16> %not
1688 define <8 x i16> @cmgez8xi16_alt(<8 x i16> %A) {
1689 ; CHECK-LABEL: cmgez8xi16_alt:
1690 ; CHECK:       // %bb.0:
1691 ; CHECK-NEXT:    cmge v0.8h, v0.8h, #0
1692 ; CHECK-NEXT:    ret
1694 ; GISEL-LABEL: cmgez8xi16_alt:
1695 ; GISEL:       // %bb.0:
1696 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1697 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1698 ; GISEL-NEXT:    ret
1699   %sign = ashr <8 x i16> %A, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
1700   %not = xor <8 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1701   ret <8 x i16> %not
1704 define <2 x i32> @cmgez2xi32_alt(<2 x i32> %A) {
1705 ; CHECK-LABEL: cmgez2xi32_alt:
1706 ; CHECK:       // %bb.0:
1707 ; CHECK-NEXT:    cmge v0.2s, v0.2s, #0
1708 ; CHECK-NEXT:    ret
1710 ; GISEL-LABEL: cmgez2xi32_alt:
1711 ; GISEL:       // %bb.0:
1712 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1713 ; GISEL-NEXT:    mvn v0.8b, v0.8b
1714 ; GISEL-NEXT:    ret
1715   %sign = ashr <2 x i32> %A, <i32 31, i32 31>
1716   %not = xor <2 x i32> %sign, <i32 -1, i32 -1>
1717   ret <2 x i32> %not
1720 define <4 x i32> @cmgez4xi32_alt(<4 x i32> %A) {
1721 ; CHECK-LABEL: cmgez4xi32_alt:
1722 ; CHECK:       // %bb.0:
1723 ; CHECK-NEXT:    cmge v0.4s, v0.4s, #0
1724 ; CHECK-NEXT:    ret
1726 ; GISEL-LABEL: cmgez4xi32_alt:
1727 ; GISEL:       // %bb.0:
1728 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1729 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1730 ; GISEL-NEXT:    ret
1731   %sign = ashr <4 x i32> %A, <i32 31, i32 31, i32 31, i32 31>
1732   %not = xor <4 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1>
1733   ret <4 x i32> %not
1736 define <2 x i64> @cmgez2xi64_alt(<2 x i64> %A) {
1737 ; CHECK-LABEL: cmgez2xi64_alt:
1738 ; CHECK:       // %bb.0:
1739 ; CHECK-NEXT:    cmge v0.2d, v0.2d, #0
1740 ; CHECK-NEXT:    ret
1742 ; GISEL-LABEL: cmgez2xi64_alt:
1743 ; GISEL:       // %bb.0:
1744 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1745 ; GISEL-NEXT:    mvn v0.16b, v0.16b
1746 ; GISEL-NEXT:    ret
1747   %sign = ashr <2 x i64> %A, <i64 63, i64 63>
1748   %not = xor <2 x i64> %sign, <i64 -1, i64 -1>
1749   ret <2 x i64> %not
1753 define <8 x i8> @cmgtz8xi8(<8 x i8> %A) {
1754 ; CHECK-LABEL: cmgtz8xi8:
1755 ; CHECK:       // %bb.0:
1756 ; CHECK-NEXT:    cmgt v0.8b, v0.8b, #0
1757 ; CHECK-NEXT:    ret
1759 ; GISEL-LABEL: cmgtz8xi8:
1760 ; GISEL:       // %bb.0:
1761 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1762 ; GISEL-NEXT:    cmgt v0.8b, v0.8b, v1.8b
1763 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
1764 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1765 ; GISEL-NEXT:    ret
1766   %tmp3 = icmp sgt <8 x i8> %A, zeroinitializer;
1767   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1768   ret <8 x i8> %tmp4
1771 define <16 x i8> @cmgtz16xi8(<16 x i8> %A) {
1772 ; CHECK-LABEL: cmgtz16xi8:
1773 ; CHECK:       // %bb.0:
1774 ; CHECK-NEXT:    cmgt v0.16b, v0.16b, #0
1775 ; CHECK-NEXT:    ret
1777 ; GISEL-LABEL: cmgtz16xi8:
1778 ; GISEL:       // %bb.0:
1779 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1780 ; GISEL-NEXT:    cmgt v0.16b, v0.16b, v1.16b
1781 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
1782 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1783 ; GISEL-NEXT:    ret
1784   %tmp3 = icmp sgt <16 x i8> %A, zeroinitializer;
1785   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1786   ret <16 x i8> %tmp4
1789 define <4 x i16> @cmgtz4xi16(<4 x i16> %A) {
1790 ; CHECK-LABEL: cmgtz4xi16:
1791 ; CHECK:       // %bb.0:
1792 ; CHECK-NEXT:    cmgt v0.4h, v0.4h, #0
1793 ; CHECK-NEXT:    ret
1795 ; GISEL-LABEL: cmgtz4xi16:
1796 ; GISEL:       // %bb.0:
1797 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1798 ; GISEL-NEXT:    cmgt v0.4h, v0.4h, v1.4h
1799 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
1800 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1801 ; GISEL-NEXT:    ret
1802   %tmp3 = icmp sgt <4 x i16> %A, zeroinitializer;
1803   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1804   ret <4 x i16> %tmp4
1807 define <8 x i16> @cmgtz8xi16(<8 x i16> %A) {
1808 ; CHECK-LABEL: cmgtz8xi16:
1809 ; CHECK:       // %bb.0:
1810 ; CHECK-NEXT:    cmgt v0.8h, v0.8h, #0
1811 ; CHECK-NEXT:    ret
1813 ; GISEL-LABEL: cmgtz8xi16:
1814 ; GISEL:       // %bb.0:
1815 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1816 ; GISEL-NEXT:    cmgt v0.8h, v0.8h, v1.8h
1817 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
1818 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1819 ; GISEL-NEXT:    ret
1820   %tmp3 = icmp sgt <8 x i16> %A, zeroinitializer;
1821   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1822   ret <8 x i16> %tmp4
1825 define <2 x i32> @cmgtz2xi32(<2 x i32> %A) {
1826 ; CHECK-LABEL: cmgtz2xi32:
1827 ; CHECK:       // %bb.0:
1828 ; CHECK-NEXT:    cmgt v0.2s, v0.2s, #0
1829 ; CHECK-NEXT:    ret
1831 ; GISEL-LABEL: cmgtz2xi32:
1832 ; GISEL:       // %bb.0:
1833 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1834 ; GISEL-NEXT:    cmgt v0.2s, v0.2s, v1.2s
1835 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
1836 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1837 ; GISEL-NEXT:    ret
1838   %tmp3 = icmp sgt <2 x i32> %A, zeroinitializer;
1839   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1840   ret <2 x i32> %tmp4
1843 define <4 x i32> @cmgtz4xi32(<4 x i32> %A) {
1844 ; CHECK-LABEL: cmgtz4xi32:
1845 ; CHECK:       // %bb.0:
1846 ; CHECK-NEXT:    cmgt v0.4s, v0.4s, #0
1847 ; CHECK-NEXT:    ret
1849 ; GISEL-LABEL: cmgtz4xi32:
1850 ; GISEL:       // %bb.0:
1851 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1852 ; GISEL-NEXT:    cmgt v0.4s, v0.4s, v1.4s
1853 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
1854 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1855 ; GISEL-NEXT:    ret
1856   %tmp3 = icmp sgt <4 x i32> %A, zeroinitializer;
1857   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1858   ret <4 x i32> %tmp4
1861 define <2 x i64> @cmgtz2xi64(<2 x i64> %A) {
1862 ; CHECK-LABEL: cmgtz2xi64:
1863 ; CHECK:       // %bb.0:
1864 ; CHECK-NEXT:    cmgt v0.2d, v0.2d, #0
1865 ; CHECK-NEXT:    ret
1867 ; GISEL-LABEL: cmgtz2xi64:
1868 ; GISEL:       // %bb.0:
1869 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1870 ; GISEL-NEXT:    cmgt v0.2d, v0.2d, v1.2d
1871 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
1872 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1873 ; GISEL-NEXT:    ret
1874   %tmp3 = icmp sgt <2 x i64> %A, zeroinitializer;
1875   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1876   ret <2 x i64> %tmp4
1879 define <8 x i8> @cmlez8xi8(<8 x i8> %A) {
1880 ; CHECK-LABEL: cmlez8xi8:
1881 ; CHECK:       // %bb.0:
1882 ; CHECK-NEXT:    cmle v0.8b, v0.8b, #0
1883 ; CHECK-NEXT:    ret
1885 ; GISEL-LABEL: cmlez8xi8:
1886 ; GISEL:       // %bb.0:
1887 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1888 ; GISEL-NEXT:    cmge v0.8b, v1.8b, v0.8b
1889 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
1890 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
1891 ; GISEL-NEXT:    ret
1892   %tmp3 = icmp sle <8 x i8> %A, zeroinitializer;
1893   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1894   ret <8 x i8> %tmp4
1897 define <16 x i8> @cmlez16xi8(<16 x i8> %A) {
1898 ; CHECK-LABEL: cmlez16xi8:
1899 ; CHECK:       // %bb.0:
1900 ; CHECK-NEXT:    cmle v0.16b, v0.16b, #0
1901 ; CHECK-NEXT:    ret
1903 ; GISEL-LABEL: cmlez16xi8:
1904 ; GISEL:       // %bb.0:
1905 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1906 ; GISEL-NEXT:    cmge v0.16b, v1.16b, v0.16b
1907 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
1908 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
1909 ; GISEL-NEXT:    ret
1910   %tmp3 = icmp sle <16 x i8> %A, zeroinitializer;
1911   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1912   ret <16 x i8> %tmp4
1915 define <4 x i16> @cmlez4xi16(<4 x i16> %A) {
1916 ; CHECK-LABEL: cmlez4xi16:
1917 ; CHECK:       // %bb.0:
1918 ; CHECK-NEXT:    cmle v0.4h, v0.4h, #0
1919 ; CHECK-NEXT:    ret
1921 ; GISEL-LABEL: cmlez4xi16:
1922 ; GISEL:       // %bb.0:
1923 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1924 ; GISEL-NEXT:    cmge v0.4h, v1.4h, v0.4h
1925 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
1926 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
1927 ; GISEL-NEXT:    ret
1928   %tmp3 = icmp sle <4 x i16> %A, zeroinitializer;
1929   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1930   ret <4 x i16> %tmp4
1933 define <8 x i16> @cmlez8xi16(<8 x i16> %A) {
1934 ; CHECK-LABEL: cmlez8xi16:
1935 ; CHECK:       // %bb.0:
1936 ; CHECK-NEXT:    cmle v0.8h, v0.8h, #0
1937 ; CHECK-NEXT:    ret
1939 ; GISEL-LABEL: cmlez8xi16:
1940 ; GISEL:       // %bb.0:
1941 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1942 ; GISEL-NEXT:    cmge v0.8h, v1.8h, v0.8h
1943 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
1944 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
1945 ; GISEL-NEXT:    ret
1946   %tmp3 = icmp sle <8 x i16> %A, zeroinitializer;
1947   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1948   ret <8 x i16> %tmp4
1951 define <2 x i32> @cmlez2xi32(<2 x i32> %A) {
1952 ; CHECK-LABEL: cmlez2xi32:
1953 ; CHECK:       // %bb.0:
1954 ; CHECK-NEXT:    cmle v0.2s, v0.2s, #0
1955 ; CHECK-NEXT:    ret
1957 ; GISEL-LABEL: cmlez2xi32:
1958 ; GISEL:       // %bb.0:
1959 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1960 ; GISEL-NEXT:    cmge v0.2s, v1.2s, v0.2s
1961 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
1962 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
1963 ; GISEL-NEXT:    ret
1964   %tmp3 = icmp sle <2 x i32> %A, zeroinitializer;
1965   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1966   ret <2 x i32> %tmp4
1969 define <4 x i32> @cmlez4xi32(<4 x i32> %A) {
1970 ; CHECK-LABEL: cmlez4xi32:
1971 ; CHECK:       // %bb.0:
1972 ; CHECK-NEXT:    cmle v0.4s, v0.4s, #0
1973 ; CHECK-NEXT:    ret
1975 ; GISEL-LABEL: cmlez4xi32:
1976 ; GISEL:       // %bb.0:
1977 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1978 ; GISEL-NEXT:    cmge v0.4s, v1.4s, v0.4s
1979 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
1980 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
1981 ; GISEL-NEXT:    ret
1982   %tmp3 = icmp sle <4 x i32> %A, zeroinitializer;
1983   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1984   ret <4 x i32> %tmp4
1987 define <2 x i64> @cmlez2xi64(<2 x i64> %A) {
1988 ; CHECK-LABEL: cmlez2xi64:
1989 ; CHECK:       // %bb.0:
1990 ; CHECK-NEXT:    cmle v0.2d, v0.2d, #0
1991 ; CHECK-NEXT:    ret
1993 ; GISEL-LABEL: cmlez2xi64:
1994 ; GISEL:       // %bb.0:
1995 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
1996 ; GISEL-NEXT:    cmge v0.2d, v1.2d, v0.2d
1997 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
1998 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
1999 ; GISEL-NEXT:    ret
2000   %tmp3 = icmp sle <2 x i64> %A, zeroinitializer;
2001   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2002   ret <2 x i64> %tmp4
2005 define <8 x i8> @cmltz8xi8(<8 x i8> %A) {
2006 ; CHECK-LABEL: cmltz8xi8:
2007 ; CHECK:       // %bb.0:
2008 ; CHECK-NEXT:    cmlt v0.8b, v0.8b, #0
2009 ; CHECK-NEXT:    ret
2011 ; GISEL-LABEL: cmltz8xi8:
2012 ; GISEL:       // %bb.0:
2013 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2014 ; GISEL-NEXT:    cmgt v0.8b, v1.8b, v0.8b
2015 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
2016 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
2017 ; GISEL-NEXT:    ret
2018   %tmp3 = icmp slt <8 x i8> %A, zeroinitializer;
2019   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
2020   ret <8 x i8> %tmp4
2023 define <16 x i8> @cmltz16xi8(<16 x i8> %A) {
2024 ; CHECK-LABEL: cmltz16xi8:
2025 ; CHECK:       // %bb.0:
2026 ; CHECK-NEXT:    cmlt v0.16b, v0.16b, #0
2027 ; CHECK-NEXT:    ret
2029 ; GISEL-LABEL: cmltz16xi8:
2030 ; GISEL:       // %bb.0:
2031 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2032 ; GISEL-NEXT:    cmgt v0.16b, v1.16b, v0.16b
2033 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
2034 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
2035 ; GISEL-NEXT:    ret
2036   %tmp3 = icmp slt <16 x i8> %A, zeroinitializer;
2037   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
2038   ret <16 x i8> %tmp4
2041 define <4 x i16> @cmltz4xi16(<4 x i16> %A) {
2042 ; CHECK-LABEL: cmltz4xi16:
2043 ; CHECK:       // %bb.0:
2044 ; CHECK-NEXT:    cmlt v0.4h, v0.4h, #0
2045 ; CHECK-NEXT:    ret
2047 ; GISEL-LABEL: cmltz4xi16:
2048 ; GISEL:       // %bb.0:
2049 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2050 ; GISEL-NEXT:    cmgt v0.4h, v1.4h, v0.4h
2051 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
2052 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
2053 ; GISEL-NEXT:    ret
2054   %tmp3 = icmp slt <4 x i16> %A, zeroinitializer;
2055   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
2056   ret <4 x i16> %tmp4
2059 define <8 x i16> @cmltz8xi16(<8 x i16> %A) {
2060 ; CHECK-LABEL: cmltz8xi16:
2061 ; CHECK:       // %bb.0:
2062 ; CHECK-NEXT:    cmlt v0.8h, v0.8h, #0
2063 ; CHECK-NEXT:    ret
2065 ; GISEL-LABEL: cmltz8xi16:
2066 ; GISEL:       // %bb.0:
2067 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2068 ; GISEL-NEXT:    cmgt v0.8h, v1.8h, v0.8h
2069 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
2070 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
2071 ; GISEL-NEXT:    ret
2072   %tmp3 = icmp slt <8 x i16> %A, zeroinitializer;
2073   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
2074   ret <8 x i16> %tmp4
2077 define <2 x i32> @cmltz2xi32(<2 x i32> %A) {
2078 ; CHECK-LABEL: cmltz2xi32:
2079 ; CHECK:       // %bb.0:
2080 ; CHECK-NEXT:    cmlt v0.2s, v0.2s, #0
2081 ; CHECK-NEXT:    ret
2083 ; GISEL-LABEL: cmltz2xi32:
2084 ; GISEL:       // %bb.0:
2085 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2086 ; GISEL-NEXT:    cmgt v0.2s, v1.2s, v0.2s
2087 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2088 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2089 ; GISEL-NEXT:    ret
2090   %tmp3 = icmp slt <2 x i32> %A, zeroinitializer;
2091   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2092   ret <2 x i32> %tmp4
2095 define <4 x i32> @cmltz4xi32(<4 x i32> %A) {
2096 ; CHECK-LABEL: cmltz4xi32:
2097 ; CHECK:       // %bb.0:
2098 ; CHECK-NEXT:    cmlt v0.4s, v0.4s, #0
2099 ; CHECK-NEXT:    ret
2101 ; GISEL-LABEL: cmltz4xi32:
2102 ; GISEL:       // %bb.0:
2103 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2104 ; GISEL-NEXT:    cmgt v0.4s, v1.4s, v0.4s
2105 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2106 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2107 ; GISEL-NEXT:    ret
2108   %tmp3 = icmp slt <4 x i32> %A, zeroinitializer;
2109   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2110   ret <4 x i32> %tmp4
2113 define <2 x i64> @cmltz2xi64(<2 x i64> %A) {
2114 ; CHECK-LABEL: cmltz2xi64:
2115 ; CHECK:       // %bb.0:
2116 ; CHECK-NEXT:    cmlt v0.2d, v0.2d, #0
2117 ; CHECK-NEXT:    ret
2119 ; GISEL-LABEL: cmltz2xi64:
2120 ; GISEL:       // %bb.0:
2121 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2122 ; GISEL-NEXT:    cmgt v0.2d, v1.2d, v0.2d
2123 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2124 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2125 ; GISEL-NEXT:    ret
2126   %tmp3 = icmp slt <2 x i64> %A, zeroinitializer;
2127   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2128   ret <2 x i64> %tmp4
2131 define <8 x i8> @cmneqz8xi8(<8 x i8> %A) {
2132 ; CHECK-LABEL: cmneqz8xi8:
2133 ; CHECK:       // %bb.0:
2134 ; CHECK-NEXT:    cmtst v0.8b, v0.8b, v0.8b
2135 ; CHECK-NEXT:    ret
2137 ; GISEL-LABEL: cmneqz8xi8:
2138 ; GISEL:       // %bb.0:
2139 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2140 ; GISEL-NEXT:    cmeq v0.8b, v0.8b, v1.8b
2141 ; GISEL-NEXT:    mvn v0.8b, v0.8b
2142 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
2143 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
2144 ; GISEL-NEXT:    ret
2145   %tmp3 = icmp ne <8 x i8> %A, zeroinitializer;
2146   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
2147   ret <8 x i8> %tmp4
2150 define <16 x i8> @cmneqz16xi8(<16 x i8> %A) {
2151 ; CHECK-LABEL: cmneqz16xi8:
2152 ; CHECK:       // %bb.0:
2153 ; CHECK-NEXT:    cmtst v0.16b, v0.16b, v0.16b
2154 ; CHECK-NEXT:    ret
2156 ; GISEL-LABEL: cmneqz16xi8:
2157 ; GISEL:       // %bb.0:
2158 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2159 ; GISEL-NEXT:    cmeq v0.16b, v0.16b, v1.16b
2160 ; GISEL-NEXT:    mvn v0.16b, v0.16b
2161 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
2162 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
2163 ; GISEL-NEXT:    ret
2164   %tmp3 = icmp ne <16 x i8> %A, zeroinitializer;
2165   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
2166   ret <16 x i8> %tmp4
2169 define <4 x i16> @cmneqz4xi16(<4 x i16> %A) {
2170 ; CHECK-LABEL: cmneqz4xi16:
2171 ; CHECK:       // %bb.0:
2172 ; CHECK-NEXT:    cmtst v0.4h, v0.4h, v0.4h
2173 ; CHECK-NEXT:    ret
2175 ; GISEL-LABEL: cmneqz4xi16:
2176 ; GISEL:       // %bb.0:
2177 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2178 ; GISEL-NEXT:    cmeq v0.4h, v0.4h, v1.4h
2179 ; GISEL-NEXT:    mvn v0.8b, v0.8b
2180 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
2181 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
2182 ; GISEL-NEXT:    ret
2183   %tmp3 = icmp ne <4 x i16> %A, zeroinitializer;
2184   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
2185   ret <4 x i16> %tmp4
2188 define <8 x i16> @cmneqz8xi16(<8 x i16> %A) {
2189 ; CHECK-LABEL: cmneqz8xi16:
2190 ; CHECK:       // %bb.0:
2191 ; CHECK-NEXT:    cmtst v0.8h, v0.8h, v0.8h
2192 ; CHECK-NEXT:    ret
2194 ; GISEL-LABEL: cmneqz8xi16:
2195 ; GISEL:       // %bb.0:
2196 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2197 ; GISEL-NEXT:    cmeq v0.8h, v0.8h, v1.8h
2198 ; GISEL-NEXT:    mvn v0.16b, v0.16b
2199 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
2200 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
2201 ; GISEL-NEXT:    ret
2202   %tmp3 = icmp ne <8 x i16> %A, zeroinitializer;
2203   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
2204   ret <8 x i16> %tmp4
2207 define <2 x i32> @cmneqz2xi32(<2 x i32> %A) {
2208 ; CHECK-LABEL: cmneqz2xi32:
2209 ; CHECK:       // %bb.0:
2210 ; CHECK-NEXT:    cmtst v0.2s, v0.2s, v0.2s
2211 ; CHECK-NEXT:    ret
2213 ; GISEL-LABEL: cmneqz2xi32:
2214 ; GISEL:       // %bb.0:
2215 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2216 ; GISEL-NEXT:    cmeq v0.2s, v0.2s, v1.2s
2217 ; GISEL-NEXT:    mvn v0.8b, v0.8b
2218 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2219 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2220 ; GISEL-NEXT:    ret
2221   %tmp3 = icmp ne <2 x i32> %A, zeroinitializer;
2222   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2223   ret <2 x i32> %tmp4
2226 define <4 x i32> @cmneqz4xi32(<4 x i32> %A) {
2227 ; CHECK-LABEL: cmneqz4xi32:
2228 ; CHECK:       // %bb.0:
2229 ; CHECK-NEXT:    cmtst v0.4s, v0.4s, v0.4s
2230 ; CHECK-NEXT:    ret
2232 ; GISEL-LABEL: cmneqz4xi32:
2233 ; GISEL:       // %bb.0:
2234 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2235 ; GISEL-NEXT:    cmeq v0.4s, v0.4s, v1.4s
2236 ; GISEL-NEXT:    mvn v0.16b, v0.16b
2237 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2238 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2239 ; GISEL-NEXT:    ret
2240   %tmp3 = icmp ne <4 x i32> %A, zeroinitializer;
2241   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2242   ret <4 x i32> %tmp4
2245 define <2 x i64> @cmneqz2xi64(<2 x i64> %A) {
2246 ; CHECK-LABEL: cmneqz2xi64:
2247 ; CHECK:       // %bb.0:
2248 ; CHECK-NEXT:    cmtst v0.2d, v0.2d, v0.2d
2249 ; CHECK-NEXT:    ret
2251 ; GISEL-LABEL: cmneqz2xi64:
2252 ; GISEL:       // %bb.0:
2253 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2254 ; GISEL-NEXT:    cmeq v0.2d, v0.2d, v1.2d
2255 ; GISEL-NEXT:    mvn v0.16b, v0.16b
2256 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2257 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2258 ; GISEL-NEXT:    ret
2259   %tmp3 = icmp ne <2 x i64> %A, zeroinitializer;
2260   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2261   ret <2 x i64> %tmp4
2264 define <8 x i8> @cmhsz8xi8(<8 x i8> %A) {
2265 ; CHECK-LABEL: cmhsz8xi8:
2266 ; CHECK:       // %bb.0:
2267 ; CHECK-NEXT:    movi v1.8b, #2
2268 ; CHECK-NEXT:    cmhs v0.8b, v0.8b, v1.8b
2269 ; CHECK-NEXT:    ret
2271 ; GISEL-LABEL: cmhsz8xi8:
2272 ; GISEL:       // %bb.0:
2273 ; GISEL-NEXT:    adrp x8, .LCPI126_0
2274 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI126_0]
2275 ; GISEL-NEXT:    cmhs v0.8b, v0.8b, v1.8b
2276 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
2277 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
2278 ; GISEL-NEXT:    ret
2279   %tmp3 = icmp uge <8 x i8> %A, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
2280   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
2281   ret <8 x i8> %tmp4
2284 define <16 x i8> @cmhsz16xi8(<16 x i8> %A) {
2285 ; CHECK-LABEL: cmhsz16xi8:
2286 ; CHECK:       // %bb.0:
2287 ; CHECK-NEXT:    movi v1.16b, #2
2288 ; CHECK-NEXT:    cmhs v0.16b, v0.16b, v1.16b
2289 ; CHECK-NEXT:    ret
2291 ; GISEL-LABEL: cmhsz16xi8:
2292 ; GISEL:       // %bb.0:
2293 ; GISEL-NEXT:    adrp x8, .LCPI127_0
2294 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI127_0]
2295 ; GISEL-NEXT:    cmhs v0.16b, v0.16b, v1.16b
2296 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
2297 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
2298 ; GISEL-NEXT:    ret
2299   %tmp3 = icmp uge <16 x i8> %A, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
2300   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
2301   ret <16 x i8> %tmp4
2304 define <4 x i16> @cmhsz4xi16(<4 x i16> %A) {
2305 ; CHECK-LABEL: cmhsz4xi16:
2306 ; CHECK:       // %bb.0:
2307 ; CHECK-NEXT:    movi v1.4h, #2
2308 ; CHECK-NEXT:    cmhs v0.4h, v0.4h, v1.4h
2309 ; CHECK-NEXT:    ret
2311 ; GISEL-LABEL: cmhsz4xi16:
2312 ; GISEL:       // %bb.0:
2313 ; GISEL-NEXT:    adrp x8, .LCPI128_0
2314 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI128_0]
2315 ; GISEL-NEXT:    cmhs v0.4h, v0.4h, v1.4h
2316 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
2317 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
2318 ; GISEL-NEXT:    ret
2319   %tmp3 = icmp uge <4 x i16> %A, <i16 2, i16 2, i16 2, i16 2>
2320   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
2321   ret <4 x i16> %tmp4
2324 define <8 x i16> @cmhsz8xi16(<8 x i16> %A) {
2325 ; CHECK-LABEL: cmhsz8xi16:
2326 ; CHECK:       // %bb.0:
2327 ; CHECK-NEXT:    movi v1.8h, #2
2328 ; CHECK-NEXT:    cmhs v0.8h, v0.8h, v1.8h
2329 ; CHECK-NEXT:    ret
2331 ; GISEL-LABEL: cmhsz8xi16:
2332 ; GISEL:       // %bb.0:
2333 ; GISEL-NEXT:    adrp x8, .LCPI129_0
2334 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI129_0]
2335 ; GISEL-NEXT:    cmhs v0.8h, v0.8h, v1.8h
2336 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
2337 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
2338 ; GISEL-NEXT:    ret
2339   %tmp3 = icmp uge <8 x i16> %A, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
2340   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
2341   ret <8 x i16> %tmp4
2344 define <2 x i32> @cmhsz2xi32(<2 x i32> %A) {
2345 ; CHECK-LABEL: cmhsz2xi32:
2346 ; CHECK:       // %bb.0:
2347 ; CHECK-NEXT:    movi v1.2s, #2
2348 ; CHECK-NEXT:    cmhs v0.2s, v0.2s, v1.2s
2349 ; CHECK-NEXT:    ret
2351 ; GISEL-LABEL: cmhsz2xi32:
2352 ; GISEL:       // %bb.0:
2353 ; GISEL-NEXT:    adrp x8, .LCPI130_0
2354 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI130_0]
2355 ; GISEL-NEXT:    cmhs v0.2s, v0.2s, v1.2s
2356 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2357 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2358 ; GISEL-NEXT:    ret
2359   %tmp3 = icmp uge <2 x i32> %A, <i32 2, i32 2>
2360   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2361   ret <2 x i32> %tmp4
2364 define <4 x i32> @cmhsz4xi32(<4 x i32> %A) {
2365 ; CHECK-LABEL: cmhsz4xi32:
2366 ; CHECK:       // %bb.0:
2367 ; CHECK-NEXT:    movi v1.4s, #2
2368 ; CHECK-NEXT:    cmhs v0.4s, v0.4s, v1.4s
2369 ; CHECK-NEXT:    ret
2371 ; GISEL-LABEL: cmhsz4xi32:
2372 ; GISEL:       // %bb.0:
2373 ; GISEL-NEXT:    adrp x8, .LCPI131_0
2374 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI131_0]
2375 ; GISEL-NEXT:    cmhs v0.4s, v0.4s, v1.4s
2376 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2377 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2378 ; GISEL-NEXT:    ret
2379   %tmp3 = icmp uge <4 x i32> %A, <i32 2, i32 2, i32 2, i32 2>
2380   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2381   ret <4 x i32> %tmp4
2384 define <2 x i64> @cmhsz2xi64(<2 x i64> %A) {
2385 ; CHECK-LABEL: cmhsz2xi64:
2386 ; CHECK:       // %bb.0:
2387 ; CHECK-NEXT:    mov w8, #2
2388 ; CHECK-NEXT:    dup v1.2d, x8
2389 ; CHECK-NEXT:    cmhs v0.2d, v0.2d, v1.2d
2390 ; CHECK-NEXT:    ret
2392 ; GISEL-LABEL: cmhsz2xi64:
2393 ; GISEL:       // %bb.0:
2394 ; GISEL-NEXT:    adrp x8, .LCPI132_0
2395 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI132_0]
2396 ; GISEL-NEXT:    cmhs v0.2d, v0.2d, v1.2d
2397 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2398 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2399 ; GISEL-NEXT:    ret
2400   %tmp3 = icmp uge <2 x i64> %A, <i64 2, i64 2>
2401   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2402   ret <2 x i64> %tmp4
2406 define <8 x i8> @cmhiz8xi8(<8 x i8> %A) {
2407 ; CHECK-LABEL: cmhiz8xi8:
2408 ; CHECK:       // %bb.0:
2409 ; CHECK-NEXT:    movi v1.8b, #1
2410 ; CHECK-NEXT:    cmhi v0.8b, v0.8b, v1.8b
2411 ; CHECK-NEXT:    ret
2413 ; GISEL-LABEL: cmhiz8xi8:
2414 ; GISEL:       // %bb.0:
2415 ; GISEL-NEXT:    adrp x8, .LCPI133_0
2416 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI133_0]
2417 ; GISEL-NEXT:    cmhi v0.8b, v0.8b, v1.8b
2418 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
2419 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
2420 ; GISEL-NEXT:    ret
2421   %tmp3 = icmp ugt <8 x i8> %A, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2422   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
2423   ret <8 x i8> %tmp4
2426 define <16 x i8> @cmhiz16xi8(<16 x i8> %A) {
2427 ; CHECK-LABEL: cmhiz16xi8:
2428 ; CHECK:       // %bb.0:
2429 ; CHECK-NEXT:    movi v1.16b, #1
2430 ; CHECK-NEXT:    cmhi v0.16b, v0.16b, v1.16b
2431 ; CHECK-NEXT:    ret
2433 ; GISEL-LABEL: cmhiz16xi8:
2434 ; GISEL:       // %bb.0:
2435 ; GISEL-NEXT:    adrp x8, .LCPI134_0
2436 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI134_0]
2437 ; GISEL-NEXT:    cmhi v0.16b, v0.16b, v1.16b
2438 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
2439 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
2440 ; GISEL-NEXT:    ret
2441   %tmp3 = icmp ugt <16 x i8> %A, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2442   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
2443   ret <16 x i8> %tmp4
2446 define <4 x i16> @cmhiz4xi16(<4 x i16> %A) {
2447 ; CHECK-LABEL: cmhiz4xi16:
2448 ; CHECK:       // %bb.0:
2449 ; CHECK-NEXT:    movi v1.4h, #1
2450 ; CHECK-NEXT:    cmhi v0.4h, v0.4h, v1.4h
2451 ; CHECK-NEXT:    ret
2453 ; GISEL-LABEL: cmhiz4xi16:
2454 ; GISEL:       // %bb.0:
2455 ; GISEL-NEXT:    adrp x8, .LCPI135_0
2456 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI135_0]
2457 ; GISEL-NEXT:    cmhi v0.4h, v0.4h, v1.4h
2458 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
2459 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
2460 ; GISEL-NEXT:    ret
2461   %tmp3 = icmp ugt <4 x i16> %A, <i16 1, i16 1, i16 1, i16 1>
2462   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
2463   ret <4 x i16> %tmp4
2466 define <8 x i16> @cmhiz8xi16(<8 x i16> %A) {
2467 ; CHECK-LABEL: cmhiz8xi16:
2468 ; CHECK:       // %bb.0:
2469 ; CHECK-NEXT:    movi v1.8h, #1
2470 ; CHECK-NEXT:    cmhi v0.8h, v0.8h, v1.8h
2471 ; CHECK-NEXT:    ret
2473 ; GISEL-LABEL: cmhiz8xi16:
2474 ; GISEL:       // %bb.0:
2475 ; GISEL-NEXT:    adrp x8, .LCPI136_0
2476 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI136_0]
2477 ; GISEL-NEXT:    cmhi v0.8h, v0.8h, v1.8h
2478 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
2479 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
2480 ; GISEL-NEXT:    ret
2481   %tmp3 = icmp ugt <8 x i16> %A, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2482   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
2483   ret <8 x i16> %tmp4
2486 define <2 x i32> @cmhiz2xi32(<2 x i32> %A) {
2487 ; CHECK-LABEL: cmhiz2xi32:
2488 ; CHECK:       // %bb.0:
2489 ; CHECK-NEXT:    movi v1.2s, #1
2490 ; CHECK-NEXT:    cmhi v0.2s, v0.2s, v1.2s
2491 ; CHECK-NEXT:    ret
2493 ; GISEL-LABEL: cmhiz2xi32:
2494 ; GISEL:       // %bb.0:
2495 ; GISEL-NEXT:    adrp x8, .LCPI137_0
2496 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI137_0]
2497 ; GISEL-NEXT:    cmhi v0.2s, v0.2s, v1.2s
2498 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2499 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2500 ; GISEL-NEXT:    ret
2501   %tmp3 = icmp ugt <2 x i32> %A, <i32 1, i32 1>
2502   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2503   ret <2 x i32> %tmp4
2506 define <4 x i32> @cmhiz4xi32(<4 x i32> %A) {
2507 ; CHECK-LABEL: cmhiz4xi32:
2508 ; CHECK:       // %bb.0:
2509 ; CHECK-NEXT:    movi v1.4s, #1
2510 ; CHECK-NEXT:    cmhi v0.4s, v0.4s, v1.4s
2511 ; CHECK-NEXT:    ret
2513 ; GISEL-LABEL: cmhiz4xi32:
2514 ; GISEL:       // %bb.0:
2515 ; GISEL-NEXT:    adrp x8, .LCPI138_0
2516 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI138_0]
2517 ; GISEL-NEXT:    cmhi v0.4s, v0.4s, v1.4s
2518 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2519 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2520 ; GISEL-NEXT:    ret
2521   %tmp3 = icmp ugt <4 x i32> %A, <i32 1, i32 1, i32 1, i32 1>
2522   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2523   ret <4 x i32> %tmp4
2526 define <2 x i64> @cmhiz2xi64(<2 x i64> %A) {
2527 ; CHECK-LABEL: cmhiz2xi64:
2528 ; CHECK:       // %bb.0:
2529 ; CHECK-NEXT:    mov w8, #1
2530 ; CHECK-NEXT:    dup v1.2d, x8
2531 ; CHECK-NEXT:    cmhi v0.2d, v0.2d, v1.2d
2532 ; CHECK-NEXT:    ret
2534 ; GISEL-LABEL: cmhiz2xi64:
2535 ; GISEL:       // %bb.0:
2536 ; GISEL-NEXT:    adrp x8, .LCPI139_0
2537 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI139_0]
2538 ; GISEL-NEXT:    cmhi v0.2d, v0.2d, v1.2d
2539 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2540 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2541 ; GISEL-NEXT:    ret
2542   %tmp3 = icmp ugt <2 x i64> %A, <i64 1, i64 1>
2543   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2544   ret <2 x i64> %tmp4
2547 ; LS implemented as HS, so check reversed operands.
2548 define <8 x i8> @cmlsz8xi8(<8 x i8> %A) {
2549 ; CHECK-LABEL: cmlsz8xi8:
2550 ; CHECK:       // %bb.0:
2551 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
2552 ; CHECK-NEXT:    cmhs v0.8b, v1.8b, v0.8b
2553 ; CHECK-NEXT:    ret
2555 ; GISEL-LABEL: cmlsz8xi8:
2556 ; GISEL:       // %bb.0:
2557 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2558 ; GISEL-NEXT:    cmhs v0.8b, v1.8b, v0.8b
2559 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
2560 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
2561 ; GISEL-NEXT:    ret
2562   %tmp3 = icmp ule <8 x i8> %A, zeroinitializer;
2563   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
2564   ret <8 x i8> %tmp4
2567 ; LS implemented as HS, so check reversed operands.
2568 define <16 x i8> @cmlsz16xi8(<16 x i8> %A) {
2569 ; CHECK-LABEL: cmlsz16xi8:
2570 ; CHECK:       // %bb.0:
2571 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
2572 ; CHECK-NEXT:    cmhs v0.16b, v1.16b, v0.16b
2573 ; CHECK-NEXT:    ret
2575 ; GISEL-LABEL: cmlsz16xi8:
2576 ; GISEL:       // %bb.0:
2577 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2578 ; GISEL-NEXT:    cmhs v0.16b, v1.16b, v0.16b
2579 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
2580 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
2581 ; GISEL-NEXT:    ret
2582   %tmp3 = icmp ule <16 x i8> %A, zeroinitializer;
2583   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
2584   ret <16 x i8> %tmp4
2587 ; LS implemented as HS, so check reversed operands.
2588 define <4 x i16> @cmlsz4xi16(<4 x i16> %A) {
2589 ; CHECK-LABEL: cmlsz4xi16:
2590 ; CHECK:       // %bb.0:
2591 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
2592 ; CHECK-NEXT:    cmhs v0.4h, v1.4h, v0.4h
2593 ; CHECK-NEXT:    ret
2595 ; GISEL-LABEL: cmlsz4xi16:
2596 ; GISEL:       // %bb.0:
2597 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2598 ; GISEL-NEXT:    cmhs v0.4h, v1.4h, v0.4h
2599 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
2600 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
2601 ; GISEL-NEXT:    ret
2602   %tmp3 = icmp ule <4 x i16> %A, zeroinitializer;
2603   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
2604   ret <4 x i16> %tmp4
2607 ; LS implemented as HS, so check reversed operands.
2608 define <8 x i16> @cmlsz8xi16(<8 x i16> %A) {
2609 ; CHECK-LABEL: cmlsz8xi16:
2610 ; CHECK:       // %bb.0:
2611 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
2612 ; CHECK-NEXT:    cmhs v0.8h, v1.8h, v0.8h
2613 ; CHECK-NEXT:    ret
2615 ; GISEL-LABEL: cmlsz8xi16:
2616 ; GISEL:       // %bb.0:
2617 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2618 ; GISEL-NEXT:    cmhs v0.8h, v1.8h, v0.8h
2619 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
2620 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
2621 ; GISEL-NEXT:    ret
2622   %tmp3 = icmp ule <8 x i16> %A, zeroinitializer;
2623   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
2624   ret <8 x i16> %tmp4
2627 ; LS implemented as HS, so check reversed operands.
2628 define <2 x i32> @cmlsz2xi32(<2 x i32> %A) {
2629 ; CHECK-LABEL: cmlsz2xi32:
2630 ; CHECK:       // %bb.0:
2631 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
2632 ; CHECK-NEXT:    cmhs v0.2s, v1.2s, v0.2s
2633 ; CHECK-NEXT:    ret
2635 ; GISEL-LABEL: cmlsz2xi32:
2636 ; GISEL:       // %bb.0:
2637 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2638 ; GISEL-NEXT:    cmhs v0.2s, v1.2s, v0.2s
2639 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2640 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2641 ; GISEL-NEXT:    ret
2642   %tmp3 = icmp ule <2 x i32> %A, zeroinitializer;
2643   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2644   ret <2 x i32> %tmp4
2647 ; LS implemented as HS, so check reversed operands.
2648 define <4 x i32> @cmlsz4xi32(<4 x i32> %A) {
2649 ; CHECK-LABEL: cmlsz4xi32:
2650 ; CHECK:       // %bb.0:
2651 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
2652 ; CHECK-NEXT:    cmhs v0.4s, v1.4s, v0.4s
2653 ; CHECK-NEXT:    ret
2655 ; GISEL-LABEL: cmlsz4xi32:
2656 ; GISEL:       // %bb.0:
2657 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2658 ; GISEL-NEXT:    cmhs v0.4s, v1.4s, v0.4s
2659 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2660 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2661 ; GISEL-NEXT:    ret
2662   %tmp3 = icmp ule <4 x i32> %A, zeroinitializer;
2663   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2664   ret <4 x i32> %tmp4
2667 ; LS implemented as HS, so check reversed operands.
2668 define <2 x i64> @cmlsz2xi64(<2 x i64> %A) {
2669 ; CHECK-LABEL: cmlsz2xi64:
2670 ; CHECK:       // %bb.0:
2671 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
2672 ; CHECK-NEXT:    cmhs v0.2d, v1.2d, v0.2d
2673 ; CHECK-NEXT:    ret
2675 ; GISEL-LABEL: cmlsz2xi64:
2676 ; GISEL:       // %bb.0:
2677 ; GISEL-NEXT:    movi v1.2d, #0000000000000000
2678 ; GISEL-NEXT:    cmhs v0.2d, v1.2d, v0.2d
2679 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2680 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2681 ; GISEL-NEXT:    ret
2682   %tmp3 = icmp ule <2 x i64> %A, zeroinitializer;
2683   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2684   ret <2 x i64> %tmp4
2687 ; LO implemented as HI, so check reversed operands.
2688 define <8 x i8> @cmloz8xi8(<8 x i8> %A) {
2689 ; CHECK-LABEL: cmloz8xi8:
2690 ; CHECK:       // %bb.0:
2691 ; CHECK-NEXT:    movi v1.8b, #2
2692 ; CHECK-NEXT:    cmhi v0.8b, v1.8b, v0.8b
2693 ; CHECK-NEXT:    ret
2695 ; GISEL-LABEL: cmloz8xi8:
2696 ; GISEL:       // %bb.0:
2697 ; GISEL-NEXT:    adrp x8, .LCPI147_0
2698 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI147_0]
2699 ; GISEL-NEXT:    cmhi v0.8b, v1.8b, v0.8b
2700 ; GISEL-NEXT:    shl v0.8b, v0.8b, #7
2701 ; GISEL-NEXT:    sshr v0.8b, v0.8b, #7
2702 ; GISEL-NEXT:    ret
2703   %tmp3 = icmp ult <8 x i8> %A, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
2704   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
2705   ret <8 x i8> %tmp4
2708 ; LO implemented as HI, so check reversed operands.
2709 define <16 x i8> @cmloz16xi8(<16 x i8> %A) {
2710 ; CHECK-LABEL: cmloz16xi8:
2711 ; CHECK:       // %bb.0:
2712 ; CHECK-NEXT:    movi v1.16b, #2
2713 ; CHECK-NEXT:    cmhi v0.16b, v1.16b, v0.16b
2714 ; CHECK-NEXT:    ret
2716 ; GISEL-LABEL: cmloz16xi8:
2717 ; GISEL:       // %bb.0:
2718 ; GISEL-NEXT:    adrp x8, .LCPI148_0
2719 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI148_0]
2720 ; GISEL-NEXT:    cmhi v0.16b, v1.16b, v0.16b
2721 ; GISEL-NEXT:    shl v0.16b, v0.16b, #7
2722 ; GISEL-NEXT:    sshr v0.16b, v0.16b, #7
2723 ; GISEL-NEXT:    ret
2724   %tmp3 = icmp ult <16 x i8> %A, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
2725   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
2726   ret <16 x i8> %tmp4
2729 ; LO implemented as HI, so check reversed operands.
2730 define <4 x i16> @cmloz4xi16(<4 x i16> %A) {
2731 ; CHECK-LABEL: cmloz4xi16:
2732 ; CHECK:       // %bb.0:
2733 ; CHECK-NEXT:    movi v1.4h, #2
2734 ; CHECK-NEXT:    cmhi v0.4h, v1.4h, v0.4h
2735 ; CHECK-NEXT:    ret
2737 ; GISEL-LABEL: cmloz4xi16:
2738 ; GISEL:       // %bb.0:
2739 ; GISEL-NEXT:    adrp x8, .LCPI149_0
2740 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI149_0]
2741 ; GISEL-NEXT:    cmhi v0.4h, v1.4h, v0.4h
2742 ; GISEL-NEXT:    shl v0.4h, v0.4h, #15
2743 ; GISEL-NEXT:    sshr v0.4h, v0.4h, #15
2744 ; GISEL-NEXT:    ret
2745   %tmp3 = icmp ult <4 x i16> %A, <i16 2, i16 2, i16 2, i16 2>
2746   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
2747   ret <4 x i16> %tmp4
2750 ; LO implemented as HI, so check reversed operands.
2751 define <8 x i16> @cmloz8xi16(<8 x i16> %A) {
2752 ; CHECK-LABEL: cmloz8xi16:
2753 ; CHECK:       // %bb.0:
2754 ; CHECK-NEXT:    movi v1.8h, #2
2755 ; CHECK-NEXT:    cmhi v0.8h, v1.8h, v0.8h
2756 ; CHECK-NEXT:    ret
2758 ; GISEL-LABEL: cmloz8xi16:
2759 ; GISEL:       // %bb.0:
2760 ; GISEL-NEXT:    adrp x8, .LCPI150_0
2761 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI150_0]
2762 ; GISEL-NEXT:    cmhi v0.8h, v1.8h, v0.8h
2763 ; GISEL-NEXT:    shl v0.8h, v0.8h, #15
2764 ; GISEL-NEXT:    sshr v0.8h, v0.8h, #15
2765 ; GISEL-NEXT:    ret
2766   %tmp3 = icmp ult <8 x i16> %A, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
2767   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
2768   ret <8 x i16> %tmp4
2771 ; LO implemented as HI, so check reversed operands.
2772 define <2 x i32> @cmloz2xi32(<2 x i32> %A) {
2773 ; CHECK-LABEL: cmloz2xi32:
2774 ; CHECK:       // %bb.0:
2775 ; CHECK-NEXT:    movi v1.2s, #2
2776 ; CHECK-NEXT:    cmhi v0.2s, v1.2s, v0.2s
2777 ; CHECK-NEXT:    ret
2779 ; GISEL-LABEL: cmloz2xi32:
2780 ; GISEL:       // %bb.0:
2781 ; GISEL-NEXT:    adrp x8, .LCPI151_0
2782 ; GISEL-NEXT:    ldr d1, [x8, :lo12:.LCPI151_0]
2783 ; GISEL-NEXT:    cmhi v0.2s, v1.2s, v0.2s
2784 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2785 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2786 ; GISEL-NEXT:    ret
2787   %tmp3 = icmp ult <2 x i32> %A, <i32 2, i32 2>
2788   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2789   ret <2 x i32> %tmp4
2792 ; LO implemented as HI, so check reversed operands.
2793 define <4 x i32> @cmloz4xi32(<4 x i32> %A) {
2794 ; CHECK-LABEL: cmloz4xi32:
2795 ; CHECK:       // %bb.0:
2796 ; CHECK-NEXT:    movi v1.4s, #2
2797 ; CHECK-NEXT:    cmhi v0.4s, v1.4s, v0.4s
2798 ; CHECK-NEXT:    ret
2800 ; GISEL-LABEL: cmloz4xi32:
2801 ; GISEL:       // %bb.0:
2802 ; GISEL-NEXT:    adrp x8, .LCPI152_0
2803 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI152_0]
2804 ; GISEL-NEXT:    cmhi v0.4s, v1.4s, v0.4s
2805 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2806 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2807 ; GISEL-NEXT:    ret
2808   %tmp3 = icmp ult <4 x i32> %A, <i32 2, i32 2, i32 2, i32 2>
2809   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2810   ret <4 x i32> %tmp4
2813 ; LO implemented as HI, so check reversed operands.
2814 define <2 x i64> @cmloz2xi64(<2 x i64> %A) {
2815 ; CHECK-LABEL: cmloz2xi64:
2816 ; CHECK:       // %bb.0:
2817 ; CHECK-NEXT:    mov w8, #2
2818 ; CHECK-NEXT:    dup v1.2d, x8
2819 ; CHECK-NEXT:    cmhi v0.2d, v1.2d, v0.2d
2820 ; CHECK-NEXT:    ret
2822 ; GISEL-LABEL: cmloz2xi64:
2823 ; GISEL:       // %bb.0:
2824 ; GISEL-NEXT:    adrp x8, .LCPI153_0
2825 ; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI153_0]
2826 ; GISEL-NEXT:    cmhi v0.2d, v1.2d, v0.2d
2827 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2828 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2829 ; GISEL-NEXT:    ret
2830   %tmp3 = icmp ult <2 x i64> %A, <i64 2, i64 2>
2831   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2832   ret <2 x i64> %tmp4
2835 define <2 x i32> @fcmoeq2xfloat(<2 x float> %A, <2 x float> %B) {
2836 ; CHECK-LABEL: fcmoeq2xfloat:
2837 ; CHECK:       // %bb.0:
2838 ; CHECK-NEXT:    fcmeq v0.2s, v0.2s, v1.2s
2839 ; CHECK-NEXT:    ret
2841 ; GISEL-LABEL: fcmoeq2xfloat:
2842 ; GISEL:       // %bb.0:
2843 ; GISEL-NEXT:    fcmeq v0.2s, v0.2s, v1.2s
2844 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2845 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2846 ; GISEL-NEXT:    ret
2847   %tmp3 = fcmp oeq <2 x float> %A, %B
2848   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2849   ret <2 x i32> %tmp4
2852 define <4 x i32> @fcmoeq4xfloat(<4 x float> %A, <4 x float> %B) {
2853 ; CHECK-LABEL: fcmoeq4xfloat:
2854 ; CHECK:       // %bb.0:
2855 ; CHECK-NEXT:    fcmeq v0.4s, v0.4s, v1.4s
2856 ; CHECK-NEXT:    ret
2858 ; GISEL-LABEL: fcmoeq4xfloat:
2859 ; GISEL:       // %bb.0:
2860 ; GISEL-NEXT:    fcmeq v0.4s, v0.4s, v1.4s
2861 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2862 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2863 ; GISEL-NEXT:    ret
2864   %tmp3 = fcmp oeq <4 x float> %A, %B
2865   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2866   ret <4 x i32> %tmp4
2868 define <2 x i64> @fcmoeq2xdouble(<2 x double> %A, <2 x double> %B) {
2869 ; CHECK-LABEL: fcmoeq2xdouble:
2870 ; CHECK:       // %bb.0:
2871 ; CHECK-NEXT:    fcmeq v0.2d, v0.2d, v1.2d
2872 ; CHECK-NEXT:    ret
2874 ; GISEL-LABEL: fcmoeq2xdouble:
2875 ; GISEL:       // %bb.0:
2876 ; GISEL-NEXT:    fcmeq v0.2d, v0.2d, v1.2d
2877 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2878 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2879 ; GISEL-NEXT:    ret
2880   %tmp3 = fcmp oeq <2 x double> %A, %B
2881   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2882   ret <2 x i64> %tmp4
2885 define <2 x i32> @fcmoge2xfloat(<2 x float> %A, <2 x float> %B) {
2886 ; CHECK-LABEL: fcmoge2xfloat:
2887 ; CHECK:       // %bb.0:
2888 ; CHECK-NEXT:    fcmge v0.2s, v0.2s, v1.2s
2889 ; CHECK-NEXT:    ret
2891 ; GISEL-LABEL: fcmoge2xfloat:
2892 ; GISEL:       // %bb.0:
2893 ; GISEL-NEXT:    fcmge v0.2s, v0.2s, v1.2s
2894 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2895 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2896 ; GISEL-NEXT:    ret
2897   %tmp3 = fcmp oge <2 x float> %A, %B
2898   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2899   ret <2 x i32> %tmp4
2902 define <4 x i32> @fcmoge4xfloat(<4 x float> %A, <4 x float> %B) {
2903 ; CHECK-LABEL: fcmoge4xfloat:
2904 ; CHECK:       // %bb.0:
2905 ; CHECK-NEXT:    fcmge v0.4s, v0.4s, v1.4s
2906 ; CHECK-NEXT:    ret
2908 ; GISEL-LABEL: fcmoge4xfloat:
2909 ; GISEL:       // %bb.0:
2910 ; GISEL-NEXT:    fcmge v0.4s, v0.4s, v1.4s
2911 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2912 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2913 ; GISEL-NEXT:    ret
2914   %tmp3 = fcmp oge <4 x float> %A, %B
2915   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2916   ret <4 x i32> %tmp4
2918 define <2 x i64> @fcmoge2xdouble(<2 x double> %A, <2 x double> %B) {
2919 ; CHECK-LABEL: fcmoge2xdouble:
2920 ; CHECK:       // %bb.0:
2921 ; CHECK-NEXT:    fcmge v0.2d, v0.2d, v1.2d
2922 ; CHECK-NEXT:    ret
2924 ; GISEL-LABEL: fcmoge2xdouble:
2925 ; GISEL:       // %bb.0:
2926 ; GISEL-NEXT:    fcmge v0.2d, v0.2d, v1.2d
2927 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2928 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2929 ; GISEL-NEXT:    ret
2930   %tmp3 = fcmp oge <2 x double> %A, %B
2931   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2932   ret <2 x i64> %tmp4
2935 define <2 x i32> @fcmogt2xfloat(<2 x float> %A, <2 x float> %B) {
2936 ; CHECK-LABEL: fcmogt2xfloat:
2937 ; CHECK:       // %bb.0:
2938 ; CHECK-NEXT:    fcmgt v0.2s, v0.2s, v1.2s
2939 ; CHECK-NEXT:    ret
2941 ; GISEL-LABEL: fcmogt2xfloat:
2942 ; GISEL:       // %bb.0:
2943 ; GISEL-NEXT:    fcmgt v0.2s, v0.2s, v1.2s
2944 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2945 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2946 ; GISEL-NEXT:    ret
2947   %tmp3 = fcmp ogt <2 x float> %A, %B
2948   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2949   ret <2 x i32> %tmp4
2952 define <4 x i32> @fcmogt4xfloat(<4 x float> %A, <4 x float> %B) {
2953 ; CHECK-LABEL: fcmogt4xfloat:
2954 ; CHECK:       // %bb.0:
2955 ; CHECK-NEXT:    fcmgt v0.4s, v0.4s, v1.4s
2956 ; CHECK-NEXT:    ret
2958 ; GISEL-LABEL: fcmogt4xfloat:
2959 ; GISEL:       // %bb.0:
2960 ; GISEL-NEXT:    fcmgt v0.4s, v0.4s, v1.4s
2961 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
2962 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
2963 ; GISEL-NEXT:    ret
2964   %tmp3 = fcmp ogt <4 x float> %A, %B
2965   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2966   ret <4 x i32> %tmp4
2968 define <2 x i64> @fcmogt2xdouble(<2 x double> %A, <2 x double> %B) {
2969 ; CHECK-LABEL: fcmogt2xdouble:
2970 ; CHECK:       // %bb.0:
2971 ; CHECK-NEXT:    fcmgt v0.2d, v0.2d, v1.2d
2972 ; CHECK-NEXT:    ret
2974 ; GISEL-LABEL: fcmogt2xdouble:
2975 ; GISEL:       // %bb.0:
2976 ; GISEL-NEXT:    fcmgt v0.2d, v0.2d, v1.2d
2977 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
2978 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
2979 ; GISEL-NEXT:    ret
2980   %tmp3 = fcmp ogt <2 x double> %A, %B
2981   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2982   ret <2 x i64> %tmp4
2985 ; OLE implemented as OGE, so check reversed operands.
2986 define <2 x i32> @fcmole2xfloat(<2 x float> %A, <2 x float> %B) {
2987 ; CHECK-LABEL: fcmole2xfloat:
2988 ; CHECK:       // %bb.0:
2989 ; CHECK-NEXT:    fcmge v0.2s, v1.2s, v0.2s
2990 ; CHECK-NEXT:    ret
2992 ; GISEL-LABEL: fcmole2xfloat:
2993 ; GISEL:       // %bb.0:
2994 ; GISEL-NEXT:    fcmge v0.2s, v1.2s, v0.2s
2995 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
2996 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
2997 ; GISEL-NEXT:    ret
2998   %tmp3 = fcmp ole <2 x float> %A, %B
2999   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3000   ret <2 x i32> %tmp4
3003 ; OLE implemented as OGE, so check reversed operands.
3004 define <4 x i32> @fcmole4xfloat(<4 x float> %A, <4 x float> %B) {
3005 ; CHECK-LABEL: fcmole4xfloat:
3006 ; CHECK:       // %bb.0:
3007 ; CHECK-NEXT:    fcmge v0.4s, v1.4s, v0.4s
3008 ; CHECK-NEXT:    ret
3010 ; GISEL-LABEL: fcmole4xfloat:
3011 ; GISEL:       // %bb.0:
3012 ; GISEL-NEXT:    fcmge v0.4s, v1.4s, v0.4s
3013 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3014 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3015 ; GISEL-NEXT:    ret
3016   %tmp3 = fcmp ole <4 x float> %A, %B
3017   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3018   ret <4 x i32> %tmp4
3021 ; OLE implemented as OGE, so check reversed operands.
3022 define <2 x i64> @fcmole2xdouble(<2 x double> %A, <2 x double> %B) {
3023 ; CHECK-LABEL: fcmole2xdouble:
3024 ; CHECK:       // %bb.0:
3025 ; CHECK-NEXT:    fcmge v0.2d, v1.2d, v0.2d
3026 ; CHECK-NEXT:    ret
3028 ; GISEL-LABEL: fcmole2xdouble:
3029 ; GISEL:       // %bb.0:
3030 ; GISEL-NEXT:    fcmge v0.2d, v1.2d, v0.2d
3031 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3032 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3033 ; GISEL-NEXT:    ret
3034   %tmp3 = fcmp ole <2 x double> %A, %B
3035   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3036   ret <2 x i64> %tmp4
3039 ; OLE implemented as OGE, so check reversed operands.
3040 define <2 x i32> @fcmolt2xfloat(<2 x float> %A, <2 x float> %B) {
3041 ; CHECK-LABEL: fcmolt2xfloat:
3042 ; CHECK:       // %bb.0:
3043 ; CHECK-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3044 ; CHECK-NEXT:    ret
3046 ; GISEL-LABEL: fcmolt2xfloat:
3047 ; GISEL:       // %bb.0:
3048 ; GISEL-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3049 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3050 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3051 ; GISEL-NEXT:    ret
3052   %tmp3 = fcmp olt <2 x float> %A, %B
3053   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3054   ret <2 x i32> %tmp4
3057 ; OLE implemented as OGE, so check reversed operands.
3058 define <4 x i32> @fcmolt4xfloat(<4 x float> %A, <4 x float> %B) {
3059 ; CHECK-LABEL: fcmolt4xfloat:
3060 ; CHECK:       // %bb.0:
3061 ; CHECK-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3062 ; CHECK-NEXT:    ret
3064 ; GISEL-LABEL: fcmolt4xfloat:
3065 ; GISEL:       // %bb.0:
3066 ; GISEL-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3067 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3068 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3069 ; GISEL-NEXT:    ret
3070   %tmp3 = fcmp olt <4 x float> %A, %B
3071   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3072   ret <4 x i32> %tmp4
3075 ; OLE implemented as OGE, so check reversed operands.
3076 define <2 x i64> @fcmolt2xdouble(<2 x double> %A, <2 x double> %B) {
3077 ; CHECK-LABEL: fcmolt2xdouble:
3078 ; CHECK:       // %bb.0:
3079 ; CHECK-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3080 ; CHECK-NEXT:    ret
3082 ; GISEL-LABEL: fcmolt2xdouble:
3083 ; GISEL:       // %bb.0:
3084 ; GISEL-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3085 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3086 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3087 ; GISEL-NEXT:    ret
3088   %tmp3 = fcmp olt <2 x double> %A, %B
3089   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3090   ret <2 x i64> %tmp4
3093 ; ONE = OGT | OLT, OLT implemented as OGT so check reversed operands
3094 define <2 x i32> @fcmone2xfloat(<2 x float> %A, <2 x float> %B) {
3095 ; CHECK-LABEL: fcmone2xfloat:
3096 ; CHECK:       // %bb.0:
3097 ; CHECK-NEXT:    fcmgt v2.2s, v0.2s, v1.2s
3098 ; CHECK-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3099 ; CHECK-NEXT:    orr v0.8b, v0.8b, v2.8b
3100 ; CHECK-NEXT:    ret
3102 ; GISEL-LABEL: fcmone2xfloat:
3103 ; GISEL:       // %bb.0:
3104 ; GISEL-NEXT:    fcmgt v2.2s, v0.2s, v1.2s
3105 ; GISEL-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3106 ; GISEL-NEXT:    orr v0.8b, v0.8b, v2.8b
3107 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3108 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3109 ; GISEL-NEXT:    ret
3110   %tmp3 = fcmp one <2 x float> %A, %B
3111   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3112   ret <2 x i32> %tmp4
3115 ; ONE = OGT | OLT, OLT implemented as OGT so check reversed operands
3116 define <4 x i32> @fcmone4xfloat(<4 x float> %A, <4 x float> %B) {
3117 ; CHECK-LABEL: fcmone4xfloat:
3118 ; CHECK:       // %bb.0:
3119 ; CHECK-NEXT:    fcmgt v2.4s, v0.4s, v1.4s
3120 ; CHECK-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3121 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3122 ; CHECK-NEXT:    ret
3124 ; GISEL-LABEL: fcmone4xfloat:
3125 ; GISEL:       // %bb.0:
3126 ; GISEL-NEXT:    fcmgt v2.4s, v0.4s, v1.4s
3127 ; GISEL-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3128 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3129 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3130 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3131 ; GISEL-NEXT:    ret
3132   %tmp3 = fcmp one <4 x float> %A, %B
3133   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3134   ret <4 x i32> %tmp4
3137 ; ONE = OGT | OLT, OLT implemented as OGT so check reversed operands
3138 ; todo check reversed operands
3139 define <2 x i64> @fcmone2xdouble(<2 x double> %A, <2 x double> %B) {
3140 ; CHECK-LABEL: fcmone2xdouble:
3141 ; CHECK:       // %bb.0:
3142 ; CHECK-NEXT:    fcmgt v2.2d, v0.2d, v1.2d
3143 ; CHECK-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3144 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3145 ; CHECK-NEXT:    ret
3147 ; GISEL-LABEL: fcmone2xdouble:
3148 ; GISEL:       // %bb.0:
3149 ; GISEL-NEXT:    fcmgt v2.2d, v0.2d, v1.2d
3150 ; GISEL-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3151 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3152 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3153 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3154 ; GISEL-NEXT:    ret
3155   %tmp3 = fcmp one <2 x double> %A, %B
3156   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3157   ret <2 x i64> %tmp4
3160 ; ORD = OGE | OLT, OLT implemented as OGT, so check reversed operands.
3161 define <2 x i32> @fcmord2xfloat(<2 x float> %A, <2 x float> %B) {
3162 ; CHECK-LABEL: fcmord2xfloat:
3163 ; CHECK:       // %bb.0:
3164 ; CHECK-NEXT:    fcmge v2.2s, v0.2s, v1.2s
3165 ; CHECK-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3166 ; CHECK-NEXT:    orr v0.8b, v0.8b, v2.8b
3167 ; CHECK-NEXT:    ret
3169 ; GISEL-LABEL: fcmord2xfloat:
3170 ; GISEL:       // %bb.0:
3171 ; GISEL-NEXT:    fcmge v2.2s, v0.2s, v1.2s
3172 ; GISEL-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3173 ; GISEL-NEXT:    orr v0.8b, v0.8b, v2.8b
3174 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3175 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3176 ; GISEL-NEXT:    ret
3177   %tmp3 = fcmp ord <2 x float> %A, %B
3178   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3179   ret <2 x i32> %tmp4
3182 ; ORD = OGE | OLT, OLT implemented as OGT, so check reversed operands.
3183 define <4 x i32> @fcmord4xfloat(<4 x float> %A, <4 x float> %B) {
3184 ; CHECK-LABEL: fcmord4xfloat:
3185 ; CHECK:       // %bb.0:
3186 ; CHECK-NEXT:    fcmge v2.4s, v0.4s, v1.4s
3187 ; CHECK-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3188 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3189 ; CHECK-NEXT:    ret
3191 ; GISEL-LABEL: fcmord4xfloat:
3192 ; GISEL:       // %bb.0:
3193 ; GISEL-NEXT:    fcmge v2.4s, v0.4s, v1.4s
3194 ; GISEL-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3195 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3196 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3197 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3198 ; GISEL-NEXT:    ret
3199   %tmp3 = fcmp ord <4 x float> %A, %B
3200   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3201   ret <4 x i32> %tmp4
3204 ; ORD = OGE | OLT, OLT implemented as OGT, so check reversed operands.
3205 define <2 x i64> @fcmord2xdouble(<2 x double> %A, <2 x double> %B) {
3206 ; CHECK-LABEL: fcmord2xdouble:
3207 ; CHECK:       // %bb.0:
3208 ; CHECK-NEXT:    fcmge v2.2d, v0.2d, v1.2d
3209 ; CHECK-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3210 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3211 ; CHECK-NEXT:    ret
3213 ; GISEL-LABEL: fcmord2xdouble:
3214 ; GISEL:       // %bb.0:
3215 ; GISEL-NEXT:    fcmge v2.2d, v0.2d, v1.2d
3216 ; GISEL-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3217 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3218 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3219 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3220 ; GISEL-NEXT:    ret
3221   %tmp3 = fcmp ord <2 x double> %A, %B
3222   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3223   ret <2 x i64> %tmp4
3227 ; UNO = !(OGE | OLT), OLT implemented as OGT, so check reversed operands.
3228 define <2 x i32> @fcmuno2xfloat(<2 x float> %A, <2 x float> %B) {
3229 ; CHECK-LABEL: fcmuno2xfloat:
3230 ; CHECK:       // %bb.0:
3231 ; CHECK-NEXT:    fcmge v2.2s, v0.2s, v1.2s
3232 ; CHECK-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3233 ; CHECK-NEXT:    orr v0.8b, v0.8b, v2.8b
3234 ; CHECK-NEXT:    mvn v0.8b, v0.8b
3235 ; CHECK-NEXT:    ret
3237 ; GISEL-LABEL: fcmuno2xfloat:
3238 ; GISEL:       // %bb.0:
3239 ; GISEL-NEXT:    fcmge v2.2s, v0.2s, v1.2s
3240 ; GISEL-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3241 ; GISEL-NEXT:    orr v0.8b, v0.8b, v2.8b
3242 ; GISEL-NEXT:    mvn v0.8b, v0.8b
3243 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3244 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3245 ; GISEL-NEXT:    ret
3246   %tmp3 = fcmp uno <2 x float> %A, %B
3247   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3248   ret <2 x i32> %tmp4
3251 ; UNO = !(OGE | OLT), OLT implemented as OGT, so check reversed operands.
3252 define <4 x i32> @fcmuno4xfloat(<4 x float> %A, <4 x float> %B) {
3253 ; CHECK-LABEL: fcmuno4xfloat:
3254 ; CHECK:       // %bb.0:
3255 ; CHECK-NEXT:    fcmge v2.4s, v0.4s, v1.4s
3256 ; CHECK-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3257 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3258 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3259 ; CHECK-NEXT:    ret
3261 ; GISEL-LABEL: fcmuno4xfloat:
3262 ; GISEL:       // %bb.0:
3263 ; GISEL-NEXT:    fcmge v2.4s, v0.4s, v1.4s
3264 ; GISEL-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3265 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3266 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3267 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3268 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3269 ; GISEL-NEXT:    ret
3270   %tmp3 = fcmp uno <4 x float> %A, %B
3271   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3272   ret <4 x i32> %tmp4
3275 ; UNO = !(OGE | OLT), OLT implemented as OGT, so check reversed operands.
3276 define <2 x i64> @fcmuno2xdouble(<2 x double> %A, <2 x double> %B) {
3277 ; CHECK-LABEL: fcmuno2xdouble:
3278 ; CHECK:       // %bb.0:
3279 ; CHECK-NEXT:    fcmge v2.2d, v0.2d, v1.2d
3280 ; CHECK-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3281 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3282 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3283 ; CHECK-NEXT:    ret
3285 ; GISEL-LABEL: fcmuno2xdouble:
3286 ; GISEL:       // %bb.0:
3287 ; GISEL-NEXT:    fcmge v2.2d, v0.2d, v1.2d
3288 ; GISEL-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3289 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3290 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3291 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3292 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3293 ; GISEL-NEXT:    ret
3294   %tmp3 = fcmp uno <2 x double> %A, %B
3295   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3296   ret <2 x i64> %tmp4
3299 ; UEQ = !ONE = !(OGT | OLT), OLT implemented as OGT so check reversed operands
3300 define <2 x i32> @fcmueq2xfloat(<2 x float> %A, <2 x float> %B) {
3301 ; CHECK-LABEL: fcmueq2xfloat:
3302 ; CHECK:       // %bb.0:
3303 ; CHECK-NEXT:    fcmgt v2.2s, v0.2s, v1.2s
3304 ; CHECK-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3305 ; CHECK-NEXT:    orr v0.8b, v0.8b, v2.8b
3306 ; CHECK-NEXT:    mvn v0.8b, v0.8b
3307 ; CHECK-NEXT:    ret
3309 ; GISEL-LABEL: fcmueq2xfloat:
3310 ; GISEL:       // %bb.0:
3311 ; GISEL-NEXT:    fcmgt v2.2s, v0.2s, v1.2s
3312 ; GISEL-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3313 ; GISEL-NEXT:    orr v0.8b, v0.8b, v2.8b
3314 ; GISEL-NEXT:    mvn v0.8b, v0.8b
3315 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3316 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3317 ; GISEL-NEXT:    ret
3318   %tmp3 = fcmp ueq <2 x float> %A, %B
3319   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3320   ret <2 x i32> %tmp4
3323 ; UEQ = !ONE = !(OGT | OLT), OLT implemented as OGT so check reversed operands
3324 define <4 x i32> @fcmueq4xfloat(<4 x float> %A, <4 x float> %B) {
3325 ; CHECK-LABEL: fcmueq4xfloat:
3326 ; CHECK:       // %bb.0:
3327 ; CHECK-NEXT:    fcmgt v2.4s, v0.4s, v1.4s
3328 ; CHECK-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3329 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3330 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3331 ; CHECK-NEXT:    ret
3333 ; GISEL-LABEL: fcmueq4xfloat:
3334 ; GISEL:       // %bb.0:
3335 ; GISEL-NEXT:    fcmgt v2.4s, v0.4s, v1.4s
3336 ; GISEL-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3337 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3338 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3339 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3340 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3341 ; GISEL-NEXT:    ret
3342   %tmp3 = fcmp ueq <4 x float> %A, %B
3343   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3344   ret <4 x i32> %tmp4
3347 ; UEQ = !ONE = !(OGT | OLT), OLT implemented as OGT so check reversed operands
3348 define <2 x i64> @fcmueq2xdouble(<2 x double> %A, <2 x double> %B) {
3349 ; CHECK-LABEL: fcmueq2xdouble:
3350 ; CHECK:       // %bb.0:
3351 ; CHECK-NEXT:    fcmgt v2.2d, v0.2d, v1.2d
3352 ; CHECK-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3353 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
3354 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3355 ; CHECK-NEXT:    ret
3357 ; GISEL-LABEL: fcmueq2xdouble:
3358 ; GISEL:       // %bb.0:
3359 ; GISEL-NEXT:    fcmgt v2.2d, v0.2d, v1.2d
3360 ; GISEL-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3361 ; GISEL-NEXT:    orr v0.16b, v0.16b, v2.16b
3362 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3363 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3364 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3365 ; GISEL-NEXT:    ret
3366   %tmp3 = fcmp ueq <2 x double> %A, %B
3367   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3368   ret <2 x i64> %tmp4
3371 ; UGE = ULE with swapped operands, ULE implemented as !OGT.
3372 define <2 x i32> @fcmuge2xfloat(<2 x float> %A, <2 x float> %B) {
3373 ; CHECK-LABEL: fcmuge2xfloat:
3374 ; CHECK:       // %bb.0:
3375 ; CHECK-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3376 ; CHECK-NEXT:    mvn v0.8b, v0.8b
3377 ; CHECK-NEXT:    ret
3379 ; GISEL-LABEL: fcmuge2xfloat:
3380 ; GISEL:       // %bb.0:
3381 ; GISEL-NEXT:    fcmgt v0.2s, v1.2s, v0.2s
3382 ; GISEL-NEXT:    mvn v0.8b, v0.8b
3383 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3384 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3385 ; GISEL-NEXT:    ret
3386   %tmp3 = fcmp uge <2 x float> %A, %B
3387   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3388   ret <2 x i32> %tmp4
3391 ; UGE = ULE with swapped operands, ULE implemented as !OGT.
3392 define <4 x i32> @fcmuge4xfloat(<4 x float> %A, <4 x float> %B) {
3393 ; CHECK-LABEL: fcmuge4xfloat:
3394 ; CHECK:       // %bb.0:
3395 ; CHECK-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3396 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3397 ; CHECK-NEXT:    ret
3399 ; GISEL-LABEL: fcmuge4xfloat:
3400 ; GISEL:       // %bb.0:
3401 ; GISEL-NEXT:    fcmgt v0.4s, v1.4s, v0.4s
3402 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3403 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3404 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3405 ; GISEL-NEXT:    ret
3406   %tmp3 = fcmp uge <4 x float> %A, %B
3407   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3408   ret <4 x i32> %tmp4
3411 ; UGE = ULE with swapped operands, ULE implemented as !OGT.
3412 define <2 x i64> @fcmuge2xdouble(<2 x double> %A, <2 x double> %B) {
3413 ; CHECK-LABEL: fcmuge2xdouble:
3414 ; CHECK:       // %bb.0:
3415 ; CHECK-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3416 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3417 ; CHECK-NEXT:    ret
3419 ; GISEL-LABEL: fcmuge2xdouble:
3420 ; GISEL:       // %bb.0:
3421 ; GISEL-NEXT:    fcmgt v0.2d, v1.2d, v0.2d
3422 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3423 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3424 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3425 ; GISEL-NEXT:    ret
3426   %tmp3 = fcmp uge <2 x double> %A, %B
3427   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3428   ret <2 x i64> %tmp4
3431 ; UGT = ULT with swapped operands, ULT implemented as !OGE.
3432 define <2 x i32> @fcmugt2xfloat(<2 x float> %A, <2 x float> %B) {
3433 ; CHECK-LABEL: fcmugt2xfloat:
3434 ; CHECK:       // %bb.0:
3435 ; CHECK-NEXT:    fcmge v0.2s, v1.2s, v0.2s
3436 ; CHECK-NEXT:    mvn v0.8b, v0.8b
3437 ; CHECK-NEXT:    ret
3439 ; GISEL-LABEL: fcmugt2xfloat:
3440 ; GISEL:       // %bb.0:
3441 ; GISEL-NEXT:    fcmge v0.2s, v1.2s, v0.2s
3442 ; GISEL-NEXT:    mvn v0.8b, v0.8b
3443 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3444 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3445 ; GISEL-NEXT:    ret
3446   %tmp3 = fcmp ugt <2 x float> %A, %B
3447   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3448   ret <2 x i32> %tmp4
3451 ; UGT = ULT with swapped operands, ULT implemented as !OGE.
3452 define <4 x i32> @fcmugt4xfloat(<4 x float> %A, <4 x float> %B) {
3453 ; CHECK-LABEL: fcmugt4xfloat:
3454 ; CHECK:       // %bb.0:
3455 ; CHECK-NEXT:    fcmge v0.4s, v1.4s, v0.4s
3456 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3457 ; CHECK-NEXT:    ret
3459 ; GISEL-LABEL: fcmugt4xfloat:
3460 ; GISEL:       // %bb.0:
3461 ; GISEL-NEXT:    fcmge v0.4s, v1.4s, v0.4s
3462 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3463 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3464 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3465 ; GISEL-NEXT:    ret
3466   %tmp3 = fcmp ugt <4 x float> %A, %B
3467   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3468   ret <4 x i32> %tmp4
3471 define <2 x i64> @fcmugt2xdouble(<2 x double> %A, <2 x double> %B) {
3472 ; CHECK-LABEL: fcmugt2xdouble:
3473 ; CHECK:       // %bb.0:
3474 ; CHECK-NEXT:    fcmge v0.2d, v1.2d, v0.2d
3475 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3476 ; CHECK-NEXT:    ret
3478 ; GISEL-LABEL: fcmugt2xdouble:
3479 ; GISEL:       // %bb.0:
3480 ; GISEL-NEXT:    fcmge v0.2d, v1.2d, v0.2d
3481 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3482 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3483 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3484 ; GISEL-NEXT:    ret
3485   %tmp3 = fcmp ugt <2 x double> %A, %B
3486   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3487   ret <2 x i64> %tmp4
3490 ; ULE implemented as !OGT.
3491 define <2 x i32> @fcmule2xfloat(<2 x float> %A, <2 x float> %B) {
3492 ; CHECK-LABEL: fcmule2xfloat:
3493 ; CHECK:       // %bb.0:
3494 ; CHECK-NEXT:    fcmgt v0.2s, v0.2s, v1.2s
3495 ; CHECK-NEXT:    mvn v0.8b, v0.8b
3496 ; CHECK-NEXT:    ret
3498 ; GISEL-LABEL: fcmule2xfloat:
3499 ; GISEL:       // %bb.0:
3500 ; GISEL-NEXT:    fcmgt v0.2s, v0.2s, v1.2s
3501 ; GISEL-NEXT:    mvn v0.8b, v0.8b
3502 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3503 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3504 ; GISEL-NEXT:    ret
3505   %tmp3 = fcmp ule <2 x float> %A, %B
3506   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3507   ret <2 x i32> %tmp4
3510 ; ULE implemented as !OGT.
3511 define <4 x i32> @fcmule4xfloat(<4 x float> %A, <4 x float> %B) {
3512 ; CHECK-LABEL: fcmule4xfloat:
3513 ; CHECK:       // %bb.0:
3514 ; CHECK-NEXT:    fcmgt v0.4s, v0.4s, v1.4s
3515 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3516 ; CHECK-NEXT:    ret
3518 ; GISEL-LABEL: fcmule4xfloat:
3519 ; GISEL:       // %bb.0:
3520 ; GISEL-NEXT:    fcmgt v0.4s, v0.4s, v1.4s
3521 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3522 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3523 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3524 ; GISEL-NEXT:    ret
3525   %tmp3 = fcmp ule <4 x float> %A, %B
3526   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3527   ret <4 x i32> %tmp4
3530 ; ULE implemented as !OGT.
3531 define <2 x i64> @fcmule2xdouble(<2 x double> %A, <2 x double> %B) {
3532 ; CHECK-LABEL: fcmule2xdouble:
3533 ; CHECK:       // %bb.0:
3534 ; CHECK-NEXT:    fcmgt v0.2d, v0.2d, v1.2d
3535 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3536 ; CHECK-NEXT:    ret
3538 ; GISEL-LABEL: fcmule2xdouble:
3539 ; GISEL:       // %bb.0:
3540 ; GISEL-NEXT:    fcmgt v0.2d, v0.2d, v1.2d
3541 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3542 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3543 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3544 ; GISEL-NEXT:    ret
3545   %tmp3 = fcmp ule <2 x double> %A, %B
3546   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3547   ret <2 x i64> %tmp4
3550 ; ULT implemented as !OGE.
3551 define <2 x i32> @fcmult2xfloat(<2 x float> %A, <2 x float> %B) {
3552 ; CHECK-LABEL: fcmult2xfloat:
3553 ; CHECK:       // %bb.0:
3554 ; CHECK-NEXT:    fcmge v0.2s, v0.2s, v1.2s
3555 ; CHECK-NEXT:    mvn v0.8b, v0.8b
3556 ; CHECK-NEXT:    ret
3558 ; GISEL-LABEL: fcmult2xfloat:
3559 ; GISEL:       // %bb.0:
3560 ; GISEL-NEXT:    fcmge v0.2s, v0.2s, v1.2s
3561 ; GISEL-NEXT:    mvn v0.8b, v0.8b
3562 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3563 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3564 ; GISEL-NEXT:    ret
3565   %tmp3 = fcmp ult <2 x float> %A, %B
3566   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3567   ret <2 x i32> %tmp4
3570 ; ULT implemented as !OGE.
3571 define <4 x i32> @fcmult4xfloat(<4 x float> %A, <4 x float> %B) {
3572 ; CHECK-LABEL: fcmult4xfloat:
3573 ; CHECK:       // %bb.0:
3574 ; CHECK-NEXT:    fcmge v0.4s, v0.4s, v1.4s
3575 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3576 ; CHECK-NEXT:    ret
3578 ; GISEL-LABEL: fcmult4xfloat:
3579 ; GISEL:       // %bb.0:
3580 ; GISEL-NEXT:    fcmge v0.4s, v0.4s, v1.4s
3581 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3582 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3583 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3584 ; GISEL-NEXT:    ret
3585   %tmp3 = fcmp ult <4 x float> %A, %B
3586   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3587   ret <4 x i32> %tmp4
3590 ; ULT implemented as !OGE.
3591 define <2 x i64> @fcmult2xdouble(<2 x double> %A, <2 x double> %B) {
3592 ; CHECK-LABEL: fcmult2xdouble:
3593 ; CHECK:       // %bb.0:
3594 ; CHECK-NEXT:    fcmge v0.2d, v0.2d, v1.2d
3595 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3596 ; CHECK-NEXT:    ret
3598 ; GISEL-LABEL: fcmult2xdouble:
3599 ; GISEL:       // %bb.0:
3600 ; GISEL-NEXT:    fcmge v0.2d, v0.2d, v1.2d
3601 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3602 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3603 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3604 ; GISEL-NEXT:    ret
3605   %tmp3 = fcmp ult <2 x double> %A, %B
3606   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3607   ret <2 x i64> %tmp4
3610 ; UNE = !OEQ.
3611 define <2 x i32> @fcmune2xfloat(<2 x float> %A, <2 x float> %B) {
3612 ; CHECK-LABEL: fcmune2xfloat:
3613 ; CHECK:       // %bb.0:
3614 ; CHECK-NEXT:    fcmeq v0.2s, v0.2s, v1.2s
3615 ; CHECK-NEXT:    mvn v0.8b, v0.8b
3616 ; CHECK-NEXT:    ret
3618 ; GISEL-LABEL: fcmune2xfloat:
3619 ; GISEL:       // %bb.0:
3620 ; GISEL-NEXT:    fcmeq v0.2s, v0.2s, v1.2s
3621 ; GISEL-NEXT:    mvn v0.8b, v0.8b
3622 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3623 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3624 ; GISEL-NEXT:    ret
3625   %tmp3 = fcmp une <2 x float> %A, %B
3626   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3627   ret <2 x i32> %tmp4
3630 ; UNE = !OEQ.
3631 define <4 x i32> @fcmune4xfloat(<4 x float> %A, <4 x float> %B) {
3632 ; CHECK-LABEL: fcmune4xfloat:
3633 ; CHECK:       // %bb.0:
3634 ; CHECK-NEXT:    fcmeq v0.4s, v0.4s, v1.4s
3635 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3636 ; CHECK-NEXT:    ret
3638 ; GISEL-LABEL: fcmune4xfloat:
3639 ; GISEL:       // %bb.0:
3640 ; GISEL-NEXT:    fcmeq v0.4s, v0.4s, v1.4s
3641 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3642 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3643 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3644 ; GISEL-NEXT:    ret
3645   %tmp3 = fcmp une <4 x float> %A, %B
3646   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3647   ret <4 x i32> %tmp4
3650 ; UNE = !OEQ.
3651 define <2 x i64> @fcmune2xdouble(<2 x double> %A, <2 x double> %B) {
3652 ; CHECK-LABEL: fcmune2xdouble:
3653 ; CHECK:       // %bb.0:
3654 ; CHECK-NEXT:    fcmeq v0.2d, v0.2d, v1.2d
3655 ; CHECK-NEXT:    mvn v0.16b, v0.16b
3656 ; CHECK-NEXT:    ret
3658 ; GISEL-LABEL: fcmune2xdouble:
3659 ; GISEL:       // %bb.0:
3660 ; GISEL-NEXT:    fcmeq v0.2d, v0.2d, v1.2d
3661 ; GISEL-NEXT:    mvn v0.16b, v0.16b
3662 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3663 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3664 ; GISEL-NEXT:    ret
3665   %tmp3 = fcmp une <2 x double> %A, %B
3666   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3667   ret <2 x i64> %tmp4
3670 define <2 x i32> @fcmoeqz2xfloat(<2 x float> %A) {
3671 ; CHECK-LABEL: fcmoeqz2xfloat:
3672 ; CHECK:       // %bb.0:
3673 ; CHECK-NEXT:    fcmeq v0.2s, v0.2s, #0.0
3674 ; CHECK-NEXT:    ret
3676 ; GISEL-LABEL: fcmoeqz2xfloat:
3677 ; GISEL:       // %bb.0:
3678 ; GISEL-NEXT:    fcmeq v0.2s, v0.2s, #0.0
3679 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3680 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3681 ; GISEL-NEXT:    ret
3682   %tmp3 = fcmp oeq <2 x float> %A, zeroinitializer
3683   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3684   ret <2 x i32> %tmp4
3687 define <4 x i32> @fcmoeqz4xfloat(<4 x float> %A) {
3688 ; CHECK-LABEL: fcmoeqz4xfloat:
3689 ; CHECK:       // %bb.0:
3690 ; CHECK-NEXT:    fcmeq v0.4s, v0.4s, #0.0
3691 ; CHECK-NEXT:    ret
3693 ; GISEL-LABEL: fcmoeqz4xfloat:
3694 ; GISEL:       // %bb.0:
3695 ; GISEL-NEXT:    fcmeq v0.4s, v0.4s, #0.0
3696 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3697 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3698 ; GISEL-NEXT:    ret
3699   %tmp3 = fcmp oeq <4 x float> %A, zeroinitializer
3700   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3701   ret <4 x i32> %tmp4
3703 define <2 x i64> @fcmoeqz2xdouble(<2 x double> %A) {
3704 ; CHECK-LABEL: fcmoeqz2xdouble:
3705 ; CHECK:       // %bb.0:
3706 ; CHECK-NEXT:    fcmeq v0.2d, v0.2d, #0.0
3707 ; CHECK-NEXT:    ret
3709 ; GISEL-LABEL: fcmoeqz2xdouble:
3710 ; GISEL:       // %bb.0:
3711 ; GISEL-NEXT:    fcmeq v0.2d, v0.2d, #0.0
3712 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3713 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3714 ; GISEL-NEXT:    ret
3715   %tmp3 = fcmp oeq <2 x double> %A, zeroinitializer
3716   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3717   ret <2 x i64> %tmp4
3721 define <2 x i32> @fcmogez2xfloat(<2 x float> %A) {
3722 ; CHECK-LABEL: fcmogez2xfloat:
3723 ; CHECK:       // %bb.0:
3724 ; CHECK-NEXT:    fcmge v0.2s, v0.2s, #0.0
3725 ; CHECK-NEXT:    ret
3727 ; GISEL-LABEL: fcmogez2xfloat:
3728 ; GISEL:       // %bb.0:
3729 ; GISEL-NEXT:    fcmge v0.2s, v0.2s, #0.0
3730 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3731 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3732 ; GISEL-NEXT:    ret
3733   %tmp3 = fcmp oge <2 x float> %A, zeroinitializer
3734   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3735   ret <2 x i32> %tmp4
3738 define <4 x i32> @fcmogez4xfloat(<4 x float> %A) {
3739 ; CHECK-LABEL: fcmogez4xfloat:
3740 ; CHECK:       // %bb.0:
3741 ; CHECK-NEXT:    fcmge v0.4s, v0.4s, #0.0
3742 ; CHECK-NEXT:    ret
3744 ; GISEL-LABEL: fcmogez4xfloat:
3745 ; GISEL:       // %bb.0:
3746 ; GISEL-NEXT:    fcmge v0.4s, v0.4s, #0.0
3747 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3748 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3749 ; GISEL-NEXT:    ret
3750   %tmp3 = fcmp oge <4 x float> %A, zeroinitializer
3751   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3752   ret <4 x i32> %tmp4
3754 define <2 x i64> @fcmogez2xdouble(<2 x double> %A) {
3755 ; CHECK-LABEL: fcmogez2xdouble:
3756 ; CHECK:       // %bb.0:
3757 ; CHECK-NEXT:    fcmge v0.2d, v0.2d, #0.0
3758 ; CHECK-NEXT:    ret
3760 ; GISEL-LABEL: fcmogez2xdouble:
3761 ; GISEL:       // %bb.0:
3762 ; GISEL-NEXT:    fcmge v0.2d, v0.2d, #0.0
3763 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3764 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3765 ; GISEL-NEXT:    ret
3766   %tmp3 = fcmp oge <2 x double> %A, zeroinitializer
3767   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3768   ret <2 x i64> %tmp4
3771 define <2 x i32> @fcmogtz2xfloat(<2 x float> %A) {
3772 ; CHECK-LABEL: fcmogtz2xfloat:
3773 ; CHECK:       // %bb.0:
3774 ; CHECK-NEXT:    fcmgt v0.2s, v0.2s, #0.0
3775 ; CHECK-NEXT:    ret
3777 ; GISEL-LABEL: fcmogtz2xfloat:
3778 ; GISEL:       // %bb.0:
3779 ; GISEL-NEXT:    fcmgt v0.2s, v0.2s, #0.0
3780 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3781 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3782 ; GISEL-NEXT:    ret
3783   %tmp3 = fcmp ogt <2 x float> %A, zeroinitializer
3784   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3785   ret <2 x i32> %tmp4
3788 define <4 x i32> @fcmogtz4xfloat(<4 x float> %A) {
3789 ; CHECK-LABEL: fcmogtz4xfloat:
3790 ; CHECK:       // %bb.0:
3791 ; CHECK-NEXT:    fcmgt v0.4s, v0.4s, #0.0
3792 ; CHECK-NEXT:    ret
3794 ; GISEL-LABEL: fcmogtz4xfloat:
3795 ; GISEL:       // %bb.0:
3796 ; GISEL-NEXT:    fcmgt v0.4s, v0.4s, #0.0
3797 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3798 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3799 ; GISEL-NEXT:    ret
3800   %tmp3 = fcmp ogt <4 x float> %A, zeroinitializer
3801   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3802   ret <4 x i32> %tmp4
3804 define <2 x i64> @fcmogtz2xdouble(<2 x double> %A) {
3805 ; CHECK-LABEL: fcmogtz2xdouble:
3806 ; CHECK:       // %bb.0:
3807 ; CHECK-NEXT:    fcmgt v0.2d, v0.2d, #0.0
3808 ; CHECK-NEXT:    ret
3810 ; GISEL-LABEL: fcmogtz2xdouble:
3811 ; GISEL:       // %bb.0:
3812 ; GISEL-NEXT:    fcmgt v0.2d, v0.2d, #0.0
3813 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3814 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3815 ; GISEL-NEXT:    ret
3816   %tmp3 = fcmp ogt <2 x double> %A, zeroinitializer
3817   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3818   ret <2 x i64> %tmp4
3821 define <2 x i32> @fcmoltz2xfloat(<2 x float> %A) {
3822 ; CHECK-LABEL: fcmoltz2xfloat:
3823 ; CHECK:       // %bb.0:
3824 ; CHECK-NEXT:    fcmlt v0.2s, v0.2s, #0.0
3825 ; CHECK-NEXT:    ret
3827 ; GISEL-LABEL: fcmoltz2xfloat:
3828 ; GISEL:       // %bb.0:
3829 ; GISEL-NEXT:    fcmlt v0.2s, v0.2s, #0.0
3830 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3831 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3832 ; GISEL-NEXT:    ret
3833   %tmp3 = fcmp olt <2 x float> %A, zeroinitializer
3834   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3835   ret <2 x i32> %tmp4
3838 define <4 x i32> @fcmoltz4xfloat(<4 x float> %A) {
3839 ; CHECK-LABEL: fcmoltz4xfloat:
3840 ; CHECK:       // %bb.0:
3841 ; CHECK-NEXT:    fcmlt v0.4s, v0.4s, #0.0
3842 ; CHECK-NEXT:    ret
3844 ; GISEL-LABEL: fcmoltz4xfloat:
3845 ; GISEL:       // %bb.0:
3846 ; GISEL-NEXT:    fcmlt v0.4s, v0.4s, #0.0
3847 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3848 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3849 ; GISEL-NEXT:    ret
3850   %tmp3 = fcmp olt <4 x float> %A, zeroinitializer
3851   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3852   ret <4 x i32> %tmp4
3855 define <2 x i64> @fcmoltz2xdouble(<2 x double> %A) {
3856 ; CHECK-LABEL: fcmoltz2xdouble:
3857 ; CHECK:       // %bb.0:
3858 ; CHECK-NEXT:    fcmlt v0.2d, v0.2d, #0.0
3859 ; CHECK-NEXT:    ret
3861 ; GISEL-LABEL: fcmoltz2xdouble:
3862 ; GISEL:       // %bb.0:
3863 ; GISEL-NEXT:    fcmlt v0.2d, v0.2d, #0.0
3864 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3865 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3866 ; GISEL-NEXT:    ret
3867   %tmp3 = fcmp olt <2 x double> %A, zeroinitializer
3868   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3869   ret <2 x i64> %tmp4
3872 define <2 x i32> @fcmolez2xfloat(<2 x float> %A) {
3873 ; CHECK-LABEL: fcmolez2xfloat:
3874 ; CHECK:       // %bb.0:
3875 ; CHECK-NEXT:    fcmle v0.2s, v0.2s, #0.0
3876 ; CHECK-NEXT:    ret
3878 ; GISEL-LABEL: fcmolez2xfloat:
3879 ; GISEL:       // %bb.0:
3880 ; GISEL-NEXT:    fcmle v0.2s, v0.2s, #0.0
3881 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3882 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3883 ; GISEL-NEXT:    ret
3884   %tmp3 = fcmp ole <2 x float> %A, zeroinitializer
3885   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3886   ret <2 x i32> %tmp4
3889 define <4 x i32> @fcmolez4xfloat(<4 x float> %A) {
3890 ; CHECK-LABEL: fcmolez4xfloat:
3891 ; CHECK:       // %bb.0:
3892 ; CHECK-NEXT:    fcmle v0.4s, v0.4s, #0.0
3893 ; CHECK-NEXT:    ret
3895 ; GISEL-LABEL: fcmolez4xfloat:
3896 ; GISEL:       // %bb.0:
3897 ; GISEL-NEXT:    fcmle v0.4s, v0.4s, #0.0
3898 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3899 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3900 ; GISEL-NEXT:    ret
3901   %tmp3 = fcmp ole <4 x float> %A, zeroinitializer
3902   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3903   ret <4 x i32> %tmp4
3906 define <2 x i64> @fcmolez2xdouble(<2 x double> %A) {
3907 ; CHECK-LABEL: fcmolez2xdouble:
3908 ; CHECK:       // %bb.0:
3909 ; CHECK-NEXT:    fcmle v0.2d, v0.2d, #0.0
3910 ; CHECK-NEXT:    ret
3912 ; GISEL-LABEL: fcmolez2xdouble:
3913 ; GISEL:       // %bb.0:
3914 ; GISEL-NEXT:    fcmle v0.2d, v0.2d, #0.0
3915 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3916 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3917 ; GISEL-NEXT:    ret
3918   %tmp3 = fcmp ole <2 x double> %A, zeroinitializer
3919   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3920   ret <2 x i64> %tmp4
3923 ; ONE with zero = OLT | OGT
3924 define <2 x i32> @fcmonez2xfloat(<2 x float> %A) {
3925 ; CHECK-LABEL: fcmonez2xfloat:
3926 ; CHECK:       // %bb.0:
3927 ; CHECK-NEXT:    fcmgt v1.2s, v0.2s, #0.0
3928 ; CHECK-NEXT:    fcmlt v0.2s, v0.2s, #0.0
3929 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
3930 ; CHECK-NEXT:    ret
3932 ; GISEL-LABEL: fcmonez2xfloat:
3933 ; GISEL:       // %bb.0:
3934 ; GISEL-NEXT:    fcmgt v1.2s, v0.2s, #0.0
3935 ; GISEL-NEXT:    fcmlt v0.2s, v0.2s, #0.0
3936 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
3937 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
3938 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
3939 ; GISEL-NEXT:    ret
3940   %tmp3 = fcmp one <2 x float> %A, zeroinitializer
3941   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
3942   ret <2 x i32> %tmp4
3945 ; ONE with zero = OLT | OGT
3946 define <4 x i32> @fcmonez4xfloat(<4 x float> %A) {
3947 ; CHECK-LABEL: fcmonez4xfloat:
3948 ; CHECK:       // %bb.0:
3949 ; CHECK-NEXT:    fcmgt v1.4s, v0.4s, #0.0
3950 ; CHECK-NEXT:    fcmlt v0.4s, v0.4s, #0.0
3951 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
3952 ; CHECK-NEXT:    ret
3954 ; GISEL-LABEL: fcmonez4xfloat:
3955 ; GISEL:       // %bb.0:
3956 ; GISEL-NEXT:    fcmgt v1.4s, v0.4s, #0.0
3957 ; GISEL-NEXT:    fcmlt v0.4s, v0.4s, #0.0
3958 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
3959 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
3960 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
3961 ; GISEL-NEXT:    ret
3962   %tmp3 = fcmp one <4 x float> %A, zeroinitializer
3963   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
3964   ret <4 x i32> %tmp4
3967 ; ONE with zero = OLT | OGT
3968 define <2 x i64> @fcmonez2xdouble(<2 x double> %A) {
3969 ; CHECK-LABEL: fcmonez2xdouble:
3970 ; CHECK:       // %bb.0:
3971 ; CHECK-NEXT:    fcmgt v1.2d, v0.2d, #0.0
3972 ; CHECK-NEXT:    fcmlt v0.2d, v0.2d, #0.0
3973 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
3974 ; CHECK-NEXT:    ret
3976 ; GISEL-LABEL: fcmonez2xdouble:
3977 ; GISEL:       // %bb.0:
3978 ; GISEL-NEXT:    fcmgt v1.2d, v0.2d, #0.0
3979 ; GISEL-NEXT:    fcmlt v0.2d, v0.2d, #0.0
3980 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
3981 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
3982 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
3983 ; GISEL-NEXT:    ret
3984   %tmp3 = fcmp one <2 x double> %A, zeroinitializer
3985   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
3986   ret <2 x i64> %tmp4
3989 ; ORD with zero = OLT | OGE
3990 define <2 x i32> @fcmordz2xfloat(<2 x float> %A) {
3991 ; CHECK-LABEL: fcmordz2xfloat:
3992 ; CHECK:       // %bb.0:
3993 ; CHECK-NEXT:    fcmge v1.2s, v0.2s, #0.0
3994 ; CHECK-NEXT:    fcmlt v0.2s, v0.2s, #0.0
3995 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
3996 ; CHECK-NEXT:    ret
3998 ; GISEL-LABEL: fcmordz2xfloat:
3999 ; GISEL:       // %bb.0:
4000 ; GISEL-NEXT:    fcmge v1.2s, v0.2s, #0.0
4001 ; GISEL-NEXT:    fcmlt v0.2s, v0.2s, #0.0
4002 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
4003 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4004 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4005 ; GISEL-NEXT:    ret
4006   %tmp3 = fcmp ord <2 x float> %A, zeroinitializer
4007   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4008   ret <2 x i32> %tmp4
4011 ; ORD with zero = OLT | OGE
4012 define <4 x i32> @fcmordz4xfloat(<4 x float> %A) {
4013 ; CHECK-LABEL: fcmordz4xfloat:
4014 ; CHECK:       // %bb.0:
4015 ; CHECK-NEXT:    fcmge v1.4s, v0.4s, #0.0
4016 ; CHECK-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4017 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
4018 ; CHECK-NEXT:    ret
4020 ; GISEL-LABEL: fcmordz4xfloat:
4021 ; GISEL:       // %bb.0:
4022 ; GISEL-NEXT:    fcmge v1.4s, v0.4s, #0.0
4023 ; GISEL-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4024 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
4025 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4026 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4027 ; GISEL-NEXT:    ret
4028   %tmp3 = fcmp ord <4 x float> %A, zeroinitializer
4029   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4030   ret <4 x i32> %tmp4
4033 ; ORD with zero = OLT | OGE
4034 define <2 x i64> @fcmordz2xdouble(<2 x double> %A) {
4035 ; CHECK-LABEL: fcmordz2xdouble:
4036 ; CHECK:       // %bb.0:
4037 ; CHECK-NEXT:    fcmge v1.2d, v0.2d, #0.0
4038 ; CHECK-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4039 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
4040 ; CHECK-NEXT:    ret
4042 ; GISEL-LABEL: fcmordz2xdouble:
4043 ; GISEL:       // %bb.0:
4044 ; GISEL-NEXT:    fcmge v1.2d, v0.2d, #0.0
4045 ; GISEL-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4046 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
4047 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4048 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4049 ; GISEL-NEXT:    ret
4050   %tmp3 = fcmp ord <2 x double> %A, zeroinitializer
4051   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4052   ret <2 x i64> %tmp4
4055 ; UEQ with zero = !ONE = !(OLT |OGT)
4056 define <2 x i32> @fcmueqz2xfloat(<2 x float> %A) {
4057 ; CHECK-LABEL: fcmueqz2xfloat:
4058 ; CHECK:       // %bb.0:
4059 ; CHECK-NEXT:    fcmgt v1.2s, v0.2s, #0.0
4060 ; CHECK-NEXT:    fcmlt v0.2s, v0.2s, #0.0
4061 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
4062 ; CHECK-NEXT:    mvn v0.8b, v0.8b
4063 ; CHECK-NEXT:    ret
4065 ; GISEL-LABEL: fcmueqz2xfloat:
4066 ; GISEL:       // %bb.0:
4067 ; GISEL-NEXT:    fcmgt v1.2s, v0.2s, #0.0
4068 ; GISEL-NEXT:    fcmlt v0.2s, v0.2s, #0.0
4069 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
4070 ; GISEL-NEXT:    mvn v0.8b, v0.8b
4071 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4072 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4073 ; GISEL-NEXT:    ret
4074   %tmp3 = fcmp ueq <2 x float> %A, zeroinitializer
4075   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4076   ret <2 x i32> %tmp4
4079 ; UEQ with zero = !ONE = !(OLT |OGT)
4080 define <4 x i32> @fcmueqz4xfloat(<4 x float> %A) {
4081 ; CHECK-LABEL: fcmueqz4xfloat:
4082 ; CHECK:       // %bb.0:
4083 ; CHECK-NEXT:    fcmgt v1.4s, v0.4s, #0.0
4084 ; CHECK-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4085 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
4086 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4087 ; CHECK-NEXT:    ret
4089 ; GISEL-LABEL: fcmueqz4xfloat:
4090 ; GISEL:       // %bb.0:
4091 ; GISEL-NEXT:    fcmgt v1.4s, v0.4s, #0.0
4092 ; GISEL-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4093 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
4094 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4095 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4096 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4097 ; GISEL-NEXT:    ret
4098   %tmp3 = fcmp ueq <4 x float> %A, zeroinitializer
4099   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4100   ret <4 x i32> %tmp4
4103 ; UEQ with zero = !ONE = !(OLT |OGT)
4104 define <2 x i64> @fcmueqz2xdouble(<2 x double> %A) {
4105 ; CHECK-LABEL: fcmueqz2xdouble:
4106 ; CHECK:       // %bb.0:
4107 ; CHECK-NEXT:    fcmgt v1.2d, v0.2d, #0.0
4108 ; CHECK-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4109 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
4110 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4111 ; CHECK-NEXT:    ret
4113 ; GISEL-LABEL: fcmueqz2xdouble:
4114 ; GISEL:       // %bb.0:
4115 ; GISEL-NEXT:    fcmgt v1.2d, v0.2d, #0.0
4116 ; GISEL-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4117 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
4118 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4119 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4120 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4121 ; GISEL-NEXT:    ret
4122   %tmp3 = fcmp ueq <2 x double> %A, zeroinitializer
4123   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4124   ret <2 x i64> %tmp4
4127 ; UGE with zero = !OLT
4128 define <2 x i32> @fcmugez2xfloat(<2 x float> %A) {
4129 ; CHECK-LABEL: fcmugez2xfloat:
4130 ; CHECK:       // %bb.0:
4131 ; CHECK-NEXT:    fcmlt v0.2s, v0.2s, #0.0
4132 ; CHECK-NEXT:    mvn v0.8b, v0.8b
4133 ; CHECK-NEXT:    ret
4135 ; GISEL-LABEL: fcmugez2xfloat:
4136 ; GISEL:       // %bb.0:
4137 ; GISEL-NEXT:    fcmlt v0.2s, v0.2s, #0.0
4138 ; GISEL-NEXT:    mvn v0.8b, v0.8b
4139 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4140 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4141 ; GISEL-NEXT:    ret
4142   %tmp3 = fcmp uge <2 x float> %A, zeroinitializer
4143   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4144   ret <2 x i32> %tmp4
4147 ; UGE with zero = !OLT
4148 define <4 x i32> @fcmugez4xfloat(<4 x float> %A) {
4149 ; CHECK-LABEL: fcmugez4xfloat:
4150 ; CHECK:       // %bb.0:
4151 ; CHECK-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4152 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4153 ; CHECK-NEXT:    ret
4155 ; GISEL-LABEL: fcmugez4xfloat:
4156 ; GISEL:       // %bb.0:
4157 ; GISEL-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4158 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4159 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4160 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4161 ; GISEL-NEXT:    ret
4162   %tmp3 = fcmp uge <4 x float> %A, zeroinitializer
4163   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4164   ret <4 x i32> %tmp4
4167 ; UGE with zero = !OLT
4168 define <2 x i64> @fcmugez2xdouble(<2 x double> %A) {
4169 ; CHECK-LABEL: fcmugez2xdouble:
4170 ; CHECK:       // %bb.0:
4171 ; CHECK-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4172 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4173 ; CHECK-NEXT:    ret
4175 ; GISEL-LABEL: fcmugez2xdouble:
4176 ; GISEL:       // %bb.0:
4177 ; GISEL-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4178 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4179 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4180 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4181 ; GISEL-NEXT:    ret
4182   %tmp3 = fcmp uge <2 x double> %A, zeroinitializer
4183   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4184   ret <2 x i64> %tmp4
4187 ; UGT with zero = !OLE
4188 define <2 x i32> @fcmugtz2xfloat(<2 x float> %A) {
4189 ; CHECK-LABEL: fcmugtz2xfloat:
4190 ; CHECK:       // %bb.0:
4191 ; CHECK-NEXT:    fcmle v0.2s, v0.2s, #0.0
4192 ; CHECK-NEXT:    mvn v0.8b, v0.8b
4193 ; CHECK-NEXT:    ret
4195 ; GISEL-LABEL: fcmugtz2xfloat:
4196 ; GISEL:       // %bb.0:
4197 ; GISEL-NEXT:    fcmle v0.2s, v0.2s, #0.0
4198 ; GISEL-NEXT:    mvn v0.8b, v0.8b
4199 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4200 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4201 ; GISEL-NEXT:    ret
4202   %tmp3 = fcmp ugt <2 x float> %A, zeroinitializer
4203   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4204   ret <2 x i32> %tmp4
4207 ; UGT with zero = !OLE
4208 define <4 x i32> @fcmugtz4xfloat(<4 x float> %A) {
4209 ; CHECK-LABEL: fcmugtz4xfloat:
4210 ; CHECK:       // %bb.0:
4211 ; CHECK-NEXT:    fcmle v0.4s, v0.4s, #0.0
4212 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4213 ; CHECK-NEXT:    ret
4215 ; GISEL-LABEL: fcmugtz4xfloat:
4216 ; GISEL:       // %bb.0:
4217 ; GISEL-NEXT:    fcmle v0.4s, v0.4s, #0.0
4218 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4219 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4220 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4221 ; GISEL-NEXT:    ret
4222   %tmp3 = fcmp ugt <4 x float> %A, zeroinitializer
4223   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4224   ret <4 x i32> %tmp4
4227 ; UGT with zero = !OLE
4228 define <2 x i64> @fcmugtz2xdouble(<2 x double> %A) {
4229 ; CHECK-LABEL: fcmugtz2xdouble:
4230 ; CHECK:       // %bb.0:
4231 ; CHECK-NEXT:    fcmle v0.2d, v0.2d, #0.0
4232 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4233 ; CHECK-NEXT:    ret
4235 ; GISEL-LABEL: fcmugtz2xdouble:
4236 ; GISEL:       // %bb.0:
4237 ; GISEL-NEXT:    fcmle v0.2d, v0.2d, #0.0
4238 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4239 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4240 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4241 ; GISEL-NEXT:    ret
4242   %tmp3 = fcmp ugt <2 x double> %A, zeroinitializer
4243   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4244   ret <2 x i64> %tmp4
4247 ; ULT with zero = !OGE
4248 define <2 x i32> @fcmultz2xfloat(<2 x float> %A) {
4249 ; CHECK-LABEL: fcmultz2xfloat:
4250 ; CHECK:       // %bb.0:
4251 ; CHECK-NEXT:    fcmge v0.2s, v0.2s, #0.0
4252 ; CHECK-NEXT:    mvn v0.8b, v0.8b
4253 ; CHECK-NEXT:    ret
4255 ; GISEL-LABEL: fcmultz2xfloat:
4256 ; GISEL:       // %bb.0:
4257 ; GISEL-NEXT:    fcmge v0.2s, v0.2s, #0.0
4258 ; GISEL-NEXT:    mvn v0.8b, v0.8b
4259 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4260 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4261 ; GISEL-NEXT:    ret
4262   %tmp3 = fcmp ult <2 x float> %A, zeroinitializer
4263   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4264   ret <2 x i32> %tmp4
4267 define <4 x i32> @fcmultz4xfloat(<4 x float> %A) {
4268 ; CHECK-LABEL: fcmultz4xfloat:
4269 ; CHECK:       // %bb.0:
4270 ; CHECK-NEXT:    fcmge v0.4s, v0.4s, #0.0
4271 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4272 ; CHECK-NEXT:    ret
4274 ; GISEL-LABEL: fcmultz4xfloat:
4275 ; GISEL:       // %bb.0:
4276 ; GISEL-NEXT:    fcmge v0.4s, v0.4s, #0.0
4277 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4278 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4279 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4280 ; GISEL-NEXT:    ret
4281   %tmp3 = fcmp ult <4 x float> %A, zeroinitializer
4282   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4283   ret <4 x i32> %tmp4
4286 define <2 x i64> @fcmultz2xdouble(<2 x double> %A) {
4287 ; CHECK-LABEL: fcmultz2xdouble:
4288 ; CHECK:       // %bb.0:
4289 ; CHECK-NEXT:    fcmge v0.2d, v0.2d, #0.0
4290 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4291 ; CHECK-NEXT:    ret
4293 ; GISEL-LABEL: fcmultz2xdouble:
4294 ; GISEL:       // %bb.0:
4295 ; GISEL-NEXT:    fcmge v0.2d, v0.2d, #0.0
4296 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4297 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4298 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4299 ; GISEL-NEXT:    ret
4300   %tmp3 = fcmp ult <2 x double> %A, zeroinitializer
4301   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4302   ret <2 x i64> %tmp4
4305 ; ULE with zero = !OGT
4306 define <2 x i32> @fcmulez2xfloat(<2 x float> %A) {
4307 ; CHECK-LABEL: fcmulez2xfloat:
4308 ; CHECK:       // %bb.0:
4309 ; CHECK-NEXT:    fcmgt v0.2s, v0.2s, #0.0
4310 ; CHECK-NEXT:    mvn v0.8b, v0.8b
4311 ; CHECK-NEXT:    ret
4313 ; GISEL-LABEL: fcmulez2xfloat:
4314 ; GISEL:       // %bb.0:
4315 ; GISEL-NEXT:    fcmgt v0.2s, v0.2s, #0.0
4316 ; GISEL-NEXT:    mvn v0.8b, v0.8b
4317 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4318 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4319 ; GISEL-NEXT:    ret
4320   %tmp3 = fcmp ule <2 x float> %A, zeroinitializer
4321   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4322   ret <2 x i32> %tmp4
4325 ; ULE with zero = !OGT
4326 define <4 x i32> @fcmulez4xfloat(<4 x float> %A) {
4327 ; CHECK-LABEL: fcmulez4xfloat:
4328 ; CHECK:       // %bb.0:
4329 ; CHECK-NEXT:    fcmgt v0.4s, v0.4s, #0.0
4330 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4331 ; CHECK-NEXT:    ret
4333 ; GISEL-LABEL: fcmulez4xfloat:
4334 ; GISEL:       // %bb.0:
4335 ; GISEL-NEXT:    fcmgt v0.4s, v0.4s, #0.0
4336 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4337 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4338 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4339 ; GISEL-NEXT:    ret
4340   %tmp3 = fcmp ule <4 x float> %A, zeroinitializer
4341   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4342   ret <4 x i32> %tmp4
4345 ; ULE with zero = !OGT
4346 define <2 x i64> @fcmulez2xdouble(<2 x double> %A) {
4347 ; CHECK-LABEL: fcmulez2xdouble:
4348 ; CHECK:       // %bb.0:
4349 ; CHECK-NEXT:    fcmgt v0.2d, v0.2d, #0.0
4350 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4351 ; CHECK-NEXT:    ret
4353 ; GISEL-LABEL: fcmulez2xdouble:
4354 ; GISEL:       // %bb.0:
4355 ; GISEL-NEXT:    fcmgt v0.2d, v0.2d, #0.0
4356 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4357 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4358 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4359 ; GISEL-NEXT:    ret
4360   %tmp3 = fcmp ule <2 x double> %A, zeroinitializer
4361   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4362   ret <2 x i64> %tmp4
4365 ; UNE with zero = !OEQ with zero
4366 define <2 x i32> @fcmunez2xfloat(<2 x float> %A) {
4367 ; CHECK-LABEL: fcmunez2xfloat:
4368 ; CHECK:       // %bb.0:
4369 ; CHECK-NEXT:    fcmeq v0.2s, v0.2s, #0.0
4370 ; CHECK-NEXT:    mvn v0.8b, v0.8b
4371 ; CHECK-NEXT:    ret
4373 ; GISEL-LABEL: fcmunez2xfloat:
4374 ; GISEL:       // %bb.0:
4375 ; GISEL-NEXT:    fcmeq v0.2s, v0.2s, #0.0
4376 ; GISEL-NEXT:    mvn v0.8b, v0.8b
4377 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4378 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4379 ; GISEL-NEXT:    ret
4380   %tmp3 = fcmp une <2 x float> %A, zeroinitializer
4381   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4382   ret <2 x i32> %tmp4
4385 ; UNE with zero = !OEQ with zero
4386 define <4 x i32> @fcmunez4xfloat(<4 x float> %A) {
4387 ; CHECK-LABEL: fcmunez4xfloat:
4388 ; CHECK:       // %bb.0:
4389 ; CHECK-NEXT:    fcmeq v0.4s, v0.4s, #0.0
4390 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4391 ; CHECK-NEXT:    ret
4393 ; GISEL-LABEL: fcmunez4xfloat:
4394 ; GISEL:       // %bb.0:
4395 ; GISEL-NEXT:    fcmeq v0.4s, v0.4s, #0.0
4396 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4397 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4398 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4399 ; GISEL-NEXT:    ret
4400   %tmp3 = fcmp une <4 x float> %A, zeroinitializer
4401   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4402   ret <4 x i32> %tmp4
4405 ; UNE with zero = !OEQ with zero
4406 define <2 x i64> @fcmunez2xdouble(<2 x double> %A) {
4407 ; CHECK-LABEL: fcmunez2xdouble:
4408 ; CHECK:       // %bb.0:
4409 ; CHECK-NEXT:    fcmeq v0.2d, v0.2d, #0.0
4410 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4411 ; CHECK-NEXT:    ret
4413 ; GISEL-LABEL: fcmunez2xdouble:
4414 ; GISEL:       // %bb.0:
4415 ; GISEL-NEXT:    fcmeq v0.2d, v0.2d, #0.0
4416 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4417 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4418 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4419 ; GISEL-NEXT:    ret
4420   %tmp3 = fcmp une <2 x double> %A, zeroinitializer
4421   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4422   ret <2 x i64> %tmp4
4425 ; UNO with zero = !ORD = !(OLT | OGE)
4426 define <2 x i32> @fcmunoz2xfloat(<2 x float> %A) {
4427 ; CHECK-LABEL: fcmunoz2xfloat:
4428 ; CHECK:       // %bb.0:
4429 ; CHECK-NEXT:    fcmge v1.2s, v0.2s, #0.0
4430 ; CHECK-NEXT:    fcmlt v0.2s, v0.2s, #0.0
4431 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
4432 ; CHECK-NEXT:    mvn v0.8b, v0.8b
4433 ; CHECK-NEXT:    ret
4435 ; GISEL-LABEL: fcmunoz2xfloat:
4436 ; GISEL:       // %bb.0:
4437 ; GISEL-NEXT:    fcmge v1.2s, v0.2s, #0.0
4438 ; GISEL-NEXT:    fcmlt v0.2s, v0.2s, #0.0
4439 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
4440 ; GISEL-NEXT:    mvn v0.8b, v0.8b
4441 ; GISEL-NEXT:    shl v0.2s, v0.2s, #31
4442 ; GISEL-NEXT:    sshr v0.2s, v0.2s, #31
4443 ; GISEL-NEXT:    ret
4444   %tmp3 = fcmp uno <2 x float> %A, zeroinitializer
4445   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
4446   ret <2 x i32> %tmp4
4449 ; UNO with zero = !ORD = !(OLT | OGE)
4450 define <4 x i32> @fcmunoz4xfloat(<4 x float> %A) {
4451 ; CHECK-LABEL: fcmunoz4xfloat:
4452 ; CHECK:       // %bb.0:
4453 ; CHECK-NEXT:    fcmge v1.4s, v0.4s, #0.0
4454 ; CHECK-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4455 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
4456 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4457 ; CHECK-NEXT:    ret
4459 ; GISEL-LABEL: fcmunoz4xfloat:
4460 ; GISEL:       // %bb.0:
4461 ; GISEL-NEXT:    fcmge v1.4s, v0.4s, #0.0
4462 ; GISEL-NEXT:    fcmlt v0.4s, v0.4s, #0.0
4463 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
4464 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4465 ; GISEL-NEXT:    shl v0.4s, v0.4s, #31
4466 ; GISEL-NEXT:    sshr v0.4s, v0.4s, #31
4467 ; GISEL-NEXT:    ret
4468   %tmp3 = fcmp uno <4 x float> %A, zeroinitializer
4469   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
4470   ret <4 x i32> %tmp4
4473 ; UNO with zero = !ORD = !(OLT | OGE)
4474 define <2 x i64> @fcmunoz2xdouble(<2 x double> %A) {
4475 ; CHECK-LABEL: fcmunoz2xdouble:
4476 ; CHECK:       // %bb.0:
4477 ; CHECK-NEXT:    fcmge v1.2d, v0.2d, #0.0
4478 ; CHECK-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4479 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
4480 ; CHECK-NEXT:    mvn v0.16b, v0.16b
4481 ; CHECK-NEXT:    ret
4483 ; GISEL-LABEL: fcmunoz2xdouble:
4484 ; GISEL:       // %bb.0:
4485 ; GISEL-NEXT:    fcmge v1.2d, v0.2d, #0.0
4486 ; GISEL-NEXT:    fcmlt v0.2d, v0.2d, #0.0
4487 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
4488 ; GISEL-NEXT:    mvn v0.16b, v0.16b
4489 ; GISEL-NEXT:    shl v0.2d, v0.2d, #63
4490 ; GISEL-NEXT:    sshr v0.2d, v0.2d, #63
4491 ; GISEL-NEXT:    ret
4492   %tmp3 = fcmp uno <2 x double> %A, zeroinitializer
4493   %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
4494   ret <2 x i64> %tmp4