[RISCV] Support postRA vsetvl insertion pass (#70549)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / float-round-conv.ll
blobb7661bd826fed26dc02a8bddc0fc77ce68668554
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:
15 ; RV32:       # %bb.0:
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
29 ; RV32-NEXT:    ret
31 ; RV64-LABEL: trunc_nxv1f32_to_si8:
32 ; RV64:       # %bb.0:
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
46 ; RV64-NEXT:    ret
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:
54 ; RV32:       # %bb.0:
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
68 ; RV32-NEXT:    ret
70 ; RV64-LABEL: trunc_nxv1f32_to_ui8:
71 ; RV64:       # %bb.0:
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
85 ; RV64-NEXT:    ret
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:
93 ; RV32:       # %bb.0:
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
97 ; RV32-NEXT:    ret
99 ; RV64-LABEL: trunc_nxv1f32_to_si16:
100 ; RV64:       # %bb.0:
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
104 ; RV64-NEXT:    ret
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:
112 ; RV32:       # %bb.0:
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
116 ; RV32-NEXT:    ret
118 ; RV64-LABEL: trunc_nxv1f32_to_ui16:
119 ; RV64:       # %bb.0:
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
123 ; RV64-NEXT:    ret
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:
131 ; RV32:       # %bb.0:
132 ; RV32-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
133 ; RV32-NEXT:    vfcvt.rtz.x.f.v v8, v8
134 ; RV32-NEXT:    ret
136 ; RV64-LABEL: trunc_nxv1f32_to_si32:
137 ; RV64:       # %bb.0:
138 ; RV64-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
139 ; RV64-NEXT:    vfcvt.rtz.x.f.v v8, v8
140 ; RV64-NEXT:    ret
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:
148 ; RV32:       # %bb.0:
149 ; RV32-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
150 ; RV32-NEXT:    vfcvt.rtz.xu.f.v v8, v8
151 ; RV32-NEXT:    ret
153 ; RV64-LABEL: trunc_nxv1f32_to_ui32:
154 ; RV64:       # %bb.0:
155 ; RV64-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
156 ; RV64-NEXT:    vfcvt.rtz.xu.f.v v8, v8
157 ; RV64-NEXT:    ret
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:
165 ; RV32:       # %bb.0:
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
169 ; RV32-NEXT:    ret
171 ; RV64-LABEL: trunc_nxv1f32_to_si64:
172 ; RV64:       # %bb.0:
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
176 ; RV64-NEXT:    ret
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:
184 ; RV32:       # %bb.0:
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
188 ; RV32-NEXT:    ret
190 ; RV64-LABEL: trunc_nxv1f32_to_ui64:
191 ; RV64:       # %bb.0:
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
195 ; RV64-NEXT:    ret
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:
209 ; RV32:       # %bb.0:
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
223 ; RV32-NEXT:    ret
225 ; RV64-LABEL: trunc_nxv4f32_to_si8:
226 ; RV64:       # %bb.0:
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
240 ; RV64-NEXT:    ret
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:
248 ; RV32:       # %bb.0:
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
262 ; RV32-NEXT:    ret
264 ; RV64-LABEL: trunc_nxv4f32_to_ui8:
265 ; RV64:       # %bb.0:
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
279 ; RV64-NEXT:    ret
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:
287 ; RV32:       # %bb.0:
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
291 ; RV32-NEXT:    ret
293 ; RV64-LABEL: trunc_nxv4f32_to_si16:
294 ; RV64:       # %bb.0:
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
298 ; RV64-NEXT:    ret
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:
306 ; RV32:       # %bb.0:
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
310 ; RV32-NEXT:    ret
312 ; RV64-LABEL: trunc_nxv4f32_to_ui16:
313 ; RV64:       # %bb.0:
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
317 ; RV64-NEXT:    ret
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:
325 ; RV32:       # %bb.0:
326 ; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
327 ; RV32-NEXT:    vfcvt.rtz.x.f.v v8, v8
328 ; RV32-NEXT:    ret
330 ; RV64-LABEL: trunc_nxv4f32_to_si32:
331 ; RV64:       # %bb.0:
332 ; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
333 ; RV64-NEXT:    vfcvt.rtz.x.f.v v8, v8
334 ; RV64-NEXT:    ret
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:
342 ; RV32:       # %bb.0:
343 ; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
344 ; RV32-NEXT:    vfcvt.rtz.xu.f.v v8, v8
345 ; RV32-NEXT:    ret
347 ; RV64-LABEL: trunc_nxv4f32_to_ui32:
348 ; RV64:       # %bb.0:
349 ; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
350 ; RV64-NEXT:    vfcvt.rtz.xu.f.v v8, v8
351 ; RV64-NEXT:    ret
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:
359 ; RV32:       # %bb.0:
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
363 ; RV32-NEXT:    ret
365 ; RV64-LABEL: trunc_nxv4f32_to_si64:
366 ; RV64:       # %bb.0:
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
370 ; RV64-NEXT:    ret
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:
378 ; RV32:       # %bb.0:
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
382 ; RV32-NEXT:    ret
384 ; RV64-LABEL: trunc_nxv4f32_to_ui64:
385 ; RV64:       # %bb.0:
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
389 ; RV64-NEXT:    ret
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:
403 ; RV32:       # %bb.0:
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
411 ; RV32-NEXT:    fsrm a0
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
419 ; RV32-NEXT:    ret
421 ; RV64-LABEL: ceil_nxv1f32_to_si8:
422 ; RV64:       # %bb.0:
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
430 ; RV64-NEXT:    fsrm a0
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
438 ; RV64-NEXT:    ret
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:
446 ; RV32:       # %bb.0:
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
454 ; RV32-NEXT:    fsrm a0
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
462 ; RV32-NEXT:    ret
464 ; RV64-LABEL: ceil_nxv1f32_to_ui8:
465 ; RV64:       # %bb.0:
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
473 ; RV64-NEXT:    fsrm a0
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
481 ; RV64-NEXT:    ret
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:
489 ; RV32:       # %bb.0:
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
493 ; RV32-NEXT:    fsrm a0
494 ; RV32-NEXT:    vmv1r.v v8, v9
495 ; RV32-NEXT:    ret
497 ; RV64-LABEL: ceil_nxv1f32_to_si16:
498 ; RV64:       # %bb.0:
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
502 ; RV64-NEXT:    fsrm a0
503 ; RV64-NEXT:    vmv1r.v v8, v9
504 ; RV64-NEXT:    ret
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:
512 ; RV32:       # %bb.0:
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
516 ; RV32-NEXT:    fsrm a0
517 ; RV32-NEXT:    vmv1r.v v8, v9
518 ; RV32-NEXT:    ret
520 ; RV64-LABEL: ceil_nxv1f32_to_ui16:
521 ; RV64:       # %bb.0:
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
525 ; RV64-NEXT:    fsrm a0
526 ; RV64-NEXT:    vmv1r.v v8, v9
527 ; RV64-NEXT:    ret
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:
535 ; RV32:       # %bb.0:
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
539 ; RV32-NEXT:    fsrm a0
540 ; RV32-NEXT:    ret
542 ; RV64-LABEL: ceil_nxv1f32_to_si32:
543 ; RV64:       # %bb.0:
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
547 ; RV64-NEXT:    fsrm a0
548 ; RV64-NEXT:    ret
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:
556 ; RV32:       # %bb.0:
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
560 ; RV32-NEXT:    fsrm a0
561 ; RV32-NEXT:    ret
563 ; RV64-LABEL: ceil_nxv1f32_to_ui32:
564 ; RV64:       # %bb.0:
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
568 ; RV64-NEXT:    fsrm a0
569 ; RV64-NEXT:    ret
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:
577 ; RV32:       # %bb.0:
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
581 ; RV32-NEXT:    fsrm a0
582 ; RV32-NEXT:    vmv1r.v v8, v9
583 ; RV32-NEXT:    ret
585 ; RV64-LABEL: ceil_nxv1f32_to_si64:
586 ; RV64:       # %bb.0:
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
590 ; RV64-NEXT:    fsrm a0
591 ; RV64-NEXT:    vmv1r.v v8, v9
592 ; RV64-NEXT:    ret
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:
600 ; RV32:       # %bb.0:
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
604 ; RV32-NEXT:    fsrm a0
605 ; RV32-NEXT:    vmv1r.v v8, v9
606 ; RV32-NEXT:    ret
608 ; RV64-LABEL: ceil_nxv1f32_to_ui64:
609 ; RV64:       # %bb.0:
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
613 ; RV64-NEXT:    fsrm a0
614 ; RV64-NEXT:    vmv1r.v v8, v9
615 ; RV64-NEXT:    ret
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:
629 ; RV32:       # %bb.0:
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
637 ; RV32-NEXT:    fsrm a0
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
645 ; RV32-NEXT:    ret
647 ; RV64-LABEL: ceil_nxv4f32_to_si8:
648 ; RV64:       # %bb.0:
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
656 ; RV64-NEXT:    fsrm a0
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
664 ; RV64-NEXT:    ret
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:
672 ; RV32:       # %bb.0:
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
680 ; RV32-NEXT:    fsrm a0
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
688 ; RV32-NEXT:    ret
690 ; RV64-LABEL: ceil_nxv4f32_to_ui8:
691 ; RV64:       # %bb.0:
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
699 ; RV64-NEXT:    fsrm a0
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
707 ; RV64-NEXT:    ret
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:
715 ; RV32:       # %bb.0:
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
719 ; RV32-NEXT:    fsrm a0
720 ; RV32-NEXT:    vmv.v.v v8, v10
721 ; RV32-NEXT:    ret
723 ; RV64-LABEL: ceil_nxv4f32_to_si16:
724 ; RV64:       # %bb.0:
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
728 ; RV64-NEXT:    fsrm a0
729 ; RV64-NEXT:    vmv.v.v v8, v10
730 ; RV64-NEXT:    ret
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:
738 ; RV32:       # %bb.0:
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
742 ; RV32-NEXT:    fsrm a0
743 ; RV32-NEXT:    vmv.v.v v8, v10
744 ; RV32-NEXT:    ret
746 ; RV64-LABEL: ceil_nxv4f32_to_ui16:
747 ; RV64:       # %bb.0:
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
751 ; RV64-NEXT:    fsrm a0
752 ; RV64-NEXT:    vmv.v.v v8, v10
753 ; RV64-NEXT:    ret
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:
761 ; RV32:       # %bb.0:
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
765 ; RV32-NEXT:    fsrm a0
766 ; RV32-NEXT:    ret
768 ; RV64-LABEL: ceil_nxv4f32_to_si32:
769 ; RV64:       # %bb.0:
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
773 ; RV64-NEXT:    fsrm a0
774 ; RV64-NEXT:    ret
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:
782 ; RV32:       # %bb.0:
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
786 ; RV32-NEXT:    fsrm a0
787 ; RV32-NEXT:    ret
789 ; RV64-LABEL: ceil_nxv4f32_to_ui32:
790 ; RV64:       # %bb.0:
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
794 ; RV64-NEXT:    fsrm a0
795 ; RV64-NEXT:    ret
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:
803 ; RV32:       # %bb.0:
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
807 ; RV32-NEXT:    fsrm a0
808 ; RV32-NEXT:    vmv4r.v v8, v12
809 ; RV32-NEXT:    ret
811 ; RV64-LABEL: ceil_nxv4f32_to_si64:
812 ; RV64:       # %bb.0:
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
816 ; RV64-NEXT:    fsrm a0
817 ; RV64-NEXT:    vmv4r.v v8, v12
818 ; RV64-NEXT:    ret
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:
826 ; RV32:       # %bb.0:
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
830 ; RV32-NEXT:    fsrm a0
831 ; RV32-NEXT:    vmv4r.v v8, v12
832 ; RV32-NEXT:    ret
834 ; RV64-LABEL: ceil_nxv4f32_to_ui64:
835 ; RV64:       # %bb.0:
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
839 ; RV64-NEXT:    fsrm a0
840 ; RV64-NEXT:    vmv4r.v v8, v12
841 ; RV64-NEXT:    ret
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:
855 ; RV32:       # %bb.0:
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
869 ; RV32-NEXT:    ret
871 ; RV64-LABEL: rint_nxv4f32_to_si8:
872 ; RV64:       # %bb.0:
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
886 ; RV64-NEXT:    ret
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:
894 ; RV32:       # %bb.0:
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
908 ; RV32-NEXT:    ret
910 ; RV64-LABEL: rint_nxv4f32_to_ui8:
911 ; RV64:       # %bb.0:
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
925 ; RV64-NEXT:    ret
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:
933 ; RV32:       # %bb.0:
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
937 ; RV32-NEXT:    ret
939 ; RV64-LABEL: rint_nxv4f32_to_si16:
940 ; RV64:       # %bb.0:
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
944 ; RV64-NEXT:    ret
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:
952 ; RV32:       # %bb.0:
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
956 ; RV32-NEXT:    ret
958 ; RV64-LABEL: rint_nxv4f32_to_ui16:
959 ; RV64:       # %bb.0:
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
963 ; RV64-NEXT:    ret
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:
971 ; RV32:       # %bb.0:
972 ; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
973 ; RV32-NEXT:    vfcvt.x.f.v v8, v8
974 ; RV32-NEXT:    ret
976 ; RV64-LABEL: rint_nxv4f32_to_si32:
977 ; RV64:       # %bb.0:
978 ; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
979 ; RV64-NEXT:    vfcvt.x.f.v v8, v8
980 ; RV64-NEXT:    ret
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:
988 ; RV32:       # %bb.0:
989 ; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
990 ; RV32-NEXT:    vfcvt.xu.f.v v8, v8
991 ; RV32-NEXT:    ret
993 ; RV64-LABEL: rint_nxv4f32_to_ui32:
994 ; RV64:       # %bb.0:
995 ; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
996 ; RV64-NEXT:    vfcvt.xu.f.v v8, v8
997 ; RV64-NEXT:    ret
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:
1005 ; RV32:       # %bb.0:
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
1009 ; RV32-NEXT:    ret
1011 ; RV64-LABEL: rint_nxv4f32_to_si64:
1012 ; RV64:       # %bb.0:
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
1016 ; RV64-NEXT:    ret
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:
1024 ; RV32:       # %bb.0:
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
1028 ; RV32-NEXT:    ret
1030 ; RV64-LABEL: rint_nxv4f32_to_ui64:
1031 ; RV64:       # %bb.0:
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
1035 ; RV64-NEXT:    ret
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