Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-fp-compares.ll
blobaad078f035f7d6f8e4f1d524646cce02d11a6f76
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"
8 ; FCMP OEQ
11 define <2 x i16> @fcmp_oeq_v2f16(<2 x half> %op1, <2 x half> %op2) {
12 ; CHECK-LABEL: fcmp_oeq_v2f16:
13 ; CHECK:       // %bb.0:
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
21 ; CHECK-NEXT:    ret
22   %cmp = fcmp oeq <2 x half> %op1, %op2
23   %sext = sext <2 x i1> %cmp to <2 x i16>
24   ret <2 x i16> %sext
27 define <4 x i16> @fcmp_oeq_v4f16(<4 x half> %op1, <4 x half> %op2) {
28 ; CHECK-LABEL: fcmp_oeq_v4f16:
29 ; CHECK:       // %bb.0:
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
36 ; CHECK-NEXT:    ret
37   %cmp = fcmp oeq <4 x half> %op1, %op2
38   %sext = sext <4 x i1> %cmp to <4 x i16>
39   ret <4 x i16> %sext
42 define <8 x i16> @fcmp_oeq_v8f16(<8 x half> %op1, <8 x half> %op2) {
43 ; CHECK-LABEL: fcmp_oeq_v8f16:
44 ; CHECK:       // %bb.0:
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
51 ; CHECK-NEXT:    ret
52   %cmp = fcmp oeq <8 x half> %op1, %op2
53   %sext = sext <8 x i1> %cmp to <8 x i16>
54   ret <8 x i16> %sext
57 define void @fcmp_oeq_v16f16(ptr %a, ptr %b, ptr %c) {
58 ; CHECK-LABEL: fcmp_oeq_v16f16:
59 ; CHECK:       // %bb.0:
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]
68 ; CHECK-NEXT:    ret
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
74   ret void
77 define <2 x i32> @fcmp_oeq_v2f32(<2 x float> %op1, <2 x float> %op2) {
78 ; CHECK-LABEL: fcmp_oeq_v2f32:
79 ; CHECK:       // %bb.0:
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
86 ; CHECK-NEXT:    ret
87   %cmp = fcmp oeq <2 x float> %op1, %op2
88   %sext = sext <2 x i1> %cmp to <2 x i32>
89   ret <2 x i32> %sext
92 define <4 x i32> @fcmp_oeq_v4f32(<4 x float> %op1, <4 x float> %op2) {
93 ; CHECK-LABEL: fcmp_oeq_v4f32:
94 ; CHECK:       // %bb.0:
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
101 ; CHECK-NEXT:    ret
102   %cmp = fcmp oeq <4 x float> %op1, %op2
103   %sext = sext <4 x i1> %cmp to <4 x i32>
104   ret <4 x i32> %sext
107 define void @fcmp_oeq_v8f32(ptr %a, ptr %b, ptr %c) {
108 ; CHECK-LABEL: fcmp_oeq_v8f32:
109 ; CHECK:       // %bb.0:
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]
118 ; CHECK-NEXT:    ret
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
124   ret void
127 define <1 x i64> @fcmp_oeq_v1f64(<1 x double> %op1, <1 x double> %op2) {
128 ; CHECK-LABEL: fcmp_oeq_v1f64:
129 ; CHECK:       // %bb.0:
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
136 ; CHECK-NEXT:    ret
137   %cmp = fcmp oeq <1 x double> %op1, %op2
138   %sext = sext <1 x i1> %cmp to <1 x i64>
139   ret <1 x i64> %sext
142 define <2 x i64> @fcmp_oeq_v2f64(<2 x double> %op1, <2 x double> %op2) {
143 ; CHECK-LABEL: fcmp_oeq_v2f64:
144 ; CHECK:       // %bb.0:
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
151 ; CHECK-NEXT:    ret
152   %cmp = fcmp oeq <2 x double> %op1, %op2
153   %sext = sext <2 x i1> %cmp to <2 x i64>
154   ret <2 x i64> %sext
157 define void @fcmp_oeq_v4f64(ptr %a, ptr %b, ptr %c) {
158 ; CHECK-LABEL: fcmp_oeq_v4f64:
159 ; CHECK:       // %bb.0:
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]
168 ; CHECK-NEXT:    ret
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
174   ret void
178 ; FCMP UEQ
181 define void @fcmp_ueq_v16f16(ptr %a, ptr %b, ptr %c) {
182 ; CHECK-LABEL: fcmp_ueq_v16f16:
183 ; CHECK:       // %bb.0:
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]
196 ; CHECK-NEXT:    ret
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
202   ret void
206 ; FCMP ONE
209 define void @fcmp_one_v16f16(ptr %a, ptr %b, ptr %c) {
210 ; CHECK-LABEL: fcmp_one_v16f16:
211 ; CHECK:       // %bb.0:
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]
224 ; CHECK-NEXT:    ret
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
230   ret void
234 ; FCMP UNE
237 define void @fcmp_une_v16f16(ptr %a, ptr %b, ptr %c) {
238 ; CHECK-LABEL: fcmp_une_v16f16:
239 ; CHECK:       // %bb.0:
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]
248 ; CHECK-NEXT:    ret
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
254   ret void
258 ; FCMP OGT
261 define void @fcmp_ogt_v16f16(ptr %a, ptr %b, ptr %c) {
262 ; CHECK-LABEL: fcmp_ogt_v16f16:
263 ; CHECK:       // %bb.0:
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]
272 ; CHECK-NEXT:    ret
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
278   ret void
282 ; FCMP UGT
285 define void @fcmp_ugt_v16f16(ptr %a, ptr %b, ptr %c) {
286 ; CHECK-LABEL: fcmp_ugt_v16f16:
287 ; CHECK:       // %bb.0:
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]
299 ; CHECK-NEXT:    ret
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
305   ret void
309 ; FCMP OLT
312 define void @fcmp_olt_v16f16(ptr %a, ptr %b, ptr %c) {
313 ; CHECK-LABEL: fcmp_olt_v16f16:
314 ; CHECK:       // %bb.0:
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]
323 ; CHECK-NEXT:    ret
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
329   ret void
333 ; FCMP ULT
336 define void @fcmp_ult_v16f16(ptr %a, ptr %b, ptr %c) {
337 ; CHECK-LABEL: fcmp_ult_v16f16:
338 ; CHECK:       // %bb.0:
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]
350 ; CHECK-NEXT:    ret
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
356   ret void
360 ; FCMP OGE
363 define void @fcmp_oge_v16f16(ptr %a, ptr %b, ptr %c) {
364 ; CHECK-LABEL: fcmp_oge_v16f16:
365 ; CHECK:       // %bb.0:
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]
374 ; CHECK-NEXT:    ret
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
380   ret void
384 ; FCMP UGE
387 define void @fcmp_uge_v16f16(ptr %a, ptr %b, ptr %c) {
388 ; CHECK-LABEL: fcmp_uge_v16f16:
389 ; CHECK:       // %bb.0:
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]
401 ; CHECK-NEXT:    ret
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
407   ret void
411 ; FCMP OLE
414 define void @fcmp_ole_v16f16(ptr %a, ptr %b, ptr %c) {
415 ; CHECK-LABEL: fcmp_ole_v16f16:
416 ; CHECK:       // %bb.0:
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]
425 ; CHECK-NEXT:    ret
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
431   ret void
435 ; FCMP ULE
438 define void @fcmp_ule_v16f16(ptr %a, ptr %b, ptr %c) {
439 ; CHECK-LABEL: fcmp_ule_v16f16:
440 ; CHECK:       // %bb.0:
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]
452 ; CHECK-NEXT:    ret
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
458   ret void
462 ; FCMP UNO
465 define void @fcmp_uno_v16f16(ptr %a, ptr %b, ptr %c) {
466 ; CHECK-LABEL: fcmp_uno_v16f16:
467 ; CHECK:       // %bb.0:
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]
476 ; CHECK-NEXT:    ret
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
482   ret void
486 ; FCMP ORD
489 define void @fcmp_ord_v16f16(ptr %a, ptr %b, ptr %c) {
490 ; CHECK-LABEL: fcmp_ord_v16f16:
491 ; CHECK:       // %bb.0:
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]
503 ; CHECK-NEXT:    ret
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
509   ret void
513 ; FCMP EQ
516 define void @fcmp_eq_v16f16(ptr %a, ptr %b, ptr %c) {
517 ; CHECK-LABEL: fcmp_eq_v16f16:
518 ; CHECK:       // %bb.0:
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]
527 ; CHECK-NEXT:    ret
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
533   ret void
537 ; FCMP NE
540 define void @fcmp_ne_v16f16(ptr %a, ptr %b, ptr %c) {
541 ; CHECK-LABEL: fcmp_ne_v16f16:
542 ; CHECK:       // %bb.0:
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]
551 ; CHECK-NEXT:    ret
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
557   ret void
561 ; FCMP GT
564 define void @fcmp_gt_v16f16(ptr %a, ptr %b, ptr %c) {
565 ; CHECK-LABEL: fcmp_gt_v16f16:
566 ; CHECK:       // %bb.0:
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]
575 ; CHECK-NEXT:    ret
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
581   ret void
585 ; FCMP LT
588 define void @fcmp_lt_v16f16(ptr %a, ptr %b, ptr %c) {
589 ; CHECK-LABEL: fcmp_lt_v16f16:
590 ; CHECK:       // %bb.0:
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]
599 ; CHECK-NEXT:    ret
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
605   ret void
609 ; FCMP GE
612 define void @fcmp_ge_v16f16(ptr %a, ptr %b, ptr %c) {
613 ; CHECK-LABEL: fcmp_ge_v16f16:
614 ; CHECK:       // %bb.0:
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]
623 ; CHECK-NEXT:    ret
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
629   ret void
633 ; FCMP LE
636 define void @fcmp_le_v16f16(ptr %a, ptr %b, ptr %c) {
637 ; CHECK-LABEL: fcmp_le_v16f16:
638 ; CHECK:       // %bb.0:
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]
647 ; CHECK-NEXT:    ret
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
653   ret void