[mlir][LLVM] `LLVMTypeConverter`: Tighten materialization checks (#116532)
[llvm-project.git] / llvm / test / CodeGen / RISCV / half-convert.ll
blob01ffcab1a6556f7fd6f722a7435e69f1a4e21f5c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \
3 ; RUN:   -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECKIZFH,RV32IZFH %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \
5 ; RUN:   -target-abi lp64f < %s | FileCheck -check-prefixes=CHECKIZFH,RV64IZFH %s
6 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh -verify-machineinstrs \
7 ; RUN:   -target-abi ilp32d < %s | FileCheck -check-prefix=RV32IDZFH %s
8 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh -verify-machineinstrs \
9 ; RUN:   -target-abi lp64d < %s | FileCheck -check-prefix=RV64IDZFH %s
10 ; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs \
11 ; RUN:   -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECKIZHINX,RV32IZHINX %s
12 ; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \
13 ; RUN:   -target-abi lp64 < %s | FileCheck -check-prefixes=CHECKIZHINX,RV64IZHINX %s
14 ; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zhinx -verify-machineinstrs \
15 ; RUN:   -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECKIZDINXZHINX,RV32IZDINXZHINX %s
16 ; RUN: llc -mtriple=riscv64 -mattr=+zdinx,+zhinx -verify-machineinstrs \
17 ; RUN:   -target-abi lp64 < %s | FileCheck -check-prefixes=CHECKIZDINXZHINX,RV64IZDINXZHINX %s
18 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs \
19 ; RUN:   < %s | FileCheck -check-prefix=RV32I %s
20 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs \
21 ; RUN:   < %s | FileCheck -check-prefix=RV64I %s
22 ; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32 -verify-machineinstrs \
23 ; RUN:   < %s | FileCheck %s -check-prefix=RV32ID-ILP32
24 ; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64 -verify-machineinstrs \
25 ; RUN:   < %s | FileCheck %s -check-prefix=RV64ID-LP64
26 ; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32d -verify-machineinstrs \
27 ; RUN:   < %s | FileCheck %s -check-prefix=RV32ID
28 ; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64d -verify-machineinstrs \
29 ; RUN:   < %s  | FileCheck %s -check-prefix=RV64ID
30 ; RUN: llc -mtriple=riscv32 -mattr=+zfhmin -verify-machineinstrs \
31 ; RUN:   -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECK32-IZFHMIN,RV32IFZFHMIN %s
32 ; RUN: llc -mtriple=riscv64 -mattr=+zfhmin -verify-machineinstrs \
33 ; RUN:   -target-abi lp64f < %s | FileCheck -check-prefixes=CHECK64-IZFHMIN,RV64IFZFHMIN %s
34 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin -verify-machineinstrs \
35 ; RUN:   -target-abi ilp32d < %s | FileCheck -check-prefixes=CHECK32-IZFHMIN,RV32IDZFHMIN %s
36 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin -verify-machineinstrs \
37 ; RUN:   -target-abi lp64d < %s | FileCheck -check-prefixes=CHECK64-IZFHMIN,RV64IDZFHMIN %s
38 ; RUN: llc -mtriple=riscv32 -mattr=+zhinxmin -verify-machineinstrs \
39 ; RUN:   -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECK32-IZHINXMIN %s
40 ; RUN: llc -mtriple=riscv64 -mattr=+zhinxmin -verify-machineinstrs \
41 ; RUN:   -target-abi lp64 < %s | FileCheck -check-prefixes=CHECK64-IZHINXMIN %s
42 ; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zhinxmin -verify-machineinstrs \
43 ; RUN:   -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECK32-IZDINXZHINXMIN %s
44 ; RUN: llc -mtriple=riscv64 -mattr=+zdinx,+zhinxmin -verify-machineinstrs \
45 ; RUN:   -target-abi lp64 < %s | FileCheck -check-prefixes=CHECK64-IZDINXZHINXMIN %s
47 define i16 @fcvt_si_h(half %a) nounwind {
48 ; RV32IZFH-LABEL: fcvt_si_h:
49 ; RV32IZFH:       # %bb.0:
50 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rtz
51 ; RV32IZFH-NEXT:    ret
53 ; RV64IZFH-LABEL: fcvt_si_h:
54 ; RV64IZFH:       # %bb.0:
55 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
56 ; RV64IZFH-NEXT:    ret
58 ; RV32IDZFH-LABEL: fcvt_si_h:
59 ; RV32IDZFH:       # %bb.0:
60 ; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
61 ; RV32IDZFH-NEXT:    ret
63 ; RV64IDZFH-LABEL: fcvt_si_h:
64 ; RV64IDZFH:       # %bb.0:
65 ; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
66 ; RV64IDZFH-NEXT:    ret
68 ; RV32IZHINX-LABEL: fcvt_si_h:
69 ; RV32IZHINX:       # %bb.0:
70 ; RV32IZHINX-NEXT:    fcvt.w.h a0, a0, rtz
71 ; RV32IZHINX-NEXT:    ret
73 ; RV64IZHINX-LABEL: fcvt_si_h:
74 ; RV64IZHINX:       # %bb.0:
75 ; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
76 ; RV64IZHINX-NEXT:    ret
78 ; RV32IZDINXZHINX-LABEL: fcvt_si_h:
79 ; RV32IZDINXZHINX:       # %bb.0:
80 ; RV32IZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
81 ; RV32IZDINXZHINX-NEXT:    ret
83 ; RV64IZDINXZHINX-LABEL: fcvt_si_h:
84 ; RV64IZDINXZHINX:       # %bb.0:
85 ; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
86 ; RV64IZDINXZHINX-NEXT:    ret
88 ; RV32I-LABEL: fcvt_si_h:
89 ; RV32I:       # %bb.0:
90 ; RV32I-NEXT:    addi sp, sp, -16
91 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
92 ; RV32I-NEXT:    slli a0, a0, 16
93 ; RV32I-NEXT:    srli a0, a0, 16
94 ; RV32I-NEXT:    call __extendhfsf2
95 ; RV32I-NEXT:    call __fixsfsi
96 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
97 ; RV32I-NEXT:    addi sp, sp, 16
98 ; RV32I-NEXT:    ret
100 ; RV64I-LABEL: fcvt_si_h:
101 ; RV64I:       # %bb.0:
102 ; RV64I-NEXT:    addi sp, sp, -16
103 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
104 ; RV64I-NEXT:    slli a0, a0, 48
105 ; RV64I-NEXT:    srli a0, a0, 48
106 ; RV64I-NEXT:    call __extendhfsf2
107 ; RV64I-NEXT:    call __fixsfdi
108 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
109 ; RV64I-NEXT:    addi sp, sp, 16
110 ; RV64I-NEXT:    ret
112 ; RV32ID-ILP32-LABEL: fcvt_si_h:
113 ; RV32ID-ILP32:       # %bb.0:
114 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
115 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
116 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
117 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
118 ; RV32ID-ILP32-NEXT:    fcvt.w.s a0, fa5, rtz
119 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
120 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
121 ; RV32ID-ILP32-NEXT:    ret
123 ; RV64ID-LP64-LABEL: fcvt_si_h:
124 ; RV64ID-LP64:       # %bb.0:
125 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
126 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
127 ; RV64ID-LP64-NEXT:    call __extendhfsf2
128 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
129 ; RV64ID-LP64-NEXT:    fcvt.l.s a0, fa5, rtz
130 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
131 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
132 ; RV64ID-LP64-NEXT:    ret
134 ; RV32ID-LABEL: fcvt_si_h:
135 ; RV32ID:       # %bb.0:
136 ; RV32ID-NEXT:    addi sp, sp, -16
137 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
138 ; RV32ID-NEXT:    call __extendhfsf2
139 ; RV32ID-NEXT:    fcvt.w.s a0, fa0, rtz
140 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
141 ; RV32ID-NEXT:    addi sp, sp, 16
142 ; RV32ID-NEXT:    ret
144 ; RV64ID-LABEL: fcvt_si_h:
145 ; RV64ID:       # %bb.0:
146 ; RV64ID-NEXT:    addi sp, sp, -16
147 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
148 ; RV64ID-NEXT:    call __extendhfsf2
149 ; RV64ID-NEXT:    fcvt.l.s a0, fa0, rtz
150 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
151 ; RV64ID-NEXT:    addi sp, sp, 16
152 ; RV64ID-NEXT:    ret
154 ; CHECK32-IZFHMIN-LABEL: fcvt_si_h:
155 ; CHECK32-IZFHMIN:       # %bb.0:
156 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
157 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
158 ; CHECK32-IZFHMIN-NEXT:    ret
160 ; CHECK64-IZFHMIN-LABEL: fcvt_si_h:
161 ; CHECK64-IZFHMIN:       # %bb.0:
162 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
163 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a0, fa5, rtz
164 ; CHECK64-IZFHMIN-NEXT:    ret
166 ; CHECK32-IZHINXMIN-LABEL: fcvt_si_h:
167 ; CHECK32-IZHINXMIN:       # %bb.0:
168 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
169 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
170 ; CHECK32-IZHINXMIN-NEXT:    ret
172 ; CHECK64-IZHINXMIN-LABEL: fcvt_si_h:
173 ; CHECK64-IZHINXMIN:       # %bb.0:
174 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
175 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
176 ; CHECK64-IZHINXMIN-NEXT:    ret
178 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_si_h:
179 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
180 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
181 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
182 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
184 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_si_h:
185 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
186 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
187 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
188 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
189   %1 = fptosi half %a to i16
190   ret i16 %1
193 define i16 @fcvt_si_h_sat(half %a) nounwind {
194 ; RV32IZFH-LABEL: fcvt_si_h_sat:
195 ; RV32IZFH:       # %bb.0: # %start
196 ; RV32IZFH-NEXT:    fcvt.s.h fa5, fa0
197 ; RV32IZFH-NEXT:    lui a0, %hi(.LCPI1_0)
198 ; RV32IZFH-NEXT:    feq.s a1, fa5, fa5
199 ; RV32IZFH-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
200 ; RV32IZFH-NEXT:    lui a0, 815104
201 ; RV32IZFH-NEXT:    fmv.w.x fa3, a0
202 ; RV32IZFH-NEXT:    fmax.s fa5, fa5, fa3
203 ; RV32IZFH-NEXT:    neg a0, a1
204 ; RV32IZFH-NEXT:    fmin.s fa5, fa5, fa4
205 ; RV32IZFH-NEXT:    fcvt.w.s a1, fa5, rtz
206 ; RV32IZFH-NEXT:    and a0, a0, a1
207 ; RV32IZFH-NEXT:    ret
209 ; RV64IZFH-LABEL: fcvt_si_h_sat:
210 ; RV64IZFH:       # %bb.0: # %start
211 ; RV64IZFH-NEXT:    fcvt.s.h fa5, fa0
212 ; RV64IZFH-NEXT:    lui a0, %hi(.LCPI1_0)
213 ; RV64IZFH-NEXT:    feq.s a1, fa5, fa5
214 ; RV64IZFH-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
215 ; RV64IZFH-NEXT:    lui a0, 815104
216 ; RV64IZFH-NEXT:    fmv.w.x fa3, a0
217 ; RV64IZFH-NEXT:    fmax.s fa5, fa5, fa3
218 ; RV64IZFH-NEXT:    neg a0, a1
219 ; RV64IZFH-NEXT:    fmin.s fa5, fa5, fa4
220 ; RV64IZFH-NEXT:    fcvt.l.s a1, fa5, rtz
221 ; RV64IZFH-NEXT:    and a0, a0, a1
222 ; RV64IZFH-NEXT:    ret
224 ; RV32IDZFH-LABEL: fcvt_si_h_sat:
225 ; RV32IDZFH:       # %bb.0: # %start
226 ; RV32IDZFH-NEXT:    fcvt.s.h fa5, fa0
227 ; RV32IDZFH-NEXT:    lui a0, %hi(.LCPI1_0)
228 ; RV32IDZFH-NEXT:    feq.s a1, fa5, fa5
229 ; RV32IDZFH-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
230 ; RV32IDZFH-NEXT:    lui a0, 815104
231 ; RV32IDZFH-NEXT:    fmv.w.x fa3, a0
232 ; RV32IDZFH-NEXT:    fmax.s fa5, fa5, fa3
233 ; RV32IDZFH-NEXT:    neg a0, a1
234 ; RV32IDZFH-NEXT:    fmin.s fa5, fa5, fa4
235 ; RV32IDZFH-NEXT:    fcvt.w.s a1, fa5, rtz
236 ; RV32IDZFH-NEXT:    and a0, a0, a1
237 ; RV32IDZFH-NEXT:    ret
239 ; RV64IDZFH-LABEL: fcvt_si_h_sat:
240 ; RV64IDZFH:       # %bb.0: # %start
241 ; RV64IDZFH-NEXT:    fcvt.s.h fa5, fa0
242 ; RV64IDZFH-NEXT:    lui a0, %hi(.LCPI1_0)
243 ; RV64IDZFH-NEXT:    feq.s a1, fa5, fa5
244 ; RV64IDZFH-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
245 ; RV64IDZFH-NEXT:    lui a0, 815104
246 ; RV64IDZFH-NEXT:    fmv.w.x fa3, a0
247 ; RV64IDZFH-NEXT:    fmax.s fa5, fa5, fa3
248 ; RV64IDZFH-NEXT:    neg a0, a1
249 ; RV64IDZFH-NEXT:    fmin.s fa5, fa5, fa4
250 ; RV64IDZFH-NEXT:    fcvt.l.s a1, fa5, rtz
251 ; RV64IDZFH-NEXT:    and a0, a0, a1
252 ; RV64IDZFH-NEXT:    ret
254 ; RV32IZHINX-LABEL: fcvt_si_h_sat:
255 ; RV32IZHINX:       # %bb.0: # %start
256 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
257 ; RV32IZHINX-NEXT:    lui a1, 815104
258 ; RV32IZHINX-NEXT:    lui a2, 290816
259 ; RV32IZHINX-NEXT:    fmax.s a1, a0, a1
260 ; RV32IZHINX-NEXT:    feq.s a0, a0, a0
261 ; RV32IZHINX-NEXT:    addi a2, a2, -512
262 ; RV32IZHINX-NEXT:    neg a0, a0
263 ; RV32IZHINX-NEXT:    fmin.s a1, a1, a2
264 ; RV32IZHINX-NEXT:    fcvt.w.s a1, a1, rtz
265 ; RV32IZHINX-NEXT:    and a0, a0, a1
266 ; RV32IZHINX-NEXT:    ret
268 ; RV64IZHINX-LABEL: fcvt_si_h_sat:
269 ; RV64IZHINX:       # %bb.0: # %start
270 ; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
271 ; RV64IZHINX-NEXT:    lui a1, 815104
272 ; RV64IZHINX-NEXT:    lui a2, 290816
273 ; RV64IZHINX-NEXT:    fmax.s a1, a0, a1
274 ; RV64IZHINX-NEXT:    feq.s a0, a0, a0
275 ; RV64IZHINX-NEXT:    addiw a2, a2, -512
276 ; RV64IZHINX-NEXT:    neg a0, a0
277 ; RV64IZHINX-NEXT:    fmin.s a1, a1, a2
278 ; RV64IZHINX-NEXT:    fcvt.l.s a1, a1, rtz
279 ; RV64IZHINX-NEXT:    and a0, a0, a1
280 ; RV64IZHINX-NEXT:    ret
282 ; RV32IZDINXZHINX-LABEL: fcvt_si_h_sat:
283 ; RV32IZDINXZHINX:       # %bb.0: # %start
284 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
285 ; RV32IZDINXZHINX-NEXT:    lui a1, 815104
286 ; RV32IZDINXZHINX-NEXT:    lui a2, 290816
287 ; RV32IZDINXZHINX-NEXT:    fmax.s a1, a0, a1
288 ; RV32IZDINXZHINX-NEXT:    feq.s a0, a0, a0
289 ; RV32IZDINXZHINX-NEXT:    addi a2, a2, -512
290 ; RV32IZDINXZHINX-NEXT:    neg a0, a0
291 ; RV32IZDINXZHINX-NEXT:    fmin.s a1, a1, a2
292 ; RV32IZDINXZHINX-NEXT:    fcvt.w.s a1, a1, rtz
293 ; RV32IZDINXZHINX-NEXT:    and a0, a0, a1
294 ; RV32IZDINXZHINX-NEXT:    ret
296 ; RV64IZDINXZHINX-LABEL: fcvt_si_h_sat:
297 ; RV64IZDINXZHINX:       # %bb.0: # %start
298 ; RV64IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
299 ; RV64IZDINXZHINX-NEXT:    lui a1, 815104
300 ; RV64IZDINXZHINX-NEXT:    lui a2, 290816
301 ; RV64IZDINXZHINX-NEXT:    fmax.s a1, a0, a1
302 ; RV64IZDINXZHINX-NEXT:    feq.s a0, a0, a0
303 ; RV64IZDINXZHINX-NEXT:    addiw a2, a2, -512
304 ; RV64IZDINXZHINX-NEXT:    neg a0, a0
305 ; RV64IZDINXZHINX-NEXT:    fmin.s a1, a1, a2
306 ; RV64IZDINXZHINX-NEXT:    fcvt.l.s a1, a1, rtz
307 ; RV64IZDINXZHINX-NEXT:    and a0, a0, a1
308 ; RV64IZDINXZHINX-NEXT:    ret
310 ; RV32I-LABEL: fcvt_si_h_sat:
311 ; RV32I:       # %bb.0: # %start
312 ; RV32I-NEXT:    addi sp, sp, -16
313 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
314 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
315 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
316 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
317 ; RV32I-NEXT:    slli a0, a0, 16
318 ; RV32I-NEXT:    srli a0, a0, 16
319 ; RV32I-NEXT:    call __extendhfsf2
320 ; RV32I-NEXT:    mv s0, a0
321 ; RV32I-NEXT:    lui a1, 815104
322 ; RV32I-NEXT:    call __gesf2
323 ; RV32I-NEXT:    mv s2, a0
324 ; RV32I-NEXT:    mv a0, s0
325 ; RV32I-NEXT:    call __fixsfsi
326 ; RV32I-NEXT:    mv s1, a0
327 ; RV32I-NEXT:    bgez s2, .LBB1_2
328 ; RV32I-NEXT:  # %bb.1: # %start
329 ; RV32I-NEXT:    lui s1, 1048568
330 ; RV32I-NEXT:  .LBB1_2: # %start
331 ; RV32I-NEXT:    lui a0, 290816
332 ; RV32I-NEXT:    addi a1, a0, -512
333 ; RV32I-NEXT:    mv a0, s0
334 ; RV32I-NEXT:    call __gtsf2
335 ; RV32I-NEXT:    blez a0, .LBB1_4
336 ; RV32I-NEXT:  # %bb.3: # %start
337 ; RV32I-NEXT:    lui s1, 8
338 ; RV32I-NEXT:    addi s1, s1, -1
339 ; RV32I-NEXT:  .LBB1_4: # %start
340 ; RV32I-NEXT:    mv a0, s0
341 ; RV32I-NEXT:    mv a1, s0
342 ; RV32I-NEXT:    call __unordsf2
343 ; RV32I-NEXT:    snez a0, a0
344 ; RV32I-NEXT:    addi a0, a0, -1
345 ; RV32I-NEXT:    and a0, a0, s1
346 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
347 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
348 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
349 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
350 ; RV32I-NEXT:    addi sp, sp, 16
351 ; RV32I-NEXT:    ret
353 ; RV64I-LABEL: fcvt_si_h_sat:
354 ; RV64I:       # %bb.0: # %start
355 ; RV64I-NEXT:    addi sp, sp, -32
356 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
357 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
358 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
359 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
360 ; RV64I-NEXT:    slli a0, a0, 48
361 ; RV64I-NEXT:    srli a0, a0, 48
362 ; RV64I-NEXT:    call __extendhfsf2
363 ; RV64I-NEXT:    mv s0, a0
364 ; RV64I-NEXT:    lui a1, 815104
365 ; RV64I-NEXT:    call __gesf2
366 ; RV64I-NEXT:    mv s2, a0
367 ; RV64I-NEXT:    mv a0, s0
368 ; RV64I-NEXT:    call __fixsfdi
369 ; RV64I-NEXT:    mv s1, a0
370 ; RV64I-NEXT:    bgez s2, .LBB1_2
371 ; RV64I-NEXT:  # %bb.1: # %start
372 ; RV64I-NEXT:    lui s1, 1048568
373 ; RV64I-NEXT:  .LBB1_2: # %start
374 ; RV64I-NEXT:    lui a0, 290816
375 ; RV64I-NEXT:    addiw a1, a0, -512
376 ; RV64I-NEXT:    mv a0, s0
377 ; RV64I-NEXT:    call __gtsf2
378 ; RV64I-NEXT:    blez a0, .LBB1_4
379 ; RV64I-NEXT:  # %bb.3: # %start
380 ; RV64I-NEXT:    lui s1, 8
381 ; RV64I-NEXT:    addiw s1, s1, -1
382 ; RV64I-NEXT:  .LBB1_4: # %start
383 ; RV64I-NEXT:    mv a0, s0
384 ; RV64I-NEXT:    mv a1, s0
385 ; RV64I-NEXT:    call __unordsf2
386 ; RV64I-NEXT:    snez a0, a0
387 ; RV64I-NEXT:    addi a0, a0, -1
388 ; RV64I-NEXT:    and a0, a0, s1
389 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
390 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
391 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
392 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
393 ; RV64I-NEXT:    addi sp, sp, 32
394 ; RV64I-NEXT:    ret
396 ; RV32ID-ILP32-LABEL: fcvt_si_h_sat:
397 ; RV32ID-ILP32:       # %bb.0: # %start
398 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
399 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
400 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
401 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
402 ; RV32ID-ILP32-NEXT:    lui a0, %hi(.LCPI1_0)
403 ; RV32ID-ILP32-NEXT:    feq.s a1, fa5, fa5
404 ; RV32ID-ILP32-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
405 ; RV32ID-ILP32-NEXT:    lui a0, 815104
406 ; RV32ID-ILP32-NEXT:    fmv.w.x fa3, a0
407 ; RV32ID-ILP32-NEXT:    fmax.s fa5, fa5, fa3
408 ; RV32ID-ILP32-NEXT:    neg a0, a1
409 ; RV32ID-ILP32-NEXT:    fmin.s fa5, fa5, fa4
410 ; RV32ID-ILP32-NEXT:    fcvt.w.s a1, fa5, rtz
411 ; RV32ID-ILP32-NEXT:    and a0, a0, a1
412 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
413 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
414 ; RV32ID-ILP32-NEXT:    ret
416 ; RV64ID-LP64-LABEL: fcvt_si_h_sat:
417 ; RV64ID-LP64:       # %bb.0: # %start
418 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
419 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
420 ; RV64ID-LP64-NEXT:    call __extendhfsf2
421 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
422 ; RV64ID-LP64-NEXT:    lui a0, %hi(.LCPI1_0)
423 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
424 ; RV64ID-LP64-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
425 ; RV64ID-LP64-NEXT:    lui a0, 815104
426 ; RV64ID-LP64-NEXT:    fmv.w.x fa3, a0
427 ; RV64ID-LP64-NEXT:    fmax.s fa5, fa5, fa3
428 ; RV64ID-LP64-NEXT:    neg a0, a1
429 ; RV64ID-LP64-NEXT:    fmin.s fa5, fa5, fa4
430 ; RV64ID-LP64-NEXT:    fcvt.l.s a1, fa5, rtz
431 ; RV64ID-LP64-NEXT:    and a0, a0, a1
432 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
433 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
434 ; RV64ID-LP64-NEXT:    ret
436 ; RV32ID-LABEL: fcvt_si_h_sat:
437 ; RV32ID:       # %bb.0: # %start
438 ; RV32ID-NEXT:    addi sp, sp, -16
439 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
440 ; RV32ID-NEXT:    call __extendhfsf2
441 ; RV32ID-NEXT:    feq.s a0, fa0, fa0
442 ; RV32ID-NEXT:    lui a1, %hi(.LCPI1_0)
443 ; RV32ID-NEXT:    flw fa5, %lo(.LCPI1_0)(a1)
444 ; RV32ID-NEXT:    lui a1, 815104
445 ; RV32ID-NEXT:    fmv.w.x fa4, a1
446 ; RV32ID-NEXT:    fmax.s fa4, fa0, fa4
447 ; RV32ID-NEXT:    neg a0, a0
448 ; RV32ID-NEXT:    fmin.s fa5, fa4, fa5
449 ; RV32ID-NEXT:    fcvt.w.s a1, fa5, rtz
450 ; RV32ID-NEXT:    and a0, a0, a1
451 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
452 ; RV32ID-NEXT:    addi sp, sp, 16
453 ; RV32ID-NEXT:    ret
455 ; RV64ID-LABEL: fcvt_si_h_sat:
456 ; RV64ID:       # %bb.0: # %start
457 ; RV64ID-NEXT:    addi sp, sp, -16
458 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
459 ; RV64ID-NEXT:    call __extendhfsf2
460 ; RV64ID-NEXT:    feq.s a0, fa0, fa0
461 ; RV64ID-NEXT:    lui a1, %hi(.LCPI1_0)
462 ; RV64ID-NEXT:    flw fa5, %lo(.LCPI1_0)(a1)
463 ; RV64ID-NEXT:    lui a1, 815104
464 ; RV64ID-NEXT:    fmv.w.x fa4, a1
465 ; RV64ID-NEXT:    fmax.s fa4, fa0, fa4
466 ; RV64ID-NEXT:    neg a0, a0
467 ; RV64ID-NEXT:    fmin.s fa5, fa4, fa5
468 ; RV64ID-NEXT:    fcvt.l.s a1, fa5, rtz
469 ; RV64ID-NEXT:    and a0, a0, a1
470 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
471 ; RV64ID-NEXT:    addi sp, sp, 16
472 ; RV64ID-NEXT:    ret
474 ; CHECK32-IZFHMIN-LABEL: fcvt_si_h_sat:
475 ; CHECK32-IZFHMIN:       # %bb.0: # %start
476 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
477 ; CHECK32-IZFHMIN-NEXT:    lui a0, %hi(.LCPI1_0)
478 ; CHECK32-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
479 ; CHECK32-IZFHMIN-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
480 ; CHECK32-IZFHMIN-NEXT:    lui a0, 815104
481 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa3, a0
482 ; CHECK32-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa3
483 ; CHECK32-IZFHMIN-NEXT:    neg a0, a1
484 ; CHECK32-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
485 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a1, fa5, rtz
486 ; CHECK32-IZFHMIN-NEXT:    and a0, a0, a1
487 ; CHECK32-IZFHMIN-NEXT:    ret
489 ; CHECK64-IZFHMIN-LABEL: fcvt_si_h_sat:
490 ; CHECK64-IZFHMIN:       # %bb.0: # %start
491 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
492 ; CHECK64-IZFHMIN-NEXT:    lui a0, %hi(.LCPI1_0)
493 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
494 ; CHECK64-IZFHMIN-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
495 ; CHECK64-IZFHMIN-NEXT:    lui a0, 815104
496 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa3, a0
497 ; CHECK64-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa3
498 ; CHECK64-IZFHMIN-NEXT:    neg a0, a1
499 ; CHECK64-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
500 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a1, fa5, rtz
501 ; CHECK64-IZFHMIN-NEXT:    and a0, a0, a1
502 ; CHECK64-IZFHMIN-NEXT:    ret
504 ; CHECK32-IZHINXMIN-LABEL: fcvt_si_h_sat:
505 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
506 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
507 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 815104
508 ; CHECK32-IZHINXMIN-NEXT:    lui a2, 290816
509 ; CHECK32-IZHINXMIN-NEXT:    fmax.s a1, a0, a1
510 ; CHECK32-IZHINXMIN-NEXT:    feq.s a0, a0, a0
511 ; CHECK32-IZHINXMIN-NEXT:    addi a2, a2, -512
512 ; CHECK32-IZHINXMIN-NEXT:    neg a0, a0
513 ; CHECK32-IZHINXMIN-NEXT:    fmin.s a1, a1, a2
514 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a1, a1, rtz
515 ; CHECK32-IZHINXMIN-NEXT:    and a0, a0, a1
516 ; CHECK32-IZHINXMIN-NEXT:    ret
518 ; CHECK64-IZHINXMIN-LABEL: fcvt_si_h_sat:
519 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
520 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
521 ; CHECK64-IZHINXMIN-NEXT:    lui a1, 815104
522 ; CHECK64-IZHINXMIN-NEXT:    lui a2, 290816
523 ; CHECK64-IZHINXMIN-NEXT:    fmax.s a1, a0, a1
524 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
525 ; CHECK64-IZHINXMIN-NEXT:    addiw a2, a2, -512
526 ; CHECK64-IZHINXMIN-NEXT:    neg a0, a0
527 ; CHECK64-IZHINXMIN-NEXT:    fmin.s a1, a1, a2
528 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a1, a1, rtz
529 ; CHECK64-IZHINXMIN-NEXT:    and a0, a0, a1
530 ; CHECK64-IZHINXMIN-NEXT:    ret
532 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_si_h_sat:
533 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
534 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
535 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 815104
536 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a2, 290816
537 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmax.s a1, a0, a1
538 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
539 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a2, a2, -512
540 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg a0, a0
541 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmin.s a1, a1, a2
542 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a1, a1, rtz
543 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
544 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
546 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_si_h_sat:
547 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
548 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
549 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a1, 815104
550 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a2, 290816
551 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmax.s a1, a0, a1
552 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
553 ; CHECK64-IZDINXZHINXMIN-NEXT:    addiw a2, a2, -512
554 ; CHECK64-IZDINXZHINXMIN-NEXT:    neg a0, a0
555 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmin.s a1, a1, a2
556 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a1, a1, rtz
557 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
558 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
559 start:
560   %0 = tail call i16 @llvm.fptosi.sat.i16.f16(half %a)
561   ret i16 %0
563 declare i16 @llvm.fptosi.sat.i16.f16(half)
565 define i16 @fcvt_ui_h(half %a) nounwind {
566 ; RV32IZFH-LABEL: fcvt_ui_h:
567 ; RV32IZFH:       # %bb.0:
568 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
569 ; RV32IZFH-NEXT:    ret
571 ; RV64IZFH-LABEL: fcvt_ui_h:
572 ; RV64IZFH:       # %bb.0:
573 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
574 ; RV64IZFH-NEXT:    ret
576 ; RV32IDZFH-LABEL: fcvt_ui_h:
577 ; RV32IDZFH:       # %bb.0:
578 ; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
579 ; RV32IDZFH-NEXT:    ret
581 ; RV64IDZFH-LABEL: fcvt_ui_h:
582 ; RV64IDZFH:       # %bb.0:
583 ; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
584 ; RV64IDZFH-NEXT:    ret
586 ; RV32IZHINX-LABEL: fcvt_ui_h:
587 ; RV32IZHINX:       # %bb.0:
588 ; RV32IZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
589 ; RV32IZHINX-NEXT:    ret
591 ; RV64IZHINX-LABEL: fcvt_ui_h:
592 ; RV64IZHINX:       # %bb.0:
593 ; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
594 ; RV64IZHINX-NEXT:    ret
596 ; RV32IZDINXZHINX-LABEL: fcvt_ui_h:
597 ; RV32IZDINXZHINX:       # %bb.0:
598 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
599 ; RV32IZDINXZHINX-NEXT:    ret
601 ; RV64IZDINXZHINX-LABEL: fcvt_ui_h:
602 ; RV64IZDINXZHINX:       # %bb.0:
603 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
604 ; RV64IZDINXZHINX-NEXT:    ret
606 ; RV32I-LABEL: fcvt_ui_h:
607 ; RV32I:       # %bb.0:
608 ; RV32I-NEXT:    addi sp, sp, -16
609 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
610 ; RV32I-NEXT:    slli a0, a0, 16
611 ; RV32I-NEXT:    srli a0, a0, 16
612 ; RV32I-NEXT:    call __extendhfsf2
613 ; RV32I-NEXT:    call __fixunssfsi
614 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
615 ; RV32I-NEXT:    addi sp, sp, 16
616 ; RV32I-NEXT:    ret
618 ; RV64I-LABEL: fcvt_ui_h:
619 ; RV64I:       # %bb.0:
620 ; RV64I-NEXT:    addi sp, sp, -16
621 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
622 ; RV64I-NEXT:    slli a0, a0, 48
623 ; RV64I-NEXT:    srli a0, a0, 48
624 ; RV64I-NEXT:    call __extendhfsf2
625 ; RV64I-NEXT:    call __fixunssfdi
626 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
627 ; RV64I-NEXT:    addi sp, sp, 16
628 ; RV64I-NEXT:    ret
630 ; RV32ID-ILP32-LABEL: fcvt_ui_h:
631 ; RV32ID-ILP32:       # %bb.0:
632 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
633 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
634 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
635 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
636 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
637 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
638 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
639 ; RV32ID-ILP32-NEXT:    ret
641 ; RV64ID-LP64-LABEL: fcvt_ui_h:
642 ; RV64ID-LP64:       # %bb.0:
643 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
644 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
645 ; RV64ID-LP64-NEXT:    call __extendhfsf2
646 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
647 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
648 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
649 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
650 ; RV64ID-LP64-NEXT:    ret
652 ; RV32ID-LABEL: fcvt_ui_h:
653 ; RV32ID:       # %bb.0:
654 ; RV32ID-NEXT:    addi sp, sp, -16
655 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
656 ; RV32ID-NEXT:    call __extendhfsf2
657 ; RV32ID-NEXT:    fcvt.wu.s a0, fa0, rtz
658 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
659 ; RV32ID-NEXT:    addi sp, sp, 16
660 ; RV32ID-NEXT:    ret
662 ; RV64ID-LABEL: fcvt_ui_h:
663 ; RV64ID:       # %bb.0:
664 ; RV64ID-NEXT:    addi sp, sp, -16
665 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
666 ; RV64ID-NEXT:    call __extendhfsf2
667 ; RV64ID-NEXT:    fcvt.lu.s a0, fa0, rtz
668 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
669 ; RV64ID-NEXT:    addi sp, sp, 16
670 ; RV64ID-NEXT:    ret
672 ; CHECK32-IZFHMIN-LABEL: fcvt_ui_h:
673 ; CHECK32-IZFHMIN:       # %bb.0:
674 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
675 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
676 ; CHECK32-IZFHMIN-NEXT:    ret
678 ; CHECK64-IZFHMIN-LABEL: fcvt_ui_h:
679 ; CHECK64-IZFHMIN:       # %bb.0:
680 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
681 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a0, fa5, rtz
682 ; CHECK64-IZFHMIN-NEXT:    ret
684 ; CHECK32-IZHINXMIN-LABEL: fcvt_ui_h:
685 ; CHECK32-IZHINXMIN:       # %bb.0:
686 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
687 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
688 ; CHECK32-IZHINXMIN-NEXT:    ret
690 ; CHECK64-IZHINXMIN-LABEL: fcvt_ui_h:
691 ; CHECK64-IZHINXMIN:       # %bb.0:
692 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
693 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
694 ; CHECK64-IZHINXMIN-NEXT:    ret
696 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_ui_h:
697 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
698 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
699 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
700 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
702 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_ui_h:
703 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
704 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
705 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
706 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
707   %1 = fptoui half %a to i16
708   ret i16 %1
711 define i16 @fcvt_ui_h_sat(half %a) nounwind {
712 ; RV32IZFH-LABEL: fcvt_ui_h_sat:
713 ; RV32IZFH:       # %bb.0: # %start
714 ; RV32IZFH-NEXT:    lui a0, %hi(.LCPI3_0)
715 ; RV32IZFH-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
716 ; RV32IZFH-NEXT:    fcvt.s.h fa4, fa0
717 ; RV32IZFH-NEXT:    fmv.w.x fa3, zero
718 ; RV32IZFH-NEXT:    fmax.s fa4, fa4, fa3
719 ; RV32IZFH-NEXT:    fmin.s fa5, fa4, fa5
720 ; RV32IZFH-NEXT:    fcvt.wu.s a0, fa5, rtz
721 ; RV32IZFH-NEXT:    ret
723 ; RV64IZFH-LABEL: fcvt_ui_h_sat:
724 ; RV64IZFH:       # %bb.0: # %start
725 ; RV64IZFH-NEXT:    lui a0, %hi(.LCPI3_0)
726 ; RV64IZFH-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
727 ; RV64IZFH-NEXT:    fcvt.s.h fa4, fa0
728 ; RV64IZFH-NEXT:    fmv.w.x fa3, zero
729 ; RV64IZFH-NEXT:    fmax.s fa4, fa4, fa3
730 ; RV64IZFH-NEXT:    fmin.s fa5, fa4, fa5
731 ; RV64IZFH-NEXT:    fcvt.lu.s a0, fa5, rtz
732 ; RV64IZFH-NEXT:    ret
734 ; RV32IDZFH-LABEL: fcvt_ui_h_sat:
735 ; RV32IDZFH:       # %bb.0: # %start
736 ; RV32IDZFH-NEXT:    lui a0, %hi(.LCPI3_0)
737 ; RV32IDZFH-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
738 ; RV32IDZFH-NEXT:    fcvt.s.h fa4, fa0
739 ; RV32IDZFH-NEXT:    fmv.w.x fa3, zero
740 ; RV32IDZFH-NEXT:    fmax.s fa4, fa4, fa3
741 ; RV32IDZFH-NEXT:    fmin.s fa5, fa4, fa5
742 ; RV32IDZFH-NEXT:    fcvt.wu.s a0, fa5, rtz
743 ; RV32IDZFH-NEXT:    ret
745 ; RV64IDZFH-LABEL: fcvt_ui_h_sat:
746 ; RV64IDZFH:       # %bb.0: # %start
747 ; RV64IDZFH-NEXT:    lui a0, %hi(.LCPI3_0)
748 ; RV64IDZFH-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
749 ; RV64IDZFH-NEXT:    fcvt.s.h fa4, fa0
750 ; RV64IDZFH-NEXT:    fmv.w.x fa3, zero
751 ; RV64IDZFH-NEXT:    fmax.s fa4, fa4, fa3
752 ; RV64IDZFH-NEXT:    fmin.s fa5, fa4, fa5
753 ; RV64IDZFH-NEXT:    fcvt.lu.s a0, fa5, rtz
754 ; RV64IDZFH-NEXT:    ret
756 ; RV32IZHINX-LABEL: fcvt_ui_h_sat:
757 ; RV32IZHINX:       # %bb.0: # %start
758 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
759 ; RV32IZHINX-NEXT:    lui a1, 292864
760 ; RV32IZHINX-NEXT:    fmax.s a0, a0, zero
761 ; RV32IZHINX-NEXT:    addi a1, a1, -256
762 ; RV32IZHINX-NEXT:    fmin.s a0, a0, a1
763 ; RV32IZHINX-NEXT:    fcvt.wu.s a0, a0, rtz
764 ; RV32IZHINX-NEXT:    ret
766 ; RV64IZHINX-LABEL: fcvt_ui_h_sat:
767 ; RV64IZHINX:       # %bb.0: # %start
768 ; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
769 ; RV64IZHINX-NEXT:    lui a1, 292864
770 ; RV64IZHINX-NEXT:    fmax.s a0, a0, zero
771 ; RV64IZHINX-NEXT:    addiw a1, a1, -256
772 ; RV64IZHINX-NEXT:    fmin.s a0, a0, a1
773 ; RV64IZHINX-NEXT:    fcvt.lu.s a0, a0, rtz
774 ; RV64IZHINX-NEXT:    ret
776 ; RV32IZDINXZHINX-LABEL: fcvt_ui_h_sat:
777 ; RV32IZDINXZHINX:       # %bb.0: # %start
778 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
779 ; RV32IZDINXZHINX-NEXT:    lui a1, 292864
780 ; RV32IZDINXZHINX-NEXT:    fmax.s a0, a0, zero
781 ; RV32IZDINXZHINX-NEXT:    addi a1, a1, -256
782 ; RV32IZDINXZHINX-NEXT:    fmin.s a0, a0, a1
783 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.s a0, a0, rtz
784 ; RV32IZDINXZHINX-NEXT:    ret
786 ; RV64IZDINXZHINX-LABEL: fcvt_ui_h_sat:
787 ; RV64IZDINXZHINX:       # %bb.0: # %start
788 ; RV64IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
789 ; RV64IZDINXZHINX-NEXT:    lui a1, 292864
790 ; RV64IZDINXZHINX-NEXT:    fmax.s a0, a0, zero
791 ; RV64IZDINXZHINX-NEXT:    addiw a1, a1, -256
792 ; RV64IZDINXZHINX-NEXT:    fmin.s a0, a0, a1
793 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.s a0, a0, rtz
794 ; RV64IZDINXZHINX-NEXT:    ret
796 ; RV32I-LABEL: fcvt_ui_h_sat:
797 ; RV32I:       # %bb.0: # %start
798 ; RV32I-NEXT:    addi sp, sp, -32
799 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
800 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
801 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
802 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
803 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
804 ; RV32I-NEXT:    lui s0, 16
805 ; RV32I-NEXT:    addi s0, s0, -1
806 ; RV32I-NEXT:    and a0, a0, s0
807 ; RV32I-NEXT:    call __extendhfsf2
808 ; RV32I-NEXT:    mv s3, a0
809 ; RV32I-NEXT:    call __fixunssfsi
810 ; RV32I-NEXT:    mv s1, a0
811 ; RV32I-NEXT:    mv a0, s3
812 ; RV32I-NEXT:    li a1, 0
813 ; RV32I-NEXT:    call __gesf2
814 ; RV32I-NEXT:    mv s2, a0
815 ; RV32I-NEXT:    lui a0, 292864
816 ; RV32I-NEXT:    addi a1, a0, -256
817 ; RV32I-NEXT:    mv a0, s3
818 ; RV32I-NEXT:    call __gtsf2
819 ; RV32I-NEXT:    bgtz a0, .LBB3_2
820 ; RV32I-NEXT:  # %bb.1:
821 ; RV32I-NEXT:    slti a0, s2, 0
822 ; RV32I-NEXT:    addi a0, a0, -1
823 ; RV32I-NEXT:    and s0, a0, s1
824 ; RV32I-NEXT:  .LBB3_2: # %start
825 ; RV32I-NEXT:    mv a0, s0
826 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
827 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
828 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
829 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
830 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
831 ; RV32I-NEXT:    addi sp, sp, 32
832 ; RV32I-NEXT:    ret
834 ; RV64I-LABEL: fcvt_ui_h_sat:
835 ; RV64I:       # %bb.0: # %start
836 ; RV64I-NEXT:    addi sp, sp, -48
837 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
838 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
839 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
840 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
841 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
842 ; RV64I-NEXT:    lui s0, 16
843 ; RV64I-NEXT:    addiw s0, s0, -1
844 ; RV64I-NEXT:    and a0, a0, s0
845 ; RV64I-NEXT:    call __extendhfsf2
846 ; RV64I-NEXT:    mv s3, a0
847 ; RV64I-NEXT:    call __fixunssfdi
848 ; RV64I-NEXT:    mv s1, a0
849 ; RV64I-NEXT:    mv a0, s3
850 ; RV64I-NEXT:    li a1, 0
851 ; RV64I-NEXT:    call __gesf2
852 ; RV64I-NEXT:    mv s2, a0
853 ; RV64I-NEXT:    lui a0, 292864
854 ; RV64I-NEXT:    addiw a1, a0, -256
855 ; RV64I-NEXT:    mv a0, s3
856 ; RV64I-NEXT:    call __gtsf2
857 ; RV64I-NEXT:    bgtz a0, .LBB3_2
858 ; RV64I-NEXT:  # %bb.1:
859 ; RV64I-NEXT:    slti a0, s2, 0
860 ; RV64I-NEXT:    addi a0, a0, -1
861 ; RV64I-NEXT:    and s0, a0, s1
862 ; RV64I-NEXT:  .LBB3_2: # %start
863 ; RV64I-NEXT:    mv a0, s0
864 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
865 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
866 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
867 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
868 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
869 ; RV64I-NEXT:    addi sp, sp, 48
870 ; RV64I-NEXT:    ret
872 ; RV32ID-ILP32-LABEL: fcvt_ui_h_sat:
873 ; RV32ID-ILP32:       # %bb.0: # %start
874 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
875 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
876 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
877 ; RV32ID-ILP32-NEXT:    lui a1, %hi(.LCPI3_0)
878 ; RV32ID-ILP32-NEXT:    flw fa5, %lo(.LCPI3_0)(a1)
879 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
880 ; RV32ID-ILP32-NEXT:    fmv.w.x fa3, zero
881 ; RV32ID-ILP32-NEXT:    fmax.s fa4, fa4, fa3
882 ; RV32ID-ILP32-NEXT:    fmin.s fa5, fa4, fa5
883 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
884 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
885 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
886 ; RV32ID-ILP32-NEXT:    ret
888 ; RV64ID-LP64-LABEL: fcvt_ui_h_sat:
889 ; RV64ID-LP64:       # %bb.0: # %start
890 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
891 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
892 ; RV64ID-LP64-NEXT:    call __extendhfsf2
893 ; RV64ID-LP64-NEXT:    lui a1, %hi(.LCPI3_0)
894 ; RV64ID-LP64-NEXT:    flw fa5, %lo(.LCPI3_0)(a1)
895 ; RV64ID-LP64-NEXT:    fmv.w.x fa4, a0
896 ; RV64ID-LP64-NEXT:    fmv.w.x fa3, zero
897 ; RV64ID-LP64-NEXT:    fmax.s fa4, fa4, fa3
898 ; RV64ID-LP64-NEXT:    fmin.s fa5, fa4, fa5
899 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
900 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
901 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
902 ; RV64ID-LP64-NEXT:    ret
904 ; RV32ID-LABEL: fcvt_ui_h_sat:
905 ; RV32ID:       # %bb.0: # %start
906 ; RV32ID-NEXT:    addi sp, sp, -16
907 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
908 ; RV32ID-NEXT:    call __extendhfsf2
909 ; RV32ID-NEXT:    lui a0, %hi(.LCPI3_0)
910 ; RV32ID-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
911 ; RV32ID-NEXT:    fmv.w.x fa4, zero
912 ; RV32ID-NEXT:    fmax.s fa4, fa0, fa4
913 ; RV32ID-NEXT:    fmin.s fa5, fa4, fa5
914 ; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
915 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
916 ; RV32ID-NEXT:    addi sp, sp, 16
917 ; RV32ID-NEXT:    ret
919 ; RV64ID-LABEL: fcvt_ui_h_sat:
920 ; RV64ID:       # %bb.0: # %start
921 ; RV64ID-NEXT:    addi sp, sp, -16
922 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
923 ; RV64ID-NEXT:    call __extendhfsf2
924 ; RV64ID-NEXT:    lui a0, %hi(.LCPI3_0)
925 ; RV64ID-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
926 ; RV64ID-NEXT:    fmv.w.x fa4, zero
927 ; RV64ID-NEXT:    fmax.s fa4, fa0, fa4
928 ; RV64ID-NEXT:    fmin.s fa5, fa4, fa5
929 ; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
930 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
931 ; RV64ID-NEXT:    addi sp, sp, 16
932 ; RV64ID-NEXT:    ret
934 ; CHECK32-IZFHMIN-LABEL: fcvt_ui_h_sat:
935 ; CHECK32-IZFHMIN:       # %bb.0: # %start
936 ; CHECK32-IZFHMIN-NEXT:    lui a0, %hi(.LCPI3_0)
937 ; CHECK32-IZFHMIN-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
938 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa4, fa0
939 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa3, zero
940 ; CHECK32-IZFHMIN-NEXT:    fmax.s fa4, fa4, fa3
941 ; CHECK32-IZFHMIN-NEXT:    fmin.s fa5, fa4, fa5
942 ; CHECK32-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
943 ; CHECK32-IZFHMIN-NEXT:    ret
945 ; CHECK64-IZFHMIN-LABEL: fcvt_ui_h_sat:
946 ; CHECK64-IZFHMIN:       # %bb.0: # %start
947 ; CHECK64-IZFHMIN-NEXT:    lui a0, %hi(.LCPI3_0)
948 ; CHECK64-IZFHMIN-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
949 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa4, fa0
950 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa3, zero
951 ; CHECK64-IZFHMIN-NEXT:    fmax.s fa4, fa4, fa3
952 ; CHECK64-IZFHMIN-NEXT:    fmin.s fa5, fa4, fa5
953 ; CHECK64-IZFHMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
954 ; CHECK64-IZFHMIN-NEXT:    ret
956 ; CHECK32-IZHINXMIN-LABEL: fcvt_ui_h_sat:
957 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
958 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
959 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 292864
960 ; CHECK32-IZHINXMIN-NEXT:    fmax.s a0, a0, zero
961 ; CHECK32-IZHINXMIN-NEXT:    addi a1, a1, -256
962 ; CHECK32-IZHINXMIN-NEXT:    fmin.s a0, a0, a1
963 ; CHECK32-IZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
964 ; CHECK32-IZHINXMIN-NEXT:    ret
966 ; CHECK64-IZHINXMIN-LABEL: fcvt_ui_h_sat:
967 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
968 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
969 ; CHECK64-IZHINXMIN-NEXT:    lui a1, 292864
970 ; CHECK64-IZHINXMIN-NEXT:    fmax.s a0, a0, zero
971 ; CHECK64-IZHINXMIN-NEXT:    addiw a1, a1, -256
972 ; CHECK64-IZHINXMIN-NEXT:    fmin.s a0, a0, a1
973 ; CHECK64-IZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
974 ; CHECK64-IZHINXMIN-NEXT:    ret
976 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_ui_h_sat:
977 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
978 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
979 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 292864
980 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmax.s a0, a0, zero
981 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a1, a1, -256
982 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmin.s a0, a0, a1
983 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
984 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
986 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_ui_h_sat:
987 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
988 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
989 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a1, 292864
990 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmax.s a0, a0, zero
991 ; CHECK64-IZDINXZHINXMIN-NEXT:    addiw a1, a1, -256
992 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmin.s a0, a0, a1
993 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
994 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
995 start:
996   %0 = tail call i16 @llvm.fptoui.sat.i16.f16(half %a)
997   ret i16 %0
999 declare i16 @llvm.fptoui.sat.i16.f16(half)
1001 define i32 @fcvt_w_h(half %a) nounwind {
1002 ; CHECKIZFH-LABEL: fcvt_w_h:
1003 ; CHECKIZFH:       # %bb.0:
1004 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1005 ; CHECKIZFH-NEXT:    ret
1007 ; RV32IDZFH-LABEL: fcvt_w_h:
1008 ; RV32IDZFH:       # %bb.0:
1009 ; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1010 ; RV32IDZFH-NEXT:    ret
1012 ; RV64IDZFH-LABEL: fcvt_w_h:
1013 ; RV64IDZFH:       # %bb.0:
1014 ; RV64IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1015 ; RV64IDZFH-NEXT:    ret
1017 ; CHECKIZHINX-LABEL: fcvt_w_h:
1018 ; CHECKIZHINX:       # %bb.0:
1019 ; CHECKIZHINX-NEXT:    fcvt.w.h a0, a0, rtz
1020 ; CHECKIZHINX-NEXT:    ret
1022 ; CHECKIZDINXZHINX-LABEL: fcvt_w_h:
1023 ; CHECKIZDINXZHINX:       # %bb.0:
1024 ; CHECKIZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
1025 ; CHECKIZDINXZHINX-NEXT:    ret
1027 ; RV32I-LABEL: fcvt_w_h:
1028 ; RV32I:       # %bb.0:
1029 ; RV32I-NEXT:    addi sp, sp, -16
1030 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1031 ; RV32I-NEXT:    slli a0, a0, 16
1032 ; RV32I-NEXT:    srli a0, a0, 16
1033 ; RV32I-NEXT:    call __extendhfsf2
1034 ; RV32I-NEXT:    call __fixsfsi
1035 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1036 ; RV32I-NEXT:    addi sp, sp, 16
1037 ; RV32I-NEXT:    ret
1039 ; RV64I-LABEL: fcvt_w_h:
1040 ; RV64I:       # %bb.0:
1041 ; RV64I-NEXT:    addi sp, sp, -16
1042 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1043 ; RV64I-NEXT:    slli a0, a0, 48
1044 ; RV64I-NEXT:    srli a0, a0, 48
1045 ; RV64I-NEXT:    call __extendhfsf2
1046 ; RV64I-NEXT:    call __fixsfdi
1047 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1048 ; RV64I-NEXT:    addi sp, sp, 16
1049 ; RV64I-NEXT:    ret
1051 ; RV32ID-ILP32-LABEL: fcvt_w_h:
1052 ; RV32ID-ILP32:       # %bb.0:
1053 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
1054 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1055 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
1056 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
1057 ; RV32ID-ILP32-NEXT:    fcvt.w.s a0, fa5, rtz
1058 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1059 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
1060 ; RV32ID-ILP32-NEXT:    ret
1062 ; RV64ID-LP64-LABEL: fcvt_w_h:
1063 ; RV64ID-LP64:       # %bb.0:
1064 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
1065 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1066 ; RV64ID-LP64-NEXT:    call __extendhfsf2
1067 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
1068 ; RV64ID-LP64-NEXT:    fcvt.l.s a0, fa5, rtz
1069 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1070 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
1071 ; RV64ID-LP64-NEXT:    ret
1073 ; RV32ID-LABEL: fcvt_w_h:
1074 ; RV32ID:       # %bb.0:
1075 ; RV32ID-NEXT:    addi sp, sp, -16
1076 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1077 ; RV32ID-NEXT:    call __extendhfsf2
1078 ; RV32ID-NEXT:    fcvt.w.s a0, fa0, rtz
1079 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1080 ; RV32ID-NEXT:    addi sp, sp, 16
1081 ; RV32ID-NEXT:    ret
1083 ; RV64ID-LABEL: fcvt_w_h:
1084 ; RV64ID:       # %bb.0:
1085 ; RV64ID-NEXT:    addi sp, sp, -16
1086 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1087 ; RV64ID-NEXT:    call __extendhfsf2
1088 ; RV64ID-NEXT:    fcvt.l.s a0, fa0, rtz
1089 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1090 ; RV64ID-NEXT:    addi sp, sp, 16
1091 ; RV64ID-NEXT:    ret
1093 ; CHECK32-IZFHMIN-LABEL: fcvt_w_h:
1094 ; CHECK32-IZFHMIN:       # %bb.0:
1095 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1096 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1097 ; CHECK32-IZFHMIN-NEXT:    ret
1099 ; CHECK64-IZFHMIN-LABEL: fcvt_w_h:
1100 ; CHECK64-IZFHMIN:       # %bb.0:
1101 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1102 ; CHECK64-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1103 ; CHECK64-IZFHMIN-NEXT:    ret
1105 ; CHECK32-IZHINXMIN-LABEL: fcvt_w_h:
1106 ; CHECK32-IZHINXMIN:       # %bb.0:
1107 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1108 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
1109 ; CHECK32-IZHINXMIN-NEXT:    ret
1111 ; CHECK64-IZHINXMIN-LABEL: fcvt_w_h:
1112 ; CHECK64-IZHINXMIN:       # %bb.0:
1113 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1114 ; CHECK64-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
1115 ; CHECK64-IZHINXMIN-NEXT:    ret
1117 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_h:
1118 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
1119 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1120 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
1121 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
1123 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_h:
1124 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
1125 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1126 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
1127 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
1128   %1 = fptosi half %a to i32
1129   ret i32 %1
1132 define i32 @fcvt_w_h_sat(half %a) nounwind {
1133 ; CHECKIZFH-LABEL: fcvt_w_h_sat:
1134 ; CHECKIZFH:       # %bb.0: # %start
1135 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1136 ; CHECKIZFH-NEXT:    feq.h a1, fa0, fa0
1137 ; CHECKIZFH-NEXT:    seqz a1, a1
1138 ; CHECKIZFH-NEXT:    addi a1, a1, -1
1139 ; CHECKIZFH-NEXT:    and a0, a1, a0
1140 ; CHECKIZFH-NEXT:    ret
1142 ; RV32IDZFH-LABEL: fcvt_w_h_sat:
1143 ; RV32IDZFH:       # %bb.0: # %start
1144 ; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1145 ; RV32IDZFH-NEXT:    feq.h a1, fa0, fa0
1146 ; RV32IDZFH-NEXT:    seqz a1, a1
1147 ; RV32IDZFH-NEXT:    addi a1, a1, -1
1148 ; RV32IDZFH-NEXT:    and a0, a1, a0
1149 ; RV32IDZFH-NEXT:    ret
1151 ; RV64IDZFH-LABEL: fcvt_w_h_sat:
1152 ; RV64IDZFH:       # %bb.0: # %start
1153 ; RV64IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1154 ; RV64IDZFH-NEXT:    feq.h a1, fa0, fa0
1155 ; RV64IDZFH-NEXT:    seqz a1, a1
1156 ; RV64IDZFH-NEXT:    addi a1, a1, -1
1157 ; RV64IDZFH-NEXT:    and a0, a1, a0
1158 ; RV64IDZFH-NEXT:    ret
1160 ; CHECKIZHINX-LABEL: fcvt_w_h_sat:
1161 ; CHECKIZHINX:       # %bb.0: # %start
1162 ; CHECKIZHINX-NEXT:    fcvt.w.h a1, a0, rtz
1163 ; CHECKIZHINX-NEXT:    feq.h a0, a0, a0
1164 ; CHECKIZHINX-NEXT:    seqz a0, a0
1165 ; CHECKIZHINX-NEXT:    addi a0, a0, -1
1166 ; CHECKIZHINX-NEXT:    and a0, a0, a1
1167 ; CHECKIZHINX-NEXT:    ret
1169 ; CHECKIZDINXZHINX-LABEL: fcvt_w_h_sat:
1170 ; CHECKIZDINXZHINX:       # %bb.0: # %start
1171 ; CHECKIZDINXZHINX-NEXT:    fcvt.w.h a1, a0, rtz
1172 ; CHECKIZDINXZHINX-NEXT:    feq.h a0, a0, a0
1173 ; CHECKIZDINXZHINX-NEXT:    seqz a0, a0
1174 ; CHECKIZDINXZHINX-NEXT:    addi a0, a0, -1
1175 ; CHECKIZDINXZHINX-NEXT:    and a0, a0, a1
1176 ; CHECKIZDINXZHINX-NEXT:    ret
1178 ; RV32I-LABEL: fcvt_w_h_sat:
1179 ; RV32I:       # %bb.0: # %start
1180 ; RV32I-NEXT:    addi sp, sp, -32
1181 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1182 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1183 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1184 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1185 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
1186 ; RV32I-NEXT:    slli a0, a0, 16
1187 ; RV32I-NEXT:    srli a0, a0, 16
1188 ; RV32I-NEXT:    call __extendhfsf2
1189 ; RV32I-NEXT:    mv s0, a0
1190 ; RV32I-NEXT:    lui a1, 847872
1191 ; RV32I-NEXT:    call __gesf2
1192 ; RV32I-NEXT:    mv s2, a0
1193 ; RV32I-NEXT:    mv a0, s0
1194 ; RV32I-NEXT:    call __fixsfsi
1195 ; RV32I-NEXT:    mv s1, a0
1196 ; RV32I-NEXT:    lui s3, 524288
1197 ; RV32I-NEXT:    bgez s2, .LBB5_2
1198 ; RV32I-NEXT:  # %bb.1: # %start
1199 ; RV32I-NEXT:    lui s1, 524288
1200 ; RV32I-NEXT:  .LBB5_2: # %start
1201 ; RV32I-NEXT:    lui a1, 323584
1202 ; RV32I-NEXT:    addi a1, a1, -1
1203 ; RV32I-NEXT:    mv a0, s0
1204 ; RV32I-NEXT:    call __gtsf2
1205 ; RV32I-NEXT:    blez a0, .LBB5_4
1206 ; RV32I-NEXT:  # %bb.3: # %start
1207 ; RV32I-NEXT:    addi s1, s3, -1
1208 ; RV32I-NEXT:  .LBB5_4: # %start
1209 ; RV32I-NEXT:    mv a0, s0
1210 ; RV32I-NEXT:    mv a1, s0
1211 ; RV32I-NEXT:    call __unordsf2
1212 ; RV32I-NEXT:    snez a0, a0
1213 ; RV32I-NEXT:    addi a0, a0, -1
1214 ; RV32I-NEXT:    and a0, a0, s1
1215 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1216 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1217 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1218 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1219 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
1220 ; RV32I-NEXT:    addi sp, sp, 32
1221 ; RV32I-NEXT:    ret
1223 ; RV64I-LABEL: fcvt_w_h_sat:
1224 ; RV64I:       # %bb.0: # %start
1225 ; RV64I-NEXT:    addi sp, sp, -48
1226 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1227 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1228 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1229 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1230 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
1231 ; RV64I-NEXT:    slli a0, a0, 48
1232 ; RV64I-NEXT:    srli a0, a0, 48
1233 ; RV64I-NEXT:    call __extendhfsf2
1234 ; RV64I-NEXT:    mv s0, a0
1235 ; RV64I-NEXT:    lui a1, 847872
1236 ; RV64I-NEXT:    call __gesf2
1237 ; RV64I-NEXT:    mv s2, a0
1238 ; RV64I-NEXT:    mv a0, s0
1239 ; RV64I-NEXT:    call __fixsfdi
1240 ; RV64I-NEXT:    mv s1, a0
1241 ; RV64I-NEXT:    lui s3, 524288
1242 ; RV64I-NEXT:    bgez s2, .LBB5_2
1243 ; RV64I-NEXT:  # %bb.1: # %start
1244 ; RV64I-NEXT:    lui s1, 524288
1245 ; RV64I-NEXT:  .LBB5_2: # %start
1246 ; RV64I-NEXT:    lui a1, 323584
1247 ; RV64I-NEXT:    addiw a1, a1, -1
1248 ; RV64I-NEXT:    mv a0, s0
1249 ; RV64I-NEXT:    call __gtsf2
1250 ; RV64I-NEXT:    blez a0, .LBB5_4
1251 ; RV64I-NEXT:  # %bb.3: # %start
1252 ; RV64I-NEXT:    addiw s1, s3, -1
1253 ; RV64I-NEXT:  .LBB5_4: # %start
1254 ; RV64I-NEXT:    mv a0, s0
1255 ; RV64I-NEXT:    mv a1, s0
1256 ; RV64I-NEXT:    call __unordsf2
1257 ; RV64I-NEXT:    snez a0, a0
1258 ; RV64I-NEXT:    addi a0, a0, -1
1259 ; RV64I-NEXT:    and a0, a0, s1
1260 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1261 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1262 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1263 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1264 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
1265 ; RV64I-NEXT:    addi sp, sp, 48
1266 ; RV64I-NEXT:    ret
1268 ; RV32ID-ILP32-LABEL: fcvt_w_h_sat:
1269 ; RV32ID-ILP32:       # %bb.0: # %start
1270 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
1271 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1272 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
1273 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
1274 ; RV32ID-ILP32-NEXT:    fcvt.w.s a0, fa5, rtz
1275 ; RV32ID-ILP32-NEXT:    feq.s a1, fa5, fa5
1276 ; RV32ID-ILP32-NEXT:    seqz a1, a1
1277 ; RV32ID-ILP32-NEXT:    addi a1, a1, -1
1278 ; RV32ID-ILP32-NEXT:    and a0, a1, a0
1279 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1280 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
1281 ; RV32ID-ILP32-NEXT:    ret
1283 ; RV64ID-LP64-LABEL: fcvt_w_h_sat:
1284 ; RV64ID-LP64:       # %bb.0: # %start
1285 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
1286 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1287 ; RV64ID-LP64-NEXT:    call __extendhfsf2
1288 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
1289 ; RV64ID-LP64-NEXT:    fcvt.w.s a0, fa5, rtz
1290 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
1291 ; RV64ID-LP64-NEXT:    seqz a1, a1
1292 ; RV64ID-LP64-NEXT:    addi a1, a1, -1
1293 ; RV64ID-LP64-NEXT:    and a0, a1, a0
1294 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1295 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
1296 ; RV64ID-LP64-NEXT:    ret
1298 ; RV32ID-LABEL: fcvt_w_h_sat:
1299 ; RV32ID:       # %bb.0: # %start
1300 ; RV32ID-NEXT:    addi sp, sp, -16
1301 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1302 ; RV32ID-NEXT:    call __extendhfsf2
1303 ; RV32ID-NEXT:    fcvt.w.s a0, fa0, rtz
1304 ; RV32ID-NEXT:    feq.s a1, fa0, fa0
1305 ; RV32ID-NEXT:    seqz a1, a1
1306 ; RV32ID-NEXT:    addi a1, a1, -1
1307 ; RV32ID-NEXT:    and a0, a1, a0
1308 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1309 ; RV32ID-NEXT:    addi sp, sp, 16
1310 ; RV32ID-NEXT:    ret
1312 ; RV64ID-LABEL: fcvt_w_h_sat:
1313 ; RV64ID:       # %bb.0: # %start
1314 ; RV64ID-NEXT:    addi sp, sp, -16
1315 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1316 ; RV64ID-NEXT:    call __extendhfsf2
1317 ; RV64ID-NEXT:    fcvt.w.s a0, fa0, rtz
1318 ; RV64ID-NEXT:    feq.s a1, fa0, fa0
1319 ; RV64ID-NEXT:    seqz a1, a1
1320 ; RV64ID-NEXT:    addi a1, a1, -1
1321 ; RV64ID-NEXT:    and a0, a1, a0
1322 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1323 ; RV64ID-NEXT:    addi sp, sp, 16
1324 ; RV64ID-NEXT:    ret
1326 ; CHECK32-IZFHMIN-LABEL: fcvt_w_h_sat:
1327 ; CHECK32-IZFHMIN:       # %bb.0: # %start
1328 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1329 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1330 ; CHECK32-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
1331 ; CHECK32-IZFHMIN-NEXT:    seqz a1, a1
1332 ; CHECK32-IZFHMIN-NEXT:    addi a1, a1, -1
1333 ; CHECK32-IZFHMIN-NEXT:    and a0, a1, a0
1334 ; CHECK32-IZFHMIN-NEXT:    ret
1336 ; CHECK64-IZFHMIN-LABEL: fcvt_w_h_sat:
1337 ; CHECK64-IZFHMIN:       # %bb.0: # %start
1338 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1339 ; CHECK64-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1340 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
1341 ; CHECK64-IZFHMIN-NEXT:    seqz a1, a1
1342 ; CHECK64-IZFHMIN-NEXT:    addi a1, a1, -1
1343 ; CHECK64-IZFHMIN-NEXT:    and a0, a1, a0
1344 ; CHECK64-IZFHMIN-NEXT:    ret
1346 ; CHECK32-IZHINXMIN-LABEL: fcvt_w_h_sat:
1347 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
1348 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1349 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
1350 ; CHECK32-IZHINXMIN-NEXT:    feq.s a0, a0, a0
1351 ; CHECK32-IZHINXMIN-NEXT:    seqz a0, a0
1352 ; CHECK32-IZHINXMIN-NEXT:    addi a0, a0, -1
1353 ; CHECK32-IZHINXMIN-NEXT:    and a0, a0, a1
1354 ; CHECK32-IZHINXMIN-NEXT:    ret
1356 ; CHECK64-IZHINXMIN-LABEL: fcvt_w_h_sat:
1357 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
1358 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1359 ; CHECK64-IZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
1360 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
1361 ; CHECK64-IZHINXMIN-NEXT:    seqz a0, a0
1362 ; CHECK64-IZHINXMIN-NEXT:    addi a0, a0, -1
1363 ; CHECK64-IZHINXMIN-NEXT:    and a0, a0, a1
1364 ; CHECK64-IZHINXMIN-NEXT:    ret
1366 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat:
1367 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
1368 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1369 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
1370 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
1371 ; CHECK32-IZDINXZHINXMIN-NEXT:    seqz a0, a0
1372 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
1373 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
1374 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
1376 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat:
1377 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
1378 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1379 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
1380 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
1381 ; CHECK64-IZDINXZHINXMIN-NEXT:    seqz a0, a0
1382 ; CHECK64-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
1383 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
1384 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
1385 start:
1386   %0 = tail call i32 @llvm.fptosi.sat.i32.f16(half %a)
1387   ret i32 %0
1389 declare i32 @llvm.fptosi.sat.i32.f16(half)
1391 define i32 @fcvt_wu_h(half %a) nounwind {
1392 ; CHECKIZFH-LABEL: fcvt_wu_h:
1393 ; CHECKIZFH:       # %bb.0:
1394 ; CHECKIZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1395 ; CHECKIZFH-NEXT:    ret
1397 ; RV32IDZFH-LABEL: fcvt_wu_h:
1398 ; RV32IDZFH:       # %bb.0:
1399 ; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1400 ; RV32IDZFH-NEXT:    ret
1402 ; RV64IDZFH-LABEL: fcvt_wu_h:
1403 ; RV64IDZFH:       # %bb.0:
1404 ; RV64IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1405 ; RV64IDZFH-NEXT:    ret
1407 ; CHECKIZHINX-LABEL: fcvt_wu_h:
1408 ; CHECKIZHINX:       # %bb.0:
1409 ; CHECKIZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
1410 ; CHECKIZHINX-NEXT:    ret
1412 ; CHECKIZDINXZHINX-LABEL: fcvt_wu_h:
1413 ; CHECKIZDINXZHINX:       # %bb.0:
1414 ; CHECKIZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
1415 ; CHECKIZDINXZHINX-NEXT:    ret
1417 ; RV32I-LABEL: fcvt_wu_h:
1418 ; RV32I:       # %bb.0:
1419 ; RV32I-NEXT:    addi sp, sp, -16
1420 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1421 ; RV32I-NEXT:    slli a0, a0, 16
1422 ; RV32I-NEXT:    srli a0, a0, 16
1423 ; RV32I-NEXT:    call __extendhfsf2
1424 ; RV32I-NEXT:    call __fixunssfsi
1425 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1426 ; RV32I-NEXT:    addi sp, sp, 16
1427 ; RV32I-NEXT:    ret
1429 ; RV64I-LABEL: fcvt_wu_h:
1430 ; RV64I:       # %bb.0:
1431 ; RV64I-NEXT:    addi sp, sp, -16
1432 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1433 ; RV64I-NEXT:    slli a0, a0, 48
1434 ; RV64I-NEXT:    srli a0, a0, 48
1435 ; RV64I-NEXT:    call __extendhfsf2
1436 ; RV64I-NEXT:    call __fixunssfdi
1437 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1438 ; RV64I-NEXT:    addi sp, sp, 16
1439 ; RV64I-NEXT:    ret
1441 ; RV32ID-ILP32-LABEL: fcvt_wu_h:
1442 ; RV32ID-ILP32:       # %bb.0:
1443 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
1444 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1445 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
1446 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
1447 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
1448 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1449 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
1450 ; RV32ID-ILP32-NEXT:    ret
1452 ; RV64ID-LP64-LABEL: fcvt_wu_h:
1453 ; RV64ID-LP64:       # %bb.0:
1454 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
1455 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1456 ; RV64ID-LP64-NEXT:    call __extendhfsf2
1457 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
1458 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
1459 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1460 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
1461 ; RV64ID-LP64-NEXT:    ret
1463 ; RV32ID-LABEL: fcvt_wu_h:
1464 ; RV32ID:       # %bb.0:
1465 ; RV32ID-NEXT:    addi sp, sp, -16
1466 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1467 ; RV32ID-NEXT:    call __extendhfsf2
1468 ; RV32ID-NEXT:    fcvt.wu.s a0, fa0, rtz
1469 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1470 ; RV32ID-NEXT:    addi sp, sp, 16
1471 ; RV32ID-NEXT:    ret
1473 ; RV64ID-LABEL: fcvt_wu_h:
1474 ; RV64ID:       # %bb.0:
1475 ; RV64ID-NEXT:    addi sp, sp, -16
1476 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1477 ; RV64ID-NEXT:    call __extendhfsf2
1478 ; RV64ID-NEXT:    fcvt.lu.s a0, fa0, rtz
1479 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1480 ; RV64ID-NEXT:    addi sp, sp, 16
1481 ; RV64ID-NEXT:    ret
1483 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_h:
1484 ; CHECK32-IZFHMIN:       # %bb.0:
1485 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1486 ; CHECK32-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1487 ; CHECK32-IZFHMIN-NEXT:    ret
1489 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_h:
1490 ; CHECK64-IZFHMIN:       # %bb.0:
1491 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1492 ; CHECK64-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1493 ; CHECK64-IZFHMIN-NEXT:    ret
1495 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h:
1496 ; CHECK32-IZHINXMIN:       # %bb.0:
1497 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1498 ; CHECK32-IZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1499 ; CHECK32-IZHINXMIN-NEXT:    ret
1501 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h:
1502 ; CHECK64-IZHINXMIN:       # %bb.0:
1503 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1504 ; CHECK64-IZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1505 ; CHECK64-IZHINXMIN-NEXT:    ret
1507 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h:
1508 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
1509 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1510 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1511 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
1513 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h:
1514 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
1515 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1516 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1517 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
1518   %1 = fptoui half %a to i32
1519   ret i32 %1
1522 ; Test where the fptoui has multiple uses, one of which causes a sext to be
1523 ; inserted on RV64.
1524 define i32 @fcvt_wu_h_multiple_use(half %x, ptr %y) nounwind {
1525 ; CHECKIZFH-LABEL: fcvt_wu_h_multiple_use:
1526 ; CHECKIZFH:       # %bb.0:
1527 ; CHECKIZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1528 ; CHECKIZFH-NEXT:    seqz a1, a0
1529 ; CHECKIZFH-NEXT:    add a0, a0, a1
1530 ; CHECKIZFH-NEXT:    ret
1532 ; RV32IDZFH-LABEL: fcvt_wu_h_multiple_use:
1533 ; RV32IDZFH:       # %bb.0:
1534 ; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1535 ; RV32IDZFH-NEXT:    seqz a1, a0
1536 ; RV32IDZFH-NEXT:    add a0, a0, a1
1537 ; RV32IDZFH-NEXT:    ret
1539 ; RV64IDZFH-LABEL: fcvt_wu_h_multiple_use:
1540 ; RV64IDZFH:       # %bb.0:
1541 ; RV64IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1542 ; RV64IDZFH-NEXT:    seqz a1, a0
1543 ; RV64IDZFH-NEXT:    add a0, a0, a1
1544 ; RV64IDZFH-NEXT:    ret
1546 ; CHECKIZHINX-LABEL: fcvt_wu_h_multiple_use:
1547 ; CHECKIZHINX:       # %bb.0:
1548 ; CHECKIZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
1549 ; CHECKIZHINX-NEXT:    seqz a1, a0
1550 ; CHECKIZHINX-NEXT:    add a0, a0, a1
1551 ; CHECKIZHINX-NEXT:    ret
1553 ; CHECKIZDINXZHINX-LABEL: fcvt_wu_h_multiple_use:
1554 ; CHECKIZDINXZHINX:       # %bb.0:
1555 ; CHECKIZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
1556 ; CHECKIZDINXZHINX-NEXT:    seqz a1, a0
1557 ; CHECKIZDINXZHINX-NEXT:    add a0, a0, a1
1558 ; CHECKIZDINXZHINX-NEXT:    ret
1560 ; RV32I-LABEL: fcvt_wu_h_multiple_use:
1561 ; RV32I:       # %bb.0:
1562 ; RV32I-NEXT:    addi sp, sp, -16
1563 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1564 ; RV32I-NEXT:    slli a0, a0, 16
1565 ; RV32I-NEXT:    srli a0, a0, 16
1566 ; RV32I-NEXT:    call __extendhfsf2
1567 ; RV32I-NEXT:    call __fixunssfsi
1568 ; RV32I-NEXT:    seqz a1, a0
1569 ; RV32I-NEXT:    add a0, a0, a1
1570 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1571 ; RV32I-NEXT:    addi sp, sp, 16
1572 ; RV32I-NEXT:    ret
1574 ; RV64I-LABEL: fcvt_wu_h_multiple_use:
1575 ; RV64I:       # %bb.0:
1576 ; RV64I-NEXT:    addi sp, sp, -16
1577 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1578 ; RV64I-NEXT:    slli a0, a0, 48
1579 ; RV64I-NEXT:    srli a0, a0, 48
1580 ; RV64I-NEXT:    call __extendhfsf2
1581 ; RV64I-NEXT:    call __fixunssfdi
1582 ; RV64I-NEXT:    seqz a1, a0
1583 ; RV64I-NEXT:    add a0, a0, a1
1584 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1585 ; RV64I-NEXT:    addi sp, sp, 16
1586 ; RV64I-NEXT:    ret
1588 ; RV32ID-ILP32-LABEL: fcvt_wu_h_multiple_use:
1589 ; RV32ID-ILP32:       # %bb.0:
1590 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
1591 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1592 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
1593 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
1594 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
1595 ; RV32ID-ILP32-NEXT:    seqz a1, a0
1596 ; RV32ID-ILP32-NEXT:    add a0, a0, a1
1597 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1598 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
1599 ; RV32ID-ILP32-NEXT:    ret
1601 ; RV64ID-LP64-LABEL: fcvt_wu_h_multiple_use:
1602 ; RV64ID-LP64:       # %bb.0:
1603 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
1604 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1605 ; RV64ID-LP64-NEXT:    call __extendhfsf2
1606 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
1607 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
1608 ; RV64ID-LP64-NEXT:    seqz a1, a0
1609 ; RV64ID-LP64-NEXT:    add a0, a0, a1
1610 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1611 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
1612 ; RV64ID-LP64-NEXT:    ret
1614 ; RV32ID-LABEL: fcvt_wu_h_multiple_use:
1615 ; RV32ID:       # %bb.0:
1616 ; RV32ID-NEXT:    addi sp, sp, -16
1617 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1618 ; RV32ID-NEXT:    call __extendhfsf2
1619 ; RV32ID-NEXT:    fcvt.wu.s a0, fa0, rtz
1620 ; RV32ID-NEXT:    seqz a1, a0
1621 ; RV32ID-NEXT:    add a0, a0, a1
1622 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1623 ; RV32ID-NEXT:    addi sp, sp, 16
1624 ; RV32ID-NEXT:    ret
1626 ; RV64ID-LABEL: fcvt_wu_h_multiple_use:
1627 ; RV64ID:       # %bb.0:
1628 ; RV64ID-NEXT:    addi sp, sp, -16
1629 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1630 ; RV64ID-NEXT:    call __extendhfsf2
1631 ; RV64ID-NEXT:    fcvt.lu.s a0, fa0, rtz
1632 ; RV64ID-NEXT:    seqz a1, a0
1633 ; RV64ID-NEXT:    add a0, a0, a1
1634 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1635 ; RV64ID-NEXT:    addi sp, sp, 16
1636 ; RV64ID-NEXT:    ret
1638 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_h_multiple_use:
1639 ; CHECK32-IZFHMIN:       # %bb.0:
1640 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1641 ; CHECK32-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1642 ; CHECK32-IZFHMIN-NEXT:    seqz a1, a0
1643 ; CHECK32-IZFHMIN-NEXT:    add a0, a0, a1
1644 ; CHECK32-IZFHMIN-NEXT:    ret
1646 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_multiple_use:
1647 ; CHECK64-IZFHMIN:       # %bb.0:
1648 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1649 ; CHECK64-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1650 ; CHECK64-IZFHMIN-NEXT:    seqz a1, a0
1651 ; CHECK64-IZFHMIN-NEXT:    add a0, a0, a1
1652 ; CHECK64-IZFHMIN-NEXT:    ret
1654 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h_multiple_use:
1655 ; CHECK32-IZHINXMIN:       # %bb.0:
1656 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1657 ; CHECK32-IZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1658 ; CHECK32-IZHINXMIN-NEXT:    seqz a1, a0
1659 ; CHECK32-IZHINXMIN-NEXT:    add a0, a0, a1
1660 ; CHECK32-IZHINXMIN-NEXT:    ret
1662 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h_multiple_use:
1663 ; CHECK64-IZHINXMIN:       # %bb.0:
1664 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1665 ; CHECK64-IZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1666 ; CHECK64-IZHINXMIN-NEXT:    seqz a1, a0
1667 ; CHECK64-IZHINXMIN-NEXT:    add a0, a0, a1
1668 ; CHECK64-IZHINXMIN-NEXT:    ret
1670 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h_multiple_use:
1671 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
1672 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1673 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1674 ; CHECK32-IZDINXZHINXMIN-NEXT:    seqz a1, a0
1675 ; CHECK32-IZDINXZHINXMIN-NEXT:    add a0, a0, a1
1676 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
1678 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h_multiple_use:
1679 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
1680 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1681 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
1682 ; CHECK64-IZDINXZHINXMIN-NEXT:    seqz a1, a0
1683 ; CHECK64-IZDINXZHINXMIN-NEXT:    add a0, a0, a1
1684 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
1685   %a = fptoui half %x to i32
1686   %b = icmp eq i32 %a, 0
1687   %c = select i1 %b, i32 1, i32 %a
1688   ret i32 %c
1691 define i32 @fcvt_wu_h_sat(half %a) nounwind {
1692 ; RV32IZFH-LABEL: fcvt_wu_h_sat:
1693 ; RV32IZFH:       # %bb.0: # %start
1694 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1695 ; RV32IZFH-NEXT:    feq.h a1, fa0, fa0
1696 ; RV32IZFH-NEXT:    seqz a1, a1
1697 ; RV32IZFH-NEXT:    addi a1, a1, -1
1698 ; RV32IZFH-NEXT:    and a0, a1, a0
1699 ; RV32IZFH-NEXT:    ret
1701 ; RV64IZFH-LABEL: fcvt_wu_h_sat:
1702 ; RV64IZFH:       # %bb.0: # %start
1703 ; RV64IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1704 ; RV64IZFH-NEXT:    feq.h a1, fa0, fa0
1705 ; RV64IZFH-NEXT:    seqz a1, a1
1706 ; RV64IZFH-NEXT:    addi a1, a1, -1
1707 ; RV64IZFH-NEXT:    and a0, a0, a1
1708 ; RV64IZFH-NEXT:    slli a0, a0, 32
1709 ; RV64IZFH-NEXT:    srli a0, a0, 32
1710 ; RV64IZFH-NEXT:    ret
1712 ; RV32IDZFH-LABEL: fcvt_wu_h_sat:
1713 ; RV32IDZFH:       # %bb.0: # %start
1714 ; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1715 ; RV32IDZFH-NEXT:    feq.h a1, fa0, fa0
1716 ; RV32IDZFH-NEXT:    seqz a1, a1
1717 ; RV32IDZFH-NEXT:    addi a1, a1, -1
1718 ; RV32IDZFH-NEXT:    and a0, a1, a0
1719 ; RV32IDZFH-NEXT:    ret
1721 ; RV64IDZFH-LABEL: fcvt_wu_h_sat:
1722 ; RV64IDZFH:       # %bb.0: # %start
1723 ; RV64IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1724 ; RV64IDZFH-NEXT:    feq.h a1, fa0, fa0
1725 ; RV64IDZFH-NEXT:    seqz a1, a1
1726 ; RV64IDZFH-NEXT:    addi a1, a1, -1
1727 ; RV64IDZFH-NEXT:    and a0, a0, a1
1728 ; RV64IDZFH-NEXT:    slli a0, a0, 32
1729 ; RV64IDZFH-NEXT:    srli a0, a0, 32
1730 ; RV64IDZFH-NEXT:    ret
1732 ; RV32IZHINX-LABEL: fcvt_wu_h_sat:
1733 ; RV32IZHINX:       # %bb.0: # %start
1734 ; RV32IZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
1735 ; RV32IZHINX-NEXT:    feq.h a0, a0, a0
1736 ; RV32IZHINX-NEXT:    seqz a0, a0
1737 ; RV32IZHINX-NEXT:    addi a0, a0, -1
1738 ; RV32IZHINX-NEXT:    and a0, a0, a1
1739 ; RV32IZHINX-NEXT:    ret
1741 ; RV64IZHINX-LABEL: fcvt_wu_h_sat:
1742 ; RV64IZHINX:       # %bb.0: # %start
1743 ; RV64IZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
1744 ; RV64IZHINX-NEXT:    feq.h a0, a0, a0
1745 ; RV64IZHINX-NEXT:    seqz a0, a0
1746 ; RV64IZHINX-NEXT:    addi a0, a0, -1
1747 ; RV64IZHINX-NEXT:    and a0, a1, a0
1748 ; RV64IZHINX-NEXT:    slli a0, a0, 32
1749 ; RV64IZHINX-NEXT:    srli a0, a0, 32
1750 ; RV64IZHINX-NEXT:    ret
1752 ; RV32IZDINXZHINX-LABEL: fcvt_wu_h_sat:
1753 ; RV32IZDINXZHINX:       # %bb.0: # %start
1754 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
1755 ; RV32IZDINXZHINX-NEXT:    feq.h a0, a0, a0
1756 ; RV32IZDINXZHINX-NEXT:    seqz a0, a0
1757 ; RV32IZDINXZHINX-NEXT:    addi a0, a0, -1
1758 ; RV32IZDINXZHINX-NEXT:    and a0, a0, a1
1759 ; RV32IZDINXZHINX-NEXT:    ret
1761 ; RV64IZDINXZHINX-LABEL: fcvt_wu_h_sat:
1762 ; RV64IZDINXZHINX:       # %bb.0: # %start
1763 ; RV64IZDINXZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
1764 ; RV64IZDINXZHINX-NEXT:    feq.h a0, a0, a0
1765 ; RV64IZDINXZHINX-NEXT:    seqz a0, a0
1766 ; RV64IZDINXZHINX-NEXT:    addi a0, a0, -1
1767 ; RV64IZDINXZHINX-NEXT:    and a0, a1, a0
1768 ; RV64IZDINXZHINX-NEXT:    slli a0, a0, 32
1769 ; RV64IZDINXZHINX-NEXT:    srli a0, a0, 32
1770 ; RV64IZDINXZHINX-NEXT:    ret
1772 ; RV32I-LABEL: fcvt_wu_h_sat:
1773 ; RV32I:       # %bb.0: # %start
1774 ; RV32I-NEXT:    addi sp, sp, -16
1775 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1776 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1777 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1778 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
1779 ; RV32I-NEXT:    slli a0, a0, 16
1780 ; RV32I-NEXT:    srli a0, a0, 16
1781 ; RV32I-NEXT:    call __extendhfsf2
1782 ; RV32I-NEXT:    mv s0, a0
1783 ; RV32I-NEXT:    lui a1, 325632
1784 ; RV32I-NEXT:    addi a1, a1, -1
1785 ; RV32I-NEXT:    call __gtsf2
1786 ; RV32I-NEXT:    sgtz a0, a0
1787 ; RV32I-NEXT:    neg s1, a0
1788 ; RV32I-NEXT:    mv a0, s0
1789 ; RV32I-NEXT:    li a1, 0
1790 ; RV32I-NEXT:    call __gesf2
1791 ; RV32I-NEXT:    slti a0, a0, 0
1792 ; RV32I-NEXT:    addi s2, a0, -1
1793 ; RV32I-NEXT:    mv a0, s0
1794 ; RV32I-NEXT:    call __fixunssfsi
1795 ; RV32I-NEXT:    and a0, s2, a0
1796 ; RV32I-NEXT:    or a0, s1, a0
1797 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1798 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1799 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1800 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
1801 ; RV32I-NEXT:    addi sp, sp, 16
1802 ; RV32I-NEXT:    ret
1804 ; RV64I-LABEL: fcvt_wu_h_sat:
1805 ; RV64I:       # %bb.0: # %start
1806 ; RV64I-NEXT:    addi sp, sp, -32
1807 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1808 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1809 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1810 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
1811 ; RV64I-NEXT:    slli a0, a0, 48
1812 ; RV64I-NEXT:    srli a0, a0, 48
1813 ; RV64I-NEXT:    call __extendhfsf2
1814 ; RV64I-NEXT:    mv s2, a0
1815 ; RV64I-NEXT:    li a1, 0
1816 ; RV64I-NEXT:    call __gesf2
1817 ; RV64I-NEXT:    mv s0, a0
1818 ; RV64I-NEXT:    mv a0, s2
1819 ; RV64I-NEXT:    call __fixunssfdi
1820 ; RV64I-NEXT:    mv s1, a0
1821 ; RV64I-NEXT:    lui a1, 325632
1822 ; RV64I-NEXT:    addiw a1, a1, -1
1823 ; RV64I-NEXT:    mv a0, s2
1824 ; RV64I-NEXT:    call __gtsf2
1825 ; RV64I-NEXT:    blez a0, .LBB8_2
1826 ; RV64I-NEXT:  # %bb.1: # %start
1827 ; RV64I-NEXT:    li a0, -1
1828 ; RV64I-NEXT:    srli a0, a0, 32
1829 ; RV64I-NEXT:    j .LBB8_3
1830 ; RV64I-NEXT:  .LBB8_2:
1831 ; RV64I-NEXT:    slti a0, s0, 0
1832 ; RV64I-NEXT:    addi a0, a0, -1
1833 ; RV64I-NEXT:    and a0, a0, s1
1834 ; RV64I-NEXT:  .LBB8_3: # %start
1835 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1836 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1837 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
1838 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
1839 ; RV64I-NEXT:    addi sp, sp, 32
1840 ; RV64I-NEXT:    ret
1842 ; RV32ID-ILP32-LABEL: fcvt_wu_h_sat:
1843 ; RV32ID-ILP32:       # %bb.0: # %start
1844 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
1845 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1846 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
1847 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
1848 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
1849 ; RV32ID-ILP32-NEXT:    feq.s a1, fa5, fa5
1850 ; RV32ID-ILP32-NEXT:    seqz a1, a1
1851 ; RV32ID-ILP32-NEXT:    addi a1, a1, -1
1852 ; RV32ID-ILP32-NEXT:    and a0, a1, a0
1853 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1854 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
1855 ; RV32ID-ILP32-NEXT:    ret
1857 ; RV64ID-LP64-LABEL: fcvt_wu_h_sat:
1858 ; RV64ID-LP64:       # %bb.0: # %start
1859 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
1860 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1861 ; RV64ID-LP64-NEXT:    call __extendhfsf2
1862 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
1863 ; RV64ID-LP64-NEXT:    fcvt.wu.s a0, fa5, rtz
1864 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
1865 ; RV64ID-LP64-NEXT:    seqz a1, a1
1866 ; RV64ID-LP64-NEXT:    addi a1, a1, -1
1867 ; RV64ID-LP64-NEXT:    and a0, a0, a1
1868 ; RV64ID-LP64-NEXT:    slli a0, a0, 32
1869 ; RV64ID-LP64-NEXT:    srli a0, a0, 32
1870 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1871 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
1872 ; RV64ID-LP64-NEXT:    ret
1874 ; RV32ID-LABEL: fcvt_wu_h_sat:
1875 ; RV32ID:       # %bb.0: # %start
1876 ; RV32ID-NEXT:    addi sp, sp, -16
1877 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1878 ; RV32ID-NEXT:    call __extendhfsf2
1879 ; RV32ID-NEXT:    fcvt.wu.s a0, fa0, rtz
1880 ; RV32ID-NEXT:    feq.s a1, fa0, fa0
1881 ; RV32ID-NEXT:    seqz a1, a1
1882 ; RV32ID-NEXT:    addi a1, a1, -1
1883 ; RV32ID-NEXT:    and a0, a1, a0
1884 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1885 ; RV32ID-NEXT:    addi sp, sp, 16
1886 ; RV32ID-NEXT:    ret
1888 ; RV64ID-LABEL: fcvt_wu_h_sat:
1889 ; RV64ID:       # %bb.0: # %start
1890 ; RV64ID-NEXT:    addi sp, sp, -16
1891 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1892 ; RV64ID-NEXT:    call __extendhfsf2
1893 ; RV64ID-NEXT:    fcvt.wu.s a0, fa0, rtz
1894 ; RV64ID-NEXT:    feq.s a1, fa0, fa0
1895 ; RV64ID-NEXT:    seqz a1, a1
1896 ; RV64ID-NEXT:    addi a1, a1, -1
1897 ; RV64ID-NEXT:    and a0, a0, a1
1898 ; RV64ID-NEXT:    slli a0, a0, 32
1899 ; RV64ID-NEXT:    srli a0, a0, 32
1900 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1901 ; RV64ID-NEXT:    addi sp, sp, 16
1902 ; RV64ID-NEXT:    ret
1904 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_h_sat:
1905 ; CHECK32-IZFHMIN:       # %bb.0: # %start
1906 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1907 ; CHECK32-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1908 ; CHECK32-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
1909 ; CHECK32-IZFHMIN-NEXT:    seqz a1, a1
1910 ; CHECK32-IZFHMIN-NEXT:    addi a1, a1, -1
1911 ; CHECK32-IZFHMIN-NEXT:    and a0, a1, a0
1912 ; CHECK32-IZFHMIN-NEXT:    ret
1914 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_sat:
1915 ; CHECK64-IZFHMIN:       # %bb.0: # %start
1916 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
1917 ; CHECK64-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1918 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
1919 ; CHECK64-IZFHMIN-NEXT:    seqz a1, a1
1920 ; CHECK64-IZFHMIN-NEXT:    addi a1, a1, -1
1921 ; CHECK64-IZFHMIN-NEXT:    and a0, a0, a1
1922 ; CHECK64-IZFHMIN-NEXT:    slli a0, a0, 32
1923 ; CHECK64-IZFHMIN-NEXT:    srli a0, a0, 32
1924 ; CHECK64-IZFHMIN-NEXT:    ret
1926 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h_sat:
1927 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
1928 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1929 ; CHECK32-IZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
1930 ; CHECK32-IZHINXMIN-NEXT:    feq.s a0, a0, a0
1931 ; CHECK32-IZHINXMIN-NEXT:    seqz a0, a0
1932 ; CHECK32-IZHINXMIN-NEXT:    addi a0, a0, -1
1933 ; CHECK32-IZHINXMIN-NEXT:    and a0, a0, a1
1934 ; CHECK32-IZHINXMIN-NEXT:    ret
1936 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h_sat:
1937 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
1938 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
1939 ; CHECK64-IZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
1940 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
1941 ; CHECK64-IZHINXMIN-NEXT:    seqz a0, a0
1942 ; CHECK64-IZHINXMIN-NEXT:    addi a0, a0, -1
1943 ; CHECK64-IZHINXMIN-NEXT:    and a0, a1, a0
1944 ; CHECK64-IZHINXMIN-NEXT:    slli a0, a0, 32
1945 ; CHECK64-IZHINXMIN-NEXT:    srli a0, a0, 32
1946 ; CHECK64-IZHINXMIN-NEXT:    ret
1948 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat:
1949 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
1950 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1951 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
1952 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
1953 ; CHECK32-IZDINXZHINXMIN-NEXT:    seqz a0, a0
1954 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
1955 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
1956 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
1958 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat:
1959 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
1960 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
1961 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
1962 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
1963 ; CHECK64-IZDINXZHINXMIN-NEXT:    seqz a0, a0
1964 ; CHECK64-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
1965 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a1, a0
1966 ; CHECK64-IZDINXZHINXMIN-NEXT:    slli a0, a0, 32
1967 ; CHECK64-IZDINXZHINXMIN-NEXT:    srli a0, a0, 32
1968 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
1969 start:
1970   %0 = tail call i32 @llvm.fptoui.sat.i32.f16(half %a)
1971   ret i32 %0
1973 declare i32 @llvm.fptoui.sat.i32.f16(half)
1975 define i64 @fcvt_l_h(half %a) nounwind {
1976 ; RV32IZFH-LABEL: fcvt_l_h:
1977 ; RV32IZFH:       # %bb.0:
1978 ; RV32IZFH-NEXT:    addi sp, sp, -16
1979 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1980 ; RV32IZFH-NEXT:    call __fixhfdi
1981 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1982 ; RV32IZFH-NEXT:    addi sp, sp, 16
1983 ; RV32IZFH-NEXT:    ret
1985 ; RV64IZFH-LABEL: fcvt_l_h:
1986 ; RV64IZFH:       # %bb.0:
1987 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
1988 ; RV64IZFH-NEXT:    ret
1990 ; RV32IDZFH-LABEL: fcvt_l_h:
1991 ; RV32IDZFH:       # %bb.0:
1992 ; RV32IDZFH-NEXT:    addi sp, sp, -16
1993 ; RV32IDZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1994 ; RV32IDZFH-NEXT:    call __fixhfdi
1995 ; RV32IDZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1996 ; RV32IDZFH-NEXT:    addi sp, sp, 16
1997 ; RV32IDZFH-NEXT:    ret
1999 ; RV64IDZFH-LABEL: fcvt_l_h:
2000 ; RV64IDZFH:       # %bb.0:
2001 ; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
2002 ; RV64IDZFH-NEXT:    ret
2004 ; RV32IZHINX-LABEL: fcvt_l_h:
2005 ; RV32IZHINX:       # %bb.0:
2006 ; RV32IZHINX-NEXT:    addi sp, sp, -16
2007 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2008 ; RV32IZHINX-NEXT:    call __fixhfdi
2009 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2010 ; RV32IZHINX-NEXT:    addi sp, sp, 16
2011 ; RV32IZHINX-NEXT:    ret
2013 ; RV64IZHINX-LABEL: fcvt_l_h:
2014 ; RV64IZHINX:       # %bb.0:
2015 ; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
2016 ; RV64IZHINX-NEXT:    ret
2018 ; RV32IZDINXZHINX-LABEL: fcvt_l_h:
2019 ; RV32IZDINXZHINX:       # %bb.0:
2020 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, -16
2021 ; RV32IZDINXZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2022 ; RV32IZDINXZHINX-NEXT:    call __fixhfdi
2023 ; RV32IZDINXZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2024 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, 16
2025 ; RV32IZDINXZHINX-NEXT:    ret
2027 ; RV64IZDINXZHINX-LABEL: fcvt_l_h:
2028 ; RV64IZDINXZHINX:       # %bb.0:
2029 ; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
2030 ; RV64IZDINXZHINX-NEXT:    ret
2032 ; RV32I-LABEL: fcvt_l_h:
2033 ; RV32I:       # %bb.0:
2034 ; RV32I-NEXT:    addi sp, sp, -16
2035 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2036 ; RV32I-NEXT:    call __extendhfsf2
2037 ; RV32I-NEXT:    call __fixsfdi
2038 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2039 ; RV32I-NEXT:    addi sp, sp, 16
2040 ; RV32I-NEXT:    ret
2042 ; RV64I-LABEL: fcvt_l_h:
2043 ; RV64I:       # %bb.0:
2044 ; RV64I-NEXT:    addi sp, sp, -16
2045 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2046 ; RV64I-NEXT:    slli a0, a0, 48
2047 ; RV64I-NEXT:    srli a0, a0, 48
2048 ; RV64I-NEXT:    call __extendhfsf2
2049 ; RV64I-NEXT:    call __fixsfdi
2050 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2051 ; RV64I-NEXT:    addi sp, sp, 16
2052 ; RV64I-NEXT:    ret
2054 ; RV32ID-ILP32-LABEL: fcvt_l_h:
2055 ; RV32ID-ILP32:       # %bb.0:
2056 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
2057 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2058 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
2059 ; RV32ID-ILP32-NEXT:    call __fixsfdi
2060 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2061 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
2062 ; RV32ID-ILP32-NEXT:    ret
2064 ; RV64ID-LP64-LABEL: fcvt_l_h:
2065 ; RV64ID-LP64:       # %bb.0:
2066 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
2067 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2068 ; RV64ID-LP64-NEXT:    call __extendhfsf2
2069 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
2070 ; RV64ID-LP64-NEXT:    fcvt.l.s a0, fa5, rtz
2071 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2072 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
2073 ; RV64ID-LP64-NEXT:    ret
2075 ; RV32ID-LABEL: fcvt_l_h:
2076 ; RV32ID:       # %bb.0:
2077 ; RV32ID-NEXT:    addi sp, sp, -16
2078 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2079 ; RV32ID-NEXT:    call __extendhfsf2
2080 ; RV32ID-NEXT:    call __fixsfdi
2081 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2082 ; RV32ID-NEXT:    addi sp, sp, 16
2083 ; RV32ID-NEXT:    ret
2085 ; RV64ID-LABEL: fcvt_l_h:
2086 ; RV64ID:       # %bb.0:
2087 ; RV64ID-NEXT:    addi sp, sp, -16
2088 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2089 ; RV64ID-NEXT:    call __extendhfsf2
2090 ; RV64ID-NEXT:    fcvt.l.s a0, fa0, rtz
2091 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2092 ; RV64ID-NEXT:    addi sp, sp, 16
2093 ; RV64ID-NEXT:    ret
2095 ; CHECK32-IZFHMIN-LABEL: fcvt_l_h:
2096 ; CHECK32-IZFHMIN:       # %bb.0:
2097 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, -16
2098 ; CHECK32-IZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2099 ; CHECK32-IZFHMIN-NEXT:    call __fixhfdi
2100 ; CHECK32-IZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2101 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, 16
2102 ; CHECK32-IZFHMIN-NEXT:    ret
2104 ; CHECK64-IZFHMIN-LABEL: fcvt_l_h:
2105 ; CHECK64-IZFHMIN:       # %bb.0:
2106 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
2107 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a0, fa5, rtz
2108 ; CHECK64-IZFHMIN-NEXT:    ret
2110 ; CHECK32-IZHINXMIN-LABEL: fcvt_l_h:
2111 ; CHECK32-IZHINXMIN:       # %bb.0:
2112 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
2113 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2114 ; CHECK32-IZHINXMIN-NEXT:    call __fixhfdi
2115 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2116 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
2117 ; CHECK32-IZHINXMIN-NEXT:    ret
2119 ; CHECK64-IZHINXMIN-LABEL: fcvt_l_h:
2120 ; CHECK64-IZHINXMIN:       # %bb.0:
2121 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
2122 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
2123 ; CHECK64-IZHINXMIN-NEXT:    ret
2125 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_l_h:
2126 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
2127 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
2128 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2129 ; CHECK32-IZDINXZHINXMIN-NEXT:    call __fixhfdi
2130 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2131 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
2132 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
2134 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_l_h:
2135 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
2136 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
2137 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
2138 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
2139   %1 = fptosi half %a to i64
2140   ret i64 %1
2143 define i64 @fcvt_l_h_sat(half %a) nounwind {
2144 ; RV32IZFH-LABEL: fcvt_l_h_sat:
2145 ; RV32IZFH:       # %bb.0: # %start
2146 ; RV32IZFH-NEXT:    addi sp, sp, -16
2147 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2148 ; RV32IZFH-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2149 ; RV32IZFH-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
2150 ; RV32IZFH-NEXT:    fcvt.s.h fs0, fa0
2151 ; RV32IZFH-NEXT:    lui a0, 913408
2152 ; RV32IZFH-NEXT:    fmv.w.x fa5, a0
2153 ; RV32IZFH-NEXT:    fle.s s0, fa5, fs0
2154 ; RV32IZFH-NEXT:    fmv.s fa0, fs0
2155 ; RV32IZFH-NEXT:    call __fixsfdi
2156 ; RV32IZFH-NEXT:    lui a3, 524288
2157 ; RV32IZFH-NEXT:    lui a2, 524288
2158 ; RV32IZFH-NEXT:    beqz s0, .LBB10_2
2159 ; RV32IZFH-NEXT:  # %bb.1: # %start
2160 ; RV32IZFH-NEXT:    mv a2, a1
2161 ; RV32IZFH-NEXT:  .LBB10_2: # %start
2162 ; RV32IZFH-NEXT:    lui a1, %hi(.LCPI10_0)
2163 ; RV32IZFH-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
2164 ; RV32IZFH-NEXT:    flt.s a1, fa5, fs0
2165 ; RV32IZFH-NEXT:    beqz a1, .LBB10_4
2166 ; RV32IZFH-NEXT:  # %bb.3:
2167 ; RV32IZFH-NEXT:    addi a2, a3, -1
2168 ; RV32IZFH-NEXT:  .LBB10_4: # %start
2169 ; RV32IZFH-NEXT:    feq.s a3, fs0, fs0
2170 ; RV32IZFH-NEXT:    neg a4, a1
2171 ; RV32IZFH-NEXT:    neg a1, s0
2172 ; RV32IZFH-NEXT:    neg a3, a3
2173 ; RV32IZFH-NEXT:    and a0, a1, a0
2174 ; RV32IZFH-NEXT:    and a1, a3, a2
2175 ; RV32IZFH-NEXT:    or a0, a4, a0
2176 ; RV32IZFH-NEXT:    and a0, a3, a0
2177 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2178 ; RV32IZFH-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2179 ; RV32IZFH-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
2180 ; RV32IZFH-NEXT:    addi sp, sp, 16
2181 ; RV32IZFH-NEXT:    ret
2183 ; RV64IZFH-LABEL: fcvt_l_h_sat:
2184 ; RV64IZFH:       # %bb.0: # %start
2185 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
2186 ; RV64IZFH-NEXT:    feq.h a1, fa0, fa0
2187 ; RV64IZFH-NEXT:    seqz a1, a1
2188 ; RV64IZFH-NEXT:    addi a1, a1, -1
2189 ; RV64IZFH-NEXT:    and a0, a1, a0
2190 ; RV64IZFH-NEXT:    ret
2192 ; RV32IDZFH-LABEL: fcvt_l_h_sat:
2193 ; RV32IDZFH:       # %bb.0: # %start
2194 ; RV32IDZFH-NEXT:    addi sp, sp, -16
2195 ; RV32IDZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2196 ; RV32IDZFH-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2197 ; RV32IDZFH-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
2198 ; RV32IDZFH-NEXT:    fcvt.s.h fs0, fa0
2199 ; RV32IDZFH-NEXT:    lui a0, 913408
2200 ; RV32IDZFH-NEXT:    fmv.w.x fa5, a0
2201 ; RV32IDZFH-NEXT:    fle.s s0, fa5, fs0
2202 ; RV32IDZFH-NEXT:    fmv.s fa0, fs0
2203 ; RV32IDZFH-NEXT:    call __fixsfdi
2204 ; RV32IDZFH-NEXT:    lui a3, 524288
2205 ; RV32IDZFH-NEXT:    lui a2, 524288
2206 ; RV32IDZFH-NEXT:    beqz s0, .LBB10_2
2207 ; RV32IDZFH-NEXT:  # %bb.1: # %start
2208 ; RV32IDZFH-NEXT:    mv a2, a1
2209 ; RV32IDZFH-NEXT:  .LBB10_2: # %start
2210 ; RV32IDZFH-NEXT:    lui a1, %hi(.LCPI10_0)
2211 ; RV32IDZFH-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
2212 ; RV32IDZFH-NEXT:    flt.s a1, fa5, fs0
2213 ; RV32IDZFH-NEXT:    beqz a1, .LBB10_4
2214 ; RV32IDZFH-NEXT:  # %bb.3:
2215 ; RV32IDZFH-NEXT:    addi a2, a3, -1
2216 ; RV32IDZFH-NEXT:  .LBB10_4: # %start
2217 ; RV32IDZFH-NEXT:    feq.s a3, fs0, fs0
2218 ; RV32IDZFH-NEXT:    neg a4, a1
2219 ; RV32IDZFH-NEXT:    neg a1, s0
2220 ; RV32IDZFH-NEXT:    neg a3, a3
2221 ; RV32IDZFH-NEXT:    and a0, a1, a0
2222 ; RV32IDZFH-NEXT:    and a1, a3, a2
2223 ; RV32IDZFH-NEXT:    or a0, a4, a0
2224 ; RV32IDZFH-NEXT:    and a0, a3, a0
2225 ; RV32IDZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2226 ; RV32IDZFH-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2227 ; RV32IDZFH-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
2228 ; RV32IDZFH-NEXT:    addi sp, sp, 16
2229 ; RV32IDZFH-NEXT:    ret
2231 ; RV64IDZFH-LABEL: fcvt_l_h_sat:
2232 ; RV64IDZFH:       # %bb.0: # %start
2233 ; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
2234 ; RV64IDZFH-NEXT:    feq.h a1, fa0, fa0
2235 ; RV64IDZFH-NEXT:    seqz a1, a1
2236 ; RV64IDZFH-NEXT:    addi a1, a1, -1
2237 ; RV64IDZFH-NEXT:    and a0, a1, a0
2238 ; RV64IDZFH-NEXT:    ret
2240 ; RV32IZHINX-LABEL: fcvt_l_h_sat:
2241 ; RV32IZHINX:       # %bb.0: # %start
2242 ; RV32IZHINX-NEXT:    addi sp, sp, -16
2243 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2244 ; RV32IZHINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2245 ; RV32IZHINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2246 ; RV32IZHINX-NEXT:    fcvt.s.h s0, a0
2247 ; RV32IZHINX-NEXT:    lui a0, 913408
2248 ; RV32IZHINX-NEXT:    fle.s s1, a0, s0
2249 ; RV32IZHINX-NEXT:    mv a0, s0
2250 ; RV32IZHINX-NEXT:    call __fixsfdi
2251 ; RV32IZHINX-NEXT:    lui a3, 524288
2252 ; RV32IZHINX-NEXT:    lui a2, 524288
2253 ; RV32IZHINX-NEXT:    beqz s1, .LBB10_2
2254 ; RV32IZHINX-NEXT:  # %bb.1: # %start
2255 ; RV32IZHINX-NEXT:    mv a2, a1
2256 ; RV32IZHINX-NEXT:  .LBB10_2: # %start
2257 ; RV32IZHINX-NEXT:    lui a1, 389120
2258 ; RV32IZHINX-NEXT:    addi a1, a1, -1
2259 ; RV32IZHINX-NEXT:    flt.s a1, a1, s0
2260 ; RV32IZHINX-NEXT:    beqz a1, .LBB10_4
2261 ; RV32IZHINX-NEXT:  # %bb.3:
2262 ; RV32IZHINX-NEXT:    addi a2, a3, -1
2263 ; RV32IZHINX-NEXT:  .LBB10_4: # %start
2264 ; RV32IZHINX-NEXT:    feq.s a3, s0, s0
2265 ; RV32IZHINX-NEXT:    neg a4, a1
2266 ; RV32IZHINX-NEXT:    neg a1, s1
2267 ; RV32IZHINX-NEXT:    neg a3, a3
2268 ; RV32IZHINX-NEXT:    and a0, a1, a0
2269 ; RV32IZHINX-NEXT:    and a1, a3, a2
2270 ; RV32IZHINX-NEXT:    or a0, a4, a0
2271 ; RV32IZHINX-NEXT:    and a0, a3, a0
2272 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2273 ; RV32IZHINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2274 ; RV32IZHINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2275 ; RV32IZHINX-NEXT:    addi sp, sp, 16
2276 ; RV32IZHINX-NEXT:    ret
2278 ; RV64IZHINX-LABEL: fcvt_l_h_sat:
2279 ; RV64IZHINX:       # %bb.0: # %start
2280 ; RV64IZHINX-NEXT:    fcvt.l.h a1, a0, rtz
2281 ; RV64IZHINX-NEXT:    feq.h a0, a0, a0
2282 ; RV64IZHINX-NEXT:    seqz a0, a0
2283 ; RV64IZHINX-NEXT:    addi a0, a0, -1
2284 ; RV64IZHINX-NEXT:    and a0, a0, a1
2285 ; RV64IZHINX-NEXT:    ret
2287 ; RV32IZDINXZHINX-LABEL: fcvt_l_h_sat:
2288 ; RV32IZDINXZHINX:       # %bb.0: # %start
2289 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, -16
2290 ; RV32IZDINXZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2291 ; RV32IZDINXZHINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2292 ; RV32IZDINXZHINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2293 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h s0, a0
2294 ; RV32IZDINXZHINX-NEXT:    lui a0, 913408
2295 ; RV32IZDINXZHINX-NEXT:    fle.s s1, a0, s0
2296 ; RV32IZDINXZHINX-NEXT:    mv a0, s0
2297 ; RV32IZDINXZHINX-NEXT:    call __fixsfdi
2298 ; RV32IZDINXZHINX-NEXT:    lui a3, 524288
2299 ; RV32IZDINXZHINX-NEXT:    lui a2, 524288
2300 ; RV32IZDINXZHINX-NEXT:    beqz s1, .LBB10_2
2301 ; RV32IZDINXZHINX-NEXT:  # %bb.1: # %start
2302 ; RV32IZDINXZHINX-NEXT:    mv a2, a1
2303 ; RV32IZDINXZHINX-NEXT:  .LBB10_2: # %start
2304 ; RV32IZDINXZHINX-NEXT:    lui a1, 389120
2305 ; RV32IZDINXZHINX-NEXT:    addi a1, a1, -1
2306 ; RV32IZDINXZHINX-NEXT:    flt.s a1, a1, s0
2307 ; RV32IZDINXZHINX-NEXT:    beqz a1, .LBB10_4
2308 ; RV32IZDINXZHINX-NEXT:  # %bb.3:
2309 ; RV32IZDINXZHINX-NEXT:    addi a2, a3, -1
2310 ; RV32IZDINXZHINX-NEXT:  .LBB10_4: # %start
2311 ; RV32IZDINXZHINX-NEXT:    feq.s a3, s0, s0
2312 ; RV32IZDINXZHINX-NEXT:    neg a4, a1
2313 ; RV32IZDINXZHINX-NEXT:    neg a1, s1
2314 ; RV32IZDINXZHINX-NEXT:    neg a3, a3
2315 ; RV32IZDINXZHINX-NEXT:    and a0, a1, a0
2316 ; RV32IZDINXZHINX-NEXT:    and a1, a3, a2
2317 ; RV32IZDINXZHINX-NEXT:    or a0, a4, a0
2318 ; RV32IZDINXZHINX-NEXT:    and a0, a3, a0
2319 ; RV32IZDINXZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2320 ; RV32IZDINXZHINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2321 ; RV32IZDINXZHINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2322 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, 16
2323 ; RV32IZDINXZHINX-NEXT:    ret
2325 ; RV64IZDINXZHINX-LABEL: fcvt_l_h_sat:
2326 ; RV64IZDINXZHINX:       # %bb.0: # %start
2327 ; RV64IZDINXZHINX-NEXT:    fcvt.l.h a1, a0, rtz
2328 ; RV64IZDINXZHINX-NEXT:    feq.h a0, a0, a0
2329 ; RV64IZDINXZHINX-NEXT:    seqz a0, a0
2330 ; RV64IZDINXZHINX-NEXT:    addi a0, a0, -1
2331 ; RV64IZDINXZHINX-NEXT:    and a0, a0, a1
2332 ; RV64IZDINXZHINX-NEXT:    ret
2334 ; RV32I-LABEL: fcvt_l_h_sat:
2335 ; RV32I:       # %bb.0: # %start
2336 ; RV32I-NEXT:    addi sp, sp, -32
2337 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2338 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2339 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2340 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2341 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
2342 ; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
2343 ; RV32I-NEXT:    sw s5, 4(sp) # 4-byte Folded Spill
2344 ; RV32I-NEXT:    call __extendhfsf2
2345 ; RV32I-NEXT:    mv s2, a0
2346 ; RV32I-NEXT:    lui a1, 913408
2347 ; RV32I-NEXT:    call __gesf2
2348 ; RV32I-NEXT:    mv s0, a0
2349 ; RV32I-NEXT:    mv a0, s2
2350 ; RV32I-NEXT:    call __fixsfdi
2351 ; RV32I-NEXT:    mv s1, a0
2352 ; RV32I-NEXT:    mv s3, a1
2353 ; RV32I-NEXT:    lui s5, 524288
2354 ; RV32I-NEXT:    bgez s0, .LBB10_2
2355 ; RV32I-NEXT:  # %bb.1: # %start
2356 ; RV32I-NEXT:    lui s3, 524288
2357 ; RV32I-NEXT:  .LBB10_2: # %start
2358 ; RV32I-NEXT:    lui a1, 389120
2359 ; RV32I-NEXT:    addi a1, a1, -1
2360 ; RV32I-NEXT:    mv a0, s2
2361 ; RV32I-NEXT:    call __gtsf2
2362 ; RV32I-NEXT:    mv s4, a0
2363 ; RV32I-NEXT:    blez a0, .LBB10_4
2364 ; RV32I-NEXT:  # %bb.3: # %start
2365 ; RV32I-NEXT:    addi s3, s5, -1
2366 ; RV32I-NEXT:  .LBB10_4: # %start
2367 ; RV32I-NEXT:    mv a0, s2
2368 ; RV32I-NEXT:    mv a1, s2
2369 ; RV32I-NEXT:    call __unordsf2
2370 ; RV32I-NEXT:    snez a0, a0
2371 ; RV32I-NEXT:    sgtz a1, s4
2372 ; RV32I-NEXT:    slti a2, s0, 0
2373 ; RV32I-NEXT:    addi a0, a0, -1
2374 ; RV32I-NEXT:    neg a3, a1
2375 ; RV32I-NEXT:    addi a2, a2, -1
2376 ; RV32I-NEXT:    and a1, a0, s3
2377 ; RV32I-NEXT:    and a2, a2, s1
2378 ; RV32I-NEXT:    or a2, a3, a2
2379 ; RV32I-NEXT:    and a0, a0, a2
2380 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2381 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2382 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2383 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2384 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
2385 ; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
2386 ; RV32I-NEXT:    lw s5, 4(sp) # 4-byte Folded Reload
2387 ; RV32I-NEXT:    addi sp, sp, 32
2388 ; RV32I-NEXT:    ret
2390 ; RV64I-LABEL: fcvt_l_h_sat:
2391 ; RV64I:       # %bb.0: # %start
2392 ; RV64I-NEXT:    addi sp, sp, -48
2393 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2394 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2395 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2396 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2397 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
2398 ; RV64I-NEXT:    slli a0, a0, 48
2399 ; RV64I-NEXT:    srli a0, a0, 48
2400 ; RV64I-NEXT:    call __extendhfsf2
2401 ; RV64I-NEXT:    mv s0, a0
2402 ; RV64I-NEXT:    lui a1, 913408
2403 ; RV64I-NEXT:    call __gesf2
2404 ; RV64I-NEXT:    mv s2, a0
2405 ; RV64I-NEXT:    mv a0, s0
2406 ; RV64I-NEXT:    call __fixsfdi
2407 ; RV64I-NEXT:    mv s1, a0
2408 ; RV64I-NEXT:    li s3, -1
2409 ; RV64I-NEXT:    bgez s2, .LBB10_2
2410 ; RV64I-NEXT:  # %bb.1: # %start
2411 ; RV64I-NEXT:    slli s1, s3, 63
2412 ; RV64I-NEXT:  .LBB10_2: # %start
2413 ; RV64I-NEXT:    lui a1, 389120
2414 ; RV64I-NEXT:    addiw a1, a1, -1
2415 ; RV64I-NEXT:    mv a0, s0
2416 ; RV64I-NEXT:    call __gtsf2
2417 ; RV64I-NEXT:    blez a0, .LBB10_4
2418 ; RV64I-NEXT:  # %bb.3: # %start
2419 ; RV64I-NEXT:    srli s1, s3, 1
2420 ; RV64I-NEXT:  .LBB10_4: # %start
2421 ; RV64I-NEXT:    mv a0, s0
2422 ; RV64I-NEXT:    mv a1, s0
2423 ; RV64I-NEXT:    call __unordsf2
2424 ; RV64I-NEXT:    snez a0, a0
2425 ; RV64I-NEXT:    addi a0, a0, -1
2426 ; RV64I-NEXT:    and a0, a0, s1
2427 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2428 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2429 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2430 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2431 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
2432 ; RV64I-NEXT:    addi sp, sp, 48
2433 ; RV64I-NEXT:    ret
2435 ; RV32ID-ILP32-LABEL: fcvt_l_h_sat:
2436 ; RV32ID-ILP32:       # %bb.0: # %start
2437 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
2438 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2439 ; RV32ID-ILP32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2440 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
2441 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
2442 ; RV32ID-ILP32-NEXT:    lui a1, 913408
2443 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a1
2444 ; RV32ID-ILP32-NEXT:    fsw fa4, 4(sp) # 4-byte Folded Spill
2445 ; RV32ID-ILP32-NEXT:    fle.s s0, fa5, fa4
2446 ; RV32ID-ILP32-NEXT:    call __fixsfdi
2447 ; RV32ID-ILP32-NEXT:    lui a3, 524288
2448 ; RV32ID-ILP32-NEXT:    lui a2, 524288
2449 ; RV32ID-ILP32-NEXT:    beqz s0, .LBB10_2
2450 ; RV32ID-ILP32-NEXT:  # %bb.1: # %start
2451 ; RV32ID-ILP32-NEXT:    mv a2, a1
2452 ; RV32ID-ILP32-NEXT:  .LBB10_2: # %start
2453 ; RV32ID-ILP32-NEXT:    lui a1, %hi(.LCPI10_0)
2454 ; RV32ID-ILP32-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
2455 ; RV32ID-ILP32-NEXT:    flw fa4, 4(sp) # 4-byte Folded Reload
2456 ; RV32ID-ILP32-NEXT:    flt.s a1, fa5, fa4
2457 ; RV32ID-ILP32-NEXT:    fmv.s fa5, fa4
2458 ; RV32ID-ILP32-NEXT:    beqz a1, .LBB10_4
2459 ; RV32ID-ILP32-NEXT:  # %bb.3:
2460 ; RV32ID-ILP32-NEXT:    addi a2, a3, -1
2461 ; RV32ID-ILP32-NEXT:  .LBB10_4: # %start
2462 ; RV32ID-ILP32-NEXT:    feq.s a3, fa5, fa5
2463 ; RV32ID-ILP32-NEXT:    neg a4, a1
2464 ; RV32ID-ILP32-NEXT:    neg a1, s0
2465 ; RV32ID-ILP32-NEXT:    neg a3, a3
2466 ; RV32ID-ILP32-NEXT:    and a0, a1, a0
2467 ; RV32ID-ILP32-NEXT:    and a1, a3, a2
2468 ; RV32ID-ILP32-NEXT:    or a0, a4, a0
2469 ; RV32ID-ILP32-NEXT:    and a0, a3, a0
2470 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2471 ; RV32ID-ILP32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2472 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
2473 ; RV32ID-ILP32-NEXT:    ret
2475 ; RV64ID-LP64-LABEL: fcvt_l_h_sat:
2476 ; RV64ID-LP64:       # %bb.0: # %start
2477 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
2478 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2479 ; RV64ID-LP64-NEXT:    call __extendhfsf2
2480 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
2481 ; RV64ID-LP64-NEXT:    fcvt.l.s a0, fa5, rtz
2482 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
2483 ; RV64ID-LP64-NEXT:    seqz a1, a1
2484 ; RV64ID-LP64-NEXT:    addi a1, a1, -1
2485 ; RV64ID-LP64-NEXT:    and a0, a1, a0
2486 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2487 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
2488 ; RV64ID-LP64-NEXT:    ret
2490 ; RV32ID-LABEL: fcvt_l_h_sat:
2491 ; RV32ID:       # %bb.0: # %start
2492 ; RV32ID-NEXT:    addi sp, sp, -16
2493 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2494 ; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2495 ; RV32ID-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
2496 ; RV32ID-NEXT:    call __extendhfsf2
2497 ; RV32ID-NEXT:    fmv.s fs0, fa0
2498 ; RV32ID-NEXT:    lui a0, 913408
2499 ; RV32ID-NEXT:    fmv.w.x fa5, a0
2500 ; RV32ID-NEXT:    fle.s s0, fa5, fa0
2501 ; RV32ID-NEXT:    call __fixsfdi
2502 ; RV32ID-NEXT:    lui a3, 524288
2503 ; RV32ID-NEXT:    lui a2, 524288
2504 ; RV32ID-NEXT:    beqz s0, .LBB10_2
2505 ; RV32ID-NEXT:  # %bb.1: # %start
2506 ; RV32ID-NEXT:    mv a2, a1
2507 ; RV32ID-NEXT:  .LBB10_2: # %start
2508 ; RV32ID-NEXT:    lui a1, %hi(.LCPI10_0)
2509 ; RV32ID-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
2510 ; RV32ID-NEXT:    flt.s a1, fa5, fs0
2511 ; RV32ID-NEXT:    beqz a1, .LBB10_4
2512 ; RV32ID-NEXT:  # %bb.3:
2513 ; RV32ID-NEXT:    addi a2, a3, -1
2514 ; RV32ID-NEXT:  .LBB10_4: # %start
2515 ; RV32ID-NEXT:    feq.s a3, fs0, fs0
2516 ; RV32ID-NEXT:    neg a4, s0
2517 ; RV32ID-NEXT:    neg a5, a1
2518 ; RV32ID-NEXT:    neg a3, a3
2519 ; RV32ID-NEXT:    and a0, a4, a0
2520 ; RV32ID-NEXT:    and a1, a3, a2
2521 ; RV32ID-NEXT:    or a0, a5, a0
2522 ; RV32ID-NEXT:    and a0, a3, a0
2523 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2524 ; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2525 ; RV32ID-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
2526 ; RV32ID-NEXT:    addi sp, sp, 16
2527 ; RV32ID-NEXT:    ret
2529 ; RV64ID-LABEL: fcvt_l_h_sat:
2530 ; RV64ID:       # %bb.0: # %start
2531 ; RV64ID-NEXT:    addi sp, sp, -16
2532 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2533 ; RV64ID-NEXT:    call __extendhfsf2
2534 ; RV64ID-NEXT:    fcvt.l.s a0, fa0, rtz
2535 ; RV64ID-NEXT:    feq.s a1, fa0, fa0
2536 ; RV64ID-NEXT:    seqz a1, a1
2537 ; RV64ID-NEXT:    addi a1, a1, -1
2538 ; RV64ID-NEXT:    and a0, a1, a0
2539 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2540 ; RV64ID-NEXT:    addi sp, sp, 16
2541 ; RV64ID-NEXT:    ret
2543 ; RV32IFZFHMIN-LABEL: fcvt_l_h_sat:
2544 ; RV32IFZFHMIN:       # %bb.0: # %start
2545 ; RV32IFZFHMIN-NEXT:    addi sp, sp, -16
2546 ; RV32IFZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2547 ; RV32IFZFHMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2548 ; RV32IFZFHMIN-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
2549 ; RV32IFZFHMIN-NEXT:    fcvt.s.h fs0, fa0
2550 ; RV32IFZFHMIN-NEXT:    lui a0, 913408
2551 ; RV32IFZFHMIN-NEXT:    fmv.w.x fa5, a0
2552 ; RV32IFZFHMIN-NEXT:    fle.s s0, fa5, fs0
2553 ; RV32IFZFHMIN-NEXT:    fmv.s fa0, fs0
2554 ; RV32IFZFHMIN-NEXT:    call __fixsfdi
2555 ; RV32IFZFHMIN-NEXT:    lui a3, 524288
2556 ; RV32IFZFHMIN-NEXT:    lui a2, 524288
2557 ; RV32IFZFHMIN-NEXT:    beqz s0, .LBB10_2
2558 ; RV32IFZFHMIN-NEXT:  # %bb.1: # %start
2559 ; RV32IFZFHMIN-NEXT:    mv a2, a1
2560 ; RV32IFZFHMIN-NEXT:  .LBB10_2: # %start
2561 ; RV32IFZFHMIN-NEXT:    lui a1, %hi(.LCPI10_0)
2562 ; RV32IFZFHMIN-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
2563 ; RV32IFZFHMIN-NEXT:    flt.s a1, fa5, fs0
2564 ; RV32IFZFHMIN-NEXT:    beqz a1, .LBB10_4
2565 ; RV32IFZFHMIN-NEXT:  # %bb.3:
2566 ; RV32IFZFHMIN-NEXT:    addi a2, a3, -1
2567 ; RV32IFZFHMIN-NEXT:  .LBB10_4: # %start
2568 ; RV32IFZFHMIN-NEXT:    feq.s a3, fs0, fs0
2569 ; RV32IFZFHMIN-NEXT:    neg a4, a1
2570 ; RV32IFZFHMIN-NEXT:    neg a1, s0
2571 ; RV32IFZFHMIN-NEXT:    neg a3, a3
2572 ; RV32IFZFHMIN-NEXT:    and a0, a1, a0
2573 ; RV32IFZFHMIN-NEXT:    and a1, a3, a2
2574 ; RV32IFZFHMIN-NEXT:    or a0, a4, a0
2575 ; RV32IFZFHMIN-NEXT:    and a0, a3, a0
2576 ; RV32IFZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2577 ; RV32IFZFHMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2578 ; RV32IFZFHMIN-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
2579 ; RV32IFZFHMIN-NEXT:    addi sp, sp, 16
2580 ; RV32IFZFHMIN-NEXT:    ret
2582 ; CHECK64-IZFHMIN-LABEL: fcvt_l_h_sat:
2583 ; CHECK64-IZFHMIN:       # %bb.0: # %start
2584 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
2585 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a0, fa5, rtz
2586 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
2587 ; CHECK64-IZFHMIN-NEXT:    seqz a1, a1
2588 ; CHECK64-IZFHMIN-NEXT:    addi a1, a1, -1
2589 ; CHECK64-IZFHMIN-NEXT:    and a0, a1, a0
2590 ; CHECK64-IZFHMIN-NEXT:    ret
2592 ; RV32IDZFHMIN-LABEL: fcvt_l_h_sat:
2593 ; RV32IDZFHMIN:       # %bb.0: # %start
2594 ; RV32IDZFHMIN-NEXT:    addi sp, sp, -16
2595 ; RV32IDZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2596 ; RV32IDZFHMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2597 ; RV32IDZFHMIN-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
2598 ; RV32IDZFHMIN-NEXT:    fcvt.s.h fs0, fa0
2599 ; RV32IDZFHMIN-NEXT:    lui a0, 913408
2600 ; RV32IDZFHMIN-NEXT:    fmv.w.x fa5, a0
2601 ; RV32IDZFHMIN-NEXT:    fle.s s0, fa5, fs0
2602 ; RV32IDZFHMIN-NEXT:    fmv.s fa0, fs0
2603 ; RV32IDZFHMIN-NEXT:    call __fixsfdi
2604 ; RV32IDZFHMIN-NEXT:    lui a3, 524288
2605 ; RV32IDZFHMIN-NEXT:    lui a2, 524288
2606 ; RV32IDZFHMIN-NEXT:    beqz s0, .LBB10_2
2607 ; RV32IDZFHMIN-NEXT:  # %bb.1: # %start
2608 ; RV32IDZFHMIN-NEXT:    mv a2, a1
2609 ; RV32IDZFHMIN-NEXT:  .LBB10_2: # %start
2610 ; RV32IDZFHMIN-NEXT:    lui a1, %hi(.LCPI10_0)
2611 ; RV32IDZFHMIN-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
2612 ; RV32IDZFHMIN-NEXT:    flt.s a1, fa5, fs0
2613 ; RV32IDZFHMIN-NEXT:    beqz a1, .LBB10_4
2614 ; RV32IDZFHMIN-NEXT:  # %bb.3:
2615 ; RV32IDZFHMIN-NEXT:    addi a2, a3, -1
2616 ; RV32IDZFHMIN-NEXT:  .LBB10_4: # %start
2617 ; RV32IDZFHMIN-NEXT:    feq.s a3, fs0, fs0
2618 ; RV32IDZFHMIN-NEXT:    neg a4, a1
2619 ; RV32IDZFHMIN-NEXT:    neg a1, s0
2620 ; RV32IDZFHMIN-NEXT:    neg a3, a3
2621 ; RV32IDZFHMIN-NEXT:    and a0, a1, a0
2622 ; RV32IDZFHMIN-NEXT:    and a1, a3, a2
2623 ; RV32IDZFHMIN-NEXT:    or a0, a4, a0
2624 ; RV32IDZFHMIN-NEXT:    and a0, a3, a0
2625 ; RV32IDZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2626 ; RV32IDZFHMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2627 ; RV32IDZFHMIN-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
2628 ; RV32IDZFHMIN-NEXT:    addi sp, sp, 16
2629 ; RV32IDZFHMIN-NEXT:    ret
2631 ; CHECK32-IZHINXMIN-LABEL: fcvt_l_h_sat:
2632 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
2633 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
2634 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2635 ; CHECK32-IZHINXMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2636 ; CHECK32-IZHINXMIN-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2637 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h s0, a0
2638 ; CHECK32-IZHINXMIN-NEXT:    lui a0, 913408
2639 ; CHECK32-IZHINXMIN-NEXT:    fle.s s1, a0, s0
2640 ; CHECK32-IZHINXMIN-NEXT:    mv a0, s0
2641 ; CHECK32-IZHINXMIN-NEXT:    call __fixsfdi
2642 ; CHECK32-IZHINXMIN-NEXT:    lui a3, 524288
2643 ; CHECK32-IZHINXMIN-NEXT:    lui a2, 524288
2644 ; CHECK32-IZHINXMIN-NEXT:    beqz s1, .LBB10_2
2645 ; CHECK32-IZHINXMIN-NEXT:  # %bb.1: # %start
2646 ; CHECK32-IZHINXMIN-NEXT:    mv a2, a1
2647 ; CHECK32-IZHINXMIN-NEXT:  .LBB10_2: # %start
2648 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 389120
2649 ; CHECK32-IZHINXMIN-NEXT:    addi a1, a1, -1
2650 ; CHECK32-IZHINXMIN-NEXT:    flt.s a1, a1, s0
2651 ; CHECK32-IZHINXMIN-NEXT:    beqz a1, .LBB10_4
2652 ; CHECK32-IZHINXMIN-NEXT:  # %bb.3:
2653 ; CHECK32-IZHINXMIN-NEXT:    addi a2, a3, -1
2654 ; CHECK32-IZHINXMIN-NEXT:  .LBB10_4: # %start
2655 ; CHECK32-IZHINXMIN-NEXT:    feq.s a3, s0, s0
2656 ; CHECK32-IZHINXMIN-NEXT:    neg a4, a1
2657 ; CHECK32-IZHINXMIN-NEXT:    neg a1, s1
2658 ; CHECK32-IZHINXMIN-NEXT:    neg a3, a3
2659 ; CHECK32-IZHINXMIN-NEXT:    and a0, a1, a0
2660 ; CHECK32-IZHINXMIN-NEXT:    and a1, a3, a2
2661 ; CHECK32-IZHINXMIN-NEXT:    or a0, a4, a0
2662 ; CHECK32-IZHINXMIN-NEXT:    and a0, a3, a0
2663 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2664 ; CHECK32-IZHINXMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2665 ; CHECK32-IZHINXMIN-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2666 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
2667 ; CHECK32-IZHINXMIN-NEXT:    ret
2669 ; CHECK64-IZHINXMIN-LABEL: fcvt_l_h_sat:
2670 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
2671 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
2672 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a1, a0, rtz
2673 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
2674 ; CHECK64-IZHINXMIN-NEXT:    seqz a0, a0
2675 ; CHECK64-IZHINXMIN-NEXT:    addi a0, a0, -1
2676 ; CHECK64-IZHINXMIN-NEXT:    and a0, a0, a1
2677 ; CHECK64-IZHINXMIN-NEXT:    ret
2679 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_l_h_sat:
2680 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
2681 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
2682 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2683 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2684 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2685 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h s0, a0
2686 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a0, 913408
2687 ; CHECK32-IZDINXZHINXMIN-NEXT:    fle.s s1, a0, s0
2688 ; CHECK32-IZDINXZHINXMIN-NEXT:    mv a0, s0
2689 ; CHECK32-IZDINXZHINXMIN-NEXT:    call __fixsfdi
2690 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a3, 524288
2691 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a2, 524288
2692 ; CHECK32-IZDINXZHINXMIN-NEXT:    beqz s1, .LBB10_2
2693 ; CHECK32-IZDINXZHINXMIN-NEXT:  # %bb.1: # %start
2694 ; CHECK32-IZDINXZHINXMIN-NEXT:    mv a2, a1
2695 ; CHECK32-IZDINXZHINXMIN-NEXT:  .LBB10_2: # %start
2696 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 389120
2697 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a1, a1, -1
2698 ; CHECK32-IZDINXZHINXMIN-NEXT:    flt.s a1, a1, s0
2699 ; CHECK32-IZDINXZHINXMIN-NEXT:    beqz a1, .LBB10_4
2700 ; CHECK32-IZDINXZHINXMIN-NEXT:  # %bb.3:
2701 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a2, a3, -1
2702 ; CHECK32-IZDINXZHINXMIN-NEXT:  .LBB10_4: # %start
2703 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a3, s0, s0
2704 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg a4, a1
2705 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg a1, s1
2706 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg a3, a3
2707 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a1, a0
2708 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a1, a3, a2
2709 ; CHECK32-IZDINXZHINXMIN-NEXT:    or a0, a4, a0
2710 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a3, a0
2711 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2712 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2713 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2714 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
2715 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
2717 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_l_h_sat:
2718 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
2719 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
2720 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a1, a0, rtz
2721 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
2722 ; CHECK64-IZDINXZHINXMIN-NEXT:    seqz a0, a0
2723 ; CHECK64-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
2724 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
2725 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
2726 start:
2727   %0 = tail call i64 @llvm.fptosi.sat.i64.f16(half %a)
2728   ret i64 %0
2730 declare i64 @llvm.fptosi.sat.i64.f16(half)
2732 define i64 @fcvt_lu_h(half %a) nounwind {
2733 ; RV32IZFH-LABEL: fcvt_lu_h:
2734 ; RV32IZFH:       # %bb.0:
2735 ; RV32IZFH-NEXT:    addi sp, sp, -16
2736 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2737 ; RV32IZFH-NEXT:    call __fixunshfdi
2738 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2739 ; RV32IZFH-NEXT:    addi sp, sp, 16
2740 ; RV32IZFH-NEXT:    ret
2742 ; RV64IZFH-LABEL: fcvt_lu_h:
2743 ; RV64IZFH:       # %bb.0:
2744 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
2745 ; RV64IZFH-NEXT:    ret
2747 ; RV32IDZFH-LABEL: fcvt_lu_h:
2748 ; RV32IDZFH:       # %bb.0:
2749 ; RV32IDZFH-NEXT:    addi sp, sp, -16
2750 ; RV32IDZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2751 ; RV32IDZFH-NEXT:    call __fixunshfdi
2752 ; RV32IDZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2753 ; RV32IDZFH-NEXT:    addi sp, sp, 16
2754 ; RV32IDZFH-NEXT:    ret
2756 ; RV64IDZFH-LABEL: fcvt_lu_h:
2757 ; RV64IDZFH:       # %bb.0:
2758 ; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
2759 ; RV64IDZFH-NEXT:    ret
2761 ; RV32IZHINX-LABEL: fcvt_lu_h:
2762 ; RV32IZHINX:       # %bb.0:
2763 ; RV32IZHINX-NEXT:    addi sp, sp, -16
2764 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2765 ; RV32IZHINX-NEXT:    call __fixunshfdi
2766 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2767 ; RV32IZHINX-NEXT:    addi sp, sp, 16
2768 ; RV32IZHINX-NEXT:    ret
2770 ; RV64IZHINX-LABEL: fcvt_lu_h:
2771 ; RV64IZHINX:       # %bb.0:
2772 ; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
2773 ; RV64IZHINX-NEXT:    ret
2775 ; RV32IZDINXZHINX-LABEL: fcvt_lu_h:
2776 ; RV32IZDINXZHINX:       # %bb.0:
2777 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, -16
2778 ; RV32IZDINXZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2779 ; RV32IZDINXZHINX-NEXT:    call __fixunshfdi
2780 ; RV32IZDINXZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2781 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, 16
2782 ; RV32IZDINXZHINX-NEXT:    ret
2784 ; RV64IZDINXZHINX-LABEL: fcvt_lu_h:
2785 ; RV64IZDINXZHINX:       # %bb.0:
2786 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
2787 ; RV64IZDINXZHINX-NEXT:    ret
2789 ; RV32I-LABEL: fcvt_lu_h:
2790 ; RV32I:       # %bb.0:
2791 ; RV32I-NEXT:    addi sp, sp, -16
2792 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2793 ; RV32I-NEXT:    call __extendhfsf2
2794 ; RV32I-NEXT:    call __fixunssfdi
2795 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2796 ; RV32I-NEXT:    addi sp, sp, 16
2797 ; RV32I-NEXT:    ret
2799 ; RV64I-LABEL: fcvt_lu_h:
2800 ; RV64I:       # %bb.0:
2801 ; RV64I-NEXT:    addi sp, sp, -16
2802 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2803 ; RV64I-NEXT:    slli a0, a0, 48
2804 ; RV64I-NEXT:    srli a0, a0, 48
2805 ; RV64I-NEXT:    call __extendhfsf2
2806 ; RV64I-NEXT:    call __fixunssfdi
2807 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2808 ; RV64I-NEXT:    addi sp, sp, 16
2809 ; RV64I-NEXT:    ret
2811 ; RV32ID-ILP32-LABEL: fcvt_lu_h:
2812 ; RV32ID-ILP32:       # %bb.0:
2813 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
2814 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2815 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
2816 ; RV32ID-ILP32-NEXT:    call __fixunssfdi
2817 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2818 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
2819 ; RV32ID-ILP32-NEXT:    ret
2821 ; RV64ID-LP64-LABEL: fcvt_lu_h:
2822 ; RV64ID-LP64:       # %bb.0:
2823 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
2824 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2825 ; RV64ID-LP64-NEXT:    call __extendhfsf2
2826 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
2827 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
2828 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2829 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
2830 ; RV64ID-LP64-NEXT:    ret
2832 ; RV32ID-LABEL: fcvt_lu_h:
2833 ; RV32ID:       # %bb.0:
2834 ; RV32ID-NEXT:    addi sp, sp, -16
2835 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2836 ; RV32ID-NEXT:    call __extendhfsf2
2837 ; RV32ID-NEXT:    call __fixunssfdi
2838 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2839 ; RV32ID-NEXT:    addi sp, sp, 16
2840 ; RV32ID-NEXT:    ret
2842 ; RV64ID-LABEL: fcvt_lu_h:
2843 ; RV64ID:       # %bb.0:
2844 ; RV64ID-NEXT:    addi sp, sp, -16
2845 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2846 ; RV64ID-NEXT:    call __extendhfsf2
2847 ; RV64ID-NEXT:    fcvt.lu.s a0, fa0, rtz
2848 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2849 ; RV64ID-NEXT:    addi sp, sp, 16
2850 ; RV64ID-NEXT:    ret
2852 ; CHECK32-IZFHMIN-LABEL: fcvt_lu_h:
2853 ; CHECK32-IZFHMIN:       # %bb.0:
2854 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, -16
2855 ; CHECK32-IZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2856 ; CHECK32-IZFHMIN-NEXT:    call __fixunshfdi
2857 ; CHECK32-IZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2858 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, 16
2859 ; CHECK32-IZFHMIN-NEXT:    ret
2861 ; CHECK64-IZFHMIN-LABEL: fcvt_lu_h:
2862 ; CHECK64-IZFHMIN:       # %bb.0:
2863 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
2864 ; CHECK64-IZFHMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
2865 ; CHECK64-IZFHMIN-NEXT:    ret
2867 ; CHECK32-IZHINXMIN-LABEL: fcvt_lu_h:
2868 ; CHECK32-IZHINXMIN:       # %bb.0:
2869 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
2870 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2871 ; CHECK32-IZHINXMIN-NEXT:    call __fixunshfdi
2872 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2873 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
2874 ; CHECK32-IZHINXMIN-NEXT:    ret
2876 ; CHECK64-IZHINXMIN-LABEL: fcvt_lu_h:
2877 ; CHECK64-IZHINXMIN:       # %bb.0:
2878 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
2879 ; CHECK64-IZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
2880 ; CHECK64-IZHINXMIN-NEXT:    ret
2882 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_lu_h:
2883 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
2884 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
2885 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2886 ; CHECK32-IZDINXZHINXMIN-NEXT:    call __fixunshfdi
2887 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2888 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
2889 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
2891 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_lu_h:
2892 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
2893 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
2894 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
2895 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
2896   %1 = fptoui half %a to i64
2897   ret i64 %1
2900 define i64 @fcvt_lu_h_sat(half %a) nounwind {
2901 ; RV32IZFH-LABEL: fcvt_lu_h_sat:
2902 ; RV32IZFH:       # %bb.0: # %start
2903 ; RV32IZFH-NEXT:    addi sp, sp, -16
2904 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2905 ; RV32IZFH-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2906 ; RV32IZFH-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2907 ; RV32IZFH-NEXT:    lui a0, %hi(.LCPI12_0)
2908 ; RV32IZFH-NEXT:    flw fa5, %lo(.LCPI12_0)(a0)
2909 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
2910 ; RV32IZFH-NEXT:    fmv.w.x fa4, zero
2911 ; RV32IZFH-NEXT:    fle.s a0, fa4, fa0
2912 ; RV32IZFH-NEXT:    flt.s a1, fa5, fa0
2913 ; RV32IZFH-NEXT:    neg s0, a1
2914 ; RV32IZFH-NEXT:    neg s1, a0
2915 ; RV32IZFH-NEXT:    call __fixunssfdi
2916 ; RV32IZFH-NEXT:    and a0, s1, a0
2917 ; RV32IZFH-NEXT:    and a1, s1, a1
2918 ; RV32IZFH-NEXT:    or a0, s0, a0
2919 ; RV32IZFH-NEXT:    or a1, s0, a1
2920 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2921 ; RV32IZFH-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2922 ; RV32IZFH-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2923 ; RV32IZFH-NEXT:    addi sp, sp, 16
2924 ; RV32IZFH-NEXT:    ret
2926 ; RV64IZFH-LABEL: fcvt_lu_h_sat:
2927 ; RV64IZFH:       # %bb.0: # %start
2928 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
2929 ; RV64IZFH-NEXT:    feq.h a1, fa0, fa0
2930 ; RV64IZFH-NEXT:    seqz a1, a1
2931 ; RV64IZFH-NEXT:    addi a1, a1, -1
2932 ; RV64IZFH-NEXT:    and a0, a1, a0
2933 ; RV64IZFH-NEXT:    ret
2935 ; RV32IDZFH-LABEL: fcvt_lu_h_sat:
2936 ; RV32IDZFH:       # %bb.0: # %start
2937 ; RV32IDZFH-NEXT:    addi sp, sp, -16
2938 ; RV32IDZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2939 ; RV32IDZFH-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2940 ; RV32IDZFH-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2941 ; RV32IDZFH-NEXT:    lui a0, %hi(.LCPI12_0)
2942 ; RV32IDZFH-NEXT:    flw fa5, %lo(.LCPI12_0)(a0)
2943 ; RV32IDZFH-NEXT:    fcvt.s.h fa0, fa0
2944 ; RV32IDZFH-NEXT:    fmv.w.x fa4, zero
2945 ; RV32IDZFH-NEXT:    fle.s a0, fa4, fa0
2946 ; RV32IDZFH-NEXT:    flt.s a1, fa5, fa0
2947 ; RV32IDZFH-NEXT:    neg s0, a1
2948 ; RV32IDZFH-NEXT:    neg s1, a0
2949 ; RV32IDZFH-NEXT:    call __fixunssfdi
2950 ; RV32IDZFH-NEXT:    and a0, s1, a0
2951 ; RV32IDZFH-NEXT:    and a1, s1, a1
2952 ; RV32IDZFH-NEXT:    or a0, s0, a0
2953 ; RV32IDZFH-NEXT:    or a1, s0, a1
2954 ; RV32IDZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2955 ; RV32IDZFH-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2956 ; RV32IDZFH-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2957 ; RV32IDZFH-NEXT:    addi sp, sp, 16
2958 ; RV32IDZFH-NEXT:    ret
2960 ; RV64IDZFH-LABEL: fcvt_lu_h_sat:
2961 ; RV64IDZFH:       # %bb.0: # %start
2962 ; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
2963 ; RV64IDZFH-NEXT:    feq.h a1, fa0, fa0
2964 ; RV64IDZFH-NEXT:    seqz a1, a1
2965 ; RV64IDZFH-NEXT:    addi a1, a1, -1
2966 ; RV64IDZFH-NEXT:    and a0, a1, a0
2967 ; RV64IDZFH-NEXT:    ret
2969 ; RV32IZHINX-LABEL: fcvt_lu_h_sat:
2970 ; RV32IZHINX:       # %bb.0: # %start
2971 ; RV32IZHINX-NEXT:    addi sp, sp, -16
2972 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2973 ; RV32IZHINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2974 ; RV32IZHINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2975 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
2976 ; RV32IZHINX-NEXT:    lui a1, 391168
2977 ; RV32IZHINX-NEXT:    addi a1, a1, -1
2978 ; RV32IZHINX-NEXT:    fle.s a2, zero, a0
2979 ; RV32IZHINX-NEXT:    flt.s a1, a1, a0
2980 ; RV32IZHINX-NEXT:    neg s0, a1
2981 ; RV32IZHINX-NEXT:    neg s1, a2
2982 ; RV32IZHINX-NEXT:    call __fixunssfdi
2983 ; RV32IZHINX-NEXT:    and a0, s1, a0
2984 ; RV32IZHINX-NEXT:    and a1, s1, a1
2985 ; RV32IZHINX-NEXT:    or a0, s0, a0
2986 ; RV32IZHINX-NEXT:    or a1, s0, a1
2987 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2988 ; RV32IZHINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2989 ; RV32IZHINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2990 ; RV32IZHINX-NEXT:    addi sp, sp, 16
2991 ; RV32IZHINX-NEXT:    ret
2993 ; RV64IZHINX-LABEL: fcvt_lu_h_sat:
2994 ; RV64IZHINX:       # %bb.0: # %start
2995 ; RV64IZHINX-NEXT:    fcvt.lu.h a1, a0, rtz
2996 ; RV64IZHINX-NEXT:    feq.h a0, a0, a0
2997 ; RV64IZHINX-NEXT:    seqz a0, a0
2998 ; RV64IZHINX-NEXT:    addi a0, a0, -1
2999 ; RV64IZHINX-NEXT:    and a0, a0, a1
3000 ; RV64IZHINX-NEXT:    ret
3002 ; RV32IZDINXZHINX-LABEL: fcvt_lu_h_sat:
3003 ; RV32IZDINXZHINX:       # %bb.0: # %start
3004 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, -16
3005 ; RV32IZDINXZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3006 ; RV32IZDINXZHINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3007 ; RV32IZDINXZHINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3008 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
3009 ; RV32IZDINXZHINX-NEXT:    lui a1, 391168
3010 ; RV32IZDINXZHINX-NEXT:    addi a1, a1, -1
3011 ; RV32IZDINXZHINX-NEXT:    fle.s a2, zero, a0
3012 ; RV32IZDINXZHINX-NEXT:    flt.s a1, a1, a0
3013 ; RV32IZDINXZHINX-NEXT:    neg s0, a1
3014 ; RV32IZDINXZHINX-NEXT:    neg s1, a2
3015 ; RV32IZDINXZHINX-NEXT:    call __fixunssfdi
3016 ; RV32IZDINXZHINX-NEXT:    and a0, s1, a0
3017 ; RV32IZDINXZHINX-NEXT:    and a1, s1, a1
3018 ; RV32IZDINXZHINX-NEXT:    or a0, s0, a0
3019 ; RV32IZDINXZHINX-NEXT:    or a1, s0, a1
3020 ; RV32IZDINXZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3021 ; RV32IZDINXZHINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3022 ; RV32IZDINXZHINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3023 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, 16
3024 ; RV32IZDINXZHINX-NEXT:    ret
3026 ; RV64IZDINXZHINX-LABEL: fcvt_lu_h_sat:
3027 ; RV64IZDINXZHINX:       # %bb.0: # %start
3028 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a1, a0, rtz
3029 ; RV64IZDINXZHINX-NEXT:    feq.h a0, a0, a0
3030 ; RV64IZDINXZHINX-NEXT:    seqz a0, a0
3031 ; RV64IZDINXZHINX-NEXT:    addi a0, a0, -1
3032 ; RV64IZDINXZHINX-NEXT:    and a0, a0, a1
3033 ; RV64IZDINXZHINX-NEXT:    ret
3035 ; RV32I-LABEL: fcvt_lu_h_sat:
3036 ; RV32I:       # %bb.0: # %start
3037 ; RV32I-NEXT:    addi sp, sp, -16
3038 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3039 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3040 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3041 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
3042 ; RV32I-NEXT:    call __extendhfsf2
3043 ; RV32I-NEXT:    mv s0, a0
3044 ; RV32I-NEXT:    lui a1, 391168
3045 ; RV32I-NEXT:    addi a1, a1, -1
3046 ; RV32I-NEXT:    call __gtsf2
3047 ; RV32I-NEXT:    sgtz a0, a0
3048 ; RV32I-NEXT:    neg s1, a0
3049 ; RV32I-NEXT:    mv a0, s0
3050 ; RV32I-NEXT:    li a1, 0
3051 ; RV32I-NEXT:    call __gesf2
3052 ; RV32I-NEXT:    slti a0, a0, 0
3053 ; RV32I-NEXT:    addi s2, a0, -1
3054 ; RV32I-NEXT:    mv a0, s0
3055 ; RV32I-NEXT:    call __fixunssfdi
3056 ; RV32I-NEXT:    and a0, s2, a0
3057 ; RV32I-NEXT:    and a1, s2, a1
3058 ; RV32I-NEXT:    or a0, s1, a0
3059 ; RV32I-NEXT:    or a1, s1, a1
3060 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3061 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3062 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3063 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
3064 ; RV32I-NEXT:    addi sp, sp, 16
3065 ; RV32I-NEXT:    ret
3067 ; RV64I-LABEL: fcvt_lu_h_sat:
3068 ; RV64I:       # %bb.0: # %start
3069 ; RV64I-NEXT:    addi sp, sp, -32
3070 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3071 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3072 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3073 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
3074 ; RV64I-NEXT:    slli a0, a0, 48
3075 ; RV64I-NEXT:    srli a0, a0, 48
3076 ; RV64I-NEXT:    call __extendhfsf2
3077 ; RV64I-NEXT:    mv s0, a0
3078 ; RV64I-NEXT:    lui a1, 391168
3079 ; RV64I-NEXT:    addiw a1, a1, -1
3080 ; RV64I-NEXT:    call __gtsf2
3081 ; RV64I-NEXT:    sgtz a0, a0
3082 ; RV64I-NEXT:    neg s1, a0
3083 ; RV64I-NEXT:    mv a0, s0
3084 ; RV64I-NEXT:    li a1, 0
3085 ; RV64I-NEXT:    call __gesf2
3086 ; RV64I-NEXT:    slti a0, a0, 0
3087 ; RV64I-NEXT:    addi s2, a0, -1
3088 ; RV64I-NEXT:    mv a0, s0
3089 ; RV64I-NEXT:    call __fixunssfdi
3090 ; RV64I-NEXT:    and a0, s2, a0
3091 ; RV64I-NEXT:    or a0, s1, a0
3092 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3093 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3094 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3095 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
3096 ; RV64I-NEXT:    addi sp, sp, 32
3097 ; RV64I-NEXT:    ret
3099 ; RV32ID-ILP32-LABEL: fcvt_lu_h_sat:
3100 ; RV32ID-ILP32:       # %bb.0: # %start
3101 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
3102 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3103 ; RV32ID-ILP32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3104 ; RV32ID-ILP32-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3105 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
3106 ; RV32ID-ILP32-NEXT:    lui a1, %hi(.LCPI12_0)
3107 ; RV32ID-ILP32-NEXT:    flw fa5, %lo(.LCPI12_0)(a1)
3108 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
3109 ; RV32ID-ILP32-NEXT:    fmv.w.x fa3, zero
3110 ; RV32ID-ILP32-NEXT:    fle.s a1, fa3, fa4
3111 ; RV32ID-ILP32-NEXT:    flt.s a2, fa5, fa4
3112 ; RV32ID-ILP32-NEXT:    neg s0, a2
3113 ; RV32ID-ILP32-NEXT:    neg s1, a1
3114 ; RV32ID-ILP32-NEXT:    call __fixunssfdi
3115 ; RV32ID-ILP32-NEXT:    and a0, s1, a0
3116 ; RV32ID-ILP32-NEXT:    and a1, s1, a1
3117 ; RV32ID-ILP32-NEXT:    or a0, s0, a0
3118 ; RV32ID-ILP32-NEXT:    or a1, s0, a1
3119 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3120 ; RV32ID-ILP32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3121 ; RV32ID-ILP32-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3122 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
3123 ; RV32ID-ILP32-NEXT:    ret
3125 ; RV64ID-LP64-LABEL: fcvt_lu_h_sat:
3126 ; RV64ID-LP64:       # %bb.0: # %start
3127 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
3128 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3129 ; RV64ID-LP64-NEXT:    call __extendhfsf2
3130 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
3131 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
3132 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
3133 ; RV64ID-LP64-NEXT:    seqz a1, a1
3134 ; RV64ID-LP64-NEXT:    addi a1, a1, -1
3135 ; RV64ID-LP64-NEXT:    and a0, a1, a0
3136 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3137 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
3138 ; RV64ID-LP64-NEXT:    ret
3140 ; RV32ID-LABEL: fcvt_lu_h_sat:
3141 ; RV32ID:       # %bb.0: # %start
3142 ; RV32ID-NEXT:    addi sp, sp, -16
3143 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3144 ; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3145 ; RV32ID-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3146 ; RV32ID-NEXT:    call __extendhfsf2
3147 ; RV32ID-NEXT:    lui a0, %hi(.LCPI12_0)
3148 ; RV32ID-NEXT:    flw fa5, %lo(.LCPI12_0)(a0)
3149 ; RV32ID-NEXT:    fmv.w.x fa4, zero
3150 ; RV32ID-NEXT:    fle.s a0, fa4, fa0
3151 ; RV32ID-NEXT:    flt.s a1, fa5, fa0
3152 ; RV32ID-NEXT:    neg s0, a1
3153 ; RV32ID-NEXT:    neg s1, a0
3154 ; RV32ID-NEXT:    call __fixunssfdi
3155 ; RV32ID-NEXT:    and a0, s1, a0
3156 ; RV32ID-NEXT:    and a1, s1, a1
3157 ; RV32ID-NEXT:    or a0, s0, a0
3158 ; RV32ID-NEXT:    or a1, s0, a1
3159 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3160 ; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3161 ; RV32ID-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3162 ; RV32ID-NEXT:    addi sp, sp, 16
3163 ; RV32ID-NEXT:    ret
3165 ; RV64ID-LABEL: fcvt_lu_h_sat:
3166 ; RV64ID:       # %bb.0: # %start
3167 ; RV64ID-NEXT:    addi sp, sp, -16
3168 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3169 ; RV64ID-NEXT:    call __extendhfsf2
3170 ; RV64ID-NEXT:    fcvt.lu.s a0, fa0, rtz
3171 ; RV64ID-NEXT:    feq.s a1, fa0, fa0
3172 ; RV64ID-NEXT:    seqz a1, a1
3173 ; RV64ID-NEXT:    addi a1, a1, -1
3174 ; RV64ID-NEXT:    and a0, a1, a0
3175 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3176 ; RV64ID-NEXT:    addi sp, sp, 16
3177 ; RV64ID-NEXT:    ret
3179 ; CHECK32-IZFHMIN-LABEL: fcvt_lu_h_sat:
3180 ; CHECK32-IZFHMIN:       # %bb.0: # %start
3181 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, -16
3182 ; CHECK32-IZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3183 ; CHECK32-IZFHMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3184 ; CHECK32-IZFHMIN-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3185 ; CHECK32-IZFHMIN-NEXT:    lui a0, %hi(.LCPI12_0)
3186 ; CHECK32-IZFHMIN-NEXT:    flw fa5, %lo(.LCPI12_0)(a0)
3187 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa0, fa0
3188 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa4, zero
3189 ; CHECK32-IZFHMIN-NEXT:    fle.s a0, fa4, fa0
3190 ; CHECK32-IZFHMIN-NEXT:    flt.s a1, fa5, fa0
3191 ; CHECK32-IZFHMIN-NEXT:    neg s0, a1
3192 ; CHECK32-IZFHMIN-NEXT:    neg s1, a0
3193 ; CHECK32-IZFHMIN-NEXT:    call __fixunssfdi
3194 ; CHECK32-IZFHMIN-NEXT:    and a0, s1, a0
3195 ; CHECK32-IZFHMIN-NEXT:    and a1, s1, a1
3196 ; CHECK32-IZFHMIN-NEXT:    or a0, s0, a0
3197 ; CHECK32-IZFHMIN-NEXT:    or a1, s0, a1
3198 ; CHECK32-IZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3199 ; CHECK32-IZFHMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3200 ; CHECK32-IZFHMIN-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3201 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, 16
3202 ; CHECK32-IZFHMIN-NEXT:    ret
3204 ; CHECK64-IZFHMIN-LABEL: fcvt_lu_h_sat:
3205 ; CHECK64-IZFHMIN:       # %bb.0: # %start
3206 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
3207 ; CHECK64-IZFHMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
3208 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
3209 ; CHECK64-IZFHMIN-NEXT:    seqz a1, a1
3210 ; CHECK64-IZFHMIN-NEXT:    addi a1, a1, -1
3211 ; CHECK64-IZFHMIN-NEXT:    and a0, a1, a0
3212 ; CHECK64-IZFHMIN-NEXT:    ret
3214 ; CHECK32-IZHINXMIN-LABEL: fcvt_lu_h_sat:
3215 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
3216 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
3217 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3218 ; CHECK32-IZHINXMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3219 ; CHECK32-IZHINXMIN-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3220 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
3221 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 391168
3222 ; CHECK32-IZHINXMIN-NEXT:    addi a1, a1, -1
3223 ; CHECK32-IZHINXMIN-NEXT:    fle.s a2, zero, a0
3224 ; CHECK32-IZHINXMIN-NEXT:    flt.s a1, a1, a0
3225 ; CHECK32-IZHINXMIN-NEXT:    neg s0, a1
3226 ; CHECK32-IZHINXMIN-NEXT:    neg s1, a2
3227 ; CHECK32-IZHINXMIN-NEXT:    call __fixunssfdi
3228 ; CHECK32-IZHINXMIN-NEXT:    and a0, s1, a0
3229 ; CHECK32-IZHINXMIN-NEXT:    and a1, s1, a1
3230 ; CHECK32-IZHINXMIN-NEXT:    or a0, s0, a0
3231 ; CHECK32-IZHINXMIN-NEXT:    or a1, s0, a1
3232 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3233 ; CHECK32-IZHINXMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3234 ; CHECK32-IZHINXMIN-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3235 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
3236 ; CHECK32-IZHINXMIN-NEXT:    ret
3238 ; CHECK64-IZHINXMIN-LABEL: fcvt_lu_h_sat:
3239 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
3240 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
3241 ; CHECK64-IZHINXMIN-NEXT:    fcvt.lu.s a1, a0, rtz
3242 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
3243 ; CHECK64-IZHINXMIN-NEXT:    seqz a0, a0
3244 ; CHECK64-IZHINXMIN-NEXT:    addi a0, a0, -1
3245 ; CHECK64-IZHINXMIN-NEXT:    and a0, a0, a1
3246 ; CHECK64-IZHINXMIN-NEXT:    ret
3248 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_lu_h_sat:
3249 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
3250 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
3251 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3252 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3253 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3254 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
3255 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 391168
3256 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a1, a1, -1
3257 ; CHECK32-IZDINXZHINXMIN-NEXT:    fle.s a2, zero, a0
3258 ; CHECK32-IZDINXZHINXMIN-NEXT:    flt.s a1, a1, a0
3259 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg s0, a1
3260 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg s1, a2
3261 ; CHECK32-IZDINXZHINXMIN-NEXT:    call __fixunssfdi
3262 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, s1, a0
3263 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a1, s1, a1
3264 ; CHECK32-IZDINXZHINXMIN-NEXT:    or a0, s0, a0
3265 ; CHECK32-IZDINXZHINXMIN-NEXT:    or a1, s0, a1
3266 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3267 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3268 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3269 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
3270 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
3272 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_lu_h_sat:
3273 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
3274 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
3275 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.lu.s a1, a0, rtz
3276 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
3277 ; CHECK64-IZDINXZHINXMIN-NEXT:    seqz a0, a0
3278 ; CHECK64-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
3279 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
3280 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
3281 start:
3282   %0 = tail call i64 @llvm.fptoui.sat.i64.f16(half %a)
3283   ret i64 %0
3285 declare i64 @llvm.fptoui.sat.i64.f16(half)
3287 define half @fcvt_h_si(i16 %a) nounwind {
3288 ; RV32IZFH-LABEL: fcvt_h_si:
3289 ; RV32IZFH:       # %bb.0:
3290 ; RV32IZFH-NEXT:    slli a0, a0, 16
3291 ; RV32IZFH-NEXT:    srai a0, a0, 16
3292 ; RV32IZFH-NEXT:    fcvt.h.w fa0, a0
3293 ; RV32IZFH-NEXT:    ret
3295 ; RV64IZFH-LABEL: fcvt_h_si:
3296 ; RV64IZFH:       # %bb.0:
3297 ; RV64IZFH-NEXT:    slli a0, a0, 48
3298 ; RV64IZFH-NEXT:    srai a0, a0, 48
3299 ; RV64IZFH-NEXT:    fcvt.h.w fa0, a0
3300 ; RV64IZFH-NEXT:    ret
3302 ; RV32IDZFH-LABEL: fcvt_h_si:
3303 ; RV32IDZFH:       # %bb.0:
3304 ; RV32IDZFH-NEXT:    slli a0, a0, 16
3305 ; RV32IDZFH-NEXT:    srai a0, a0, 16
3306 ; RV32IDZFH-NEXT:    fcvt.h.w fa0, a0
3307 ; RV32IDZFH-NEXT:    ret
3309 ; RV64IDZFH-LABEL: fcvt_h_si:
3310 ; RV64IDZFH:       # %bb.0:
3311 ; RV64IDZFH-NEXT:    slli a0, a0, 48
3312 ; RV64IDZFH-NEXT:    srai a0, a0, 48
3313 ; RV64IDZFH-NEXT:    fcvt.h.w fa0, a0
3314 ; RV64IDZFH-NEXT:    ret
3316 ; RV32IZHINX-LABEL: fcvt_h_si:
3317 ; RV32IZHINX:       # %bb.0:
3318 ; RV32IZHINX-NEXT:    slli a0, a0, 16
3319 ; RV32IZHINX-NEXT:    srai a0, a0, 16
3320 ; RV32IZHINX-NEXT:    fcvt.h.w a0, a0
3321 ; RV32IZHINX-NEXT:    ret
3323 ; RV64IZHINX-LABEL: fcvt_h_si:
3324 ; RV64IZHINX:       # %bb.0:
3325 ; RV64IZHINX-NEXT:    slli a0, a0, 48
3326 ; RV64IZHINX-NEXT:    srai a0, a0, 48
3327 ; RV64IZHINX-NEXT:    fcvt.h.w a0, a0
3328 ; RV64IZHINX-NEXT:    ret
3330 ; RV32IZDINXZHINX-LABEL: fcvt_h_si:
3331 ; RV32IZDINXZHINX:       # %bb.0:
3332 ; RV32IZDINXZHINX-NEXT:    slli a0, a0, 16
3333 ; RV32IZDINXZHINX-NEXT:    srai a0, a0, 16
3334 ; RV32IZDINXZHINX-NEXT:    fcvt.h.w a0, a0
3335 ; RV32IZDINXZHINX-NEXT:    ret
3337 ; RV64IZDINXZHINX-LABEL: fcvt_h_si:
3338 ; RV64IZDINXZHINX:       # %bb.0:
3339 ; RV64IZDINXZHINX-NEXT:    slli a0, a0, 48
3340 ; RV64IZDINXZHINX-NEXT:    srai a0, a0, 48
3341 ; RV64IZDINXZHINX-NEXT:    fcvt.h.w a0, a0
3342 ; RV64IZDINXZHINX-NEXT:    ret
3344 ; RV32I-LABEL: fcvt_h_si:
3345 ; RV32I:       # %bb.0:
3346 ; RV32I-NEXT:    addi sp, sp, -16
3347 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3348 ; RV32I-NEXT:    slli a0, a0, 16
3349 ; RV32I-NEXT:    srai a0, a0, 16
3350 ; RV32I-NEXT:    call __floatsisf
3351 ; RV32I-NEXT:    call __truncsfhf2
3352 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3353 ; RV32I-NEXT:    addi sp, sp, 16
3354 ; RV32I-NEXT:    ret
3356 ; RV64I-LABEL: fcvt_h_si:
3357 ; RV64I:       # %bb.0:
3358 ; RV64I-NEXT:    addi sp, sp, -16
3359 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3360 ; RV64I-NEXT:    slli a0, a0, 48
3361 ; RV64I-NEXT:    srai a0, a0, 48
3362 ; RV64I-NEXT:    call __floatsisf
3363 ; RV64I-NEXT:    call __truncsfhf2
3364 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3365 ; RV64I-NEXT:    addi sp, sp, 16
3366 ; RV64I-NEXT:    ret
3368 ; RV32ID-ILP32-LABEL: fcvt_h_si:
3369 ; RV32ID-ILP32:       # %bb.0:
3370 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
3371 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3372 ; RV32ID-ILP32-NEXT:    slli a0, a0, 16
3373 ; RV32ID-ILP32-NEXT:    srai a0, a0, 16
3374 ; RV32ID-ILP32-NEXT:    fcvt.s.w fa5, a0
3375 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
3376 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
3377 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
3378 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
3379 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3380 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
3381 ; RV32ID-ILP32-NEXT:    ret
3383 ; RV64ID-LP64-LABEL: fcvt_h_si:
3384 ; RV64ID-LP64:       # %bb.0:
3385 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
3386 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3387 ; RV64ID-LP64-NEXT:    slli a0, a0, 48
3388 ; RV64ID-LP64-NEXT:    srai a0, a0, 48
3389 ; RV64ID-LP64-NEXT:    fcvt.s.w fa5, a0
3390 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
3391 ; RV64ID-LP64-NEXT:    call __truncsfhf2
3392 ; RV64ID-LP64-NEXT:    lui a1, 1048560
3393 ; RV64ID-LP64-NEXT:    or a0, a0, a1
3394 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3395 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
3396 ; RV64ID-LP64-NEXT:    ret
3398 ; RV32ID-LABEL: fcvt_h_si:
3399 ; RV32ID:       # %bb.0:
3400 ; RV32ID-NEXT:    addi sp, sp, -16
3401 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3402 ; RV32ID-NEXT:    slli a0, a0, 16
3403 ; RV32ID-NEXT:    srai a0, a0, 16
3404 ; RV32ID-NEXT:    fcvt.s.w fa0, a0
3405 ; RV32ID-NEXT:    call __truncsfhf2
3406 ; RV32ID-NEXT:    fmv.x.w a0, fa0
3407 ; RV32ID-NEXT:    lui a1, 1048560
3408 ; RV32ID-NEXT:    or a0, a0, a1
3409 ; RV32ID-NEXT:    fmv.w.x fa0, a0
3410 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3411 ; RV32ID-NEXT:    addi sp, sp, 16
3412 ; RV32ID-NEXT:    ret
3414 ; RV64ID-LABEL: fcvt_h_si:
3415 ; RV64ID:       # %bb.0:
3416 ; RV64ID-NEXT:    addi sp, sp, -16
3417 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3418 ; RV64ID-NEXT:    slli a0, a0, 48
3419 ; RV64ID-NEXT:    srai a0, a0, 48
3420 ; RV64ID-NEXT:    fcvt.s.w fa0, a0
3421 ; RV64ID-NEXT:    call __truncsfhf2
3422 ; RV64ID-NEXT:    fmv.x.w a0, fa0
3423 ; RV64ID-NEXT:    lui a1, 1048560
3424 ; RV64ID-NEXT:    or a0, a0, a1
3425 ; RV64ID-NEXT:    fmv.w.x fa0, a0
3426 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3427 ; RV64ID-NEXT:    addi sp, sp, 16
3428 ; RV64ID-NEXT:    ret
3430 ; CHECK32-IZFHMIN-LABEL: fcvt_h_si:
3431 ; CHECK32-IZFHMIN:       # %bb.0:
3432 ; CHECK32-IZFHMIN-NEXT:    slli a0, a0, 16
3433 ; CHECK32-IZFHMIN-NEXT:    srai a0, a0, 16
3434 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
3435 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3436 ; CHECK32-IZFHMIN-NEXT:    ret
3438 ; CHECK64-IZFHMIN-LABEL: fcvt_h_si:
3439 ; CHECK64-IZFHMIN:       # %bb.0:
3440 ; CHECK64-IZFHMIN-NEXT:    slli a0, a0, 48
3441 ; CHECK64-IZFHMIN-NEXT:    srai a0, a0, 48
3442 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
3443 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3444 ; CHECK64-IZFHMIN-NEXT:    ret
3446 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_si:
3447 ; CHECK32-IZHINXMIN:       # %bb.0:
3448 ; CHECK32-IZHINXMIN-NEXT:    slli a0, a0, 16
3449 ; CHECK32-IZHINXMIN-NEXT:    srai a0, a0, 16
3450 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
3451 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3452 ; CHECK32-IZHINXMIN-NEXT:    ret
3454 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_si:
3455 ; CHECK64-IZHINXMIN:       # %bb.0:
3456 ; CHECK64-IZHINXMIN-NEXT:    slli a0, a0, 48
3457 ; CHECK64-IZHINXMIN-NEXT:    srai a0, a0, 48
3458 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
3459 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3460 ; CHECK64-IZHINXMIN-NEXT:    ret
3462 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_si:
3463 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
3464 ; CHECK32-IZDINXZHINXMIN-NEXT:    slli a0, a0, 16
3465 ; CHECK32-IZDINXZHINXMIN-NEXT:    srai a0, a0, 16
3466 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
3467 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3468 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
3470 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_si:
3471 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
3472 ; CHECK64-IZDINXZHINXMIN-NEXT:    slli a0, a0, 48
3473 ; CHECK64-IZDINXZHINXMIN-NEXT:    srai a0, a0, 48
3474 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
3475 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3476 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
3477   %1 = sitofp i16 %a to half
3478   ret half %1
3481 define half @fcvt_h_si_signext(i16 signext %a) nounwind {
3482 ; CHECKIZFH-LABEL: fcvt_h_si_signext:
3483 ; CHECKIZFH:       # %bb.0:
3484 ; CHECKIZFH-NEXT:    fcvt.h.w fa0, a0
3485 ; CHECKIZFH-NEXT:    ret
3487 ; RV32IDZFH-LABEL: fcvt_h_si_signext:
3488 ; RV32IDZFH:       # %bb.0:
3489 ; RV32IDZFH-NEXT:    fcvt.h.w fa0, a0
3490 ; RV32IDZFH-NEXT:    ret
3492 ; RV64IDZFH-LABEL: fcvt_h_si_signext:
3493 ; RV64IDZFH:       # %bb.0:
3494 ; RV64IDZFH-NEXT:    fcvt.h.w fa0, a0
3495 ; RV64IDZFH-NEXT:    ret
3497 ; CHECKIZHINX-LABEL: fcvt_h_si_signext:
3498 ; CHECKIZHINX:       # %bb.0:
3499 ; CHECKIZHINX-NEXT:    fcvt.h.w a0, a0
3500 ; CHECKIZHINX-NEXT:    ret
3502 ; CHECKIZDINXZHINX-LABEL: fcvt_h_si_signext:
3503 ; CHECKIZDINXZHINX:       # %bb.0:
3504 ; CHECKIZDINXZHINX-NEXT:    fcvt.h.w a0, a0
3505 ; CHECKIZDINXZHINX-NEXT:    ret
3507 ; RV32I-LABEL: fcvt_h_si_signext:
3508 ; RV32I:       # %bb.0:
3509 ; RV32I-NEXT:    addi sp, sp, -16
3510 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3511 ; RV32I-NEXT:    call __floatsisf
3512 ; RV32I-NEXT:    call __truncsfhf2
3513 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3514 ; RV32I-NEXT:    addi sp, sp, 16
3515 ; RV32I-NEXT:    ret
3517 ; RV64I-LABEL: fcvt_h_si_signext:
3518 ; RV64I:       # %bb.0:
3519 ; RV64I-NEXT:    addi sp, sp, -16
3520 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3521 ; RV64I-NEXT:    call __floatsisf
3522 ; RV64I-NEXT:    call __truncsfhf2
3523 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3524 ; RV64I-NEXT:    addi sp, sp, 16
3525 ; RV64I-NEXT:    ret
3527 ; RV32ID-ILP32-LABEL: fcvt_h_si_signext:
3528 ; RV32ID-ILP32:       # %bb.0:
3529 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
3530 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3531 ; RV32ID-ILP32-NEXT:    fcvt.s.w fa5, a0
3532 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
3533 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
3534 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
3535 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
3536 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3537 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
3538 ; RV32ID-ILP32-NEXT:    ret
3540 ; RV64ID-LP64-LABEL: fcvt_h_si_signext:
3541 ; RV64ID-LP64:       # %bb.0:
3542 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
3543 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3544 ; RV64ID-LP64-NEXT:    fcvt.s.w fa5, a0
3545 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
3546 ; RV64ID-LP64-NEXT:    call __truncsfhf2
3547 ; RV64ID-LP64-NEXT:    lui a1, 1048560
3548 ; RV64ID-LP64-NEXT:    or a0, a0, a1
3549 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3550 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
3551 ; RV64ID-LP64-NEXT:    ret
3553 ; RV32ID-LABEL: fcvt_h_si_signext:
3554 ; RV32ID:       # %bb.0:
3555 ; RV32ID-NEXT:    addi sp, sp, -16
3556 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3557 ; RV32ID-NEXT:    fcvt.s.w fa0, a0
3558 ; RV32ID-NEXT:    call __truncsfhf2
3559 ; RV32ID-NEXT:    fmv.x.w a0, fa0
3560 ; RV32ID-NEXT:    lui a1, 1048560
3561 ; RV32ID-NEXT:    or a0, a0, a1
3562 ; RV32ID-NEXT:    fmv.w.x fa0, a0
3563 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3564 ; RV32ID-NEXT:    addi sp, sp, 16
3565 ; RV32ID-NEXT:    ret
3567 ; RV64ID-LABEL: fcvt_h_si_signext:
3568 ; RV64ID:       # %bb.0:
3569 ; RV64ID-NEXT:    addi sp, sp, -16
3570 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3571 ; RV64ID-NEXT:    fcvt.s.w fa0, a0
3572 ; RV64ID-NEXT:    call __truncsfhf2
3573 ; RV64ID-NEXT:    fmv.x.w a0, fa0
3574 ; RV64ID-NEXT:    lui a1, 1048560
3575 ; RV64ID-NEXT:    or a0, a0, a1
3576 ; RV64ID-NEXT:    fmv.w.x fa0, a0
3577 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3578 ; RV64ID-NEXT:    addi sp, sp, 16
3579 ; RV64ID-NEXT:    ret
3581 ; CHECK32-IZFHMIN-LABEL: fcvt_h_si_signext:
3582 ; CHECK32-IZFHMIN:       # %bb.0:
3583 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
3584 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3585 ; CHECK32-IZFHMIN-NEXT:    ret
3587 ; CHECK64-IZFHMIN-LABEL: fcvt_h_si_signext:
3588 ; CHECK64-IZFHMIN:       # %bb.0:
3589 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
3590 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3591 ; CHECK64-IZFHMIN-NEXT:    ret
3593 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_si_signext:
3594 ; CHECK32-IZHINXMIN:       # %bb.0:
3595 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
3596 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3597 ; CHECK32-IZHINXMIN-NEXT:    ret
3599 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_si_signext:
3600 ; CHECK64-IZHINXMIN:       # %bb.0:
3601 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
3602 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3603 ; CHECK64-IZHINXMIN-NEXT:    ret
3605 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_si_signext:
3606 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
3607 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
3608 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3609 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
3611 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_si_signext:
3612 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
3613 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
3614 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3615 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
3616   %1 = sitofp i16 %a to half
3617   ret half %1
3620 define half @fcvt_h_ui(i16 %a) nounwind {
3621 ; RV32IZFH-LABEL: fcvt_h_ui:
3622 ; RV32IZFH:       # %bb.0:
3623 ; RV32IZFH-NEXT:    slli a0, a0, 16
3624 ; RV32IZFH-NEXT:    srli a0, a0, 16
3625 ; RV32IZFH-NEXT:    fcvt.h.wu fa0, a0
3626 ; RV32IZFH-NEXT:    ret
3628 ; RV64IZFH-LABEL: fcvt_h_ui:
3629 ; RV64IZFH:       # %bb.0:
3630 ; RV64IZFH-NEXT:    slli a0, a0, 48
3631 ; RV64IZFH-NEXT:    srli a0, a0, 48
3632 ; RV64IZFH-NEXT:    fcvt.h.wu fa0, a0
3633 ; RV64IZFH-NEXT:    ret
3635 ; RV32IDZFH-LABEL: fcvt_h_ui:
3636 ; RV32IDZFH:       # %bb.0:
3637 ; RV32IDZFH-NEXT:    slli a0, a0, 16
3638 ; RV32IDZFH-NEXT:    srli a0, a0, 16
3639 ; RV32IDZFH-NEXT:    fcvt.h.wu fa0, a0
3640 ; RV32IDZFH-NEXT:    ret
3642 ; RV64IDZFH-LABEL: fcvt_h_ui:
3643 ; RV64IDZFH:       # %bb.0:
3644 ; RV64IDZFH-NEXT:    slli a0, a0, 48
3645 ; RV64IDZFH-NEXT:    srli a0, a0, 48
3646 ; RV64IDZFH-NEXT:    fcvt.h.wu fa0, a0
3647 ; RV64IDZFH-NEXT:    ret
3649 ; RV32IZHINX-LABEL: fcvt_h_ui:
3650 ; RV32IZHINX:       # %bb.0:
3651 ; RV32IZHINX-NEXT:    slli a0, a0, 16
3652 ; RV32IZHINX-NEXT:    srli a0, a0, 16
3653 ; RV32IZHINX-NEXT:    fcvt.h.wu a0, a0
3654 ; RV32IZHINX-NEXT:    ret
3656 ; RV64IZHINX-LABEL: fcvt_h_ui:
3657 ; RV64IZHINX:       # %bb.0:
3658 ; RV64IZHINX-NEXT:    slli a0, a0, 48
3659 ; RV64IZHINX-NEXT:    srli a0, a0, 48
3660 ; RV64IZHINX-NEXT:    fcvt.h.wu a0, a0
3661 ; RV64IZHINX-NEXT:    ret
3663 ; RV32IZDINXZHINX-LABEL: fcvt_h_ui:
3664 ; RV32IZDINXZHINX:       # %bb.0:
3665 ; RV32IZDINXZHINX-NEXT:    slli a0, a0, 16
3666 ; RV32IZDINXZHINX-NEXT:    srli a0, a0, 16
3667 ; RV32IZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
3668 ; RV32IZDINXZHINX-NEXT:    ret
3670 ; RV64IZDINXZHINX-LABEL: fcvt_h_ui:
3671 ; RV64IZDINXZHINX:       # %bb.0:
3672 ; RV64IZDINXZHINX-NEXT:    slli a0, a0, 48
3673 ; RV64IZDINXZHINX-NEXT:    srli a0, a0, 48
3674 ; RV64IZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
3675 ; RV64IZDINXZHINX-NEXT:    ret
3677 ; RV32I-LABEL: fcvt_h_ui:
3678 ; RV32I:       # %bb.0:
3679 ; RV32I-NEXT:    addi sp, sp, -16
3680 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3681 ; RV32I-NEXT:    slli a0, a0, 16
3682 ; RV32I-NEXT:    srli a0, a0, 16
3683 ; RV32I-NEXT:    call __floatunsisf
3684 ; RV32I-NEXT:    call __truncsfhf2
3685 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3686 ; RV32I-NEXT:    addi sp, sp, 16
3687 ; RV32I-NEXT:    ret
3689 ; RV64I-LABEL: fcvt_h_ui:
3690 ; RV64I:       # %bb.0:
3691 ; RV64I-NEXT:    addi sp, sp, -16
3692 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3693 ; RV64I-NEXT:    slli a0, a0, 48
3694 ; RV64I-NEXT:    srli a0, a0, 48
3695 ; RV64I-NEXT:    call __floatunsisf
3696 ; RV64I-NEXT:    call __truncsfhf2
3697 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3698 ; RV64I-NEXT:    addi sp, sp, 16
3699 ; RV64I-NEXT:    ret
3701 ; RV32ID-ILP32-LABEL: fcvt_h_ui:
3702 ; RV32ID-ILP32:       # %bb.0:
3703 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
3704 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3705 ; RV32ID-ILP32-NEXT:    slli a0, a0, 16
3706 ; RV32ID-ILP32-NEXT:    srli a0, a0, 16
3707 ; RV32ID-ILP32-NEXT:    fcvt.s.wu fa5, a0
3708 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
3709 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
3710 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
3711 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
3712 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3713 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
3714 ; RV32ID-ILP32-NEXT:    ret
3716 ; RV64ID-LP64-LABEL: fcvt_h_ui:
3717 ; RV64ID-LP64:       # %bb.0:
3718 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
3719 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3720 ; RV64ID-LP64-NEXT:    slli a0, a0, 48
3721 ; RV64ID-LP64-NEXT:    srli a0, a0, 48
3722 ; RV64ID-LP64-NEXT:    fcvt.s.wu fa5, a0
3723 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
3724 ; RV64ID-LP64-NEXT:    call __truncsfhf2
3725 ; RV64ID-LP64-NEXT:    lui a1, 1048560
3726 ; RV64ID-LP64-NEXT:    or a0, a0, a1
3727 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3728 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
3729 ; RV64ID-LP64-NEXT:    ret
3731 ; RV32ID-LABEL: fcvt_h_ui:
3732 ; RV32ID:       # %bb.0:
3733 ; RV32ID-NEXT:    addi sp, sp, -16
3734 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3735 ; RV32ID-NEXT:    slli a0, a0, 16
3736 ; RV32ID-NEXT:    srli a0, a0, 16
3737 ; RV32ID-NEXT:    fcvt.s.wu fa0, a0
3738 ; RV32ID-NEXT:    call __truncsfhf2
3739 ; RV32ID-NEXT:    fmv.x.w a0, fa0
3740 ; RV32ID-NEXT:    lui a1, 1048560
3741 ; RV32ID-NEXT:    or a0, a0, a1
3742 ; RV32ID-NEXT:    fmv.w.x fa0, a0
3743 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3744 ; RV32ID-NEXT:    addi sp, sp, 16
3745 ; RV32ID-NEXT:    ret
3747 ; RV64ID-LABEL: fcvt_h_ui:
3748 ; RV64ID:       # %bb.0:
3749 ; RV64ID-NEXT:    addi sp, sp, -16
3750 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3751 ; RV64ID-NEXT:    slli a0, a0, 48
3752 ; RV64ID-NEXT:    srli a0, a0, 48
3753 ; RV64ID-NEXT:    fcvt.s.wu fa0, a0
3754 ; RV64ID-NEXT:    call __truncsfhf2
3755 ; RV64ID-NEXT:    fmv.x.w a0, fa0
3756 ; RV64ID-NEXT:    lui a1, 1048560
3757 ; RV64ID-NEXT:    or a0, a0, a1
3758 ; RV64ID-NEXT:    fmv.w.x fa0, a0
3759 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3760 ; RV64ID-NEXT:    addi sp, sp, 16
3761 ; RV64ID-NEXT:    ret
3763 ; CHECK32-IZFHMIN-LABEL: fcvt_h_ui:
3764 ; CHECK32-IZFHMIN:       # %bb.0:
3765 ; CHECK32-IZFHMIN-NEXT:    slli a0, a0, 16
3766 ; CHECK32-IZFHMIN-NEXT:    srli a0, a0, 16
3767 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
3768 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3769 ; CHECK32-IZFHMIN-NEXT:    ret
3771 ; CHECK64-IZFHMIN-LABEL: fcvt_h_ui:
3772 ; CHECK64-IZFHMIN:       # %bb.0:
3773 ; CHECK64-IZFHMIN-NEXT:    slli a0, a0, 48
3774 ; CHECK64-IZFHMIN-NEXT:    srli a0, a0, 48
3775 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
3776 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3777 ; CHECK64-IZFHMIN-NEXT:    ret
3779 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_ui:
3780 ; CHECK32-IZHINXMIN:       # %bb.0:
3781 ; CHECK32-IZHINXMIN-NEXT:    slli a0, a0, 16
3782 ; CHECK32-IZHINXMIN-NEXT:    srli a0, a0, 16
3783 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3784 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3785 ; CHECK32-IZHINXMIN-NEXT:    ret
3787 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_ui:
3788 ; CHECK64-IZHINXMIN:       # %bb.0:
3789 ; CHECK64-IZHINXMIN-NEXT:    slli a0, a0, 48
3790 ; CHECK64-IZHINXMIN-NEXT:    srli a0, a0, 48
3791 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3792 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3793 ; CHECK64-IZHINXMIN-NEXT:    ret
3795 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_ui:
3796 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
3797 ; CHECK32-IZDINXZHINXMIN-NEXT:    slli a0, a0, 16
3798 ; CHECK32-IZDINXZHINXMIN-NEXT:    srli a0, a0, 16
3799 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3800 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3801 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
3803 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_ui:
3804 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
3805 ; CHECK64-IZDINXZHINXMIN-NEXT:    slli a0, a0, 48
3806 ; CHECK64-IZDINXZHINXMIN-NEXT:    srli a0, a0, 48
3807 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3808 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3809 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
3810   %1 = uitofp i16 %a to half
3811   ret half %1
3814 define half @fcvt_h_ui_zeroext(i16 zeroext %a) nounwind {
3815 ; CHECKIZFH-LABEL: fcvt_h_ui_zeroext:
3816 ; CHECKIZFH:       # %bb.0:
3817 ; CHECKIZFH-NEXT:    fcvt.h.wu fa0, a0
3818 ; CHECKIZFH-NEXT:    ret
3820 ; RV32IDZFH-LABEL: fcvt_h_ui_zeroext:
3821 ; RV32IDZFH:       # %bb.0:
3822 ; RV32IDZFH-NEXT:    fcvt.h.wu fa0, a0
3823 ; RV32IDZFH-NEXT:    ret
3825 ; RV64IDZFH-LABEL: fcvt_h_ui_zeroext:
3826 ; RV64IDZFH:       # %bb.0:
3827 ; RV64IDZFH-NEXT:    fcvt.h.wu fa0, a0
3828 ; RV64IDZFH-NEXT:    ret
3830 ; CHECKIZHINX-LABEL: fcvt_h_ui_zeroext:
3831 ; CHECKIZHINX:       # %bb.0:
3832 ; CHECKIZHINX-NEXT:    fcvt.h.wu a0, a0
3833 ; CHECKIZHINX-NEXT:    ret
3835 ; CHECKIZDINXZHINX-LABEL: fcvt_h_ui_zeroext:
3836 ; CHECKIZDINXZHINX:       # %bb.0:
3837 ; CHECKIZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
3838 ; CHECKIZDINXZHINX-NEXT:    ret
3840 ; RV32I-LABEL: fcvt_h_ui_zeroext:
3841 ; RV32I:       # %bb.0:
3842 ; RV32I-NEXT:    addi sp, sp, -16
3843 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3844 ; RV32I-NEXT:    call __floatunsisf
3845 ; RV32I-NEXT:    call __truncsfhf2
3846 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3847 ; RV32I-NEXT:    addi sp, sp, 16
3848 ; RV32I-NEXT:    ret
3850 ; RV64I-LABEL: fcvt_h_ui_zeroext:
3851 ; RV64I:       # %bb.0:
3852 ; RV64I-NEXT:    addi sp, sp, -16
3853 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3854 ; RV64I-NEXT:    call __floatunsisf
3855 ; RV64I-NEXT:    call __truncsfhf2
3856 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3857 ; RV64I-NEXT:    addi sp, sp, 16
3858 ; RV64I-NEXT:    ret
3860 ; RV32ID-ILP32-LABEL: fcvt_h_ui_zeroext:
3861 ; RV32ID-ILP32:       # %bb.0:
3862 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
3863 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3864 ; RV32ID-ILP32-NEXT:    fcvt.s.wu fa5, a0
3865 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
3866 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
3867 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
3868 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
3869 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3870 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
3871 ; RV32ID-ILP32-NEXT:    ret
3873 ; RV64ID-LP64-LABEL: fcvt_h_ui_zeroext:
3874 ; RV64ID-LP64:       # %bb.0:
3875 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
3876 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3877 ; RV64ID-LP64-NEXT:    fcvt.s.wu fa5, a0
3878 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
3879 ; RV64ID-LP64-NEXT:    call __truncsfhf2
3880 ; RV64ID-LP64-NEXT:    lui a1, 1048560
3881 ; RV64ID-LP64-NEXT:    or a0, a0, a1
3882 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3883 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
3884 ; RV64ID-LP64-NEXT:    ret
3886 ; RV32ID-LABEL: fcvt_h_ui_zeroext:
3887 ; RV32ID:       # %bb.0:
3888 ; RV32ID-NEXT:    addi sp, sp, -16
3889 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3890 ; RV32ID-NEXT:    fcvt.s.wu fa0, a0
3891 ; RV32ID-NEXT:    call __truncsfhf2
3892 ; RV32ID-NEXT:    fmv.x.w a0, fa0
3893 ; RV32ID-NEXT:    lui a1, 1048560
3894 ; RV32ID-NEXT:    or a0, a0, a1
3895 ; RV32ID-NEXT:    fmv.w.x fa0, a0
3896 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3897 ; RV32ID-NEXT:    addi sp, sp, 16
3898 ; RV32ID-NEXT:    ret
3900 ; RV64ID-LABEL: fcvt_h_ui_zeroext:
3901 ; RV64ID:       # %bb.0:
3902 ; RV64ID-NEXT:    addi sp, sp, -16
3903 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3904 ; RV64ID-NEXT:    fcvt.s.wu fa0, a0
3905 ; RV64ID-NEXT:    call __truncsfhf2
3906 ; RV64ID-NEXT:    fmv.x.w a0, fa0
3907 ; RV64ID-NEXT:    lui a1, 1048560
3908 ; RV64ID-NEXT:    or a0, a0, a1
3909 ; RV64ID-NEXT:    fmv.w.x fa0, a0
3910 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3911 ; RV64ID-NEXT:    addi sp, sp, 16
3912 ; RV64ID-NEXT:    ret
3914 ; CHECK32-IZFHMIN-LABEL: fcvt_h_ui_zeroext:
3915 ; CHECK32-IZFHMIN:       # %bb.0:
3916 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
3917 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3918 ; CHECK32-IZFHMIN-NEXT:    ret
3920 ; CHECK64-IZFHMIN-LABEL: fcvt_h_ui_zeroext:
3921 ; CHECK64-IZFHMIN:       # %bb.0:
3922 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
3923 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
3924 ; CHECK64-IZFHMIN-NEXT:    ret
3926 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_ui_zeroext:
3927 ; CHECK32-IZHINXMIN:       # %bb.0:
3928 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3929 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3930 ; CHECK32-IZHINXMIN-NEXT:    ret
3932 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_ui_zeroext:
3933 ; CHECK64-IZHINXMIN:       # %bb.0:
3934 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3935 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
3936 ; CHECK64-IZHINXMIN-NEXT:    ret
3938 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_ui_zeroext:
3939 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
3940 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3941 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3942 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
3944 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_ui_zeroext:
3945 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
3946 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
3947 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
3948 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
3949   %1 = uitofp i16 %a to half
3950   ret half %1
3953 define half @fcvt_h_w(i32 %a) nounwind {
3954 ; CHECKIZFH-LABEL: fcvt_h_w:
3955 ; CHECKIZFH:       # %bb.0:
3956 ; CHECKIZFH-NEXT:    fcvt.h.w fa0, a0
3957 ; CHECKIZFH-NEXT:    ret
3959 ; RV32IDZFH-LABEL: fcvt_h_w:
3960 ; RV32IDZFH:       # %bb.0:
3961 ; RV32IDZFH-NEXT:    fcvt.h.w fa0, a0
3962 ; RV32IDZFH-NEXT:    ret
3964 ; RV64IDZFH-LABEL: fcvt_h_w:
3965 ; RV64IDZFH:       # %bb.0:
3966 ; RV64IDZFH-NEXT:    fcvt.h.w fa0, a0
3967 ; RV64IDZFH-NEXT:    ret
3969 ; CHECKIZHINX-LABEL: fcvt_h_w:
3970 ; CHECKIZHINX:       # %bb.0:
3971 ; CHECKIZHINX-NEXT:    fcvt.h.w a0, a0
3972 ; CHECKIZHINX-NEXT:    ret
3974 ; CHECKIZDINXZHINX-LABEL: fcvt_h_w:
3975 ; CHECKIZDINXZHINX:       # %bb.0:
3976 ; CHECKIZDINXZHINX-NEXT:    fcvt.h.w a0, a0
3977 ; CHECKIZDINXZHINX-NEXT:    ret
3979 ; RV32I-LABEL: fcvt_h_w:
3980 ; RV32I:       # %bb.0:
3981 ; RV32I-NEXT:    addi sp, sp, -16
3982 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3983 ; RV32I-NEXT:    call __floatsisf
3984 ; RV32I-NEXT:    call __truncsfhf2
3985 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3986 ; RV32I-NEXT:    addi sp, sp, 16
3987 ; RV32I-NEXT:    ret
3989 ; RV64I-LABEL: fcvt_h_w:
3990 ; RV64I:       # %bb.0:
3991 ; RV64I-NEXT:    addi sp, sp, -16
3992 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3993 ; RV64I-NEXT:    sext.w a0, a0
3994 ; RV64I-NEXT:    call __floatsisf
3995 ; RV64I-NEXT:    call __truncsfhf2
3996 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3997 ; RV64I-NEXT:    addi sp, sp, 16
3998 ; RV64I-NEXT:    ret
4000 ; RV32ID-ILP32-LABEL: fcvt_h_w:
4001 ; RV32ID-ILP32:       # %bb.0:
4002 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
4003 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4004 ; RV32ID-ILP32-NEXT:    fcvt.s.w fa5, a0
4005 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
4006 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
4007 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
4008 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
4009 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4010 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
4011 ; RV32ID-ILP32-NEXT:    ret
4013 ; RV64ID-LP64-LABEL: fcvt_h_w:
4014 ; RV64ID-LP64:       # %bb.0:
4015 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
4016 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4017 ; RV64ID-LP64-NEXT:    fcvt.s.w fa5, a0
4018 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
4019 ; RV64ID-LP64-NEXT:    call __truncsfhf2
4020 ; RV64ID-LP64-NEXT:    lui a1, 1048560
4021 ; RV64ID-LP64-NEXT:    or a0, a0, a1
4022 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4023 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
4024 ; RV64ID-LP64-NEXT:    ret
4026 ; RV32ID-LABEL: fcvt_h_w:
4027 ; RV32ID:       # %bb.0:
4028 ; RV32ID-NEXT:    addi sp, sp, -16
4029 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4030 ; RV32ID-NEXT:    fcvt.s.w fa0, a0
4031 ; RV32ID-NEXT:    call __truncsfhf2
4032 ; RV32ID-NEXT:    fmv.x.w a0, fa0
4033 ; RV32ID-NEXT:    lui a1, 1048560
4034 ; RV32ID-NEXT:    or a0, a0, a1
4035 ; RV32ID-NEXT:    fmv.w.x fa0, a0
4036 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4037 ; RV32ID-NEXT:    addi sp, sp, 16
4038 ; RV32ID-NEXT:    ret
4040 ; RV64ID-LABEL: fcvt_h_w:
4041 ; RV64ID:       # %bb.0:
4042 ; RV64ID-NEXT:    addi sp, sp, -16
4043 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4044 ; RV64ID-NEXT:    fcvt.s.w fa0, a0
4045 ; RV64ID-NEXT:    call __truncsfhf2
4046 ; RV64ID-NEXT:    fmv.x.w a0, fa0
4047 ; RV64ID-NEXT:    lui a1, 1048560
4048 ; RV64ID-NEXT:    or a0, a0, a1
4049 ; RV64ID-NEXT:    fmv.w.x fa0, a0
4050 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4051 ; RV64ID-NEXT:    addi sp, sp, 16
4052 ; RV64ID-NEXT:    ret
4054 ; CHECK32-IZFHMIN-LABEL: fcvt_h_w:
4055 ; CHECK32-IZFHMIN:       # %bb.0:
4056 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
4057 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4058 ; CHECK32-IZFHMIN-NEXT:    ret
4060 ; CHECK64-IZFHMIN-LABEL: fcvt_h_w:
4061 ; CHECK64-IZFHMIN:       # %bb.0:
4062 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
4063 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4064 ; CHECK64-IZFHMIN-NEXT:    ret
4066 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_w:
4067 ; CHECK32-IZHINXMIN:       # %bb.0:
4068 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
4069 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4070 ; CHECK32-IZHINXMIN-NEXT:    ret
4072 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_w:
4073 ; CHECK64-IZHINXMIN:       # %bb.0:
4074 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
4075 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4076 ; CHECK64-IZHINXMIN-NEXT:    ret
4078 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_w:
4079 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
4080 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
4081 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4082 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
4084 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_w:
4085 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
4086 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
4087 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4088 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
4089   %1 = sitofp i32 %a to half
4090   ret half %1
4093 define half @fcvt_h_w_load(ptr %p) nounwind {
4094 ; CHECKIZFH-LABEL: fcvt_h_w_load:
4095 ; CHECKIZFH:       # %bb.0:
4096 ; CHECKIZFH-NEXT:    lw a0, 0(a0)
4097 ; CHECKIZFH-NEXT:    fcvt.h.w fa0, a0
4098 ; CHECKIZFH-NEXT:    ret
4100 ; RV32IDZFH-LABEL: fcvt_h_w_load:
4101 ; RV32IDZFH:       # %bb.0:
4102 ; RV32IDZFH-NEXT:    lw a0, 0(a0)
4103 ; RV32IDZFH-NEXT:    fcvt.h.w fa0, a0
4104 ; RV32IDZFH-NEXT:    ret
4106 ; RV64IDZFH-LABEL: fcvt_h_w_load:
4107 ; RV64IDZFH:       # %bb.0:
4108 ; RV64IDZFH-NEXT:    lw a0, 0(a0)
4109 ; RV64IDZFH-NEXT:    fcvt.h.w fa0, a0
4110 ; RV64IDZFH-NEXT:    ret
4112 ; CHECKIZHINX-LABEL: fcvt_h_w_load:
4113 ; CHECKIZHINX:       # %bb.0:
4114 ; CHECKIZHINX-NEXT:    lw a0, 0(a0)
4115 ; CHECKIZHINX-NEXT:    fcvt.h.w a0, a0
4116 ; CHECKIZHINX-NEXT:    ret
4118 ; CHECKIZDINXZHINX-LABEL: fcvt_h_w_load:
4119 ; CHECKIZDINXZHINX:       # %bb.0:
4120 ; CHECKIZDINXZHINX-NEXT:    lw a0, 0(a0)
4121 ; CHECKIZDINXZHINX-NEXT:    fcvt.h.w a0, a0
4122 ; CHECKIZDINXZHINX-NEXT:    ret
4124 ; RV32I-LABEL: fcvt_h_w_load:
4125 ; RV32I:       # %bb.0:
4126 ; RV32I-NEXT:    addi sp, sp, -16
4127 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4128 ; RV32I-NEXT:    lw a0, 0(a0)
4129 ; RV32I-NEXT:    call __floatsisf
4130 ; RV32I-NEXT:    call __truncsfhf2
4131 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4132 ; RV32I-NEXT:    addi sp, sp, 16
4133 ; RV32I-NEXT:    ret
4135 ; RV64I-LABEL: fcvt_h_w_load:
4136 ; RV64I:       # %bb.0:
4137 ; RV64I-NEXT:    addi sp, sp, -16
4138 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4139 ; RV64I-NEXT:    lw a0, 0(a0)
4140 ; RV64I-NEXT:    call __floatsisf
4141 ; RV64I-NEXT:    call __truncsfhf2
4142 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4143 ; RV64I-NEXT:    addi sp, sp, 16
4144 ; RV64I-NEXT:    ret
4146 ; RV32ID-ILP32-LABEL: fcvt_h_w_load:
4147 ; RV32ID-ILP32:       # %bb.0:
4148 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
4149 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4150 ; RV32ID-ILP32-NEXT:    lw a0, 0(a0)
4151 ; RV32ID-ILP32-NEXT:    fcvt.s.w fa5, a0
4152 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
4153 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
4154 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
4155 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
4156 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4157 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
4158 ; RV32ID-ILP32-NEXT:    ret
4160 ; RV64ID-LP64-LABEL: fcvt_h_w_load:
4161 ; RV64ID-LP64:       # %bb.0:
4162 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
4163 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4164 ; RV64ID-LP64-NEXT:    lw a0, 0(a0)
4165 ; RV64ID-LP64-NEXT:    fcvt.s.w fa5, a0
4166 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
4167 ; RV64ID-LP64-NEXT:    call __truncsfhf2
4168 ; RV64ID-LP64-NEXT:    lui a1, 1048560
4169 ; RV64ID-LP64-NEXT:    or a0, a0, a1
4170 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4171 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
4172 ; RV64ID-LP64-NEXT:    ret
4174 ; RV32ID-LABEL: fcvt_h_w_load:
4175 ; RV32ID:       # %bb.0:
4176 ; RV32ID-NEXT:    addi sp, sp, -16
4177 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4178 ; RV32ID-NEXT:    lw a0, 0(a0)
4179 ; RV32ID-NEXT:    fcvt.s.w fa0, a0
4180 ; RV32ID-NEXT:    call __truncsfhf2
4181 ; RV32ID-NEXT:    fmv.x.w a0, fa0
4182 ; RV32ID-NEXT:    lui a1, 1048560
4183 ; RV32ID-NEXT:    or a0, a0, a1
4184 ; RV32ID-NEXT:    fmv.w.x fa0, a0
4185 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4186 ; RV32ID-NEXT:    addi sp, sp, 16
4187 ; RV32ID-NEXT:    ret
4189 ; RV64ID-LABEL: fcvt_h_w_load:
4190 ; RV64ID:       # %bb.0:
4191 ; RV64ID-NEXT:    addi sp, sp, -16
4192 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4193 ; RV64ID-NEXT:    lw a0, 0(a0)
4194 ; RV64ID-NEXT:    fcvt.s.w fa0, a0
4195 ; RV64ID-NEXT:    call __truncsfhf2
4196 ; RV64ID-NEXT:    fmv.x.w a0, fa0
4197 ; RV64ID-NEXT:    lui a1, 1048560
4198 ; RV64ID-NEXT:    or a0, a0, a1
4199 ; RV64ID-NEXT:    fmv.w.x fa0, a0
4200 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4201 ; RV64ID-NEXT:    addi sp, sp, 16
4202 ; RV64ID-NEXT:    ret
4204 ; CHECK32-IZFHMIN-LABEL: fcvt_h_w_load:
4205 ; CHECK32-IZFHMIN:       # %bb.0:
4206 ; CHECK32-IZFHMIN-NEXT:    lw a0, 0(a0)
4207 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
4208 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4209 ; CHECK32-IZFHMIN-NEXT:    ret
4211 ; CHECK64-IZFHMIN-LABEL: fcvt_h_w_load:
4212 ; CHECK64-IZFHMIN:       # %bb.0:
4213 ; CHECK64-IZFHMIN-NEXT:    lw a0, 0(a0)
4214 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
4215 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4216 ; CHECK64-IZFHMIN-NEXT:    ret
4218 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_w_load:
4219 ; CHECK32-IZHINXMIN:       # %bb.0:
4220 ; CHECK32-IZHINXMIN-NEXT:    lw a0, 0(a0)
4221 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
4222 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4223 ; CHECK32-IZHINXMIN-NEXT:    ret
4225 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_w_load:
4226 ; CHECK64-IZHINXMIN:       # %bb.0:
4227 ; CHECK64-IZHINXMIN-NEXT:    lw a0, 0(a0)
4228 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.w a0, a0
4229 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4230 ; CHECK64-IZHINXMIN-NEXT:    ret
4232 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_w_load:
4233 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
4234 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw a0, 0(a0)
4235 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
4236 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4237 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
4239 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_w_load:
4240 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
4241 ; CHECK64-IZDINXZHINXMIN-NEXT:    lw a0, 0(a0)
4242 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.w a0, a0
4243 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4244 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
4245   %a = load i32, ptr %p
4246   %1 = sitofp i32 %a to half
4247   ret half %1
4250 define half @fcvt_h_wu(i32 %a) nounwind {
4251 ; CHECKIZFH-LABEL: fcvt_h_wu:
4252 ; CHECKIZFH:       # %bb.0:
4253 ; CHECKIZFH-NEXT:    fcvt.h.wu fa0, a0
4254 ; CHECKIZFH-NEXT:    ret
4256 ; RV32IDZFH-LABEL: fcvt_h_wu:
4257 ; RV32IDZFH:       # %bb.0:
4258 ; RV32IDZFH-NEXT:    fcvt.h.wu fa0, a0
4259 ; RV32IDZFH-NEXT:    ret
4261 ; RV64IDZFH-LABEL: fcvt_h_wu:
4262 ; RV64IDZFH:       # %bb.0:
4263 ; RV64IDZFH-NEXT:    fcvt.h.wu fa0, a0
4264 ; RV64IDZFH-NEXT:    ret
4266 ; CHECKIZHINX-LABEL: fcvt_h_wu:
4267 ; CHECKIZHINX:       # %bb.0:
4268 ; CHECKIZHINX-NEXT:    fcvt.h.wu a0, a0
4269 ; CHECKIZHINX-NEXT:    ret
4271 ; CHECKIZDINXZHINX-LABEL: fcvt_h_wu:
4272 ; CHECKIZDINXZHINX:       # %bb.0:
4273 ; CHECKIZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
4274 ; CHECKIZDINXZHINX-NEXT:    ret
4276 ; RV32I-LABEL: fcvt_h_wu:
4277 ; RV32I:       # %bb.0:
4278 ; RV32I-NEXT:    addi sp, sp, -16
4279 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4280 ; RV32I-NEXT:    call __floatunsisf
4281 ; RV32I-NEXT:    call __truncsfhf2
4282 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4283 ; RV32I-NEXT:    addi sp, sp, 16
4284 ; RV32I-NEXT:    ret
4286 ; RV64I-LABEL: fcvt_h_wu:
4287 ; RV64I:       # %bb.0:
4288 ; RV64I-NEXT:    addi sp, sp, -16
4289 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4290 ; RV64I-NEXT:    sext.w a0, a0
4291 ; RV64I-NEXT:    call __floatunsisf
4292 ; RV64I-NEXT:    call __truncsfhf2
4293 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4294 ; RV64I-NEXT:    addi sp, sp, 16
4295 ; RV64I-NEXT:    ret
4297 ; RV32ID-ILP32-LABEL: fcvt_h_wu:
4298 ; RV32ID-ILP32:       # %bb.0:
4299 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
4300 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4301 ; RV32ID-ILP32-NEXT:    fcvt.s.wu fa5, a0
4302 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
4303 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
4304 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
4305 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
4306 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4307 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
4308 ; RV32ID-ILP32-NEXT:    ret
4310 ; RV64ID-LP64-LABEL: fcvt_h_wu:
4311 ; RV64ID-LP64:       # %bb.0:
4312 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
4313 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4314 ; RV64ID-LP64-NEXT:    fcvt.s.wu fa5, a0
4315 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
4316 ; RV64ID-LP64-NEXT:    call __truncsfhf2
4317 ; RV64ID-LP64-NEXT:    lui a1, 1048560
4318 ; RV64ID-LP64-NEXT:    or a0, a0, a1
4319 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4320 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
4321 ; RV64ID-LP64-NEXT:    ret
4323 ; RV32ID-LABEL: fcvt_h_wu:
4324 ; RV32ID:       # %bb.0:
4325 ; RV32ID-NEXT:    addi sp, sp, -16
4326 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4327 ; RV32ID-NEXT:    fcvt.s.wu fa0, a0
4328 ; RV32ID-NEXT:    call __truncsfhf2
4329 ; RV32ID-NEXT:    fmv.x.w a0, fa0
4330 ; RV32ID-NEXT:    lui a1, 1048560
4331 ; RV32ID-NEXT:    or a0, a0, a1
4332 ; RV32ID-NEXT:    fmv.w.x fa0, a0
4333 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4334 ; RV32ID-NEXT:    addi sp, sp, 16
4335 ; RV32ID-NEXT:    ret
4337 ; RV64ID-LABEL: fcvt_h_wu:
4338 ; RV64ID:       # %bb.0:
4339 ; RV64ID-NEXT:    addi sp, sp, -16
4340 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4341 ; RV64ID-NEXT:    fcvt.s.wu fa0, a0
4342 ; RV64ID-NEXT:    call __truncsfhf2
4343 ; RV64ID-NEXT:    fmv.x.w a0, fa0
4344 ; RV64ID-NEXT:    lui a1, 1048560
4345 ; RV64ID-NEXT:    or a0, a0, a1
4346 ; RV64ID-NEXT:    fmv.w.x fa0, a0
4347 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4348 ; RV64ID-NEXT:    addi sp, sp, 16
4349 ; RV64ID-NEXT:    ret
4351 ; CHECK32-IZFHMIN-LABEL: fcvt_h_wu:
4352 ; CHECK32-IZFHMIN:       # %bb.0:
4353 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
4354 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4355 ; CHECK32-IZFHMIN-NEXT:    ret
4357 ; CHECK64-IZFHMIN-LABEL: fcvt_h_wu:
4358 ; CHECK64-IZFHMIN:       # %bb.0:
4359 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
4360 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4361 ; CHECK64-IZFHMIN-NEXT:    ret
4363 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_wu:
4364 ; CHECK32-IZHINXMIN:       # %bb.0:
4365 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4366 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4367 ; CHECK32-IZHINXMIN-NEXT:    ret
4369 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu:
4370 ; CHECK64-IZHINXMIN:       # %bb.0:
4371 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4372 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4373 ; CHECK64-IZHINXMIN-NEXT:    ret
4375 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_wu:
4376 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
4377 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4378 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4379 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
4381 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu:
4382 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
4383 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4384 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4385 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
4386   %1 = uitofp i32 %a to half
4387   ret half %1
4390 define half @fcvt_h_wu_load(ptr %p) nounwind {
4391 ; RV32IZFH-LABEL: fcvt_h_wu_load:
4392 ; RV32IZFH:       # %bb.0:
4393 ; RV32IZFH-NEXT:    lw a0, 0(a0)
4394 ; RV32IZFH-NEXT:    fcvt.h.wu fa0, a0
4395 ; RV32IZFH-NEXT:    ret
4397 ; RV64IZFH-LABEL: fcvt_h_wu_load:
4398 ; RV64IZFH:       # %bb.0:
4399 ; RV64IZFH-NEXT:    lwu a0, 0(a0)
4400 ; RV64IZFH-NEXT:    fcvt.h.wu fa0, a0
4401 ; RV64IZFH-NEXT:    ret
4403 ; RV32IDZFH-LABEL: fcvt_h_wu_load:
4404 ; RV32IDZFH:       # %bb.0:
4405 ; RV32IDZFH-NEXT:    lw a0, 0(a0)
4406 ; RV32IDZFH-NEXT:    fcvt.h.wu fa0, a0
4407 ; RV32IDZFH-NEXT:    ret
4409 ; RV64IDZFH-LABEL: fcvt_h_wu_load:
4410 ; RV64IDZFH:       # %bb.0:
4411 ; RV64IDZFH-NEXT:    lwu a0, 0(a0)
4412 ; RV64IDZFH-NEXT:    fcvt.h.wu fa0, a0
4413 ; RV64IDZFH-NEXT:    ret
4415 ; RV32IZHINX-LABEL: fcvt_h_wu_load:
4416 ; RV32IZHINX:       # %bb.0:
4417 ; RV32IZHINX-NEXT:    lw a0, 0(a0)
4418 ; RV32IZHINX-NEXT:    fcvt.h.wu a0, a0
4419 ; RV32IZHINX-NEXT:    ret
4421 ; RV64IZHINX-LABEL: fcvt_h_wu_load:
4422 ; RV64IZHINX:       # %bb.0:
4423 ; RV64IZHINX-NEXT:    lwu a0, 0(a0)
4424 ; RV64IZHINX-NEXT:    fcvt.h.wu a0, a0
4425 ; RV64IZHINX-NEXT:    ret
4427 ; RV32IZDINXZHINX-LABEL: fcvt_h_wu_load:
4428 ; RV32IZDINXZHINX:       # %bb.0:
4429 ; RV32IZDINXZHINX-NEXT:    lw a0, 0(a0)
4430 ; RV32IZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
4431 ; RV32IZDINXZHINX-NEXT:    ret
4433 ; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load:
4434 ; RV64IZDINXZHINX:       # %bb.0:
4435 ; RV64IZDINXZHINX-NEXT:    lwu a0, 0(a0)
4436 ; RV64IZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
4437 ; RV64IZDINXZHINX-NEXT:    ret
4439 ; RV32I-LABEL: fcvt_h_wu_load:
4440 ; RV32I:       # %bb.0:
4441 ; RV32I-NEXT:    addi sp, sp, -16
4442 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4443 ; RV32I-NEXT:    lw a0, 0(a0)
4444 ; RV32I-NEXT:    call __floatunsisf
4445 ; RV32I-NEXT:    call __truncsfhf2
4446 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4447 ; RV32I-NEXT:    addi sp, sp, 16
4448 ; RV32I-NEXT:    ret
4450 ; RV64I-LABEL: fcvt_h_wu_load:
4451 ; RV64I:       # %bb.0:
4452 ; RV64I-NEXT:    addi sp, sp, -16
4453 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4454 ; RV64I-NEXT:    lw a0, 0(a0)
4455 ; RV64I-NEXT:    call __floatunsisf
4456 ; RV64I-NEXT:    call __truncsfhf2
4457 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4458 ; RV64I-NEXT:    addi sp, sp, 16
4459 ; RV64I-NEXT:    ret
4461 ; RV32ID-ILP32-LABEL: fcvt_h_wu_load:
4462 ; RV32ID-ILP32:       # %bb.0:
4463 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
4464 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4465 ; RV32ID-ILP32-NEXT:    lw a0, 0(a0)
4466 ; RV32ID-ILP32-NEXT:    fcvt.s.wu fa5, a0
4467 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
4468 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
4469 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
4470 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
4471 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4472 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
4473 ; RV32ID-ILP32-NEXT:    ret
4475 ; RV64ID-LP64-LABEL: fcvt_h_wu_load:
4476 ; RV64ID-LP64:       # %bb.0:
4477 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
4478 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4479 ; RV64ID-LP64-NEXT:    lwu a0, 0(a0)
4480 ; RV64ID-LP64-NEXT:    fcvt.s.wu fa5, a0
4481 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
4482 ; RV64ID-LP64-NEXT:    call __truncsfhf2
4483 ; RV64ID-LP64-NEXT:    lui a1, 1048560
4484 ; RV64ID-LP64-NEXT:    or a0, a0, a1
4485 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4486 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
4487 ; RV64ID-LP64-NEXT:    ret
4489 ; RV32ID-LABEL: fcvt_h_wu_load:
4490 ; RV32ID:       # %bb.0:
4491 ; RV32ID-NEXT:    addi sp, sp, -16
4492 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4493 ; RV32ID-NEXT:    lw a0, 0(a0)
4494 ; RV32ID-NEXT:    fcvt.s.wu fa0, a0
4495 ; RV32ID-NEXT:    call __truncsfhf2
4496 ; RV32ID-NEXT:    fmv.x.w a0, fa0
4497 ; RV32ID-NEXT:    lui a1, 1048560
4498 ; RV32ID-NEXT:    or a0, a0, a1
4499 ; RV32ID-NEXT:    fmv.w.x fa0, a0
4500 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4501 ; RV32ID-NEXT:    addi sp, sp, 16
4502 ; RV32ID-NEXT:    ret
4504 ; RV64ID-LABEL: fcvt_h_wu_load:
4505 ; RV64ID:       # %bb.0:
4506 ; RV64ID-NEXT:    addi sp, sp, -16
4507 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4508 ; RV64ID-NEXT:    lwu a0, 0(a0)
4509 ; RV64ID-NEXT:    fcvt.s.wu fa0, a0
4510 ; RV64ID-NEXT:    call __truncsfhf2
4511 ; RV64ID-NEXT:    fmv.x.w a0, fa0
4512 ; RV64ID-NEXT:    lui a1, 1048560
4513 ; RV64ID-NEXT:    or a0, a0, a1
4514 ; RV64ID-NEXT:    fmv.w.x fa0, a0
4515 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4516 ; RV64ID-NEXT:    addi sp, sp, 16
4517 ; RV64ID-NEXT:    ret
4519 ; CHECK32-IZFHMIN-LABEL: fcvt_h_wu_load:
4520 ; CHECK32-IZFHMIN:       # %bb.0:
4521 ; CHECK32-IZFHMIN-NEXT:    lw a0, 0(a0)
4522 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
4523 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4524 ; CHECK32-IZFHMIN-NEXT:    ret
4526 ; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load:
4527 ; CHECK64-IZFHMIN:       # %bb.0:
4528 ; CHECK64-IZFHMIN-NEXT:    lwu a0, 0(a0)
4529 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
4530 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4531 ; CHECK64-IZFHMIN-NEXT:    ret
4533 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_wu_load:
4534 ; CHECK32-IZHINXMIN:       # %bb.0:
4535 ; CHECK32-IZHINXMIN-NEXT:    lw a0, 0(a0)
4536 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4537 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4538 ; CHECK32-IZHINXMIN-NEXT:    ret
4540 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load:
4541 ; CHECK64-IZHINXMIN:       # %bb.0:
4542 ; CHECK64-IZHINXMIN-NEXT:    lwu a0, 0(a0)
4543 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4544 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4545 ; CHECK64-IZHINXMIN-NEXT:    ret
4547 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
4548 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
4549 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw a0, 0(a0)
4550 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4551 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4552 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
4554 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
4555 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
4556 ; CHECK64-IZDINXZHINXMIN-NEXT:    lwu a0, 0(a0)
4557 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a0, a0
4558 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4559 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
4560   %a = load i32, ptr %p
4561   %1 = uitofp i32 %a to half
4562   ret half %1
4565 define half @fcvt_h_l(i64 %a) nounwind {
4566 ; RV32IZFH-LABEL: fcvt_h_l:
4567 ; RV32IZFH:       # %bb.0:
4568 ; RV32IZFH-NEXT:    addi sp, sp, -16
4569 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4570 ; RV32IZFH-NEXT:    call __floatdihf
4571 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4572 ; RV32IZFH-NEXT:    addi sp, sp, 16
4573 ; RV32IZFH-NEXT:    ret
4575 ; RV64IZFH-LABEL: fcvt_h_l:
4576 ; RV64IZFH:       # %bb.0:
4577 ; RV64IZFH-NEXT:    fcvt.h.l fa0, a0
4578 ; RV64IZFH-NEXT:    ret
4580 ; RV32IDZFH-LABEL: fcvt_h_l:
4581 ; RV32IDZFH:       # %bb.0:
4582 ; RV32IDZFH-NEXT:    addi sp, sp, -16
4583 ; RV32IDZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4584 ; RV32IDZFH-NEXT:    call __floatdihf
4585 ; RV32IDZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4586 ; RV32IDZFH-NEXT:    addi sp, sp, 16
4587 ; RV32IDZFH-NEXT:    ret
4589 ; RV64IDZFH-LABEL: fcvt_h_l:
4590 ; RV64IDZFH:       # %bb.0:
4591 ; RV64IDZFH-NEXT:    fcvt.h.l fa0, a0
4592 ; RV64IDZFH-NEXT:    ret
4594 ; RV32IZHINX-LABEL: fcvt_h_l:
4595 ; RV32IZHINX:       # %bb.0:
4596 ; RV32IZHINX-NEXT:    addi sp, sp, -16
4597 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4598 ; RV32IZHINX-NEXT:    call __floatdihf
4599 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4600 ; RV32IZHINX-NEXT:    addi sp, sp, 16
4601 ; RV32IZHINX-NEXT:    ret
4603 ; RV64IZHINX-LABEL: fcvt_h_l:
4604 ; RV64IZHINX:       # %bb.0:
4605 ; RV64IZHINX-NEXT:    fcvt.h.l a0, a0
4606 ; RV64IZHINX-NEXT:    ret
4608 ; RV32IZDINXZHINX-LABEL: fcvt_h_l:
4609 ; RV32IZDINXZHINX:       # %bb.0:
4610 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, -16
4611 ; RV32IZDINXZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4612 ; RV32IZDINXZHINX-NEXT:    call __floatdihf
4613 ; RV32IZDINXZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4614 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, 16
4615 ; RV32IZDINXZHINX-NEXT:    ret
4617 ; RV64IZDINXZHINX-LABEL: fcvt_h_l:
4618 ; RV64IZDINXZHINX:       # %bb.0:
4619 ; RV64IZDINXZHINX-NEXT:    fcvt.h.l a0, a0
4620 ; RV64IZDINXZHINX-NEXT:    ret
4622 ; RV32I-LABEL: fcvt_h_l:
4623 ; RV32I:       # %bb.0:
4624 ; RV32I-NEXT:    addi sp, sp, -16
4625 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4626 ; RV32I-NEXT:    call __floatdisf
4627 ; RV32I-NEXT:    call __truncsfhf2
4628 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4629 ; RV32I-NEXT:    addi sp, sp, 16
4630 ; RV32I-NEXT:    ret
4632 ; RV64I-LABEL: fcvt_h_l:
4633 ; RV64I:       # %bb.0:
4634 ; RV64I-NEXT:    addi sp, sp, -16
4635 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4636 ; RV64I-NEXT:    call __floatdisf
4637 ; RV64I-NEXT:    call __truncsfhf2
4638 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4639 ; RV64I-NEXT:    addi sp, sp, 16
4640 ; RV64I-NEXT:    ret
4642 ; RV32ID-ILP32-LABEL: fcvt_h_l:
4643 ; RV32ID-ILP32:       # %bb.0:
4644 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
4645 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4646 ; RV32ID-ILP32-NEXT:    call __floatdisf
4647 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
4648 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
4649 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
4650 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4651 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
4652 ; RV32ID-ILP32-NEXT:    ret
4654 ; RV64ID-LP64-LABEL: fcvt_h_l:
4655 ; RV64ID-LP64:       # %bb.0:
4656 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
4657 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4658 ; RV64ID-LP64-NEXT:    fcvt.s.l fa5, a0
4659 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
4660 ; RV64ID-LP64-NEXT:    call __truncsfhf2
4661 ; RV64ID-LP64-NEXT:    lui a1, 1048560
4662 ; RV64ID-LP64-NEXT:    or a0, a0, a1
4663 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4664 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
4665 ; RV64ID-LP64-NEXT:    ret
4667 ; RV32ID-LABEL: fcvt_h_l:
4668 ; RV32ID:       # %bb.0:
4669 ; RV32ID-NEXT:    addi sp, sp, -16
4670 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4671 ; RV32ID-NEXT:    call __floatdisf
4672 ; RV32ID-NEXT:    call __truncsfhf2
4673 ; RV32ID-NEXT:    fmv.x.w a0, fa0
4674 ; RV32ID-NEXT:    lui a1, 1048560
4675 ; RV32ID-NEXT:    or a0, a0, a1
4676 ; RV32ID-NEXT:    fmv.w.x fa0, a0
4677 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4678 ; RV32ID-NEXT:    addi sp, sp, 16
4679 ; RV32ID-NEXT:    ret
4681 ; RV64ID-LABEL: fcvt_h_l:
4682 ; RV64ID:       # %bb.0:
4683 ; RV64ID-NEXT:    addi sp, sp, -16
4684 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4685 ; RV64ID-NEXT:    fcvt.s.l fa0, a0
4686 ; RV64ID-NEXT:    call __truncsfhf2
4687 ; RV64ID-NEXT:    fmv.x.w a0, fa0
4688 ; RV64ID-NEXT:    lui a1, 1048560
4689 ; RV64ID-NEXT:    or a0, a0, a1
4690 ; RV64ID-NEXT:    fmv.w.x fa0, a0
4691 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4692 ; RV64ID-NEXT:    addi sp, sp, 16
4693 ; RV64ID-NEXT:    ret
4695 ; CHECK32-IZFHMIN-LABEL: fcvt_h_l:
4696 ; CHECK32-IZFHMIN:       # %bb.0:
4697 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, -16
4698 ; CHECK32-IZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4699 ; CHECK32-IZFHMIN-NEXT:    call __floatdihf
4700 ; CHECK32-IZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4701 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, 16
4702 ; CHECK32-IZFHMIN-NEXT:    ret
4704 ; CHECK64-IZFHMIN-LABEL: fcvt_h_l:
4705 ; CHECK64-IZFHMIN:       # %bb.0:
4706 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.l fa5, a0
4707 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4708 ; CHECK64-IZFHMIN-NEXT:    ret
4710 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_l:
4711 ; CHECK32-IZHINXMIN:       # %bb.0:
4712 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
4713 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4714 ; CHECK32-IZHINXMIN-NEXT:    call __floatdihf
4715 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4716 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
4717 ; CHECK32-IZHINXMIN-NEXT:    ret
4719 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_l:
4720 ; CHECK64-IZHINXMIN:       # %bb.0:
4721 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.l a0, a0
4722 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4723 ; CHECK64-IZHINXMIN-NEXT:    ret
4725 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_l:
4726 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
4727 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
4728 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4729 ; CHECK32-IZDINXZHINXMIN-NEXT:    call __floatdihf
4730 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4731 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
4732 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
4734 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_l:
4735 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
4736 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.l a0, a0
4737 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4738 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
4739   %1 = sitofp i64 %a to half
4740   ret half %1
4743 define half @fcvt_h_lu(i64 %a) nounwind {
4744 ; RV32IZFH-LABEL: fcvt_h_lu:
4745 ; RV32IZFH:       # %bb.0:
4746 ; RV32IZFH-NEXT:    addi sp, sp, -16
4747 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4748 ; RV32IZFH-NEXT:    call __floatundihf
4749 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4750 ; RV32IZFH-NEXT:    addi sp, sp, 16
4751 ; RV32IZFH-NEXT:    ret
4753 ; RV64IZFH-LABEL: fcvt_h_lu:
4754 ; RV64IZFH:       # %bb.0:
4755 ; RV64IZFH-NEXT:    fcvt.h.lu fa0, a0
4756 ; RV64IZFH-NEXT:    ret
4758 ; RV32IDZFH-LABEL: fcvt_h_lu:
4759 ; RV32IDZFH:       # %bb.0:
4760 ; RV32IDZFH-NEXT:    addi sp, sp, -16
4761 ; RV32IDZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4762 ; RV32IDZFH-NEXT:    call __floatundihf
4763 ; RV32IDZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4764 ; RV32IDZFH-NEXT:    addi sp, sp, 16
4765 ; RV32IDZFH-NEXT:    ret
4767 ; RV64IDZFH-LABEL: fcvt_h_lu:
4768 ; RV64IDZFH:       # %bb.0:
4769 ; RV64IDZFH-NEXT:    fcvt.h.lu fa0, a0
4770 ; RV64IDZFH-NEXT:    ret
4772 ; RV32IZHINX-LABEL: fcvt_h_lu:
4773 ; RV32IZHINX:       # %bb.0:
4774 ; RV32IZHINX-NEXT:    addi sp, sp, -16
4775 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4776 ; RV32IZHINX-NEXT:    call __floatundihf
4777 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4778 ; RV32IZHINX-NEXT:    addi sp, sp, 16
4779 ; RV32IZHINX-NEXT:    ret
4781 ; RV64IZHINX-LABEL: fcvt_h_lu:
4782 ; RV64IZHINX:       # %bb.0:
4783 ; RV64IZHINX-NEXT:    fcvt.h.lu a0, a0
4784 ; RV64IZHINX-NEXT:    ret
4786 ; RV32IZDINXZHINX-LABEL: fcvt_h_lu:
4787 ; RV32IZDINXZHINX:       # %bb.0:
4788 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, -16
4789 ; RV32IZDINXZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4790 ; RV32IZDINXZHINX-NEXT:    call __floatundihf
4791 ; RV32IZDINXZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4792 ; RV32IZDINXZHINX-NEXT:    addi sp, sp, 16
4793 ; RV32IZDINXZHINX-NEXT:    ret
4795 ; RV64IZDINXZHINX-LABEL: fcvt_h_lu:
4796 ; RV64IZDINXZHINX:       # %bb.0:
4797 ; RV64IZDINXZHINX-NEXT:    fcvt.h.lu a0, a0
4798 ; RV64IZDINXZHINX-NEXT:    ret
4800 ; RV32I-LABEL: fcvt_h_lu:
4801 ; RV32I:       # %bb.0:
4802 ; RV32I-NEXT:    addi sp, sp, -16
4803 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4804 ; RV32I-NEXT:    call __floatundisf
4805 ; RV32I-NEXT:    call __truncsfhf2
4806 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4807 ; RV32I-NEXT:    addi sp, sp, 16
4808 ; RV32I-NEXT:    ret
4810 ; RV64I-LABEL: fcvt_h_lu:
4811 ; RV64I:       # %bb.0:
4812 ; RV64I-NEXT:    addi sp, sp, -16
4813 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4814 ; RV64I-NEXT:    call __floatundisf
4815 ; RV64I-NEXT:    call __truncsfhf2
4816 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4817 ; RV64I-NEXT:    addi sp, sp, 16
4818 ; RV64I-NEXT:    ret
4820 ; RV32ID-ILP32-LABEL: fcvt_h_lu:
4821 ; RV32ID-ILP32:       # %bb.0:
4822 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
4823 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4824 ; RV32ID-ILP32-NEXT:    call __floatundisf
4825 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
4826 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
4827 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
4828 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4829 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
4830 ; RV32ID-ILP32-NEXT:    ret
4832 ; RV64ID-LP64-LABEL: fcvt_h_lu:
4833 ; RV64ID-LP64:       # %bb.0:
4834 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
4835 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4836 ; RV64ID-LP64-NEXT:    fcvt.s.lu fa5, a0
4837 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
4838 ; RV64ID-LP64-NEXT:    call __truncsfhf2
4839 ; RV64ID-LP64-NEXT:    lui a1, 1048560
4840 ; RV64ID-LP64-NEXT:    or a0, a0, a1
4841 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4842 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
4843 ; RV64ID-LP64-NEXT:    ret
4845 ; RV32ID-LABEL: fcvt_h_lu:
4846 ; RV32ID:       # %bb.0:
4847 ; RV32ID-NEXT:    addi sp, sp, -16
4848 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4849 ; RV32ID-NEXT:    call __floatundisf
4850 ; RV32ID-NEXT:    call __truncsfhf2
4851 ; RV32ID-NEXT:    fmv.x.w a0, fa0
4852 ; RV32ID-NEXT:    lui a1, 1048560
4853 ; RV32ID-NEXT:    or a0, a0, a1
4854 ; RV32ID-NEXT:    fmv.w.x fa0, a0
4855 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4856 ; RV32ID-NEXT:    addi sp, sp, 16
4857 ; RV32ID-NEXT:    ret
4859 ; RV64ID-LABEL: fcvt_h_lu:
4860 ; RV64ID:       # %bb.0:
4861 ; RV64ID-NEXT:    addi sp, sp, -16
4862 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4863 ; RV64ID-NEXT:    fcvt.s.lu fa0, a0
4864 ; RV64ID-NEXT:    call __truncsfhf2
4865 ; RV64ID-NEXT:    fmv.x.w a0, fa0
4866 ; RV64ID-NEXT:    lui a1, 1048560
4867 ; RV64ID-NEXT:    or a0, a0, a1
4868 ; RV64ID-NEXT:    fmv.w.x fa0, a0
4869 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4870 ; RV64ID-NEXT:    addi sp, sp, 16
4871 ; RV64ID-NEXT:    ret
4873 ; CHECK32-IZFHMIN-LABEL: fcvt_h_lu:
4874 ; CHECK32-IZFHMIN:       # %bb.0:
4875 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, -16
4876 ; CHECK32-IZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4877 ; CHECK32-IZFHMIN-NEXT:    call __floatundihf
4878 ; CHECK32-IZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4879 ; CHECK32-IZFHMIN-NEXT:    addi sp, sp, 16
4880 ; CHECK32-IZFHMIN-NEXT:    ret
4882 ; CHECK64-IZFHMIN-LABEL: fcvt_h_lu:
4883 ; CHECK64-IZFHMIN:       # %bb.0:
4884 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.lu fa5, a0
4885 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa5
4886 ; CHECK64-IZFHMIN-NEXT:    ret
4888 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_lu:
4889 ; CHECK32-IZHINXMIN:       # %bb.0:
4890 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
4891 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4892 ; CHECK32-IZHINXMIN-NEXT:    call __floatundihf
4893 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4894 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
4895 ; CHECK32-IZHINXMIN-NEXT:    ret
4897 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_lu:
4898 ; CHECK64-IZHINXMIN:       # %bb.0:
4899 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.lu a0, a0
4900 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
4901 ; CHECK64-IZHINXMIN-NEXT:    ret
4903 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_lu:
4904 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
4905 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
4906 ; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4907 ; CHECK32-IZDINXZHINXMIN-NEXT:    call __floatundihf
4908 ; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4909 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
4910 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
4912 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_lu:
4913 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
4914 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.lu a0, a0
4915 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
4916 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
4917   %1 = uitofp i64 %a to half
4918   ret half %1
4921 define half @fcvt_h_s(float %a) nounwind {
4922 ; CHECKIZFH-LABEL: fcvt_h_s:
4923 ; CHECKIZFH:       # %bb.0:
4924 ; CHECKIZFH-NEXT:    fcvt.h.s fa0, fa0
4925 ; CHECKIZFH-NEXT:    ret
4927 ; RV32IDZFH-LABEL: fcvt_h_s:
4928 ; RV32IDZFH:       # %bb.0:
4929 ; RV32IDZFH-NEXT:    fcvt.h.s fa0, fa0
4930 ; RV32IDZFH-NEXT:    ret
4932 ; RV64IDZFH-LABEL: fcvt_h_s:
4933 ; RV64IDZFH:       # %bb.0:
4934 ; RV64IDZFH-NEXT:    fcvt.h.s fa0, fa0
4935 ; RV64IDZFH-NEXT:    ret
4937 ; CHECKIZHINX-LABEL: fcvt_h_s:
4938 ; CHECKIZHINX:       # %bb.0:
4939 ; CHECKIZHINX-NEXT:    fcvt.h.s a0, a0
4940 ; CHECKIZHINX-NEXT:    ret
4942 ; CHECKIZDINXZHINX-LABEL: fcvt_h_s:
4943 ; CHECKIZDINXZHINX:       # %bb.0:
4944 ; CHECKIZDINXZHINX-NEXT:    fcvt.h.s a0, a0
4945 ; CHECKIZDINXZHINX-NEXT:    ret
4947 ; RV32I-LABEL: fcvt_h_s:
4948 ; RV32I:       # %bb.0:
4949 ; RV32I-NEXT:    addi sp, sp, -16
4950 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4951 ; RV32I-NEXT:    call __truncsfhf2
4952 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4953 ; RV32I-NEXT:    addi sp, sp, 16
4954 ; RV32I-NEXT:    ret
4956 ; RV64I-LABEL: fcvt_h_s:
4957 ; RV64I:       # %bb.0:
4958 ; RV64I-NEXT:    addi sp, sp, -16
4959 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4960 ; RV64I-NEXT:    call __truncsfhf2
4961 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4962 ; RV64I-NEXT:    addi sp, sp, 16
4963 ; RV64I-NEXT:    ret
4965 ; RV32ID-ILP32-LABEL: fcvt_h_s:
4966 ; RV32ID-ILP32:       # %bb.0:
4967 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
4968 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4969 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
4970 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
4971 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
4972 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4973 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
4974 ; RV32ID-ILP32-NEXT:    ret
4976 ; RV64ID-LP64-LABEL: fcvt_h_s:
4977 ; RV64ID-LP64:       # %bb.0:
4978 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
4979 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4980 ; RV64ID-LP64-NEXT:    call __truncsfhf2
4981 ; RV64ID-LP64-NEXT:    lui a1, 1048560
4982 ; RV64ID-LP64-NEXT:    or a0, a0, a1
4983 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4984 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
4985 ; RV64ID-LP64-NEXT:    ret
4987 ; RV32ID-LABEL: fcvt_h_s:
4988 ; RV32ID:       # %bb.0:
4989 ; RV32ID-NEXT:    addi sp, sp, -16
4990 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4991 ; RV32ID-NEXT:    call __truncsfhf2
4992 ; RV32ID-NEXT:    fmv.x.w a0, fa0
4993 ; RV32ID-NEXT:    lui a1, 1048560
4994 ; RV32ID-NEXT:    or a0, a0, a1
4995 ; RV32ID-NEXT:    fmv.w.x fa0, a0
4996 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4997 ; RV32ID-NEXT:    addi sp, sp, 16
4998 ; RV32ID-NEXT:    ret
5000 ; RV64ID-LABEL: fcvt_h_s:
5001 ; RV64ID:       # %bb.0:
5002 ; RV64ID-NEXT:    addi sp, sp, -16
5003 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5004 ; RV64ID-NEXT:    call __truncsfhf2
5005 ; RV64ID-NEXT:    fmv.x.w a0, fa0
5006 ; RV64ID-NEXT:    lui a1, 1048560
5007 ; RV64ID-NEXT:    or a0, a0, a1
5008 ; RV64ID-NEXT:    fmv.w.x fa0, a0
5009 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5010 ; RV64ID-NEXT:    addi sp, sp, 16
5011 ; RV64ID-NEXT:    ret
5013 ; CHECK32-IZFHMIN-LABEL: fcvt_h_s:
5014 ; CHECK32-IZFHMIN:       # %bb.0:
5015 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa0, fa0
5016 ; CHECK32-IZFHMIN-NEXT:    ret
5018 ; CHECK64-IZFHMIN-LABEL: fcvt_h_s:
5019 ; CHECK64-IZFHMIN:       # %bb.0:
5020 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa0, fa0
5021 ; CHECK64-IZFHMIN-NEXT:    ret
5023 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_s:
5024 ; CHECK32-IZHINXMIN:       # %bb.0:
5025 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
5026 ; CHECK32-IZHINXMIN-NEXT:    ret
5028 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_s:
5029 ; CHECK64-IZHINXMIN:       # %bb.0:
5030 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a0, a0
5031 ; CHECK64-IZHINXMIN-NEXT:    ret
5033 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_s:
5034 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
5035 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
5036 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
5038 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_s:
5039 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
5040 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a0, a0
5041 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
5042   %1 = fptrunc float %a to half
5043   ret half %1
5046 define float @fcvt_s_h(half %a) nounwind {
5047 ; CHECKIZFH-LABEL: fcvt_s_h:
5048 ; CHECKIZFH:       # %bb.0:
5049 ; CHECKIZFH-NEXT:    fcvt.s.h fa0, fa0
5050 ; CHECKIZFH-NEXT:    ret
5052 ; RV32IDZFH-LABEL: fcvt_s_h:
5053 ; RV32IDZFH:       # %bb.0:
5054 ; RV32IDZFH-NEXT:    fcvt.s.h fa0, fa0
5055 ; RV32IDZFH-NEXT:    ret
5057 ; RV64IDZFH-LABEL: fcvt_s_h:
5058 ; RV64IDZFH:       # %bb.0:
5059 ; RV64IDZFH-NEXT:    fcvt.s.h fa0, fa0
5060 ; RV64IDZFH-NEXT:    ret
5062 ; CHECKIZHINX-LABEL: fcvt_s_h:
5063 ; CHECKIZHINX:       # %bb.0:
5064 ; CHECKIZHINX-NEXT:    fcvt.s.h a0, a0
5065 ; CHECKIZHINX-NEXT:    ret
5067 ; CHECKIZDINXZHINX-LABEL: fcvt_s_h:
5068 ; CHECKIZDINXZHINX:       # %bb.0:
5069 ; CHECKIZDINXZHINX-NEXT:    fcvt.s.h a0, a0
5070 ; CHECKIZDINXZHINX-NEXT:    ret
5072 ; RV32I-LABEL: fcvt_s_h:
5073 ; RV32I:       # %bb.0:
5074 ; RV32I-NEXT:    addi sp, sp, -16
5075 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5076 ; RV32I-NEXT:    call __extendhfsf2
5077 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5078 ; RV32I-NEXT:    addi sp, sp, 16
5079 ; RV32I-NEXT:    ret
5081 ; RV64I-LABEL: fcvt_s_h:
5082 ; RV64I:       # %bb.0:
5083 ; RV64I-NEXT:    addi sp, sp, -16
5084 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5085 ; RV64I-NEXT:    call __extendhfsf2
5086 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5087 ; RV64I-NEXT:    addi sp, sp, 16
5088 ; RV64I-NEXT:    ret
5090 ; RV32ID-ILP32-LABEL: fcvt_s_h:
5091 ; RV32ID-ILP32:       # %bb.0:
5092 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
5093 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5094 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
5095 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5096 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
5097 ; RV32ID-ILP32-NEXT:    ret
5099 ; RV64ID-LP64-LABEL: fcvt_s_h:
5100 ; RV64ID-LP64:       # %bb.0:
5101 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
5102 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5103 ; RV64ID-LP64-NEXT:    call __extendhfsf2
5104 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5105 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
5106 ; RV64ID-LP64-NEXT:    ret
5108 ; RV32ID-LABEL: fcvt_s_h:
5109 ; RV32ID:       # %bb.0:
5110 ; RV32ID-NEXT:    addi sp, sp, -16
5111 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5112 ; RV32ID-NEXT:    call __extendhfsf2
5113 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5114 ; RV32ID-NEXT:    addi sp, sp, 16
5115 ; RV32ID-NEXT:    ret
5117 ; RV64ID-LABEL: fcvt_s_h:
5118 ; RV64ID:       # %bb.0:
5119 ; RV64ID-NEXT:    addi sp, sp, -16
5120 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5121 ; RV64ID-NEXT:    call __extendhfsf2
5122 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5123 ; RV64ID-NEXT:    addi sp, sp, 16
5124 ; RV64ID-NEXT:    ret
5126 ; CHECK32-IZFHMIN-LABEL: fcvt_s_h:
5127 ; CHECK32-IZFHMIN:       # %bb.0:
5128 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa0, fa0
5129 ; CHECK32-IZFHMIN-NEXT:    ret
5131 ; CHECK64-IZFHMIN-LABEL: fcvt_s_h:
5132 ; CHECK64-IZFHMIN:       # %bb.0:
5133 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa0, fa0
5134 ; CHECK64-IZFHMIN-NEXT:    ret
5136 ; CHECK32-IZHINXMIN-LABEL: fcvt_s_h:
5137 ; CHECK32-IZHINXMIN:       # %bb.0:
5138 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
5139 ; CHECK32-IZHINXMIN-NEXT:    ret
5141 ; CHECK64-IZHINXMIN-LABEL: fcvt_s_h:
5142 ; CHECK64-IZHINXMIN:       # %bb.0:
5143 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
5144 ; CHECK64-IZHINXMIN-NEXT:    ret
5146 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_s_h:
5147 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
5148 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
5149 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
5151 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_s_h:
5152 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
5153 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
5154 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
5155   %1 = fpext half %a to float
5156   ret float %1
5159 define half @fcvt_h_d(double %a) nounwind {
5160 ; RV32IZFH-LABEL: fcvt_h_d:
5161 ; RV32IZFH:       # %bb.0:
5162 ; RV32IZFH-NEXT:    addi sp, sp, -16
5163 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5164 ; RV32IZFH-NEXT:    call __truncdfhf2
5165 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5166 ; RV32IZFH-NEXT:    addi sp, sp, 16
5167 ; RV32IZFH-NEXT:    ret
5169 ; RV64IZFH-LABEL: fcvt_h_d:
5170 ; RV64IZFH:       # %bb.0:
5171 ; RV64IZFH-NEXT:    addi sp, sp, -16
5172 ; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5173 ; RV64IZFH-NEXT:    call __truncdfhf2
5174 ; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5175 ; RV64IZFH-NEXT:    addi sp, sp, 16
5176 ; RV64IZFH-NEXT:    ret
5178 ; RV32IDZFH-LABEL: fcvt_h_d:
5179 ; RV32IDZFH:       # %bb.0:
5180 ; RV32IDZFH-NEXT:    fcvt.h.d fa0, fa0
5181 ; RV32IDZFH-NEXT:    ret
5183 ; RV64IDZFH-LABEL: fcvt_h_d:
5184 ; RV64IDZFH:       # %bb.0:
5185 ; RV64IDZFH-NEXT:    fcvt.h.d fa0, fa0
5186 ; RV64IDZFH-NEXT:    ret
5188 ; RV32IZHINX-LABEL: fcvt_h_d:
5189 ; RV32IZHINX:       # %bb.0:
5190 ; RV32IZHINX-NEXT:    addi sp, sp, -16
5191 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5192 ; RV32IZHINX-NEXT:    call __truncdfhf2
5193 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5194 ; RV32IZHINX-NEXT:    addi sp, sp, 16
5195 ; RV32IZHINX-NEXT:    ret
5197 ; RV64IZHINX-LABEL: fcvt_h_d:
5198 ; RV64IZHINX:       # %bb.0:
5199 ; RV64IZHINX-NEXT:    addi sp, sp, -16
5200 ; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5201 ; RV64IZHINX-NEXT:    call __truncdfhf2
5202 ; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5203 ; RV64IZHINX-NEXT:    addi sp, sp, 16
5204 ; RV64IZHINX-NEXT:    ret
5206 ; CHECKIZDINXZHINX-LABEL: fcvt_h_d:
5207 ; CHECKIZDINXZHINX:       # %bb.0:
5208 ; CHECKIZDINXZHINX-NEXT:    fcvt.h.d a0, a0
5209 ; CHECKIZDINXZHINX-NEXT:    ret
5211 ; RV32I-LABEL: fcvt_h_d:
5212 ; RV32I:       # %bb.0:
5213 ; RV32I-NEXT:    addi sp, sp, -16
5214 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5215 ; RV32I-NEXT:    call __truncdfhf2
5216 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5217 ; RV32I-NEXT:    addi sp, sp, 16
5218 ; RV32I-NEXT:    ret
5220 ; RV64I-LABEL: fcvt_h_d:
5221 ; RV64I:       # %bb.0:
5222 ; RV64I-NEXT:    addi sp, sp, -16
5223 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5224 ; RV64I-NEXT:    call __truncdfhf2
5225 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5226 ; RV64I-NEXT:    addi sp, sp, 16
5227 ; RV64I-NEXT:    ret
5229 ; RV32ID-ILP32-LABEL: fcvt_h_d:
5230 ; RV32ID-ILP32:       # %bb.0:
5231 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
5232 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5233 ; RV32ID-ILP32-NEXT:    call __truncdfhf2
5234 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
5235 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
5236 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5237 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
5238 ; RV32ID-ILP32-NEXT:    ret
5240 ; RV64ID-LP64-LABEL: fcvt_h_d:
5241 ; RV64ID-LP64:       # %bb.0:
5242 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
5243 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5244 ; RV64ID-LP64-NEXT:    call __truncdfhf2
5245 ; RV64ID-LP64-NEXT:    lui a1, 1048560
5246 ; RV64ID-LP64-NEXT:    or a0, a0, a1
5247 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5248 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
5249 ; RV64ID-LP64-NEXT:    ret
5251 ; RV32ID-LABEL: fcvt_h_d:
5252 ; RV32ID:       # %bb.0:
5253 ; RV32ID-NEXT:    addi sp, sp, -16
5254 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5255 ; RV32ID-NEXT:    call __truncdfhf2
5256 ; RV32ID-NEXT:    fmv.x.w a0, fa0
5257 ; RV32ID-NEXT:    lui a1, 1048560
5258 ; RV32ID-NEXT:    or a0, a0, a1
5259 ; RV32ID-NEXT:    fmv.w.x fa0, a0
5260 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5261 ; RV32ID-NEXT:    addi sp, sp, 16
5262 ; RV32ID-NEXT:    ret
5264 ; RV64ID-LABEL: fcvt_h_d:
5265 ; RV64ID:       # %bb.0:
5266 ; RV64ID-NEXT:    addi sp, sp, -16
5267 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5268 ; RV64ID-NEXT:    call __truncdfhf2
5269 ; RV64ID-NEXT:    fmv.x.w a0, fa0
5270 ; RV64ID-NEXT:    lui a1, 1048560
5271 ; RV64ID-NEXT:    or a0, a0, a1
5272 ; RV64ID-NEXT:    fmv.w.x fa0, a0
5273 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5274 ; RV64ID-NEXT:    addi sp, sp, 16
5275 ; RV64ID-NEXT:    ret
5277 ; RV32IFZFHMIN-LABEL: fcvt_h_d:
5278 ; RV32IFZFHMIN:       # %bb.0:
5279 ; RV32IFZFHMIN-NEXT:    addi sp, sp, -16
5280 ; RV32IFZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5281 ; RV32IFZFHMIN-NEXT:    call __truncdfhf2
5282 ; RV32IFZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5283 ; RV32IFZFHMIN-NEXT:    addi sp, sp, 16
5284 ; RV32IFZFHMIN-NEXT:    ret
5286 ; RV64IFZFHMIN-LABEL: fcvt_h_d:
5287 ; RV64IFZFHMIN:       # %bb.0:
5288 ; RV64IFZFHMIN-NEXT:    addi sp, sp, -16
5289 ; RV64IFZFHMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5290 ; RV64IFZFHMIN-NEXT:    call __truncdfhf2
5291 ; RV64IFZFHMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5292 ; RV64IFZFHMIN-NEXT:    addi sp, sp, 16
5293 ; RV64IFZFHMIN-NEXT:    ret
5295 ; RV32IDZFHMIN-LABEL: fcvt_h_d:
5296 ; RV32IDZFHMIN:       # %bb.0:
5297 ; RV32IDZFHMIN-NEXT:    fcvt.h.d fa0, fa0
5298 ; RV32IDZFHMIN-NEXT:    ret
5300 ; RV64IDZFHMIN-LABEL: fcvt_h_d:
5301 ; RV64IDZFHMIN:       # %bb.0:
5302 ; RV64IDZFHMIN-NEXT:    fcvt.h.d fa0, fa0
5303 ; RV64IDZFHMIN-NEXT:    ret
5305 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_d:
5306 ; CHECK32-IZHINXMIN:       # %bb.0:
5307 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
5308 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5309 ; CHECK32-IZHINXMIN-NEXT:    call __truncdfhf2
5310 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5311 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
5312 ; CHECK32-IZHINXMIN-NEXT:    ret
5314 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_d:
5315 ; CHECK64-IZHINXMIN:       # %bb.0:
5316 ; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, -16
5317 ; CHECK64-IZHINXMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5318 ; CHECK64-IZHINXMIN-NEXT:    call __truncdfhf2
5319 ; CHECK64-IZHINXMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5320 ; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, 16
5321 ; CHECK64-IZHINXMIN-NEXT:    ret
5323 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_d:
5324 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
5325 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.d a0, a0
5326 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
5328 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_d:
5329 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
5330 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.d a0, a0
5331 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
5332   %1 = fptrunc double %a to half
5333   ret half %1
5336 define double @fcvt_d_h(half %a) nounwind {
5337 ; RV32IZFH-LABEL: fcvt_d_h:
5338 ; RV32IZFH:       # %bb.0:
5339 ; RV32IZFH-NEXT:    addi sp, sp, -16
5340 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5341 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
5342 ; RV32IZFH-NEXT:    call __extendsfdf2
5343 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5344 ; RV32IZFH-NEXT:    addi sp, sp, 16
5345 ; RV32IZFH-NEXT:    ret
5347 ; RV64IZFH-LABEL: fcvt_d_h:
5348 ; RV64IZFH:       # %bb.0:
5349 ; RV64IZFH-NEXT:    addi sp, sp, -16
5350 ; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5351 ; RV64IZFH-NEXT:    fcvt.s.h fa0, fa0
5352 ; RV64IZFH-NEXT:    call __extendsfdf2
5353 ; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5354 ; RV64IZFH-NEXT:    addi sp, sp, 16
5355 ; RV64IZFH-NEXT:    ret
5357 ; RV32IDZFH-LABEL: fcvt_d_h:
5358 ; RV32IDZFH:       # %bb.0:
5359 ; RV32IDZFH-NEXT:    fcvt.d.h fa0, fa0
5360 ; RV32IDZFH-NEXT:    ret
5362 ; RV64IDZFH-LABEL: fcvt_d_h:
5363 ; RV64IDZFH:       # %bb.0:
5364 ; RV64IDZFH-NEXT:    fcvt.d.h fa0, fa0
5365 ; RV64IDZFH-NEXT:    ret
5367 ; RV32IZHINX-LABEL: fcvt_d_h:
5368 ; RV32IZHINX:       # %bb.0:
5369 ; RV32IZHINX-NEXT:    addi sp, sp, -16
5370 ; RV32IZHINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5371 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
5372 ; RV32IZHINX-NEXT:    call __extendsfdf2
5373 ; RV32IZHINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5374 ; RV32IZHINX-NEXT:    addi sp, sp, 16
5375 ; RV32IZHINX-NEXT:    ret
5377 ; RV64IZHINX-LABEL: fcvt_d_h:
5378 ; RV64IZHINX:       # %bb.0:
5379 ; RV64IZHINX-NEXT:    addi sp, sp, -16
5380 ; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5381 ; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
5382 ; RV64IZHINX-NEXT:    call __extendsfdf2
5383 ; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5384 ; RV64IZHINX-NEXT:    addi sp, sp, 16
5385 ; RV64IZHINX-NEXT:    ret
5387 ; CHECKIZDINXZHINX-LABEL: fcvt_d_h:
5388 ; CHECKIZDINXZHINX:       # %bb.0:
5389 ; CHECKIZDINXZHINX-NEXT:    fcvt.d.h a0, a0
5390 ; CHECKIZDINXZHINX-NEXT:    ret
5392 ; RV32I-LABEL: fcvt_d_h:
5393 ; RV32I:       # %bb.0:
5394 ; RV32I-NEXT:    addi sp, sp, -16
5395 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5396 ; RV32I-NEXT:    call __extendhfsf2
5397 ; RV32I-NEXT:    call __extendsfdf2
5398 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5399 ; RV32I-NEXT:    addi sp, sp, 16
5400 ; RV32I-NEXT:    ret
5402 ; RV64I-LABEL: fcvt_d_h:
5403 ; RV64I:       # %bb.0:
5404 ; RV64I-NEXT:    addi sp, sp, -16
5405 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5406 ; RV64I-NEXT:    call __extendhfsf2
5407 ; RV64I-NEXT:    call __extendsfdf2
5408 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5409 ; RV64I-NEXT:    addi sp, sp, 16
5410 ; RV64I-NEXT:    ret
5412 ; RV32ID-ILP32-LABEL: fcvt_d_h:
5413 ; RV32ID-ILP32:       # %bb.0:
5414 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
5415 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5416 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
5417 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
5418 ; RV32ID-ILP32-NEXT:    fcvt.d.s fa5, fa5
5419 ; RV32ID-ILP32-NEXT:    fsd fa5, 0(sp)
5420 ; RV32ID-ILP32-NEXT:    lw a0, 0(sp)
5421 ; RV32ID-ILP32-NEXT:    lw a1, 4(sp)
5422 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5423 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
5424 ; RV32ID-ILP32-NEXT:    ret
5426 ; RV64ID-LP64-LABEL: fcvt_d_h:
5427 ; RV64ID-LP64:       # %bb.0:
5428 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
5429 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5430 ; RV64ID-LP64-NEXT:    call __extendhfsf2
5431 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
5432 ; RV64ID-LP64-NEXT:    fcvt.d.s fa5, fa5
5433 ; RV64ID-LP64-NEXT:    fmv.x.d a0, fa5
5434 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5435 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
5436 ; RV64ID-LP64-NEXT:    ret
5438 ; RV32ID-LABEL: fcvt_d_h:
5439 ; RV32ID:       # %bb.0:
5440 ; RV32ID-NEXT:    addi sp, sp, -16
5441 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5442 ; RV32ID-NEXT:    call __extendhfsf2
5443 ; RV32ID-NEXT:    fcvt.d.s fa0, fa0
5444 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5445 ; RV32ID-NEXT:    addi sp, sp, 16
5446 ; RV32ID-NEXT:    ret
5448 ; RV64ID-LABEL: fcvt_d_h:
5449 ; RV64ID:       # %bb.0:
5450 ; RV64ID-NEXT:    addi sp, sp, -16
5451 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5452 ; RV64ID-NEXT:    call __extendhfsf2
5453 ; RV64ID-NEXT:    fcvt.d.s fa0, fa0
5454 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5455 ; RV64ID-NEXT:    addi sp, sp, 16
5456 ; RV64ID-NEXT:    ret
5458 ; RV32IFZFHMIN-LABEL: fcvt_d_h:
5459 ; RV32IFZFHMIN:       # %bb.0:
5460 ; RV32IFZFHMIN-NEXT:    addi sp, sp, -16
5461 ; RV32IFZFHMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5462 ; RV32IFZFHMIN-NEXT:    fcvt.s.h fa0, fa0
5463 ; RV32IFZFHMIN-NEXT:    call __extendsfdf2
5464 ; RV32IFZFHMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5465 ; RV32IFZFHMIN-NEXT:    addi sp, sp, 16
5466 ; RV32IFZFHMIN-NEXT:    ret
5468 ; RV64IFZFHMIN-LABEL: fcvt_d_h:
5469 ; RV64IFZFHMIN:       # %bb.0:
5470 ; RV64IFZFHMIN-NEXT:    addi sp, sp, -16
5471 ; RV64IFZFHMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5472 ; RV64IFZFHMIN-NEXT:    fcvt.s.h fa0, fa0
5473 ; RV64IFZFHMIN-NEXT:    call __extendsfdf2
5474 ; RV64IFZFHMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5475 ; RV64IFZFHMIN-NEXT:    addi sp, sp, 16
5476 ; RV64IFZFHMIN-NEXT:    ret
5478 ; RV32IDZFHMIN-LABEL: fcvt_d_h:
5479 ; RV32IDZFHMIN:       # %bb.0:
5480 ; RV32IDZFHMIN-NEXT:    fcvt.d.h fa0, fa0
5481 ; RV32IDZFHMIN-NEXT:    ret
5483 ; RV64IDZFHMIN-LABEL: fcvt_d_h:
5484 ; RV64IDZFHMIN:       # %bb.0:
5485 ; RV64IDZFHMIN-NEXT:    fcvt.d.h fa0, fa0
5486 ; RV64IDZFHMIN-NEXT:    ret
5488 ; CHECK32-IZHINXMIN-LABEL: fcvt_d_h:
5489 ; CHECK32-IZHINXMIN:       # %bb.0:
5490 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -16
5491 ; CHECK32-IZHINXMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5492 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
5493 ; CHECK32-IZHINXMIN-NEXT:    call __extendsfdf2
5494 ; CHECK32-IZHINXMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5495 ; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 16
5496 ; CHECK32-IZHINXMIN-NEXT:    ret
5498 ; CHECK64-IZHINXMIN-LABEL: fcvt_d_h:
5499 ; CHECK64-IZHINXMIN:       # %bb.0:
5500 ; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, -16
5501 ; CHECK64-IZHINXMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5502 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
5503 ; CHECK64-IZHINXMIN-NEXT:    call __extendsfdf2
5504 ; CHECK64-IZHINXMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5505 ; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, 16
5506 ; CHECK64-IZHINXMIN-NEXT:    ret
5508 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_d_h:
5509 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
5510 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.d.h a0, a0
5511 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
5513 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_d_h:
5514 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
5515 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.d.h a0, a0
5516 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
5517   %1 = fpext half %a to double
5518   ret double %1
5521 define half @bitcast_h_i16(i16 %a) nounwind {
5522 ; CHECKIZFH-LABEL: bitcast_h_i16:
5523 ; CHECKIZFH:       # %bb.0:
5524 ; CHECKIZFH-NEXT:    fmv.h.x fa0, a0
5525 ; CHECKIZFH-NEXT:    ret
5527 ; RV32IDZFH-LABEL: bitcast_h_i16:
5528 ; RV32IDZFH:       # %bb.0:
5529 ; RV32IDZFH-NEXT:    fmv.h.x fa0, a0
5530 ; RV32IDZFH-NEXT:    ret
5532 ; RV64IDZFH-LABEL: bitcast_h_i16:
5533 ; RV64IDZFH:       # %bb.0:
5534 ; RV64IDZFH-NEXT:    fmv.h.x fa0, a0
5535 ; RV64IDZFH-NEXT:    ret
5537 ; CHECKIZHINX-LABEL: bitcast_h_i16:
5538 ; CHECKIZHINX:       # %bb.0:
5539 ; CHECKIZHINX-NEXT:    # kill: def $x10_h killed $x10_h killed $x10
5540 ; CHECKIZHINX-NEXT:    ret
5542 ; CHECKIZDINXZHINX-LABEL: bitcast_h_i16:
5543 ; CHECKIZDINXZHINX:       # %bb.0:
5544 ; CHECKIZDINXZHINX-NEXT:    # kill: def $x10_h killed $x10_h killed $x10
5545 ; CHECKIZDINXZHINX-NEXT:    ret
5547 ; RV32I-LABEL: bitcast_h_i16:
5548 ; RV32I:       # %bb.0:
5549 ; RV32I-NEXT:    ret
5551 ; RV64I-LABEL: bitcast_h_i16:
5552 ; RV64I:       # %bb.0:
5553 ; RV64I-NEXT:    ret
5555 ; RV32ID-ILP32-LABEL: bitcast_h_i16:
5556 ; RV32ID-ILP32:       # %bb.0:
5557 ; RV32ID-ILP32-NEXT:    lui a1, 1048560
5558 ; RV32ID-ILP32-NEXT:    or a0, a0, a1
5559 ; RV32ID-ILP32-NEXT:    ret
5561 ; RV64ID-LP64-LABEL: bitcast_h_i16:
5562 ; RV64ID-LP64:       # %bb.0:
5563 ; RV64ID-LP64-NEXT:    lui a1, 1048560
5564 ; RV64ID-LP64-NEXT:    or a0, a0, a1
5565 ; RV64ID-LP64-NEXT:    ret
5567 ; RV32ID-LABEL: bitcast_h_i16:
5568 ; RV32ID:       # %bb.0:
5569 ; RV32ID-NEXT:    lui a1, 1048560
5570 ; RV32ID-NEXT:    or a0, a0, a1
5571 ; RV32ID-NEXT:    fmv.w.x fa0, a0
5572 ; RV32ID-NEXT:    ret
5574 ; RV64ID-LABEL: bitcast_h_i16:
5575 ; RV64ID:       # %bb.0:
5576 ; RV64ID-NEXT:    lui a1, 1048560
5577 ; RV64ID-NEXT:    or a0, a0, a1
5578 ; RV64ID-NEXT:    fmv.w.x fa0, a0
5579 ; RV64ID-NEXT:    ret
5581 ; CHECK32-IZFHMIN-LABEL: bitcast_h_i16:
5582 ; CHECK32-IZFHMIN:       # %bb.0:
5583 ; CHECK32-IZFHMIN-NEXT:    fmv.h.x fa0, a0
5584 ; CHECK32-IZFHMIN-NEXT:    ret
5586 ; CHECK64-IZFHMIN-LABEL: bitcast_h_i16:
5587 ; CHECK64-IZFHMIN:       # %bb.0:
5588 ; CHECK64-IZFHMIN-NEXT:    fmv.h.x fa0, a0
5589 ; CHECK64-IZFHMIN-NEXT:    ret
5591 ; CHECK32-IZHINXMIN-LABEL: bitcast_h_i16:
5592 ; CHECK32-IZHINXMIN:       # %bb.0:
5593 ; CHECK32-IZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h killed $x10
5594 ; CHECK32-IZHINXMIN-NEXT:    ret
5596 ; CHECK64-IZHINXMIN-LABEL: bitcast_h_i16:
5597 ; CHECK64-IZHINXMIN:       # %bb.0:
5598 ; CHECK64-IZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h killed $x10
5599 ; CHECK64-IZHINXMIN-NEXT:    ret
5601 ; CHECK32-IZDINXZHINXMIN-LABEL: bitcast_h_i16:
5602 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
5603 ; CHECK32-IZDINXZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h killed $x10
5604 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
5606 ; CHECK64-IZDINXZHINXMIN-LABEL: bitcast_h_i16:
5607 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
5608 ; CHECK64-IZDINXZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h killed $x10
5609 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
5610   %1 = bitcast i16 %a to half
5611   ret half %1
5614 define i16 @bitcast_i16_h(half %a) nounwind {
5615 ; CHECKIZFH-LABEL: bitcast_i16_h:
5616 ; CHECKIZFH:       # %bb.0:
5617 ; CHECKIZFH-NEXT:    fmv.x.h a0, fa0
5618 ; CHECKIZFH-NEXT:    ret
5620 ; RV32IDZFH-LABEL: bitcast_i16_h:
5621 ; RV32IDZFH:       # %bb.0:
5622 ; RV32IDZFH-NEXT:    fmv.x.h a0, fa0
5623 ; RV32IDZFH-NEXT:    ret
5625 ; RV64IDZFH-LABEL: bitcast_i16_h:
5626 ; RV64IDZFH:       # %bb.0:
5627 ; RV64IDZFH-NEXT:    fmv.x.h a0, fa0
5628 ; RV64IDZFH-NEXT:    ret
5630 ; CHECKIZHINX-LABEL: bitcast_i16_h:
5631 ; CHECKIZHINX:       # %bb.0:
5632 ; CHECKIZHINX-NEXT:    # kill: def $x10_h killed $x10_h def $x10
5633 ; CHECKIZHINX-NEXT:    ret
5635 ; CHECKIZDINXZHINX-LABEL: bitcast_i16_h:
5636 ; CHECKIZDINXZHINX:       # %bb.0:
5637 ; CHECKIZDINXZHINX-NEXT:    # kill: def $x10_h killed $x10_h def $x10
5638 ; CHECKIZDINXZHINX-NEXT:    ret
5640 ; RV32I-LABEL: bitcast_i16_h:
5641 ; RV32I:       # %bb.0:
5642 ; RV32I-NEXT:    ret
5644 ; RV64I-LABEL: bitcast_i16_h:
5645 ; RV64I:       # %bb.0:
5646 ; RV64I-NEXT:    ret
5648 ; RV32ID-ILP32-LABEL: bitcast_i16_h:
5649 ; RV32ID-ILP32:       # %bb.0:
5650 ; RV32ID-ILP32-NEXT:    ret
5652 ; RV64ID-LP64-LABEL: bitcast_i16_h:
5653 ; RV64ID-LP64:       # %bb.0:
5654 ; RV64ID-LP64-NEXT:    ret
5656 ; RV32ID-LABEL: bitcast_i16_h:
5657 ; RV32ID:       # %bb.0:
5658 ; RV32ID-NEXT:    fmv.x.w a0, fa0
5659 ; RV32ID-NEXT:    ret
5661 ; RV64ID-LABEL: bitcast_i16_h:
5662 ; RV64ID:       # %bb.0:
5663 ; RV64ID-NEXT:    fmv.x.w a0, fa0
5664 ; RV64ID-NEXT:    ret
5666 ; CHECK32-IZFHMIN-LABEL: bitcast_i16_h:
5667 ; CHECK32-IZFHMIN:       # %bb.0:
5668 ; CHECK32-IZFHMIN-NEXT:    fmv.x.h a0, fa0
5669 ; CHECK32-IZFHMIN-NEXT:    ret
5671 ; CHECK64-IZFHMIN-LABEL: bitcast_i16_h:
5672 ; CHECK64-IZFHMIN:       # %bb.0:
5673 ; CHECK64-IZFHMIN-NEXT:    fmv.x.h a0, fa0
5674 ; CHECK64-IZFHMIN-NEXT:    ret
5676 ; CHECK32-IZHINXMIN-LABEL: bitcast_i16_h:
5677 ; CHECK32-IZHINXMIN:       # %bb.0:
5678 ; CHECK32-IZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h def $x10
5679 ; CHECK32-IZHINXMIN-NEXT:    ret
5681 ; CHECK64-IZHINXMIN-LABEL: bitcast_i16_h:
5682 ; CHECK64-IZHINXMIN:       # %bb.0:
5683 ; CHECK64-IZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h def $x10
5684 ; CHECK64-IZHINXMIN-NEXT:    ret
5686 ; CHECK32-IZDINXZHINXMIN-LABEL: bitcast_i16_h:
5687 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
5688 ; CHECK32-IZDINXZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h def $x10
5689 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
5691 ; CHECK64-IZDINXZHINXMIN-LABEL: bitcast_i16_h:
5692 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
5693 ; CHECK64-IZDINXZHINXMIN-NEXT:    # kill: def $x10_h killed $x10_h def $x10
5694 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
5695   %1 = bitcast half %a to i16
5696   ret i16 %1
5699 ; Make sure we select W version of addi on RV64.
5700 define signext i32 @fcvt_h_w_demanded_bits(i32 signext %0, ptr %1) nounwind {
5701 ; RV32IZFH-LABEL: fcvt_h_w_demanded_bits:
5702 ; RV32IZFH:       # %bb.0:
5703 ; RV32IZFH-NEXT:    addi a0, a0, 1
5704 ; RV32IZFH-NEXT:    fcvt.h.w fa5, a0
5705 ; RV32IZFH-NEXT:    fsh fa5, 0(a1)
5706 ; RV32IZFH-NEXT:    ret
5708 ; RV64IZFH-LABEL: fcvt_h_w_demanded_bits:
5709 ; RV64IZFH:       # %bb.0:
5710 ; RV64IZFH-NEXT:    addiw a0, a0, 1
5711 ; RV64IZFH-NEXT:    fcvt.h.w fa5, a0
5712 ; RV64IZFH-NEXT:    fsh fa5, 0(a1)
5713 ; RV64IZFH-NEXT:    ret
5715 ; RV32IDZFH-LABEL: fcvt_h_w_demanded_bits:
5716 ; RV32IDZFH:       # %bb.0:
5717 ; RV32IDZFH-NEXT:    addi a0, a0, 1
5718 ; RV32IDZFH-NEXT:    fcvt.h.w fa5, a0
5719 ; RV32IDZFH-NEXT:    fsh fa5, 0(a1)
5720 ; RV32IDZFH-NEXT:    ret
5722 ; RV64IDZFH-LABEL: fcvt_h_w_demanded_bits:
5723 ; RV64IDZFH:       # %bb.0:
5724 ; RV64IDZFH-NEXT:    addiw a0, a0, 1
5725 ; RV64IDZFH-NEXT:    fcvt.h.w fa5, a0
5726 ; RV64IDZFH-NEXT:    fsh fa5, 0(a1)
5727 ; RV64IDZFH-NEXT:    ret
5729 ; RV32IZHINX-LABEL: fcvt_h_w_demanded_bits:
5730 ; RV32IZHINX:       # %bb.0:
5731 ; RV32IZHINX-NEXT:    addi a0, a0, 1
5732 ; RV32IZHINX-NEXT:    fcvt.h.w a2, a0
5733 ; RV32IZHINX-NEXT:    sh a2, 0(a1)
5734 ; RV32IZHINX-NEXT:    ret
5736 ; RV64IZHINX-LABEL: fcvt_h_w_demanded_bits:
5737 ; RV64IZHINX:       # %bb.0:
5738 ; RV64IZHINX-NEXT:    addiw a0, a0, 1
5739 ; RV64IZHINX-NEXT:    fcvt.h.w a2, a0
5740 ; RV64IZHINX-NEXT:    sh a2, 0(a1)
5741 ; RV64IZHINX-NEXT:    ret
5743 ; RV32IZDINXZHINX-LABEL: fcvt_h_w_demanded_bits:
5744 ; RV32IZDINXZHINX:       # %bb.0:
5745 ; RV32IZDINXZHINX-NEXT:    addi a0, a0, 1
5746 ; RV32IZDINXZHINX-NEXT:    fcvt.h.w a2, a0
5747 ; RV32IZDINXZHINX-NEXT:    sh a2, 0(a1)
5748 ; RV32IZDINXZHINX-NEXT:    ret
5750 ; RV64IZDINXZHINX-LABEL: fcvt_h_w_demanded_bits:
5751 ; RV64IZDINXZHINX:       # %bb.0:
5752 ; RV64IZDINXZHINX-NEXT:    addiw a0, a0, 1
5753 ; RV64IZDINXZHINX-NEXT:    fcvt.h.w a2, a0
5754 ; RV64IZDINXZHINX-NEXT:    sh a2, 0(a1)
5755 ; RV64IZDINXZHINX-NEXT:    ret
5757 ; RV32I-LABEL: fcvt_h_w_demanded_bits:
5758 ; RV32I:       # %bb.0:
5759 ; RV32I-NEXT:    addi sp, sp, -16
5760 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5761 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5762 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
5763 ; RV32I-NEXT:    mv s0, a1
5764 ; RV32I-NEXT:    addi s1, a0, 1
5765 ; RV32I-NEXT:    mv a0, s1
5766 ; RV32I-NEXT:    call __floatsisf
5767 ; RV32I-NEXT:    call __truncsfhf2
5768 ; RV32I-NEXT:    sh a0, 0(s0)
5769 ; RV32I-NEXT:    mv a0, s1
5770 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5771 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5772 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
5773 ; RV32I-NEXT:    addi sp, sp, 16
5774 ; RV32I-NEXT:    ret
5776 ; RV64I-LABEL: fcvt_h_w_demanded_bits:
5777 ; RV64I:       # %bb.0:
5778 ; RV64I-NEXT:    addi sp, sp, -32
5779 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5780 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5781 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
5782 ; RV64I-NEXT:    mv s0, a1
5783 ; RV64I-NEXT:    addiw s1, a0, 1
5784 ; RV64I-NEXT:    mv a0, s1
5785 ; RV64I-NEXT:    call __floatsisf
5786 ; RV64I-NEXT:    call __truncsfhf2
5787 ; RV64I-NEXT:    sh a0, 0(s0)
5788 ; RV64I-NEXT:    mv a0, s1
5789 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5790 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5791 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
5792 ; RV64I-NEXT:    addi sp, sp, 32
5793 ; RV64I-NEXT:    ret
5795 ; RV32ID-ILP32-LABEL: fcvt_h_w_demanded_bits:
5796 ; RV32ID-ILP32:       # %bb.0:
5797 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
5798 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5799 ; RV32ID-ILP32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5800 ; RV32ID-ILP32-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
5801 ; RV32ID-ILP32-NEXT:    mv s0, a1
5802 ; RV32ID-ILP32-NEXT:    addi s1, a0, 1
5803 ; RV32ID-ILP32-NEXT:    fcvt.s.w fa5, s1
5804 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
5805 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
5806 ; RV32ID-ILP32-NEXT:    sh a0, 0(s0)
5807 ; RV32ID-ILP32-NEXT:    mv a0, s1
5808 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5809 ; RV32ID-ILP32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5810 ; RV32ID-ILP32-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
5811 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
5812 ; RV32ID-ILP32-NEXT:    ret
5814 ; RV64ID-LP64-LABEL: fcvt_h_w_demanded_bits:
5815 ; RV64ID-LP64:       # %bb.0:
5816 ; RV64ID-LP64-NEXT:    addi sp, sp, -32
5817 ; RV64ID-LP64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5818 ; RV64ID-LP64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5819 ; RV64ID-LP64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
5820 ; RV64ID-LP64-NEXT:    mv s0, a1
5821 ; RV64ID-LP64-NEXT:    addiw s1, a0, 1
5822 ; RV64ID-LP64-NEXT:    fcvt.s.w fa5, s1
5823 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
5824 ; RV64ID-LP64-NEXT:    call __truncsfhf2
5825 ; RV64ID-LP64-NEXT:    sh a0, 0(s0)
5826 ; RV64ID-LP64-NEXT:    mv a0, s1
5827 ; RV64ID-LP64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5828 ; RV64ID-LP64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5829 ; RV64ID-LP64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
5830 ; RV64ID-LP64-NEXT:    addi sp, sp, 32
5831 ; RV64ID-LP64-NEXT:    ret
5833 ; RV32ID-LABEL: fcvt_h_w_demanded_bits:
5834 ; RV32ID:       # %bb.0:
5835 ; RV32ID-NEXT:    addi sp, sp, -16
5836 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5837 ; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5838 ; RV32ID-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
5839 ; RV32ID-NEXT:    mv s0, a1
5840 ; RV32ID-NEXT:    addi s1, a0, 1
5841 ; RV32ID-NEXT:    fcvt.s.w fa0, s1
5842 ; RV32ID-NEXT:    call __truncsfhf2
5843 ; RV32ID-NEXT:    fmv.x.w a0, fa0
5844 ; RV32ID-NEXT:    sh a0, 0(s0)
5845 ; RV32ID-NEXT:    mv a0, s1
5846 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5847 ; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5848 ; RV32ID-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
5849 ; RV32ID-NEXT:    addi sp, sp, 16
5850 ; RV32ID-NEXT:    ret
5852 ; RV64ID-LABEL: fcvt_h_w_demanded_bits:
5853 ; RV64ID:       # %bb.0:
5854 ; RV64ID-NEXT:    addi sp, sp, -32
5855 ; RV64ID-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5856 ; RV64ID-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5857 ; RV64ID-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
5858 ; RV64ID-NEXT:    mv s0, a1
5859 ; RV64ID-NEXT:    addiw s1, a0, 1
5860 ; RV64ID-NEXT:    fcvt.s.w fa0, s1
5861 ; RV64ID-NEXT:    call __truncsfhf2
5862 ; RV64ID-NEXT:    fmv.x.w a0, fa0
5863 ; RV64ID-NEXT:    sh a0, 0(s0)
5864 ; RV64ID-NEXT:    mv a0, s1
5865 ; RV64ID-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5866 ; RV64ID-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5867 ; RV64ID-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
5868 ; RV64ID-NEXT:    addi sp, sp, 32
5869 ; RV64ID-NEXT:    ret
5871 ; CHECK32-IZFHMIN-LABEL: fcvt_h_w_demanded_bits:
5872 ; CHECK32-IZFHMIN:       # %bb.0:
5873 ; CHECK32-IZFHMIN-NEXT:    addi a0, a0, 1
5874 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
5875 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa5, fa5
5876 ; CHECK32-IZFHMIN-NEXT:    fsh fa5, 0(a1)
5877 ; CHECK32-IZFHMIN-NEXT:    ret
5879 ; CHECK64-IZFHMIN-LABEL: fcvt_h_w_demanded_bits:
5880 ; CHECK64-IZFHMIN:       # %bb.0:
5881 ; CHECK64-IZFHMIN-NEXT:    addiw a0, a0, 1
5882 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.w fa5, a0
5883 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa5, fa5
5884 ; CHECK64-IZFHMIN-NEXT:    fsh fa5, 0(a1)
5885 ; CHECK64-IZFHMIN-NEXT:    ret
5887 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_w_demanded_bits:
5888 ; CHECK32-IZHINXMIN:       # %bb.0:
5889 ; CHECK32-IZHINXMIN-NEXT:    addi a0, a0, 1
5890 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.w a2, a0
5891 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a2, a2
5892 ; CHECK32-IZHINXMIN-NEXT:    sh a2, 0(a1)
5893 ; CHECK32-IZHINXMIN-NEXT:    ret
5895 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_w_demanded_bits:
5896 ; CHECK64-IZHINXMIN:       # %bb.0:
5897 ; CHECK64-IZHINXMIN-NEXT:    addiw a0, a0, 1
5898 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.w a2, a0
5899 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a2, a2
5900 ; CHECK64-IZHINXMIN-NEXT:    sh a2, 0(a1)
5901 ; CHECK64-IZHINXMIN-NEXT:    ret
5903 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_w_demanded_bits:
5904 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
5905 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, a0, 1
5906 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.w a2, a0
5907 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a2, a2
5908 ; CHECK32-IZDINXZHINXMIN-NEXT:    sh a2, 0(a1)
5909 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
5911 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_w_demanded_bits:
5912 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
5913 ; CHECK64-IZDINXZHINXMIN-NEXT:    addiw a0, a0, 1
5914 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.w a2, a0
5915 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a2, a2
5916 ; CHECK64-IZDINXZHINXMIN-NEXT:    sh a2, 0(a1)
5917 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
5918   %3 = add i32 %0, 1
5919   %4 = sitofp i32 %3 to half
5920   store half %4, ptr %1, align 2
5921   ret i32 %3
5924 ; Make sure we select W version of addi on RV64.
5925 define signext i32 @fcvt_h_wu_demanded_bits(i32 signext %0, ptr %1) nounwind {
5926 ; RV32IZFH-LABEL: fcvt_h_wu_demanded_bits:
5927 ; RV32IZFH:       # %bb.0:
5928 ; RV32IZFH-NEXT:    addi a0, a0, 1
5929 ; RV32IZFH-NEXT:    fcvt.h.wu fa5, a0
5930 ; RV32IZFH-NEXT:    fsh fa5, 0(a1)
5931 ; RV32IZFH-NEXT:    ret
5933 ; RV64IZFH-LABEL: fcvt_h_wu_demanded_bits:
5934 ; RV64IZFH:       # %bb.0:
5935 ; RV64IZFH-NEXT:    addiw a0, a0, 1
5936 ; RV64IZFH-NEXT:    fcvt.h.wu fa5, a0
5937 ; RV64IZFH-NEXT:    fsh fa5, 0(a1)
5938 ; RV64IZFH-NEXT:    ret
5940 ; RV32IDZFH-LABEL: fcvt_h_wu_demanded_bits:
5941 ; RV32IDZFH:       # %bb.0:
5942 ; RV32IDZFH-NEXT:    addi a0, a0, 1
5943 ; RV32IDZFH-NEXT:    fcvt.h.wu fa5, a0
5944 ; RV32IDZFH-NEXT:    fsh fa5, 0(a1)
5945 ; RV32IDZFH-NEXT:    ret
5947 ; RV64IDZFH-LABEL: fcvt_h_wu_demanded_bits:
5948 ; RV64IDZFH:       # %bb.0:
5949 ; RV64IDZFH-NEXT:    addiw a0, a0, 1
5950 ; RV64IDZFH-NEXT:    fcvt.h.wu fa5, a0
5951 ; RV64IDZFH-NEXT:    fsh fa5, 0(a1)
5952 ; RV64IDZFH-NEXT:    ret
5954 ; RV32IZHINX-LABEL: fcvt_h_wu_demanded_bits:
5955 ; RV32IZHINX:       # %bb.0:
5956 ; RV32IZHINX-NEXT:    addi a0, a0, 1
5957 ; RV32IZHINX-NEXT:    fcvt.h.wu a2, a0
5958 ; RV32IZHINX-NEXT:    sh a2, 0(a1)
5959 ; RV32IZHINX-NEXT:    ret
5961 ; RV64IZHINX-LABEL: fcvt_h_wu_demanded_bits:
5962 ; RV64IZHINX:       # %bb.0:
5963 ; RV64IZHINX-NEXT:    addiw a0, a0, 1
5964 ; RV64IZHINX-NEXT:    fcvt.h.wu a2, a0
5965 ; RV64IZHINX-NEXT:    sh a2, 0(a1)
5966 ; RV64IZHINX-NEXT:    ret
5968 ; RV32IZDINXZHINX-LABEL: fcvt_h_wu_demanded_bits:
5969 ; RV32IZDINXZHINX:       # %bb.0:
5970 ; RV32IZDINXZHINX-NEXT:    addi a0, a0, 1
5971 ; RV32IZDINXZHINX-NEXT:    fcvt.h.wu a2, a0
5972 ; RV32IZDINXZHINX-NEXT:    sh a2, 0(a1)
5973 ; RV32IZDINXZHINX-NEXT:    ret
5975 ; RV64IZDINXZHINX-LABEL: fcvt_h_wu_demanded_bits:
5976 ; RV64IZDINXZHINX:       # %bb.0:
5977 ; RV64IZDINXZHINX-NEXT:    addiw a0, a0, 1
5978 ; RV64IZDINXZHINX-NEXT:    fcvt.h.wu a2, a0
5979 ; RV64IZDINXZHINX-NEXT:    sh a2, 0(a1)
5980 ; RV64IZDINXZHINX-NEXT:    ret
5982 ; RV32I-LABEL: fcvt_h_wu_demanded_bits:
5983 ; RV32I:       # %bb.0:
5984 ; RV32I-NEXT:    addi sp, sp, -16
5985 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5986 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5987 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
5988 ; RV32I-NEXT:    mv s0, a1
5989 ; RV32I-NEXT:    addi s1, a0, 1
5990 ; RV32I-NEXT:    mv a0, s1
5991 ; RV32I-NEXT:    call __floatunsisf
5992 ; RV32I-NEXT:    call __truncsfhf2
5993 ; RV32I-NEXT:    sh a0, 0(s0)
5994 ; RV32I-NEXT:    mv a0, s1
5995 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5996 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5997 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
5998 ; RV32I-NEXT:    addi sp, sp, 16
5999 ; RV32I-NEXT:    ret
6001 ; RV64I-LABEL: fcvt_h_wu_demanded_bits:
6002 ; RV64I:       # %bb.0:
6003 ; RV64I-NEXT:    addi sp, sp, -32
6004 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
6005 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
6006 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
6007 ; RV64I-NEXT:    mv s0, a1
6008 ; RV64I-NEXT:    addiw s1, a0, 1
6009 ; RV64I-NEXT:    mv a0, s1
6010 ; RV64I-NEXT:    call __floatunsisf
6011 ; RV64I-NEXT:    call __truncsfhf2
6012 ; RV64I-NEXT:    sh a0, 0(s0)
6013 ; RV64I-NEXT:    mv a0, s1
6014 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
6015 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
6016 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
6017 ; RV64I-NEXT:    addi sp, sp, 32
6018 ; RV64I-NEXT:    ret
6020 ; RV32ID-ILP32-LABEL: fcvt_h_wu_demanded_bits:
6021 ; RV32ID-ILP32:       # %bb.0:
6022 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
6023 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6024 ; RV32ID-ILP32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
6025 ; RV32ID-ILP32-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
6026 ; RV32ID-ILP32-NEXT:    mv s0, a1
6027 ; RV32ID-ILP32-NEXT:    addi s1, a0, 1
6028 ; RV32ID-ILP32-NEXT:    fcvt.s.wu fa5, s1
6029 ; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
6030 ; RV32ID-ILP32-NEXT:    call __truncsfhf2
6031 ; RV32ID-ILP32-NEXT:    sh a0, 0(s0)
6032 ; RV32ID-ILP32-NEXT:    mv a0, s1
6033 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6034 ; RV32ID-ILP32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
6035 ; RV32ID-ILP32-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
6036 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
6037 ; RV32ID-ILP32-NEXT:    ret
6039 ; RV64ID-LP64-LABEL: fcvt_h_wu_demanded_bits:
6040 ; RV64ID-LP64:       # %bb.0:
6041 ; RV64ID-LP64-NEXT:    addi sp, sp, -32
6042 ; RV64ID-LP64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
6043 ; RV64ID-LP64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
6044 ; RV64ID-LP64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
6045 ; RV64ID-LP64-NEXT:    mv s0, a1
6046 ; RV64ID-LP64-NEXT:    addiw s1, a0, 1
6047 ; RV64ID-LP64-NEXT:    fcvt.s.wu fa5, s1
6048 ; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
6049 ; RV64ID-LP64-NEXT:    call __truncsfhf2
6050 ; RV64ID-LP64-NEXT:    sh a0, 0(s0)
6051 ; RV64ID-LP64-NEXT:    mv a0, s1
6052 ; RV64ID-LP64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
6053 ; RV64ID-LP64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
6054 ; RV64ID-LP64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
6055 ; RV64ID-LP64-NEXT:    addi sp, sp, 32
6056 ; RV64ID-LP64-NEXT:    ret
6058 ; RV32ID-LABEL: fcvt_h_wu_demanded_bits:
6059 ; RV32ID:       # %bb.0:
6060 ; RV32ID-NEXT:    addi sp, sp, -16
6061 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6062 ; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
6063 ; RV32ID-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
6064 ; RV32ID-NEXT:    mv s0, a1
6065 ; RV32ID-NEXT:    addi s1, a0, 1
6066 ; RV32ID-NEXT:    fcvt.s.wu fa0, s1
6067 ; RV32ID-NEXT:    call __truncsfhf2
6068 ; RV32ID-NEXT:    fmv.x.w a0, fa0
6069 ; RV32ID-NEXT:    sh a0, 0(s0)
6070 ; RV32ID-NEXT:    mv a0, s1
6071 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6072 ; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
6073 ; RV32ID-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
6074 ; RV32ID-NEXT:    addi sp, sp, 16
6075 ; RV32ID-NEXT:    ret
6077 ; RV64ID-LABEL: fcvt_h_wu_demanded_bits:
6078 ; RV64ID:       # %bb.0:
6079 ; RV64ID-NEXT:    addi sp, sp, -32
6080 ; RV64ID-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
6081 ; RV64ID-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
6082 ; RV64ID-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
6083 ; RV64ID-NEXT:    mv s0, a1
6084 ; RV64ID-NEXT:    addiw s1, a0, 1
6085 ; RV64ID-NEXT:    fcvt.s.wu fa0, s1
6086 ; RV64ID-NEXT:    call __truncsfhf2
6087 ; RV64ID-NEXT:    fmv.x.w a0, fa0
6088 ; RV64ID-NEXT:    sh a0, 0(s0)
6089 ; RV64ID-NEXT:    mv a0, s1
6090 ; RV64ID-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
6091 ; RV64ID-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
6092 ; RV64ID-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
6093 ; RV64ID-NEXT:    addi sp, sp, 32
6094 ; RV64ID-NEXT:    ret
6096 ; CHECK32-IZFHMIN-LABEL: fcvt_h_wu_demanded_bits:
6097 ; CHECK32-IZFHMIN:       # %bb.0:
6098 ; CHECK32-IZFHMIN-NEXT:    addi a0, a0, 1
6099 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
6100 ; CHECK32-IZFHMIN-NEXT:    fcvt.h.s fa5, fa5
6101 ; CHECK32-IZFHMIN-NEXT:    fsh fa5, 0(a1)
6102 ; CHECK32-IZFHMIN-NEXT:    ret
6104 ; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_demanded_bits:
6105 ; CHECK64-IZFHMIN:       # %bb.0:
6106 ; CHECK64-IZFHMIN-NEXT:    addiw a0, a0, 1
6107 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.wu fa5, a0
6108 ; CHECK64-IZFHMIN-NEXT:    fcvt.h.s fa5, fa5
6109 ; CHECK64-IZFHMIN-NEXT:    fsh fa5, 0(a1)
6110 ; CHECK64-IZFHMIN-NEXT:    ret
6112 ; CHECK32-IZHINXMIN-LABEL: fcvt_h_wu_demanded_bits:
6113 ; CHECK32-IZHINXMIN:       # %bb.0:
6114 ; CHECK32-IZHINXMIN-NEXT:    addi a0, a0, 1
6115 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.wu a2, a0
6116 ; CHECK32-IZHINXMIN-NEXT:    fcvt.h.s a2, a2
6117 ; CHECK32-IZHINXMIN-NEXT:    sh a2, 0(a1)
6118 ; CHECK32-IZHINXMIN-NEXT:    ret
6120 ; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_demanded_bits:
6121 ; CHECK64-IZHINXMIN:       # %bb.0:
6122 ; CHECK64-IZHINXMIN-NEXT:    addiw a0, a0, 1
6123 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.wu a2, a0
6124 ; CHECK64-IZHINXMIN-NEXT:    fcvt.h.s a2, a2
6125 ; CHECK64-IZHINXMIN-NEXT:    sh a2, 0(a1)
6126 ; CHECK64-IZHINXMIN-NEXT:    ret
6128 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_wu_demanded_bits:
6129 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
6130 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, a0, 1
6131 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a2, a0
6132 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.h.s a2, a2
6133 ; CHECK32-IZDINXZHINXMIN-NEXT:    sh a2, 0(a1)
6134 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
6136 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_demanded_bits:
6137 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
6138 ; CHECK64-IZDINXZHINXMIN-NEXT:    addiw a0, a0, 1
6139 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.wu a2, a0
6140 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.h.s a2, a2
6141 ; CHECK64-IZDINXZHINXMIN-NEXT:    sh a2, 0(a1)
6142 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
6143   %3 = add i32 %0, 1
6144   %4 = uitofp i32 %3 to half
6145   store half %4, ptr %1, align 2
6146   ret i32 %3
6149 define signext i16 @fcvt_w_s_i16(half %a) nounwind {
6150 ; RV32IZFH-LABEL: fcvt_w_s_i16:
6151 ; RV32IZFH:       # %bb.0:
6152 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rtz
6153 ; RV32IZFH-NEXT:    ret
6155 ; RV64IZFH-LABEL: fcvt_w_s_i16:
6156 ; RV64IZFH:       # %bb.0:
6157 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
6158 ; RV64IZFH-NEXT:    ret
6160 ; RV32IDZFH-LABEL: fcvt_w_s_i16:
6161 ; RV32IDZFH:       # %bb.0:
6162 ; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
6163 ; RV32IDZFH-NEXT:    ret
6165 ; RV64IDZFH-LABEL: fcvt_w_s_i16:
6166 ; RV64IDZFH:       # %bb.0:
6167 ; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
6168 ; RV64IDZFH-NEXT:    ret
6170 ; RV32IZHINX-LABEL: fcvt_w_s_i16:
6171 ; RV32IZHINX:       # %bb.0:
6172 ; RV32IZHINX-NEXT:    fcvt.w.h a0, a0, rtz
6173 ; RV32IZHINX-NEXT:    ret
6175 ; RV64IZHINX-LABEL: fcvt_w_s_i16:
6176 ; RV64IZHINX:       # %bb.0:
6177 ; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
6178 ; RV64IZHINX-NEXT:    ret
6180 ; RV32IZDINXZHINX-LABEL: fcvt_w_s_i16:
6181 ; RV32IZDINXZHINX:       # %bb.0:
6182 ; RV32IZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
6183 ; RV32IZDINXZHINX-NEXT:    ret
6185 ; RV64IZDINXZHINX-LABEL: fcvt_w_s_i16:
6186 ; RV64IZDINXZHINX:       # %bb.0:
6187 ; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
6188 ; RV64IZDINXZHINX-NEXT:    ret
6190 ; RV32I-LABEL: fcvt_w_s_i16:
6191 ; RV32I:       # %bb.0:
6192 ; RV32I-NEXT:    addi sp, sp, -16
6193 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6194 ; RV32I-NEXT:    slli a0, a0, 16
6195 ; RV32I-NEXT:    srli a0, a0, 16
6196 ; RV32I-NEXT:    call __extendhfsf2
6197 ; RV32I-NEXT:    call __fixsfsi
6198 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6199 ; RV32I-NEXT:    addi sp, sp, 16
6200 ; RV32I-NEXT:    ret
6202 ; RV64I-LABEL: fcvt_w_s_i16:
6203 ; RV64I:       # %bb.0:
6204 ; RV64I-NEXT:    addi sp, sp, -16
6205 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6206 ; RV64I-NEXT:    slli a0, a0, 48
6207 ; RV64I-NEXT:    srli a0, a0, 48
6208 ; RV64I-NEXT:    call __extendhfsf2
6209 ; RV64I-NEXT:    call __fixsfdi
6210 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6211 ; RV64I-NEXT:    addi sp, sp, 16
6212 ; RV64I-NEXT:    ret
6214 ; RV32ID-ILP32-LABEL: fcvt_w_s_i16:
6215 ; RV32ID-ILP32:       # %bb.0:
6216 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
6217 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6218 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
6219 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
6220 ; RV32ID-ILP32-NEXT:    fcvt.w.s a0, fa5, rtz
6221 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6222 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
6223 ; RV32ID-ILP32-NEXT:    ret
6225 ; RV64ID-LP64-LABEL: fcvt_w_s_i16:
6226 ; RV64ID-LP64:       # %bb.0:
6227 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
6228 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6229 ; RV64ID-LP64-NEXT:    call __extendhfsf2
6230 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
6231 ; RV64ID-LP64-NEXT:    fcvt.l.s a0, fa5, rtz
6232 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6233 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
6234 ; RV64ID-LP64-NEXT:    ret
6236 ; RV32ID-LABEL: fcvt_w_s_i16:
6237 ; RV32ID:       # %bb.0:
6238 ; RV32ID-NEXT:    addi sp, sp, -16
6239 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6240 ; RV32ID-NEXT:    call __extendhfsf2
6241 ; RV32ID-NEXT:    fcvt.w.s a0, fa0, rtz
6242 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6243 ; RV32ID-NEXT:    addi sp, sp, 16
6244 ; RV32ID-NEXT:    ret
6246 ; RV64ID-LABEL: fcvt_w_s_i16:
6247 ; RV64ID:       # %bb.0:
6248 ; RV64ID-NEXT:    addi sp, sp, -16
6249 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6250 ; RV64ID-NEXT:    call __extendhfsf2
6251 ; RV64ID-NEXT:    fcvt.l.s a0, fa0, rtz
6252 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6253 ; RV64ID-NEXT:    addi sp, sp, 16
6254 ; RV64ID-NEXT:    ret
6256 ; CHECK32-IZFHMIN-LABEL: fcvt_w_s_i16:
6257 ; CHECK32-IZFHMIN:       # %bb.0:
6258 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
6259 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
6260 ; CHECK32-IZFHMIN-NEXT:    ret
6262 ; CHECK64-IZFHMIN-LABEL: fcvt_w_s_i16:
6263 ; CHECK64-IZFHMIN:       # %bb.0:
6264 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
6265 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a0, fa5, rtz
6266 ; CHECK64-IZFHMIN-NEXT:    ret
6268 ; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_i16:
6269 ; CHECK32-IZHINXMIN:       # %bb.0:
6270 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
6271 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
6272 ; CHECK32-IZHINXMIN-NEXT:    ret
6274 ; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_i16:
6275 ; CHECK64-IZHINXMIN:       # %bb.0:
6276 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
6277 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
6278 ; CHECK64-IZHINXMIN-NEXT:    ret
6280 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_i16:
6281 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
6282 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
6283 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
6284 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
6286 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_i16:
6287 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
6288 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
6289 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
6290 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
6291   %1 = fptosi half %a to i16
6292   ret i16 %1
6295 define signext i16 @fcvt_w_s_sat_i16(half %a) nounwind {
6296 ; RV32IZFH-LABEL: fcvt_w_s_sat_i16:
6297 ; RV32IZFH:       # %bb.0: # %start
6298 ; RV32IZFH-NEXT:    fcvt.s.h fa5, fa0
6299 ; RV32IZFH-NEXT:    lui a0, %hi(.LCPI32_0)
6300 ; RV32IZFH-NEXT:    feq.s a1, fa5, fa5
6301 ; RV32IZFH-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6302 ; RV32IZFH-NEXT:    lui a0, 815104
6303 ; RV32IZFH-NEXT:    fmv.w.x fa3, a0
6304 ; RV32IZFH-NEXT:    fmax.s fa5, fa5, fa3
6305 ; RV32IZFH-NEXT:    neg a0, a1
6306 ; RV32IZFH-NEXT:    fmin.s fa5, fa5, fa4
6307 ; RV32IZFH-NEXT:    fcvt.w.s a1, fa5, rtz
6308 ; RV32IZFH-NEXT:    and a0, a0, a1
6309 ; RV32IZFH-NEXT:    ret
6311 ; RV64IZFH-LABEL: fcvt_w_s_sat_i16:
6312 ; RV64IZFH:       # %bb.0: # %start
6313 ; RV64IZFH-NEXT:    fcvt.s.h fa5, fa0
6314 ; RV64IZFH-NEXT:    lui a0, %hi(.LCPI32_0)
6315 ; RV64IZFH-NEXT:    feq.s a1, fa5, fa5
6316 ; RV64IZFH-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6317 ; RV64IZFH-NEXT:    lui a0, 815104
6318 ; RV64IZFH-NEXT:    fmv.w.x fa3, a0
6319 ; RV64IZFH-NEXT:    fmax.s fa5, fa5, fa3
6320 ; RV64IZFH-NEXT:    neg a0, a1
6321 ; RV64IZFH-NEXT:    fmin.s fa5, fa5, fa4
6322 ; RV64IZFH-NEXT:    fcvt.l.s a1, fa5, rtz
6323 ; RV64IZFH-NEXT:    and a0, a0, a1
6324 ; RV64IZFH-NEXT:    ret
6326 ; RV32IDZFH-LABEL: fcvt_w_s_sat_i16:
6327 ; RV32IDZFH:       # %bb.0: # %start
6328 ; RV32IDZFH-NEXT:    fcvt.s.h fa5, fa0
6329 ; RV32IDZFH-NEXT:    lui a0, %hi(.LCPI32_0)
6330 ; RV32IDZFH-NEXT:    feq.s a1, fa5, fa5
6331 ; RV32IDZFH-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6332 ; RV32IDZFH-NEXT:    lui a0, 815104
6333 ; RV32IDZFH-NEXT:    fmv.w.x fa3, a0
6334 ; RV32IDZFH-NEXT:    fmax.s fa5, fa5, fa3
6335 ; RV32IDZFH-NEXT:    neg a0, a1
6336 ; RV32IDZFH-NEXT:    fmin.s fa5, fa5, fa4
6337 ; RV32IDZFH-NEXT:    fcvt.w.s a1, fa5, rtz
6338 ; RV32IDZFH-NEXT:    and a0, a0, a1
6339 ; RV32IDZFH-NEXT:    ret
6341 ; RV64IDZFH-LABEL: fcvt_w_s_sat_i16:
6342 ; RV64IDZFH:       # %bb.0: # %start
6343 ; RV64IDZFH-NEXT:    fcvt.s.h fa5, fa0
6344 ; RV64IDZFH-NEXT:    lui a0, %hi(.LCPI32_0)
6345 ; RV64IDZFH-NEXT:    feq.s a1, fa5, fa5
6346 ; RV64IDZFH-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6347 ; RV64IDZFH-NEXT:    lui a0, 815104
6348 ; RV64IDZFH-NEXT:    fmv.w.x fa3, a0
6349 ; RV64IDZFH-NEXT:    fmax.s fa5, fa5, fa3
6350 ; RV64IDZFH-NEXT:    neg a0, a1
6351 ; RV64IDZFH-NEXT:    fmin.s fa5, fa5, fa4
6352 ; RV64IDZFH-NEXT:    fcvt.l.s a1, fa5, rtz
6353 ; RV64IDZFH-NEXT:    and a0, a0, a1
6354 ; RV64IDZFH-NEXT:    ret
6356 ; RV32IZHINX-LABEL: fcvt_w_s_sat_i16:
6357 ; RV32IZHINX:       # %bb.0: # %start
6358 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
6359 ; RV32IZHINX-NEXT:    lui a1, 815104
6360 ; RV32IZHINX-NEXT:    lui a2, 290816
6361 ; RV32IZHINX-NEXT:    fmax.s a1, a0, a1
6362 ; RV32IZHINX-NEXT:    feq.s a0, a0, a0
6363 ; RV32IZHINX-NEXT:    addi a2, a2, -512
6364 ; RV32IZHINX-NEXT:    neg a0, a0
6365 ; RV32IZHINX-NEXT:    fmin.s a1, a1, a2
6366 ; RV32IZHINX-NEXT:    fcvt.w.s a1, a1, rtz
6367 ; RV32IZHINX-NEXT:    and a0, a0, a1
6368 ; RV32IZHINX-NEXT:    ret
6370 ; RV64IZHINX-LABEL: fcvt_w_s_sat_i16:
6371 ; RV64IZHINX:       # %bb.0: # %start
6372 ; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
6373 ; RV64IZHINX-NEXT:    lui a1, 815104
6374 ; RV64IZHINX-NEXT:    lui a2, 290816
6375 ; RV64IZHINX-NEXT:    fmax.s a1, a0, a1
6376 ; RV64IZHINX-NEXT:    feq.s a0, a0, a0
6377 ; RV64IZHINX-NEXT:    addiw a2, a2, -512
6378 ; RV64IZHINX-NEXT:    neg a0, a0
6379 ; RV64IZHINX-NEXT:    fmin.s a1, a1, a2
6380 ; RV64IZHINX-NEXT:    fcvt.l.s a1, a1, rtz
6381 ; RV64IZHINX-NEXT:    and a0, a0, a1
6382 ; RV64IZHINX-NEXT:    ret
6384 ; RV32IZDINXZHINX-LABEL: fcvt_w_s_sat_i16:
6385 ; RV32IZDINXZHINX:       # %bb.0: # %start
6386 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
6387 ; RV32IZDINXZHINX-NEXT:    lui a1, 815104
6388 ; RV32IZDINXZHINX-NEXT:    lui a2, 290816
6389 ; RV32IZDINXZHINX-NEXT:    fmax.s a1, a0, a1
6390 ; RV32IZDINXZHINX-NEXT:    feq.s a0, a0, a0
6391 ; RV32IZDINXZHINX-NEXT:    addi a2, a2, -512
6392 ; RV32IZDINXZHINX-NEXT:    neg a0, a0
6393 ; RV32IZDINXZHINX-NEXT:    fmin.s a1, a1, a2
6394 ; RV32IZDINXZHINX-NEXT:    fcvt.w.s a1, a1, rtz
6395 ; RV32IZDINXZHINX-NEXT:    and a0, a0, a1
6396 ; RV32IZDINXZHINX-NEXT:    ret
6398 ; RV64IZDINXZHINX-LABEL: fcvt_w_s_sat_i16:
6399 ; RV64IZDINXZHINX:       # %bb.0: # %start
6400 ; RV64IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
6401 ; RV64IZDINXZHINX-NEXT:    lui a1, 815104
6402 ; RV64IZDINXZHINX-NEXT:    lui a2, 290816
6403 ; RV64IZDINXZHINX-NEXT:    fmax.s a1, a0, a1
6404 ; RV64IZDINXZHINX-NEXT:    feq.s a0, a0, a0
6405 ; RV64IZDINXZHINX-NEXT:    addiw a2, a2, -512
6406 ; RV64IZDINXZHINX-NEXT:    neg a0, a0
6407 ; RV64IZDINXZHINX-NEXT:    fmin.s a1, a1, a2
6408 ; RV64IZDINXZHINX-NEXT:    fcvt.l.s a1, a1, rtz
6409 ; RV64IZDINXZHINX-NEXT:    and a0, a0, a1
6410 ; RV64IZDINXZHINX-NEXT:    ret
6412 ; RV32I-LABEL: fcvt_w_s_sat_i16:
6413 ; RV32I:       # %bb.0: # %start
6414 ; RV32I-NEXT:    addi sp, sp, -16
6415 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6416 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
6417 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
6418 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
6419 ; RV32I-NEXT:    slli a0, a0, 16
6420 ; RV32I-NEXT:    srli a0, a0, 16
6421 ; RV32I-NEXT:    call __extendhfsf2
6422 ; RV32I-NEXT:    mv s0, a0
6423 ; RV32I-NEXT:    lui a1, 815104
6424 ; RV32I-NEXT:    call __gesf2
6425 ; RV32I-NEXT:    mv s2, a0
6426 ; RV32I-NEXT:    mv a0, s0
6427 ; RV32I-NEXT:    call __fixsfsi
6428 ; RV32I-NEXT:    mv s1, a0
6429 ; RV32I-NEXT:    bgez s2, .LBB32_2
6430 ; RV32I-NEXT:  # %bb.1: # %start
6431 ; RV32I-NEXT:    lui s1, 1048568
6432 ; RV32I-NEXT:  .LBB32_2: # %start
6433 ; RV32I-NEXT:    lui a0, 290816
6434 ; RV32I-NEXT:    addi a1, a0, -512
6435 ; RV32I-NEXT:    mv a0, s0
6436 ; RV32I-NEXT:    call __gtsf2
6437 ; RV32I-NEXT:    blez a0, .LBB32_4
6438 ; RV32I-NEXT:  # %bb.3: # %start
6439 ; RV32I-NEXT:    lui s1, 8
6440 ; RV32I-NEXT:    addi s1, s1, -1
6441 ; RV32I-NEXT:  .LBB32_4: # %start
6442 ; RV32I-NEXT:    mv a0, s0
6443 ; RV32I-NEXT:    mv a1, s0
6444 ; RV32I-NEXT:    call __unordsf2
6445 ; RV32I-NEXT:    snez a0, a0
6446 ; RV32I-NEXT:    addi a0, a0, -1
6447 ; RV32I-NEXT:    and a0, a0, s1
6448 ; RV32I-NEXT:    slli a0, a0, 16
6449 ; RV32I-NEXT:    srai a0, a0, 16
6450 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6451 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
6452 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
6453 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
6454 ; RV32I-NEXT:    addi sp, sp, 16
6455 ; RV32I-NEXT:    ret
6457 ; RV64I-LABEL: fcvt_w_s_sat_i16:
6458 ; RV64I:       # %bb.0: # %start
6459 ; RV64I-NEXT:    addi sp, sp, -32
6460 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
6461 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
6462 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
6463 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
6464 ; RV64I-NEXT:    slli a0, a0, 48
6465 ; RV64I-NEXT:    srli a0, a0, 48
6466 ; RV64I-NEXT:    call __extendhfsf2
6467 ; RV64I-NEXT:    mv s0, a0
6468 ; RV64I-NEXT:    lui a1, 815104
6469 ; RV64I-NEXT:    call __gesf2
6470 ; RV64I-NEXT:    mv s2, a0
6471 ; RV64I-NEXT:    mv a0, s0
6472 ; RV64I-NEXT:    call __fixsfdi
6473 ; RV64I-NEXT:    mv s1, a0
6474 ; RV64I-NEXT:    bgez s2, .LBB32_2
6475 ; RV64I-NEXT:  # %bb.1: # %start
6476 ; RV64I-NEXT:    lui s1, 1048568
6477 ; RV64I-NEXT:  .LBB32_2: # %start
6478 ; RV64I-NEXT:    lui a0, 290816
6479 ; RV64I-NEXT:    addiw a1, a0, -512
6480 ; RV64I-NEXT:    mv a0, s0
6481 ; RV64I-NEXT:    call __gtsf2
6482 ; RV64I-NEXT:    blez a0, .LBB32_4
6483 ; RV64I-NEXT:  # %bb.3: # %start
6484 ; RV64I-NEXT:    lui s1, 8
6485 ; RV64I-NEXT:    addi s1, s1, -1
6486 ; RV64I-NEXT:  .LBB32_4: # %start
6487 ; RV64I-NEXT:    mv a0, s0
6488 ; RV64I-NEXT:    mv a1, s0
6489 ; RV64I-NEXT:    call __unordsf2
6490 ; RV64I-NEXT:    snez a0, a0
6491 ; RV64I-NEXT:    addi a0, a0, -1
6492 ; RV64I-NEXT:    and a0, a0, s1
6493 ; RV64I-NEXT:    slli a0, a0, 48
6494 ; RV64I-NEXT:    srai a0, a0, 48
6495 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
6496 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
6497 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
6498 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
6499 ; RV64I-NEXT:    addi sp, sp, 32
6500 ; RV64I-NEXT:    ret
6502 ; RV32ID-ILP32-LABEL: fcvt_w_s_sat_i16:
6503 ; RV32ID-ILP32:       # %bb.0: # %start
6504 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
6505 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6506 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
6507 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
6508 ; RV32ID-ILP32-NEXT:    lui a0, %hi(.LCPI32_0)
6509 ; RV32ID-ILP32-NEXT:    feq.s a1, fa5, fa5
6510 ; RV32ID-ILP32-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6511 ; RV32ID-ILP32-NEXT:    lui a0, 815104
6512 ; RV32ID-ILP32-NEXT:    fmv.w.x fa3, a0
6513 ; RV32ID-ILP32-NEXT:    fmax.s fa5, fa5, fa3
6514 ; RV32ID-ILP32-NEXT:    neg a0, a1
6515 ; RV32ID-ILP32-NEXT:    fmin.s fa5, fa5, fa4
6516 ; RV32ID-ILP32-NEXT:    fcvt.w.s a1, fa5, rtz
6517 ; RV32ID-ILP32-NEXT:    and a0, a0, a1
6518 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6519 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
6520 ; RV32ID-ILP32-NEXT:    ret
6522 ; RV64ID-LP64-LABEL: fcvt_w_s_sat_i16:
6523 ; RV64ID-LP64:       # %bb.0: # %start
6524 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
6525 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6526 ; RV64ID-LP64-NEXT:    call __extendhfsf2
6527 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
6528 ; RV64ID-LP64-NEXT:    lui a0, %hi(.LCPI32_0)
6529 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
6530 ; RV64ID-LP64-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6531 ; RV64ID-LP64-NEXT:    lui a0, 815104
6532 ; RV64ID-LP64-NEXT:    fmv.w.x fa3, a0
6533 ; RV64ID-LP64-NEXT:    fmax.s fa5, fa5, fa3
6534 ; RV64ID-LP64-NEXT:    neg a0, a1
6535 ; RV64ID-LP64-NEXT:    fmin.s fa5, fa5, fa4
6536 ; RV64ID-LP64-NEXT:    fcvt.l.s a1, fa5, rtz
6537 ; RV64ID-LP64-NEXT:    and a0, a0, a1
6538 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6539 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
6540 ; RV64ID-LP64-NEXT:    ret
6542 ; RV32ID-LABEL: fcvt_w_s_sat_i16:
6543 ; RV32ID:       # %bb.0: # %start
6544 ; RV32ID-NEXT:    addi sp, sp, -16
6545 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6546 ; RV32ID-NEXT:    call __extendhfsf2
6547 ; RV32ID-NEXT:    feq.s a0, fa0, fa0
6548 ; RV32ID-NEXT:    lui a1, %hi(.LCPI32_0)
6549 ; RV32ID-NEXT:    flw fa5, %lo(.LCPI32_0)(a1)
6550 ; RV32ID-NEXT:    lui a1, 815104
6551 ; RV32ID-NEXT:    fmv.w.x fa4, a1
6552 ; RV32ID-NEXT:    fmax.s fa4, fa0, fa4
6553 ; RV32ID-NEXT:    neg a0, a0
6554 ; RV32ID-NEXT:    fmin.s fa5, fa4, fa5
6555 ; RV32ID-NEXT:    fcvt.w.s a1, fa5, rtz
6556 ; RV32ID-NEXT:    and a0, a0, a1
6557 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6558 ; RV32ID-NEXT:    addi sp, sp, 16
6559 ; RV32ID-NEXT:    ret
6561 ; RV64ID-LABEL: fcvt_w_s_sat_i16:
6562 ; RV64ID:       # %bb.0: # %start
6563 ; RV64ID-NEXT:    addi sp, sp, -16
6564 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6565 ; RV64ID-NEXT:    call __extendhfsf2
6566 ; RV64ID-NEXT:    feq.s a0, fa0, fa0
6567 ; RV64ID-NEXT:    lui a1, %hi(.LCPI32_0)
6568 ; RV64ID-NEXT:    flw fa5, %lo(.LCPI32_0)(a1)
6569 ; RV64ID-NEXT:    lui a1, 815104
6570 ; RV64ID-NEXT:    fmv.w.x fa4, a1
6571 ; RV64ID-NEXT:    fmax.s fa4, fa0, fa4
6572 ; RV64ID-NEXT:    neg a0, a0
6573 ; RV64ID-NEXT:    fmin.s fa5, fa4, fa5
6574 ; RV64ID-NEXT:    fcvt.l.s a1, fa5, rtz
6575 ; RV64ID-NEXT:    and a0, a0, a1
6576 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6577 ; RV64ID-NEXT:    addi sp, sp, 16
6578 ; RV64ID-NEXT:    ret
6580 ; CHECK32-IZFHMIN-LABEL: fcvt_w_s_sat_i16:
6581 ; CHECK32-IZFHMIN:       # %bb.0: # %start
6582 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
6583 ; CHECK32-IZFHMIN-NEXT:    lui a0, %hi(.LCPI32_0)
6584 ; CHECK32-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
6585 ; CHECK32-IZFHMIN-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6586 ; CHECK32-IZFHMIN-NEXT:    lui a0, 815104
6587 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa3, a0
6588 ; CHECK32-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa3
6589 ; CHECK32-IZFHMIN-NEXT:    neg a0, a1
6590 ; CHECK32-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
6591 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a1, fa5, rtz
6592 ; CHECK32-IZFHMIN-NEXT:    and a0, a0, a1
6593 ; CHECK32-IZFHMIN-NEXT:    ret
6595 ; CHECK64-IZFHMIN-LABEL: fcvt_w_s_sat_i16:
6596 ; CHECK64-IZFHMIN:       # %bb.0: # %start
6597 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
6598 ; CHECK64-IZFHMIN-NEXT:    lui a0, %hi(.LCPI32_0)
6599 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
6600 ; CHECK64-IZFHMIN-NEXT:    flw fa4, %lo(.LCPI32_0)(a0)
6601 ; CHECK64-IZFHMIN-NEXT:    lui a0, 815104
6602 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa3, a0
6603 ; CHECK64-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa3
6604 ; CHECK64-IZFHMIN-NEXT:    neg a0, a1
6605 ; CHECK64-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
6606 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a1, fa5, rtz
6607 ; CHECK64-IZFHMIN-NEXT:    and a0, a0, a1
6608 ; CHECK64-IZFHMIN-NEXT:    ret
6610 ; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_sat_i16:
6611 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
6612 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
6613 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 815104
6614 ; CHECK32-IZHINXMIN-NEXT:    lui a2, 290816
6615 ; CHECK32-IZHINXMIN-NEXT:    fmax.s a1, a0, a1
6616 ; CHECK32-IZHINXMIN-NEXT:    feq.s a0, a0, a0
6617 ; CHECK32-IZHINXMIN-NEXT:    addi a2, a2, -512
6618 ; CHECK32-IZHINXMIN-NEXT:    neg a0, a0
6619 ; CHECK32-IZHINXMIN-NEXT:    fmin.s a1, a1, a2
6620 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a1, a1, rtz
6621 ; CHECK32-IZHINXMIN-NEXT:    and a0, a0, a1
6622 ; CHECK32-IZHINXMIN-NEXT:    ret
6624 ; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_sat_i16:
6625 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
6626 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
6627 ; CHECK64-IZHINXMIN-NEXT:    lui a1, 815104
6628 ; CHECK64-IZHINXMIN-NEXT:    lui a2, 290816
6629 ; CHECK64-IZHINXMIN-NEXT:    fmax.s a1, a0, a1
6630 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
6631 ; CHECK64-IZHINXMIN-NEXT:    addiw a2, a2, -512
6632 ; CHECK64-IZHINXMIN-NEXT:    neg a0, a0
6633 ; CHECK64-IZHINXMIN-NEXT:    fmin.s a1, a1, a2
6634 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a1, a1, rtz
6635 ; CHECK64-IZHINXMIN-NEXT:    and a0, a0, a1
6636 ; CHECK64-IZHINXMIN-NEXT:    ret
6638 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i16:
6639 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
6640 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
6641 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 815104
6642 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a2, 290816
6643 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmax.s a1, a0, a1
6644 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
6645 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a2, a2, -512
6646 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg a0, a0
6647 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmin.s a1, a1, a2
6648 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a1, a1, rtz
6649 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
6650 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
6652 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i16:
6653 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
6654 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
6655 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a1, 815104
6656 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a2, 290816
6657 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmax.s a1, a0, a1
6658 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
6659 ; CHECK64-IZDINXZHINXMIN-NEXT:    addiw a2, a2, -512
6660 ; CHECK64-IZDINXZHINXMIN-NEXT:    neg a0, a0
6661 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmin.s a1, a1, a2
6662 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a1, a1, rtz
6663 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
6664 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
6665 start:
6666   %0 = tail call i16 @llvm.fptosi.sat.i16.f16(half %a)
6667   ret i16 %0
6670 define zeroext i16 @fcvt_wu_s_i16(half %a) nounwind {
6671 ; RV32IZFH-LABEL: fcvt_wu_s_i16:
6672 ; RV32IZFH:       # %bb.0:
6673 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
6674 ; RV32IZFH-NEXT:    ret
6676 ; RV64IZFH-LABEL: fcvt_wu_s_i16:
6677 ; RV64IZFH:       # %bb.0:
6678 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
6679 ; RV64IZFH-NEXT:    ret
6681 ; RV32IDZFH-LABEL: fcvt_wu_s_i16:
6682 ; RV32IDZFH:       # %bb.0:
6683 ; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
6684 ; RV32IDZFH-NEXT:    ret
6686 ; RV64IDZFH-LABEL: fcvt_wu_s_i16:
6687 ; RV64IDZFH:       # %bb.0:
6688 ; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
6689 ; RV64IDZFH-NEXT:    ret
6691 ; RV32IZHINX-LABEL: fcvt_wu_s_i16:
6692 ; RV32IZHINX:       # %bb.0:
6693 ; RV32IZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
6694 ; RV32IZHINX-NEXT:    ret
6696 ; RV64IZHINX-LABEL: fcvt_wu_s_i16:
6697 ; RV64IZHINX:       # %bb.0:
6698 ; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
6699 ; RV64IZHINX-NEXT:    ret
6701 ; RV32IZDINXZHINX-LABEL: fcvt_wu_s_i16:
6702 ; RV32IZDINXZHINX:       # %bb.0:
6703 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
6704 ; RV32IZDINXZHINX-NEXT:    ret
6706 ; RV64IZDINXZHINX-LABEL: fcvt_wu_s_i16:
6707 ; RV64IZDINXZHINX:       # %bb.0:
6708 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
6709 ; RV64IZDINXZHINX-NEXT:    ret
6711 ; RV32I-LABEL: fcvt_wu_s_i16:
6712 ; RV32I:       # %bb.0:
6713 ; RV32I-NEXT:    addi sp, sp, -16
6714 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6715 ; RV32I-NEXT:    slli a0, a0, 16
6716 ; RV32I-NEXT:    srli a0, a0, 16
6717 ; RV32I-NEXT:    call __extendhfsf2
6718 ; RV32I-NEXT:    call __fixunssfsi
6719 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6720 ; RV32I-NEXT:    addi sp, sp, 16
6721 ; RV32I-NEXT:    ret
6723 ; RV64I-LABEL: fcvt_wu_s_i16:
6724 ; RV64I:       # %bb.0:
6725 ; RV64I-NEXT:    addi sp, sp, -16
6726 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6727 ; RV64I-NEXT:    slli a0, a0, 48
6728 ; RV64I-NEXT:    srli a0, a0, 48
6729 ; RV64I-NEXT:    call __extendhfsf2
6730 ; RV64I-NEXT:    call __fixunssfdi
6731 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6732 ; RV64I-NEXT:    addi sp, sp, 16
6733 ; RV64I-NEXT:    ret
6735 ; RV32ID-ILP32-LABEL: fcvt_wu_s_i16:
6736 ; RV32ID-ILP32:       # %bb.0:
6737 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
6738 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6739 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
6740 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
6741 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
6742 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6743 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
6744 ; RV32ID-ILP32-NEXT:    ret
6746 ; RV64ID-LP64-LABEL: fcvt_wu_s_i16:
6747 ; RV64ID-LP64:       # %bb.0:
6748 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
6749 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6750 ; RV64ID-LP64-NEXT:    call __extendhfsf2
6751 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
6752 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
6753 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6754 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
6755 ; RV64ID-LP64-NEXT:    ret
6757 ; RV32ID-LABEL: fcvt_wu_s_i16:
6758 ; RV32ID:       # %bb.0:
6759 ; RV32ID-NEXT:    addi sp, sp, -16
6760 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6761 ; RV32ID-NEXT:    call __extendhfsf2
6762 ; RV32ID-NEXT:    fcvt.wu.s a0, fa0, rtz
6763 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6764 ; RV32ID-NEXT:    addi sp, sp, 16
6765 ; RV32ID-NEXT:    ret
6767 ; RV64ID-LABEL: fcvt_wu_s_i16:
6768 ; RV64ID:       # %bb.0:
6769 ; RV64ID-NEXT:    addi sp, sp, -16
6770 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6771 ; RV64ID-NEXT:    call __extendhfsf2
6772 ; RV64ID-NEXT:    fcvt.lu.s a0, fa0, rtz
6773 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6774 ; RV64ID-NEXT:    addi sp, sp, 16
6775 ; RV64ID-NEXT:    ret
6777 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_i16:
6778 ; CHECK32-IZFHMIN:       # %bb.0:
6779 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
6780 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
6781 ; CHECK32-IZFHMIN-NEXT:    ret
6783 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_i16:
6784 ; CHECK64-IZFHMIN:       # %bb.0:
6785 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
6786 ; CHECK64-IZFHMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
6787 ; CHECK64-IZFHMIN-NEXT:    ret
6789 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_i16:
6790 ; CHECK32-IZHINXMIN:       # %bb.0:
6791 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
6792 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
6793 ; CHECK32-IZHINXMIN-NEXT:    ret
6795 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_i16:
6796 ; CHECK64-IZHINXMIN:       # %bb.0:
6797 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
6798 ; CHECK64-IZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
6799 ; CHECK64-IZHINXMIN-NEXT:    ret
6801 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i16:
6802 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
6803 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
6804 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
6805 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
6807 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i16:
6808 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
6809 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
6810 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
6811 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
6812   %1 = fptoui half %a to i16
6813   ret i16 %1
6816 define zeroext i16 @fcvt_wu_s_sat_i16(half %a) nounwind {
6817 ; RV32IZFH-LABEL: fcvt_wu_s_sat_i16:
6818 ; RV32IZFH:       # %bb.0: # %start
6819 ; RV32IZFH-NEXT:    lui a0, %hi(.LCPI34_0)
6820 ; RV32IZFH-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
6821 ; RV32IZFH-NEXT:    fcvt.s.h fa4, fa0
6822 ; RV32IZFH-NEXT:    fmv.w.x fa3, zero
6823 ; RV32IZFH-NEXT:    fmax.s fa4, fa4, fa3
6824 ; RV32IZFH-NEXT:    fmin.s fa5, fa4, fa5
6825 ; RV32IZFH-NEXT:    fcvt.wu.s a0, fa5, rtz
6826 ; RV32IZFH-NEXT:    ret
6828 ; RV64IZFH-LABEL: fcvt_wu_s_sat_i16:
6829 ; RV64IZFH:       # %bb.0: # %start
6830 ; RV64IZFH-NEXT:    lui a0, %hi(.LCPI34_0)
6831 ; RV64IZFH-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
6832 ; RV64IZFH-NEXT:    fcvt.s.h fa4, fa0
6833 ; RV64IZFH-NEXT:    fmv.w.x fa3, zero
6834 ; RV64IZFH-NEXT:    fmax.s fa4, fa4, fa3
6835 ; RV64IZFH-NEXT:    fmin.s fa5, fa4, fa5
6836 ; RV64IZFH-NEXT:    fcvt.lu.s a0, fa5, rtz
6837 ; RV64IZFH-NEXT:    ret
6839 ; RV32IDZFH-LABEL: fcvt_wu_s_sat_i16:
6840 ; RV32IDZFH:       # %bb.0: # %start
6841 ; RV32IDZFH-NEXT:    lui a0, %hi(.LCPI34_0)
6842 ; RV32IDZFH-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
6843 ; RV32IDZFH-NEXT:    fcvt.s.h fa4, fa0
6844 ; RV32IDZFH-NEXT:    fmv.w.x fa3, zero
6845 ; RV32IDZFH-NEXT:    fmax.s fa4, fa4, fa3
6846 ; RV32IDZFH-NEXT:    fmin.s fa5, fa4, fa5
6847 ; RV32IDZFH-NEXT:    fcvt.wu.s a0, fa5, rtz
6848 ; RV32IDZFH-NEXT:    ret
6850 ; RV64IDZFH-LABEL: fcvt_wu_s_sat_i16:
6851 ; RV64IDZFH:       # %bb.0: # %start
6852 ; RV64IDZFH-NEXT:    lui a0, %hi(.LCPI34_0)
6853 ; RV64IDZFH-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
6854 ; RV64IDZFH-NEXT:    fcvt.s.h fa4, fa0
6855 ; RV64IDZFH-NEXT:    fmv.w.x fa3, zero
6856 ; RV64IDZFH-NEXT:    fmax.s fa4, fa4, fa3
6857 ; RV64IDZFH-NEXT:    fmin.s fa5, fa4, fa5
6858 ; RV64IDZFH-NEXT:    fcvt.lu.s a0, fa5, rtz
6859 ; RV64IDZFH-NEXT:    ret
6861 ; RV32IZHINX-LABEL: fcvt_wu_s_sat_i16:
6862 ; RV32IZHINX:       # %bb.0: # %start
6863 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
6864 ; RV32IZHINX-NEXT:    lui a1, 292864
6865 ; RV32IZHINX-NEXT:    fmax.s a0, a0, zero
6866 ; RV32IZHINX-NEXT:    addi a1, a1, -256
6867 ; RV32IZHINX-NEXT:    fmin.s a0, a0, a1
6868 ; RV32IZHINX-NEXT:    fcvt.wu.s a0, a0, rtz
6869 ; RV32IZHINX-NEXT:    ret
6871 ; RV64IZHINX-LABEL: fcvt_wu_s_sat_i16:
6872 ; RV64IZHINX:       # %bb.0: # %start
6873 ; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
6874 ; RV64IZHINX-NEXT:    lui a1, 292864
6875 ; RV64IZHINX-NEXT:    fmax.s a0, a0, zero
6876 ; RV64IZHINX-NEXT:    addiw a1, a1, -256
6877 ; RV64IZHINX-NEXT:    fmin.s a0, a0, a1
6878 ; RV64IZHINX-NEXT:    fcvt.lu.s a0, a0, rtz
6879 ; RV64IZHINX-NEXT:    ret
6881 ; RV32IZDINXZHINX-LABEL: fcvt_wu_s_sat_i16:
6882 ; RV32IZDINXZHINX:       # %bb.0: # %start
6883 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
6884 ; RV32IZDINXZHINX-NEXT:    lui a1, 292864
6885 ; RV32IZDINXZHINX-NEXT:    fmax.s a0, a0, zero
6886 ; RV32IZDINXZHINX-NEXT:    addi a1, a1, -256
6887 ; RV32IZDINXZHINX-NEXT:    fmin.s a0, a0, a1
6888 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.s a0, a0, rtz
6889 ; RV32IZDINXZHINX-NEXT:    ret
6891 ; RV64IZDINXZHINX-LABEL: fcvt_wu_s_sat_i16:
6892 ; RV64IZDINXZHINX:       # %bb.0: # %start
6893 ; RV64IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
6894 ; RV64IZDINXZHINX-NEXT:    lui a1, 292864
6895 ; RV64IZDINXZHINX-NEXT:    fmax.s a0, a0, zero
6896 ; RV64IZDINXZHINX-NEXT:    addiw a1, a1, -256
6897 ; RV64IZDINXZHINX-NEXT:    fmin.s a0, a0, a1
6898 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.s a0, a0, rtz
6899 ; RV64IZDINXZHINX-NEXT:    ret
6901 ; RV32I-LABEL: fcvt_wu_s_sat_i16:
6902 ; RV32I:       # %bb.0: # %start
6903 ; RV32I-NEXT:    addi sp, sp, -32
6904 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6905 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6906 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6907 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6908 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
6909 ; RV32I-NEXT:    lui s3, 16
6910 ; RV32I-NEXT:    addi s3, s3, -1
6911 ; RV32I-NEXT:    and a0, a0, s3
6912 ; RV32I-NEXT:    call __extendhfsf2
6913 ; RV32I-NEXT:    mv s2, a0
6914 ; RV32I-NEXT:    call __fixunssfsi
6915 ; RV32I-NEXT:    mv s0, a0
6916 ; RV32I-NEXT:    mv a0, s2
6917 ; RV32I-NEXT:    li a1, 0
6918 ; RV32I-NEXT:    call __gesf2
6919 ; RV32I-NEXT:    mv s1, a0
6920 ; RV32I-NEXT:    lui a0, 292864
6921 ; RV32I-NEXT:    addi a1, a0, -256
6922 ; RV32I-NEXT:    mv a0, s2
6923 ; RV32I-NEXT:    call __gtsf2
6924 ; RV32I-NEXT:    blez a0, .LBB34_2
6925 ; RV32I-NEXT:  # %bb.1: # %start
6926 ; RV32I-NEXT:    mv a0, s3
6927 ; RV32I-NEXT:    j .LBB34_3
6928 ; RV32I-NEXT:  .LBB34_2:
6929 ; RV32I-NEXT:    slti a0, s1, 0
6930 ; RV32I-NEXT:    addi a0, a0, -1
6931 ; RV32I-NEXT:    and a0, a0, s0
6932 ; RV32I-NEXT:  .LBB34_3: # %start
6933 ; RV32I-NEXT:    and a0, a0, s3
6934 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
6935 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
6936 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
6937 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
6938 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
6939 ; RV32I-NEXT:    addi sp, sp, 32
6940 ; RV32I-NEXT:    ret
6942 ; RV64I-LABEL: fcvt_wu_s_sat_i16:
6943 ; RV64I:       # %bb.0: # %start
6944 ; RV64I-NEXT:    addi sp, sp, -48
6945 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
6946 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
6947 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
6948 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
6949 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
6950 ; RV64I-NEXT:    lui s3, 16
6951 ; RV64I-NEXT:    addiw s3, s3, -1
6952 ; RV64I-NEXT:    and a0, a0, s3
6953 ; RV64I-NEXT:    call __extendhfsf2
6954 ; RV64I-NEXT:    mv s2, a0
6955 ; RV64I-NEXT:    call __fixunssfdi
6956 ; RV64I-NEXT:    mv s0, a0
6957 ; RV64I-NEXT:    mv a0, s2
6958 ; RV64I-NEXT:    li a1, 0
6959 ; RV64I-NEXT:    call __gesf2
6960 ; RV64I-NEXT:    mv s1, a0
6961 ; RV64I-NEXT:    lui a0, 292864
6962 ; RV64I-NEXT:    addiw a1, a0, -256
6963 ; RV64I-NEXT:    mv a0, s2
6964 ; RV64I-NEXT:    call __gtsf2
6965 ; RV64I-NEXT:    blez a0, .LBB34_2
6966 ; RV64I-NEXT:  # %bb.1: # %start
6967 ; RV64I-NEXT:    mv a0, s3
6968 ; RV64I-NEXT:    j .LBB34_3
6969 ; RV64I-NEXT:  .LBB34_2:
6970 ; RV64I-NEXT:    slti a0, s1, 0
6971 ; RV64I-NEXT:    addi a0, a0, -1
6972 ; RV64I-NEXT:    and a0, a0, s0
6973 ; RV64I-NEXT:  .LBB34_3: # %start
6974 ; RV64I-NEXT:    and a0, a0, s3
6975 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
6976 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
6977 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
6978 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
6979 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
6980 ; RV64I-NEXT:    addi sp, sp, 48
6981 ; RV64I-NEXT:    ret
6983 ; RV32ID-ILP32-LABEL: fcvt_wu_s_sat_i16:
6984 ; RV32ID-ILP32:       # %bb.0: # %start
6985 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
6986 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6987 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
6988 ; RV32ID-ILP32-NEXT:    lui a1, %hi(.LCPI34_0)
6989 ; RV32ID-ILP32-NEXT:    flw fa5, %lo(.LCPI34_0)(a1)
6990 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
6991 ; RV32ID-ILP32-NEXT:    fmv.w.x fa3, zero
6992 ; RV32ID-ILP32-NEXT:    fmax.s fa4, fa4, fa3
6993 ; RV32ID-ILP32-NEXT:    fmin.s fa5, fa4, fa5
6994 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
6995 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6996 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
6997 ; RV32ID-ILP32-NEXT:    ret
6999 ; RV64ID-LP64-LABEL: fcvt_wu_s_sat_i16:
7000 ; RV64ID-LP64:       # %bb.0: # %start
7001 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
7002 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7003 ; RV64ID-LP64-NEXT:    call __extendhfsf2
7004 ; RV64ID-LP64-NEXT:    lui a1, %hi(.LCPI34_0)
7005 ; RV64ID-LP64-NEXT:    flw fa5, %lo(.LCPI34_0)(a1)
7006 ; RV64ID-LP64-NEXT:    fmv.w.x fa4, a0
7007 ; RV64ID-LP64-NEXT:    fmv.w.x fa3, zero
7008 ; RV64ID-LP64-NEXT:    fmax.s fa4, fa4, fa3
7009 ; RV64ID-LP64-NEXT:    fmin.s fa5, fa4, fa5
7010 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
7011 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7012 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
7013 ; RV64ID-LP64-NEXT:    ret
7015 ; RV32ID-LABEL: fcvt_wu_s_sat_i16:
7016 ; RV32ID:       # %bb.0: # %start
7017 ; RV32ID-NEXT:    addi sp, sp, -16
7018 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7019 ; RV32ID-NEXT:    call __extendhfsf2
7020 ; RV32ID-NEXT:    lui a0, %hi(.LCPI34_0)
7021 ; RV32ID-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
7022 ; RV32ID-NEXT:    fmv.w.x fa4, zero
7023 ; RV32ID-NEXT:    fmax.s fa4, fa0, fa4
7024 ; RV32ID-NEXT:    fmin.s fa5, fa4, fa5
7025 ; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
7026 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7027 ; RV32ID-NEXT:    addi sp, sp, 16
7028 ; RV32ID-NEXT:    ret
7030 ; RV64ID-LABEL: fcvt_wu_s_sat_i16:
7031 ; RV64ID:       # %bb.0: # %start
7032 ; RV64ID-NEXT:    addi sp, sp, -16
7033 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7034 ; RV64ID-NEXT:    call __extendhfsf2
7035 ; RV64ID-NEXT:    lui a0, %hi(.LCPI34_0)
7036 ; RV64ID-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
7037 ; RV64ID-NEXT:    fmv.w.x fa4, zero
7038 ; RV64ID-NEXT:    fmax.s fa4, fa0, fa4
7039 ; RV64ID-NEXT:    fmin.s fa5, fa4, fa5
7040 ; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
7041 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7042 ; RV64ID-NEXT:    addi sp, sp, 16
7043 ; RV64ID-NEXT:    ret
7045 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_sat_i16:
7046 ; CHECK32-IZFHMIN:       # %bb.0: # %start
7047 ; CHECK32-IZFHMIN-NEXT:    lui a0, %hi(.LCPI34_0)
7048 ; CHECK32-IZFHMIN-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
7049 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa4, fa0
7050 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa3, zero
7051 ; CHECK32-IZFHMIN-NEXT:    fmax.s fa4, fa4, fa3
7052 ; CHECK32-IZFHMIN-NEXT:    fmin.s fa5, fa4, fa5
7053 ; CHECK32-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
7054 ; CHECK32-IZFHMIN-NEXT:    ret
7056 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_sat_i16:
7057 ; CHECK64-IZFHMIN:       # %bb.0: # %start
7058 ; CHECK64-IZFHMIN-NEXT:    lui a0, %hi(.LCPI34_0)
7059 ; CHECK64-IZFHMIN-NEXT:    flw fa5, %lo(.LCPI34_0)(a0)
7060 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa4, fa0
7061 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa3, zero
7062 ; CHECK64-IZFHMIN-NEXT:    fmax.s fa4, fa4, fa3
7063 ; CHECK64-IZFHMIN-NEXT:    fmin.s fa5, fa4, fa5
7064 ; CHECK64-IZFHMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
7065 ; CHECK64-IZFHMIN-NEXT:    ret
7067 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_sat_i16:
7068 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
7069 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7070 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 292864
7071 ; CHECK32-IZHINXMIN-NEXT:    fmax.s a0, a0, zero
7072 ; CHECK32-IZHINXMIN-NEXT:    addi a1, a1, -256
7073 ; CHECK32-IZHINXMIN-NEXT:    fmin.s a0, a0, a1
7074 ; CHECK32-IZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
7075 ; CHECK32-IZHINXMIN-NEXT:    ret
7077 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_sat_i16:
7078 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
7079 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7080 ; CHECK64-IZHINXMIN-NEXT:    lui a1, 292864
7081 ; CHECK64-IZHINXMIN-NEXT:    fmax.s a0, a0, zero
7082 ; CHECK64-IZHINXMIN-NEXT:    addiw a1, a1, -256
7083 ; CHECK64-IZHINXMIN-NEXT:    fmin.s a0, a0, a1
7084 ; CHECK64-IZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
7085 ; CHECK64-IZHINXMIN-NEXT:    ret
7087 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i16:
7088 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
7089 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7090 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 292864
7091 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmax.s a0, a0, zero
7092 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a1, a1, -256
7093 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmin.s a0, a0, a1
7094 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
7095 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
7097 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i16:
7098 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
7099 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7100 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a1, 292864
7101 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmax.s a0, a0, zero
7102 ; CHECK64-IZDINXZHINXMIN-NEXT:    addiw a1, a1, -256
7103 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmin.s a0, a0, a1
7104 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
7105 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
7106 start:
7107   %0 = tail call i16 @llvm.fptoui.sat.i16.f16(half %a)
7108   ret i16 %0
7111 define signext i8 @fcvt_w_s_i8(half %a) nounwind {
7112 ; RV32IZFH-LABEL: fcvt_w_s_i8:
7113 ; RV32IZFH:       # %bb.0:
7114 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rtz
7115 ; RV32IZFH-NEXT:    ret
7117 ; RV64IZFH-LABEL: fcvt_w_s_i8:
7118 ; RV64IZFH:       # %bb.0:
7119 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
7120 ; RV64IZFH-NEXT:    ret
7122 ; RV32IDZFH-LABEL: fcvt_w_s_i8:
7123 ; RV32IDZFH:       # %bb.0:
7124 ; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
7125 ; RV32IDZFH-NEXT:    ret
7127 ; RV64IDZFH-LABEL: fcvt_w_s_i8:
7128 ; RV64IDZFH:       # %bb.0:
7129 ; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
7130 ; RV64IDZFH-NEXT:    ret
7132 ; RV32IZHINX-LABEL: fcvt_w_s_i8:
7133 ; RV32IZHINX:       # %bb.0:
7134 ; RV32IZHINX-NEXT:    fcvt.w.h a0, a0, rtz
7135 ; RV32IZHINX-NEXT:    ret
7137 ; RV64IZHINX-LABEL: fcvt_w_s_i8:
7138 ; RV64IZHINX:       # %bb.0:
7139 ; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
7140 ; RV64IZHINX-NEXT:    ret
7142 ; RV32IZDINXZHINX-LABEL: fcvt_w_s_i8:
7143 ; RV32IZDINXZHINX:       # %bb.0:
7144 ; RV32IZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
7145 ; RV32IZDINXZHINX-NEXT:    ret
7147 ; RV64IZDINXZHINX-LABEL: fcvt_w_s_i8:
7148 ; RV64IZDINXZHINX:       # %bb.0:
7149 ; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
7150 ; RV64IZDINXZHINX-NEXT:    ret
7152 ; RV32I-LABEL: fcvt_w_s_i8:
7153 ; RV32I:       # %bb.0:
7154 ; RV32I-NEXT:    addi sp, sp, -16
7155 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7156 ; RV32I-NEXT:    slli a0, a0, 16
7157 ; RV32I-NEXT:    srli a0, a0, 16
7158 ; RV32I-NEXT:    call __extendhfsf2
7159 ; RV32I-NEXT:    call __fixsfsi
7160 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7161 ; RV32I-NEXT:    addi sp, sp, 16
7162 ; RV32I-NEXT:    ret
7164 ; RV64I-LABEL: fcvt_w_s_i8:
7165 ; RV64I:       # %bb.0:
7166 ; RV64I-NEXT:    addi sp, sp, -16
7167 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7168 ; RV64I-NEXT:    slli a0, a0, 48
7169 ; RV64I-NEXT:    srli a0, a0, 48
7170 ; RV64I-NEXT:    call __extendhfsf2
7171 ; RV64I-NEXT:    call __fixsfdi
7172 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7173 ; RV64I-NEXT:    addi sp, sp, 16
7174 ; RV64I-NEXT:    ret
7176 ; RV32ID-ILP32-LABEL: fcvt_w_s_i8:
7177 ; RV32ID-ILP32:       # %bb.0:
7178 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
7179 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7180 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
7181 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
7182 ; RV32ID-ILP32-NEXT:    fcvt.w.s a0, fa5, rtz
7183 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7184 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
7185 ; RV32ID-ILP32-NEXT:    ret
7187 ; RV64ID-LP64-LABEL: fcvt_w_s_i8:
7188 ; RV64ID-LP64:       # %bb.0:
7189 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
7190 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7191 ; RV64ID-LP64-NEXT:    call __extendhfsf2
7192 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
7193 ; RV64ID-LP64-NEXT:    fcvt.l.s a0, fa5, rtz
7194 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7195 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
7196 ; RV64ID-LP64-NEXT:    ret
7198 ; RV32ID-LABEL: fcvt_w_s_i8:
7199 ; RV32ID:       # %bb.0:
7200 ; RV32ID-NEXT:    addi sp, sp, -16
7201 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7202 ; RV32ID-NEXT:    call __extendhfsf2
7203 ; RV32ID-NEXT:    fcvt.w.s a0, fa0, rtz
7204 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7205 ; RV32ID-NEXT:    addi sp, sp, 16
7206 ; RV32ID-NEXT:    ret
7208 ; RV64ID-LABEL: fcvt_w_s_i8:
7209 ; RV64ID:       # %bb.0:
7210 ; RV64ID-NEXT:    addi sp, sp, -16
7211 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7212 ; RV64ID-NEXT:    call __extendhfsf2
7213 ; RV64ID-NEXT:    fcvt.l.s a0, fa0, rtz
7214 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7215 ; RV64ID-NEXT:    addi sp, sp, 16
7216 ; RV64ID-NEXT:    ret
7218 ; CHECK32-IZFHMIN-LABEL: fcvt_w_s_i8:
7219 ; CHECK32-IZFHMIN:       # %bb.0:
7220 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7221 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
7222 ; CHECK32-IZFHMIN-NEXT:    ret
7224 ; CHECK64-IZFHMIN-LABEL: fcvt_w_s_i8:
7225 ; CHECK64-IZFHMIN:       # %bb.0:
7226 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7227 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a0, fa5, rtz
7228 ; CHECK64-IZFHMIN-NEXT:    ret
7230 ; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_i8:
7231 ; CHECK32-IZHINXMIN:       # %bb.0:
7232 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7233 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
7234 ; CHECK32-IZHINXMIN-NEXT:    ret
7236 ; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_i8:
7237 ; CHECK64-IZHINXMIN:       # %bb.0:
7238 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7239 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
7240 ; CHECK64-IZHINXMIN-NEXT:    ret
7242 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_i8:
7243 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
7244 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7245 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
7246 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
7248 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_i8:
7249 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
7250 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7251 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a0, a0, rtz
7252 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
7253   %1 = fptosi half %a to i8
7254   ret i8 %1
7257 define signext i8 @fcvt_w_s_sat_i8(half %a) nounwind {
7258 ; RV32IZFH-LABEL: fcvt_w_s_sat_i8:
7259 ; RV32IZFH:       # %bb.0: # %start
7260 ; RV32IZFH-NEXT:    fcvt.s.h fa5, fa0
7261 ; RV32IZFH-NEXT:    lui a0, 798720
7262 ; RV32IZFH-NEXT:    lui a1, 274400
7263 ; RV32IZFH-NEXT:    fmv.w.x fa4, a0
7264 ; RV32IZFH-NEXT:    feq.s a0, fa5, fa5
7265 ; RV32IZFH-NEXT:    neg a0, a0
7266 ; RV32IZFH-NEXT:    fmax.s fa5, fa5, fa4
7267 ; RV32IZFH-NEXT:    fmv.w.x fa4, a1
7268 ; RV32IZFH-NEXT:    fmin.s fa5, fa5, fa4
7269 ; RV32IZFH-NEXT:    fcvt.w.s a1, fa5, rtz
7270 ; RV32IZFH-NEXT:    and a0, a0, a1
7271 ; RV32IZFH-NEXT:    ret
7273 ; RV64IZFH-LABEL: fcvt_w_s_sat_i8:
7274 ; RV64IZFH:       # %bb.0: # %start
7275 ; RV64IZFH-NEXT:    fcvt.s.h fa5, fa0
7276 ; RV64IZFH-NEXT:    lui a0, 798720
7277 ; RV64IZFH-NEXT:    lui a1, 274400
7278 ; RV64IZFH-NEXT:    fmv.w.x fa4, a0
7279 ; RV64IZFH-NEXT:    feq.s a0, fa5, fa5
7280 ; RV64IZFH-NEXT:    neg a0, a0
7281 ; RV64IZFH-NEXT:    fmax.s fa5, fa5, fa4
7282 ; RV64IZFH-NEXT:    fmv.w.x fa4, a1
7283 ; RV64IZFH-NEXT:    fmin.s fa5, fa5, fa4
7284 ; RV64IZFH-NEXT:    fcvt.l.s a1, fa5, rtz
7285 ; RV64IZFH-NEXT:    and a0, a0, a1
7286 ; RV64IZFH-NEXT:    ret
7288 ; RV32IDZFH-LABEL: fcvt_w_s_sat_i8:
7289 ; RV32IDZFH:       # %bb.0: # %start
7290 ; RV32IDZFH-NEXT:    fcvt.s.h fa5, fa0
7291 ; RV32IDZFH-NEXT:    lui a0, 798720
7292 ; RV32IDZFH-NEXT:    lui a1, 274400
7293 ; RV32IDZFH-NEXT:    fmv.w.x fa4, a0
7294 ; RV32IDZFH-NEXT:    feq.s a0, fa5, fa5
7295 ; RV32IDZFH-NEXT:    neg a0, a0
7296 ; RV32IDZFH-NEXT:    fmax.s fa5, fa5, fa4
7297 ; RV32IDZFH-NEXT:    fmv.w.x fa4, a1
7298 ; RV32IDZFH-NEXT:    fmin.s fa5, fa5, fa4
7299 ; RV32IDZFH-NEXT:    fcvt.w.s a1, fa5, rtz
7300 ; RV32IDZFH-NEXT:    and a0, a0, a1
7301 ; RV32IDZFH-NEXT:    ret
7303 ; RV64IDZFH-LABEL: fcvt_w_s_sat_i8:
7304 ; RV64IDZFH:       # %bb.0: # %start
7305 ; RV64IDZFH-NEXT:    fcvt.s.h fa5, fa0
7306 ; RV64IDZFH-NEXT:    lui a0, 798720
7307 ; RV64IDZFH-NEXT:    lui a1, 274400
7308 ; RV64IDZFH-NEXT:    fmv.w.x fa4, a0
7309 ; RV64IDZFH-NEXT:    feq.s a0, fa5, fa5
7310 ; RV64IDZFH-NEXT:    neg a0, a0
7311 ; RV64IDZFH-NEXT:    fmax.s fa5, fa5, fa4
7312 ; RV64IDZFH-NEXT:    fmv.w.x fa4, a1
7313 ; RV64IDZFH-NEXT:    fmin.s fa5, fa5, fa4
7314 ; RV64IDZFH-NEXT:    fcvt.l.s a1, fa5, rtz
7315 ; RV64IDZFH-NEXT:    and a0, a0, a1
7316 ; RV64IDZFH-NEXT:    ret
7318 ; RV32IZHINX-LABEL: fcvt_w_s_sat_i8:
7319 ; RV32IZHINX:       # %bb.0: # %start
7320 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
7321 ; RV32IZHINX-NEXT:    lui a1, 798720
7322 ; RV32IZHINX-NEXT:    lui a2, 274400
7323 ; RV32IZHINX-NEXT:    fmax.s a1, a0, a1
7324 ; RV32IZHINX-NEXT:    feq.s a0, a0, a0
7325 ; RV32IZHINX-NEXT:    neg a0, a0
7326 ; RV32IZHINX-NEXT:    fmin.s a1, a1, a2
7327 ; RV32IZHINX-NEXT:    fcvt.w.s a1, a1, rtz
7328 ; RV32IZHINX-NEXT:    and a0, a0, a1
7329 ; RV32IZHINX-NEXT:    ret
7331 ; RV64IZHINX-LABEL: fcvt_w_s_sat_i8:
7332 ; RV64IZHINX:       # %bb.0: # %start
7333 ; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
7334 ; RV64IZHINX-NEXT:    lui a1, 798720
7335 ; RV64IZHINX-NEXT:    lui a2, 274400
7336 ; RV64IZHINX-NEXT:    fmax.s a1, a0, a1
7337 ; RV64IZHINX-NEXT:    feq.s a0, a0, a0
7338 ; RV64IZHINX-NEXT:    neg a0, a0
7339 ; RV64IZHINX-NEXT:    fmin.s a1, a1, a2
7340 ; RV64IZHINX-NEXT:    fcvt.l.s a1, a1, rtz
7341 ; RV64IZHINX-NEXT:    and a0, a0, a1
7342 ; RV64IZHINX-NEXT:    ret
7344 ; RV32IZDINXZHINX-LABEL: fcvt_w_s_sat_i8:
7345 ; RV32IZDINXZHINX:       # %bb.0: # %start
7346 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
7347 ; RV32IZDINXZHINX-NEXT:    lui a1, 798720
7348 ; RV32IZDINXZHINX-NEXT:    lui a2, 274400
7349 ; RV32IZDINXZHINX-NEXT:    fmax.s a1, a0, a1
7350 ; RV32IZDINXZHINX-NEXT:    feq.s a0, a0, a0
7351 ; RV32IZDINXZHINX-NEXT:    neg a0, a0
7352 ; RV32IZDINXZHINX-NEXT:    fmin.s a1, a1, a2
7353 ; RV32IZDINXZHINX-NEXT:    fcvt.w.s a1, a1, rtz
7354 ; RV32IZDINXZHINX-NEXT:    and a0, a0, a1
7355 ; RV32IZDINXZHINX-NEXT:    ret
7357 ; RV64IZDINXZHINX-LABEL: fcvt_w_s_sat_i8:
7358 ; RV64IZDINXZHINX:       # %bb.0: # %start
7359 ; RV64IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
7360 ; RV64IZDINXZHINX-NEXT:    lui a1, 798720
7361 ; RV64IZDINXZHINX-NEXT:    lui a2, 274400
7362 ; RV64IZDINXZHINX-NEXT:    fmax.s a1, a0, a1
7363 ; RV64IZDINXZHINX-NEXT:    feq.s a0, a0, a0
7364 ; RV64IZDINXZHINX-NEXT:    neg a0, a0
7365 ; RV64IZDINXZHINX-NEXT:    fmin.s a1, a1, a2
7366 ; RV64IZDINXZHINX-NEXT:    fcvt.l.s a1, a1, rtz
7367 ; RV64IZDINXZHINX-NEXT:    and a0, a0, a1
7368 ; RV64IZDINXZHINX-NEXT:    ret
7370 ; RV32I-LABEL: fcvt_w_s_sat_i8:
7371 ; RV32I:       # %bb.0: # %start
7372 ; RV32I-NEXT:    addi sp, sp, -16
7373 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7374 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
7375 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
7376 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
7377 ; RV32I-NEXT:    slli a0, a0, 16
7378 ; RV32I-NEXT:    srli a0, a0, 16
7379 ; RV32I-NEXT:    call __extendhfsf2
7380 ; RV32I-NEXT:    mv s0, a0
7381 ; RV32I-NEXT:    lui a1, 798720
7382 ; RV32I-NEXT:    call __gesf2
7383 ; RV32I-NEXT:    mv s2, a0
7384 ; RV32I-NEXT:    mv a0, s0
7385 ; RV32I-NEXT:    call __fixsfsi
7386 ; RV32I-NEXT:    mv s1, a0
7387 ; RV32I-NEXT:    bgez s2, .LBB36_2
7388 ; RV32I-NEXT:  # %bb.1: # %start
7389 ; RV32I-NEXT:    li s1, -128
7390 ; RV32I-NEXT:  .LBB36_2: # %start
7391 ; RV32I-NEXT:    lui a1, 274400
7392 ; RV32I-NEXT:    mv a0, s0
7393 ; RV32I-NEXT:    call __gtsf2
7394 ; RV32I-NEXT:    blez a0, .LBB36_4
7395 ; RV32I-NEXT:  # %bb.3: # %start
7396 ; RV32I-NEXT:    li s1, 127
7397 ; RV32I-NEXT:  .LBB36_4: # %start
7398 ; RV32I-NEXT:    mv a0, s0
7399 ; RV32I-NEXT:    mv a1, s0
7400 ; RV32I-NEXT:    call __unordsf2
7401 ; RV32I-NEXT:    snez a0, a0
7402 ; RV32I-NEXT:    addi a0, a0, -1
7403 ; RV32I-NEXT:    and a0, a0, s1
7404 ; RV32I-NEXT:    slli a0, a0, 24
7405 ; RV32I-NEXT:    srai a0, a0, 24
7406 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7407 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
7408 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
7409 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
7410 ; RV32I-NEXT:    addi sp, sp, 16
7411 ; RV32I-NEXT:    ret
7413 ; RV64I-LABEL: fcvt_w_s_sat_i8:
7414 ; RV64I:       # %bb.0: # %start
7415 ; RV64I-NEXT:    addi sp, sp, -32
7416 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
7417 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
7418 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
7419 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
7420 ; RV64I-NEXT:    slli a0, a0, 48
7421 ; RV64I-NEXT:    srli a0, a0, 48
7422 ; RV64I-NEXT:    call __extendhfsf2
7423 ; RV64I-NEXT:    mv s0, a0
7424 ; RV64I-NEXT:    lui a1, 798720
7425 ; RV64I-NEXT:    call __gesf2
7426 ; RV64I-NEXT:    mv s2, a0
7427 ; RV64I-NEXT:    mv a0, s0
7428 ; RV64I-NEXT:    call __fixsfdi
7429 ; RV64I-NEXT:    mv s1, a0
7430 ; RV64I-NEXT:    bgez s2, .LBB36_2
7431 ; RV64I-NEXT:  # %bb.1: # %start
7432 ; RV64I-NEXT:    li s1, -128
7433 ; RV64I-NEXT:  .LBB36_2: # %start
7434 ; RV64I-NEXT:    lui a1, 274400
7435 ; RV64I-NEXT:    mv a0, s0
7436 ; RV64I-NEXT:    call __gtsf2
7437 ; RV64I-NEXT:    blez a0, .LBB36_4
7438 ; RV64I-NEXT:  # %bb.3: # %start
7439 ; RV64I-NEXT:    li s1, 127
7440 ; RV64I-NEXT:  .LBB36_4: # %start
7441 ; RV64I-NEXT:    mv a0, s0
7442 ; RV64I-NEXT:    mv a1, s0
7443 ; RV64I-NEXT:    call __unordsf2
7444 ; RV64I-NEXT:    snez a0, a0
7445 ; RV64I-NEXT:    addi a0, a0, -1
7446 ; RV64I-NEXT:    and a0, a0, s1
7447 ; RV64I-NEXT:    slli a0, a0, 56
7448 ; RV64I-NEXT:    srai a0, a0, 56
7449 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
7450 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
7451 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
7452 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
7453 ; RV64I-NEXT:    addi sp, sp, 32
7454 ; RV64I-NEXT:    ret
7456 ; RV32ID-ILP32-LABEL: fcvt_w_s_sat_i8:
7457 ; RV32ID-ILP32:       # %bb.0: # %start
7458 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
7459 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7460 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
7461 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
7462 ; RV32ID-ILP32-NEXT:    lui a0, 798720
7463 ; RV32ID-ILP32-NEXT:    lui a1, 274400
7464 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
7465 ; RV32ID-ILP32-NEXT:    feq.s a0, fa5, fa5
7466 ; RV32ID-ILP32-NEXT:    neg a0, a0
7467 ; RV32ID-ILP32-NEXT:    fmax.s fa5, fa5, fa4
7468 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a1
7469 ; RV32ID-ILP32-NEXT:    fmin.s fa5, fa5, fa4
7470 ; RV32ID-ILP32-NEXT:    fcvt.w.s a1, fa5, rtz
7471 ; RV32ID-ILP32-NEXT:    and a0, a0, a1
7472 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7473 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
7474 ; RV32ID-ILP32-NEXT:    ret
7476 ; RV64ID-LP64-LABEL: fcvt_w_s_sat_i8:
7477 ; RV64ID-LP64:       # %bb.0: # %start
7478 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
7479 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7480 ; RV64ID-LP64-NEXT:    call __extendhfsf2
7481 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
7482 ; RV64ID-LP64-NEXT:    lui a0, 798720
7483 ; RV64ID-LP64-NEXT:    lui a1, 274400
7484 ; RV64ID-LP64-NEXT:    fmv.w.x fa4, a0
7485 ; RV64ID-LP64-NEXT:    feq.s a0, fa5, fa5
7486 ; RV64ID-LP64-NEXT:    neg a0, a0
7487 ; RV64ID-LP64-NEXT:    fmax.s fa5, fa5, fa4
7488 ; RV64ID-LP64-NEXT:    fmv.w.x fa4, a1
7489 ; RV64ID-LP64-NEXT:    fmin.s fa5, fa5, fa4
7490 ; RV64ID-LP64-NEXT:    fcvt.l.s a1, fa5, rtz
7491 ; RV64ID-LP64-NEXT:    and a0, a0, a1
7492 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7493 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
7494 ; RV64ID-LP64-NEXT:    ret
7496 ; RV32ID-LABEL: fcvt_w_s_sat_i8:
7497 ; RV32ID:       # %bb.0: # %start
7498 ; RV32ID-NEXT:    addi sp, sp, -16
7499 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7500 ; RV32ID-NEXT:    call __extendhfsf2
7501 ; RV32ID-NEXT:    feq.s a0, fa0, fa0
7502 ; RV32ID-NEXT:    lui a1, 798720
7503 ; RV32ID-NEXT:    fmv.w.x fa5, a1
7504 ; RV32ID-NEXT:    lui a1, 274400
7505 ; RV32ID-NEXT:    neg a0, a0
7506 ; RV32ID-NEXT:    fmax.s fa5, fa0, fa5
7507 ; RV32ID-NEXT:    fmv.w.x fa4, a1
7508 ; RV32ID-NEXT:    fmin.s fa5, fa5, fa4
7509 ; RV32ID-NEXT:    fcvt.w.s a1, fa5, rtz
7510 ; RV32ID-NEXT:    and a0, a0, a1
7511 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7512 ; RV32ID-NEXT:    addi sp, sp, 16
7513 ; RV32ID-NEXT:    ret
7515 ; RV64ID-LABEL: fcvt_w_s_sat_i8:
7516 ; RV64ID:       # %bb.0: # %start
7517 ; RV64ID-NEXT:    addi sp, sp, -16
7518 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7519 ; RV64ID-NEXT:    call __extendhfsf2
7520 ; RV64ID-NEXT:    feq.s a0, fa0, fa0
7521 ; RV64ID-NEXT:    lui a1, 798720
7522 ; RV64ID-NEXT:    fmv.w.x fa5, a1
7523 ; RV64ID-NEXT:    lui a1, 274400
7524 ; RV64ID-NEXT:    neg a0, a0
7525 ; RV64ID-NEXT:    fmax.s fa5, fa0, fa5
7526 ; RV64ID-NEXT:    fmv.w.x fa4, a1
7527 ; RV64ID-NEXT:    fmin.s fa5, fa5, fa4
7528 ; RV64ID-NEXT:    fcvt.l.s a1, fa5, rtz
7529 ; RV64ID-NEXT:    and a0, a0, a1
7530 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7531 ; RV64ID-NEXT:    addi sp, sp, 16
7532 ; RV64ID-NEXT:    ret
7534 ; CHECK32-IZFHMIN-LABEL: fcvt_w_s_sat_i8:
7535 ; CHECK32-IZFHMIN:       # %bb.0: # %start
7536 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7537 ; CHECK32-IZFHMIN-NEXT:    lui a0, 798720
7538 ; CHECK32-IZFHMIN-NEXT:    lui a1, 274400
7539 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa4, a0
7540 ; CHECK32-IZFHMIN-NEXT:    feq.s a0, fa5, fa5
7541 ; CHECK32-IZFHMIN-NEXT:    neg a0, a0
7542 ; CHECK32-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa4
7543 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa4, a1
7544 ; CHECK32-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
7545 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a1, fa5, rtz
7546 ; CHECK32-IZFHMIN-NEXT:    and a0, a0, a1
7547 ; CHECK32-IZFHMIN-NEXT:    ret
7549 ; CHECK64-IZFHMIN-LABEL: fcvt_w_s_sat_i8:
7550 ; CHECK64-IZFHMIN:       # %bb.0: # %start
7551 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7552 ; CHECK64-IZFHMIN-NEXT:    lui a0, 798720
7553 ; CHECK64-IZFHMIN-NEXT:    lui a1, 274400
7554 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa4, a0
7555 ; CHECK64-IZFHMIN-NEXT:    feq.s a0, fa5, fa5
7556 ; CHECK64-IZFHMIN-NEXT:    neg a0, a0
7557 ; CHECK64-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa4
7558 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa4, a1
7559 ; CHECK64-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
7560 ; CHECK64-IZFHMIN-NEXT:    fcvt.l.s a1, fa5, rtz
7561 ; CHECK64-IZFHMIN-NEXT:    and a0, a0, a1
7562 ; CHECK64-IZFHMIN-NEXT:    ret
7564 ; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_sat_i8:
7565 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
7566 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7567 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 798720
7568 ; CHECK32-IZHINXMIN-NEXT:    lui a2, 274400
7569 ; CHECK32-IZHINXMIN-NEXT:    fmax.s a1, a0, a1
7570 ; CHECK32-IZHINXMIN-NEXT:    feq.s a0, a0, a0
7571 ; CHECK32-IZHINXMIN-NEXT:    neg a0, a0
7572 ; CHECK32-IZHINXMIN-NEXT:    fmin.s a1, a1, a2
7573 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a1, a1, rtz
7574 ; CHECK32-IZHINXMIN-NEXT:    and a0, a0, a1
7575 ; CHECK32-IZHINXMIN-NEXT:    ret
7577 ; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_sat_i8:
7578 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
7579 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7580 ; CHECK64-IZHINXMIN-NEXT:    lui a1, 798720
7581 ; CHECK64-IZHINXMIN-NEXT:    lui a2, 274400
7582 ; CHECK64-IZHINXMIN-NEXT:    fmax.s a1, a0, a1
7583 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
7584 ; CHECK64-IZHINXMIN-NEXT:    neg a0, a0
7585 ; CHECK64-IZHINXMIN-NEXT:    fmin.s a1, a1, a2
7586 ; CHECK64-IZHINXMIN-NEXT:    fcvt.l.s a1, a1, rtz
7587 ; CHECK64-IZHINXMIN-NEXT:    and a0, a0, a1
7588 ; CHECK64-IZHINXMIN-NEXT:    ret
7590 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i8:
7591 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
7592 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7593 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 798720
7594 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a2, 274400
7595 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmax.s a1, a0, a1
7596 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
7597 ; CHECK32-IZDINXZHINXMIN-NEXT:    neg a0, a0
7598 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmin.s a1, a1, a2
7599 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a1, a1, rtz
7600 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
7601 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
7603 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i8:
7604 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
7605 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7606 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a1, 798720
7607 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a2, 274400
7608 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmax.s a1, a0, a1
7609 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
7610 ; CHECK64-IZDINXZHINXMIN-NEXT:    neg a0, a0
7611 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmin.s a1, a1, a2
7612 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.l.s a1, a1, rtz
7613 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
7614 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
7615 start:
7616   %0 = tail call i8 @llvm.fptosi.sat.i8.f16(half %a)
7617   ret i8 %0
7619 declare i8 @llvm.fptosi.sat.i8.f16(half)
7621 define zeroext i8 @fcvt_wu_s_i8(half %a) nounwind {
7622 ; RV32IZFH-LABEL: fcvt_wu_s_i8:
7623 ; RV32IZFH:       # %bb.0:
7624 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
7625 ; RV32IZFH-NEXT:    ret
7627 ; RV64IZFH-LABEL: fcvt_wu_s_i8:
7628 ; RV64IZFH:       # %bb.0:
7629 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
7630 ; RV64IZFH-NEXT:    ret
7632 ; RV32IDZFH-LABEL: fcvt_wu_s_i8:
7633 ; RV32IDZFH:       # %bb.0:
7634 ; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
7635 ; RV32IDZFH-NEXT:    ret
7637 ; RV64IDZFH-LABEL: fcvt_wu_s_i8:
7638 ; RV64IDZFH:       # %bb.0:
7639 ; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
7640 ; RV64IDZFH-NEXT:    ret
7642 ; RV32IZHINX-LABEL: fcvt_wu_s_i8:
7643 ; RV32IZHINX:       # %bb.0:
7644 ; RV32IZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
7645 ; RV32IZHINX-NEXT:    ret
7647 ; RV64IZHINX-LABEL: fcvt_wu_s_i8:
7648 ; RV64IZHINX:       # %bb.0:
7649 ; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
7650 ; RV64IZHINX-NEXT:    ret
7652 ; RV32IZDINXZHINX-LABEL: fcvt_wu_s_i8:
7653 ; RV32IZDINXZHINX:       # %bb.0:
7654 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
7655 ; RV32IZDINXZHINX-NEXT:    ret
7657 ; RV64IZDINXZHINX-LABEL: fcvt_wu_s_i8:
7658 ; RV64IZDINXZHINX:       # %bb.0:
7659 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
7660 ; RV64IZDINXZHINX-NEXT:    ret
7662 ; RV32I-LABEL: fcvt_wu_s_i8:
7663 ; RV32I:       # %bb.0:
7664 ; RV32I-NEXT:    addi sp, sp, -16
7665 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7666 ; RV32I-NEXT:    slli a0, a0, 16
7667 ; RV32I-NEXT:    srli a0, a0, 16
7668 ; RV32I-NEXT:    call __extendhfsf2
7669 ; RV32I-NEXT:    call __fixunssfsi
7670 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7671 ; RV32I-NEXT:    addi sp, sp, 16
7672 ; RV32I-NEXT:    ret
7674 ; RV64I-LABEL: fcvt_wu_s_i8:
7675 ; RV64I:       # %bb.0:
7676 ; RV64I-NEXT:    addi sp, sp, -16
7677 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7678 ; RV64I-NEXT:    slli a0, a0, 48
7679 ; RV64I-NEXT:    srli a0, a0, 48
7680 ; RV64I-NEXT:    call __extendhfsf2
7681 ; RV64I-NEXT:    call __fixunssfdi
7682 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7683 ; RV64I-NEXT:    addi sp, sp, 16
7684 ; RV64I-NEXT:    ret
7686 ; RV32ID-ILP32-LABEL: fcvt_wu_s_i8:
7687 ; RV32ID-ILP32:       # %bb.0:
7688 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
7689 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7690 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
7691 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
7692 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
7693 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7694 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
7695 ; RV32ID-ILP32-NEXT:    ret
7697 ; RV64ID-LP64-LABEL: fcvt_wu_s_i8:
7698 ; RV64ID-LP64:       # %bb.0:
7699 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
7700 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7701 ; RV64ID-LP64-NEXT:    call __extendhfsf2
7702 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
7703 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
7704 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7705 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
7706 ; RV64ID-LP64-NEXT:    ret
7708 ; RV32ID-LABEL: fcvt_wu_s_i8:
7709 ; RV32ID:       # %bb.0:
7710 ; RV32ID-NEXT:    addi sp, sp, -16
7711 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7712 ; RV32ID-NEXT:    call __extendhfsf2
7713 ; RV32ID-NEXT:    fcvt.wu.s a0, fa0, rtz
7714 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7715 ; RV32ID-NEXT:    addi sp, sp, 16
7716 ; RV32ID-NEXT:    ret
7718 ; RV64ID-LABEL: fcvt_wu_s_i8:
7719 ; RV64ID:       # %bb.0:
7720 ; RV64ID-NEXT:    addi sp, sp, -16
7721 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7722 ; RV64ID-NEXT:    call __extendhfsf2
7723 ; RV64ID-NEXT:    fcvt.lu.s a0, fa0, rtz
7724 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7725 ; RV64ID-NEXT:    addi sp, sp, 16
7726 ; RV64ID-NEXT:    ret
7728 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_i8:
7729 ; CHECK32-IZFHMIN:       # %bb.0:
7730 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7731 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
7732 ; CHECK32-IZFHMIN-NEXT:    ret
7734 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_i8:
7735 ; CHECK64-IZFHMIN:       # %bb.0:
7736 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7737 ; CHECK64-IZFHMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
7738 ; CHECK64-IZFHMIN-NEXT:    ret
7740 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_i8:
7741 ; CHECK32-IZHINXMIN:       # %bb.0:
7742 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7743 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
7744 ; CHECK32-IZHINXMIN-NEXT:    ret
7746 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_i8:
7747 ; CHECK64-IZHINXMIN:       # %bb.0:
7748 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
7749 ; CHECK64-IZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
7750 ; CHECK64-IZHINXMIN-NEXT:    ret
7752 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i8:
7753 ; CHECK32-IZDINXZHINXMIN:       # %bb.0:
7754 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7755 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a0, a0, rtz
7756 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
7758 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i8:
7759 ; CHECK64-IZDINXZHINXMIN:       # %bb.0:
7760 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
7761 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
7762 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
7763   %1 = fptoui half %a to i8
7764   ret i8 %1
7767 define zeroext i8 @fcvt_wu_s_sat_i8(half %a) nounwind {
7768 ; RV32IZFH-LABEL: fcvt_wu_s_sat_i8:
7769 ; RV32IZFH:       # %bb.0: # %start
7770 ; RV32IZFH-NEXT:    fcvt.s.h fa5, fa0
7771 ; RV32IZFH-NEXT:    fmv.w.x fa4, zero
7772 ; RV32IZFH-NEXT:    lui a0, 276464
7773 ; RV32IZFH-NEXT:    fmax.s fa5, fa5, fa4
7774 ; RV32IZFH-NEXT:    fmv.w.x fa4, a0
7775 ; RV32IZFH-NEXT:    fmin.s fa5, fa5, fa4
7776 ; RV32IZFH-NEXT:    fcvt.wu.s a0, fa5, rtz
7777 ; RV32IZFH-NEXT:    ret
7779 ; RV64IZFH-LABEL: fcvt_wu_s_sat_i8:
7780 ; RV64IZFH:       # %bb.0: # %start
7781 ; RV64IZFH-NEXT:    fcvt.s.h fa5, fa0
7782 ; RV64IZFH-NEXT:    fmv.w.x fa4, zero
7783 ; RV64IZFH-NEXT:    lui a0, 276464
7784 ; RV64IZFH-NEXT:    fmax.s fa5, fa5, fa4
7785 ; RV64IZFH-NEXT:    fmv.w.x fa4, a0
7786 ; RV64IZFH-NEXT:    fmin.s fa5, fa5, fa4
7787 ; RV64IZFH-NEXT:    fcvt.lu.s a0, fa5, rtz
7788 ; RV64IZFH-NEXT:    ret
7790 ; RV32IDZFH-LABEL: fcvt_wu_s_sat_i8:
7791 ; RV32IDZFH:       # %bb.0: # %start
7792 ; RV32IDZFH-NEXT:    fcvt.s.h fa5, fa0
7793 ; RV32IDZFH-NEXT:    fmv.w.x fa4, zero
7794 ; RV32IDZFH-NEXT:    lui a0, 276464
7795 ; RV32IDZFH-NEXT:    fmax.s fa5, fa5, fa4
7796 ; RV32IDZFH-NEXT:    fmv.w.x fa4, a0
7797 ; RV32IDZFH-NEXT:    fmin.s fa5, fa5, fa4
7798 ; RV32IDZFH-NEXT:    fcvt.wu.s a0, fa5, rtz
7799 ; RV32IDZFH-NEXT:    ret
7801 ; RV64IDZFH-LABEL: fcvt_wu_s_sat_i8:
7802 ; RV64IDZFH:       # %bb.0: # %start
7803 ; RV64IDZFH-NEXT:    fcvt.s.h fa5, fa0
7804 ; RV64IDZFH-NEXT:    fmv.w.x fa4, zero
7805 ; RV64IDZFH-NEXT:    lui a0, 276464
7806 ; RV64IDZFH-NEXT:    fmax.s fa5, fa5, fa4
7807 ; RV64IDZFH-NEXT:    fmv.w.x fa4, a0
7808 ; RV64IDZFH-NEXT:    fmin.s fa5, fa5, fa4
7809 ; RV64IDZFH-NEXT:    fcvt.lu.s a0, fa5, rtz
7810 ; RV64IDZFH-NEXT:    ret
7812 ; RV32IZHINX-LABEL: fcvt_wu_s_sat_i8:
7813 ; RV32IZHINX:       # %bb.0: # %start
7814 ; RV32IZHINX-NEXT:    fcvt.s.h a0, a0
7815 ; RV32IZHINX-NEXT:    fmax.s a0, a0, zero
7816 ; RV32IZHINX-NEXT:    lui a1, 276464
7817 ; RV32IZHINX-NEXT:    fmin.s a0, a0, a1
7818 ; RV32IZHINX-NEXT:    fcvt.wu.s a0, a0, rtz
7819 ; RV32IZHINX-NEXT:    ret
7821 ; RV64IZHINX-LABEL: fcvt_wu_s_sat_i8:
7822 ; RV64IZHINX:       # %bb.0: # %start
7823 ; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
7824 ; RV64IZHINX-NEXT:    fmax.s a0, a0, zero
7825 ; RV64IZHINX-NEXT:    lui a1, 276464
7826 ; RV64IZHINX-NEXT:    fmin.s a0, a0, a1
7827 ; RV64IZHINX-NEXT:    fcvt.lu.s a0, a0, rtz
7828 ; RV64IZHINX-NEXT:    ret
7830 ; RV32IZDINXZHINX-LABEL: fcvt_wu_s_sat_i8:
7831 ; RV32IZDINXZHINX:       # %bb.0: # %start
7832 ; RV32IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
7833 ; RV32IZDINXZHINX-NEXT:    fmax.s a0, a0, zero
7834 ; RV32IZDINXZHINX-NEXT:    lui a1, 276464
7835 ; RV32IZDINXZHINX-NEXT:    fmin.s a0, a0, a1
7836 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.s a0, a0, rtz
7837 ; RV32IZDINXZHINX-NEXT:    ret
7839 ; RV64IZDINXZHINX-LABEL: fcvt_wu_s_sat_i8:
7840 ; RV64IZDINXZHINX:       # %bb.0: # %start
7841 ; RV64IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
7842 ; RV64IZDINXZHINX-NEXT:    fmax.s a0, a0, zero
7843 ; RV64IZDINXZHINX-NEXT:    lui a1, 276464
7844 ; RV64IZDINXZHINX-NEXT:    fmin.s a0, a0, a1
7845 ; RV64IZDINXZHINX-NEXT:    fcvt.lu.s a0, a0, rtz
7846 ; RV64IZDINXZHINX-NEXT:    ret
7848 ; RV32I-LABEL: fcvt_wu_s_sat_i8:
7849 ; RV32I:       # %bb.0: # %start
7850 ; RV32I-NEXT:    addi sp, sp, -16
7851 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7852 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
7853 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
7854 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
7855 ; RV32I-NEXT:    slli a0, a0, 16
7856 ; RV32I-NEXT:    srli a0, a0, 16
7857 ; RV32I-NEXT:    call __extendhfsf2
7858 ; RV32I-NEXT:    mv s2, a0
7859 ; RV32I-NEXT:    li a1, 0
7860 ; RV32I-NEXT:    call __gesf2
7861 ; RV32I-NEXT:    mv s0, a0
7862 ; RV32I-NEXT:    mv a0, s2
7863 ; RV32I-NEXT:    call __fixunssfsi
7864 ; RV32I-NEXT:    mv s1, a0
7865 ; RV32I-NEXT:    lui a1, 276464
7866 ; RV32I-NEXT:    mv a0, s2
7867 ; RV32I-NEXT:    call __gtsf2
7868 ; RV32I-NEXT:    blez a0, .LBB38_2
7869 ; RV32I-NEXT:  # %bb.1: # %start
7870 ; RV32I-NEXT:    li a0, 255
7871 ; RV32I-NEXT:    j .LBB38_3
7872 ; RV32I-NEXT:  .LBB38_2:
7873 ; RV32I-NEXT:    slti a0, s0, 0
7874 ; RV32I-NEXT:    addi a0, a0, -1
7875 ; RV32I-NEXT:    and a0, a0, s1
7876 ; RV32I-NEXT:  .LBB38_3: # %start
7877 ; RV32I-NEXT:    andi a0, a0, 255
7878 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7879 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
7880 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
7881 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
7882 ; RV32I-NEXT:    addi sp, sp, 16
7883 ; RV32I-NEXT:    ret
7885 ; RV64I-LABEL: fcvt_wu_s_sat_i8:
7886 ; RV64I:       # %bb.0: # %start
7887 ; RV64I-NEXT:    addi sp, sp, -32
7888 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
7889 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
7890 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
7891 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
7892 ; RV64I-NEXT:    slli a0, a0, 48
7893 ; RV64I-NEXT:    srli a0, a0, 48
7894 ; RV64I-NEXT:    call __extendhfsf2
7895 ; RV64I-NEXT:    mv s2, a0
7896 ; RV64I-NEXT:    li a1, 0
7897 ; RV64I-NEXT:    call __gesf2
7898 ; RV64I-NEXT:    mv s0, a0
7899 ; RV64I-NEXT:    mv a0, s2
7900 ; RV64I-NEXT:    call __fixunssfdi
7901 ; RV64I-NEXT:    mv s1, a0
7902 ; RV64I-NEXT:    lui a1, 276464
7903 ; RV64I-NEXT:    mv a0, s2
7904 ; RV64I-NEXT:    call __gtsf2
7905 ; RV64I-NEXT:    blez a0, .LBB38_2
7906 ; RV64I-NEXT:  # %bb.1: # %start
7907 ; RV64I-NEXT:    li a0, 255
7908 ; RV64I-NEXT:    j .LBB38_3
7909 ; RV64I-NEXT:  .LBB38_2:
7910 ; RV64I-NEXT:    slti a0, s0, 0
7911 ; RV64I-NEXT:    addi a0, a0, -1
7912 ; RV64I-NEXT:    and a0, a0, s1
7913 ; RV64I-NEXT:  .LBB38_3: # %start
7914 ; RV64I-NEXT:    andi a0, a0, 255
7915 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
7916 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
7917 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
7918 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
7919 ; RV64I-NEXT:    addi sp, sp, 32
7920 ; RV64I-NEXT:    ret
7922 ; RV32ID-ILP32-LABEL: fcvt_wu_s_sat_i8:
7923 ; RV32ID-ILP32:       # %bb.0: # %start
7924 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
7925 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7926 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
7927 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
7928 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, zero
7929 ; RV32ID-ILP32-NEXT:    lui a0, 276464
7930 ; RV32ID-ILP32-NEXT:    fmax.s fa5, fa5, fa4
7931 ; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
7932 ; RV32ID-ILP32-NEXT:    fmin.s fa5, fa5, fa4
7933 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
7934 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7935 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
7936 ; RV32ID-ILP32-NEXT:    ret
7938 ; RV64ID-LP64-LABEL: fcvt_wu_s_sat_i8:
7939 ; RV64ID-LP64:       # %bb.0: # %start
7940 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
7941 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7942 ; RV64ID-LP64-NEXT:    call __extendhfsf2
7943 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
7944 ; RV64ID-LP64-NEXT:    fmv.w.x fa4, zero
7945 ; RV64ID-LP64-NEXT:    lui a0, 276464
7946 ; RV64ID-LP64-NEXT:    fmax.s fa5, fa5, fa4
7947 ; RV64ID-LP64-NEXT:    fmv.w.x fa4, a0
7948 ; RV64ID-LP64-NEXT:    fmin.s fa5, fa5, fa4
7949 ; RV64ID-LP64-NEXT:    fcvt.lu.s a0, fa5, rtz
7950 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7951 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
7952 ; RV64ID-LP64-NEXT:    ret
7954 ; RV32ID-LABEL: fcvt_wu_s_sat_i8:
7955 ; RV32ID:       # %bb.0: # %start
7956 ; RV32ID-NEXT:    addi sp, sp, -16
7957 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
7958 ; RV32ID-NEXT:    call __extendhfsf2
7959 ; RV32ID-NEXT:    fmv.w.x fa5, zero
7960 ; RV32ID-NEXT:    lui a0, 276464
7961 ; RV32ID-NEXT:    fmax.s fa5, fa0, fa5
7962 ; RV32ID-NEXT:    fmv.w.x fa4, a0
7963 ; RV32ID-NEXT:    fmin.s fa5, fa5, fa4
7964 ; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
7965 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
7966 ; RV32ID-NEXT:    addi sp, sp, 16
7967 ; RV32ID-NEXT:    ret
7969 ; RV64ID-LABEL: fcvt_wu_s_sat_i8:
7970 ; RV64ID:       # %bb.0: # %start
7971 ; RV64ID-NEXT:    addi sp, sp, -16
7972 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
7973 ; RV64ID-NEXT:    call __extendhfsf2
7974 ; RV64ID-NEXT:    fmv.w.x fa5, zero
7975 ; RV64ID-NEXT:    lui a0, 276464
7976 ; RV64ID-NEXT:    fmax.s fa5, fa0, fa5
7977 ; RV64ID-NEXT:    fmv.w.x fa4, a0
7978 ; RV64ID-NEXT:    fmin.s fa5, fa5, fa4
7979 ; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
7980 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7981 ; RV64ID-NEXT:    addi sp, sp, 16
7982 ; RV64ID-NEXT:    ret
7984 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_sat_i8:
7985 ; CHECK32-IZFHMIN:       # %bb.0: # %start
7986 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7987 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa4, zero
7988 ; CHECK32-IZFHMIN-NEXT:    lui a0, 276464
7989 ; CHECK32-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa4
7990 ; CHECK32-IZFHMIN-NEXT:    fmv.w.x fa4, a0
7991 ; CHECK32-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
7992 ; CHECK32-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
7993 ; CHECK32-IZFHMIN-NEXT:    ret
7995 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_sat_i8:
7996 ; CHECK64-IZFHMIN:       # %bb.0: # %start
7997 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
7998 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa4, zero
7999 ; CHECK64-IZFHMIN-NEXT:    lui a0, 276464
8000 ; CHECK64-IZFHMIN-NEXT:    fmax.s fa5, fa5, fa4
8001 ; CHECK64-IZFHMIN-NEXT:    fmv.w.x fa4, a0
8002 ; CHECK64-IZFHMIN-NEXT:    fmin.s fa5, fa5, fa4
8003 ; CHECK64-IZFHMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
8004 ; CHECK64-IZFHMIN-NEXT:    ret
8006 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_sat_i8:
8007 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
8008 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
8009 ; CHECK32-IZHINXMIN-NEXT:    fmax.s a0, a0, zero
8010 ; CHECK32-IZHINXMIN-NEXT:    lui a1, 276464
8011 ; CHECK32-IZHINXMIN-NEXT:    fmin.s a0, a0, a1
8012 ; CHECK32-IZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
8013 ; CHECK32-IZHINXMIN-NEXT:    ret
8015 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_sat_i8:
8016 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
8017 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
8018 ; CHECK64-IZHINXMIN-NEXT:    fmax.s a0, a0, zero
8019 ; CHECK64-IZHINXMIN-NEXT:    lui a1, 276464
8020 ; CHECK64-IZHINXMIN-NEXT:    fmin.s a0, a0, a1
8021 ; CHECK64-IZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
8022 ; CHECK64-IZHINXMIN-NEXT:    ret
8024 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i8:
8025 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
8026 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
8027 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmax.s a0, a0, zero
8028 ; CHECK32-IZDINXZHINXMIN-NEXT:    lui a1, 276464
8029 ; CHECK32-IZDINXZHINXMIN-NEXT:    fmin.s a0, a0, a1
8030 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a0, a0, rtz
8031 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
8033 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i8:
8034 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
8035 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
8036 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmax.s a0, a0, zero
8037 ; CHECK64-IZDINXZHINXMIN-NEXT:    lui a1, 276464
8038 ; CHECK64-IZDINXZHINXMIN-NEXT:    fmin.s a0, a0, a1
8039 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.lu.s a0, a0, rtz
8040 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
8041 start:
8042   %0 = tail call i8 @llvm.fptoui.sat.i8.f16(half %a)
8043   ret i8 %0
8045 declare i8 @llvm.fptoui.sat.i8.f16(half)
8047 define zeroext i32 @fcvt_wu_h_sat_zext(half %a) nounwind {
8048 ; RV32IZFH-LABEL: fcvt_wu_h_sat_zext:
8049 ; RV32IZFH:       # %bb.0: # %start
8050 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
8051 ; RV32IZFH-NEXT:    feq.h a1, fa0, fa0
8052 ; RV32IZFH-NEXT:    seqz a1, a1
8053 ; RV32IZFH-NEXT:    addi a1, a1, -1
8054 ; RV32IZFH-NEXT:    and a0, a1, a0
8055 ; RV32IZFH-NEXT:    ret
8057 ; RV64IZFH-LABEL: fcvt_wu_h_sat_zext:
8058 ; RV64IZFH:       # %bb.0: # %start
8059 ; RV64IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
8060 ; RV64IZFH-NEXT:    feq.h a1, fa0, fa0
8061 ; RV64IZFH-NEXT:    seqz a1, a1
8062 ; RV64IZFH-NEXT:    addi a1, a1, -1
8063 ; RV64IZFH-NEXT:    and a0, a0, a1
8064 ; RV64IZFH-NEXT:    slli a0, a0, 32
8065 ; RV64IZFH-NEXT:    srli a0, a0, 32
8066 ; RV64IZFH-NEXT:    ret
8068 ; RV32IDZFH-LABEL: fcvt_wu_h_sat_zext:
8069 ; RV32IDZFH:       # %bb.0: # %start
8070 ; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
8071 ; RV32IDZFH-NEXT:    feq.h a1, fa0, fa0
8072 ; RV32IDZFH-NEXT:    seqz a1, a1
8073 ; RV32IDZFH-NEXT:    addi a1, a1, -1
8074 ; RV32IDZFH-NEXT:    and a0, a1, a0
8075 ; RV32IDZFH-NEXT:    ret
8077 ; RV64IDZFH-LABEL: fcvt_wu_h_sat_zext:
8078 ; RV64IDZFH:       # %bb.0: # %start
8079 ; RV64IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
8080 ; RV64IDZFH-NEXT:    feq.h a1, fa0, fa0
8081 ; RV64IDZFH-NEXT:    seqz a1, a1
8082 ; RV64IDZFH-NEXT:    addi a1, a1, -1
8083 ; RV64IDZFH-NEXT:    and a0, a0, a1
8084 ; RV64IDZFH-NEXT:    slli a0, a0, 32
8085 ; RV64IDZFH-NEXT:    srli a0, a0, 32
8086 ; RV64IDZFH-NEXT:    ret
8088 ; RV32IZHINX-LABEL: fcvt_wu_h_sat_zext:
8089 ; RV32IZHINX:       # %bb.0: # %start
8090 ; RV32IZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
8091 ; RV32IZHINX-NEXT:    feq.h a0, a0, a0
8092 ; RV32IZHINX-NEXT:    seqz a0, a0
8093 ; RV32IZHINX-NEXT:    addi a0, a0, -1
8094 ; RV32IZHINX-NEXT:    and a0, a0, a1
8095 ; RV32IZHINX-NEXT:    ret
8097 ; RV64IZHINX-LABEL: fcvt_wu_h_sat_zext:
8098 ; RV64IZHINX:       # %bb.0: # %start
8099 ; RV64IZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
8100 ; RV64IZHINX-NEXT:    feq.h a0, a0, a0
8101 ; RV64IZHINX-NEXT:    seqz a0, a0
8102 ; RV64IZHINX-NEXT:    addi a0, a0, -1
8103 ; RV64IZHINX-NEXT:    and a0, a1, a0
8104 ; RV64IZHINX-NEXT:    slli a0, a0, 32
8105 ; RV64IZHINX-NEXT:    srli a0, a0, 32
8106 ; RV64IZHINX-NEXT:    ret
8108 ; RV32IZDINXZHINX-LABEL: fcvt_wu_h_sat_zext:
8109 ; RV32IZDINXZHINX:       # %bb.0: # %start
8110 ; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
8111 ; RV32IZDINXZHINX-NEXT:    feq.h a0, a0, a0
8112 ; RV32IZDINXZHINX-NEXT:    seqz a0, a0
8113 ; RV32IZDINXZHINX-NEXT:    addi a0, a0, -1
8114 ; RV32IZDINXZHINX-NEXT:    and a0, a0, a1
8115 ; RV32IZDINXZHINX-NEXT:    ret
8117 ; RV64IZDINXZHINX-LABEL: fcvt_wu_h_sat_zext:
8118 ; RV64IZDINXZHINX:       # %bb.0: # %start
8119 ; RV64IZDINXZHINX-NEXT:    fcvt.wu.h a1, a0, rtz
8120 ; RV64IZDINXZHINX-NEXT:    feq.h a0, a0, a0
8121 ; RV64IZDINXZHINX-NEXT:    seqz a0, a0
8122 ; RV64IZDINXZHINX-NEXT:    addi a0, a0, -1
8123 ; RV64IZDINXZHINX-NEXT:    and a0, a1, a0
8124 ; RV64IZDINXZHINX-NEXT:    slli a0, a0, 32
8125 ; RV64IZDINXZHINX-NEXT:    srli a0, a0, 32
8126 ; RV64IZDINXZHINX-NEXT:    ret
8128 ; RV32I-LABEL: fcvt_wu_h_sat_zext:
8129 ; RV32I:       # %bb.0: # %start
8130 ; RV32I-NEXT:    addi sp, sp, -16
8131 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
8132 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
8133 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
8134 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
8135 ; RV32I-NEXT:    slli a0, a0, 16
8136 ; RV32I-NEXT:    srli a0, a0, 16
8137 ; RV32I-NEXT:    call __extendhfsf2
8138 ; RV32I-NEXT:    mv s0, a0
8139 ; RV32I-NEXT:    lui a1, 325632
8140 ; RV32I-NEXT:    addi a1, a1, -1
8141 ; RV32I-NEXT:    call __gtsf2
8142 ; RV32I-NEXT:    sgtz a0, a0
8143 ; RV32I-NEXT:    neg s1, a0
8144 ; RV32I-NEXT:    mv a0, s0
8145 ; RV32I-NEXT:    li a1, 0
8146 ; RV32I-NEXT:    call __gesf2
8147 ; RV32I-NEXT:    slti a0, a0, 0
8148 ; RV32I-NEXT:    addi s2, a0, -1
8149 ; RV32I-NEXT:    mv a0, s0
8150 ; RV32I-NEXT:    call __fixunssfsi
8151 ; RV32I-NEXT:    and a0, s2, a0
8152 ; RV32I-NEXT:    or a0, s1, a0
8153 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
8154 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
8155 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
8156 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
8157 ; RV32I-NEXT:    addi sp, sp, 16
8158 ; RV32I-NEXT:    ret
8160 ; RV64I-LABEL: fcvt_wu_h_sat_zext:
8161 ; RV64I:       # %bb.0: # %start
8162 ; RV64I-NEXT:    addi sp, sp, -32
8163 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
8164 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
8165 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
8166 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
8167 ; RV64I-NEXT:    slli a0, a0, 48
8168 ; RV64I-NEXT:    srli a0, a0, 48
8169 ; RV64I-NEXT:    call __extendhfsf2
8170 ; RV64I-NEXT:    mv s2, a0
8171 ; RV64I-NEXT:    li a1, 0
8172 ; RV64I-NEXT:    call __gesf2
8173 ; RV64I-NEXT:    mv s0, a0
8174 ; RV64I-NEXT:    mv a0, s2
8175 ; RV64I-NEXT:    call __fixunssfdi
8176 ; RV64I-NEXT:    mv s1, a0
8177 ; RV64I-NEXT:    lui a1, 325632
8178 ; RV64I-NEXT:    addiw a1, a1, -1
8179 ; RV64I-NEXT:    mv a0, s2
8180 ; RV64I-NEXT:    call __gtsf2
8181 ; RV64I-NEXT:    blez a0, .LBB39_2
8182 ; RV64I-NEXT:  # %bb.1: # %start
8183 ; RV64I-NEXT:    li a0, -1
8184 ; RV64I-NEXT:    srli a0, a0, 32
8185 ; RV64I-NEXT:    j .LBB39_3
8186 ; RV64I-NEXT:  .LBB39_2:
8187 ; RV64I-NEXT:    slti a0, s0, 0
8188 ; RV64I-NEXT:    addi a0, a0, -1
8189 ; RV64I-NEXT:    and a0, a0, s1
8190 ; RV64I-NEXT:  .LBB39_3: # %start
8191 ; RV64I-NEXT:    slli a0, a0, 32
8192 ; RV64I-NEXT:    srli a0, a0, 32
8193 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
8194 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
8195 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
8196 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
8197 ; RV64I-NEXT:    addi sp, sp, 32
8198 ; RV64I-NEXT:    ret
8200 ; RV32ID-ILP32-LABEL: fcvt_wu_h_sat_zext:
8201 ; RV32ID-ILP32:       # %bb.0: # %start
8202 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
8203 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
8204 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
8205 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
8206 ; RV32ID-ILP32-NEXT:    fcvt.wu.s a0, fa5, rtz
8207 ; RV32ID-ILP32-NEXT:    feq.s a1, fa5, fa5
8208 ; RV32ID-ILP32-NEXT:    seqz a1, a1
8209 ; RV32ID-ILP32-NEXT:    addi a1, a1, -1
8210 ; RV32ID-ILP32-NEXT:    and a0, a1, a0
8211 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
8212 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
8213 ; RV32ID-ILP32-NEXT:    ret
8215 ; RV64ID-LP64-LABEL: fcvt_wu_h_sat_zext:
8216 ; RV64ID-LP64:       # %bb.0: # %start
8217 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
8218 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8219 ; RV64ID-LP64-NEXT:    call __extendhfsf2
8220 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
8221 ; RV64ID-LP64-NEXT:    fcvt.wu.s a0, fa5, rtz
8222 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
8223 ; RV64ID-LP64-NEXT:    seqz a1, a1
8224 ; RV64ID-LP64-NEXT:    addi a1, a1, -1
8225 ; RV64ID-LP64-NEXT:    and a0, a0, a1
8226 ; RV64ID-LP64-NEXT:    slli a0, a0, 32
8227 ; RV64ID-LP64-NEXT:    srli a0, a0, 32
8228 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8229 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
8230 ; RV64ID-LP64-NEXT:    ret
8232 ; RV32ID-LABEL: fcvt_wu_h_sat_zext:
8233 ; RV32ID:       # %bb.0: # %start
8234 ; RV32ID-NEXT:    addi sp, sp, -16
8235 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
8236 ; RV32ID-NEXT:    call __extendhfsf2
8237 ; RV32ID-NEXT:    fcvt.wu.s a0, fa0, rtz
8238 ; RV32ID-NEXT:    feq.s a1, fa0, fa0
8239 ; RV32ID-NEXT:    seqz a1, a1
8240 ; RV32ID-NEXT:    addi a1, a1, -1
8241 ; RV32ID-NEXT:    and a0, a1, a0
8242 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
8243 ; RV32ID-NEXT:    addi sp, sp, 16
8244 ; RV32ID-NEXT:    ret
8246 ; RV64ID-LABEL: fcvt_wu_h_sat_zext:
8247 ; RV64ID:       # %bb.0: # %start
8248 ; RV64ID-NEXT:    addi sp, sp, -16
8249 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8250 ; RV64ID-NEXT:    call __extendhfsf2
8251 ; RV64ID-NEXT:    fcvt.wu.s a0, fa0, rtz
8252 ; RV64ID-NEXT:    feq.s a1, fa0, fa0
8253 ; RV64ID-NEXT:    seqz a1, a1
8254 ; RV64ID-NEXT:    addi a1, a1, -1
8255 ; RV64ID-NEXT:    and a0, a0, a1
8256 ; RV64ID-NEXT:    slli a0, a0, 32
8257 ; RV64ID-NEXT:    srli a0, a0, 32
8258 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8259 ; RV64ID-NEXT:    addi sp, sp, 16
8260 ; RV64ID-NEXT:    ret
8262 ; CHECK32-IZFHMIN-LABEL: fcvt_wu_h_sat_zext:
8263 ; CHECK32-IZFHMIN:       # %bb.0: # %start
8264 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
8265 ; CHECK32-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
8266 ; CHECK32-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
8267 ; CHECK32-IZFHMIN-NEXT:    seqz a1, a1
8268 ; CHECK32-IZFHMIN-NEXT:    addi a1, a1, -1
8269 ; CHECK32-IZFHMIN-NEXT:    and a0, a1, a0
8270 ; CHECK32-IZFHMIN-NEXT:    ret
8272 ; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_sat_zext:
8273 ; CHECK64-IZFHMIN:       # %bb.0: # %start
8274 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
8275 ; CHECK64-IZFHMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
8276 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
8277 ; CHECK64-IZFHMIN-NEXT:    seqz a1, a1
8278 ; CHECK64-IZFHMIN-NEXT:    addi a1, a1, -1
8279 ; CHECK64-IZFHMIN-NEXT:    and a0, a0, a1
8280 ; CHECK64-IZFHMIN-NEXT:    slli a0, a0, 32
8281 ; CHECK64-IZFHMIN-NEXT:    srli a0, a0, 32
8282 ; CHECK64-IZFHMIN-NEXT:    ret
8284 ; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h_sat_zext:
8285 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
8286 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
8287 ; CHECK32-IZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
8288 ; CHECK32-IZHINXMIN-NEXT:    feq.s a0, a0, a0
8289 ; CHECK32-IZHINXMIN-NEXT:    seqz a0, a0
8290 ; CHECK32-IZHINXMIN-NEXT:    addi a0, a0, -1
8291 ; CHECK32-IZHINXMIN-NEXT:    and a0, a0, a1
8292 ; CHECK32-IZHINXMIN-NEXT:    ret
8294 ; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h_sat_zext:
8295 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
8296 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
8297 ; CHECK64-IZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
8298 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
8299 ; CHECK64-IZHINXMIN-NEXT:    seqz a0, a0
8300 ; CHECK64-IZHINXMIN-NEXT:    addi a0, a0, -1
8301 ; CHECK64-IZHINXMIN-NEXT:    and a0, a1, a0
8302 ; CHECK64-IZHINXMIN-NEXT:    slli a0, a0, 32
8303 ; CHECK64-IZHINXMIN-NEXT:    srli a0, a0, 32
8304 ; CHECK64-IZHINXMIN-NEXT:    ret
8306 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat_zext:
8307 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
8308 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
8309 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
8310 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
8311 ; CHECK32-IZDINXZHINXMIN-NEXT:    seqz a0, a0
8312 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
8313 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
8314 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
8316 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat_zext:
8317 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
8318 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
8319 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.wu.s a1, a0, rtz
8320 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
8321 ; CHECK64-IZDINXZHINXMIN-NEXT:    seqz a0, a0
8322 ; CHECK64-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
8323 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a1, a0
8324 ; CHECK64-IZDINXZHINXMIN-NEXT:    slli a0, a0, 32
8325 ; CHECK64-IZDINXZHINXMIN-NEXT:    srli a0, a0, 32
8326 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
8327 start:
8328   %0 = tail call i32 @llvm.fptoui.sat.i32.f16(half %a)
8329   ret i32 %0
8332 define signext i32 @fcvt_w_h_sat_sext(half %a) nounwind {
8333 ; CHECKIZFH-LABEL: fcvt_w_h_sat_sext:
8334 ; CHECKIZFH:       # %bb.0: # %start
8335 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rtz
8336 ; CHECKIZFH-NEXT:    feq.h a1, fa0, fa0
8337 ; CHECKIZFH-NEXT:    seqz a1, a1
8338 ; CHECKIZFH-NEXT:    addi a1, a1, -1
8339 ; CHECKIZFH-NEXT:    and a0, a1, a0
8340 ; CHECKIZFH-NEXT:    ret
8342 ; RV32IDZFH-LABEL: fcvt_w_h_sat_sext:
8343 ; RV32IDZFH:       # %bb.0: # %start
8344 ; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
8345 ; RV32IDZFH-NEXT:    feq.h a1, fa0, fa0
8346 ; RV32IDZFH-NEXT:    seqz a1, a1
8347 ; RV32IDZFH-NEXT:    addi a1, a1, -1
8348 ; RV32IDZFH-NEXT:    and a0, a1, a0
8349 ; RV32IDZFH-NEXT:    ret
8351 ; RV64IDZFH-LABEL: fcvt_w_h_sat_sext:
8352 ; RV64IDZFH:       # %bb.0: # %start
8353 ; RV64IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
8354 ; RV64IDZFH-NEXT:    feq.h a1, fa0, fa0
8355 ; RV64IDZFH-NEXT:    seqz a1, a1
8356 ; RV64IDZFH-NEXT:    addi a1, a1, -1
8357 ; RV64IDZFH-NEXT:    and a0, a1, a0
8358 ; RV64IDZFH-NEXT:    ret
8360 ; CHECKIZHINX-LABEL: fcvt_w_h_sat_sext:
8361 ; CHECKIZHINX:       # %bb.0: # %start
8362 ; CHECKIZHINX-NEXT:    fcvt.w.h a1, a0, rtz
8363 ; CHECKIZHINX-NEXT:    feq.h a0, a0, a0
8364 ; CHECKIZHINX-NEXT:    seqz a0, a0
8365 ; CHECKIZHINX-NEXT:    addi a0, a0, -1
8366 ; CHECKIZHINX-NEXT:    and a0, a0, a1
8367 ; CHECKIZHINX-NEXT:    ret
8369 ; CHECKIZDINXZHINX-LABEL: fcvt_w_h_sat_sext:
8370 ; CHECKIZDINXZHINX:       # %bb.0: # %start
8371 ; CHECKIZDINXZHINX-NEXT:    fcvt.w.h a1, a0, rtz
8372 ; CHECKIZDINXZHINX-NEXT:    feq.h a0, a0, a0
8373 ; CHECKIZDINXZHINX-NEXT:    seqz a0, a0
8374 ; CHECKIZDINXZHINX-NEXT:    addi a0, a0, -1
8375 ; CHECKIZDINXZHINX-NEXT:    and a0, a0, a1
8376 ; CHECKIZDINXZHINX-NEXT:    ret
8378 ; RV32I-LABEL: fcvt_w_h_sat_sext:
8379 ; RV32I:       # %bb.0: # %start
8380 ; RV32I-NEXT:    addi sp, sp, -32
8381 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8382 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8383 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8384 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8385 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8386 ; RV32I-NEXT:    slli a0, a0, 16
8387 ; RV32I-NEXT:    srli a0, a0, 16
8388 ; RV32I-NEXT:    call __extendhfsf2
8389 ; RV32I-NEXT:    mv s0, a0
8390 ; RV32I-NEXT:    lui a1, 847872
8391 ; RV32I-NEXT:    call __gesf2
8392 ; RV32I-NEXT:    mv s2, a0
8393 ; RV32I-NEXT:    mv a0, s0
8394 ; RV32I-NEXT:    call __fixsfsi
8395 ; RV32I-NEXT:    mv s1, a0
8396 ; RV32I-NEXT:    lui s3, 524288
8397 ; RV32I-NEXT:    bgez s2, .LBB40_2
8398 ; RV32I-NEXT:  # %bb.1: # %start
8399 ; RV32I-NEXT:    lui s1, 524288
8400 ; RV32I-NEXT:  .LBB40_2: # %start
8401 ; RV32I-NEXT:    lui a1, 323584
8402 ; RV32I-NEXT:    addi a1, a1, -1
8403 ; RV32I-NEXT:    mv a0, s0
8404 ; RV32I-NEXT:    call __gtsf2
8405 ; RV32I-NEXT:    blez a0, .LBB40_4
8406 ; RV32I-NEXT:  # %bb.3: # %start
8407 ; RV32I-NEXT:    addi s1, s3, -1
8408 ; RV32I-NEXT:  .LBB40_4: # %start
8409 ; RV32I-NEXT:    mv a0, s0
8410 ; RV32I-NEXT:    mv a1, s0
8411 ; RV32I-NEXT:    call __unordsf2
8412 ; RV32I-NEXT:    snez a0, a0
8413 ; RV32I-NEXT:    addi a0, a0, -1
8414 ; RV32I-NEXT:    and a0, a0, s1
8415 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8416 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8417 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8418 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8419 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8420 ; RV32I-NEXT:    addi sp, sp, 32
8421 ; RV32I-NEXT:    ret
8423 ; RV64I-LABEL: fcvt_w_h_sat_sext:
8424 ; RV64I:       # %bb.0: # %start
8425 ; RV64I-NEXT:    addi sp, sp, -48
8426 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8427 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8428 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8429 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8430 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8431 ; RV64I-NEXT:    slli a0, a0, 48
8432 ; RV64I-NEXT:    srli a0, a0, 48
8433 ; RV64I-NEXT:    call __extendhfsf2
8434 ; RV64I-NEXT:    mv s0, a0
8435 ; RV64I-NEXT:    lui a1, 847872
8436 ; RV64I-NEXT:    call __gesf2
8437 ; RV64I-NEXT:    mv s2, a0
8438 ; RV64I-NEXT:    mv a0, s0
8439 ; RV64I-NEXT:    call __fixsfdi
8440 ; RV64I-NEXT:    mv s1, a0
8441 ; RV64I-NEXT:    lui s3, 524288
8442 ; RV64I-NEXT:    bgez s2, .LBB40_2
8443 ; RV64I-NEXT:  # %bb.1: # %start
8444 ; RV64I-NEXT:    lui s1, 524288
8445 ; RV64I-NEXT:  .LBB40_2: # %start
8446 ; RV64I-NEXT:    lui a1, 323584
8447 ; RV64I-NEXT:    addiw a1, a1, -1
8448 ; RV64I-NEXT:    mv a0, s0
8449 ; RV64I-NEXT:    call __gtsf2
8450 ; RV64I-NEXT:    blez a0, .LBB40_4
8451 ; RV64I-NEXT:  # %bb.3: # %start
8452 ; RV64I-NEXT:    addi s1, s3, -1
8453 ; RV64I-NEXT:  .LBB40_4: # %start
8454 ; RV64I-NEXT:    mv a0, s0
8455 ; RV64I-NEXT:    mv a1, s0
8456 ; RV64I-NEXT:    call __unordsf2
8457 ; RV64I-NEXT:    snez a0, a0
8458 ; RV64I-NEXT:    addi a0, a0, -1
8459 ; RV64I-NEXT:    and a0, a0, s1
8460 ; RV64I-NEXT:    sext.w a0, a0
8461 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8462 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8463 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8464 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8465 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8466 ; RV64I-NEXT:    addi sp, sp, 48
8467 ; RV64I-NEXT:    ret
8469 ; RV32ID-ILP32-LABEL: fcvt_w_h_sat_sext:
8470 ; RV32ID-ILP32:       # %bb.0: # %start
8471 ; RV32ID-ILP32-NEXT:    addi sp, sp, -16
8472 ; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
8473 ; RV32ID-ILP32-NEXT:    call __extendhfsf2
8474 ; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
8475 ; RV32ID-ILP32-NEXT:    fcvt.w.s a0, fa5, rtz
8476 ; RV32ID-ILP32-NEXT:    feq.s a1, fa5, fa5
8477 ; RV32ID-ILP32-NEXT:    seqz a1, a1
8478 ; RV32ID-ILP32-NEXT:    addi a1, a1, -1
8479 ; RV32ID-ILP32-NEXT:    and a0, a1, a0
8480 ; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
8481 ; RV32ID-ILP32-NEXT:    addi sp, sp, 16
8482 ; RV32ID-ILP32-NEXT:    ret
8484 ; RV64ID-LP64-LABEL: fcvt_w_h_sat_sext:
8485 ; RV64ID-LP64:       # %bb.0: # %start
8486 ; RV64ID-LP64-NEXT:    addi sp, sp, -16
8487 ; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8488 ; RV64ID-LP64-NEXT:    call __extendhfsf2
8489 ; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
8490 ; RV64ID-LP64-NEXT:    fcvt.w.s a0, fa5, rtz
8491 ; RV64ID-LP64-NEXT:    feq.s a1, fa5, fa5
8492 ; RV64ID-LP64-NEXT:    seqz a1, a1
8493 ; RV64ID-LP64-NEXT:    addi a1, a1, -1
8494 ; RV64ID-LP64-NEXT:    and a0, a1, a0
8495 ; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8496 ; RV64ID-LP64-NEXT:    addi sp, sp, 16
8497 ; RV64ID-LP64-NEXT:    ret
8499 ; RV32ID-LABEL: fcvt_w_h_sat_sext:
8500 ; RV32ID:       # %bb.0: # %start
8501 ; RV32ID-NEXT:    addi sp, sp, -16
8502 ; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
8503 ; RV32ID-NEXT:    call __extendhfsf2
8504 ; RV32ID-NEXT:    fcvt.w.s a0, fa0, rtz
8505 ; RV32ID-NEXT:    feq.s a1, fa0, fa0
8506 ; RV32ID-NEXT:    seqz a1, a1
8507 ; RV32ID-NEXT:    addi a1, a1, -1
8508 ; RV32ID-NEXT:    and a0, a1, a0
8509 ; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
8510 ; RV32ID-NEXT:    addi sp, sp, 16
8511 ; RV32ID-NEXT:    ret
8513 ; RV64ID-LABEL: fcvt_w_h_sat_sext:
8514 ; RV64ID:       # %bb.0: # %start
8515 ; RV64ID-NEXT:    addi sp, sp, -16
8516 ; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8517 ; RV64ID-NEXT:    call __extendhfsf2
8518 ; RV64ID-NEXT:    fcvt.w.s a0, fa0, rtz
8519 ; RV64ID-NEXT:    feq.s a1, fa0, fa0
8520 ; RV64ID-NEXT:    seqz a1, a1
8521 ; RV64ID-NEXT:    addi a1, a1, -1
8522 ; RV64ID-NEXT:    and a0, a1, a0
8523 ; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8524 ; RV64ID-NEXT:    addi sp, sp, 16
8525 ; RV64ID-NEXT:    ret
8527 ; CHECK32-IZFHMIN-LABEL: fcvt_w_h_sat_sext:
8528 ; CHECK32-IZFHMIN:       # %bb.0: # %start
8529 ; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
8530 ; CHECK32-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
8531 ; CHECK32-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
8532 ; CHECK32-IZFHMIN-NEXT:    seqz a1, a1
8533 ; CHECK32-IZFHMIN-NEXT:    addi a1, a1, -1
8534 ; CHECK32-IZFHMIN-NEXT:    and a0, a1, a0
8535 ; CHECK32-IZFHMIN-NEXT:    ret
8537 ; CHECK64-IZFHMIN-LABEL: fcvt_w_h_sat_sext:
8538 ; CHECK64-IZFHMIN:       # %bb.0: # %start
8539 ; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa5, fa0
8540 ; CHECK64-IZFHMIN-NEXT:    fcvt.w.s a0, fa5, rtz
8541 ; CHECK64-IZFHMIN-NEXT:    feq.s a1, fa5, fa5
8542 ; CHECK64-IZFHMIN-NEXT:    seqz a1, a1
8543 ; CHECK64-IZFHMIN-NEXT:    addi a1, a1, -1
8544 ; CHECK64-IZFHMIN-NEXT:    and a0, a1, a0
8545 ; CHECK64-IZFHMIN-NEXT:    ret
8547 ; CHECK32-IZHINXMIN-LABEL: fcvt_w_h_sat_sext:
8548 ; CHECK32-IZHINXMIN:       # %bb.0: # %start
8549 ; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
8550 ; CHECK32-IZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
8551 ; CHECK32-IZHINXMIN-NEXT:    feq.s a0, a0, a0
8552 ; CHECK32-IZHINXMIN-NEXT:    seqz a0, a0
8553 ; CHECK32-IZHINXMIN-NEXT:    addi a0, a0, -1
8554 ; CHECK32-IZHINXMIN-NEXT:    and a0, a0, a1
8555 ; CHECK32-IZHINXMIN-NEXT:    ret
8557 ; CHECK64-IZHINXMIN-LABEL: fcvt_w_h_sat_sext:
8558 ; CHECK64-IZHINXMIN:       # %bb.0: # %start
8559 ; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
8560 ; CHECK64-IZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
8561 ; CHECK64-IZHINXMIN-NEXT:    feq.s a0, a0, a0
8562 ; CHECK64-IZHINXMIN-NEXT:    seqz a0, a0
8563 ; CHECK64-IZHINXMIN-NEXT:    addi a0, a0, -1
8564 ; CHECK64-IZHINXMIN-NEXT:    and a0, a0, a1
8565 ; CHECK64-IZHINXMIN-NEXT:    ret
8567 ; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat_sext:
8568 ; CHECK32-IZDINXZHINXMIN:       # %bb.0: # %start
8569 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
8570 ; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
8571 ; CHECK32-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
8572 ; CHECK32-IZDINXZHINXMIN-NEXT:    seqz a0, a0
8573 ; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
8574 ; CHECK32-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
8575 ; CHECK32-IZDINXZHINXMIN-NEXT:    ret
8577 ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat_sext:
8578 ; CHECK64-IZDINXZHINXMIN:       # %bb.0: # %start
8579 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
8580 ; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.w.s a1, a0, rtz
8581 ; CHECK64-IZDINXZHINXMIN-NEXT:    feq.s a0, a0, a0
8582 ; CHECK64-IZDINXZHINXMIN-NEXT:    seqz a0, a0
8583 ; CHECK64-IZDINXZHINXMIN-NEXT:    addi a0, a0, -1
8584 ; CHECK64-IZDINXZHINXMIN-NEXT:    and a0, a0, a1
8585 ; CHECK64-IZDINXZHINXMIN-NEXT:    ret
8586 start:
8587   %0 = tail call i32 @llvm.fptosi.sat.i32.f16(half %a)
8588   ret i32 %0