1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+zfh,+zvfh,+v -verify-machineinstrs < %s | \
4 ; RUN: llc -mtriple=riscv64 -mattr=+zfh,+zvfh,+v -verify-machineinstrs < %s | \
7 ; ================================================================================
8 ; trunc <vscale x 1 x half>
9 ; ================================================================================
11 declare <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half>)
13 define <vscale x 1 x i8> @trunc_nxv1f16_to_si8(<vscale x 1 x half> %x) {
14 ; CHECK-LABEL: trunc_nxv1f16_to_si8:
16 ; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
17 ; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8
18 ; CHECK-NEXT: vmv1r.v v8, v9
20 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
21 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i8>
22 ret <vscale x 1 x i8> %b
25 define <vscale x 1 x i8> @trunc_nxv1f16_to_ui8(<vscale x 1 x half> %x) {
26 ; CHECK-LABEL: trunc_nxv1f16_to_ui8:
28 ; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
29 ; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8
30 ; CHECK-NEXT: vmv1r.v v8, v9
32 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
33 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i8>
34 ret <vscale x 1 x i8> %b
37 define <vscale x 1 x i16> @trunc_nxv1f16_to_si16(<vscale x 1 x half> %x) {
38 ; CHECK-LABEL: trunc_nxv1f16_to_si16:
40 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
41 ; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v8
43 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
44 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i16>
45 ret <vscale x 1 x i16> %b
48 define <vscale x 1 x i16> @trunc_nxv1f16_to_ui16(<vscale x 1 x half> %x) {
49 ; CHECK-LABEL: trunc_nxv1f16_to_ui16:
51 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
52 ; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8
54 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
55 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i16>
56 ret <vscale x 1 x i16> %b
59 define <vscale x 1 x i32> @trunc_nxv1f16_to_si32(<vscale x 1 x half> %x) {
60 ; CHECK-LABEL: trunc_nxv1f16_to_si32:
62 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
63 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v9, v8
64 ; CHECK-NEXT: vmv1r.v v8, v9
66 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
67 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i32>
68 ret <vscale x 1 x i32> %b
71 define <vscale x 1 x i32> @trunc_nxv1f16_to_ui32(<vscale x 1 x half> %x) {
72 ; CHECK-LABEL: trunc_nxv1f16_to_ui32:
74 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
75 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v9, v8
76 ; CHECK-NEXT: vmv1r.v v8, v9
78 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
79 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i32>
80 ret <vscale x 1 x i32> %b
83 define <vscale x 1 x i64> @trunc_nxv1f16_to_si64(<vscale x 1 x half> %x) {
84 ; CHECK-LABEL: trunc_nxv1f16_to_si64:
86 ; CHECK-NEXT: lui a0, %hi(.LCPI6_0)
87 ; CHECK-NEXT: flh fa5, %lo(.LCPI6_0)(a0)
88 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
89 ; CHECK-NEXT: vfabs.v v9, v8
90 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
91 ; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
92 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
93 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
94 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
95 ; CHECK-NEXT: vfwcvt.f.f.v v9, v8
96 ; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
97 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v9
99 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
100 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i64>
101 ret <vscale x 1 x i64> %b
104 define <vscale x 1 x i64> @trunc_nxv1f16_to_ui64(<vscale x 1 x half> %x) {
105 ; CHECK-LABEL: trunc_nxv1f16_to_ui64:
107 ; CHECK-NEXT: lui a0, %hi(.LCPI7_0)
108 ; CHECK-NEXT: flh fa5, %lo(.LCPI7_0)(a0)
109 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
110 ; CHECK-NEXT: vfabs.v v9, v8
111 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
112 ; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
113 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
114 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
115 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
116 ; CHECK-NEXT: vfwcvt.f.f.v v9, v8
117 ; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
118 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v9
120 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x)
121 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i64>
122 ret <vscale x 1 x i64> %b
125 ; ================================================================================
126 ; trunc <vscale x 4 x half>
127 ; ================================================================================
129 declare <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half>)
131 define <vscale x 4 x i8> @trunc_nxv4f16_to_si8(<vscale x 4 x half> %x) {
132 ; CHECK-LABEL: trunc_nxv4f16_to_si8:
134 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
135 ; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8
136 ; CHECK-NEXT: vmv1r.v v8, v9
138 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
139 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i8>
140 ret <vscale x 4 x i8> %b
143 define <vscale x 4 x i8> @trunc_nxv4f16_to_ui8(<vscale x 4 x half> %x) {
144 ; CHECK-LABEL: trunc_nxv4f16_to_ui8:
146 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
147 ; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8
148 ; CHECK-NEXT: vmv1r.v v8, v9
150 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
151 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i8>
152 ret <vscale x 4 x i8> %b
155 define <vscale x 4 x i16> @trunc_nxv4f16_to_si16(<vscale x 4 x half> %x) {
156 ; CHECK-LABEL: trunc_nxv4f16_to_si16:
158 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
159 ; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v8
161 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
162 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i16>
163 ret <vscale x 4 x i16> %b
166 define <vscale x 4 x i16> @trunc_nxv4f16_to_ui16(<vscale x 4 x half> %x) {
167 ; CHECK-LABEL: trunc_nxv4f16_to_ui16:
169 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
170 ; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8
172 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
173 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i16>
174 ret <vscale x 4 x i16> %b
177 define <vscale x 4 x i32> @trunc_nxv4f16_to_si32(<vscale x 4 x half> %x) {
178 ; CHECK-LABEL: trunc_nxv4f16_to_si32:
180 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
181 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v10, v8
182 ; CHECK-NEXT: vmv2r.v v8, v10
184 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
185 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i32>
186 ret <vscale x 4 x i32> %b
189 define <vscale x 4 x i32> @trunc_nxv4f16_to_ui32(<vscale x 4 x half> %x) {
190 ; CHECK-LABEL: trunc_nxv4f16_to_ui32:
192 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
193 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v10, v8
194 ; CHECK-NEXT: vmv2r.v v8, v10
196 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
197 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i32>
198 ret <vscale x 4 x i32> %b
201 define <vscale x 4 x i64> @trunc_nxv4f16_to_si64(<vscale x 4 x half> %x) {
202 ; CHECK-LABEL: trunc_nxv4f16_to_si64:
204 ; CHECK-NEXT: lui a0, %hi(.LCPI14_0)
205 ; CHECK-NEXT: flh fa5, %lo(.LCPI14_0)(a0)
206 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
207 ; CHECK-NEXT: vfabs.v v9, v8
208 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
209 ; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
210 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
211 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
212 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
213 ; CHECK-NEXT: vfwcvt.f.f.v v12, v8
214 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
215 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v12
217 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
218 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i64>
219 ret <vscale x 4 x i64> %b
222 define <vscale x 4 x i64> @trunc_nxv4f16_to_ui64(<vscale x 4 x half> %x) {
223 ; CHECK-LABEL: trunc_nxv4f16_to_ui64:
225 ; CHECK-NEXT: lui a0, %hi(.LCPI15_0)
226 ; CHECK-NEXT: flh fa5, %lo(.LCPI15_0)(a0)
227 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
228 ; CHECK-NEXT: vfabs.v v9, v8
229 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
230 ; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t
231 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
232 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
233 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
234 ; CHECK-NEXT: vfwcvt.f.f.v v12, v8
235 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
236 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v12
238 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x)
239 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i64>
240 ret <vscale x 4 x i64> %b
243 ; ================================================================================
244 ; ceil <vscale x 1 x half>
245 ; ================================================================================
247 declare <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half>)
249 define <vscale x 1 x i8> @ceil_nxv1f16_to_si8(<vscale x 1 x half> %x) {
250 ; CHECK-LABEL: ceil_nxv1f16_to_si8:
252 ; CHECK-NEXT: fsrmi a0, 3
253 ; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
254 ; CHECK-NEXT: vfncvt.x.f.w v9, v8
255 ; CHECK-NEXT: fsrm a0
256 ; CHECK-NEXT: vmv1r.v v8, v9
258 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
259 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i8>
260 ret <vscale x 1 x i8> %b
263 define <vscale x 1 x i8> @ceil_nxv1f16_to_ui8(<vscale x 1 x half> %x) {
264 ; CHECK-LABEL: ceil_nxv1f16_to_ui8:
266 ; CHECK-NEXT: fsrmi a0, 3
267 ; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
268 ; CHECK-NEXT: vfncvt.xu.f.w v9, v8
269 ; CHECK-NEXT: fsrm a0
270 ; CHECK-NEXT: vmv1r.v v8, v9
272 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
273 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i8>
274 ret <vscale x 1 x i8> %b
277 define <vscale x 1 x i16> @ceil_nxv1f16_to_si16(<vscale x 1 x half> %x) {
278 ; CHECK-LABEL: ceil_nxv1f16_to_si16:
280 ; CHECK-NEXT: fsrmi a0, 3
281 ; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
282 ; CHECK-NEXT: vfcvt.x.f.v v8, v8
283 ; CHECK-NEXT: fsrm a0
285 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
286 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i16>
287 ret <vscale x 1 x i16> %b
290 define <vscale x 1 x i16> @ceil_nxv1f16_to_ui16(<vscale x 1 x half> %x) {
291 ; CHECK-LABEL: ceil_nxv1f16_to_ui16:
293 ; CHECK-NEXT: fsrmi a0, 3
294 ; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
295 ; CHECK-NEXT: vfcvt.xu.f.v v8, v8
296 ; CHECK-NEXT: fsrm a0
298 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
299 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i16>
300 ret <vscale x 1 x i16> %b
303 define <vscale x 1 x i32> @ceil_nxv1f16_to_si32(<vscale x 1 x half> %x) {
304 ; CHECK-LABEL: ceil_nxv1f16_to_si32:
306 ; CHECK-NEXT: fsrmi a0, 3
307 ; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
308 ; CHECK-NEXT: vfwcvt.x.f.v v9, v8
309 ; CHECK-NEXT: fsrm a0
310 ; CHECK-NEXT: vmv1r.v v8, v9
312 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
313 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i32>
314 ret <vscale x 1 x i32> %b
317 define <vscale x 1 x i32> @ceil_nxv1f16_to_ui32(<vscale x 1 x half> %x) {
318 ; CHECK-LABEL: ceil_nxv1f16_to_ui32:
320 ; CHECK-NEXT: fsrmi a0, 3
321 ; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
322 ; CHECK-NEXT: vfwcvt.xu.f.v v9, v8
323 ; CHECK-NEXT: fsrm a0
324 ; CHECK-NEXT: vmv1r.v v8, v9
326 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
327 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i32>
328 ret <vscale x 1 x i32> %b
331 define <vscale x 1 x i64> @ceil_nxv1f16_to_si64(<vscale x 1 x half> %x) {
332 ; CHECK-LABEL: ceil_nxv1f16_to_si64:
334 ; CHECK-NEXT: lui a0, %hi(.LCPI22_0)
335 ; CHECK-NEXT: flh fa5, %lo(.LCPI22_0)(a0)
336 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
337 ; CHECK-NEXT: vfabs.v v9, v8
338 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
339 ; CHECK-NEXT: fsrmi a0, 3
340 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
341 ; CHECK-NEXT: fsrm a0
342 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
343 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
344 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
345 ; CHECK-NEXT: vfwcvt.f.f.v v9, v8
346 ; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
347 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v9
349 ; RV32-LABEL: ceil_nxv1f16_to_si64:
351 ; RV32-NEXT: lui a0, %hi(.LCPI22_0)
352 ; RV32-NEXT: flh fa5, %lo(.LCPI22_0)(a0)
353 ; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
354 ; RV32-NEXT: vfabs.v v9, v8
355 ; RV32-NEXT: vmflt.vf v0, v9, fa5
356 ; RV32-NEXT: fsrmi a0, 3
357 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
358 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
359 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
360 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
361 ; RV32-NEXT: vfwcvt.f.f.v v9, v8
362 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
363 ; RV32-NEXT: vfwcvt.rtz.x.f.v v8, v9
366 ; RV64-LABEL: ceil_nxv1f16_to_si64:
368 ; RV64-NEXT: lui a0, %hi(.LCPI22_0)
369 ; RV64-NEXT: flh fa5, %lo(.LCPI22_0)(a0)
370 ; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
371 ; RV64-NEXT: vfabs.v v9, v8
372 ; RV64-NEXT: vmflt.vf v0, v9, fa5
373 ; RV64-NEXT: fsrmi a0, 3
374 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
375 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
376 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
377 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
378 ; RV64-NEXT: vfwcvt.f.f.v v9, v8
379 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
380 ; RV64-NEXT: vfwcvt.rtz.x.f.v v8, v9
383 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
384 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i64>
385 ret <vscale x 1 x i64> %b
388 define <vscale x 1 x i64> @ceil_nxv1f16_to_ui64(<vscale x 1 x half> %x) {
389 ; CHECK-LABEL: ceil_nxv1f16_to_ui64:
391 ; CHECK-NEXT: lui a0, %hi(.LCPI23_0)
392 ; CHECK-NEXT: flh fa5, %lo(.LCPI23_0)(a0)
393 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
394 ; CHECK-NEXT: vfabs.v v9, v8
395 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
396 ; CHECK-NEXT: fsrmi a0, 3
397 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
398 ; CHECK-NEXT: fsrm a0
399 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
400 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
401 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
402 ; CHECK-NEXT: vfwcvt.f.f.v v9, v8
403 ; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
404 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v9
406 ; RV32-LABEL: ceil_nxv1f16_to_ui64:
408 ; RV32-NEXT: lui a0, %hi(.LCPI23_0)
409 ; RV32-NEXT: flh fa5, %lo(.LCPI23_0)(a0)
410 ; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
411 ; RV32-NEXT: vfabs.v v9, v8
412 ; RV32-NEXT: vmflt.vf v0, v9, fa5
413 ; RV32-NEXT: fsrmi a0, 3
414 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
415 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
416 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
417 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
418 ; RV32-NEXT: vfwcvt.f.f.v v9, v8
419 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
420 ; RV32-NEXT: vfwcvt.rtz.xu.f.v v8, v9
423 ; RV64-LABEL: ceil_nxv1f16_to_ui64:
425 ; RV64-NEXT: lui a0, %hi(.LCPI23_0)
426 ; RV64-NEXT: flh fa5, %lo(.LCPI23_0)(a0)
427 ; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
428 ; RV64-NEXT: vfabs.v v9, v8
429 ; RV64-NEXT: vmflt.vf v0, v9, fa5
430 ; RV64-NEXT: fsrmi a0, 3
431 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
432 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
433 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
434 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
435 ; RV64-NEXT: vfwcvt.f.f.v v9, v8
436 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
437 ; RV64-NEXT: vfwcvt.rtz.xu.f.v v8, v9
440 %a = call <vscale x 1 x half> @llvm.ceil.nxv1f16(<vscale x 1 x half> %x)
441 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i64>
442 ret <vscale x 1 x i64> %b
445 ; ================================================================================
446 ; ceil <vscale x 4 x half>
447 ; ================================================================================
449 declare <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half>)
451 define <vscale x 4 x i8> @ceil_nxv4f16_to_si8(<vscale x 4 x half> %x) {
452 ; CHECK-LABEL: ceil_nxv4f16_to_si8:
454 ; CHECK-NEXT: fsrmi a0, 3
455 ; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma
456 ; CHECK-NEXT: vfncvt.x.f.w v9, v8
457 ; CHECK-NEXT: fsrm a0
458 ; CHECK-NEXT: vmv1r.v v8, v9
460 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
461 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i8>
462 ret <vscale x 4 x i8> %b
465 define <vscale x 4 x i8> @ceil_nxv4f16_to_ui8(<vscale x 4 x half> %x) {
466 ; CHECK-LABEL: ceil_nxv4f16_to_ui8:
468 ; CHECK-NEXT: fsrmi a0, 3
469 ; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma
470 ; CHECK-NEXT: vfncvt.xu.f.w v9, v8
471 ; CHECK-NEXT: fsrm a0
472 ; CHECK-NEXT: vmv1r.v v8, v9
474 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
475 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i8>
476 ret <vscale x 4 x i8> %b
479 define <vscale x 4 x i16> @ceil_nxv4f16_to_si16(<vscale x 4 x half> %x) {
480 ; CHECK-LABEL: ceil_nxv4f16_to_si16:
482 ; CHECK-NEXT: fsrmi a0, 3
483 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
484 ; CHECK-NEXT: vfcvt.x.f.v v8, v8
485 ; CHECK-NEXT: fsrm a0
487 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
488 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i16>
489 ret <vscale x 4 x i16> %b
492 define <vscale x 4 x i16> @ceil_nxv4f16_to_ui16(<vscale x 4 x half> %x) {
493 ; CHECK-LABEL: ceil_nxv4f16_to_ui16:
495 ; CHECK-NEXT: fsrmi a0, 3
496 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
497 ; CHECK-NEXT: vfcvt.xu.f.v v8, v8
498 ; CHECK-NEXT: fsrm a0
500 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
501 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i16>
502 ret <vscale x 4 x i16> %b
505 define <vscale x 4 x i32> @ceil_nxv4f16_to_si32(<vscale x 4 x half> %x) {
506 ; CHECK-LABEL: ceil_nxv4f16_to_si32:
508 ; CHECK-NEXT: fsrmi a0, 3
509 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
510 ; CHECK-NEXT: vfwcvt.x.f.v v10, v8
511 ; CHECK-NEXT: fsrm a0
512 ; CHECK-NEXT: vmv2r.v v8, v10
514 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
515 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i32>
516 ret <vscale x 4 x i32> %b
519 define <vscale x 4 x i32> @ceil_nxv4f16_to_ui32(<vscale x 4 x half> %x) {
520 ; CHECK-LABEL: ceil_nxv4f16_to_ui32:
522 ; CHECK-NEXT: fsrmi a0, 3
523 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
524 ; CHECK-NEXT: vfwcvt.xu.f.v v10, v8
525 ; CHECK-NEXT: fsrm a0
526 ; CHECK-NEXT: vmv2r.v v8, v10
528 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
529 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i32>
530 ret <vscale x 4 x i32> %b
533 define <vscale x 4 x i64> @ceil_nxv4f16_to_si64(<vscale x 4 x half> %x) {
534 ; CHECK-LABEL: ceil_nxv4f16_to_si64:
536 ; CHECK-NEXT: lui a0, %hi(.LCPI30_0)
537 ; CHECK-NEXT: flh fa5, %lo(.LCPI30_0)(a0)
538 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
539 ; CHECK-NEXT: vfabs.v v9, v8
540 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
541 ; CHECK-NEXT: fsrmi a0, 3
542 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
543 ; CHECK-NEXT: fsrm a0
544 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
545 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
546 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
547 ; CHECK-NEXT: vfwcvt.f.f.v v12, v8
548 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
549 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v12
551 ; RV32-LABEL: ceil_nxv4f16_to_si64:
553 ; RV32-NEXT: lui a0, %hi(.LCPI30_0)
554 ; RV32-NEXT: flh fa5, %lo(.LCPI30_0)(a0)
555 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
556 ; RV32-NEXT: vfabs.v v9, v8
557 ; RV32-NEXT: vmflt.vf v0, v9, fa5
558 ; RV32-NEXT: fsrmi a0, 3
559 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
560 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
561 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, mu
562 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
563 ; RV32-NEXT: vfwcvt.f.f.v v12, v8
564 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, ma
565 ; RV32-NEXT: vfwcvt.rtz.x.f.v v8, v12
568 ; RV64-LABEL: ceil_nxv4f16_to_si64:
570 ; RV64-NEXT: lui a0, %hi(.LCPI30_0)
571 ; RV64-NEXT: flh fa5, %lo(.LCPI30_0)(a0)
572 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
573 ; RV64-NEXT: vfabs.v v9, v8
574 ; RV64-NEXT: vmflt.vf v0, v9, fa5
575 ; RV64-NEXT: fsrmi a0, 3
576 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
577 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
578 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, mu
579 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
580 ; RV64-NEXT: vfwcvt.f.f.v v12, v8
581 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, ma
582 ; RV64-NEXT: vfwcvt.rtz.x.f.v v8, v12
585 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
586 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i64>
587 ret <vscale x 4 x i64> %b
590 define <vscale x 4 x i64> @ceil_nxv4f16_to_ui64(<vscale x 4 x half> %x) {
591 ; CHECK-LABEL: ceil_nxv4f16_to_ui64:
593 ; CHECK-NEXT: lui a0, %hi(.LCPI31_0)
594 ; CHECK-NEXT: flh fa5, %lo(.LCPI31_0)(a0)
595 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
596 ; CHECK-NEXT: vfabs.v v9, v8
597 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
598 ; CHECK-NEXT: fsrmi a0, 3
599 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
600 ; CHECK-NEXT: fsrm a0
601 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
602 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
603 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
604 ; CHECK-NEXT: vfwcvt.f.f.v v12, v8
605 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
606 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v12
608 ; RV32-LABEL: ceil_nxv4f16_to_ui64:
610 ; RV32-NEXT: lui a0, %hi(.LCPI31_0)
611 ; RV32-NEXT: flh fa5, %lo(.LCPI31_0)(a0)
612 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
613 ; RV32-NEXT: vfabs.v v9, v8
614 ; RV32-NEXT: vmflt.vf v0, v9, fa5
615 ; RV32-NEXT: fsrmi a0, 3
616 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
617 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
618 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, mu
619 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
620 ; RV32-NEXT: vfwcvt.f.f.v v12, v8
621 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, ma
622 ; RV32-NEXT: vfwcvt.rtz.xu.f.v v8, v12
625 ; RV64-LABEL: ceil_nxv4f16_to_ui64:
627 ; RV64-NEXT: lui a0, %hi(.LCPI31_0)
628 ; RV64-NEXT: flh fa5, %lo(.LCPI31_0)(a0)
629 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
630 ; RV64-NEXT: vfabs.v v9, v8
631 ; RV64-NEXT: vmflt.vf v0, v9, fa5
632 ; RV64-NEXT: fsrmi a0, 3
633 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
634 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
635 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, mu
636 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
637 ; RV64-NEXT: vfwcvt.f.f.v v12, v8
638 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, ma
639 ; RV64-NEXT: vfwcvt.rtz.xu.f.v v8, v12
642 %a = call <vscale x 4 x half> @llvm.ceil.nxv4f16(<vscale x 4 x half> %x)
643 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i64>
644 ret <vscale x 4 x i64> %b
647 ; ================================================================================
648 ; rint <vscale x 1 x half>
649 ; ================================================================================
651 declare <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half>)
653 define <vscale x 1 x i8> @rint_nxv1f16_to_si8(<vscale x 1 x half> %x) {
654 ; CHECK-LABEL: rint_nxv1f16_to_si8:
656 ; CHECK-NEXT: lui a0, %hi(.LCPI32_0)
657 ; CHECK-NEXT: flh fa5, %lo(.LCPI32_0)(a0)
658 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
659 ; CHECK-NEXT: vfabs.v v9, v8
660 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
661 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
662 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
663 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
664 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
665 ; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
666 ; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8
667 ; CHECK-NEXT: vmv1r.v v8, v9
669 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
670 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i8>
671 ret <vscale x 1 x i8> %b
674 define <vscale x 1 x i8> @rint_nxv1f16_to_ui8(<vscale x 1 x half> %x) {
675 ; CHECK-LABEL: rint_nxv1f16_to_ui8:
677 ; CHECK-NEXT: lui a0, %hi(.LCPI33_0)
678 ; CHECK-NEXT: flh fa5, %lo(.LCPI33_0)(a0)
679 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
680 ; CHECK-NEXT: vfabs.v v9, v8
681 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
682 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
683 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
684 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
685 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
686 ; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
687 ; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8
688 ; CHECK-NEXT: vmv1r.v v8, v9
690 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
691 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i8>
692 ret <vscale x 1 x i8> %b
695 define <vscale x 1 x i16> @rint_nxv1f16_to_si16(<vscale x 1 x half> %x) {
696 ; CHECK-LABEL: rint_nxv1f16_to_si16:
698 ; CHECK-NEXT: lui a0, %hi(.LCPI34_0)
699 ; CHECK-NEXT: flh fa5, %lo(.LCPI34_0)(a0)
700 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
701 ; CHECK-NEXT: vfabs.v v9, v8
702 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
703 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
704 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
705 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
706 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
707 ; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v8
709 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
710 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i16>
711 ret <vscale x 1 x i16> %b
714 define <vscale x 1 x i16> @rint_nxv1f16_to_ui16(<vscale x 1 x half> %x) {
715 ; CHECK-LABEL: rint_nxv1f16_to_ui16:
717 ; CHECK-NEXT: lui a0, %hi(.LCPI35_0)
718 ; CHECK-NEXT: flh fa5, %lo(.LCPI35_0)(a0)
719 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
720 ; CHECK-NEXT: vfabs.v v9, v8
721 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
722 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
723 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
724 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
725 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
726 ; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8
728 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
729 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i16>
730 ret <vscale x 1 x i16> %b
733 define <vscale x 1 x i32> @rint_nxv1f16_to_si32(<vscale x 1 x half> %x) {
734 ; CHECK-LABEL: rint_nxv1f16_to_si32:
736 ; CHECK-NEXT: lui a0, %hi(.LCPI36_0)
737 ; CHECK-NEXT: flh fa5, %lo(.LCPI36_0)(a0)
738 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
739 ; CHECK-NEXT: vfabs.v v9, v8
740 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
741 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
742 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
743 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
744 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
745 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v9, v8
746 ; CHECK-NEXT: vmv1r.v v8, v9
748 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
749 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i32>
750 ret <vscale x 1 x i32> %b
753 define <vscale x 1 x i32> @rint_nxv1f16_to_ui32(<vscale x 1 x half> %x) {
754 ; CHECK-LABEL: rint_nxv1f16_to_ui32:
756 ; CHECK-NEXT: lui a0, %hi(.LCPI37_0)
757 ; CHECK-NEXT: flh fa5, %lo(.LCPI37_0)(a0)
758 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
759 ; CHECK-NEXT: vfabs.v v9, v8
760 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
761 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
762 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
763 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
764 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
765 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v9, v8
766 ; CHECK-NEXT: vmv1r.v v8, v9
768 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
769 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i32>
770 ret <vscale x 1 x i32> %b
773 define <vscale x 1 x i64> @rint_nxv1f16_to_si64(<vscale x 1 x half> %x) {
774 ; CHECK-LABEL: rint_nxv1f16_to_si64:
776 ; CHECK-NEXT: lui a0, %hi(.LCPI38_0)
777 ; CHECK-NEXT: flh fa5, %lo(.LCPI38_0)(a0)
778 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
779 ; CHECK-NEXT: vfabs.v v9, v8
780 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
781 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
782 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
783 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
784 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
785 ; CHECK-NEXT: vfwcvt.f.f.v v9, v8
786 ; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
787 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v9
789 ; RV32-LABEL: rint_nxv1f16_to_si64:
791 ; RV32-NEXT: lui a0, %hi(.LCPI22_0)
792 ; RV32-NEXT: flh fa5, %lo(.LCPI22_0)(a0)
793 ; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
794 ; RV32-NEXT: vfabs.v v9, v8
795 ; RV32-NEXT: vmflt.vf v0, v9, fa5
796 ; RV32-NEXT: fsrmi a0, 3
797 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
798 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
799 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
800 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
801 ; RV32-NEXT: vfwcvt.f.f.v v9, v8
802 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
803 ; RV32-NEXT: vfwcvt.rtz.x.f.v v8, v9
806 ; RV64-LABEL: rint_nxv1f16_to_si64:
808 ; RV64-NEXT: lui a0, %hi(.LCPI22_0)
809 ; RV64-NEXT: flh fa5, %lo(.LCPI22_0)(a0)
810 ; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
811 ; RV64-NEXT: vfabs.v v9, v8
812 ; RV64-NEXT: vmflt.vf v0, v9, fa5
813 ; RV64-NEXT: fsrmi a0, 3
814 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
815 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
816 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
817 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
818 ; RV64-NEXT: vfwcvt.f.f.v v9, v8
819 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
820 ; RV64-NEXT: vfwcvt.rtz.x.f.v v8, v9
823 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
824 %b = fptosi <vscale x 1 x half> %a to <vscale x 1 x i64>
825 ret <vscale x 1 x i64> %b
828 define <vscale x 1 x i64> @rint_nxv1f16_to_ui64(<vscale x 1 x half> %x) {
829 ; CHECK-LABEL: rint_nxv1f16_to_ui64:
831 ; CHECK-NEXT: lui a0, %hi(.LCPI39_0)
832 ; CHECK-NEXT: flh fa5, %lo(.LCPI39_0)(a0)
833 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
834 ; CHECK-NEXT: vfabs.v v9, v8
835 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
836 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
837 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
838 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
839 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
840 ; CHECK-NEXT: vfwcvt.f.f.v v9, v8
841 ; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
842 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v9
844 ; RV32-LABEL: rint_nxv1f16_to_ui64:
846 ; RV32-NEXT: lui a0, %hi(.LCPI23_0)
847 ; RV32-NEXT: flh fa5, %lo(.LCPI23_0)(a0)
848 ; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
849 ; RV32-NEXT: vfabs.v v9, v8
850 ; RV32-NEXT: vmflt.vf v0, v9, fa5
851 ; RV32-NEXT: fsrmi a0, 3
852 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
853 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
854 ; RV32-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
855 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
856 ; RV32-NEXT: vfwcvt.f.f.v v9, v8
857 ; RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
858 ; RV32-NEXT: vfwcvt.rtz.xu.f.v v8, v9
861 ; RV64-LABEL: rint_nxv1f16_to_ui64:
863 ; RV64-NEXT: lui a0, %hi(.LCPI23_0)
864 ; RV64-NEXT: flh fa5, %lo(.LCPI23_0)(a0)
865 ; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
866 ; RV64-NEXT: vfabs.v v9, v8
867 ; RV64-NEXT: vmflt.vf v0, v9, fa5
868 ; RV64-NEXT: fsrmi a0, 3
869 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
870 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
871 ; RV64-NEXT: vsetvli zero, zero, e16, mf4, ta, mu
872 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
873 ; RV64-NEXT: vfwcvt.f.f.v v9, v8
874 ; RV64-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
875 ; RV64-NEXT: vfwcvt.rtz.xu.f.v v8, v9
878 %a = call <vscale x 1 x half> @llvm.rint.nxv1f16(<vscale x 1 x half> %x)
879 %b = fptoui <vscale x 1 x half> %a to <vscale x 1 x i64>
880 ret <vscale x 1 x i64> %b
883 ; ================================================================================
884 ; rint <vscale x 4 x half>
885 ; ================================================================================
887 declare <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half>)
889 define <vscale x 4 x i8> @rint_nxv4f16_to_si8(<vscale x 4 x half> %x) {
890 ; CHECK-LABEL: rint_nxv4f16_to_si8:
892 ; CHECK-NEXT: lui a0, %hi(.LCPI40_0)
893 ; CHECK-NEXT: flh fa5, %lo(.LCPI40_0)(a0)
894 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
895 ; CHECK-NEXT: vfabs.v v9, v8
896 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
897 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
898 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
899 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
900 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
901 ; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
902 ; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8
903 ; CHECK-NEXT: vmv1r.v v8, v9
905 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
906 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i8>
907 ret <vscale x 4 x i8> %b
910 define <vscale x 4 x i8> @rint_nxv4f16_to_ui8(<vscale x 4 x half> %x) {
911 ; CHECK-LABEL: rint_nxv4f16_to_ui8:
913 ; CHECK-NEXT: lui a0, %hi(.LCPI41_0)
914 ; CHECK-NEXT: flh fa5, %lo(.LCPI41_0)(a0)
915 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
916 ; CHECK-NEXT: vfabs.v v9, v8
917 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
918 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
919 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
920 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
921 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
922 ; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
923 ; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8
924 ; CHECK-NEXT: vmv1r.v v8, v9
926 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
927 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i8>
928 ret <vscale x 4 x i8> %b
931 define <vscale x 4 x i16> @rint_nxv4f16_to_si16(<vscale x 4 x half> %x) {
932 ; CHECK-LABEL: rint_nxv4f16_to_si16:
934 ; CHECK-NEXT: lui a0, %hi(.LCPI42_0)
935 ; CHECK-NEXT: flh fa5, %lo(.LCPI42_0)(a0)
936 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
937 ; CHECK-NEXT: vfabs.v v9, v8
938 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
939 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
940 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
941 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
942 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
943 ; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v8
945 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
946 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i16>
947 ret <vscale x 4 x i16> %b
950 define <vscale x 4 x i16> @rint_nxv4f16_to_ui16(<vscale x 4 x half> %x) {
951 ; CHECK-LABEL: rint_nxv4f16_to_ui16:
953 ; CHECK-NEXT: lui a0, %hi(.LCPI43_0)
954 ; CHECK-NEXT: flh fa5, %lo(.LCPI43_0)(a0)
955 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
956 ; CHECK-NEXT: vfabs.v v9, v8
957 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
958 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
959 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
960 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
961 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
962 ; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8
964 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
965 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i16>
966 ret <vscale x 4 x i16> %b
969 define <vscale x 4 x i32> @rint_nxv4f16_to_si32(<vscale x 4 x half> %x) {
970 ; CHECK-LABEL: rint_nxv4f16_to_si32:
972 ; CHECK-NEXT: lui a0, %hi(.LCPI44_0)
973 ; CHECK-NEXT: flh fa5, %lo(.LCPI44_0)(a0)
974 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
975 ; CHECK-NEXT: vfabs.v v9, v8
976 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
977 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
978 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
979 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
980 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
981 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v10, v8
982 ; CHECK-NEXT: vmv2r.v v8, v10
984 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
985 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i32>
986 ret <vscale x 4 x i32> %b
989 define <vscale x 4 x i32> @rint_nxv4f16_to_ui32(<vscale x 4 x half> %x) {
990 ; CHECK-LABEL: rint_nxv4f16_to_ui32:
992 ; CHECK-NEXT: lui a0, %hi(.LCPI45_0)
993 ; CHECK-NEXT: flh fa5, %lo(.LCPI45_0)(a0)
994 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
995 ; CHECK-NEXT: vfabs.v v9, v8
996 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
997 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
998 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
999 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
1000 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
1001 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v10, v8
1002 ; CHECK-NEXT: vmv2r.v v8, v10
1004 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
1005 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i32>
1006 ret <vscale x 4 x i32> %b
1009 define <vscale x 4 x i64> @rint_nxv4f16_to_si64(<vscale x 4 x half> %x) {
1010 ; CHECK-LABEL: rint_nxv4f16_to_si64:
1012 ; CHECK-NEXT: lui a0, %hi(.LCPI46_0)
1013 ; CHECK-NEXT: flh fa5, %lo(.LCPI46_0)(a0)
1014 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
1015 ; CHECK-NEXT: vfabs.v v9, v8
1016 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
1017 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
1018 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
1019 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
1020 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
1021 ; CHECK-NEXT: vfwcvt.f.f.v v12, v8
1022 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
1023 ; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v12
1025 ; RV32-LABEL: rint_nxv4f16_to_si64:
1027 ; RV32-NEXT: lui a0, %hi(.LCPI30_0)
1028 ; RV32-NEXT: flh fa5, %lo(.LCPI30_0)(a0)
1029 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
1030 ; RV32-NEXT: vfabs.v v9, v8
1031 ; RV32-NEXT: vmflt.vf v0, v9, fa5
1032 ; RV32-NEXT: fsrmi a0, 3
1033 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
1034 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
1035 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, mu
1036 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
1037 ; RV32-NEXT: vfwcvt.f.f.v v12, v8
1038 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, ma
1039 ; RV32-NEXT: vfwcvt.rtz.x.f.v v8, v12
1040 ; RV32-NEXT: fsrm a0
1042 ; RV64-LABEL: rint_nxv4f16_to_si64:
1044 ; RV64-NEXT: lui a0, %hi(.LCPI30_0)
1045 ; RV64-NEXT: flh fa5, %lo(.LCPI30_0)(a0)
1046 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
1047 ; RV64-NEXT: vfabs.v v9, v8
1048 ; RV64-NEXT: vmflt.vf v0, v9, fa5
1049 ; RV64-NEXT: fsrmi a0, 3
1050 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
1051 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
1052 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, mu
1053 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
1054 ; RV64-NEXT: vfwcvt.f.f.v v12, v8
1055 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, ma
1056 ; RV64-NEXT: vfwcvt.rtz.x.f.v v8, v12
1057 ; RV64-NEXT: fsrm a0
1059 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
1060 %b = fptosi <vscale x 4 x half> %a to <vscale x 4 x i64>
1061 ret <vscale x 4 x i64> %b
1064 define <vscale x 4 x i64> @rint_nxv4f16_to_ui64(<vscale x 4 x half> %x) {
1065 ; CHECK-LABEL: rint_nxv4f16_to_ui64:
1067 ; CHECK-NEXT: lui a0, %hi(.LCPI47_0)
1068 ; CHECK-NEXT: flh fa5, %lo(.LCPI47_0)(a0)
1069 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
1070 ; CHECK-NEXT: vfabs.v v9, v8
1071 ; CHECK-NEXT: vmflt.vf v0, v9, fa5
1072 ; CHECK-NEXT: vfcvt.x.f.v v9, v8, v0.t
1073 ; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t
1074 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu
1075 ; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t
1076 ; CHECK-NEXT: vfwcvt.f.f.v v12, v8
1077 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
1078 ; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v12
1080 ; RV32-LABEL: rint_nxv4f16_to_ui64:
1082 ; RV32-NEXT: lui a0, %hi(.LCPI31_0)
1083 ; RV32-NEXT: flh fa5, %lo(.LCPI31_0)(a0)
1084 ; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, ma
1085 ; RV32-NEXT: vfabs.v v9, v8
1086 ; RV32-NEXT: vmflt.vf v0, v9, fa5
1087 ; RV32-NEXT: fsrmi a0, 3
1088 ; RV32-NEXT: vfcvt.x.f.v v9, v8, v0.t
1089 ; RV32-NEXT: vfcvt.f.x.v v9, v9, v0.t
1090 ; RV32-NEXT: vsetvli zero, zero, e16, m1, ta, mu
1091 ; RV32-NEXT: vfsgnj.vv v8, v9, v8, v0.t
1092 ; RV32-NEXT: vfwcvt.f.f.v v12, v8
1093 ; RV32-NEXT: vsetvli zero, zero, e32, m2, ta, ma
1094 ; RV32-NEXT: vfwcvt.rtz.xu.f.v v8, v12
1095 ; RV32-NEXT: fsrm a0
1097 ; RV64-LABEL: rint_nxv4f16_to_ui64:
1099 ; RV64-NEXT: lui a0, %hi(.LCPI31_0)
1100 ; RV64-NEXT: flh fa5, %lo(.LCPI31_0)(a0)
1101 ; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, ma
1102 ; RV64-NEXT: vfabs.v v9, v8
1103 ; RV64-NEXT: vmflt.vf v0, v9, fa5
1104 ; RV64-NEXT: fsrmi a0, 3
1105 ; RV64-NEXT: vfcvt.x.f.v v9, v8, v0.t
1106 ; RV64-NEXT: vfcvt.f.x.v v9, v9, v0.t
1107 ; RV64-NEXT: vsetvli zero, zero, e16, m1, ta, mu
1108 ; RV64-NEXT: vfsgnj.vv v8, v9, v8, v0.t
1109 ; RV64-NEXT: vfwcvt.f.f.v v12, v8
1110 ; RV64-NEXT: vsetvli zero, zero, e32, m2, ta, ma
1111 ; RV64-NEXT: vfwcvt.rtz.xu.f.v v8, v12
1112 ; RV64-NEXT: fsrm a0
1114 %a = call <vscale x 4 x half> @llvm.rint.nxv4f16(<vscale x 4 x half> %x)
1115 %b = fptoui <vscale x 4 x half> %a to <vscale x 4 x i64>
1116 ret <vscale x 4 x i64> %b