@@ -113,6 +113,120 @@ define <vscale x 2 x float> @fcvts_nxv2f64(<vscale x 2 x double> %a) {
113113; FP_TO_SINT
114114;
115115
116+ define <vscale x 2 x i1 > @fcvtzs_nxv2f16_to_nxv2i1 (<vscale x 2 x half > %a ) {
117+ ; CHECK-LABEL: fcvtzs_nxv2f16_to_nxv2i1:
118+ ; CHECK: // %bb.0:
119+ ; CHECK-NEXT: ptrue p0.d
120+ ; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h
121+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
122+ ; CHECK-NEXT: ret
123+ %res = fptosi <vscale x 2 x half > %a to <vscale x 2 x i1 >
124+ ret <vscale x 2 x i1 > %res
125+ }
126+
127+ define <vscale x 2 x i1 > @fcvtzs_nxv2f32_to_nxv2i1 (<vscale x 2 x float > %a ) {
128+ ; CHECK-LABEL: fcvtzs_nxv2f32_to_nxv2i1:
129+ ; CHECK: // %bb.0:
130+ ; CHECK-NEXT: ptrue p0.d
131+ ; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s
132+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
133+ ; CHECK-NEXT: ret
134+ %res = fptosi <vscale x 2 x float > %a to <vscale x 2 x i1 >
135+ ret <vscale x 2 x i1 > %res
136+ }
137+
138+ define <vscale x 2 x i1 > @fcvtzs_nxv2f64_to_nxv2i1 (<vscale x 2 x double > %a ) {
139+ ; CHECK-LABEL: fcvtzs_nxv2f64_to_nxv2i1:
140+ ; CHECK: // %bb.0:
141+ ; CHECK-NEXT: ptrue p0.d
142+ ; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d
143+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
144+ ; CHECK-NEXT: ret
145+ %res = fptosi <vscale x 2 x double > %a to <vscale x 2 x i1 >
146+ ret <vscale x 2 x i1 > %res
147+ }
148+
149+ define <vscale x 4 x i1 > @fcvtzs_nxv4f16_to_nxv4i1 (<vscale x 4 x half > %a ) {
150+ ; CHECK-LABEL: fcvtzs_nxv4f16_to_nxv4i1:
151+ ; CHECK: // %bb.0:
152+ ; CHECK-NEXT: ptrue p0.s
153+ ; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h
154+ ; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0
155+ ; CHECK-NEXT: ret
156+ %res = fptosi <vscale x 4 x half > %a to <vscale x 4 x i1 >
157+ ret <vscale x 4 x i1 > %res
158+ }
159+
160+ define <vscale x 4 x i1 > @fcvtzs_nxv4f32_to_nxv4i1 (<vscale x 4 x float > %a ) {
161+ ; CHECK-LABEL: fcvtzs_nxv4f32_to_nxv4i1:
162+ ; CHECK: // %bb.0:
163+ ; CHECK-NEXT: ptrue p0.s
164+ ; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s
165+ ; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0
166+ ; CHECK-NEXT: ret
167+ %res = fptosi <vscale x 4 x float > %a to <vscale x 4 x i1 >
168+ ret <vscale x 4 x i1 > %res
169+ }
170+
171+ define <vscale x 4 x i1 > @fcvtzs_nxv4f64_to_nxv4i1 (<vscale x 4 x double > %a ) {
172+ ; CHECK-LABEL: fcvtzs_nxv4f64_to_nxv4i1:
173+ ; CHECK: // %bb.0:
174+ ; CHECK-NEXT: ptrue p0.d
175+ ; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d
176+ ; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d
177+ ; CHECK-NEXT: cmpne p1.d, p0/z, z1.d, #0
178+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
179+ ; CHECK-NEXT: uzp1 p0.s, p0.s, p1.s
180+ ; CHECK-NEXT: ret
181+ %res = fptosi <vscale x 4 x double > %a to <vscale x 4 x i1 >
182+ ret <vscale x 4 x i1 > %res
183+ }
184+
185+ define <vscale x 8 x i1 > @fcvtzs_nxv8f16_to_nxv8i1 (<vscale x 8 x half > %a ) {
186+ ; CHECK-LABEL: fcvtzs_nxv8f16_to_nxv8i1:
187+ ; CHECK: // %bb.0:
188+ ; CHECK-NEXT: ptrue p0.h
189+ ; CHECK-NEXT: fcvtzs z0.h, p0/m, z0.h
190+ ; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #0
191+ ; CHECK-NEXT: ret
192+ %res = fptosi <vscale x 8 x half > %a to <vscale x 8 x i1 >
193+ ret <vscale x 8 x i1 > %res
194+ }
195+
196+ define <vscale x 8 x i1 > @fcvtzs_nxv8f32_to_nxv8i1 (<vscale x 8 x float > %a ) {
197+ ; CHECK-LABEL: fcvtzs_nxv8f32_to_nxv8i1:
198+ ; CHECK: // %bb.0:
199+ ; CHECK-NEXT: ptrue p0.s
200+ ; CHECK-NEXT: fcvtzs z1.s, p0/m, z1.s
201+ ; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s
202+ ; CHECK-NEXT: cmpne p1.s, p0/z, z1.s, #0
203+ ; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0
204+ ; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h
205+ ; CHECK-NEXT: ret
206+ %res = fptosi <vscale x 8 x float > %a to <vscale x 8 x i1 >
207+ ret <vscale x 8 x i1 > %res
208+ }
209+
210+ define <vscale x 8 x i1 > @fcvtzs_nxv8f64_to_nxv8i1 (<vscale x 8 x double > %a ) {
211+ ; CHECK-LABEL: fcvtzs_nxv8f64_to_nxv8i1:
212+ ; CHECK: // %bb.0:
213+ ; CHECK-NEXT: ptrue p0.d
214+ ; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.d
215+ ; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.d
216+ ; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d
217+ ; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d
218+ ; CHECK-NEXT: cmpne p1.d, p0/z, z3.d, #0
219+ ; CHECK-NEXT: cmpne p2.d, p0/z, z2.d, #0
220+ ; CHECK-NEXT: cmpne p3.d, p0/z, z1.d, #0
221+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
222+ ; CHECK-NEXT: uzp1 p1.s, p2.s, p1.s
223+ ; CHECK-NEXT: uzp1 p0.s, p0.s, p3.s
224+ ; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h
225+ ; CHECK-NEXT: ret
226+ %res = fptosi <vscale x 8 x double > %a to <vscale x 8 x i1 >
227+ ret <vscale x 8 x i1 > %res
228+ }
229+
116230define <vscale x 2 x i16 > @fcvtzs_h_nxv2f16 (<vscale x 2 x half > %a ) {
117231; CHECK-LABEL: fcvtzs_h_nxv2f16:
118232; CHECK: // %bb.0:
@@ -277,6 +391,120 @@ define <vscale x 2 x i64> @fcvtzs_d_nxv2f64(<vscale x 2 x double> %a) {
277391; FP_TO_UINT
278392;
279393
394+ define <vscale x 2 x i1 > @fcvtzu_nxv2f16_to_nxv2i1 (<vscale x 2 x half > %a ) {
395+ ; CHECK-LABEL: fcvtzu_nxv2f16_to_nxv2i1:
396+ ; CHECK: // %bb.0:
397+ ; CHECK-NEXT: ptrue p0.d
398+ ; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h
399+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
400+ ; CHECK-NEXT: ret
401+ %res = fptoui <vscale x 2 x half > %a to <vscale x 2 x i1 >
402+ ret <vscale x 2 x i1 > %res
403+ }
404+
405+ define <vscale x 2 x i1 > @fcvtzu_nxv2f32_to_nxv2i1 (<vscale x 2 x float > %a ) {
406+ ; CHECK-LABEL: fcvtzu_nxv2f32_to_nxv2i1:
407+ ; CHECK: // %bb.0:
408+ ; CHECK-NEXT: ptrue p0.d
409+ ; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s
410+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
411+ ; CHECK-NEXT: ret
412+ %res = fptoui <vscale x 2 x float > %a to <vscale x 2 x i1 >
413+ ret <vscale x 2 x i1 > %res
414+ }
415+
416+ define <vscale x 2 x i1 > @fcvtzu_nxv2f64_to_nxv2i1 (<vscale x 2 x double > %a ) {
417+ ; CHECK-LABEL: fcvtzu_nxv2f64_to_nxv2i1:
418+ ; CHECK: // %bb.0:
419+ ; CHECK-NEXT: ptrue p0.d
420+ ; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d
421+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
422+ ; CHECK-NEXT: ret
423+ %res = fptoui <vscale x 2 x double > %a to <vscale x 2 x i1 >
424+ ret <vscale x 2 x i1 > %res
425+ }
426+
427+ define <vscale x 4 x i1 > @fcvtzu_nxv4f16_to_nxv4i1 (<vscale x 4 x half > %a ) {
428+ ; CHECK-LABEL: fcvtzu_nxv4f16_to_nxv4i1:
429+ ; CHECK: // %bb.0:
430+ ; CHECK-NEXT: ptrue p0.s
431+ ; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h
432+ ; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0
433+ ; CHECK-NEXT: ret
434+ %res = fptoui <vscale x 4 x half > %a to <vscale x 4 x i1 >
435+ ret <vscale x 4 x i1 > %res
436+ }
437+
438+ define <vscale x 4 x i1 > @fcvtzu_nxv4f32_to_nxv4i1 (<vscale x 4 x float > %a ) {
439+ ; CHECK-LABEL: fcvtzu_nxv4f32_to_nxv4i1:
440+ ; CHECK: // %bb.0:
441+ ; CHECK-NEXT: ptrue p0.s
442+ ; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s
443+ ; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0
444+ ; CHECK-NEXT: ret
445+ %res = fptoui <vscale x 4 x float > %a to <vscale x 4 x i1 >
446+ ret <vscale x 4 x i1 > %res
447+ }
448+
449+ define <vscale x 4 x i1 > @fcvtzu_nxv4f64_to_nxv4i1 (<vscale x 4 x double > %a ) {
450+ ; CHECK-LABEL: fcvtzu_nxv4f64_to_nxv4i1:
451+ ; CHECK: // %bb.0:
452+ ; CHECK-NEXT: ptrue p0.d
453+ ; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.d
454+ ; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d
455+ ; CHECK-NEXT: cmpne p1.d, p0/z, z1.d, #0
456+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
457+ ; CHECK-NEXT: uzp1 p0.s, p0.s, p1.s
458+ ; CHECK-NEXT: ret
459+ %res = fptoui <vscale x 4 x double > %a to <vscale x 4 x i1 >
460+ ret <vscale x 4 x i1 > %res
461+ }
462+
463+ define <vscale x 8 x i1 > @fcvtzu_nxv8f16_to_nxv8i1 (<vscale x 8 x half > %a ) {
464+ ; CHECK-LABEL: fcvtzu_nxv8f16_to_nxv8i1:
465+ ; CHECK: // %bb.0:
466+ ; CHECK-NEXT: ptrue p0.h
467+ ; CHECK-NEXT: fcvtzu z0.h, p0/m, z0.h
468+ ; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #0
469+ ; CHECK-NEXT: ret
470+ %res = fptoui <vscale x 8 x half > %a to <vscale x 8 x i1 >
471+ ret <vscale x 8 x i1 > %res
472+ }
473+
474+ define <vscale x 8 x i1 > @fcvtzu_nxv8f32_to_nxv8i1 (<vscale x 8 x float > %a ) {
475+ ; CHECK-LABEL: fcvtzu_nxv8f32_to_nxv8i1:
476+ ; CHECK: // %bb.0:
477+ ; CHECK-NEXT: ptrue p0.s
478+ ; CHECK-NEXT: fcvtzu z1.s, p0/m, z1.s
479+ ; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s
480+ ; CHECK-NEXT: cmpne p1.s, p0/z, z1.s, #0
481+ ; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0
482+ ; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h
483+ ; CHECK-NEXT: ret
484+ %res = fptoui <vscale x 8 x float > %a to <vscale x 8 x i1 >
485+ ret <vscale x 8 x i1 > %res
486+ }
487+
488+ define <vscale x 8 x i1 > @fcvtzu_nxv8f64_to_nxv8i1 (<vscale x 8 x double > %a ) {
489+ ; CHECK-LABEL: fcvtzu_nxv8f64_to_nxv8i1:
490+ ; CHECK: // %bb.0:
491+ ; CHECK-NEXT: ptrue p0.d
492+ ; CHECK-NEXT: fcvtzu z3.d, p0/m, z3.d
493+ ; CHECK-NEXT: fcvtzu z2.d, p0/m, z2.d
494+ ; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.d
495+ ; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d
496+ ; CHECK-NEXT: cmpne p1.d, p0/z, z3.d, #0
497+ ; CHECK-NEXT: cmpne p2.d, p0/z, z2.d, #0
498+ ; CHECK-NEXT: cmpne p3.d, p0/z, z1.d, #0
499+ ; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0
500+ ; CHECK-NEXT: uzp1 p1.s, p2.s, p1.s
501+ ; CHECK-NEXT: uzp1 p0.s, p0.s, p3.s
502+ ; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h
503+ ; CHECK-NEXT: ret
504+ %res = fptoui <vscale x 8 x double > %a to <vscale x 8 x i1 >
505+ ret <vscale x 8 x i1 > %res
506+ }
507+
280508; NOTE: Using fcvtzs is safe as fptoui overflow is considered poison and a
281509; 64bit signed value encompasses the entire range of a 16bit unsigned value
282510define <vscale x 2 x i16 > @fcvtzu_h_nxv2f16 (<vscale x 2 x half > %a ) {
0 commit comments