[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-fcmp.ll
blobf7e3b6d0171ac33d2a61da84dc14bba4f8c3843f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s
4 define <vscale x 4 x i1> @oeq(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
5 ; CHECK-LABEL: oeq:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    ptrue p0.s
8 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
9 ; CHECK-NEXT:    ret
10   %y = fcmp oeq <vscale x 4 x float> %x, %x2
11   ret <vscale x 4 x i1> %y
13 define <vscale x 4 x i1> @ogt(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
14 ; CHECK-LABEL: ogt:
15 ; CHECK:       // %bb.0:
16 ; CHECK-NEXT:    ptrue p0.s
17 ; CHECK-NEXT:    fcmgt p0.s, p0/z, z0.s, z1.s
18 ; CHECK-NEXT:    ret
19   %y = fcmp ogt <vscale x 4 x float> %x, %x2
20   ret <vscale x 4 x i1> %y
22 define <vscale x 4 x i1> @oge(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
23 ; CHECK-LABEL: oge:
24 ; CHECK:       // %bb.0:
25 ; CHECK-NEXT:    ptrue p0.s
26 ; CHECK-NEXT:    fcmge p0.s, p0/z, z0.s, z1.s
27 ; CHECK-NEXT:    ret
28   %y = fcmp oge <vscale x 4 x float> %x, %x2
29   ret <vscale x 4 x i1> %y
31 define <vscale x 4 x i1> @olt(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
32 ; CHECK-LABEL: olt:
33 ; CHECK:       // %bb.0:
34 ; CHECK-NEXT:    ptrue p0.s
35 ; CHECK-NEXT:    fcmgt p0.s, p0/z, z1.s, z0.s
36 ; CHECK-NEXT:    ret
37   %y = fcmp olt <vscale x 4 x float> %x, %x2
38   ret <vscale x 4 x i1> %y
40 define <vscale x 4 x i1> @ole(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
41 ; CHECK-LABEL: ole:
42 ; CHECK:       // %bb.0:
43 ; CHECK-NEXT:    ptrue p0.s
44 ; CHECK-NEXT:    fcmge p0.s, p0/z, z1.s, z0.s
45 ; CHECK-NEXT:    ret
46   %y = fcmp ole <vscale x 4 x float> %x, %x2
47   ret <vscale x 4 x i1> %y
49 define <vscale x 4 x i1> @one(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
50 ; CHECK-LABEL: one:
51 ; CHECK:       // %bb.0:
52 ; CHECK-NEXT:    ptrue p0.s
53 ; CHECK-NEXT:    fcmgt p1.s, p0/z, z1.s, z0.s
54 ; CHECK-NEXT:    fcmgt p0.s, p0/z, z0.s, z1.s
55 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
56 ; CHECK-NEXT:    ret
57   %y = fcmp one <vscale x 4 x float> %x, %x2
58   ret <vscale x 4 x i1> %y
60 define <vscale x 4 x i1> @ord(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
61 ; CHECK-LABEL: ord:
62 ; CHECK:       // %bb.0:
63 ; CHECK-NEXT:    ptrue p0.s
64 ; CHECK-NEXT:    fcmuo p1.s, p0/z, z0.s, z1.s
65 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
66 ; CHECK-NEXT:    ret
67   %y = fcmp ord <vscale x 4 x float> %x, %x2
68   ret <vscale x 4 x i1> %y
70 define <vscale x 4 x i1> @ueq(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
71 ; CHECK-LABEL: ueq:
72 ; CHECK:       // %bb.0:
73 ; CHECK-NEXT:    ptrue p0.s
74 ; CHECK-NEXT:    fcmuo p1.s, p0/z, z0.s, z1.s
75 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
76 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
77 ; CHECK-NEXT:    ret
78   %y = fcmp ueq <vscale x 4 x float> %x, %x2
79   ret <vscale x 4 x i1> %y
81 define <vscale x 4 x i1> @ugt(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
82 ; CHECK-LABEL: ugt:
83 ; CHECK:       // %bb.0:
84 ; CHECK-NEXT:    ptrue p0.s
85 ; CHECK-NEXT:    fcmge p1.s, p0/z, z1.s, z0.s
86 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
87 ; CHECK-NEXT:    ret
88   %y = fcmp ugt <vscale x 4 x float> %x, %x2
89   ret <vscale x 4 x i1> %y
91 define <vscale x 4 x i1> @uge(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
92 ; CHECK-LABEL: uge:
93 ; CHECK:       // %bb.0:
94 ; CHECK-NEXT:    ptrue p0.s
95 ; CHECK-NEXT:    fcmgt p1.s, p0/z, z1.s, z0.s
96 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
97 ; CHECK-NEXT:    ret
98   %y = fcmp uge <vscale x 4 x float> %x, %x2
99   ret <vscale x 4 x i1> %y
101 define <vscale x 4 x i1> @ult(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
102 ; CHECK-LABEL: ult:
103 ; CHECK:       // %bb.0:
104 ; CHECK-NEXT:    ptrue p0.s
105 ; CHECK-NEXT:    fcmge p1.s, p0/z, z0.s, z1.s
106 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
107 ; CHECK-NEXT:    ret
108   %y = fcmp ult <vscale x 4 x float> %x, %x2
109   ret <vscale x 4 x i1> %y
111 define <vscale x 4 x i1> @ule(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
112 ; CHECK-LABEL: ule:
113 ; CHECK:       // %bb.0:
114 ; CHECK-NEXT:    ptrue p0.s
115 ; CHECK-NEXT:    fcmgt p1.s, p0/z, z0.s, z1.s
116 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
117 ; CHECK-NEXT:    ret
118   %y = fcmp ule <vscale x 4 x float> %x, %x2
119   ret <vscale x 4 x i1> %y
121 define <vscale x 4 x i1> @une(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
122 ; CHECK-LABEL: une:
123 ; CHECK:       // %bb.0:
124 ; CHECK-NEXT:    ptrue p0.s
125 ; CHECK-NEXT:    fcmne p0.s, p0/z, z0.s, z1.s
126 ; CHECK-NEXT:    ret
127   %y = fcmp une <vscale x 4 x float> %x, %x2
128   ret <vscale x 4 x i1> %y
130 define <vscale x 4 x i1> @uno(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
131 ; CHECK-LABEL: uno:
132 ; CHECK:       // %bb.0:
133 ; CHECK-NEXT:    ptrue p0.s
134 ; CHECK-NEXT:    fcmuo p0.s, p0/z, z0.s, z1.s
135 ; CHECK-NEXT:    ret
136   %y = fcmp uno <vscale x 4 x float> %x, %x2
137   ret <vscale x 4 x i1> %y
139 define <vscale x 2 x i1> @oeq_2f32(<vscale x 2 x float> %x, <vscale x 2 x float> %x2) {
140 ; CHECK-LABEL: oeq_2f32:
141 ; CHECK:       // %bb.0:
142 ; CHECK-NEXT:    ptrue p0.d
143 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
144 ; CHECK-NEXT:    ret
145   %y = fcmp oeq <vscale x 2 x float> %x, %x2
146   ret <vscale x 2 x i1> %y
148 define <vscale x 2 x i1> @ueq_2f32(<vscale x 2 x float> %x, <vscale x 2 x float> %x2) {
149 ; CHECK-LABEL: ueq_2f32:
150 ; CHECK:       // %bb.0:
151 ; CHECK-NEXT:    ptrue p0.d
152 ; CHECK-NEXT:    fcmuo p1.s, p0/z, z0.s, z1.s
153 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
154 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
155 ; CHECK-NEXT:    ret
156   %y = fcmp ueq <vscale x 2 x float> %x, %x2
157   ret <vscale x 2 x i1> %y
159 define <vscale x 2 x i1> @oeq_2f64(<vscale x 2 x double> %x, <vscale x 2 x double> %x2) {
160 ; CHECK-LABEL: oeq_2f64:
161 ; CHECK:       // %bb.0:
162 ; CHECK-NEXT:    ptrue p0.d
163 ; CHECK-NEXT:    fcmeq p0.d, p0/z, z0.d, z1.d
164 ; CHECK-NEXT:    ret
165   %y = fcmp oeq <vscale x 2 x double> %x, %x2
166   ret <vscale x 2 x i1> %y
168 define <vscale x 2 x i1> @ueq_2f64(<vscale x 2 x double> %x, <vscale x 2 x double> %x2) {
169 ; CHECK-LABEL: ueq_2f64:
170 ; CHECK:       // %bb.0:
171 ; CHECK-NEXT:    ptrue p0.d
172 ; CHECK-NEXT:    fcmuo p1.d, p0/z, z0.d, z1.d
173 ; CHECK-NEXT:    fcmeq p0.d, p0/z, z0.d, z1.d
174 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
175 ; CHECK-NEXT:    ret
176   %y = fcmp ueq <vscale x 2 x double> %x, %x2
177   ret <vscale x 2 x i1> %y
179 define <vscale x 2 x i1> @oeq_2f16(<vscale x 2 x half> %x, <vscale x 2 x half> %x2) {
180 ; CHECK-LABEL: oeq_2f16:
181 ; CHECK:       // %bb.0:
182 ; CHECK-NEXT:    ptrue p0.d
183 ; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
184 ; CHECK-NEXT:    ret
185   %y = fcmp oeq <vscale x 2 x half> %x, %x2
186   ret <vscale x 2 x i1> %y
188 define <vscale x 2 x i1> @ueq_2f16(<vscale x 2 x half> %x, <vscale x 2 x half> %x2) {
189 ; CHECK-LABEL: ueq_2f16:
190 ; CHECK:       // %bb.0:
191 ; CHECK-NEXT:    ptrue p0.d
192 ; CHECK-NEXT:    fcmuo p1.h, p0/z, z0.h, z1.h
193 ; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
194 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
195 ; CHECK-NEXT:    ret
196   %y = fcmp ueq <vscale x 2 x half> %x, %x2
197   ret <vscale x 2 x i1> %y
199 define <vscale x 4 x i1> @oeq_4f16(<vscale x 4 x half> %x, <vscale x 4 x half> %x2) {
200 ; CHECK-LABEL: oeq_4f16:
201 ; CHECK:       // %bb.0:
202 ; CHECK-NEXT:    ptrue p0.s
203 ; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
204 ; CHECK-NEXT:    ret
205   %y = fcmp oeq <vscale x 4 x half> %x, %x2
206   ret <vscale x 4 x i1> %y
208 define <vscale x 4 x i1> @ueq_4f16(<vscale x 4 x half> %x, <vscale x 4 x half> %x2) {
209 ; CHECK-LABEL: ueq_4f16:
210 ; CHECK:       // %bb.0:
211 ; CHECK-NEXT:    ptrue p0.s
212 ; CHECK-NEXT:    fcmuo p1.h, p0/z, z0.h, z1.h
213 ; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
214 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
215 ; CHECK-NEXT:    ret
216   %y = fcmp ueq <vscale x 4 x half> %x, %x2
217   ret <vscale x 4 x i1> %y
219 define <vscale x 8 x i1> @oeq_8f16(<vscale x 8 x half> %x, <vscale x 8 x half> %x2) {
220 ; CHECK-LABEL: oeq_8f16:
221 ; CHECK:       // %bb.0:
222 ; CHECK-NEXT:    ptrue p0.h
223 ; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
224 ; CHECK-NEXT:    ret
225   %y = fcmp oeq <vscale x 8 x half> %x, %x2
226   ret <vscale x 8 x i1> %y
228 define <vscale x 8 x i1> @ueq_8f16(<vscale x 8 x half> %x, <vscale x 8 x half> %x2) {
229 ; CHECK-LABEL: ueq_8f16:
230 ; CHECK:       // %bb.0:
231 ; CHECK-NEXT:    ptrue p0.h
232 ; CHECK-NEXT:    fcmuo p1.h, p0/z, z0.h, z1.h
233 ; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, z1.h
234 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
235 ; CHECK-NEXT:    ret
236   %y = fcmp ueq <vscale x 8 x half> %x, %x2
237   ret <vscale x 8 x i1> %y
240 define <vscale x 4 x i32> @oeq_4f32_sext(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
241 ; CHECK-LABEL: oeq_4f32_sext:
242 ; CHECK:       // %bb.0:
243 ; CHECK-NEXT:    ptrue p0.s
244 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
245 ; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
246 ; CHECK-NEXT:    ret
247   %y = fcmp oeq <vscale x 4 x float> %x, %x2
248   %r = sext <vscale x 4 x i1> %y to <vscale x 4 x i32>
249   ret <vscale x 4 x i32> %r
252 define <vscale x 4 x i32> @oeq_4f32_zext(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
253 ; CHECK-LABEL: oeq_4f32_zext:
254 ; CHECK:       // %bb.0:
255 ; CHECK-NEXT:    ptrue p0.s
256 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
257 ; CHECK-NEXT:    mov z0.s, p0/z, #1 // =0x1
258 ; CHECK-NEXT:    ret
259   %y = fcmp oeq <vscale x 4 x float> %x, %x2
260   %r = zext <vscale x 4 x i1> %y to <vscale x 4 x i32>
261   ret <vscale x 4 x i32> %r
264 define <vscale x 4 x i1> @eq_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
265 ; CHECK-LABEL: eq_fast:
266 ; CHECK:       // %bb.0:
267 ; CHECK-NEXT:    ptrue p0.s
268 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, z1.s
269 ; CHECK-NEXT:    ret
270   %y = fcmp fast oeq <vscale x 4 x float> %x, %x2
271   ret <vscale x 4 x i1> %y
273 define <vscale x 4 x i1> @gt_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
274 ; CHECK-LABEL: gt_fast:
275 ; CHECK:       // %bb.0:
276 ; CHECK-NEXT:    ptrue p0.s
277 ; CHECK-NEXT:    fcmgt p0.s, p0/z, z0.s, z1.s
278 ; CHECK-NEXT:    ret
279   %y = fcmp fast ogt <vscale x 4 x float> %x, %x2
280   ret <vscale x 4 x i1> %y
282 define <vscale x 4 x i1> @ge_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
283 ; CHECK-LABEL: ge_fast:
284 ; CHECK:       // %bb.0:
285 ; CHECK-NEXT:    ptrue p0.s
286 ; CHECK-NEXT:    fcmge p0.s, p0/z, z0.s, z1.s
287 ; CHECK-NEXT:    ret
288   %y = fcmp fast oge <vscale x 4 x float> %x, %x2
289   ret <vscale x 4 x i1> %y
291 define <vscale x 4 x i1> @lt_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
292 ; CHECK-LABEL: lt_fast:
293 ; CHECK:       // %bb.0:
294 ; CHECK-NEXT:    ptrue p0.s
295 ; CHECK-NEXT:    fcmgt p0.s, p0/z, z1.s, z0.s
296 ; CHECK-NEXT:    ret
297   %y = fcmp fast olt <vscale x 4 x float> %x, %x2
298   ret <vscale x 4 x i1> %y
300 define <vscale x 4 x i1> @le_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
301 ; CHECK-LABEL: le_fast:
302 ; CHECK:       // %bb.0:
303 ; CHECK-NEXT:    ptrue p0.s
304 ; CHECK-NEXT:    fcmge p0.s, p0/z, z1.s, z0.s
305 ; CHECK-NEXT:    ret
306   %y = fcmp fast ole <vscale x 4 x float> %x, %x2
307   ret <vscale x 4 x i1> %y
309 define <vscale x 4 x i1> @ne_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {
310 ; CHECK-LABEL: ne_fast:
311 ; CHECK:       // %bb.0:
312 ; CHECK-NEXT:    ptrue p0.s
313 ; CHECK-NEXT:    fcmne p0.s, p0/z, z0.s, z1.s
314 ; CHECK-NEXT:    ret
315   %y = fcmp fast one <vscale x 4 x float> %x, %x2
316   ret <vscale x 4 x i1> %y
318 define <vscale x 4 x i1> @oeq_zero(<vscale x 4 x float> %x) {
319 ; CHECK-LABEL: oeq_zero:
320 ; CHECK:       // %bb.0:
321 ; CHECK-NEXT:    ptrue p0.s
322 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, #0.0
323 ; CHECK-NEXT:    ret
324   %y = fcmp oeq <vscale x 4 x float> %x, zeroinitializer
325   ret <vscale x 4 x i1> %y
327 define <vscale x 4 x i1> @ogt_zero(<vscale x 4 x float> %x) {
328 ; CHECK-LABEL: ogt_zero:
329 ; CHECK:       // %bb.0:
330 ; CHECK-NEXT:    ptrue p0.s
331 ; CHECK-NEXT:    fcmgt p0.s, p0/z, z0.s, #0.0
332 ; CHECK-NEXT:    ret
333   %y = fcmp ogt <vscale x 4 x float> %x, zeroinitializer
334   ret <vscale x 4 x i1> %y
336 define <vscale x 4 x i1> @oge_zero(<vscale x 4 x float> %x) {
337 ; CHECK-LABEL: oge_zero:
338 ; CHECK:       // %bb.0:
339 ; CHECK-NEXT:    ptrue p0.s
340 ; CHECK-NEXT:    fcmge p0.s, p0/z, z0.s, #0.0
341 ; CHECK-NEXT:    ret
342   %y = fcmp oge <vscale x 4 x float> %x, zeroinitializer
343   ret <vscale x 4 x i1> %y
345 define <vscale x 4 x i1> @olt_zero(<vscale x 4 x float> %x) {
346 ; CHECK-LABEL: olt_zero:
347 ; CHECK:       // %bb.0:
348 ; CHECK-NEXT:    ptrue p0.s
349 ; CHECK-NEXT:    fcmlt p0.s, p0/z, z0.s, #0.0
350 ; CHECK-NEXT:    ret
351   %y = fcmp olt <vscale x 4 x float> %x, zeroinitializer
352   ret <vscale x 4 x i1> %y
354 define <vscale x 4 x i1> @ole_zero(<vscale x 4 x float> %x) {
355 ; CHECK-LABEL: ole_zero:
356 ; CHECK:       // %bb.0:
357 ; CHECK-NEXT:    ptrue p0.s
358 ; CHECK-NEXT:    fcmle p0.s, p0/z, z0.s, #0.0
359 ; CHECK-NEXT:    ret
360   %y = fcmp ole <vscale x 4 x float> %x, zeroinitializer
361   ret <vscale x 4 x i1> %y
363 define <vscale x 4 x i1> @one_zero(<vscale x 4 x float> %x) {
364 ; CHECK-LABEL: one_zero:
365 ; CHECK:       // %bb.0:
366 ; CHECK-NEXT:    ptrue p0.s
367 ; CHECK-NEXT:    fcmlt p1.s, p0/z, z0.s, #0.0
368 ; CHECK-NEXT:    fcmgt p0.s, p0/z, z0.s, #0.0
369 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
370 ; CHECK-NEXT:    ret
371   %y = fcmp one <vscale x 4 x float> %x, zeroinitializer
372   ret <vscale x 4 x i1> %y
374 define <vscale x 4 x i1> @ueq_zero(<vscale x 4 x float> %x) {
375 ; CHECK-LABEL: ueq_zero:
376 ; CHECK:       // %bb.0:
377 ; CHECK-NEXT:    ptrue p0.s
378 ; CHECK-NEXT:    mov z1.s, #0 // =0x0
379 ; CHECK-NEXT:    fcmuo p1.s, p0/z, z0.s, z1.s
380 ; CHECK-NEXT:    fcmeq p0.s, p0/z, z0.s, #0.0
381 ; CHECK-NEXT:    sel p0.b, p0, p0.b, p1.b
382 ; CHECK-NEXT:    ret
383   %y = fcmp ueq <vscale x 4 x float> %x, zeroinitializer
384   ret <vscale x 4 x i1> %y
386 define <vscale x 4 x i1> @ugt_zero(<vscale x 4 x float> %x) {
387 ; CHECK-LABEL: ugt_zero:
388 ; CHECK:       // %bb.0:
389 ; CHECK-NEXT:    ptrue p0.s
390 ; CHECK-NEXT:    fcmle p1.s, p0/z, z0.s, #0.0
391 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
392 ; CHECK-NEXT:    ret
393   %y = fcmp ugt <vscale x 4 x float> %x, zeroinitializer
394   ret <vscale x 4 x i1> %y
396 define <vscale x 4 x i1> @uge_zero(<vscale x 4 x float> %x) {
397 ; CHECK-LABEL: uge_zero:
398 ; CHECK:       // %bb.0:
399 ; CHECK-NEXT:    ptrue p0.s
400 ; CHECK-NEXT:    fcmlt p1.s, p0/z, z0.s, #0.0
401 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
402 ; CHECK-NEXT:    ret
403   %y = fcmp uge <vscale x 4 x float> %x, zeroinitializer
404   ret <vscale x 4 x i1> %y
406 define <vscale x 4 x i1> @ult_zero(<vscale x 4 x float> %x) {
407 ; CHECK-LABEL: ult_zero:
408 ; CHECK:       // %bb.0:
409 ; CHECK-NEXT:    ptrue p0.s
410 ; CHECK-NEXT:    fcmge p1.s, p0/z, z0.s, #0.0
411 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
412 ; CHECK-NEXT:    ret
413   %y = fcmp ult <vscale x 4 x float> %x, zeroinitializer
414   ret <vscale x 4 x i1> %y
416 define <vscale x 4 x i1> @ule_zero(<vscale x 4 x float> %x) {
417 ; CHECK-LABEL: ule_zero:
418 ; CHECK:       // %bb.0:
419 ; CHECK-NEXT:    ptrue p0.s
420 ; CHECK-NEXT:    fcmgt p1.s, p0/z, z0.s, #0.0
421 ; CHECK-NEXT:    not p0.b, p0/z, p1.b
422 ; CHECK-NEXT:    ret
423   %y = fcmp ule <vscale x 4 x float> %x, zeroinitializer
424   ret <vscale x 4 x i1> %y
426 define <vscale x 4 x i1> @une_zero(<vscale x 4 x float> %x) {
427 ; CHECK-LABEL: une_zero:
428 ; CHECK:       // %bb.0:
429 ; CHECK-NEXT:    ptrue p0.s
430 ; CHECK-NEXT:    fcmne p0.s, p0/z, z0.s, #0.0
431 ; CHECK-NEXT:    ret
432   %y = fcmp une <vscale x 4 x float> %x, zeroinitializer
433   ret <vscale x 4 x i1> %y
435 define <vscale x 8 x i1> @oeq_zero_pred(<vscale x 8 x i1> %pg, <vscale x 8 x half> %x) {
436 ; CHECK-LABEL: oeq_zero_pred:
437 ; CHECK:       // %bb.0:
438 ; CHECK-NEXT:    fcmeq p0.h, p0/z, z0.h, #0.0
439 ; CHECK-NEXT:    ret
440   %y = fcmp oeq <vscale x 8 x half> %x, zeroinitializer
441   %z = and <vscale x 8 x i1> %pg, %y
442   ret <vscale x 8 x i1> %z
444 define <vscale x 4 x i1> @ogt_zero_pred(<vscale x 4 x i1> %pg, <vscale x 4 x half> %x) {
445 ; CHECK-LABEL: ogt_zero_pred:
446 ; CHECK:       // %bb.0:
447 ; CHECK-NEXT:    fcmgt p0.h, p0/z, z0.h, #0.0
448 ; CHECK-NEXT:    ret
449   %y = fcmp ogt <vscale x 4 x half> %x, zeroinitializer
450   %z = and <vscale x 4 x i1> %pg, %y
451   ret <vscale x 4 x i1> %z
453 define <vscale x 2 x i1> @oge_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x half> %x) {
454 ; CHECK-LABEL: oge_zero_pred:
455 ; CHECK:       // %bb.0:
456 ; CHECK-NEXT:    fcmge p0.h, p0/z, z0.h, #0.0
457 ; CHECK-NEXT:    ret
458   %y = fcmp oge <vscale x 2 x half> %x, zeroinitializer
459   %z = and <vscale x 2 x i1> %pg, %y
460   ret <vscale x 2 x i1> %z
462 define <vscale x 4 x i1> @olt_zero_pred(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {
463 ; CHECK-LABEL: olt_zero_pred:
464 ; CHECK:       // %bb.0:
465 ; CHECK-NEXT:    fcmlt p0.s, p0/z, z0.s, #0.0
466 ; CHECK-NEXT:    ret
467   %y = fcmp olt <vscale x 4 x float> %x, zeroinitializer
468   %z = and <vscale x 4 x i1> %pg, %y
469   ret <vscale x 4 x i1> %z
471 define <vscale x 2 x i1> @ole_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x float> %x) {
472 ; CHECK-LABEL: ole_zero_pred:
473 ; CHECK:       // %bb.0:
474 ; CHECK-NEXT:    fcmle p0.s, p0/z, z0.s, #0.0
475 ; CHECK-NEXT:    ret
476   %y = fcmp ole <vscale x 2 x float> %x, zeroinitializer
477   %z = and <vscale x 2 x i1> %pg, %y
478   ret <vscale x 2 x i1> %z
480 define <vscale x 2 x i1> @une_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {
481 ; CHECK-LABEL: une_zero_pred:
482 ; CHECK:       // %bb.0:
483 ; CHECK-NEXT:    fcmne p0.d, p0/z, z0.d, #0.0
484 ; CHECK-NEXT:    ret
485   %y = fcmp une <vscale x 2 x double> %x, zeroinitializer
486   %z = and <vscale x 2 x i1> %pg, %y
487   ret <vscale x 2 x i1> %z
490 %svboolx2 = type { <vscale x 4 x i1>, <vscale x 4 x i1> }
492 define %svboolx2 @and_of_multiuse_fcmp_ogt(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x, <vscale x 4 x float> %y) {
493 ; CHECK-LABEL: and_of_multiuse_fcmp_ogt:
494 ; CHECK:       // %bb.0:
495 ; CHECK-NEXT:    ptrue p1.s
496 ; CHECK-NEXT:    fcmgt p1.s, p1/z, z0.s, z1.s
497 ; CHECK-NEXT:    and p0.b, p0/z, p0.b, p1.b
498 ; CHECK-NEXT:    ret
499   %cmp = fcmp ogt <vscale x 4 x float> %x, %y
500   %and = and <vscale x 4 x i1> %pg, %cmp
501   %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0
502   %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1
503   ret %svboolx2 %ins.2
506 define %svboolx2 @and_of_multiuse_fcmp_ogt_zero(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {
507 ; CHECK-LABEL: and_of_multiuse_fcmp_ogt_zero:
508 ; CHECK:       // %bb.0:
509 ; CHECK-NEXT:    ptrue p1.s
510 ; CHECK-NEXT:    fcmgt p1.s, p1/z, z0.s, #0.0
511 ; CHECK-NEXT:    and p0.b, p0/z, p0.b, p1.b
512 ; CHECK-NEXT:    ret
513   %cmp = fcmp ogt <vscale x 4 x float> %x, zeroinitializer
514   %and = and <vscale x 4 x i1> %pg, %cmp
515   %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0
516   %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1
517   ret %svboolx2 %ins.2
520 define %svboolx2 @and_of_multiuse_fcmp_olt(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x, <vscale x 4 x float> %y) {
521 ; CHECK-LABEL: and_of_multiuse_fcmp_olt:
522 ; CHECK:       // %bb.0:
523 ; CHECK-NEXT:    ptrue p1.s
524 ; CHECK-NEXT:    fcmgt p1.s, p1/z, z1.s, z0.s
525 ; CHECK-NEXT:    and p0.b, p0/z, p0.b, p1.b
526 ; CHECK-NEXT:    ret
527   %cmp = fcmp olt <vscale x 4 x float> %x, %y
528   %and = and <vscale x 4 x i1> %pg, %cmp
529   %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0
530   %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1
531   ret %svboolx2 %ins.2
534 define %svboolx2 @and_of_multiuse_fcmp_olt_zero(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {
535 ; CHECK-LABEL: and_of_multiuse_fcmp_olt_zero:
536 ; CHECK:       // %bb.0:
537 ; CHECK-NEXT:    ptrue p1.s
538 ; CHECK-NEXT:    fcmlt p1.s, p1/z, z0.s, #0.0
539 ; CHECK-NEXT:    and p0.b, p0/z, p0.b, p1.b
540 ; CHECK-NEXT:    ret
541   %cmp = fcmp olt <vscale x 4 x float> %x, zeroinitializer
542   %and = and <vscale x 4 x i1> %pg, %cmp
543   %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0
544   %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1
545   ret %svboolx2 %ins.2