1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible-sve < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming-compatible-sve < %s | FileCheck %s
5 target triple = "aarch64-unknown-linux-gnu"
11 define <2 x i16> @fcmp_oeq_v2f16(<2 x half> %op1, <2 x half> %op2) {
12 ; CHECK-LABEL: fcmp_oeq_v2f16:
14 ; CHECK-NEXT: ptrue p0.h, vl4
15 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
16 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
17 ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h
18 ; CHECK-NEXT: punpklo p0.h, p0.b
19 ; CHECK-NEXT: mov z0.s, p0/z, #-1 // =0xffffffffffffffff
20 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
22 %cmp = fcmp oeq <2 x half> %op1, %op2
23 %sext = sext <2 x i1> %cmp to <2 x i16>
27 define <4 x i16> @fcmp_oeq_v4f16(<4 x half> %op1, <4 x half> %op2) {
28 ; CHECK-LABEL: fcmp_oeq_v4f16:
30 ; CHECK-NEXT: ptrue p0.h, vl4
31 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
32 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
33 ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h
34 ; CHECK-NEXT: mov z0.h, p0/z, #-1 // =0xffffffffffffffff
35 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
37 %cmp = fcmp oeq <4 x half> %op1, %op2
38 %sext = sext <4 x i1> %cmp to <4 x i16>
42 define <8 x i16> @fcmp_oeq_v8f16(<8 x half> %op1, <8 x half> %op2) {
43 ; CHECK-LABEL: fcmp_oeq_v8f16:
45 ; CHECK-NEXT: ptrue p0.h, vl8
46 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
47 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
48 ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h
49 ; CHECK-NEXT: mov z0.h, p0/z, #-1 // =0xffffffffffffffff
50 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
52 %cmp = fcmp oeq <8 x half> %op1, %op2
53 %sext = sext <8 x i1> %cmp to <8 x i16>
57 define void @fcmp_oeq_v16f16(ptr %a, ptr %b, ptr %c) {
58 ; CHECK-LABEL: fcmp_oeq_v16f16:
60 ; CHECK-NEXT: ptrue p0.h, vl8
61 ; CHECK-NEXT: ldp q0, q3, [x1]
62 ; CHECK-NEXT: ldp q1, q2, [x0]
63 ; CHECK-NEXT: fcmeq p1.h, p0/z, z1.h, z0.h
64 ; CHECK-NEXT: fcmeq p0.h, p0/z, z2.h, z3.h
65 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
66 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
67 ; CHECK-NEXT: stp q0, q1, [x2]
69 %op1 = load <16 x half>, ptr %a
70 %op2 = load <16 x half>, ptr %b
71 %cmp = fcmp oeq <16 x half> %op1, %op2
72 %sext = sext <16 x i1> %cmp to <16 x i16>
73 store <16 x i16> %sext, ptr %c
77 define <2 x i32> @fcmp_oeq_v2f32(<2 x float> %op1, <2 x float> %op2) {
78 ; CHECK-LABEL: fcmp_oeq_v2f32:
80 ; CHECK-NEXT: ptrue p0.s, vl2
81 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
82 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
83 ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s
84 ; CHECK-NEXT: mov z0.s, p0/z, #-1 // =0xffffffffffffffff
85 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
87 %cmp = fcmp oeq <2 x float> %op1, %op2
88 %sext = sext <2 x i1> %cmp to <2 x i32>
92 define <4 x i32> @fcmp_oeq_v4f32(<4 x float> %op1, <4 x float> %op2) {
93 ; CHECK-LABEL: fcmp_oeq_v4f32:
95 ; CHECK-NEXT: ptrue p0.s, vl4
96 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
97 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
98 ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s
99 ; CHECK-NEXT: mov z0.s, p0/z, #-1 // =0xffffffffffffffff
100 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
102 %cmp = fcmp oeq <4 x float> %op1, %op2
103 %sext = sext <4 x i1> %cmp to <4 x i32>
107 define void @fcmp_oeq_v8f32(ptr %a, ptr %b, ptr %c) {
108 ; CHECK-LABEL: fcmp_oeq_v8f32:
110 ; CHECK-NEXT: ptrue p0.s, vl4
111 ; CHECK-NEXT: ldp q0, q3, [x1]
112 ; CHECK-NEXT: ldp q1, q2, [x0]
113 ; CHECK-NEXT: fcmeq p1.s, p0/z, z1.s, z0.s
114 ; CHECK-NEXT: fcmeq p0.s, p0/z, z2.s, z3.s
115 ; CHECK-NEXT: mov z0.s, p1/z, #-1 // =0xffffffffffffffff
116 ; CHECK-NEXT: mov z1.s, p0/z, #-1 // =0xffffffffffffffff
117 ; CHECK-NEXT: stp q0, q1, [x2]
119 %op1 = load <8 x float>, ptr %a
120 %op2 = load <8 x float>, ptr %b
121 %cmp = fcmp oeq <8 x float> %op1, %op2
122 %sext = sext <8 x i1> %cmp to <8 x i32>
123 store <8 x i32> %sext, ptr %c
127 define <1 x i64> @fcmp_oeq_v1f64(<1 x double> %op1, <1 x double> %op2) {
128 ; CHECK-LABEL: fcmp_oeq_v1f64:
130 ; CHECK-NEXT: ptrue p0.d, vl1
131 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
132 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
133 ; CHECK-NEXT: fcmeq p0.d, p0/z, z0.d, z1.d
134 ; CHECK-NEXT: mov z0.d, p0/z, #-1 // =0xffffffffffffffff
135 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
137 %cmp = fcmp oeq <1 x double> %op1, %op2
138 %sext = sext <1 x i1> %cmp to <1 x i64>
142 define <2 x i64> @fcmp_oeq_v2f64(<2 x double> %op1, <2 x double> %op2) {
143 ; CHECK-LABEL: fcmp_oeq_v2f64:
145 ; CHECK-NEXT: ptrue p0.d, vl2
146 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
147 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
148 ; CHECK-NEXT: fcmeq p0.d, p0/z, z0.d, z1.d
149 ; CHECK-NEXT: mov z0.d, p0/z, #-1 // =0xffffffffffffffff
150 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
152 %cmp = fcmp oeq <2 x double> %op1, %op2
153 %sext = sext <2 x i1> %cmp to <2 x i64>
157 define void @fcmp_oeq_v4f64(ptr %a, ptr %b, ptr %c) {
158 ; CHECK-LABEL: fcmp_oeq_v4f64:
160 ; CHECK-NEXT: ptrue p0.d, vl2
161 ; CHECK-NEXT: ldp q0, q3, [x1]
162 ; CHECK-NEXT: ldp q1, q2, [x0]
163 ; CHECK-NEXT: fcmeq p1.d, p0/z, z1.d, z0.d
164 ; CHECK-NEXT: fcmeq p0.d, p0/z, z2.d, z3.d
165 ; CHECK-NEXT: mov z0.d, p1/z, #-1 // =0xffffffffffffffff
166 ; CHECK-NEXT: mov z1.d, p0/z, #-1 // =0xffffffffffffffff
167 ; CHECK-NEXT: stp q0, q1, [x2]
169 %op1 = load <4 x double>, ptr %a
170 %op2 = load <4 x double>, ptr %b
171 %cmp = fcmp oeq <4 x double> %op1, %op2
172 %sext = sext <4 x i1> %cmp to <4 x i64>
173 store <4 x i64> %sext, ptr %c
181 define void @fcmp_ueq_v16f16(ptr %a, ptr %b, ptr %c) {
182 ; CHECK-LABEL: fcmp_ueq_v16f16:
184 ; CHECK-NEXT: ptrue p0.h, vl8
185 ; CHECK-NEXT: ldp q0, q3, [x1]
186 ; CHECK-NEXT: ldp q1, q2, [x0]
187 ; CHECK-NEXT: fcmuo p1.h, p0/z, z1.h, z0.h
188 ; CHECK-NEXT: fcmeq p2.h, p0/z, z1.h, z0.h
189 ; CHECK-NEXT: fcmuo p3.h, p0/z, z2.h, z3.h
190 ; CHECK-NEXT: fcmeq p0.h, p0/z, z2.h, z3.h
191 ; CHECK-NEXT: mov p1.b, p2/m, p2.b
192 ; CHECK-NEXT: sel p0.b, p0, p0.b, p3.b
193 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
194 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
195 ; CHECK-NEXT: stp q0, q1, [x2]
197 %op1 = load <16 x half>, ptr %a
198 %op2 = load <16 x half>, ptr %b
199 %cmp = fcmp ueq <16 x half> %op1, %op2
200 %sext = sext <16 x i1> %cmp to <16 x i16>
201 store <16 x i16> %sext, ptr %c
209 define void @fcmp_one_v16f16(ptr %a, ptr %b, ptr %c) {
210 ; CHECK-LABEL: fcmp_one_v16f16:
212 ; CHECK-NEXT: ptrue p0.h, vl8
213 ; CHECK-NEXT: ldp q0, q3, [x1]
214 ; CHECK-NEXT: ldp q1, q2, [x0]
215 ; CHECK-NEXT: fcmgt p1.h, p0/z, z0.h, z1.h
216 ; CHECK-NEXT: fcmgt p2.h, p0/z, z1.h, z0.h
217 ; CHECK-NEXT: fcmgt p3.h, p0/z, z3.h, z2.h
218 ; CHECK-NEXT: fcmgt p0.h, p0/z, z2.h, z3.h
219 ; CHECK-NEXT: mov p1.b, p2/m, p2.b
220 ; CHECK-NEXT: sel p0.b, p0, p0.b, p3.b
221 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
222 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
223 ; CHECK-NEXT: stp q0, q1, [x2]
225 %op1 = load <16 x half>, ptr %a
226 %op2 = load <16 x half>, ptr %b
227 %cmp = fcmp one <16 x half> %op1, %op2
228 %sext = sext <16 x i1> %cmp to <16 x i16>
229 store <16 x i16> %sext, ptr %c
237 define void @fcmp_une_v16f16(ptr %a, ptr %b, ptr %c) {
238 ; CHECK-LABEL: fcmp_une_v16f16:
240 ; CHECK-NEXT: ptrue p0.h, vl8
241 ; CHECK-NEXT: ldp q0, q3, [x1]
242 ; CHECK-NEXT: ldp q1, q2, [x0]
243 ; CHECK-NEXT: fcmne p1.h, p0/z, z1.h, z0.h
244 ; CHECK-NEXT: fcmne p0.h, p0/z, z2.h, z3.h
245 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
246 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
247 ; CHECK-NEXT: stp q0, q1, [x2]
249 %op1 = load <16 x half>, ptr %a
250 %op2 = load <16 x half>, ptr %b
251 %cmp = fcmp une <16 x half> %op1, %op2
252 %sext = sext <16 x i1> %cmp to <16 x i16>
253 store <16 x i16> %sext, ptr %c
261 define void @fcmp_ogt_v16f16(ptr %a, ptr %b, ptr %c) {
262 ; CHECK-LABEL: fcmp_ogt_v16f16:
264 ; CHECK-NEXT: ptrue p0.h, vl8
265 ; CHECK-NEXT: ldp q0, q3, [x1]
266 ; CHECK-NEXT: ldp q1, q2, [x0]
267 ; CHECK-NEXT: fcmgt p1.h, p0/z, z1.h, z0.h
268 ; CHECK-NEXT: fcmgt p0.h, p0/z, z2.h, z3.h
269 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
270 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
271 ; CHECK-NEXT: stp q0, q1, [x2]
273 %op1 = load <16 x half>, ptr %a
274 %op2 = load <16 x half>, ptr %b
275 %cmp = fcmp ogt <16 x half> %op1, %op2
276 %sext = sext <16 x i1> %cmp to <16 x i16>
277 store <16 x i16> %sext, ptr %c
285 define void @fcmp_ugt_v16f16(ptr %a, ptr %b, ptr %c) {
286 ; CHECK-LABEL: fcmp_ugt_v16f16:
288 ; CHECK-NEXT: ptrue p0.h, vl8
289 ; CHECK-NEXT: ldp q0, q3, [x1]
290 ; CHECK-NEXT: ldp q1, q2, [x0]
291 ; CHECK-NEXT: fcmge p1.h, p0/z, z0.h, z1.h
292 ; CHECK-NEXT: fcmge p0.h, p0/z, z3.h, z2.h
293 ; CHECK-NEXT: mov z0.h, #-1 // =0xffffffffffffffff
294 ; CHECK-NEXT: mov z1.h, p1/z, #-1 // =0xffffffffffffffff
295 ; CHECK-NEXT: mov z2.h, p0/z, #-1 // =0xffffffffffffffff
296 ; CHECK-NEXT: eor z1.d, z1.d, z0.d
297 ; CHECK-NEXT: eor z0.d, z2.d, z0.d
298 ; CHECK-NEXT: stp q1, q0, [x2]
300 %op1 = load <16 x half>, ptr %a
301 %op2 = load <16 x half>, ptr %b
302 %cmp = fcmp ugt <16 x half> %op1, %op2
303 %sext = sext <16 x i1> %cmp to <16 x i16>
304 store <16 x i16> %sext, ptr %c
312 define void @fcmp_olt_v16f16(ptr %a, ptr %b, ptr %c) {
313 ; CHECK-LABEL: fcmp_olt_v16f16:
315 ; CHECK-NEXT: ptrue p0.h, vl8
316 ; CHECK-NEXT: ldp q0, q3, [x1]
317 ; CHECK-NEXT: ldp q1, q2, [x0]
318 ; CHECK-NEXT: fcmgt p1.h, p0/z, z0.h, z1.h
319 ; CHECK-NEXT: fcmgt p0.h, p0/z, z3.h, z2.h
320 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
321 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
322 ; CHECK-NEXT: stp q0, q1, [x2]
324 %op1 = load <16 x half>, ptr %a
325 %op2 = load <16 x half>, ptr %b
326 %cmp = fcmp olt <16 x half> %op1, %op2
327 %sext = sext <16 x i1> %cmp to <16 x i16>
328 store <16 x i16> %sext, ptr %c
336 define void @fcmp_ult_v16f16(ptr %a, ptr %b, ptr %c) {
337 ; CHECK-LABEL: fcmp_ult_v16f16:
339 ; CHECK-NEXT: ptrue p0.h, vl8
340 ; CHECK-NEXT: ldp q0, q3, [x1]
341 ; CHECK-NEXT: ldp q1, q2, [x0]
342 ; CHECK-NEXT: fcmge p1.h, p0/z, z1.h, z0.h
343 ; CHECK-NEXT: fcmge p0.h, p0/z, z2.h, z3.h
344 ; CHECK-NEXT: mov z0.h, #-1 // =0xffffffffffffffff
345 ; CHECK-NEXT: mov z1.h, p1/z, #-1 // =0xffffffffffffffff
346 ; CHECK-NEXT: mov z2.h, p0/z, #-1 // =0xffffffffffffffff
347 ; CHECK-NEXT: eor z1.d, z1.d, z0.d
348 ; CHECK-NEXT: eor z0.d, z2.d, z0.d
349 ; CHECK-NEXT: stp q1, q0, [x2]
351 %op1 = load <16 x half>, ptr %a
352 %op2 = load <16 x half>, ptr %b
353 %cmp = fcmp ult <16 x half> %op1, %op2
354 %sext = sext <16 x i1> %cmp to <16 x i16>
355 store <16 x i16> %sext, ptr %c
363 define void @fcmp_oge_v16f16(ptr %a, ptr %b, ptr %c) {
364 ; CHECK-LABEL: fcmp_oge_v16f16:
366 ; CHECK-NEXT: ptrue p0.h, vl8
367 ; CHECK-NEXT: ldp q0, q3, [x1]
368 ; CHECK-NEXT: ldp q1, q2, [x0]
369 ; CHECK-NEXT: fcmge p1.h, p0/z, z1.h, z0.h
370 ; CHECK-NEXT: fcmge p0.h, p0/z, z2.h, z3.h
371 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
372 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
373 ; CHECK-NEXT: stp q0, q1, [x2]
375 %op1 = load <16 x half>, ptr %a
376 %op2 = load <16 x half>, ptr %b
377 %cmp = fcmp oge <16 x half> %op1, %op2
378 %sext = sext <16 x i1> %cmp to <16 x i16>
379 store <16 x i16> %sext, ptr %c
387 define void @fcmp_uge_v16f16(ptr %a, ptr %b, ptr %c) {
388 ; CHECK-LABEL: fcmp_uge_v16f16:
390 ; CHECK-NEXT: ptrue p0.h, vl8
391 ; CHECK-NEXT: ldp q0, q3, [x1]
392 ; CHECK-NEXT: ldp q1, q2, [x0]
393 ; CHECK-NEXT: fcmgt p1.h, p0/z, z0.h, z1.h
394 ; CHECK-NEXT: fcmgt p0.h, p0/z, z3.h, z2.h
395 ; CHECK-NEXT: mov z0.h, #-1 // =0xffffffffffffffff
396 ; CHECK-NEXT: mov z1.h, p1/z, #-1 // =0xffffffffffffffff
397 ; CHECK-NEXT: mov z2.h, p0/z, #-1 // =0xffffffffffffffff
398 ; CHECK-NEXT: eor z1.d, z1.d, z0.d
399 ; CHECK-NEXT: eor z0.d, z2.d, z0.d
400 ; CHECK-NEXT: stp q1, q0, [x2]
402 %op1 = load <16 x half>, ptr %a
403 %op2 = load <16 x half>, ptr %b
404 %cmp = fcmp uge <16 x half> %op1, %op2
405 %sext = sext <16 x i1> %cmp to <16 x i16>
406 store <16 x i16> %sext, ptr %c
414 define void @fcmp_ole_v16f16(ptr %a, ptr %b, ptr %c) {
415 ; CHECK-LABEL: fcmp_ole_v16f16:
417 ; CHECK-NEXT: ptrue p0.h, vl8
418 ; CHECK-NEXT: ldp q0, q3, [x1]
419 ; CHECK-NEXT: ldp q1, q2, [x0]
420 ; CHECK-NEXT: fcmge p1.h, p0/z, z0.h, z1.h
421 ; CHECK-NEXT: fcmge p0.h, p0/z, z3.h, z2.h
422 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
423 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
424 ; CHECK-NEXT: stp q0, q1, [x2]
426 %op1 = load <16 x half>, ptr %a
427 %op2 = load <16 x half>, ptr %b
428 %cmp = fcmp ole <16 x half> %op1, %op2
429 %sext = sext <16 x i1> %cmp to <16 x i16>
430 store <16 x i16> %sext, ptr %c
438 define void @fcmp_ule_v16f16(ptr %a, ptr %b, ptr %c) {
439 ; CHECK-LABEL: fcmp_ule_v16f16:
441 ; CHECK-NEXT: ptrue p0.h, vl8
442 ; CHECK-NEXT: ldp q0, q3, [x1]
443 ; CHECK-NEXT: ldp q1, q2, [x0]
444 ; CHECK-NEXT: fcmgt p1.h, p0/z, z1.h, z0.h
445 ; CHECK-NEXT: fcmgt p0.h, p0/z, z2.h, z3.h
446 ; CHECK-NEXT: mov z0.h, #-1 // =0xffffffffffffffff
447 ; CHECK-NEXT: mov z1.h, p1/z, #-1 // =0xffffffffffffffff
448 ; CHECK-NEXT: mov z2.h, p0/z, #-1 // =0xffffffffffffffff
449 ; CHECK-NEXT: eor z1.d, z1.d, z0.d
450 ; CHECK-NEXT: eor z0.d, z2.d, z0.d
451 ; CHECK-NEXT: stp q1, q0, [x2]
453 %op1 = load <16 x half>, ptr %a
454 %op2 = load <16 x half>, ptr %b
455 %cmp = fcmp ule <16 x half> %op1, %op2
456 %sext = sext <16 x i1> %cmp to <16 x i16>
457 store <16 x i16> %sext, ptr %c
465 define void @fcmp_uno_v16f16(ptr %a, ptr %b, ptr %c) {
466 ; CHECK-LABEL: fcmp_uno_v16f16:
468 ; CHECK-NEXT: ptrue p0.h, vl8
469 ; CHECK-NEXT: ldp q0, q3, [x1]
470 ; CHECK-NEXT: ldp q1, q2, [x0]
471 ; CHECK-NEXT: fcmuo p1.h, p0/z, z1.h, z0.h
472 ; CHECK-NEXT: fcmuo p0.h, p0/z, z2.h, z3.h
473 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
474 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
475 ; CHECK-NEXT: stp q0, q1, [x2]
477 %op1 = load <16 x half>, ptr %a
478 %op2 = load <16 x half>, ptr %b
479 %cmp = fcmp uno <16 x half> %op1, %op2
480 %sext = sext <16 x i1> %cmp to <16 x i16>
481 store <16 x i16> %sext, ptr %c
489 define void @fcmp_ord_v16f16(ptr %a, ptr %b, ptr %c) {
490 ; CHECK-LABEL: fcmp_ord_v16f16:
492 ; CHECK-NEXT: ptrue p0.h, vl8
493 ; CHECK-NEXT: ldp q0, q3, [x1]
494 ; CHECK-NEXT: ldp q1, q2, [x0]
495 ; CHECK-NEXT: fcmuo p1.h, p0/z, z1.h, z0.h
496 ; CHECK-NEXT: fcmuo p0.h, p0/z, z2.h, z3.h
497 ; CHECK-NEXT: mov z0.h, #-1 // =0xffffffffffffffff
498 ; CHECK-NEXT: mov z1.h, p1/z, #-1 // =0xffffffffffffffff
499 ; CHECK-NEXT: mov z2.h, p0/z, #-1 // =0xffffffffffffffff
500 ; CHECK-NEXT: eor z1.d, z1.d, z0.d
501 ; CHECK-NEXT: eor z0.d, z2.d, z0.d
502 ; CHECK-NEXT: stp q1, q0, [x2]
504 %op1 = load <16 x half>, ptr %a
505 %op2 = load <16 x half>, ptr %b
506 %cmp = fcmp ord <16 x half> %op1, %op2
507 %sext = sext <16 x i1> %cmp to <16 x i16>
508 store <16 x i16> %sext, ptr %c
516 define void @fcmp_eq_v16f16(ptr %a, ptr %b, ptr %c) {
517 ; CHECK-LABEL: fcmp_eq_v16f16:
519 ; CHECK-NEXT: ptrue p0.h, vl8
520 ; CHECK-NEXT: ldp q0, q3, [x1]
521 ; CHECK-NEXT: ldp q1, q2, [x0]
522 ; CHECK-NEXT: fcmeq p1.h, p0/z, z1.h, z0.h
523 ; CHECK-NEXT: fcmeq p0.h, p0/z, z2.h, z3.h
524 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
525 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
526 ; CHECK-NEXT: stp q0, q1, [x2]
528 %op1 = load <16 x half>, ptr %a
529 %op2 = load <16 x half>, ptr %b
530 %cmp = fcmp fast oeq <16 x half> %op1, %op2
531 %sext = sext <16 x i1> %cmp to <16 x i16>
532 store <16 x i16> %sext, ptr %c
540 define void @fcmp_ne_v16f16(ptr %a, ptr %b, ptr %c) {
541 ; CHECK-LABEL: fcmp_ne_v16f16:
543 ; CHECK-NEXT: ptrue p0.h, vl8
544 ; CHECK-NEXT: ldp q0, q3, [x1]
545 ; CHECK-NEXT: ldp q1, q2, [x0]
546 ; CHECK-NEXT: fcmne p1.h, p0/z, z1.h, z0.h
547 ; CHECK-NEXT: fcmne p0.h, p0/z, z2.h, z3.h
548 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
549 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
550 ; CHECK-NEXT: stp q0, q1, [x2]
552 %op1 = load <16 x half>, ptr %a
553 %op2 = load <16 x half>, ptr %b
554 %cmp = fcmp fast one <16 x half> %op1, %op2
555 %sext = sext <16 x i1> %cmp to <16 x i16>
556 store <16 x i16> %sext, ptr %c
564 define void @fcmp_gt_v16f16(ptr %a, ptr %b, ptr %c) {
565 ; CHECK-LABEL: fcmp_gt_v16f16:
567 ; CHECK-NEXT: ptrue p0.h, vl8
568 ; CHECK-NEXT: ldp q0, q3, [x1]
569 ; CHECK-NEXT: ldp q1, q2, [x0]
570 ; CHECK-NEXT: fcmgt p1.h, p0/z, z1.h, z0.h
571 ; CHECK-NEXT: fcmgt p0.h, p0/z, z2.h, z3.h
572 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
573 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
574 ; CHECK-NEXT: stp q0, q1, [x2]
576 %op1 = load <16 x half>, ptr %a
577 %op2 = load <16 x half>, ptr %b
578 %cmp = fcmp fast ogt <16 x half> %op1, %op2
579 %sext = sext <16 x i1> %cmp to <16 x i16>
580 store <16 x i16> %sext, ptr %c
588 define void @fcmp_lt_v16f16(ptr %a, ptr %b, ptr %c) {
589 ; CHECK-LABEL: fcmp_lt_v16f16:
591 ; CHECK-NEXT: ptrue p0.h, vl8
592 ; CHECK-NEXT: ldp q0, q3, [x1]
593 ; CHECK-NEXT: ldp q1, q2, [x0]
594 ; CHECK-NEXT: fcmgt p1.h, p0/z, z0.h, z1.h
595 ; CHECK-NEXT: fcmgt p0.h, p0/z, z3.h, z2.h
596 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
597 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
598 ; CHECK-NEXT: stp q0, q1, [x2]
600 %op1 = load <16 x half>, ptr %a
601 %op2 = load <16 x half>, ptr %b
602 %cmp = fcmp fast olt <16 x half> %op1, %op2
603 %sext = sext <16 x i1> %cmp to <16 x i16>
604 store <16 x i16> %sext, ptr %c
612 define void @fcmp_ge_v16f16(ptr %a, ptr %b, ptr %c) {
613 ; CHECK-LABEL: fcmp_ge_v16f16:
615 ; CHECK-NEXT: ptrue p0.h, vl8
616 ; CHECK-NEXT: ldp q0, q3, [x1]
617 ; CHECK-NEXT: ldp q1, q2, [x0]
618 ; CHECK-NEXT: fcmge p1.h, p0/z, z1.h, z0.h
619 ; CHECK-NEXT: fcmge p0.h, p0/z, z2.h, z3.h
620 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
621 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
622 ; CHECK-NEXT: stp q0, q1, [x2]
624 %op1 = load <16 x half>, ptr %a
625 %op2 = load <16 x half>, ptr %b
626 %cmp = fcmp fast oge <16 x half> %op1, %op2
627 %sext = sext <16 x i1> %cmp to <16 x i16>
628 store <16 x i16> %sext, ptr %c
636 define void @fcmp_le_v16f16(ptr %a, ptr %b, ptr %c) {
637 ; CHECK-LABEL: fcmp_le_v16f16:
639 ; CHECK-NEXT: ptrue p0.h, vl8
640 ; CHECK-NEXT: ldp q0, q3, [x1]
641 ; CHECK-NEXT: ldp q1, q2, [x0]
642 ; CHECK-NEXT: fcmge p1.h, p0/z, z0.h, z1.h
643 ; CHECK-NEXT: fcmge p0.h, p0/z, z3.h, z2.h
644 ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff
645 ; CHECK-NEXT: mov z1.h, p0/z, #-1 // =0xffffffffffffffff
646 ; CHECK-NEXT: stp q0, q1, [x2]
648 %op1 = load <16 x half>, ptr %a
649 %op2 = load <16 x half>, ptr %b
650 %cmp = fcmp fast ole <16 x half> %op1, %op2
651 %sext = sext <16 x i1> %cmp to <16 x i16>
652 store <16 x i16> %sext, ptr %c