[AArch64] Fix bug in prolog clobbering live reg when shrink wrapping.
[oota-llvm.git] / test / CodeGen / AArch64 / neon-compare-instructions.ll
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon < %s | FileCheck %s
2
3 define <8 x i8> @cmeq8xi8(<8 x i8> %A, <8 x i8> %B) {
4 ; CHECK-LABEL: cmeq8xi8:
5 ; CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
6         %tmp3 = icmp eq <8 x i8> %A, %B;
7    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
8         ret <8 x i8> %tmp4
9 }
10
11 define <16 x i8> @cmeq16xi8(<16 x i8> %A, <16 x i8> %B) {
12 ; CHECK-LABEL: cmeq16xi8:
13 ; CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
14         %tmp3 = icmp eq <16 x i8> %A, %B;
15    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
16         ret <16 x i8> %tmp4
17 }
18
19 define <4 x i16> @cmeq4xi16(<4 x i16> %A, <4 x i16> %B) {
20 ; CHECK-LABEL: cmeq4xi16:
21 ; CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
22         %tmp3 = icmp eq <4 x i16> %A, %B;
23    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
24         ret <4 x i16> %tmp4
25 }
26
27 define <8 x i16> @cmeq8xi16(<8 x i16> %A, <8 x i16> %B) {
28 ; CHECK-LABEL: cmeq8xi16:
29 ; CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
30         %tmp3 = icmp eq <8 x i16> %A, %B;
31    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
32         ret <8 x i16> %tmp4
33 }
34
35 define <2 x i32> @cmeq2xi32(<2 x i32> %A, <2 x i32> %B) {
36 ; CHECK-LABEL: cmeq2xi32:
37 ; CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
38         %tmp3 = icmp eq <2 x i32> %A, %B;
39    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
40         ret <2 x i32> %tmp4
41 }
42
43 define <4 x i32> @cmeq4xi32(<4 x i32> %A, <4 x i32> %B) {
44 ; CHECK-LABEL: cmeq4xi32:
45 ; CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
46         %tmp3 = icmp eq <4 x i32> %A, %B;
47    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
48         ret <4 x i32> %tmp4
49 }
50
51 define <2 x i64> @cmeq2xi64(<2 x i64> %A, <2 x i64> %B) {
52 ; CHECK-LABEL: cmeq2xi64:
53 ; CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
54         %tmp3 = icmp eq <2 x i64> %A, %B;
55    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
56         ret <2 x i64> %tmp4
57 }
58
59 define <8 x i8> @cmne8xi8(<8 x i8> %A, <8 x i8> %B) {
60 ; CHECK-LABEL: cmne8xi8:
61 ; CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
62 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
63         %tmp3 = icmp ne <8 x i8> %A, %B;
64    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
65         ret <8 x i8> %tmp4
66 }
67
68 define <16 x i8> @cmne16xi8(<16 x i8> %A, <16 x i8> %B) {
69 ; CHECK-LABEL: cmne16xi8:
70 ; CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
71 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
72         %tmp3 = icmp ne <16 x i8> %A, %B;
73    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
74         ret <16 x i8> %tmp4
75 }
76
77 define <4 x i16> @cmne4xi16(<4 x i16> %A, <4 x i16> %B) {
78 ; CHECK-LABEL: cmne4xi16:
79 ; CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
80 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
81         %tmp3 = icmp ne <4 x i16> %A, %B;
82    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
83         ret <4 x i16> %tmp4
84 }
85
86 define <8 x i16> @cmne8xi16(<8 x i16> %A, <8 x i16> %B) {
87 ; CHECK-LABEL: cmne8xi16:
88 ; CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
89 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
90         %tmp3 = icmp ne <8 x i16> %A, %B;
91    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
92         ret <8 x i16> %tmp4
93 }
94
95 define <2 x i32> @cmne2xi32(<2 x i32> %A, <2 x i32> %B) {
96 ; CHECK-LABEL: cmne2xi32:
97 ; CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
98 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
99         %tmp3 = icmp ne <2 x i32> %A, %B;
100    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
101         ret <2 x i32> %tmp4
102 }
103
104 define <4 x i32> @cmne4xi32(<4 x i32> %A, <4 x i32> %B) {
105 ; CHECK-LABEL: cmne4xi32:
106 ; CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
107 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
108         %tmp3 = icmp ne <4 x i32> %A, %B;
109    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
110         ret <4 x i32> %tmp4
111 }
112
113 define <2 x i64> @cmne2xi64(<2 x i64> %A, <2 x i64> %B) {
114 ; CHECK-LABEL: cmne2xi64:
115 ; CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
116 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
117         %tmp3 = icmp ne <2 x i64> %A, %B;
118    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
119         ret <2 x i64> %tmp4
120 }
121
122 define <8 x i8> @cmgt8xi8(<8 x i8> %A, <8 x i8> %B) {
123 ; CHECK-LABEL: cmgt8xi8:
124 ; CHECK: cmgt {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
125         %tmp3 = icmp sgt <8 x i8> %A, %B;
126    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
127         ret <8 x i8> %tmp4
128 }
129
130 define <16 x i8> @cmgt16xi8(<16 x i8> %A, <16 x i8> %B) {
131 ; CHECK-LABEL: cmgt16xi8:
132 ; CHECK: cmgt {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
133         %tmp3 = icmp sgt <16 x i8> %A, %B;
134    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
135         ret <16 x i8> %tmp4
136 }
137
138 define <4 x i16> @cmgt4xi16(<4 x i16> %A, <4 x i16> %B) {
139 ; CHECK-LABEL: cmgt4xi16:
140 ; CHECK: cmgt {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
141         %tmp3 = icmp sgt <4 x i16> %A, %B;
142    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
143         ret <4 x i16> %tmp4
144 }
145
146 define <8 x i16> @cmgt8xi16(<8 x i16> %A, <8 x i16> %B) {
147 ; CHECK-LABEL: cmgt8xi16:
148 ; CHECK: cmgt {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
149         %tmp3 = icmp sgt <8 x i16> %A, %B;
150    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
151         ret <8 x i16> %tmp4
152 }
153
154 define <2 x i32> @cmgt2xi32(<2 x i32> %A, <2 x i32> %B) {
155 ; CHECK-LABEL: cmgt2xi32:
156 ; CHECK: cmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
157         %tmp3 = icmp sgt <2 x i32> %A, %B;
158    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
159         ret <2 x i32> %tmp4
160 }
161
162 define <4 x i32> @cmgt4xi32(<4 x i32> %A, <4 x i32> %B) {
163 ; CHECK-LABEL: cmgt4xi32:
164 ; CHECK: cmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
165         %tmp3 = icmp sgt <4 x i32> %A, %B;
166    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
167         ret <4 x i32> %tmp4
168 }
169
170 define <2 x i64> @cmgt2xi64(<2 x i64> %A, <2 x i64> %B) {
171 ; CHECK-LABEL: cmgt2xi64:
172 ; CHECK: cmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
173         %tmp3 = icmp sgt <2 x i64> %A, %B;
174    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
175         ret <2 x i64> %tmp4
176 }
177
178 define <8 x i8> @cmlt8xi8(<8 x i8> %A, <8 x i8> %B) {
179 ; CHECK-LABEL: cmlt8xi8:
180 ; Using registers other than v0, v1 are possible, but would be odd.
181 ; LT implemented as GT, so check reversed operands.
182 ; CHECK: cmgt {{v[0-9]+}}.8b, v1.8b, v0.8b
183         %tmp3 = icmp slt <8 x i8> %A, %B;
184    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
185         ret <8 x i8> %tmp4
186 }
187
188 define <16 x i8> @cmlt16xi8(<16 x i8> %A, <16 x i8> %B) {
189 ; CHECK-LABEL: cmlt16xi8:
190 ; Using registers other than v0, v1 are possible, but would be odd.
191 ; LT implemented as GT, so check reversed operands.
192 ; CHECK: cmgt {{v[0-9]+}}.16b, v1.16b, v0.16b
193         %tmp3 = icmp slt <16 x i8> %A, %B;
194    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
195         ret <16 x i8> %tmp4
196 }
197
198 define <4 x i16> @cmlt4xi16(<4 x i16> %A, <4 x i16> %B) {
199 ; CHECK-LABEL: cmlt4xi16:
200 ; Using registers other than v0, v1 are possible, but would be odd.
201 ; LT implemented as GT, so check reversed operands.
202 ; CHECK: cmgt {{v[0-9]+}}.4h, v1.4h, v0.4h
203         %tmp3 = icmp slt <4 x i16> %A, %B;
204    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
205         ret <4 x i16> %tmp4
206 }
207
208 define <8 x i16> @cmlt8xi16(<8 x i16> %A, <8 x i16> %B) {
209 ; CHECK-LABEL: cmlt8xi16:
210 ; Using registers other than v0, v1 are possible, but would be odd.
211 ; LT implemented as GT, so check reversed operands.
212 ; CHECK: cmgt {{v[0-9]+}}.8h, v1.8h, v0.8h
213         %tmp3 = icmp slt <8 x i16> %A, %B;
214    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
215         ret <8 x i16> %tmp4
216 }
217
218 define <2 x i32> @cmlt2xi32(<2 x i32> %A, <2 x i32> %B) {
219 ; CHECK-LABEL: cmlt2xi32:
220 ; Using registers other than v0, v1 are possible, but would be odd.
221 ; LT implemented as GT, so check reversed operands.
222 ; CHECK: cmgt {{v[0-9]+}}.2s, v1.2s, v0.2s
223         %tmp3 = icmp slt <2 x i32> %A, %B;
224    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
225         ret <2 x i32> %tmp4
226 }
227
228 define <4 x i32> @cmlt4xi32(<4 x i32> %A, <4 x i32> %B) {
229 ; CHECK-LABEL: cmlt4xi32:
230 ; Using registers other than v0, v1 are possible, but would be odd.
231 ; LT implemented as GT, so check reversed operands.
232 ; CHECK: cmgt {{v[0-9]+}}.4s, v1.4s, v0.4s
233         %tmp3 = icmp slt <4 x i32> %A, %B;
234    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
235         ret <4 x i32> %tmp4
236 }
237
238 define <2 x i64> @cmlt2xi64(<2 x i64> %A, <2 x i64> %B) {
239 ; CHECK-LABEL: cmlt2xi64:
240 ; Using registers other than v0, v1 are possible, but would be odd.
241 ; LT implemented as GT, so check reversed operands.
242 ; CHECK: cmgt {{v[0-9]+}}.2d, v1.2d, v0.2d
243         %tmp3 = icmp slt <2 x i64> %A, %B;
244    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
245         ret <2 x i64> %tmp4
246 }
247
248 define <8 x i8> @cmge8xi8(<8 x i8> %A, <8 x i8> %B) {
249 ; CHECK-LABEL: cmge8xi8:
250 ; CHECK: cmge {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
251         %tmp3 = icmp sge <8 x i8> %A, %B;
252    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
253         ret <8 x i8> %tmp4
254 }
255
256 define <16 x i8> @cmge16xi8(<16 x i8> %A, <16 x i8> %B) {
257 ; CHECK-LABEL: cmge16xi8:
258 ; CHECK: cmge {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
259         %tmp3 = icmp sge <16 x i8> %A, %B;
260    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
261         ret <16 x i8> %tmp4
262 }
263
264 define <4 x i16> @cmge4xi16(<4 x i16> %A, <4 x i16> %B) {
265 ; CHECK-LABEL: cmge4xi16:
266 ; CHECK: cmge {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
267         %tmp3 = icmp sge <4 x i16> %A, %B;
268    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
269         ret <4 x i16> %tmp4
270 }
271
272 define <8 x i16> @cmge8xi16(<8 x i16> %A, <8 x i16> %B) {
273 ; CHECK-LABEL: cmge8xi16:
274 ; CHECK: cmge {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
275         %tmp3 = icmp sge <8 x i16> %A, %B;
276    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
277         ret <8 x i16> %tmp4
278 }
279
280 define <2 x i32> @cmge2xi32(<2 x i32> %A, <2 x i32> %B) {
281 ; CHECK-LABEL: cmge2xi32:
282 ; CHECK: cmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
283         %tmp3 = icmp sge <2 x i32> %A, %B;
284    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
285         ret <2 x i32> %tmp4
286 }
287
288 define <4 x i32> @cmge4xi32(<4 x i32> %A, <4 x i32> %B) {
289 ; CHECK-LABEL: cmge4xi32:
290 ; CHECK: cmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
291         %tmp3 = icmp sge <4 x i32> %A, %B;
292    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
293         ret <4 x i32> %tmp4
294 }
295
296 define <2 x i64> @cmge2xi64(<2 x i64> %A, <2 x i64> %B) {
297 ; CHECK-LABEL: cmge2xi64:
298 ; CHECK: cmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
299         %tmp3 = icmp sge <2 x i64> %A, %B;
300    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
301         ret <2 x i64> %tmp4
302 }
303
304 define <8 x i8> @cmle8xi8(<8 x i8> %A, <8 x i8> %B) {
305 ; CHECK-LABEL: cmle8xi8:
306 ; Using registers other than v0, v1 are possible, but would be odd.
307 ; LE implemented as GE, so check reversed operands.
308 ; CHECK: cmge {{v[0-9]+}}.8b, v1.8b, v0.8b
309         %tmp3 = icmp sle <8 x i8> %A, %B;
310    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
311         ret <8 x i8> %tmp4
312 }
313
314 define <16 x i8> @cmle16xi8(<16 x i8> %A, <16 x i8> %B) {
315 ; CHECK-LABEL: cmle16xi8:
316 ; Using registers other than v0, v1 are possible, but would be odd.
317 ; LE implemented as GE, so check reversed operands.
318 ; CHECK: cmge {{v[0-9]+}}.16b, v1.16b, v0.16b
319         %tmp3 = icmp sle <16 x i8> %A, %B;
320    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
321         ret <16 x i8> %tmp4
322 }
323
324 define <4 x i16> @cmle4xi16(<4 x i16> %A, <4 x i16> %B) {
325 ; CHECK-LABEL: cmle4xi16:
326 ; Using registers other than v0, v1 are possible, but would be odd.
327 ; LE implemented as GE, so check reversed operands.
328 ; CHECK: cmge {{v[0-9]+}}.4h, v1.4h, v0.4h
329         %tmp3 = icmp sle <4 x i16> %A, %B;
330    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
331         ret <4 x i16> %tmp4
332 }
333
334 define <8 x i16> @cmle8xi16(<8 x i16> %A, <8 x i16> %B) {
335 ; CHECK-LABEL: cmle8xi16:
336 ; Using registers other than v0, v1 are possible, but would be odd.
337 ; LE implemented as GE, so check reversed operands.
338 ; CHECK: cmge {{v[0-9]+}}.8h, v1.8h, v0.8h
339         %tmp3 = icmp sle <8 x i16> %A, %B;
340    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
341         ret <8 x i16> %tmp4
342 }
343
344 define <2 x i32> @cmle2xi32(<2 x i32> %A, <2 x i32> %B) {
345 ; CHECK-LABEL: cmle2xi32:
346 ; Using registers other than v0, v1 are possible, but would be odd.
347 ; LE implemented as GE, so check reversed operands.
348 ; CHECK: cmge {{v[0-9]+}}.2s, v1.2s, v0.2s
349         %tmp3 = icmp sle <2 x i32> %A, %B;
350    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
351         ret <2 x i32> %tmp4
352 }
353
354 define <4 x i32> @cmle4xi32(<4 x i32> %A, <4 x i32> %B) {
355 ; CHECK-LABEL: cmle4xi32:
356 ; Using registers other than v0, v1 are possible, but would be odd.
357 ; LE implemented as GE, so check reversed operands.
358 ; CHECK: cmge {{v[0-9]+}}.4s, v1.4s, v0.4s
359         %tmp3 = icmp sle <4 x i32> %A, %B;
360    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
361         ret <4 x i32> %tmp4
362 }
363
364 define <2 x i64> @cmle2xi64(<2 x i64> %A, <2 x i64> %B) {
365 ; CHECK-LABEL: cmle2xi64:
366 ; Using registers other than v0, v1 are possible, but would be odd.
367 ; LE implemented as GE, so check reversed operands.
368 ; CHECK: cmge {{v[0-9]+}}.2d, v1.2d, v0.2d
369         %tmp3 = icmp sle <2 x i64> %A, %B;
370    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
371         ret <2 x i64> %tmp4
372 }
373
374 define <8 x i8> @cmhi8xi8(<8 x i8> %A, <8 x i8> %B) {
375 ; CHECK-LABEL: cmhi8xi8:
376 ; CHECK: cmhi {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
377         %tmp3 = icmp ugt <8 x i8> %A, %B;
378    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
379         ret <8 x i8> %tmp4
380 }
381
382 define <16 x i8> @cmhi16xi8(<16 x i8> %A, <16 x i8> %B) {
383 ; CHECK-LABEL: cmhi16xi8:
384 ; CHECK: cmhi {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
385         %tmp3 = icmp ugt <16 x i8> %A, %B;
386    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
387         ret <16 x i8> %tmp4
388 }
389
390 define <4 x i16> @cmhi4xi16(<4 x i16> %A, <4 x i16> %B) {
391 ; CHECK-LABEL: cmhi4xi16:
392 ; CHECK: cmhi {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
393         %tmp3 = icmp ugt <4 x i16> %A, %B;
394    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
395         ret <4 x i16> %tmp4
396 }
397
398 define <8 x i16> @cmhi8xi16(<8 x i16> %A, <8 x i16> %B) {
399 ; CHECK-LABEL: cmhi8xi16:
400 ; CHECK: cmhi {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
401         %tmp3 = icmp ugt <8 x i16> %A, %B;
402    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
403         ret <8 x i16> %tmp4
404 }
405
406 define <2 x i32> @cmhi2xi32(<2 x i32> %A, <2 x i32> %B) {
407 ; CHECK-LABEL: cmhi2xi32:
408 ; CHECK: cmhi {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
409         %tmp3 = icmp ugt <2 x i32> %A, %B;
410    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
411         ret <2 x i32> %tmp4
412 }
413
414 define <4 x i32> @cmhi4xi32(<4 x i32> %A, <4 x i32> %B) {
415 ; CHECK-LABEL: cmhi4xi32:
416 ; CHECK: cmhi {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
417         %tmp3 = icmp ugt <4 x i32> %A, %B;
418    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
419         ret <4 x i32> %tmp4
420 }
421
422 define <2 x i64> @cmhi2xi64(<2 x i64> %A, <2 x i64> %B) {
423 ; CHECK-LABEL: cmhi2xi64:
424 ; CHECK: cmhi {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
425         %tmp3 = icmp ugt <2 x i64> %A, %B;
426    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
427         ret <2 x i64> %tmp4
428 }
429
430 define <8 x i8> @cmlo8xi8(<8 x i8> %A, <8 x i8> %B) {
431 ; CHECK-LABEL: cmlo8xi8:
432 ; Using registers other than v0, v1 are possible, but would be odd.
433 ; LO implemented as HI, so check reversed operands.
434 ; CHECK: cmhi {{v[0-9]+}}.8b, v1.8b, v0.8b
435         %tmp3 = icmp ult <8 x i8> %A, %B;
436    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
437         ret <8 x i8> %tmp4
438 }
439
440 define <16 x i8> @cmlo16xi8(<16 x i8> %A, <16 x i8> %B) {
441 ; CHECK-LABEL: cmlo16xi8:
442 ; Using registers other than v0, v1 are possible, but would be odd.
443 ; LO implemented as HI, so check reversed operands.
444 ; CHECK: cmhi {{v[0-9]+}}.16b, v1.16b, v0.16b
445         %tmp3 = icmp ult <16 x i8> %A, %B;
446    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
447         ret <16 x i8> %tmp4
448 }
449
450 define <4 x i16> @cmlo4xi16(<4 x i16> %A, <4 x i16> %B) {
451 ; CHECK-LABEL: cmlo4xi16:
452 ; Using registers other than v0, v1 are possible, but would be odd.
453 ; LO implemented as HI, so check reversed operands.
454 ; CHECK: cmhi {{v[0-9]+}}.4h, v1.4h, v0.4h
455         %tmp3 = icmp ult <4 x i16> %A, %B;
456    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
457         ret <4 x i16> %tmp4
458 }
459
460 define <8 x i16> @cmlo8xi16(<8 x i16> %A, <8 x i16> %B) {
461 ; CHECK-LABEL: cmlo8xi16:
462 ; Using registers other than v0, v1 are possible, but would be odd.
463 ; LO implemented as HI, so check reversed operands.
464 ; CHECK: cmhi {{v[0-9]+}}.8h, v1.8h, v0.8h
465         %tmp3 = icmp ult <8 x i16> %A, %B;
466    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
467         ret <8 x i16> %tmp4
468 }
469
470 define <2 x i32> @cmlo2xi32(<2 x i32> %A, <2 x i32> %B) {
471 ; CHECK-LABEL: cmlo2xi32:
472 ; Using registers other than v0, v1 are possible, but would be odd.
473 ; LO implemented as HI, so check reversed operands.
474 ; CHECK: cmhi {{v[0-9]+}}.2s, v1.2s, v0.2s
475         %tmp3 = icmp ult <2 x i32> %A, %B;
476    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
477         ret <2 x i32> %tmp4
478 }
479
480 define <4 x i32> @cmlo4xi32(<4 x i32> %A, <4 x i32> %B) {
481 ; CHECK-LABEL: cmlo4xi32:
482 ; Using registers other than v0, v1 are possible, but would be odd.
483 ; LO implemented as HI, so check reversed operands.
484 ; CHECK: cmhi {{v[0-9]+}}.4s, v1.4s, v0.4s
485         %tmp3 = icmp ult <4 x i32> %A, %B;
486    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
487         ret <4 x i32> %tmp4
488 }
489
490 define <2 x i64> @cmlo2xi64(<2 x i64> %A, <2 x i64> %B) {
491 ; CHECK-LABEL: cmlo2xi64:
492 ; Using registers other than v0, v1 are possible, but would be odd.
493 ; LO implemented as HI, so check reversed operands.
494 ; CHECK: cmhi {{v[0-9]+}}.2d, v1.2d, v0.2d
495         %tmp3 = icmp ult <2 x i64> %A, %B;
496    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
497         ret <2 x i64> %tmp4
498 }
499
500 define <8 x i8> @cmhs8xi8(<8 x i8> %A, <8 x i8> %B) {
501 ; CHECK-LABEL: cmhs8xi8:
502 ; CHECK: cmhs {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
503         %tmp3 = icmp uge <8 x i8> %A, %B;
504    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
505         ret <8 x i8> %tmp4
506 }
507
508 define <16 x i8> @cmhs16xi8(<16 x i8> %A, <16 x i8> %B) {
509 ; CHECK-LABEL: cmhs16xi8:
510 ; CHECK: cmhs {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
511         %tmp3 = icmp uge <16 x i8> %A, %B;
512    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
513         ret <16 x i8> %tmp4
514 }
515
516 define <4 x i16> @cmhs4xi16(<4 x i16> %A, <4 x i16> %B) {
517 ; CHECK-LABEL: cmhs4xi16:
518 ; CHECK: cmhs {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
519         %tmp3 = icmp uge <4 x i16> %A, %B;
520    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
521         ret <4 x i16> %tmp4
522 }
523
524 define <8 x i16> @cmhs8xi16(<8 x i16> %A, <8 x i16> %B) {
525 ; CHECK-LABEL: cmhs8xi16:
526 ; CHECK: cmhs {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
527         %tmp3 = icmp uge <8 x i16> %A, %B;
528    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
529         ret <8 x i16> %tmp4
530 }
531
532 define <2 x i32> @cmhs2xi32(<2 x i32> %A, <2 x i32> %B) {
533 ; CHECK-LABEL: cmhs2xi32:
534 ; CHECK: cmhs {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
535         %tmp3 = icmp uge <2 x i32> %A, %B;
536    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
537         ret <2 x i32> %tmp4
538 }
539
540 define <4 x i32> @cmhs4xi32(<4 x i32> %A, <4 x i32> %B) {
541 ; CHECK-LABEL: cmhs4xi32:
542 ; CHECK: cmhs {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
543         %tmp3 = icmp uge <4 x i32> %A, %B;
544    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
545         ret <4 x i32> %tmp4
546 }
547
548 define <2 x i64> @cmhs2xi64(<2 x i64> %A, <2 x i64> %B) {
549 ; CHECK-LABEL: cmhs2xi64:
550 ; CHECK: cmhs {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
551         %tmp3 = icmp uge <2 x i64> %A, %B;
552    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
553         ret <2 x i64> %tmp4
554 }
555
556 define <8 x i8> @cmls8xi8(<8 x i8> %A, <8 x i8> %B) {
557 ; CHECK-LABEL: cmls8xi8:
558 ; Using registers other than v0, v1 are possible, but would be odd.
559 ; LS implemented as HS, so check reversed operands.
560 ; CHECK: cmhs {{v[0-9]+}}.8b, v1.8b, v0.8b
561         %tmp3 = icmp ule <8 x i8> %A, %B;
562    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
563         ret <8 x i8> %tmp4
564 }
565
566 define <16 x i8> @cmls16xi8(<16 x i8> %A, <16 x i8> %B) {
567 ; CHECK-LABEL: cmls16xi8:
568 ; Using registers other than v0, v1 are possible, but would be odd.
569 ; LS implemented as HS, so check reversed operands.
570 ; CHECK: cmhs {{v[0-9]+}}.16b, v1.16b, v0.16b
571         %tmp3 = icmp ule <16 x i8> %A, %B;
572    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
573         ret <16 x i8> %tmp4
574 }
575
576 define <4 x i16> @cmls4xi16(<4 x i16> %A, <4 x i16> %B) {
577 ; CHECK-LABEL: cmls4xi16:
578 ; Using registers other than v0, v1 are possible, but would be odd.
579 ; LS implemented as HS, so check reversed operands.
580 ; CHECK: cmhs {{v[0-9]+}}.4h, v1.4h, v0.4h
581         %tmp3 = icmp ule <4 x i16> %A, %B;
582    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
583         ret <4 x i16> %tmp4
584 }
585
586 define <8 x i16> @cmls8xi16(<8 x i16> %A, <8 x i16> %B) {
587 ; CHECK-LABEL: cmls8xi16:
588 ; Using registers other than v0, v1 are possible, but would be odd.
589 ; LS implemented as HS, so check reversed operands.
590 ; CHECK: cmhs {{v[0-9]+}}.8h, v1.8h, v0.8h
591         %tmp3 = icmp ule <8 x i16> %A, %B;
592    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
593         ret <8 x i16> %tmp4
594 }
595
596 define <2 x i32> @cmls2xi32(<2 x i32> %A, <2 x i32> %B) {
597 ; CHECK-LABEL: cmls2xi32:
598 ; Using registers other than v0, v1 are possible, but would be odd.
599 ; LS implemented as HS, so check reversed operands.
600 ; CHECK: cmhs {{v[0-9]+}}.2s, v1.2s, v0.2s
601         %tmp3 = icmp ule <2 x i32> %A, %B;
602    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
603         ret <2 x i32> %tmp4
604 }
605
606 define <4 x i32> @cmls4xi32(<4 x i32> %A, <4 x i32> %B) {
607 ; CHECK-LABEL: cmls4xi32:
608 ; Using registers other than v0, v1 are possible, but would be odd.
609 ; LS implemented as HS, so check reversed operands.
610 ; CHECK: cmhs {{v[0-9]+}}.4s, v1.4s, v0.4s
611         %tmp3 = icmp ule <4 x i32> %A, %B;
612    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
613         ret <4 x i32> %tmp4
614 }
615
616 define <2 x i64> @cmls2xi64(<2 x i64> %A, <2 x i64> %B) {
617 ; CHECK-LABEL: cmls2xi64:
618 ; Using registers other than v0, v1 are possible, but would be odd.
619 ; LS implemented as HS, so check reversed operands.
620 ; CHECK: cmhs {{v[0-9]+}}.2d, v1.2d, v0.2d
621         %tmp3 = icmp ule <2 x i64> %A, %B;
622    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
623         ret <2 x i64> %tmp4
624 }
625
626 define <8 x i8> @cmtst8xi8(<8 x i8> %A, <8 x i8> %B) {
627 ; CHECK-LABEL: cmtst8xi8:
628 ; CHECK: cmtst {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
629         %tmp3 = and <8 x i8> %A, %B
630         %tmp4 = icmp ne <8 x i8> %tmp3, zeroinitializer
631    %tmp5 = sext <8 x i1> %tmp4 to <8 x i8>
632         ret <8 x i8> %tmp5
633 }
634
635 define <16 x i8> @cmtst16xi8(<16 x i8> %A, <16 x i8> %B) {
636 ; CHECK-LABEL: cmtst16xi8:
637 ; CHECK: cmtst {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
638         %tmp3 = and <16 x i8> %A, %B
639         %tmp4 = icmp ne <16 x i8> %tmp3, zeroinitializer
640    %tmp5 = sext <16 x i1> %tmp4 to <16 x i8>
641         ret <16 x i8> %tmp5
642 }
643
644 define <4 x i16> @cmtst4xi16(<4 x i16> %A, <4 x i16> %B) {
645 ; CHECK-LABEL: cmtst4xi16:
646 ; CHECK: cmtst {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
647         %tmp3 = and <4 x i16> %A, %B
648         %tmp4 = icmp ne <4 x i16> %tmp3, zeroinitializer
649    %tmp5 = sext <4 x i1> %tmp4 to <4 x i16>
650         ret <4 x i16> %tmp5
651 }
652
653 define <8 x i16> @cmtst8xi16(<8 x i16> %A, <8 x i16> %B) {
654 ; CHECK-LABEL: cmtst8xi16:
655 ; CHECK: cmtst {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
656         %tmp3 = and <8 x i16> %A, %B
657         %tmp4 = icmp ne <8 x i16> %tmp3, zeroinitializer
658    %tmp5 = sext <8 x i1> %tmp4 to <8 x i16>
659         ret <8 x i16> %tmp5
660 }
661
662 define <2 x i32> @cmtst2xi32(<2 x i32> %A, <2 x i32> %B) {
663 ; CHECK-LABEL: cmtst2xi32:
664 ; CHECK: cmtst {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
665         %tmp3 = and <2 x i32> %A, %B
666         %tmp4 = icmp ne <2 x i32> %tmp3, zeroinitializer
667    %tmp5 = sext <2 x i1> %tmp4 to <2 x i32>
668         ret <2 x i32> %tmp5
669 }
670
671 define <4 x i32> @cmtst4xi32(<4 x i32> %A, <4 x i32> %B) {
672 ; CHECK-LABEL: cmtst4xi32:
673 ; CHECK: cmtst {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
674         %tmp3 = and <4 x i32> %A, %B
675         %tmp4 = icmp ne <4 x i32> %tmp3, zeroinitializer
676    %tmp5 = sext <4 x i1> %tmp4 to <4 x i32>
677         ret <4 x i32> %tmp5
678 }
679
680 define <2 x i64> @cmtst2xi64(<2 x i64> %A, <2 x i64> %B) {
681 ; CHECK-LABEL: cmtst2xi64:
682 ; CHECK: cmtst {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
683         %tmp3 = and <2 x i64> %A, %B
684         %tmp4 = icmp ne <2 x i64> %tmp3, zeroinitializer
685    %tmp5 = sext <2 x i1> %tmp4 to <2 x i64>
686         ret <2 x i64> %tmp5
687 }
688
689
690
691 define <8 x i8> @cmeqz8xi8(<8 x i8> %A) {
692 ; CHECK-LABEL: cmeqz8xi8:
693 ; CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #{{0x0|0}}
694         %tmp3 = icmp eq <8 x i8> %A, zeroinitializer;
695    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
696         ret <8 x i8> %tmp4
697 }
698
699 define <16 x i8> @cmeqz16xi8(<16 x i8> %A) {
700 ; CHECK-LABEL: cmeqz16xi8:
701 ; CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #{{0x0|0}}
702         %tmp3 = icmp eq <16 x i8> %A, zeroinitializer;
703    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
704         ret <16 x i8> %tmp4
705 }
706
707 define <4 x i16> @cmeqz4xi16(<4 x i16> %A) {
708 ; CHECK-LABEL: cmeqz4xi16:
709 ; CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #{{0x0|0}}
710         %tmp3 = icmp eq <4 x i16> %A, zeroinitializer;
711    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
712         ret <4 x i16> %tmp4
713 }
714
715 define <8 x i16> @cmeqz8xi16(<8 x i16> %A) {
716 ; CHECK-LABEL: cmeqz8xi16:
717 ; CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #{{0x0|0}}
718         %tmp3 = icmp eq <8 x i16> %A, zeroinitializer;
719    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
720         ret <8 x i16> %tmp4
721 }
722
723 define <2 x i32> @cmeqz2xi32(<2 x i32> %A) {
724 ; CHECK-LABEL: cmeqz2xi32:
725 ; CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0x0|0}}
726         %tmp3 = icmp eq <2 x i32> %A, zeroinitializer;
727    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
728         ret <2 x i32> %tmp4
729 }
730
731 define <4 x i32> @cmeqz4xi32(<4 x i32> %A) {
732 ; CHECK-LABEL: cmeqz4xi32:
733 ; CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0x0|0}}
734         %tmp3 = icmp eq <4 x i32> %A, zeroinitializer;
735    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
736         ret <4 x i32> %tmp4
737 }
738
739 define <2 x i64> @cmeqz2xi64(<2 x i64> %A) {
740 ; CHECK-LABEL: cmeqz2xi64:
741 ; CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0x0|0}}
742         %tmp3 = icmp eq <2 x i64> %A, zeroinitializer;
743    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
744         ret <2 x i64> %tmp4
745 }
746
747
748 define <8 x i8> @cmgez8xi8(<8 x i8> %A) {
749 ; CHECK-LABEL: cmgez8xi8:
750 ; CHECK: cmge {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #{{0x0|0}}
751         %tmp3 = icmp sge <8 x i8> %A, zeroinitializer;
752    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
753         ret <8 x i8> %tmp4
754 }
755
756 define <16 x i8> @cmgez16xi8(<16 x i8> %A) {
757 ; CHECK-LABEL: cmgez16xi8:
758 ; CHECK: cmge {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #{{0x0|0}}
759         %tmp3 = icmp sge <16 x i8> %A, zeroinitializer;
760    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
761         ret <16 x i8> %tmp4
762 }
763
764 define <4 x i16> @cmgez4xi16(<4 x i16> %A) {
765 ; CHECK-LABEL: cmgez4xi16:
766 ; CHECK: cmge {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #{{0x0|0}}
767         %tmp3 = icmp sge <4 x i16> %A, zeroinitializer;
768    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
769         ret <4 x i16> %tmp4
770 }
771
772 define <8 x i16> @cmgez8xi16(<8 x i16> %A) {
773 ; CHECK-LABEL: cmgez8xi16:
774 ; CHECK: cmge {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #{{0x0|0}}
775         %tmp3 = icmp sge <8 x i16> %A, zeroinitializer;
776    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
777         ret <8 x i16> %tmp4
778 }
779
780 define <2 x i32> @cmgez2xi32(<2 x i32> %A) {
781 ; CHECK-LABEL: cmgez2xi32:
782 ; CHECK: cmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0x0|0}}
783         %tmp3 = icmp sge <2 x i32> %A, zeroinitializer;
784    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
785         ret <2 x i32> %tmp4
786 }
787
788 define <4 x i32> @cmgez4xi32(<4 x i32> %A) {
789 ; CHECK-LABEL: cmgez4xi32:
790 ; CHECK: cmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0x0|0}}
791         %tmp3 = icmp sge <4 x i32> %A, zeroinitializer;
792    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
793         ret <4 x i32> %tmp4
794 }
795
796 define <2 x i64> @cmgez2xi64(<2 x i64> %A) {
797 ; CHECK-LABEL: cmgez2xi64:
798 ; CHECK: cmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0x0|0}}
799         %tmp3 = icmp sge <2 x i64> %A, zeroinitializer;
800    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
801         ret <2 x i64> %tmp4
802 }
803
804
805 define <8 x i8> @cmgtz8xi8(<8 x i8> %A) {
806 ; CHECK-LABEL: cmgtz8xi8:
807 ; CHECK: cmgt {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #{{0x0|0}}
808         %tmp3 = icmp sgt <8 x i8> %A, zeroinitializer;
809    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
810         ret <8 x i8> %tmp4
811 }
812
813 define <16 x i8> @cmgtz16xi8(<16 x i8> %A) {
814 ; CHECK-LABEL: cmgtz16xi8:
815 ; CHECK: cmgt {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #{{0x0|0}}
816         %tmp3 = icmp sgt <16 x i8> %A, zeroinitializer;
817    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
818         ret <16 x i8> %tmp4
819 }
820
821 define <4 x i16> @cmgtz4xi16(<4 x i16> %A) {
822 ; CHECK-LABEL: cmgtz4xi16:
823 ; CHECK: cmgt {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #{{0x0|0}}
824         %tmp3 = icmp sgt <4 x i16> %A, zeroinitializer;
825    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
826         ret <4 x i16> %tmp4
827 }
828
829 define <8 x i16> @cmgtz8xi16(<8 x i16> %A) {
830 ; CHECK-LABEL: cmgtz8xi16:
831 ; CHECK: cmgt {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #{{0x0|0}}
832         %tmp3 = icmp sgt <8 x i16> %A, zeroinitializer;
833    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
834         ret <8 x i16> %tmp4
835 }
836
837 define <2 x i32> @cmgtz2xi32(<2 x i32> %A) {
838 ; CHECK-LABEL: cmgtz2xi32:
839 ; CHECK: cmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0x0|0}}
840         %tmp3 = icmp sgt <2 x i32> %A, zeroinitializer;
841    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
842         ret <2 x i32> %tmp4
843 }
844
845 define <4 x i32> @cmgtz4xi32(<4 x i32> %A) {
846 ; CHECK-LABEL: cmgtz4xi32:
847 ; CHECK: cmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0x0|0}}
848         %tmp3 = icmp sgt <4 x i32> %A, zeroinitializer;
849    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
850         ret <4 x i32> %tmp4
851 }
852
853 define <2 x i64> @cmgtz2xi64(<2 x i64> %A) {
854 ; CHECK-LABEL: cmgtz2xi64:
855 ; CHECK: cmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0x0|0}}
856         %tmp3 = icmp sgt <2 x i64> %A, zeroinitializer;
857    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
858         ret <2 x i64> %tmp4
859 }
860
861 define <8 x i8> @cmlez8xi8(<8 x i8> %A) {
862 ; CHECK-LABEL: cmlez8xi8:
863 ; CHECK: cmle {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #{{0x0|0}}
864         %tmp3 = icmp sle <8 x i8> %A, zeroinitializer;
865    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
866         ret <8 x i8> %tmp4
867 }
868
869 define <16 x i8> @cmlez16xi8(<16 x i8> %A) {
870 ; CHECK-LABEL: cmlez16xi8:
871 ; CHECK: cmle {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #{{0x0|0}}
872         %tmp3 = icmp sle <16 x i8> %A, zeroinitializer;
873    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
874         ret <16 x i8> %tmp4
875 }
876
877 define <4 x i16> @cmlez4xi16(<4 x i16> %A) {
878 ; CHECK-LABEL: cmlez4xi16:
879 ; CHECK: cmle {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #{{0x0|0}}
880         %tmp3 = icmp sle <4 x i16> %A, zeroinitializer;
881    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
882         ret <4 x i16> %tmp4
883 }
884
885 define <8 x i16> @cmlez8xi16(<8 x i16> %A) {
886 ; CHECK-LABEL: cmlez8xi16:
887 ; CHECK: cmle {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #{{0x0|0}}
888         %tmp3 = icmp sle <8 x i16> %A, zeroinitializer;
889    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
890         ret <8 x i16> %tmp4
891 }
892
893 define <2 x i32> @cmlez2xi32(<2 x i32> %A) {
894 ; CHECK-LABEL: cmlez2xi32:
895 ; CHECK: cmle {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0x0|0}}
896         %tmp3 = icmp sle <2 x i32> %A, zeroinitializer;
897    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
898         ret <2 x i32> %tmp4
899 }
900
901 define <4 x i32> @cmlez4xi32(<4 x i32> %A) {
902 ; CHECK-LABEL: cmlez4xi32:
903 ; CHECK: cmle {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0x0|0}}
904         %tmp3 = icmp sle <4 x i32> %A, zeroinitializer;
905    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
906         ret <4 x i32> %tmp4
907 }
908
909 define <2 x i64> @cmlez2xi64(<2 x i64> %A) {
910 ; CHECK-LABEL: cmlez2xi64:
911 ; CHECK: cmle {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0x0|0}}
912         %tmp3 = icmp sle <2 x i64> %A, zeroinitializer;
913    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
914         ret <2 x i64> %tmp4
915 }
916
917 define <8 x i8> @cmltz8xi8(<8 x i8> %A) {
918 ; CHECK-LABEL: cmltz8xi8:
919 ; CHECK: cmlt {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #{{0x0|0}}
920         %tmp3 = icmp slt <8 x i8> %A, zeroinitializer;
921    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
922         ret <8 x i8> %tmp4
923 }
924
925 define <16 x i8> @cmltz16xi8(<16 x i8> %A) {
926 ; CHECK-LABEL: cmltz16xi8:
927 ; CHECK: cmlt {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #{{0x0|0}}
928         %tmp3 = icmp slt <16 x i8> %A, zeroinitializer;
929    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
930         ret <16 x i8> %tmp4
931 }
932
933 define <4 x i16> @cmltz4xi16(<4 x i16> %A) {
934 ; CHECK-LABEL: cmltz4xi16:
935 ; CHECK: cmlt {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #{{0x0|0}}
936         %tmp3 = icmp slt <4 x i16> %A, zeroinitializer;
937    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
938         ret <4 x i16> %tmp4
939 }
940
941 define <8 x i16> @cmltz8xi16(<8 x i16> %A) {
942 ; CHECK-LABEL: cmltz8xi16:
943 ; CHECK: cmlt {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #{{0x0|0}}
944         %tmp3 = icmp slt <8 x i16> %A, zeroinitializer;
945    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
946         ret <8 x i16> %tmp4
947 }
948
949 define <2 x i32> @cmltz2xi32(<2 x i32> %A) {
950 ; CHECK-LABEL: cmltz2xi32:
951 ; CHECK: cmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0x0|0}}
952         %tmp3 = icmp slt <2 x i32> %A, zeroinitializer;
953    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
954         ret <2 x i32> %tmp4
955 }
956
957 define <4 x i32> @cmltz4xi32(<4 x i32> %A) {
958 ; CHECK-LABEL: cmltz4xi32:
959 ; CHECK: cmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0x0|0}}
960         %tmp3 = icmp slt <4 x i32> %A, zeroinitializer;
961    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
962         ret <4 x i32> %tmp4
963 }
964
965 define <2 x i64> @cmltz2xi64(<2 x i64> %A) {
966 ; CHECK-LABEL: cmltz2xi64:
967 ; CHECK: cmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0x0|0}}
968         %tmp3 = icmp slt <2 x i64> %A, zeroinitializer;
969    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
970         ret <2 x i64> %tmp4
971 }
972
973 define <8 x i8> @cmneqz8xi8(<8 x i8> %A) {
974 ; CHECK-LABEL: cmneqz8xi8:
975 ; CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #{{0x0|0}}
976 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
977         %tmp3 = icmp ne <8 x i8> %A, zeroinitializer;
978    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
979         ret <8 x i8> %tmp4
980 }
981
982 define <16 x i8> @cmneqz16xi8(<16 x i8> %A) {
983 ; CHECK-LABEL: cmneqz16xi8:
984 ; CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #{{0x0|0}}
985 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
986         %tmp3 = icmp ne <16 x i8> %A, zeroinitializer;
987    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
988         ret <16 x i8> %tmp4
989 }
990
991 define <4 x i16> @cmneqz4xi16(<4 x i16> %A) {
992 ; CHECK-LABEL: cmneqz4xi16:
993 ; CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #{{0x0|0}}
994 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
995         %tmp3 = icmp ne <4 x i16> %A, zeroinitializer;
996    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
997         ret <4 x i16> %tmp4
998 }
999
1000 define <8 x i16> @cmneqz8xi16(<8 x i16> %A) {
1001 ; CHECK-LABEL: cmneqz8xi16:
1002 ; CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #{{0x0|0}}
1003 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1004         %tmp3 = icmp ne <8 x i16> %A, zeroinitializer;
1005    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1006         ret <8 x i16> %tmp4
1007 }
1008
1009 define <2 x i32> @cmneqz2xi32(<2 x i32> %A) {
1010 ; CHECK-LABEL: cmneqz2xi32:
1011 ; CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0x0|0}}
1012 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1013         %tmp3 = icmp ne <2 x i32> %A, zeroinitializer;
1014    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1015         ret <2 x i32> %tmp4
1016 }
1017
1018 define <4 x i32> @cmneqz4xi32(<4 x i32> %A) {
1019 ; CHECK-LABEL: cmneqz4xi32:
1020 ; CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0x0|0}}
1021 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1022         %tmp3 = icmp ne <4 x i32> %A, zeroinitializer;
1023    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1024         ret <4 x i32> %tmp4
1025 }
1026
1027 define <2 x i64> @cmneqz2xi64(<2 x i64> %A) {
1028 ; CHECK-LABEL: cmneqz2xi64:
1029 ; CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0x0|0}}
1030 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1031         %tmp3 = icmp ne <2 x i64> %A, zeroinitializer;
1032    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1033         ret <2 x i64> %tmp4
1034 }
1035
1036 define <8 x i8> @cmhsz8xi8(<8 x i8> %A) {
1037 ; CHECK-LABEL: cmhsz8xi8:
1038 ; CHECK: movi {{v[0-9]+.8b|d[0-9]+}}, #{{0x0|0}}
1039 ; CHECK-NEXT: cmhs {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1040         %tmp3 = icmp uge <8 x i8> %A, zeroinitializer;
1041    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1042         ret <8 x i8> %tmp4
1043 }
1044
1045 define <16 x i8> @cmhsz16xi8(<16 x i8> %A) {
1046 ; CHECK-LABEL: cmhsz16xi8:
1047 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1048 ; CHECK-NEXT: cmhs {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1049         %tmp3 = icmp uge <16 x i8> %A, zeroinitializer;
1050    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1051         ret <16 x i8> %tmp4
1052 }
1053
1054 define <4 x i16> @cmhsz4xi16(<4 x i16> %A) {
1055 ; CHECK-LABEL: cmhsz4xi16:
1056 ; CHECK: movi {{v[0-9]+.8b|d[0-9]+}}, #{{0x0|0}}
1057 ; CHECK-NEXT: cmhs {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1058         %tmp3 = icmp uge <4 x i16> %A, zeroinitializer;
1059    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1060         ret <4 x i16> %tmp4
1061 }
1062
1063 define <8 x i16> @cmhsz8xi16(<8 x i16> %A) {
1064 ; CHECK-LABEL: cmhsz8xi16:
1065 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1066 ; CHECK-NEXT: cmhs {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1067         %tmp3 = icmp uge <8 x i16> %A, zeroinitializer;
1068    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1069         ret <8 x i16> %tmp4
1070 }
1071
1072 define <2 x i32> @cmhsz2xi32(<2 x i32> %A) {
1073 ; CHECK-LABEL: cmhsz2xi32:
1074 ; CHECK: movi {{v[0-9]+.8b|d[0-9]+}}, #{{0x0|0}}
1075 ; CHECK-NEXT: cmhs {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1076         %tmp3 = icmp uge <2 x i32> %A, zeroinitializer;
1077    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1078         ret <2 x i32> %tmp4
1079 }
1080
1081 define <4 x i32> @cmhsz4xi32(<4 x i32> %A) {
1082 ; CHECK-LABEL: cmhsz4xi32:
1083 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1084 ; CHECK-NEXT: cmhs {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1085         %tmp3 = icmp uge <4 x i32> %A, zeroinitializer;
1086    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1087         ret <4 x i32> %tmp4
1088 }
1089
1090 define <2 x i64> @cmhsz2xi64(<2 x i64> %A) {
1091 ; CHECK-LABEL: cmhsz2xi64:
1092 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1093 ; CHECK-NEXT: cmhs {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1094         %tmp3 = icmp uge <2 x i64> %A, zeroinitializer;
1095    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1096         ret <2 x i64> %tmp4
1097 }
1098
1099
1100 define <8 x i8> @cmhiz8xi8(<8 x i8> %A) {
1101 ; CHECK-LABEL: cmhiz8xi8:
1102 ; CHECK: movi {{v[0-9]+.8b|d[0-9]+}}, #{{0x0|0}}
1103 ; CHECK-NEXT: cmhi {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1104         %tmp3 = icmp ugt <8 x i8> %A, zeroinitializer;
1105    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1106         ret <8 x i8> %tmp4
1107 }
1108
1109 define <16 x i8> @cmhiz16xi8(<16 x i8> %A) {
1110 ; CHECK-LABEL: cmhiz16xi8:
1111 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1112 ; CHECK-NEXT: cmhi {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1113         %tmp3 = icmp ugt <16 x i8> %A, zeroinitializer;
1114    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1115         ret <16 x i8> %tmp4
1116 }
1117
1118 define <4 x i16> @cmhiz4xi16(<4 x i16> %A) {
1119 ; CHECK-LABEL: cmhiz4xi16:
1120 ; CHECK: movi {{v[0-9]+.8b|d[0-9]+}}, #{{0x0|0}}
1121 ; CHECK-NEXT: cmhi {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1122         %tmp3 = icmp ugt <4 x i16> %A, zeroinitializer;
1123    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1124         ret <4 x i16> %tmp4
1125 }
1126
1127 define <8 x i16> @cmhiz8xi16(<8 x i16> %A) {
1128 ; CHECK-LABEL: cmhiz8xi16:
1129 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1130 ; CHECK-NEXT: cmhi {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1131         %tmp3 = icmp ugt <8 x i16> %A, zeroinitializer;
1132    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1133         ret <8 x i16> %tmp4
1134 }
1135
1136 define <2 x i32> @cmhiz2xi32(<2 x i32> %A) {
1137 ; CHECK-LABEL: cmhiz2xi32:
1138 ; CHECK: movi {{v[0-9]+.8b|d[0-9]+}}, #{{0x0|0}}
1139 ; CHECK-NEXT: cmhi {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1140         %tmp3 = icmp ugt <2 x i32> %A, zeroinitializer;
1141    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1142         ret <2 x i32> %tmp4
1143 }
1144
1145 define <4 x i32> @cmhiz4xi32(<4 x i32> %A) {
1146 ; CHECK-LABEL: cmhiz4xi32:
1147 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1148 ; CHECK-NEXT: cmhi {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1149         %tmp3 = icmp ugt <4 x i32> %A, zeroinitializer;
1150    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1151         ret <4 x i32> %tmp4
1152 }
1153
1154 define <2 x i64> @cmhiz2xi64(<2 x i64> %A) {
1155 ; CHECK-LABEL: cmhiz2xi64:
1156 ; CHECK: movi {{v[0-9]+.(16b|2d)}}, #{{0x0|0}}
1157 ; CHECK-NEXT: cmhi {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1158         %tmp3 = icmp ugt <2 x i64> %A, zeroinitializer;
1159    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1160         ret <2 x i64> %tmp4
1161 }
1162
1163 define <8 x i8> @cmlsz8xi8(<8 x i8> %A) {
1164 ; CHECK-LABEL: cmlsz8xi8:
1165 ; Using registers other than v0, v1 are possible, but would be odd.
1166 ; LS implemented as HS, so check reversed operands.
1167 ; CHECK: movi {{v1.8b|d1}}, #{{0x0|0}}
1168 ; CHECK-NEXT: cmhs {{v[0-9]+}}.8b, v1.8b, v0.8b
1169         %tmp3 = icmp ule <8 x i8> %A, zeroinitializer;
1170    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1171         ret <8 x i8> %tmp4
1172 }
1173
1174 define <16 x i8> @cmlsz16xi8(<16 x i8> %A) {
1175 ; CHECK-LABEL: cmlsz16xi8:
1176 ; Using registers other than v0, v1 are possible, but would be odd.
1177 ; LS implemented as HS, so check reversed operands.
1178 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1179 ; CHECK-NEXT: cmhs {{v[0-9]+}}.16b, v1.16b, v0.16b
1180         %tmp3 = icmp ule <16 x i8> %A, zeroinitializer;
1181    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1182         ret <16 x i8> %tmp4
1183 }
1184
1185 define <4 x i16> @cmlsz4xi16(<4 x i16> %A) {
1186 ; CHECK-LABEL: cmlsz4xi16:
1187 ; Using registers other than v0, v1 are possible, but would be odd.
1188 ; LS implemented as HS, so check reversed operands.
1189 ; CHECK: movi {{v1.8b|d1}}, #{{0x0|0}}
1190 ; CHECK-NEXT: cmhs {{v[0-9]+}}.4h, v1.4h, v0.4h
1191         %tmp3 = icmp ule <4 x i16> %A, zeroinitializer;
1192    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1193         ret <4 x i16> %tmp4
1194 }
1195
1196 define <8 x i16> @cmlsz8xi16(<8 x i16> %A) {
1197 ; CHECK-LABEL: cmlsz8xi16:
1198 ; Using registers other than v0, v1 are possible, but would be odd.
1199 ; LS implemented as HS, so check reversed operands.
1200 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1201 ; CHECK-NEXT: cmhs {{v[0-9]+}}.8h, v1.8h, v0.8h
1202         %tmp3 = icmp ule <8 x i16> %A, zeroinitializer;
1203    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1204         ret <8 x i16> %tmp4
1205 }
1206
1207 define <2 x i32> @cmlsz2xi32(<2 x i32> %A) {
1208 ; CHECK-LABEL: cmlsz2xi32:
1209 ; Using registers other than v0, v1 are possible, but would be odd.
1210 ; LS implemented as HS, so check reversed operands.
1211 ; CHECK: movi {{v1.8b|d1}}, #{{0x0|0}}
1212 ; CHECK-NEXT: cmhs {{v[0-9]+}}.2s, v1.2s, v0.2s
1213         %tmp3 = icmp ule <2 x i32> %A, zeroinitializer;
1214    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1215         ret <2 x i32> %tmp4
1216 }
1217
1218 define <4 x i32> @cmlsz4xi32(<4 x i32> %A) {
1219 ; CHECK-LABEL: cmlsz4xi32:
1220 ; Using registers other than v0, v1 are possible, but would be odd.
1221 ; LS implemented as HS, so check reversed operands.
1222 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1223 ; CHECK-NEXT: cmhs {{v[0-9]+}}.4s, v1.4s, v0.4s
1224         %tmp3 = icmp ule <4 x i32> %A, zeroinitializer;
1225    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1226         ret <4 x i32> %tmp4
1227 }
1228
1229 define <2 x i64> @cmlsz2xi64(<2 x i64> %A) {
1230 ; CHECK-LABEL: cmlsz2xi64:
1231 ; Using registers other than v0, v1 are possible, but would be odd.
1232 ; LS implemented as HS, so check reversed operands.
1233 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1234 ; CHECK-NEXT: cmhs {{v[0-9]+}}.2d, v1.2d, v0.2d
1235         %tmp3 = icmp ule <2 x i64> %A, zeroinitializer;
1236    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1237         ret <2 x i64> %tmp4
1238 }
1239
1240 define <8 x i8> @cmloz8xi8(<8 x i8> %A) {
1241 ; CHECK-LABEL: cmloz8xi8:
1242 ; Using registers other than v0, v1 are possible, but would be odd.
1243 ; LO implemented as HI, so check reversed operands.
1244 ; CHECK: movi {{v1.8b|d1}}, #{{0x0|0}}
1245 ; CHECK-NEXT: cmhi {{v[0-9]+}}.8b, v1.8b, {{v[0-9]+}}.8b
1246         %tmp3 = icmp ult <8 x i8> %A, zeroinitializer;
1247    %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
1248         ret <8 x i8> %tmp4
1249 }
1250
1251 define <16 x i8> @cmloz16xi8(<16 x i8> %A) {
1252 ; CHECK-LABEL: cmloz16xi8:
1253 ; Using registers other than v0, v1 are possible, but would be odd.
1254 ; LO implemented as HI, so check reversed operands.
1255 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1256 ; CHECK-NEXT: cmhi {{v[0-9]+}}.16b, v1.16b, v0.16b
1257         %tmp3 = icmp ult <16 x i8> %A, zeroinitializer;
1258    %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
1259         ret <16 x i8> %tmp4
1260 }
1261
1262 define <4 x i16> @cmloz4xi16(<4 x i16> %A) {
1263 ; CHECK-LABEL: cmloz4xi16:
1264 ; Using registers other than v0, v1 are possible, but would be odd.
1265 ; LO implemented as HI, so check reversed operands.
1266 ; CHECK: movi {{v1.8b|d1}}, #{{0x0|0}}
1267 ; CHECK-NEXT: cmhi {{v[0-9]+}}.4h, v1.4h, v0.4h
1268         %tmp3 = icmp ult <4 x i16> %A, zeroinitializer;
1269    %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
1270         ret <4 x i16> %tmp4
1271 }
1272
1273 define <8 x i16> @cmloz8xi16(<8 x i16> %A) {
1274 ; CHECK-LABEL: cmloz8xi16:
1275 ; Using registers other than v0, v1 are possible, but would be odd.
1276 ; LO implemented as HI, so check reversed operands.
1277 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1278 ; CHECK-NEXT: cmhi {{v[0-9]+}}.8h, v1.8h, v0.8h
1279         %tmp3 = icmp ult <8 x i16> %A, zeroinitializer;
1280    %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
1281         ret <8 x i16> %tmp4
1282 }
1283
1284 define <2 x i32> @cmloz2xi32(<2 x i32> %A) {
1285 ; CHECK-LABEL: cmloz2xi32:
1286 ; Using registers other than v0, v1 are possible, but would be odd.
1287 ; LO implemented as HI, so check reversed operands.
1288 ; CHECK: movi {{v1.8b|d1}}, #{{0x0|0}}
1289 ; CHECK-NEXT: cmhi {{v[0-9]+}}.2s, v1.2s, v0.2s
1290         %tmp3 = icmp ult <2 x i32> %A, zeroinitializer;
1291    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1292         ret <2 x i32> %tmp4
1293 }
1294
1295 define <4 x i32> @cmloz4xi32(<4 x i32> %A) {
1296 ; CHECK-LABEL: cmloz4xi32:
1297 ; Using registers other than v0, v1 are possible, but would be odd.
1298 ; LO implemented as HI, so check reversed operands.
1299 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1300 ; CHECK-NEXT: cmhi {{v[0-9]+}}.4s, v1.4s, v0.4s
1301         %tmp3 = icmp ult <4 x i32> %A, zeroinitializer;
1302    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1303         ret <4 x i32> %tmp4
1304 }
1305
1306 define <2 x i64> @cmloz2xi64(<2 x i64> %A) {
1307 ; CHECK-LABEL: cmloz2xi64:
1308 ; Using registers other than v0, v1 are possible, but would be odd.
1309 ; LO implemented as HI, so check reversed operands.
1310 ; CHECK: movi {{v1.16b|v1.2d}}, #{{0x0|0}}
1311 ; CHECK-NEXT: cmhi {{v[0-9]+}}.2d, v1.2d, v0.2d
1312         %tmp3 = icmp ult <2 x i64> %A, zeroinitializer;
1313    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1314         ret <2 x i64> %tmp4
1315 }
1316
1317
1318 define <2 x i32> @fcmoeq2xfloat(<2 x float> %A, <2 x float> %B) {
1319 ; CHECK-LABEL: fcmoeq2xfloat:
1320 ; CHECK: fcmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1321    %tmp3 = fcmp oeq <2 x float> %A, %B
1322    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1323         ret <2 x i32> %tmp4
1324 }
1325
1326 define <4 x i32> @fcmoeq4xfloat(<4 x float> %A, <4 x float> %B) {
1327 ; CHECK-LABEL: fcmoeq4xfloat:
1328 ; CHECK: fcmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1329    %tmp3 = fcmp oeq <4 x float> %A, %B
1330    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1331         ret <4 x i32> %tmp4
1332 }
1333 define <2 x i64> @fcmoeq2xdouble(<2 x double> %A, <2 x double> %B) {
1334 ; CHECK-LABEL: fcmoeq2xdouble:
1335 ; CHECK: fcmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1336    %tmp3 = fcmp oeq <2 x double> %A, %B
1337    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1338         ret <2 x i64> %tmp4
1339 }
1340
1341 define <2 x i32> @fcmoge2xfloat(<2 x float> %A, <2 x float> %B) {
1342 ; CHECK-LABEL: fcmoge2xfloat:
1343 ; CHECK: fcmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1344    %tmp3 = fcmp oge <2 x float> %A, %B
1345    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1346         ret <2 x i32> %tmp4
1347 }
1348
1349 define <4 x i32> @fcmoge4xfloat(<4 x float> %A, <4 x float> %B) {
1350 ; CHECK-LABEL: fcmoge4xfloat:
1351 ; CHECK: fcmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1352    %tmp3 = fcmp oge <4 x float> %A, %B
1353    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1354         ret <4 x i32> %tmp4
1355 }
1356 define <2 x i64> @fcmoge2xdouble(<2 x double> %A, <2 x double> %B) {
1357 ; CHECK-LABEL: fcmoge2xdouble:
1358 ; CHECK: fcmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1359    %tmp3 = fcmp oge <2 x double> %A, %B
1360    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1361         ret <2 x i64> %tmp4
1362 }
1363
1364 define <2 x i32> @fcmogt2xfloat(<2 x float> %A, <2 x float> %B) {
1365 ; CHECK-LABEL: fcmogt2xfloat:
1366 ; CHECK: fcmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1367    %tmp3 = fcmp ogt <2 x float> %A, %B
1368    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1369         ret <2 x i32> %tmp4
1370 }
1371
1372 define <4 x i32> @fcmogt4xfloat(<4 x float> %A, <4 x float> %B) {
1373 ; CHECK-LABEL: fcmogt4xfloat:
1374 ; CHECK: fcmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1375    %tmp3 = fcmp ogt <4 x float> %A, %B
1376    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1377         ret <4 x i32> %tmp4
1378 }
1379 define <2 x i64> @fcmogt2xdouble(<2 x double> %A, <2 x double> %B) {
1380 ; CHECK-LABEL: fcmogt2xdouble:
1381 ; CHECK: fcmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1382    %tmp3 = fcmp ogt <2 x double> %A, %B
1383    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1384         ret <2 x i64> %tmp4
1385 }
1386
1387 define <2 x i32> @fcmole2xfloat(<2 x float> %A, <2 x float> %B) {
1388 ; CHECK-LABEL: fcmole2xfloat:
1389 ; Using registers other than v0, v1 are possible, but would be odd.
1390 ; OLE implemented as OGE, so check reversed operands.
1391 ; CHECK: fcmge {{v[0-9]+}}.2s, v1.2s, v0.2s
1392    %tmp3 = fcmp ole <2 x float> %A, %B
1393    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1394         ret <2 x i32> %tmp4
1395 }
1396
1397 define <4 x i32> @fcmole4xfloat(<4 x float> %A, <4 x float> %B) {
1398 ; CHECK-LABEL: fcmole4xfloat:
1399 ; Using registers other than v0, v1 are possible, but would be odd.
1400 ; OLE implemented as OGE, so check reversed operands.
1401 ; CHECK: fcmge {{v[0-9]+}}.4s, v1.4s, v0.4s
1402    %tmp3 = fcmp ole <4 x float> %A, %B
1403    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1404         ret <4 x i32> %tmp4
1405 }
1406 define <2 x i64> @fcmole2xdouble(<2 x double> %A, <2 x double> %B) {
1407 ; CHECK-LABEL: fcmole2xdouble:
1408 ; Using registers other than v0, v1 are possible, but would be odd.
1409 ; OLE implemented as OGE, so check reversed operands.
1410 ; CHECK: fcmge {{v[0-9]+}}.2d, v1.2d, v0.2d
1411    %tmp3 = fcmp ole <2 x double> %A, %B
1412    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1413         ret <2 x i64> %tmp4
1414 }
1415
1416 define <2 x i32> @fcmolt2xfloat(<2 x float> %A, <2 x float> %B) {
1417 ; CHECK-LABEL: fcmolt2xfloat:
1418 ; Using registers other than v0, v1 are possible, but would be odd.
1419 ; OLE implemented as OGE, so check reversed operands.
1420 ; CHECK: fcmgt {{v[0-9]+}}.2s, v1.2s, v0.2s
1421    %tmp3 = fcmp olt <2 x float> %A, %B
1422    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1423         ret <2 x i32> %tmp4
1424 }
1425
1426 define <4 x i32> @fcmolt4xfloat(<4 x float> %A, <4 x float> %B) {
1427 ; CHECK-LABEL: fcmolt4xfloat:
1428 ; Using registers other than v0, v1 are possible, but would be odd.
1429 ; OLE implemented as OGE, so check reversed operands.
1430 ; CHECK: fcmgt {{v[0-9]+}}.4s, v1.4s, v0.4s
1431    %tmp3 = fcmp olt <4 x float> %A, %B
1432    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1433         ret <4 x i32> %tmp4
1434 }
1435 define <2 x i64> @fcmolt2xdouble(<2 x double> %A, <2 x double> %B) {
1436 ; CHECK-LABEL: fcmolt2xdouble:
1437 ; Using registers other than v0, v1 are possible, but would be odd.
1438 ; OLE implemented as OGE, so check reversed operands.
1439 ; CHECK: fcmgt {{v[0-9]+}}.2d, v1.2d, v0.2d
1440    %tmp3 = fcmp olt <2 x double> %A, %B
1441    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1442         ret <2 x i64> %tmp4
1443 }
1444
1445 define <2 x i32> @fcmone2xfloat(<2 x float> %A, <2 x float> %B) {
1446 ; CHECK-LABEL: fcmone2xfloat:
1447 ; Using registers other than v0, v1 are possible, but would be odd.
1448 ; ONE = OGT | OLT, OLT implemented as OGT so check reversed operands
1449 ; CHECK: fcmgt {{v[0-9]+}}.2s, v0.2s, v1.2s
1450 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2s, v1.2s, v0.2s
1451 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1452    %tmp3 = fcmp one <2 x float> %A, %B
1453    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1454         ret <2 x i32> %tmp4
1455 }
1456
1457 define <4 x i32> @fcmone4xfloat(<4 x float> %A, <4 x float> %B) {
1458 ; CHECK-LABEL: fcmone4xfloat:
1459 ; Using registers other than v0, v1 are possible, but would be odd.
1460 ; ONE = OGT | OLT, OLT implemented as OGT so check reversed operands
1461 ; CHECK: fcmgt {{v[0-9]+}}.4s, v0.4s, v1.4s
1462 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.4s, v1.4s, v0.4s
1463 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1464    %tmp3 = fcmp one <4 x float> %A, %B
1465    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1466         ret <4 x i32> %tmp4
1467 }
1468 define <2 x i64> @fcmone2xdouble(<2 x double> %A, <2 x double> %B) {
1469 ; CHECK-LABEL: fcmone2xdouble:
1470 ; Using registers other than v0, v1 are possible, but would be odd.
1471 ; ONE = OGT | OLT, OLT implemented as OGT so check reversed operands
1472 ; CHECK: fcmgt {{v[0-9]+}}.2d, v0.2d, v1.2d
1473 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2d, v1.2d, v0.2d
1474 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1475 ; todo check reversed operands
1476    %tmp3 = fcmp one <2 x double> %A, %B
1477    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1478         ret <2 x i64> %tmp4
1479 }
1480
1481
1482 define <2 x i32> @fcmord2xfloat(<2 x float> %A, <2 x float> %B) {
1483 ; CHECK-LABEL: fcmord2xfloat:
1484 ; Using registers other than v0, v1 are possible, but would be odd.
1485 ; ORD = OGE | OLT, OLT implemented as OGT, so check reversed operands.
1486 ; CHECK: fcmge {{v[0-9]+}}.2s, v0.2s, v1.2s
1487 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2s, v1.2s, v0.2s
1488 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1489    %tmp3 = fcmp ord <2 x float> %A, %B
1490    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1491         ret <2 x i32> %tmp4
1492 }
1493
1494
1495 define <4 x i32> @fcmord4xfloat(<4 x float> %A, <4 x float> %B) {
1496 ; CHECK-LABEL: fcmord4xfloat:
1497 ; Using registers other than v0, v1 are possible, but would be odd.
1498 ; ORD = OGE | OLT, OLT implemented as OGT, so check reversed operands.
1499 ; CHECK: fcmge {{v[0-9]+}}.4s, v0.4s, v1.4s
1500 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.4s, v1.4s, v0.4s
1501 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1502    %tmp3 = fcmp ord <4 x float> %A, %B
1503    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1504         ret <4 x i32> %tmp4
1505 }
1506
1507 define <2 x i64> @fcmord2xdouble(<2 x double> %A, <2 x double> %B) {
1508 ; CHECK-LABEL: fcmord2xdouble:
1509 ; Using registers other than v0, v1 are possible, but would be odd.
1510 ; ORD = OGE | OLT, OLT implemented as OGT, so check reversed operands.
1511 ; CHECK: fcmge {{v[0-9]+}}.2d, v0.2d, v1.2d
1512 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2d, v1.2d, v0.2d
1513 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1514    %tmp3 = fcmp ord <2 x double> %A, %B
1515    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1516         ret <2 x i64> %tmp4
1517 }
1518
1519
1520 define <2 x i32> @fcmuno2xfloat(<2 x float> %A, <2 x float> %B) {
1521 ; CHECK-LABEL: fcmuno2xfloat:
1522 ; Using registers other than v0, v1 are possible, but would be odd.
1523 ; UNO = !(OGE | OLT), OLT implemented as OGT, so check reversed operands.
1524 ; CHECK: fcmge {{v[0-9]+}}.2s, v0.2s, v1.2s
1525 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2s, v1.2s, v0.2s
1526 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1527 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1528    %tmp3 = fcmp uno <2 x float> %A, %B
1529    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1530         ret <2 x i32> %tmp4
1531 }
1532
1533 define <4 x i32> @fcmuno4xfloat(<4 x float> %A, <4 x float> %B) {
1534 ; CHECK-LABEL: fcmuno4xfloat:
1535 ; Using registers other than v0, v1 are possible, but would be odd.
1536 ; UNO = !(OGE | OLT), OLT implemented as OGT, so check reversed operands.
1537 ; CHECK: fcmge {{v[0-9]+}}.4s, v0.4s, v1.4s
1538 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.4s, v1.4s, v0.4s
1539 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1540 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1541    %tmp3 = fcmp uno <4 x float> %A, %B
1542    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1543         ret <4 x i32> %tmp4
1544 }
1545
1546 define <2 x i64> @fcmuno2xdouble(<2 x double> %A, <2 x double> %B) {
1547 ; CHECK-LABEL: fcmuno2xdouble:
1548 ; Using registers other than v0, v1 are possible, but would be odd.
1549 ; UNO = !(OGE | OLT), OLT implemented as OGT, so check reversed operands.
1550 ; CHECK: fcmge {{v[0-9]+}}.2d, v0.2d, v1.2d
1551 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2d, v1.2d, v0.2d
1552 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1553 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1554    %tmp3 = fcmp uno <2 x double> %A, %B
1555    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1556         ret <2 x i64> %tmp4
1557 }
1558
1559 define <2 x i32> @fcmueq2xfloat(<2 x float> %A, <2 x float> %B) {
1560 ; CHECK-LABEL: fcmueq2xfloat:
1561 ; Using registers other than v0, v1 are possible, but would be odd.
1562 ; UEQ = !ONE = !(OGT | OLT), OLT implemented as OGT so check reversed operands
1563 ; CHECK: fcmgt {{v[0-9]+}}.2s, v0.2s, v1.2s
1564 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2s, v1.2s, v0.2s
1565 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1566 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1567    %tmp3 = fcmp ueq <2 x float> %A, %B
1568    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1569         ret <2 x i32> %tmp4
1570 }
1571
1572 define <4 x i32> @fcmueq4xfloat(<4 x float> %A, <4 x float> %B) {
1573 ; CHECK-LABEL: fcmueq4xfloat:
1574 ; Using registers other than v0, v1 are possible, but would be odd.
1575 ; UEQ = !ONE = !(OGT | OLT), OLT implemented as OGT so check reversed operands
1576 ; CHECK: fcmgt {{v[0-9]+}}.4s, v0.4s, v1.4s
1577 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.4s, v1.4s, v0.4s
1578 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1579 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1580    %tmp3 = fcmp ueq <4 x float> %A, %B
1581    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1582         ret <4 x i32> %tmp4
1583 }
1584
1585 define <2 x i64> @fcmueq2xdouble(<2 x double> %A, <2 x double> %B) {
1586 ; CHECK-LABEL: fcmueq2xdouble:
1587 ; Using registers other than v0, v1 are possible, but would be odd.
1588 ; UEQ = !ONE = !(OGT | OLT), OLT implemented as OGT so check reversed operands
1589 ; CHECK: fcmgt {{v[0-9]+}}.2d, v0.2d, v1.2d
1590 ; CHECK-NEXT: fcmgt {{v[0-9]+}}.2d, v1.2d, v0.2d
1591 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1592 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1593    %tmp3 = fcmp ueq <2 x double> %A, %B
1594    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1595         ret <2 x i64> %tmp4
1596 }
1597
1598 define <2 x i32> @fcmuge2xfloat(<2 x float> %A, <2 x float> %B) {
1599 ; CHECK-LABEL: fcmuge2xfloat:
1600 ; Using registers other than v0, v1 are possible, but would be odd.
1601 ; UGE = ULE with swapped operands, ULE implemented as !OGT.
1602 ; CHECK: fcmgt {{v[0-9]+}}.2s, v1.2s, v0.2s
1603 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1604    %tmp3 = fcmp uge <2 x float> %A, %B
1605    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1606         ret <2 x i32> %tmp4
1607 }
1608
1609 define <4 x i32> @fcmuge4xfloat(<4 x float> %A, <4 x float> %B) {
1610 ; CHECK-LABEL: fcmuge4xfloat:
1611 ; Using registers other than v0, v1 are possible, but would be odd.
1612 ; UGE = ULE with swapped operands, ULE implemented as !OGT.
1613 ; CHECK: fcmgt {{v[0-9]+}}.4s, v1.4s, v0.4s
1614 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1615    %tmp3 = fcmp uge <4 x float> %A, %B
1616    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1617         ret <4 x i32> %tmp4
1618 }
1619
1620 define <2 x i64> @fcmuge2xdouble(<2 x double> %A, <2 x double> %B) {
1621 ; CHECK-LABEL: fcmuge2xdouble:
1622 ; Using registers other than v0, v1 are possible, but would be odd.
1623 ; UGE = ULE with swapped operands, ULE implemented as !OGT.
1624 ; CHECK: fcmgt {{v[0-9]+}}.2d, v1.2d, v0.2d
1625 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1626    %tmp3 = fcmp uge <2 x double> %A, %B
1627    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1628         ret <2 x i64> %tmp4
1629 }
1630
1631 define <2 x i32> @fcmugt2xfloat(<2 x float> %A, <2 x float> %B) {
1632 ; CHECK-LABEL: fcmugt2xfloat:
1633 ; Using registers other than v0, v1 are possible, but would be odd.
1634 ; UGT = ULT with swapped operands, ULT implemented as !OGE.
1635 ; CHECK: fcmge {{v[0-9]+}}.2s, v1.2s, v0.2s
1636 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1637    %tmp3 = fcmp ugt <2 x float> %A, %B
1638    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1639         ret <2 x i32> %tmp4
1640 }
1641
1642 define <4 x i32> @fcmugt4xfloat(<4 x float> %A, <4 x float> %B) {
1643 ; CHECK-LABEL: fcmugt4xfloat:
1644 ; Using registers other than v0, v1 are possible, but would be odd.
1645 ; UGT = ULT with swapped operands, ULT implemented as !OGE.
1646 ; CHECK: fcmge {{v[0-9]+}}.4s, v1.4s, v0.4s
1647 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1648    %tmp3 = fcmp ugt <4 x float> %A, %B
1649    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1650         ret <4 x i32> %tmp4
1651 }
1652 define <2 x i64> @fcmugt2xdouble(<2 x double> %A, <2 x double> %B) {
1653 ; CHECK-LABEL: fcmugt2xdouble:
1654 ; CHECK: fcmge {{v[0-9]+}}.2d, v1.2d, v0.2d
1655 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1656    %tmp3 = fcmp ugt <2 x double> %A, %B
1657    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1658         ret <2 x i64> %tmp4
1659 }
1660
1661 define <2 x i32> @fcmule2xfloat(<2 x float> %A, <2 x float> %B) {
1662 ; CHECK-LABEL: fcmule2xfloat:
1663 ; Using registers other than v0, v1 are possible, but would be odd.
1664 ; ULE implemented as !OGT.
1665 ; CHECK: fcmgt {{v[0-9]+}}.2s, v0.2s, v1.2s
1666 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1667    %tmp3 = fcmp ule <2 x float> %A, %B
1668    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1669         ret <2 x i32> %tmp4
1670 }
1671
1672 define <4 x i32> @fcmule4xfloat(<4 x float> %A, <4 x float> %B) {
1673 ; CHECK-LABEL: fcmule4xfloat:
1674 ; Using registers other than v0, v1 are possible, but would be odd.
1675 ; ULE implemented as !OGT.
1676 ; CHECK: fcmgt {{v[0-9]+}}.4s, v0.4s, v1.4s
1677 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1678    %tmp3 = fcmp ule <4 x float> %A, %B
1679    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1680         ret <4 x i32> %tmp4
1681 }
1682 define <2 x i64> @fcmule2xdouble(<2 x double> %A, <2 x double> %B) {
1683 ; CHECK-LABEL: fcmule2xdouble:
1684 ; Using registers other than v0, v1 are possible, but would be odd.
1685 ; ULE implemented as !OGT.
1686 ; CHECK: fcmgt {{v[0-9]+}}.2d, v0.2d, v1.2d
1687 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1688    %tmp3 = fcmp ule <2 x double> %A, %B
1689    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1690         ret <2 x i64> %tmp4
1691 }
1692
1693 define <2 x i32> @fcmult2xfloat(<2 x float> %A, <2 x float> %B) {
1694 ; CHECK-LABEL: fcmult2xfloat:
1695 ; Using registers other than v0, v1 are possible, but would be odd.
1696 ; ULT implemented as !OGE.
1697 ; CHECK: fcmge {{v[0-9]+}}.2s, v0.2s, v1.2s
1698 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1699    %tmp3 = fcmp ult <2 x float> %A, %B
1700    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1701         ret <2 x i32> %tmp4
1702 }
1703
1704 define <4 x i32> @fcmult4xfloat(<4 x float> %A, <4 x float> %B) {
1705 ; CHECK-LABEL: fcmult4xfloat:
1706 ; Using registers other than v0, v1 are possible, but would be odd.
1707 ; ULT implemented as !OGE.
1708 ; CHECK: fcmge {{v[0-9]+}}.4s, v0.4s, v1.4s
1709 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1710    %tmp3 = fcmp ult <4 x float> %A, %B
1711    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1712         ret <4 x i32> %tmp4
1713 }
1714 define <2 x i64> @fcmult2xdouble(<2 x double> %A, <2 x double> %B) {
1715 ; CHECK-LABEL: fcmult2xdouble:
1716 ; Using registers other than v0, v1 are possible, but would be odd.
1717 ; ULT implemented as !OGE.
1718 ; CHECK: fcmge {{v[0-9]+}}.2d, v0.2d, v1.2d
1719 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1720    %tmp3 = fcmp ult <2 x double> %A, %B
1721    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1722         ret <2 x i64> %tmp4
1723 }
1724
1725 define <2 x i32> @fcmune2xfloat(<2 x float> %A, <2 x float> %B) {
1726 ; CHECK-LABEL: fcmune2xfloat:
1727 ; Using registers other than v0, v1 are possible, but would be odd.
1728 ; UNE = !OEQ.
1729 ; CHECK: fcmeq {{v[0-9]+}}.2s, v0.2s, v1.2s
1730 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1731    %tmp3 = fcmp une <2 x float> %A, %B
1732    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1733         ret <2 x i32> %tmp4
1734 }
1735
1736 define <4 x i32> @fcmune4xfloat(<4 x float> %A, <4 x float> %B) {
1737 ; CHECK-LABEL: fcmune4xfloat:
1738 ; Using registers other than v0, v1 are possible, but would be odd.
1739 ; UNE = !OEQ.
1740 ; CHECK: fcmeq {{v[0-9]+}}.4s, v0.4s, v1.4s
1741 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1742    %tmp3 = fcmp une <4 x float> %A, %B
1743    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1744         ret <4 x i32> %tmp4
1745 }
1746 define <2 x i64> @fcmune2xdouble(<2 x double> %A, <2 x double> %B) {
1747 ; CHECK-LABEL: fcmune2xdouble:
1748 ; Using registers other than v0, v1 are possible, but would be odd.
1749 ; UNE = !OEQ.
1750 ; CHECK: fcmeq {{v[0-9]+}}.2d, v0.2d, v1.2d
1751 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1752    %tmp3 = fcmp une <2 x double> %A, %B
1753    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1754         ret <2 x i64> %tmp4
1755 }
1756
1757 define <2 x i32> @fcmoeqz2xfloat(<2 x float> %A) {
1758 ; CHECK-LABEL: fcmoeqz2xfloat:
1759 ; CHECK: fcmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1760    %tmp3 = fcmp oeq <2 x float> %A, zeroinitializer
1761    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1762         ret <2 x i32> %tmp4
1763 }
1764
1765 define <4 x i32> @fcmoeqz4xfloat(<4 x float> %A) {
1766 ; CHECK-LABEL: fcmoeqz4xfloat:
1767 ; CHECK: fcmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1768    %tmp3 = fcmp oeq <4 x float> %A, zeroinitializer
1769    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1770         ret <4 x i32> %tmp4
1771 }
1772 define <2 x i64> @fcmoeqz2xdouble(<2 x double> %A) {
1773 ; CHECK-LABEL: fcmoeqz2xdouble:
1774 ; CHECK: fcmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1775    %tmp3 = fcmp oeq <2 x double> %A, zeroinitializer
1776    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1777         ret <2 x i64> %tmp4
1778 }
1779
1780
1781 define <2 x i32> @fcmogez2xfloat(<2 x float> %A) {
1782 ; CHECK-LABEL: fcmogez2xfloat:
1783 ; CHECK: fcmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1784    %tmp3 = fcmp oge <2 x float> %A, zeroinitializer
1785    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1786         ret <2 x i32> %tmp4
1787 }
1788
1789 define <4 x i32> @fcmogez4xfloat(<4 x float> %A) {
1790 ; CHECK-LABEL: fcmogez4xfloat:
1791 ; CHECK: fcmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1792    %tmp3 = fcmp oge <4 x float> %A, zeroinitializer
1793    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1794         ret <4 x i32> %tmp4
1795 }
1796 define <2 x i64> @fcmogez2xdouble(<2 x double> %A) {
1797 ; CHECK-LABEL: fcmogez2xdouble:
1798 ; CHECK: fcmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1799    %tmp3 = fcmp oge <2 x double> %A, zeroinitializer
1800    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1801         ret <2 x i64> %tmp4
1802 }
1803
1804 define <2 x i32> @fcmogtz2xfloat(<2 x float> %A) {
1805 ; CHECK-LABEL: fcmogtz2xfloat:
1806 ; CHECK: fcmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1807    %tmp3 = fcmp ogt <2 x float> %A, zeroinitializer
1808    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1809         ret <2 x i32> %tmp4
1810 }
1811
1812 define <4 x i32> @fcmogtz4xfloat(<4 x float> %A) {
1813 ; CHECK-LABEL: fcmogtz4xfloat:
1814 ; CHECK: fcmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1815    %tmp3 = fcmp ogt <4 x float> %A, zeroinitializer
1816    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1817         ret <4 x i32> %tmp4
1818 }
1819 define <2 x i64> @fcmogtz2xdouble(<2 x double> %A) {
1820 ; CHECK-LABEL: fcmogtz2xdouble:
1821 ; CHECK: fcmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1822    %tmp3 = fcmp ogt <2 x double> %A, zeroinitializer
1823    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1824         ret <2 x i64> %tmp4
1825 }
1826
1827 define <2 x i32> @fcmoltz2xfloat(<2 x float> %A) {
1828 ; CHECK-LABEL: fcmoltz2xfloat:
1829 ; CHECK: fcmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1830    %tmp3 = fcmp olt <2 x float> %A, zeroinitializer
1831    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1832         ret <2 x i32> %tmp4
1833 }
1834
1835 define <4 x i32> @fcmoltz4xfloat(<4 x float> %A) {
1836 ; CHECK-LABEL: fcmoltz4xfloat:
1837 ; CHECK: fcmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1838    %tmp3 = fcmp olt <4 x float> %A, zeroinitializer
1839    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1840         ret <4 x i32> %tmp4
1841 }
1842
1843 define <2 x i64> @fcmoltz2xdouble(<2 x double> %A) {
1844 ; CHECK-LABEL: fcmoltz2xdouble:
1845 ; CHECK: fcmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1846    %tmp3 = fcmp olt <2 x double> %A, zeroinitializer
1847    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1848         ret <2 x i64> %tmp4
1849 }
1850
1851 define <2 x i32> @fcmolez2xfloat(<2 x float> %A) {
1852 ; CHECK-LABEL: fcmolez2xfloat:
1853 ; CHECK: fcmle {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1854    %tmp3 = fcmp ole <2 x float> %A, zeroinitializer
1855    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1856         ret <2 x i32> %tmp4
1857 }
1858
1859 define <4 x i32> @fcmolez4xfloat(<4 x float> %A) {
1860 ; CHECK-LABEL: fcmolez4xfloat:
1861 ; CHECK: fcmle {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1862    %tmp3 = fcmp ole <4 x float> %A, zeroinitializer
1863    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1864         ret <4 x i32> %tmp4
1865 }
1866
1867 define <2 x i64> @fcmolez2xdouble(<2 x double> %A) {
1868 ; CHECK-LABEL: fcmolez2xdouble:
1869 ; CHECK: fcmle {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1870    %tmp3 = fcmp ole <2 x double> %A, zeroinitializer
1871    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1872         ret <2 x i64> %tmp4
1873 }
1874
1875 define <2 x i32> @fcmonez2xfloat(<2 x float> %A) {
1876 ; CHECK-LABEL: fcmonez2xfloat:
1877 ; ONE with zero = OLT | OGT
1878 ; CHECK: fcmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1879 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1880 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1881    %tmp3 = fcmp one <2 x float> %A, zeroinitializer
1882    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1883         ret <2 x i32> %tmp4
1884 }
1885
1886 define <4 x i32> @fcmonez4xfloat(<4 x float> %A) {
1887 ; CHECK-LABEL: fcmonez4xfloat:
1888 ; ONE with zero = OLT | OGT
1889 ; CHECK: fcmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1890 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1891 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1892    %tmp3 = fcmp one <4 x float> %A, zeroinitializer
1893    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1894         ret <4 x i32> %tmp4
1895 }
1896 define <2 x i64> @fcmonez2xdouble(<2 x double> %A) {
1897 ; CHECK-LABEL: fcmonez2xdouble:
1898 ; ONE with zero = OLT | OGT
1899 ; CHECK: fcmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1900 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1901 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1902    %tmp3 = fcmp one <2 x double> %A, zeroinitializer
1903    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1904         ret <2 x i64> %tmp4
1905 }
1906
1907 define <2 x i32> @fcmordz2xfloat(<2 x float> %A) {
1908 ; CHECK-LABEL: fcmordz2xfloat:
1909 ; ORD with zero = OLT | OGE
1910 ; CHECK: fcmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1911 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1912 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1913    %tmp3 = fcmp ord <2 x float> %A, zeroinitializer
1914    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1915         ret <2 x i32> %tmp4
1916 }
1917
1918 define <4 x i32> @fcmordz4xfloat(<4 x float> %A) {
1919 ; CHECK-LABEL: fcmordz4xfloat:
1920 ; ORD with zero = OLT | OGE
1921 ; CHECK: fcmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1922 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1923 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1924    %tmp3 = fcmp ord <4 x float> %A, zeroinitializer
1925    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1926         ret <4 x i32> %tmp4
1927 }
1928 define <2 x i64> @fcmordz2xdouble(<2 x double> %A) {
1929 ; CHECK-LABEL: fcmordz2xdouble:
1930 ; ORD with zero = OLT | OGE
1931 ; CHECK: fcmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1932 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1933 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1934    %tmp3 = fcmp ord <2 x double> %A, zeroinitializer
1935    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1936         ret <2 x i64> %tmp4
1937 }
1938
1939 define <2 x i32> @fcmueqz2xfloat(<2 x float> %A) {
1940 ; CHECK-LABEL: fcmueqz2xfloat:
1941 ; UEQ with zero = !ONE = !(OLT |OGT)
1942 ; CHECK: fcmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1943 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1944 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1945 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1946    %tmp3 = fcmp ueq <2 x float> %A, zeroinitializer
1947    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1948         ret <2 x i32> %tmp4
1949 }
1950
1951 define <4 x i32> @fcmueqz4xfloat(<4 x float> %A) {
1952 ; CHECK-LABEL: fcmueqz4xfloat:
1953 ; UEQ with zero = !ONE = !(OLT |OGT)
1954 ; CHECK: fcmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1955 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1956 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1957 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1958    %tmp3 = fcmp ueq <4 x float> %A, zeroinitializer
1959    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1960         ret <4 x i32> %tmp4
1961 }
1962
1963 define <2 x i64> @fcmueqz2xdouble(<2 x double> %A) {
1964 ; CHECK-LABEL: fcmueqz2xdouble:
1965 ; UEQ with zero = !ONE = !(OLT |OGT)
1966 ; CHECK: fcmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1967 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1968 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1969 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1970    %tmp3 = fcmp ueq <2 x double> %A, zeroinitializer
1971    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
1972         ret <2 x i64> %tmp4
1973 }
1974
1975 define <2 x i32> @fcmugez2xfloat(<2 x float> %A) {
1976 ; CHECK-LABEL: fcmugez2xfloat:
1977 ; UGE with zero = !OLT
1978 ; CHECK: fcmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
1979 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1980    %tmp3 = fcmp uge <2 x float> %A, zeroinitializer
1981    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
1982         ret <2 x i32> %tmp4
1983 }
1984
1985 define <4 x i32> @fcmugez4xfloat(<4 x float> %A) {
1986 ; CHECK-LABEL: fcmugez4xfloat:
1987 ; UGE with zero = !OLT
1988 ; CHECK: fcmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
1989 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1990    %tmp3 = fcmp uge <4 x float> %A, zeroinitializer
1991    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
1992         ret <4 x i32> %tmp4
1993 }
1994 define <2 x i64> @fcmugez2xdouble(<2 x double> %A) {
1995 ; CHECK-LABEL: fcmugez2xdouble:
1996 ; UGE with zero = !OLT
1997 ; CHECK: fcmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
1998 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1999    %tmp3 = fcmp uge <2 x double> %A, zeroinitializer
2000    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2001         ret <2 x i64> %tmp4
2002 }
2003
2004 define <2 x i32> @fcmugtz2xfloat(<2 x float> %A) {
2005 ; CHECK-LABEL: fcmugtz2xfloat:
2006 ; UGT with zero = !OLE
2007 ; CHECK: fcmle {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
2008 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2009    %tmp3 = fcmp ugt <2 x float> %A, zeroinitializer
2010    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2011         ret <2 x i32> %tmp4
2012 }
2013
2014 define <4 x i32> @fcmugtz4xfloat(<4 x float> %A) {
2015 ; CHECK-LABEL: fcmugtz4xfloat:
2016 ; UGT with zero = !OLE
2017 ; CHECK: fcmle {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
2018 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2019    %tmp3 = fcmp ugt <4 x float> %A, zeroinitializer
2020    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2021         ret <4 x i32> %tmp4
2022 }
2023 define <2 x i64> @fcmugtz2xdouble(<2 x double> %A) {
2024 ; CHECK-LABEL: fcmugtz2xdouble:
2025 ; UGT with zero = !OLE
2026 ; CHECK: fcmle {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
2027 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2028    %tmp3 = fcmp ugt <2 x double> %A, zeroinitializer
2029    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2030         ret <2 x i64> %tmp4
2031 }
2032
2033 define <2 x i32> @fcmultz2xfloat(<2 x float> %A) {
2034 ; CHECK-LABEL: fcmultz2xfloat:
2035 ; ULT with zero = !OGE
2036 ; CHECK: fcmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
2037 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2038    %tmp3 = fcmp ult <2 x float> %A, zeroinitializer
2039    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2040         ret <2 x i32> %tmp4
2041 }
2042
2043 define <4 x i32> @fcmultz4xfloat(<4 x float> %A) {
2044 ; CHECK-LABEL: fcmultz4xfloat:
2045 ; CHECK: fcmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
2046 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2047    %tmp3 = fcmp ult <4 x float> %A, zeroinitializer
2048    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2049         ret <4 x i32> %tmp4
2050 }
2051
2052 define <2 x i64> @fcmultz2xdouble(<2 x double> %A) {
2053 ; CHECK-LABEL: fcmultz2xdouble:
2054 ; CHECK: fcmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
2055 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2056    %tmp3 = fcmp ult <2 x double> %A, zeroinitializer
2057    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2058         ret <2 x i64> %tmp4
2059 }
2060
2061
2062 define <2 x i32> @fcmulez2xfloat(<2 x float> %A) {
2063 ; CHECK-LABEL: fcmulez2xfloat:
2064 ; ULE with zero = !OGT
2065 ; CHECK: fcmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
2066 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2067    %tmp3 = fcmp ule <2 x float> %A, zeroinitializer
2068    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2069         ret <2 x i32> %tmp4
2070 }
2071
2072 define <4 x i32> @fcmulez4xfloat(<4 x float> %A) {
2073 ; CHECK-LABEL: fcmulez4xfloat:
2074 ; ULE with zero = !OGT
2075 ; CHECK: fcmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
2076 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2077    %tmp3 = fcmp ule <4 x float> %A, zeroinitializer
2078    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2079         ret <4 x i32> %tmp4
2080 }
2081
2082 define <2 x i64> @fcmulez2xdouble(<2 x double> %A) {
2083 ; CHECK-LABEL: fcmulez2xdouble:
2084 ; ULE with zero = !OGT
2085 ; CHECK: fcmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
2086 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2087    %tmp3 = fcmp ule <2 x double> %A, zeroinitializer
2088    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2089         ret <2 x i64> %tmp4
2090 }
2091
2092 define <2 x i32> @fcmunez2xfloat(<2 x float> %A) {
2093 ; CHECK-LABEL: fcmunez2xfloat:
2094 ; UNE with zero = !OEQ with zero
2095 ; CHECK: fcmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
2096 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2097    %tmp3 = fcmp une <2 x float> %A, zeroinitializer
2098    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2099         ret <2 x i32> %tmp4
2100 }
2101
2102 define <4 x i32> @fcmunez4xfloat(<4 x float> %A) {
2103 ; CHECK-LABEL: fcmunez4xfloat:
2104 ; UNE with zero = !OEQ with zero
2105 ; CHECK: fcmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
2106 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2107    %tmp3 = fcmp une <4 x float> %A, zeroinitializer
2108    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2109         ret <4 x i32> %tmp4
2110 }
2111 define <2 x i64> @fcmunez2xdouble(<2 x double> %A) {
2112 ; CHECK-LABEL: fcmunez2xdouble:
2113 ; UNE with zero = !OEQ with zero
2114 ; CHECK: fcmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
2115 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2116    %tmp3 = fcmp une <2 x double> %A, zeroinitializer
2117    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2118         ret <2 x i64> %tmp4
2119 }
2120
2121
2122 define <2 x i32> @fcmunoz2xfloat(<2 x float> %A) {
2123 ; CHECK-LABEL: fcmunoz2xfloat:
2124 ; UNO with zero = !ORD = !(OLT | OGE)
2125 ; CHECK: fcmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
2126 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #{{0.0|0}}
2127 ; CHECK-NEXT: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2128 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2129    %tmp3 = fcmp uno <2 x float> %A, zeroinitializer
2130    %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
2131         ret <2 x i32> %tmp4
2132 }
2133
2134 define <4 x i32> @fcmunoz4xfloat(<4 x float> %A) {
2135 ; CHECK-LABEL: fcmunoz4xfloat:
2136 ; UNO with zero = !ORD = !(OLT | OGE)
2137 ; CHECK: fcmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
2138 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #{{0.0|0}}
2139 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2140 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2141    %tmp3 = fcmp uno <4 x float> %A, zeroinitializer
2142    %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
2143         ret <4 x i32> %tmp4
2144 }
2145
2146 define <2 x i64> @fcmunoz2xdouble(<2 x double> %A) {
2147 ; CHECK-LABEL: fcmunoz2xdouble:
2148 ; UNO with zero = !ORD = !(OLT | OGE)
2149 ; CHECK: fcmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
2150 ; CHECK-NEXT: fcmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #{{0.0|0}}
2151 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2152 ; CHECK-NEXT: {{mvn|not}} {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2153    %tmp3 = fcmp uno <2 x double> %A, zeroinitializer
2154    %tmp4 = sext <2 x i1> %tmp3 to <2 x i64>
2155         ret <2 x i64> %tmp4
2156
2157 }