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, e32, m2, ta, ma
935 ; RV32-NEXT: vfabs.v v10, v8
936 ; RV32-NEXT: lui a0, 307200
937 ; RV32-NEXT: fmv.w.x fa5, a0
938 ; RV32-NEXT: vmflt.vf v0, v10, fa5
939 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
940 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
941 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
942 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
943 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
944 ; RV32-NEXT: vfncvt.rtz.x.f.w v10, v8
945 ; RV32-NEXT: vmv.v.v v8, v10
948 ; RV64-LABEL: rint_nxv4f32_to_si16:
950 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
951 ; RV64-NEXT: vfabs.v v10, v8
952 ; RV64-NEXT: lui a0, 307200
953 ; RV64-NEXT: fmv.w.x fa5, a0
954 ; RV64-NEXT: vmflt.vf v0, v10, fa5
955 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
956 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
957 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
958 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
959 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
960 ; RV64-NEXT: vfncvt.rtz.x.f.w v10, v8
961 ; RV64-NEXT: vmv.v.v v8, v10
963 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
964 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i16>
965 ret <vscale x 4 x i16> %b
968 define <vscale x 4 x i16> @rint_nxv4f32_to_ui16(<vscale x 4 x float> %x) {
969 ; RV32-LABEL: rint_nxv4f32_to_ui16:
971 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
972 ; RV32-NEXT: vfabs.v v10, v8
973 ; RV32-NEXT: lui a0, 307200
974 ; RV32-NEXT: fmv.w.x fa5, a0
975 ; RV32-NEXT: vmflt.vf v0, v10, fa5
976 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
977 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
978 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
979 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
980 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, ma
981 ; RV32-NEXT: vfncvt.rtz.xu.f.w v10, v8
982 ; RV32-NEXT: vmv.v.v v8, v10
985 ; RV64-LABEL: rint_nxv4f32_to_ui16:
987 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
988 ; RV64-NEXT: vfabs.v v10, v8
989 ; RV64-NEXT: lui a0, 307200
990 ; RV64-NEXT: fmv.w.x fa5, a0
991 ; RV64-NEXT: vmflt.vf v0, v10, fa5
992 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
993 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
994 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
995 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
996 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, ma
997 ; RV64-NEXT: vfncvt.rtz.xu.f.w v10, v8
998 ; RV64-NEXT: vmv.v.v v8, v10
1000 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
1001 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i16>
1002 ret <vscale x 4 x i16> %b
1005 define <vscale x 4 x i32> @rint_nxv4f32_to_si32(<vscale x 4 x float> %x) {
1006 ; RV32-LABEL: rint_nxv4f32_to_si32:
1008 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1009 ; RV32-NEXT: vfabs.v v10, v8
1010 ; RV32-NEXT: lui a0, 307200
1011 ; RV32-NEXT: fmv.w.x fa5, a0
1012 ; RV32-NEXT: vmflt.vf v0, v10, fa5
1013 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
1014 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
1015 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1016 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1017 ; RV32-NEXT: vfcvt.rtz.x.f.v v8, v8
1020 ; RV64-LABEL: rint_nxv4f32_to_si32:
1022 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1023 ; RV64-NEXT: vfabs.v v10, v8
1024 ; RV64-NEXT: lui a0, 307200
1025 ; RV64-NEXT: fmv.w.x fa5, a0
1026 ; RV64-NEXT: vmflt.vf v0, v10, fa5
1027 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
1028 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
1029 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1030 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1031 ; RV64-NEXT: vfcvt.rtz.x.f.v v8, v8
1033 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
1034 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i32>
1035 ret <vscale x 4 x i32> %b
1038 define <vscale x 4 x i32> @rint_nxv4f32_to_ui32(<vscale x 4 x float> %x) {
1039 ; RV32-LABEL: rint_nxv4f32_to_ui32:
1041 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1042 ; RV32-NEXT: vfabs.v v10, v8
1043 ; RV32-NEXT: lui a0, 307200
1044 ; RV32-NEXT: fmv.w.x fa5, a0
1045 ; RV32-NEXT: vmflt.vf v0, v10, fa5
1046 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
1047 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
1048 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1049 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1050 ; RV32-NEXT: vfcvt.rtz.xu.f.v v8, v8
1053 ; RV64-LABEL: rint_nxv4f32_to_ui32:
1055 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1056 ; RV64-NEXT: vfabs.v v10, v8
1057 ; RV64-NEXT: lui a0, 307200
1058 ; RV64-NEXT: fmv.w.x fa5, a0
1059 ; RV64-NEXT: vmflt.vf v0, v10, fa5
1060 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
1061 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
1062 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1063 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1064 ; RV64-NEXT: vfcvt.rtz.xu.f.v v8, v8
1066 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
1067 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i32>
1068 ret <vscale x 4 x i32> %b
1071 define <vscale x 4 x i64> @rint_nxv4f32_to_si64(<vscale x 4 x float> %x) {
1072 ; RV32-LABEL: rint_nxv4f32_to_si64:
1074 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1075 ; RV32-NEXT: vfabs.v v10, v8
1076 ; RV32-NEXT: lui a0, 307200
1077 ; RV32-NEXT: fmv.w.x fa5, a0
1078 ; RV32-NEXT: vmflt.vf v0, v10, fa5
1079 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
1080 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
1081 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1082 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1083 ; RV32-NEXT: vfwcvt.rtz.x.f.v v12, v8
1084 ; RV32-NEXT: vmv4r.v v8, v12
1087 ; RV64-LABEL: rint_nxv4f32_to_si64:
1089 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1090 ; RV64-NEXT: vfabs.v v10, v8
1091 ; RV64-NEXT: lui a0, 307200
1092 ; RV64-NEXT: fmv.w.x fa5, a0
1093 ; RV64-NEXT: vmflt.vf v0, v10, fa5
1094 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
1095 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
1096 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1097 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1098 ; RV64-NEXT: vfwcvt.rtz.x.f.v v12, v8
1099 ; RV64-NEXT: vmv4r.v v8, v12
1101 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
1102 %b = fptosi <vscale x 4 x float> %a to <vscale x 4 x i64>
1103 ret <vscale x 4 x i64> %b
1106 define <vscale x 4 x i64> @rint_nxv4f32_to_ui64(<vscale x 4 x float> %x) {
1107 ; RV32-LABEL: rint_nxv4f32_to_ui64:
1109 ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1110 ; RV32-NEXT: vfabs.v v10, v8
1111 ; RV32-NEXT: lui a0, 307200
1112 ; RV32-NEXT: fmv.w.x fa5, a0
1113 ; RV32-NEXT: vmflt.vf v0, v10, fa5
1114 ; RV32-NEXT: vfcvt.x.f.v v10, v8, v0.t
1115 ; RV32-NEXT: vfcvt.f.x.v v10, v10, v0.t
1116 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1117 ; RV32-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1118 ; RV32-NEXT: vfwcvt.rtz.xu.f.v v12, v8
1119 ; RV32-NEXT: vmv4r.v v8, v12
1122 ; RV64-LABEL: rint_nxv4f32_to_ui64:
1124 ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
1125 ; RV64-NEXT: vfabs.v v10, v8
1126 ; RV64-NEXT: lui a0, 307200
1127 ; RV64-NEXT: fmv.w.x fa5, a0
1128 ; RV64-NEXT: vmflt.vf v0, v10, fa5
1129 ; RV64-NEXT: vfcvt.x.f.v v10, v8, v0.t
1130 ; RV64-NEXT: vfcvt.f.x.v v10, v10, v0.t
1131 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, mu
1132 ; RV64-NEXT: vfsgnj.vv v8, v10, v8, v0.t
1133 ; RV64-NEXT: vfwcvt.rtz.xu.f.v v12, v8
1134 ; RV64-NEXT: vmv4r.v v8, v12
1136 %a = call <vscale x 4 x float> @llvm.rint.nxv4f32(<vscale x 4 x float> %x)
1137 %b = fptoui <vscale x 4 x float> %a to <vscale x 4 x i64>
1138 ret <vscale x 4 x i64> %b