1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | \
3 ; RUN: FileCheck %s -check-prefix=RV32
4 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | \
5 ; RUN: FileCheck %s -check-prefix=RV64
7 ; ================================================================================
8 ; trunc <vscale x 1 x float>
9 ; ================================================================================
11 declare <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float>)
13 define <vscale x 1 x i8> @trunc_nxv1f32_to_si8(<vscale x 1 x float> %x) {
14 ; RV32-LABEL: trunc_nxv1f32_to_si8:
16 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
17 ; RV32-NEXT: vfabs.v v9, v8
18 ; RV32-NEXT: lui a0, 307200
19 ; RV32-NEXT: fmv.w.x fa5, a0
20 ; RV32-NEXT: vmflt.vf v0, v9, fa5
21 ; RV32-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
22 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
23 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
24 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
25 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
26 ; RV32-NEXT: vfncvt.rtz.x.f.w v9, v8
27 ; RV32-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
28 ; RV32-NEXT: vnsrl.wi v8, v9, 0
31 ; RV64-LABEL: trunc_nxv1f32_to_si8:
33 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
34 ; RV64-NEXT: vfabs.v v9, v8
35 ; RV64-NEXT: lui a0, 307200
36 ; RV64-NEXT: fmv.w.x fa5, a0
37 ; RV64-NEXT: vmflt.vf v0, v9, fa5
38 ; RV64-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
39 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
40 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
41 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
42 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
43 ; RV64-NEXT: vfncvt.rtz.x.f.w v9, v8
44 ; RV64-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
45 ; RV64-NEXT: vnsrl.wi v8, v9, 0
47 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
48 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i8>
49 ret <vscale x 1 x i8> %b
52 define <vscale x 1 x i8> @trunc_nxv1f32_to_ui8(<vscale x 1 x float> %x) {
53 ; RV32-LABEL: trunc_nxv1f32_to_ui8:
55 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
56 ; RV32-NEXT: vfabs.v v9, v8
57 ; RV32-NEXT: lui a0, 307200
58 ; RV32-NEXT: fmv.w.x fa5, a0
59 ; RV32-NEXT: vmflt.vf v0, v9, fa5
60 ; RV32-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
61 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
62 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
63 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
64 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
65 ; RV32-NEXT: vfncvt.rtz.xu.f.w v9, v8
66 ; RV32-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
67 ; RV32-NEXT: vnsrl.wi v8, v9, 0
70 ; RV64-LABEL: trunc_nxv1f32_to_ui8:
72 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
73 ; RV64-NEXT: vfabs.v v9, v8
74 ; RV64-NEXT: lui a0, 307200
75 ; RV64-NEXT: fmv.w.x fa5, a0
76 ; RV64-NEXT: vmflt.vf v0, v9, fa5
77 ; RV64-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
78 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
79 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
80 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
81 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
82 ; RV64-NEXT: vfncvt.rtz.xu.f.w v9, v8
83 ; RV64-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
84 ; RV64-NEXT: vnsrl.wi v8, v9, 0
86 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
87 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i8>
88 ret <vscale x 1 x i8> %b
91 define <vscale x 1 x i16> @trunc_nxv1f32_to_si16(<vscale x 1 x float> %x) {
92 ; RV32-LABEL: trunc_nxv1f32_to_si16:
94 ; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
95 ; RV32-NEXT: vfncvt.rtz.x.f.w v9, v8
96 ; RV32-NEXT: vmv1r.v v8, v9
99 ; RV64-LABEL: trunc_nxv1f32_to_si16:
101 ; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
102 ; RV64-NEXT: vfncvt.rtz.x.f.w v9, v8
103 ; RV64-NEXT: vmv1r.v v8, v9
105 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
106 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i16>
107 ret <vscale x 1 x i16> %b
110 define <vscale x 1 x i16> @trunc_nxv1f32_to_ui16(<vscale x 1 x float> %x) {
111 ; RV32-LABEL: trunc_nxv1f32_to_ui16:
113 ; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
114 ; RV32-NEXT: vfncvt.rtz.xu.f.w v9, v8
115 ; RV32-NEXT: vmv1r.v v8, v9
118 ; RV64-LABEL: trunc_nxv1f32_to_ui16:
120 ; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
121 ; RV64-NEXT: vfncvt.rtz.xu.f.w v9, v8
122 ; RV64-NEXT: vmv1r.v v8, v9
124 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
125 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i16>
126 ret <vscale x 1 x i16> %b
129 define <vscale x 1 x i32> @trunc_nxv1f32_to_si32(<vscale x 1 x float> %x) {
130 ; RV32-LABEL: trunc_nxv1f32_to_si32:
132 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
133 ; RV32-NEXT: vfcvt.rtz.x.f.v v8, v8
136 ; RV64-LABEL: trunc_nxv1f32_to_si32:
138 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
139 ; RV64-NEXT: vfcvt.rtz.x.f.v v8, v8
141 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
142 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i32>
143 ret <vscale x 1 x i32> %b
146 define <vscale x 1 x i32> @trunc_nxv1f32_to_ui32(<vscale x 1 x float> %x) {
147 ; RV32-LABEL: trunc_nxv1f32_to_ui32:
149 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
150 ; RV32-NEXT: vfcvt.rtz.xu.f.v v8, v8
153 ; RV64-LABEL: trunc_nxv1f32_to_ui32:
155 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
156 ; RV64-NEXT: vfcvt.rtz.xu.f.v v8, v8
158 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
159 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i32>
160 ret <vscale x 1 x i32> %b
163 define <vscale x 1 x i64> @trunc_nxv1f32_to_si64(<vscale x 1 x float> %x) {
164 ; RV32-LABEL: trunc_nxv1f32_to_si64:
166 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
167 ; RV32-NEXT: vfwcvt.rtz.x.f.v v9, v8
168 ; RV32-NEXT: vmv1r.v v8, v9
171 ; RV64-LABEL: trunc_nxv1f32_to_si64:
173 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
174 ; RV64-NEXT: vfwcvt.rtz.x.f.v v9, v8
175 ; RV64-NEXT: vmv1r.v v8, v9
177 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
178 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i64>
179 ret <vscale x 1 x i64> %b
182 define <vscale x 1 x i64> @trunc_nxv1f32_to_ui64(<vscale x 1 x float> %x) {
183 ; RV32-LABEL: trunc_nxv1f32_to_ui64:
185 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
186 ; RV32-NEXT: vfwcvt.rtz.xu.f.v v9, v8
187 ; RV32-NEXT: vmv1r.v v8, v9
190 ; RV64-LABEL: trunc_nxv1f32_to_ui64:
192 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
193 ; RV64-NEXT: vfwcvt.rtz.xu.f.v v9, v8
194 ; RV64-NEXT: vmv1r.v v8, v9
196 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x)
197 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i64>
198 ret <vscale x 1 x i64> %b
201 ; ================================================================================
202 ; trunc <vscale x 4 x float>
203 ; ================================================================================
205 declare <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float>)
207 define <vscale x 4 x i8> @trunc_nxv4f32_to_si8(<vscale x 4 x float> %x) {
208 ; RV32-LABEL: trunc_nxv4f32_to_si8:
210 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
211 ; RV32-NEXT: vfabs.v v10, v8
212 ; RV32-NEXT: lui a0, 307200
213 ; RV32-NEXT: fmv.w.x fa5, a0
214 ; RV32-NEXT: vmflt.vf v0, v10, fa5
215 ; RV32-NEXT: vfcvt.rtz.x.f.v v10, v8, v0.t
216 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
217 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
218 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
219 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
220 ; RV32-NEXT: vfncvt.rtz.x.f.w v10, v8
221 ; RV32-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
222 ; RV32-NEXT: vnsrl.wi v8, v10, 0
225 ; RV64-LABEL: trunc_nxv4f32_to_si8:
227 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
228 ; RV64-NEXT: vfabs.v v10, v8
229 ; RV64-NEXT: lui a0, 307200
230 ; RV64-NEXT: fmv.w.x fa5, a0
231 ; RV64-NEXT: vmflt.vf v0, v10, fa5
232 ; RV64-NEXT: vfcvt.rtz.x.f.v v10, v8, v0.t
233 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
234 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
235 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
236 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
237 ; RV64-NEXT: vfncvt.rtz.x.f.w v10, v8
238 ; RV64-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
239 ; RV64-NEXT: vnsrl.wi v8, v10, 0
241 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
242 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i8>
243 ret <vscale x 4 x i8> %b
246 define <vscale x 4 x i8> @trunc_nxv4f32_to_ui8(<vscale x 4 x float> %x) {
247 ; RV32-LABEL: trunc_nxv4f32_to_ui8:
249 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
250 ; RV32-NEXT: vfabs.v v10, v8
251 ; RV32-NEXT: lui a0, 307200
252 ; RV32-NEXT: fmv.w.x fa5, a0
253 ; RV32-NEXT: vmflt.vf v0, v10, fa5
254 ; RV32-NEXT: vfcvt.rtz.x.f.v v10, v8, v0.t
255 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
256 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
257 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
258 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
259 ; RV32-NEXT: vfncvt.rtz.xu.f.w v10, v8
260 ; RV32-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
261 ; RV32-NEXT: vnsrl.wi v8, v10, 0
264 ; RV64-LABEL: trunc_nxv4f32_to_ui8:
266 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
267 ; RV64-NEXT: vfabs.v v10, v8
268 ; RV64-NEXT: lui a0, 307200
269 ; RV64-NEXT: fmv.w.x fa5, a0
270 ; RV64-NEXT: vmflt.vf v0, v10, fa5
271 ; RV64-NEXT: vfcvt.rtz.x.f.v v10, v8, v0.t
272 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
273 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
274 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
275 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
276 ; RV64-NEXT: vfncvt.rtz.xu.f.w v10, v8
277 ; RV64-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
278 ; RV64-NEXT: vnsrl.wi v8, v10, 0
280 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
281 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i8>
282 ret <vscale x 4 x i8> %b
285 define <vscale x 4 x i16> @trunc_nxv4f32_to_si16(<vscale x 4 x float> %x) {
286 ; RV32-LABEL: trunc_nxv4f32_to_si16:
288 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
289 ; RV32-NEXT: vfncvt.rtz.x.f.w v10, v8
290 ; RV32-NEXT: vmv.v.v v8, v10
293 ; RV64-LABEL: trunc_nxv4f32_to_si16:
295 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
296 ; RV64-NEXT: vfncvt.rtz.x.f.w v10, v8
297 ; RV64-NEXT: vmv.v.v v8, v10
299 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
300 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i16>
301 ret <vscale x 4 x i16> %b
304 define <vscale x 4 x i16> @trunc_nxv4f32_to_ui16(<vscale x 4 x float> %x) {
305 ; RV32-LABEL: trunc_nxv4f32_to_ui16:
307 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
308 ; RV32-NEXT: vfncvt.rtz.xu.f.w v10, v8
309 ; RV32-NEXT: vmv.v.v v8, v10
312 ; RV64-LABEL: trunc_nxv4f32_to_ui16:
314 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
315 ; RV64-NEXT: vfncvt.rtz.xu.f.w v10, v8
316 ; RV64-NEXT: vmv.v.v v8, v10
318 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
319 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i16>
320 ret <vscale x 4 x i16> %b
323 define <vscale x 4 x i32> @trunc_nxv4f32_to_si32(<vscale x 4 x float> %x) {
324 ; RV32-LABEL: trunc_nxv4f32_to_si32:
326 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
327 ; RV32-NEXT: vfcvt.rtz.x.f.v v8, v8
330 ; RV64-LABEL: trunc_nxv4f32_to_si32:
332 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
333 ; RV64-NEXT: vfcvt.rtz.x.f.v v8, v8
335 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
336 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i32>
337 ret <vscale x 4 x i32> %b
340 define <vscale x 4 x i32> @trunc_nxv4f32_to_ui32(<vscale x 4 x float> %x) {
341 ; RV32-LABEL: trunc_nxv4f32_to_ui32:
343 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
344 ; RV32-NEXT: vfcvt.rtz.xu.f.v v8, v8
347 ; RV64-LABEL: trunc_nxv4f32_to_ui32:
349 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
350 ; RV64-NEXT: vfcvt.rtz.xu.f.v v8, v8
352 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
353 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i32>
354 ret <vscale x 4 x i32> %b
357 define <vscale x 4 x i64> @trunc_nxv4f32_to_si64(<vscale x 4 x float> %x) {
358 ; RV32-LABEL: trunc_nxv4f32_to_si64:
360 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
361 ; RV32-NEXT: vfwcvt.rtz.x.f.v v12, v8
362 ; RV32-NEXT: vmv4r.v v8, v12
365 ; RV64-LABEL: trunc_nxv4f32_to_si64:
367 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
368 ; RV64-NEXT: vfwcvt.rtz.x.f.v v12, v8
369 ; RV64-NEXT: vmv4r.v v8, v12
371 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
372 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i64>
373 ret <vscale x 4 x i64> %b
376 define <vscale x 4 x i64> @trunc_nxv4f32_to_ui64(<vscale x 4 x float> %x) {
377 ; RV32-LABEL: trunc_nxv4f32_to_ui64:
379 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
380 ; RV32-NEXT: vfwcvt.rtz.xu.f.v v12, v8
381 ; RV32-NEXT: vmv4r.v v8, v12
384 ; RV64-LABEL: trunc_nxv4f32_to_ui64:
386 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
387 ; RV64-NEXT: vfwcvt.rtz.xu.f.v v12, v8
388 ; RV64-NEXT: vmv4r.v v8, v12
390 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x)
391 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i64>
392 ret <vscale x 4 x i64> %b
395 ; ================================================================================
396 ; ceil <vscale x 1 x float>
397 ; ================================================================================
399 declare <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float>)
401 define <vscale x 1 x i8> @ceil_nxv1f32_to_si8(<vscale x 1 x float> %x) {
402 ; RV32-LABEL: ceil_nxv1f32_to_si8:
404 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
405 ; RV32-NEXT: vfabs.v v9, v8
406 ; RV32-NEXT: lui a0, 307200
407 ; RV32-NEXT: fmv.w.x fa5, a0
408 ; RV32-NEXT: vmflt.vf v0, v9, fa5
409 ; RV32-NEXT: fsrmi a0, 3
410 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
412 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
413 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
414 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
415 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
416 ; RV32-NEXT: vfncvt.rtz.x.f.w v9, v8
417 ; RV32-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
418 ; RV32-NEXT: vnsrl.wi v8, v9, 0
421 ; RV64-LABEL: ceil_nxv1f32_to_si8:
423 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
424 ; RV64-NEXT: vfabs.v v9, v8
425 ; RV64-NEXT: lui a0, 307200
426 ; RV64-NEXT: fmv.w.x fa5, a0
427 ; RV64-NEXT: vmflt.vf v0, v9, fa5
428 ; RV64-NEXT: fsrmi a0, 3
429 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
431 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
432 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
433 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
434 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
435 ; RV64-NEXT: vfncvt.rtz.x.f.w v9, v8
436 ; RV64-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
437 ; RV64-NEXT: vnsrl.wi v8, v9, 0
439 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
440 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i8>
441 ret <vscale x 1 x i8> %b
444 define <vscale x 1 x i8> @ceil_nxv1f32_to_ui8(<vscale x 1 x float> %x) {
445 ; RV32-LABEL: ceil_nxv1f32_to_ui8:
447 ; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
448 ; RV32-NEXT: vfabs.v v9, v8
449 ; RV32-NEXT: lui a0, 307200
450 ; RV32-NEXT: fmv.w.x fa5, a0
451 ; RV32-NEXT: vmflt.vf v0, v9, fa5
452 ; RV32-NEXT: fsrmi a0, 3
453 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
455 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
456 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
457 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
458 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
459 ; RV32-NEXT: vfncvt.rtz.xu.f.w v9, v8
460 ; RV32-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
461 ; RV32-NEXT: vnsrl.wi v8, v9, 0
464 ; RV64-LABEL: ceil_nxv1f32_to_ui8:
466 ; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
467 ; RV64-NEXT: vfabs.v v9, v8
468 ; RV64-NEXT: lui a0, 307200
469 ; RV64-NEXT: fmv.w.x fa5, a0
470 ; RV64-NEXT: vmflt.vf v0, v9, fa5
471 ; RV64-NEXT: fsrmi a0, 3
472 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
474 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
475 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, mu
476 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
477 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
478 ; RV64-NEXT: vfncvt.rtz.xu.f.w v9, v8
479 ; RV64-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
480 ; RV64-NEXT: vnsrl.wi v8, v9, 0
482 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
483 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i8>
484 ret <vscale x 1 x i8> %b
487 define <vscale x 1 x i16> @ceil_nxv1f32_to_si16(<vscale x 1 x float> %x) {
488 ; RV32-LABEL: ceil_nxv1f32_to_si16:
490 ; RV32-NEXT: fsrmi a0, 3
491 ; RV32-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
492 ; RV32-NEXT: vfncvt.x.f.w v9, v8
494 ; RV32-NEXT: vmv1r.v v8, v9
497 ; RV64-LABEL: ceil_nxv1f32_to_si16:
499 ; RV64-NEXT: fsrmi a0, 3
500 ; RV64-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
501 ; RV64-NEXT: vfncvt.x.f.w v9, v8
503 ; RV64-NEXT: vmv1r.v v8, v9
505 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
506 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i16>
507 ret <vscale x 1 x i16> %b
510 define <vscale x 1 x i16> @ceil_nxv1f32_to_ui16(<vscale x 1 x float> %x) {
511 ; RV32-LABEL: ceil_nxv1f32_to_ui16:
513 ; RV32-NEXT: fsrmi a0, 3
514 ; RV32-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
515 ; RV32-NEXT: vfncvt.xu.f.w v9, v8
517 ; RV32-NEXT: vmv1r.v v8, v9
520 ; RV64-LABEL: ceil_nxv1f32_to_ui16:
522 ; RV64-NEXT: fsrmi a0, 3
523 ; RV64-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
524 ; RV64-NEXT: vfncvt.xu.f.w v9, v8
526 ; RV64-NEXT: vmv1r.v v8, v9
528 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
529 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i16>
530 ret <vscale x 1 x i16> %b
533 define <vscale x 1 x i32> @ceil_nxv1f32_to_si32(<vscale x 1 x float> %x) {
534 ; RV32-LABEL: ceil_nxv1f32_to_si32:
536 ; RV32-NEXT: fsrmi a0, 3
537 ; RV32-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
538 ; RV32-NEXT: vfcvt.x.f.v v8, v8
542 ; RV64-LABEL: ceil_nxv1f32_to_si32:
544 ; RV64-NEXT: fsrmi a0, 3
545 ; RV64-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
546 ; RV64-NEXT: vfcvt.x.f.v v8, v8
549 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
550 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i32>
551 ret <vscale x 1 x i32> %b
554 define <vscale x 1 x i32> @ceil_nxv1f32_to_ui32(<vscale x 1 x float> %x) {
555 ; RV32-LABEL: ceil_nxv1f32_to_ui32:
557 ; RV32-NEXT: fsrmi a0, 3
558 ; RV32-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
559 ; RV32-NEXT: vfcvt.xu.f.v v8, v8
563 ; RV64-LABEL: ceil_nxv1f32_to_ui32:
565 ; RV64-NEXT: fsrmi a0, 3
566 ; RV64-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
567 ; RV64-NEXT: vfcvt.xu.f.v v8, v8
570 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
571 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i32>
572 ret <vscale x 1 x i32> %b
575 define <vscale x 1 x i64> @ceil_nxv1f32_to_si64(<vscale x 1 x float> %x) {
576 ; RV32-LABEL: ceil_nxv1f32_to_si64:
578 ; RV32-NEXT: fsrmi a0, 3
579 ; RV32-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
580 ; RV32-NEXT: vfwcvt.x.f.v v9, v8
582 ; RV32-NEXT: vmv1r.v v8, v9
585 ; RV64-LABEL: ceil_nxv1f32_to_si64:
587 ; RV64-NEXT: fsrmi a0, 3
588 ; RV64-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
589 ; RV64-NEXT: vfwcvt.x.f.v v9, v8
591 ; RV64-NEXT: vmv1r.v v8, v9
593 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
594 %b = fptosi <vscale x 1 x float> %a to <vscale x 1 x i64>
595 ret <vscale x 1 x i64> %b
598 define <vscale x 1 x i64> @ceil_nxv1f32_to_ui64(<vscale x 1 x float> %x) {
599 ; RV32-LABEL: ceil_nxv1f32_to_ui64:
601 ; RV32-NEXT: fsrmi a0, 3
602 ; RV32-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
603 ; RV32-NEXT: vfwcvt.xu.f.v v9, v8
605 ; RV32-NEXT: vmv1r.v v8, v9
608 ; RV64-LABEL: ceil_nxv1f32_to_ui64:
610 ; RV64-NEXT: fsrmi a0, 3
611 ; RV64-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
612 ; RV64-NEXT: vfwcvt.xu.f.v v9, v8
614 ; RV64-NEXT: vmv1r.v v8, v9
616 %a = call <vscale x 1 x float> @llvm.ceil.nxv1f32(<vscale x 1 x float> %x)
617 %b = fptoui <vscale x 1 x float> %a to <vscale x 1 x i64>
618 ret <vscale x 1 x i64> %b
621 ; ================================================================================
622 ; ceil <vscale x 4 x float>
623 ; ================================================================================
625 declare <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float>)
627 define <vscale x 4 x i8> @ceil_nxv4f32_to_si8(<vscale x 4 x float> %x) {
628 ; RV32-LABEL: ceil_nxv4f32_to_si8:
630 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
631 ; RV32-NEXT: vfabs.v v10, v8
632 ; RV32-NEXT: lui a0, 307200
633 ; RV32-NEXT: fmv.w.x fa5, a0
634 ; RV32-NEXT: vmflt.vf v0, v10, fa5
635 ; RV32-NEXT: fsrmi a0, 3
636 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
638 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
639 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
640 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
641 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
642 ; RV32-NEXT: vfncvt.rtz.x.f.w v10, v8
643 ; RV32-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
644 ; RV32-NEXT: vnsrl.wi v8, v10, 0
647 ; RV64-LABEL: ceil_nxv4f32_to_si8:
649 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
650 ; RV64-NEXT: vfabs.v v10, v8
651 ; RV64-NEXT: lui a0, 307200
652 ; RV64-NEXT: fmv.w.x fa5, a0
653 ; RV64-NEXT: vmflt.vf v0, v10, fa5
654 ; RV64-NEXT: fsrmi a0, 3
655 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
657 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
658 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
659 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
660 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
661 ; RV64-NEXT: vfncvt.rtz.x.f.w v10, v8
662 ; RV64-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
663 ; RV64-NEXT: vnsrl.wi v8, v10, 0
665 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
666 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i8>
667 ret <vscale x 4 x i8> %b
670 define <vscale x 4 x i8> @ceil_nxv4f32_to_ui8(<vscale x 4 x float> %x) {
671 ; RV32-LABEL: ceil_nxv4f32_to_ui8:
673 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
674 ; RV32-NEXT: vfabs.v v10, v8
675 ; RV32-NEXT: lui a0, 307200
676 ; RV32-NEXT: fmv.w.x fa5, a0
677 ; RV32-NEXT: vmflt.vf v0, v10, fa5
678 ; RV32-NEXT: fsrmi a0, 3
679 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
681 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
682 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
683 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
684 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
685 ; RV32-NEXT: vfncvt.rtz.xu.f.w v10, v8
686 ; RV32-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
687 ; RV32-NEXT: vnsrl.wi v8, v10, 0
690 ; RV64-LABEL: ceil_nxv4f32_to_ui8:
692 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
693 ; RV64-NEXT: vfabs.v v10, v8
694 ; RV64-NEXT: lui a0, 307200
695 ; RV64-NEXT: fmv.w.x fa5, a0
696 ; RV64-NEXT: vmflt.vf v0, v10, fa5
697 ; RV64-NEXT: fsrmi a0, 3
698 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
700 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
701 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
702 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
703 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
704 ; RV64-NEXT: vfncvt.rtz.xu.f.w v10, v8
705 ; RV64-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
706 ; RV64-NEXT: vnsrl.wi v8, v10, 0
708 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
709 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i8>
710 ret <vscale x 4 x i8> %b
713 define <vscale x 4 x i16> @ceil_nxv4f32_to_si16(<vscale x 4 x float> %x) {
714 ; RV32-LABEL: ceil_nxv4f32_to_si16:
716 ; RV32-NEXT: fsrmi a0, 3
717 ; RV32-NEXT: vsetvli a1, zero, e16, m1, ta, ma
718 ; RV32-NEXT: vfncvt.x.f.w v10, v8
720 ; RV32-NEXT: vmv.v.v v8, v10
723 ; RV64-LABEL: ceil_nxv4f32_to_si16:
725 ; RV64-NEXT: fsrmi a0, 3
726 ; RV64-NEXT: vsetvli a1, zero, e16, m1, ta, ma
727 ; RV64-NEXT: vfncvt.x.f.w v10, v8
729 ; RV64-NEXT: vmv.v.v v8, v10
731 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
732 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i16>
733 ret <vscale x 4 x i16> %b
736 define <vscale x 4 x i16> @ceil_nxv4f32_to_ui16(<vscale x 4 x float> %x) {
737 ; RV32-LABEL: ceil_nxv4f32_to_ui16:
739 ; RV32-NEXT: fsrmi a0, 3
740 ; RV32-NEXT: vsetvli a1, zero, e16, m1, ta, ma
741 ; RV32-NEXT: vfncvt.xu.f.w v10, v8
743 ; RV32-NEXT: vmv.v.v v8, v10
746 ; RV64-LABEL: ceil_nxv4f32_to_ui16:
748 ; RV64-NEXT: fsrmi a0, 3
749 ; RV64-NEXT: vsetvli a1, zero, e16, m1, ta, ma
750 ; RV64-NEXT: vfncvt.xu.f.w v10, v8
752 ; RV64-NEXT: vmv.v.v v8, v10
754 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
755 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i16>
756 ret <vscale x 4 x i16> %b
759 define <vscale x 4 x i32> @ceil_nxv4f32_to_si32(<vscale x 4 x float> %x) {
760 ; RV32-LABEL: ceil_nxv4f32_to_si32:
762 ; RV32-NEXT: fsrmi a0, 3
763 ; RV32-NEXT: vsetvli a1, zero, e32, m2, ta, ma
764 ; RV32-NEXT: vfcvt.x.f.v v8, v8
768 ; RV64-LABEL: ceil_nxv4f32_to_si32:
770 ; RV64-NEXT: fsrmi a0, 3
771 ; RV64-NEXT: vsetvli a1, zero, e32, m2, ta, ma
772 ; RV64-NEXT: vfcvt.x.f.v v8, v8
775 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
776 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i32>
777 ret <vscale x 4 x i32> %b
780 define <vscale x 4 x i32> @ceil_nxv4f32_to_ui32(<vscale x 4 x float> %x) {
781 ; RV32-LABEL: ceil_nxv4f32_to_ui32:
783 ; RV32-NEXT: fsrmi a0, 3
784 ; RV32-NEXT: vsetvli a1, zero, e32, m2, ta, ma
785 ; RV32-NEXT: vfcvt.xu.f.v v8, v8
789 ; RV64-LABEL: ceil_nxv4f32_to_ui32:
791 ; RV64-NEXT: fsrmi a0, 3
792 ; RV64-NEXT: vsetvli a1, zero, e32, m2, ta, ma
793 ; RV64-NEXT: vfcvt.xu.f.v v8, v8
796 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
797 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i32>
798 ret <vscale x 4 x i32> %b
801 define <vscale x 4 x i64> @ceil_nxv4f32_to_si64(<vscale x 4 x float> %x) {
802 ; RV32-LABEL: ceil_nxv4f32_to_si64:
804 ; RV32-NEXT: fsrmi a0, 3
805 ; RV32-NEXT: vsetvli a1, zero, e32, m2, ta, ma
806 ; RV32-NEXT: vfwcvt.x.f.v v12, v8
808 ; RV32-NEXT: vmv4r.v v8, v12
811 ; RV64-LABEL: ceil_nxv4f32_to_si64:
813 ; RV64-NEXT: fsrmi a0, 3
814 ; RV64-NEXT: vsetvli a1, zero, e32, m2, ta, ma
815 ; RV64-NEXT: vfwcvt.x.f.v v12, v8
817 ; RV64-NEXT: vmv4r.v v8, v12
819 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
820 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i64>
821 ret <vscale x 4 x i64> %b
824 define <vscale x 4 x i64> @ceil_nxv4f32_to_ui64(<vscale x 4 x float> %x) {
825 ; RV32-LABEL: ceil_nxv4f32_to_ui64:
827 ; RV32-NEXT: fsrmi a0, 3
828 ; RV32-NEXT: vsetvli a1, zero, e32, m2, ta, ma
829 ; RV32-NEXT: vfwcvt.xu.f.v v12, v8
831 ; RV32-NEXT: vmv4r.v v8, v12
834 ; RV64-LABEL: ceil_nxv4f32_to_ui64:
836 ; RV64-NEXT: fsrmi a0, 3
837 ; RV64-NEXT: vsetvli a1, zero, e32, m2, ta, ma
838 ; RV64-NEXT: vfwcvt.xu.f.v v12, v8
840 ; RV64-NEXT: vmv4r.v v8, v12
842 %a = call <vscale x 4 x float> @llvm.ceil.nxv4f32(<vscale x 4 x float> %x)
843 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i64>
844 ret <vscale x 4 x i64> %b
847 ; ================================================================================
848 ; rint <vscale x 4 x float>
849 ; ================================================================================
851 declare <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float>)
853 define <vscale x 4 x i8> @rint_nxv4f32_to_si8(<vscale x 4 x float> %x) {
854 ; RV32-LABEL: rint_nxv4f32_to_si8:
856 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
857 ; RV32-NEXT: vfabs.v v10, v8
858 ; RV32-NEXT: lui a0, 307200
859 ; RV32-NEXT: fmv.w.x fa5, a0
860 ; RV32-NEXT: vmflt.vf v0, v10, fa5
861 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
862 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
863 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
864 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
865 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
866 ; RV32-NEXT: vfncvt.rtz.x.f.w v10, v8
867 ; RV32-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
868 ; RV32-NEXT: vnsrl.wi v8, v10, 0
871 ; RV64-LABEL: rint_nxv4f32_to_si8:
873 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
874 ; RV64-NEXT: vfabs.v v10, v8
875 ; RV64-NEXT: lui a0, 307200
876 ; RV64-NEXT: fmv.w.x fa5, a0
877 ; RV64-NEXT: vmflt.vf v0, v10, fa5
878 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
879 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
880 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
881 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
882 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
883 ; RV64-NEXT: vfncvt.rtz.x.f.w v10, v8
884 ; RV64-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
885 ; RV64-NEXT: vnsrl.wi v8, v10, 0
887 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
888 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i8>
889 ret <vscale x 4 x i8> %b
892 define <vscale x 4 x i8> @rint_nxv4f32_to_ui8(<vscale x 4 x float> %x) {
893 ; RV32-LABEL: rint_nxv4f32_to_ui8:
895 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
896 ; RV32-NEXT: vfabs.v v10, v8
897 ; RV32-NEXT: lui a0, 307200
898 ; RV32-NEXT: fmv.w.x fa5, a0
899 ; RV32-NEXT: vmflt.vf v0, v10, fa5
900 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
901 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
902 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
903 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
904 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
905 ; RV32-NEXT: vfncvt.rtz.xu.f.w v10, v8
906 ; RV32-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
907 ; RV32-NEXT: vnsrl.wi v8, v10, 0
910 ; RV64-LABEL: rint_nxv4f32_to_ui8:
912 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
913 ; RV64-NEXT: vfabs.v v10, v8
914 ; RV64-NEXT: lui a0, 307200
915 ; RV64-NEXT: fmv.w.x fa5, a0
916 ; RV64-NEXT: vmflt.vf v0, v10, fa5
917 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
918 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
919 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
920 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
921 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
922 ; RV64-NEXT: vfncvt.rtz.xu.f.w v10, v8
923 ; RV64-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
924 ; RV64-NEXT: vnsrl.wi v8, v10, 0
926 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
927 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i8>
928 ret <vscale x 4 x i8> %b
931 define <vscale x 4 x i16> @rint_nxv4f32_to_si16(<vscale x 4 x float> %x) {
932 ; RV32-LABEL: rint_nxv4f32_to_si16:
934 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
935 ; RV32-NEXT: vfncvt.x.f.w v10, v8
936 ; RV32-NEXT: vmv.v.v v8, v10
939 ; RV64-LABEL: rint_nxv4f32_to_si16:
941 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
942 ; RV64-NEXT: vfncvt.x.f.w v10, v8
943 ; RV64-NEXT: vmv.v.v v8, v10
945 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
946 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i16>
947 ret <vscale x 4 x i16> %b
950 define <vscale x 4 x i16> @rint_nxv4f32_to_ui16(<vscale x 4 x float> %x) {
951 ; RV32-LABEL: rint_nxv4f32_to_ui16:
953 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
954 ; RV32-NEXT: vfncvt.xu.f.w v10, v8
955 ; RV32-NEXT: vmv.v.v v8, v10
958 ; RV64-LABEL: rint_nxv4f32_to_ui16:
960 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
961 ; RV64-NEXT: vfncvt.xu.f.w v10, v8
962 ; RV64-NEXT: vmv.v.v v8, v10
964 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
965 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i16>
966 ret <vscale x 4 x i16> %b
969 define <vscale x 4 x i32> @rint_nxv4f32_to_si32(<vscale x 4 x float> %x) {
970 ; RV32-LABEL: rint_nxv4f32_to_si32:
972 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
973 ; RV32-NEXT: vfcvt.x.f.v v8, v8
976 ; RV64-LABEL: rint_nxv4f32_to_si32:
978 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
979 ; RV64-NEXT: vfcvt.x.f.v v8, v8
981 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
982 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i32>
983 ret <vscale x 4 x i32> %b
986 define <vscale x 4 x i32> @rint_nxv4f32_to_ui32(<vscale x 4 x float> %x) {
987 ; RV32-LABEL: rint_nxv4f32_to_ui32:
989 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
990 ; RV32-NEXT: vfcvt.xu.f.v v8, v8
993 ; RV64-LABEL: rint_nxv4f32_to_ui32:
995 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
996 ; RV64-NEXT: vfcvt.xu.f.v v8, v8
998 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
999 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i32>
1000 ret <vscale x 4 x i32> %b
1003 define <vscale x 4 x i64> @rint_nxv4f32_to_si64(<vscale x 4 x float> %x) {
1004 ; RV32-LABEL: rint_nxv4f32_to_si64:
1006 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1007 ; RV32-NEXT: vfwcvt.x.f.v v12, v8
1008 ; RV32-NEXT: vmv4r.v v8, v12
1011 ; RV64-LABEL: rint_nxv4f32_to_si64:
1013 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1014 ; RV64-NEXT: vfwcvt.x.f.v v12, v8
1015 ; RV64-NEXT: vmv4r.v v8, v12
1017 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
1018 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i64>
1019 ret <vscale x 4 x i64> %b
1022 define <vscale x 4 x i64> @rint_nxv4f32_to_ui64(<vscale x 4 x float> %x) {
1023 ; RV32-LABEL: rint_nxv4f32_to_ui64:
1025 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1026 ; RV32-NEXT: vfwcvt.xu.f.v v12, v8
1027 ; RV32-NEXT: vmv4r.v v8, v12
1030 ; RV64-LABEL: rint_nxv4f32_to_ui64:
1032 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1033 ; RV64-NEXT: vfwcvt.xu.f.v v12, v8
1034 ; RV64-NEXT: vmv4r.v v8, v12
1036 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
1037 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i64>
1038 ret <vscale x 4 x i64> %b