xref: /llvm-project/llvm/test/CodeGen/RISCV/half-convert.ll (revision 839c8217b989a22908fdd1ec48105ff22d655fb2)
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
46
47define 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
52;
53; RV64IZFH-LABEL: fcvt_si_h:
54; RV64IZFH:       # %bb.0:
55; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
56; RV64IZFH-NEXT:    ret
57;
58; RV32IDZFH-LABEL: fcvt_si_h:
59; RV32IDZFH:       # %bb.0:
60; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
61; RV32IDZFH-NEXT:    ret
62;
63; RV64IDZFH-LABEL: fcvt_si_h:
64; RV64IDZFH:       # %bb.0:
65; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
66; RV64IDZFH-NEXT:    ret
67;
68; RV32IZHINX-LABEL: fcvt_si_h:
69; RV32IZHINX:       # %bb.0:
70; RV32IZHINX-NEXT:    fcvt.w.h a0, a0, rtz
71; RV32IZHINX-NEXT:    ret
72;
73; RV64IZHINX-LABEL: fcvt_si_h:
74; RV64IZHINX:       # %bb.0:
75; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
76; RV64IZHINX-NEXT:    ret
77;
78; RV32IZDINXZHINX-LABEL: fcvt_si_h:
79; RV32IZDINXZHINX:       # %bb.0:
80; RV32IZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
81; RV32IZDINXZHINX-NEXT:    ret
82;
83; RV64IZDINXZHINX-LABEL: fcvt_si_h:
84; RV64IZDINXZHINX:       # %bb.0:
85; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
86; RV64IZDINXZHINX-NEXT:    ret
87;
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
99;
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
111;
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
122;
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
133;
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
143;
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
153;
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
159;
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
165;
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
171;
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
177;
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
183;
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
191}
192
193define 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
208;
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
223;
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
238;
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
253;
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
267;
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
281;
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
295;
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
309;
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
352;
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
395;
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
415;
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
435;
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
454;
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
473;
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
488;
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
503;
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
517;
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
531;
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
545;
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
559start:
560  %0 = tail call i16 @llvm.fptosi.sat.i16.f16(half %a)
561  ret i16 %0
562}
563declare i16 @llvm.fptosi.sat.i16.f16(half)
564
565define 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
570;
571; RV64IZFH-LABEL: fcvt_ui_h:
572; RV64IZFH:       # %bb.0:
573; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
574; RV64IZFH-NEXT:    ret
575;
576; RV32IDZFH-LABEL: fcvt_ui_h:
577; RV32IDZFH:       # %bb.0:
578; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
579; RV32IDZFH-NEXT:    ret
580;
581; RV64IDZFH-LABEL: fcvt_ui_h:
582; RV64IDZFH:       # %bb.0:
583; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
584; RV64IDZFH-NEXT:    ret
585;
586; RV32IZHINX-LABEL: fcvt_ui_h:
587; RV32IZHINX:       # %bb.0:
588; RV32IZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
589; RV32IZHINX-NEXT:    ret
590;
591; RV64IZHINX-LABEL: fcvt_ui_h:
592; RV64IZHINX:       # %bb.0:
593; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
594; RV64IZHINX-NEXT:    ret
595;
596; RV32IZDINXZHINX-LABEL: fcvt_ui_h:
597; RV32IZDINXZHINX:       # %bb.0:
598; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
599; RV32IZDINXZHINX-NEXT:    ret
600;
601; RV64IZDINXZHINX-LABEL: fcvt_ui_h:
602; RV64IZDINXZHINX:       # %bb.0:
603; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
604; RV64IZDINXZHINX-NEXT:    ret
605;
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
617;
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
629;
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
640;
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
651;
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
661;
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
671;
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
677;
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
683;
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
689;
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
695;
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
701;
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
709}
710
711define 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
722;
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
733;
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
744;
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
755;
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
765;
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
775;
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
785;
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
795;
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
833;
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
871;
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
887;
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
903;
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
918;
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
933;
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
944;
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
955;
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
965;
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
975;
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
985;
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
995start:
996  %0 = tail call i16 @llvm.fptoui.sat.i16.f16(half %a)
997  ret i16 %0
998}
999declare i16 @llvm.fptoui.sat.i16.f16(half)
1000
1001define 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
1006;
1007; RV32IDZFH-LABEL: fcvt_w_h:
1008; RV32IDZFH:       # %bb.0:
1009; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1010; RV32IDZFH-NEXT:    ret
1011;
1012; RV64IDZFH-LABEL: fcvt_w_h:
1013; RV64IDZFH:       # %bb.0:
1014; RV64IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
1015; RV64IDZFH-NEXT:    ret
1016;
1017; CHECKIZHINX-LABEL: fcvt_w_h:
1018; CHECKIZHINX:       # %bb.0:
1019; CHECKIZHINX-NEXT:    fcvt.w.h a0, a0, rtz
1020; CHECKIZHINX-NEXT:    ret
1021;
1022; CHECKIZDINXZHINX-LABEL: fcvt_w_h:
1023; CHECKIZDINXZHINX:       # %bb.0:
1024; CHECKIZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
1025; CHECKIZDINXZHINX-NEXT:    ret
1026;
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
1038;
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
1050;
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
1061;
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
1072;
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
1082;
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
1092;
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
1098;
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
1104;
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
1110;
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
1116;
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
1122;
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
1130}
1131
1132define 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
1141;
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
1150;
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
1159;
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
1168;
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
1177;
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
1222;
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
1267;
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
1282;
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
1297;
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
1311;
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
1325;
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
1335;
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
1345;
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
1355;
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
1365;
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
1375;
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
1385start:
1386  %0 = tail call i32 @llvm.fptosi.sat.i32.f16(half %a)
1387  ret i32 %0
1388}
1389declare i32 @llvm.fptosi.sat.i32.f16(half)
1390
1391define 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
1396;
1397; RV32IDZFH-LABEL: fcvt_wu_h:
1398; RV32IDZFH:       # %bb.0:
1399; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1400; RV32IDZFH-NEXT:    ret
1401;
1402; RV64IDZFH-LABEL: fcvt_wu_h:
1403; RV64IDZFH:       # %bb.0:
1404; RV64IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
1405; RV64IDZFH-NEXT:    ret
1406;
1407; CHECKIZHINX-LABEL: fcvt_wu_h:
1408; CHECKIZHINX:       # %bb.0:
1409; CHECKIZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
1410; CHECKIZHINX-NEXT:    ret
1411;
1412; CHECKIZDINXZHINX-LABEL: fcvt_wu_h:
1413; CHECKIZDINXZHINX:       # %bb.0:
1414; CHECKIZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
1415; CHECKIZDINXZHINX-NEXT:    ret
1416;
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
1428;
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
1440;
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
1451;
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
1462;
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
1472;
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
1482;
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
1488;
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
1494;
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
1500;
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
1506;
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
1512;
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
1520}
1521
1522; Test where the fptoui has multiple uses, one of which causes a sext to be
1523; inserted on RV64.
1524define 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
1531;
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
1538;
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
1545;
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
1552;
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
1559;
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
1573;
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
1587;
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
1600;
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
1613;
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
1625;
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
1637;
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
1645;
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
1653;
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
1661;
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
1669;
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
1677;
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
1689}
1690
1691define 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
1700;
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
1711;
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
1720;
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
1731;
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
1740;
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
1751;
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
1760;
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
1771;
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
1803;
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
1841;
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
1856;
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
1873;
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
1887;
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
1903;
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
1913;
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
1925;
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
1935;
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
1947;
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
1957;
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
1969start:
1970  %0 = tail call i32 @llvm.fptoui.sat.i32.f16(half %a)
1971  ret i32 %0
1972}
1973declare i32 @llvm.fptoui.sat.i32.f16(half)
1974
1975define 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
1984;
1985; RV64IZFH-LABEL: fcvt_l_h:
1986; RV64IZFH:       # %bb.0:
1987; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
1988; RV64IZFH-NEXT:    ret
1989;
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
1998;
1999; RV64IDZFH-LABEL: fcvt_l_h:
2000; RV64IDZFH:       # %bb.0:
2001; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
2002; RV64IDZFH-NEXT:    ret
2003;
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
2012;
2013; RV64IZHINX-LABEL: fcvt_l_h:
2014; RV64IZHINX:       # %bb.0:
2015; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
2016; RV64IZHINX-NEXT:    ret
2017;
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
2026;
2027; RV64IZDINXZHINX-LABEL: fcvt_l_h:
2028; RV64IZDINXZHINX:       # %bb.0:
2029; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
2030; RV64IZDINXZHINX-NEXT:    ret
2031;
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
2041;
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
2053;
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
2063;
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
2074;
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
2084;
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
2094;
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
2103;
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
2109;
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
2118;
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
2124;
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
2133;
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
2141}
2142
2143define 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
2182;
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
2191;
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
2230;
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
2239;
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
2277;
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
2286;
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
2324;
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
2333;
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
2389;
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
2434;
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
2474;
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
2489;
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
2528;
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
2542;
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
2581;
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
2591;
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
2630;
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
2668;
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
2678;
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
2716;
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
2726start:
2727  %0 = tail call i64 @llvm.fptosi.sat.i64.f16(half %a)
2728  ret i64 %0
2729}
2730declare i64 @llvm.fptosi.sat.i64.f16(half)
2731
2732define 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
2741;
2742; RV64IZFH-LABEL: fcvt_lu_h:
2743; RV64IZFH:       # %bb.0:
2744; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
2745; RV64IZFH-NEXT:    ret
2746;
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
2755;
2756; RV64IDZFH-LABEL: fcvt_lu_h:
2757; RV64IDZFH:       # %bb.0:
2758; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
2759; RV64IDZFH-NEXT:    ret
2760;
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
2769;
2770; RV64IZHINX-LABEL: fcvt_lu_h:
2771; RV64IZHINX:       # %bb.0:
2772; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
2773; RV64IZHINX-NEXT:    ret
2774;
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
2783;
2784; RV64IZDINXZHINX-LABEL: fcvt_lu_h:
2785; RV64IZDINXZHINX:       # %bb.0:
2786; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
2787; RV64IZDINXZHINX-NEXT:    ret
2788;
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
2798;
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
2810;
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
2820;
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
2831;
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
2841;
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
2851;
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
2860;
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
2866;
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
2875;
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
2881;
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
2890;
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
2898}
2899
2900define 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
2925;
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
2934;
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
2959;
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
2968;
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
2992;
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
3001;
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
3025;
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
3034;
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
3066;
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
3098;
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
3124;
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
3139;
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
3164;
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
3178;
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
3203;
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
3213;
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
3237;
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
3247;
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
3271;
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
3281start:
3282  %0 = tail call i64 @llvm.fptoui.sat.i64.f16(half %a)
3283  ret i64 %0
3284}
3285declare i64 @llvm.fptoui.sat.i64.f16(half)
3286
3287define 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
3294;
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
3301;
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
3308;
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
3315;
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
3322;
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
3329;
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
3336;
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
3343;
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
3355;
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
3367;
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
3382;
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
3397;
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
3413;
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
3429;
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
3437;
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
3445;
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
3453;
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
3461;
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
3469;
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
3479}
3480
3481define 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
3486;
3487; RV32IDZFH-LABEL: fcvt_h_si_signext:
3488; RV32IDZFH:       # %bb.0:
3489; RV32IDZFH-NEXT:    fcvt.h.w fa0, a0
3490; RV32IDZFH-NEXT:    ret
3491;
3492; RV64IDZFH-LABEL: fcvt_h_si_signext:
3493; RV64IDZFH:       # %bb.0:
3494; RV64IDZFH-NEXT:    fcvt.h.w fa0, a0
3495; RV64IDZFH-NEXT:    ret
3496;
3497; CHECKIZHINX-LABEL: fcvt_h_si_signext:
3498; CHECKIZHINX:       # %bb.0:
3499; CHECKIZHINX-NEXT:    fcvt.h.w a0, a0
3500; CHECKIZHINX-NEXT:    ret
3501;
3502; CHECKIZDINXZHINX-LABEL: fcvt_h_si_signext:
3503; CHECKIZDINXZHINX:       # %bb.0:
3504; CHECKIZDINXZHINX-NEXT:    fcvt.h.w a0, a0
3505; CHECKIZDINXZHINX-NEXT:    ret
3506;
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
3516;
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
3526;
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
3539;
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
3552;
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
3566;
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
3580;
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
3586;
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
3592;
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
3598;
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
3604;
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
3610;
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
3618}
3619
3620define 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
3627;
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
3634;
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
3641;
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
3648;
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
3655;
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
3662;
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
3669;
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
3676;
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
3688;
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
3700;
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
3715;
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
3730;
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
3746;
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
3762;
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
3770;
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
3778;
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
3786;
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
3794;
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
3802;
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
3812}
3813
3814define 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
3819;
3820; RV32IDZFH-LABEL: fcvt_h_ui_zeroext:
3821; RV32IDZFH:       # %bb.0:
3822; RV32IDZFH-NEXT:    fcvt.h.wu fa0, a0
3823; RV32IDZFH-NEXT:    ret
3824;
3825; RV64IDZFH-LABEL: fcvt_h_ui_zeroext:
3826; RV64IDZFH:       # %bb.0:
3827; RV64IDZFH-NEXT:    fcvt.h.wu fa0, a0
3828; RV64IDZFH-NEXT:    ret
3829;
3830; CHECKIZHINX-LABEL: fcvt_h_ui_zeroext:
3831; CHECKIZHINX:       # %bb.0:
3832; CHECKIZHINX-NEXT:    fcvt.h.wu a0, a0
3833; CHECKIZHINX-NEXT:    ret
3834;
3835; CHECKIZDINXZHINX-LABEL: fcvt_h_ui_zeroext:
3836; CHECKIZDINXZHINX:       # %bb.0:
3837; CHECKIZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
3838; CHECKIZDINXZHINX-NEXT:    ret
3839;
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
3849;
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
3859;
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
3872;
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
3885;
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
3899;
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
3913;
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
3919;
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
3925;
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
3931;
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
3937;
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
3943;
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
3951}
3952
3953define 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
3958;
3959; RV32IDZFH-LABEL: fcvt_h_w:
3960; RV32IDZFH:       # %bb.0:
3961; RV32IDZFH-NEXT:    fcvt.h.w fa0, a0
3962; RV32IDZFH-NEXT:    ret
3963;
3964; RV64IDZFH-LABEL: fcvt_h_w:
3965; RV64IDZFH:       # %bb.0:
3966; RV64IDZFH-NEXT:    fcvt.h.w fa0, a0
3967; RV64IDZFH-NEXT:    ret
3968;
3969; CHECKIZHINX-LABEL: fcvt_h_w:
3970; CHECKIZHINX:       # %bb.0:
3971; CHECKIZHINX-NEXT:    fcvt.h.w a0, a0
3972; CHECKIZHINX-NEXT:    ret
3973;
3974; CHECKIZDINXZHINX-LABEL: fcvt_h_w:
3975; CHECKIZDINXZHINX:       # %bb.0:
3976; CHECKIZDINXZHINX-NEXT:    fcvt.h.w a0, a0
3977; CHECKIZDINXZHINX-NEXT:    ret
3978;
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
3988;
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
3999;
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
4012;
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
4025;
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
4039;
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
4053;
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
4059;
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
4065;
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
4071;
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
4077;
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
4083;
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
4091}
4092
4093define 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
4099;
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
4105;
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
4111;
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
4117;
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
4123;
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
4134;
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
4145;
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
4159;
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
4173;
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
4188;
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
4203;
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
4210;
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
4217;
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
4224;
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
4231;
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
4238;
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
4248}
4249
4250define 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
4255;
4256; RV32IDZFH-LABEL: fcvt_h_wu:
4257; RV32IDZFH:       # %bb.0:
4258; RV32IDZFH-NEXT:    fcvt.h.wu fa0, a0
4259; RV32IDZFH-NEXT:    ret
4260;
4261; RV64IDZFH-LABEL: fcvt_h_wu:
4262; RV64IDZFH:       # %bb.0:
4263; RV64IDZFH-NEXT:    fcvt.h.wu fa0, a0
4264; RV64IDZFH-NEXT:    ret
4265;
4266; CHECKIZHINX-LABEL: fcvt_h_wu:
4267; CHECKIZHINX:       # %bb.0:
4268; CHECKIZHINX-NEXT:    fcvt.h.wu a0, a0
4269; CHECKIZHINX-NEXT:    ret
4270;
4271; CHECKIZDINXZHINX-LABEL: fcvt_h_wu:
4272; CHECKIZDINXZHINX:       # %bb.0:
4273; CHECKIZDINXZHINX-NEXT:    fcvt.h.wu a0, a0
4274; CHECKIZDINXZHINX-NEXT:    ret
4275;
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
4285;
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
4296;
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
4309;
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
4322;
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
4336;
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
4350;
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
4356;
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
4362;
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
4368;
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
4374;
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
4380;
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
4388}
4389
4390define 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
4396;
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
4402;
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
4408;
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
4414;
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
4420;
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
4426;
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
4432;
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
4438;
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
4449;
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
4460;
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
4474;
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
4488;
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
4503;
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
4518;
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
4525;
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
4532;
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
4539;
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
4546;
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
4553;
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
4563}
4564
4565define 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
4574;
4575; RV64IZFH-LABEL: fcvt_h_l:
4576; RV64IZFH:       # %bb.0:
4577; RV64IZFH-NEXT:    fcvt.h.l fa0, a0
4578; RV64IZFH-NEXT:    ret
4579;
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
4588;
4589; RV64IDZFH-LABEL: fcvt_h_l:
4590; RV64IDZFH:       # %bb.0:
4591; RV64IDZFH-NEXT:    fcvt.h.l fa0, a0
4592; RV64IDZFH-NEXT:    ret
4593;
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
4602;
4603; RV64IZHINX-LABEL: fcvt_h_l:
4604; RV64IZHINX:       # %bb.0:
4605; RV64IZHINX-NEXT:    fcvt.h.l a0, a0
4606; RV64IZHINX-NEXT:    ret
4607;
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
4616;
4617; RV64IZDINXZHINX-LABEL: fcvt_h_l:
4618; RV64IZDINXZHINX:       # %bb.0:
4619; RV64IZDINXZHINX-NEXT:    fcvt.h.l a0, a0
4620; RV64IZDINXZHINX-NEXT:    ret
4621;
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
4631;
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
4641;
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
4653;
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
4666;
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
4680;
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
4694;
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
4703;
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
4709;
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
4718;
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
4724;
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
4733;
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
4741}
4742
4743define 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
4752;
4753; RV64IZFH-LABEL: fcvt_h_lu:
4754; RV64IZFH:       # %bb.0:
4755; RV64IZFH-NEXT:    fcvt.h.lu fa0, a0
4756; RV64IZFH-NEXT:    ret
4757;
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
4766;
4767; RV64IDZFH-LABEL: fcvt_h_lu:
4768; RV64IDZFH:       # %bb.0:
4769; RV64IDZFH-NEXT:    fcvt.h.lu fa0, a0
4770; RV64IDZFH-NEXT:    ret
4771;
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
4780;
4781; RV64IZHINX-LABEL: fcvt_h_lu:
4782; RV64IZHINX:       # %bb.0:
4783; RV64IZHINX-NEXT:    fcvt.h.lu a0, a0
4784; RV64IZHINX-NEXT:    ret
4785;
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
4794;
4795; RV64IZDINXZHINX-LABEL: fcvt_h_lu:
4796; RV64IZDINXZHINX:       # %bb.0:
4797; RV64IZDINXZHINX-NEXT:    fcvt.h.lu a0, a0
4798; RV64IZDINXZHINX-NEXT:    ret
4799;
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
4809;
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
4819;
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
4831;
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
4844;
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
4858;
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
4872;
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
4881;
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
4887;
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
4896;
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
4902;
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
4911;
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
4919}
4920
4921define 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
4926;
4927; RV32IDZFH-LABEL: fcvt_h_s:
4928; RV32IDZFH:       # %bb.0:
4929; RV32IDZFH-NEXT:    fcvt.h.s fa0, fa0
4930; RV32IDZFH-NEXT:    ret
4931;
4932; RV64IDZFH-LABEL: fcvt_h_s:
4933; RV64IDZFH:       # %bb.0:
4934; RV64IDZFH-NEXT:    fcvt.h.s fa0, fa0
4935; RV64IDZFH-NEXT:    ret
4936;
4937; CHECKIZHINX-LABEL: fcvt_h_s:
4938; CHECKIZHINX:       # %bb.0:
4939; CHECKIZHINX-NEXT:    fcvt.h.s a0, a0
4940; CHECKIZHINX-NEXT:    ret
4941;
4942; CHECKIZDINXZHINX-LABEL: fcvt_h_s:
4943; CHECKIZDINXZHINX:       # %bb.0:
4944; CHECKIZDINXZHINX-NEXT:    fcvt.h.s a0, a0
4945; CHECKIZDINXZHINX-NEXT:    ret
4946;
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
4955;
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
4964;
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
4975;
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
4986;
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
4999;
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
5012;
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
5017;
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
5022;
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
5027;
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
5032;
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
5037;
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
5044}
5045
5046define 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
5051;
5052; RV32IDZFH-LABEL: fcvt_s_h:
5053; RV32IDZFH:       # %bb.0:
5054; RV32IDZFH-NEXT:    fcvt.s.h fa0, fa0
5055; RV32IDZFH-NEXT:    ret
5056;
5057; RV64IDZFH-LABEL: fcvt_s_h:
5058; RV64IDZFH:       # %bb.0:
5059; RV64IDZFH-NEXT:    fcvt.s.h fa0, fa0
5060; RV64IDZFH-NEXT:    ret
5061;
5062; CHECKIZHINX-LABEL: fcvt_s_h:
5063; CHECKIZHINX:       # %bb.0:
5064; CHECKIZHINX-NEXT:    fcvt.s.h a0, a0
5065; CHECKIZHINX-NEXT:    ret
5066;
5067; CHECKIZDINXZHINX-LABEL: fcvt_s_h:
5068; CHECKIZDINXZHINX:       # %bb.0:
5069; CHECKIZDINXZHINX-NEXT:    fcvt.s.h a0, a0
5070; CHECKIZDINXZHINX-NEXT:    ret
5071;
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
5080;
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
5089;
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
5098;
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
5107;
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
5116;
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
5125;
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
5130;
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
5135;
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
5140;
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
5145;
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
5150;
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
5157}
5158
5159define 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
5168;
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
5177;
5178; RV32IDZFH-LABEL: fcvt_h_d:
5179; RV32IDZFH:       # %bb.0:
5180; RV32IDZFH-NEXT:    fcvt.h.d fa0, fa0
5181; RV32IDZFH-NEXT:    ret
5182;
5183; RV64IDZFH-LABEL: fcvt_h_d:
5184; RV64IDZFH:       # %bb.0:
5185; RV64IDZFH-NEXT:    fcvt.h.d fa0, fa0
5186; RV64IDZFH-NEXT:    ret
5187;
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
5196;
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
5205;
5206; CHECKIZDINXZHINX-LABEL: fcvt_h_d:
5207; CHECKIZDINXZHINX:       # %bb.0:
5208; CHECKIZDINXZHINX-NEXT:    fcvt.h.d a0, a0
5209; CHECKIZDINXZHINX-NEXT:    ret
5210;
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
5219;
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
5228;
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
5239;
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
5250;
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
5263;
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
5276;
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
5285;
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
5294;
5295; RV32IDZFHMIN-LABEL: fcvt_h_d:
5296; RV32IDZFHMIN:       # %bb.0:
5297; RV32IDZFHMIN-NEXT:    fcvt.h.d fa0, fa0
5298; RV32IDZFHMIN-NEXT:    ret
5299;
5300; RV64IDZFHMIN-LABEL: fcvt_h_d:
5301; RV64IDZFHMIN:       # %bb.0:
5302; RV64IDZFHMIN-NEXT:    fcvt.h.d fa0, fa0
5303; RV64IDZFHMIN-NEXT:    ret
5304;
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
5313;
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
5322;
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
5327;
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
5334}
5335
5336define 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
5346;
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
5356;
5357; RV32IDZFH-LABEL: fcvt_d_h:
5358; RV32IDZFH:       # %bb.0:
5359; RV32IDZFH-NEXT:    fcvt.d.h fa0, fa0
5360; RV32IDZFH-NEXT:    ret
5361;
5362; RV64IDZFH-LABEL: fcvt_d_h:
5363; RV64IDZFH:       # %bb.0:
5364; RV64IDZFH-NEXT:    fcvt.d.h fa0, fa0
5365; RV64IDZFH-NEXT:    ret
5366;
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
5376;
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
5386;
5387; CHECKIZDINXZHINX-LABEL: fcvt_d_h:
5388; CHECKIZDINXZHINX:       # %bb.0:
5389; CHECKIZDINXZHINX-NEXT:    fcvt.d.h a0, a0
5390; CHECKIZDINXZHINX-NEXT:    ret
5391;
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
5401;
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
5411;
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
5425;
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
5437;
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
5447;
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
5457;
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
5467;
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
5477;
5478; RV32IDZFHMIN-LABEL: fcvt_d_h:
5479; RV32IDZFHMIN:       # %bb.0:
5480; RV32IDZFHMIN-NEXT:    fcvt.d.h fa0, fa0
5481; RV32IDZFHMIN-NEXT:    ret
5482;
5483; RV64IDZFHMIN-LABEL: fcvt_d_h:
5484; RV64IDZFHMIN:       # %bb.0:
5485; RV64IDZFHMIN-NEXT:    fcvt.d.h fa0, fa0
5486; RV64IDZFHMIN-NEXT:    ret
5487;
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
5497;
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
5507;
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
5512;
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
5519}
5520
5521define 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
5526;
5527; RV32IDZFH-LABEL: bitcast_h_i16:
5528; RV32IDZFH:       # %bb.0:
5529; RV32IDZFH-NEXT:    fmv.h.x fa0, a0
5530; RV32IDZFH-NEXT:    ret
5531;
5532; RV64IDZFH-LABEL: bitcast_h_i16:
5533; RV64IDZFH:       # %bb.0:
5534; RV64IDZFH-NEXT:    fmv.h.x fa0, a0
5535; RV64IDZFH-NEXT:    ret
5536;
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
5541;
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
5546;
5547; RV32I-LABEL: bitcast_h_i16:
5548; RV32I:       # %bb.0:
5549; RV32I-NEXT:    ret
5550;
5551; RV64I-LABEL: bitcast_h_i16:
5552; RV64I:       # %bb.0:
5553; RV64I-NEXT:    ret
5554;
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
5560;
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
5566;
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
5573;
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
5580;
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
5585;
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
5590;
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
5595;
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
5600;
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
5605;
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
5612}
5613
5614define 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
5619;
5620; RV32IDZFH-LABEL: bitcast_i16_h:
5621; RV32IDZFH:       # %bb.0:
5622; RV32IDZFH-NEXT:    fmv.x.h a0, fa0
5623; RV32IDZFH-NEXT:    ret
5624;
5625; RV64IDZFH-LABEL: bitcast_i16_h:
5626; RV64IDZFH:       # %bb.0:
5627; RV64IDZFH-NEXT:    fmv.x.h a0, fa0
5628; RV64IDZFH-NEXT:    ret
5629;
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
5634;
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
5639;
5640; RV32I-LABEL: bitcast_i16_h:
5641; RV32I:       # %bb.0:
5642; RV32I-NEXT:    ret
5643;
5644; RV64I-LABEL: bitcast_i16_h:
5645; RV64I:       # %bb.0:
5646; RV64I-NEXT:    ret
5647;
5648; RV32ID-ILP32-LABEL: bitcast_i16_h:
5649; RV32ID-ILP32:       # %bb.0:
5650; RV32ID-ILP32-NEXT:    ret
5651;
5652; RV64ID-LP64-LABEL: bitcast_i16_h:
5653; RV64ID-LP64:       # %bb.0:
5654; RV64ID-LP64-NEXT:    ret
5655;
5656; RV32ID-LABEL: bitcast_i16_h:
5657; RV32ID:       # %bb.0:
5658; RV32ID-NEXT:    fmv.x.w a0, fa0
5659; RV32ID-NEXT:    ret
5660;
5661; RV64ID-LABEL: bitcast_i16_h:
5662; RV64ID:       # %bb.0:
5663; RV64ID-NEXT:    fmv.x.w a0, fa0
5664; RV64ID-NEXT:    ret
5665;
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
5670;
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
5675;
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
5680;
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
5685;
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
5690;
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
5697}
5698
5699; Make sure we select W version of addi on RV64.
5700define 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
5707;
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
5714;
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
5721;
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
5728;
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
5735;
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
5742;
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
5749;
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
5756;
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
5775;
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
5794;
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
5813;
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
5832;
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
5851;
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
5870;
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
5878;
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
5886;
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
5894;
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
5902;
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
5910;
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
5922}
5923
5924; Make sure we select W version of addi on RV64.
5925define 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
5932;
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
5939;
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
5946;
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
5953;
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
5960;
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
5967;
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
5974;
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
5981;
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
6000;
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
6019;
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
6038;
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
6057;
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
6076;
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
6095;
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
6103;
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
6111;
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
6119;
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
6127;
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
6135;
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
6147}
6148
6149define 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
6154;
6155; RV64IZFH-LABEL: fcvt_w_s_i16:
6156; RV64IZFH:       # %bb.0:
6157; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
6158; RV64IZFH-NEXT:    ret
6159;
6160; RV32IDZFH-LABEL: fcvt_w_s_i16:
6161; RV32IDZFH:       # %bb.0:
6162; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
6163; RV32IDZFH-NEXT:    ret
6164;
6165; RV64IDZFH-LABEL: fcvt_w_s_i16:
6166; RV64IDZFH:       # %bb.0:
6167; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
6168; RV64IDZFH-NEXT:    ret
6169;
6170; RV32IZHINX-LABEL: fcvt_w_s_i16:
6171; RV32IZHINX:       # %bb.0:
6172; RV32IZHINX-NEXT:    fcvt.w.h a0, a0, rtz
6173; RV32IZHINX-NEXT:    ret
6174;
6175; RV64IZHINX-LABEL: fcvt_w_s_i16:
6176; RV64IZHINX:       # %bb.0:
6177; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
6178; RV64IZHINX-NEXT:    ret
6179;
6180; RV32IZDINXZHINX-LABEL: fcvt_w_s_i16:
6181; RV32IZDINXZHINX:       # %bb.0:
6182; RV32IZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
6183; RV32IZDINXZHINX-NEXT:    ret
6184;
6185; RV64IZDINXZHINX-LABEL: fcvt_w_s_i16:
6186; RV64IZDINXZHINX:       # %bb.0:
6187; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
6188; RV64IZDINXZHINX-NEXT:    ret
6189;
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
6201;
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
6213;
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
6224;
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
6235;
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
6245;
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
6255;
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
6261;
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
6267;
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
6273;
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
6279;
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
6285;
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
6293}
6294
6295define 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
6310;
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
6325;
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
6340;
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
6355;
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
6369;
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
6383;
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
6397;
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
6411;
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
6456;
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
6501;
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
6521;
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
6541;
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
6560;
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
6579;
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
6594;
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
6609;
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
6623;
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
6637;
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
6651;
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
6665start:
6666  %0 = tail call i16 @llvm.fptosi.sat.i16.f16(half %a)
6667  ret i16 %0
6668}
6669
6670define 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
6675;
6676; RV64IZFH-LABEL: fcvt_wu_s_i16:
6677; RV64IZFH:       # %bb.0:
6678; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
6679; RV64IZFH-NEXT:    ret
6680;
6681; RV32IDZFH-LABEL: fcvt_wu_s_i16:
6682; RV32IDZFH:       # %bb.0:
6683; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
6684; RV32IDZFH-NEXT:    ret
6685;
6686; RV64IDZFH-LABEL: fcvt_wu_s_i16:
6687; RV64IDZFH:       # %bb.0:
6688; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
6689; RV64IDZFH-NEXT:    ret
6690;
6691; RV32IZHINX-LABEL: fcvt_wu_s_i16:
6692; RV32IZHINX:       # %bb.0:
6693; RV32IZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
6694; RV32IZHINX-NEXT:    ret
6695;
6696; RV64IZHINX-LABEL: fcvt_wu_s_i16:
6697; RV64IZHINX:       # %bb.0:
6698; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
6699; RV64IZHINX-NEXT:    ret
6700;
6701; RV32IZDINXZHINX-LABEL: fcvt_wu_s_i16:
6702; RV32IZDINXZHINX:       # %bb.0:
6703; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
6704; RV32IZDINXZHINX-NEXT:    ret
6705;
6706; RV64IZDINXZHINX-LABEL: fcvt_wu_s_i16:
6707; RV64IZDINXZHINX:       # %bb.0:
6708; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
6709; RV64IZDINXZHINX-NEXT:    ret
6710;
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
6722;
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
6734;
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
6745;
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
6756;
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
6766;
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
6776;
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
6782;
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
6788;
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
6794;
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
6800;
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
6806;
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
6814}
6815
6816define 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
6827;
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
6838;
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
6849;
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
6860;
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
6870;
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
6880;
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
6890;
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
6900;
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
6941;
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
6982;
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
6998;
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
7014;
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
7029;
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
7044;
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
7055;
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
7066;
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
7076;
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
7086;
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
7096;
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
7106start:
7107  %0 = tail call i16 @llvm.fptoui.sat.i16.f16(half %a)
7108  ret i16 %0
7109}
7110
7111define 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
7116;
7117; RV64IZFH-LABEL: fcvt_w_s_i8:
7118; RV64IZFH:       # %bb.0:
7119; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
7120; RV64IZFH-NEXT:    ret
7121;
7122; RV32IDZFH-LABEL: fcvt_w_s_i8:
7123; RV32IDZFH:       # %bb.0:
7124; RV32IDZFH-NEXT:    fcvt.w.h a0, fa0, rtz
7125; RV32IDZFH-NEXT:    ret
7126;
7127; RV64IDZFH-LABEL: fcvt_w_s_i8:
7128; RV64IDZFH:       # %bb.0:
7129; RV64IDZFH-NEXT:    fcvt.l.h a0, fa0, rtz
7130; RV64IDZFH-NEXT:    ret
7131;
7132; RV32IZHINX-LABEL: fcvt_w_s_i8:
7133; RV32IZHINX:       # %bb.0:
7134; RV32IZHINX-NEXT:    fcvt.w.h a0, a0, rtz
7135; RV32IZHINX-NEXT:    ret
7136;
7137; RV64IZHINX-LABEL: fcvt_w_s_i8:
7138; RV64IZHINX:       # %bb.0:
7139; RV64IZHINX-NEXT:    fcvt.l.h a0, a0, rtz
7140; RV64IZHINX-NEXT:    ret
7141;
7142; RV32IZDINXZHINX-LABEL: fcvt_w_s_i8:
7143; RV32IZDINXZHINX:       # %bb.0:
7144; RV32IZDINXZHINX-NEXT:    fcvt.w.h a0, a0, rtz
7145; RV32IZDINXZHINX-NEXT:    ret
7146;
7147; RV64IZDINXZHINX-LABEL: fcvt_w_s_i8:
7148; RV64IZDINXZHINX:       # %bb.0:
7149; RV64IZDINXZHINX-NEXT:    fcvt.l.h a0, a0, rtz
7150; RV64IZDINXZHINX-NEXT:    ret
7151;
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
7163;
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
7175;
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
7186;
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
7197;
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
7207;
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
7217;
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
7223;
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
7229;
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
7235;
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
7241;
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
7247;
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
7255}
7256
7257define 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
7272;
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
7287;
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
7302;
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
7317;
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
7330;
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
7343;
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
7356;
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
7369;
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
7412;
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
7455;
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
7475;
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
7495;
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
7514;
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
7533;
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
7548;
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
7563;
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
7576;
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
7589;
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
7602;
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
7615start:
7616  %0 = tail call i8 @llvm.fptosi.sat.i8.f16(half %a)
7617  ret i8 %0
7618}
7619declare i8 @llvm.fptosi.sat.i8.f16(half)
7620
7621define 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
7626;
7627; RV64IZFH-LABEL: fcvt_wu_s_i8:
7628; RV64IZFH:       # %bb.0:
7629; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
7630; RV64IZFH-NEXT:    ret
7631;
7632; RV32IDZFH-LABEL: fcvt_wu_s_i8:
7633; RV32IDZFH:       # %bb.0:
7634; RV32IDZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
7635; RV32IDZFH-NEXT:    ret
7636;
7637; RV64IDZFH-LABEL: fcvt_wu_s_i8:
7638; RV64IDZFH:       # %bb.0:
7639; RV64IDZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
7640; RV64IDZFH-NEXT:    ret
7641;
7642; RV32IZHINX-LABEL: fcvt_wu_s_i8:
7643; RV32IZHINX:       # %bb.0:
7644; RV32IZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
7645; RV32IZHINX-NEXT:    ret
7646;
7647; RV64IZHINX-LABEL: fcvt_wu_s_i8:
7648; RV64IZHINX:       # %bb.0:
7649; RV64IZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
7650; RV64IZHINX-NEXT:    ret
7651;
7652; RV32IZDINXZHINX-LABEL: fcvt_wu_s_i8:
7653; RV32IZDINXZHINX:       # %bb.0:
7654; RV32IZDINXZHINX-NEXT:    fcvt.wu.h a0, a0, rtz
7655; RV32IZDINXZHINX-NEXT:    ret
7656;
7657; RV64IZDINXZHINX-LABEL: fcvt_wu_s_i8:
7658; RV64IZDINXZHINX:       # %bb.0:
7659; RV64IZDINXZHINX-NEXT:    fcvt.lu.h a0, a0, rtz
7660; RV64IZDINXZHINX-NEXT:    ret
7661;
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
7673;
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
7685;
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
7696;
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
7707;
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
7717;
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
7727;
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
7733;
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
7739;
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
7745;
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
7751;
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
7757;
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
7765}
7766
7767define 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
7778;
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
7789;
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
7800;
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
7811;
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
7820;
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
7829;
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
7838;
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
7847;
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
7884;
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
7921;
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
7937;
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
7953;
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
7968;
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
7983;
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
7994;
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
8005;
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
8014;
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
8023;
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
8032;
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
8041start:
8042  %0 = tail call i8 @llvm.fptoui.sat.i8.f16(half %a)
8043  ret i8 %0
8044}
8045declare i8 @llvm.fptoui.sat.i8.f16(half)
8046
8047define 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
8056;
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
8067;
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
8076;
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
8087;
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
8096;
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
8107;
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
8116;
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
8127;
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
8159;
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
8199;
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
8214;
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
8231;
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
8245;
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
8261;
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
8271;
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
8283;
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
8293;
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
8305;
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
8315;
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
8327start:
8328  %0 = tail call i32 @llvm.fptoui.sat.i32.f16(half %a)
8329  ret i32 %0
8330}
8331
8332define 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
8341;
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
8350;
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
8359;
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
8368;
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
8377;
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
8422;
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
8468;
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
8483;
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
8498;
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
8512;
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
8526;
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
8536;
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
8546;
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
8556;
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
8566;
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
8576;
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
8586start:
8587  %0 = tail call i32 @llvm.fptosi.sat.i32.f16(half %a)
8588  ret i32 %0
8589}
8590
8591; Test lib call lowering for fp128->half to make sure it matches the ABI.
8592define void @fcvt_h_q(fp128 %x, ptr %y) nounwind {
8593; RV32IZFH-LABEL: fcvt_h_q:
8594; RV32IZFH:       # %bb.0:
8595; RV32IZFH-NEXT:    addi sp, sp, -32
8596; RV32IZFH-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8597; RV32IZFH-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8598; RV32IZFH-NEXT:    lw a2, 0(a0)
8599; RV32IZFH-NEXT:    lw a3, 4(a0)
8600; RV32IZFH-NEXT:    lw a4, 8(a0)
8601; RV32IZFH-NEXT:    lw a5, 12(a0)
8602; RV32IZFH-NEXT:    mv s0, a1
8603; RV32IZFH-NEXT:    addi a0, sp, 8
8604; RV32IZFH-NEXT:    sw a2, 8(sp)
8605; RV32IZFH-NEXT:    sw a3, 12(sp)
8606; RV32IZFH-NEXT:    sw a4, 16(sp)
8607; RV32IZFH-NEXT:    sw a5, 20(sp)
8608; RV32IZFH-NEXT:    call __trunctfhf2
8609; RV32IZFH-NEXT:    fsh fa0, 0(s0)
8610; RV32IZFH-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8611; RV32IZFH-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8612; RV32IZFH-NEXT:    addi sp, sp, 32
8613; RV32IZFH-NEXT:    ret
8614;
8615; RV64IZFH-LABEL: fcvt_h_q:
8616; RV64IZFH:       # %bb.0:
8617; RV64IZFH-NEXT:    addi sp, sp, -16
8618; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8619; RV64IZFH-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8620; RV64IZFH-NEXT:    mv s0, a2
8621; RV64IZFH-NEXT:    call __trunctfhf2
8622; RV64IZFH-NEXT:    fsh fa0, 0(s0)
8623; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8624; RV64IZFH-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8625; RV64IZFH-NEXT:    addi sp, sp, 16
8626; RV64IZFH-NEXT:    ret
8627;
8628; RV32IDZFH-LABEL: fcvt_h_q:
8629; RV32IDZFH:       # %bb.0:
8630; RV32IDZFH-NEXT:    addi sp, sp, -32
8631; RV32IDZFH-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8632; RV32IDZFH-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8633; RV32IDZFH-NEXT:    lw a2, 0(a0)
8634; RV32IDZFH-NEXT:    lw a3, 4(a0)
8635; RV32IDZFH-NEXT:    lw a4, 8(a0)
8636; RV32IDZFH-NEXT:    lw a5, 12(a0)
8637; RV32IDZFH-NEXT:    mv s0, a1
8638; RV32IDZFH-NEXT:    addi a0, sp, 8
8639; RV32IDZFH-NEXT:    sw a2, 8(sp)
8640; RV32IDZFH-NEXT:    sw a3, 12(sp)
8641; RV32IDZFH-NEXT:    sw a4, 16(sp)
8642; RV32IDZFH-NEXT:    sw a5, 20(sp)
8643; RV32IDZFH-NEXT:    call __trunctfhf2
8644; RV32IDZFH-NEXT:    fsh fa0, 0(s0)
8645; RV32IDZFH-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8646; RV32IDZFH-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8647; RV32IDZFH-NEXT:    addi sp, sp, 32
8648; RV32IDZFH-NEXT:    ret
8649;
8650; RV64IDZFH-LABEL: fcvt_h_q:
8651; RV64IDZFH:       # %bb.0:
8652; RV64IDZFH-NEXT:    addi sp, sp, -16
8653; RV64IDZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8654; RV64IDZFH-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8655; RV64IDZFH-NEXT:    mv s0, a2
8656; RV64IDZFH-NEXT:    call __trunctfhf2
8657; RV64IDZFH-NEXT:    fsh fa0, 0(s0)
8658; RV64IDZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8659; RV64IDZFH-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8660; RV64IDZFH-NEXT:    addi sp, sp, 16
8661; RV64IDZFH-NEXT:    ret
8662;
8663; RV32IZHINX-LABEL: fcvt_h_q:
8664; RV32IZHINX:       # %bb.0:
8665; RV32IZHINX-NEXT:    addi sp, sp, -32
8666; RV32IZHINX-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8667; RV32IZHINX-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8668; RV32IZHINX-NEXT:    lw a2, 0(a0)
8669; RV32IZHINX-NEXT:    lw a3, 4(a0)
8670; RV32IZHINX-NEXT:    lw a4, 8(a0)
8671; RV32IZHINX-NEXT:    lw a5, 12(a0)
8672; RV32IZHINX-NEXT:    mv s0, a1
8673; RV32IZHINX-NEXT:    addi a0, sp, 8
8674; RV32IZHINX-NEXT:    sw a2, 8(sp)
8675; RV32IZHINX-NEXT:    sw a3, 12(sp)
8676; RV32IZHINX-NEXT:    sw a4, 16(sp)
8677; RV32IZHINX-NEXT:    sw a5, 20(sp)
8678; RV32IZHINX-NEXT:    call __trunctfhf2
8679; RV32IZHINX-NEXT:    sh a0, 0(s0)
8680; RV32IZHINX-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8681; RV32IZHINX-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8682; RV32IZHINX-NEXT:    addi sp, sp, 32
8683; RV32IZHINX-NEXT:    ret
8684;
8685; RV64IZHINX-LABEL: fcvt_h_q:
8686; RV64IZHINX:       # %bb.0:
8687; RV64IZHINX-NEXT:    addi sp, sp, -16
8688; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8689; RV64IZHINX-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8690; RV64IZHINX-NEXT:    mv s0, a2
8691; RV64IZHINX-NEXT:    call __trunctfhf2
8692; RV64IZHINX-NEXT:    sh a0, 0(s0)
8693; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8694; RV64IZHINX-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8695; RV64IZHINX-NEXT:    addi sp, sp, 16
8696; RV64IZHINX-NEXT:    ret
8697;
8698; RV32IZDINXZHINX-LABEL: fcvt_h_q:
8699; RV32IZDINXZHINX:       # %bb.0:
8700; RV32IZDINXZHINX-NEXT:    addi sp, sp, -32
8701; RV32IZDINXZHINX-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8702; RV32IZDINXZHINX-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8703; RV32IZDINXZHINX-NEXT:    lw a2, 0(a0)
8704; RV32IZDINXZHINX-NEXT:    lw a3, 4(a0)
8705; RV32IZDINXZHINX-NEXT:    lw a4, 8(a0)
8706; RV32IZDINXZHINX-NEXT:    lw a5, 12(a0)
8707; RV32IZDINXZHINX-NEXT:    mv s0, a1
8708; RV32IZDINXZHINX-NEXT:    addi a0, sp, 8
8709; RV32IZDINXZHINX-NEXT:    sw a2, 8(sp)
8710; RV32IZDINXZHINX-NEXT:    sw a3, 12(sp)
8711; RV32IZDINXZHINX-NEXT:    sw a4, 16(sp)
8712; RV32IZDINXZHINX-NEXT:    sw a5, 20(sp)
8713; RV32IZDINXZHINX-NEXT:    call __trunctfhf2
8714; RV32IZDINXZHINX-NEXT:    sh a0, 0(s0)
8715; RV32IZDINXZHINX-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8716; RV32IZDINXZHINX-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8717; RV32IZDINXZHINX-NEXT:    addi sp, sp, 32
8718; RV32IZDINXZHINX-NEXT:    ret
8719;
8720; RV64IZDINXZHINX-LABEL: fcvt_h_q:
8721; RV64IZDINXZHINX:       # %bb.0:
8722; RV64IZDINXZHINX-NEXT:    addi sp, sp, -16
8723; RV64IZDINXZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8724; RV64IZDINXZHINX-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8725; RV64IZDINXZHINX-NEXT:    mv s0, a2
8726; RV64IZDINXZHINX-NEXT:    call __trunctfhf2
8727; RV64IZDINXZHINX-NEXT:    sh a0, 0(s0)
8728; RV64IZDINXZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8729; RV64IZDINXZHINX-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8730; RV64IZDINXZHINX-NEXT:    addi sp, sp, 16
8731; RV64IZDINXZHINX-NEXT:    ret
8732;
8733; RV32I-LABEL: fcvt_h_q:
8734; RV32I:       # %bb.0:
8735; RV32I-NEXT:    addi sp, sp, -32
8736; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8737; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8738; RV32I-NEXT:    lw a2, 0(a0)
8739; RV32I-NEXT:    lw a3, 4(a0)
8740; RV32I-NEXT:    lw a4, 8(a0)
8741; RV32I-NEXT:    lw a5, 12(a0)
8742; RV32I-NEXT:    mv s0, a1
8743; RV32I-NEXT:    addi a0, sp, 8
8744; RV32I-NEXT:    sw a2, 8(sp)
8745; RV32I-NEXT:    sw a3, 12(sp)
8746; RV32I-NEXT:    sw a4, 16(sp)
8747; RV32I-NEXT:    sw a5, 20(sp)
8748; RV32I-NEXT:    call __trunctfhf2
8749; RV32I-NEXT:    sh a0, 0(s0)
8750; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8751; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8752; RV32I-NEXT:    addi sp, sp, 32
8753; RV32I-NEXT:    ret
8754;
8755; RV64I-LABEL: fcvt_h_q:
8756; RV64I:       # %bb.0:
8757; RV64I-NEXT:    addi sp, sp, -16
8758; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8759; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8760; RV64I-NEXT:    mv s0, a2
8761; RV64I-NEXT:    call __trunctfhf2
8762; RV64I-NEXT:    sh a0, 0(s0)
8763; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8764; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8765; RV64I-NEXT:    addi sp, sp, 16
8766; RV64I-NEXT:    ret
8767;
8768; RV32ID-ILP32-LABEL: fcvt_h_q:
8769; RV32ID-ILP32:       # %bb.0:
8770; RV32ID-ILP32-NEXT:    addi sp, sp, -32
8771; RV32ID-ILP32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8772; RV32ID-ILP32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8773; RV32ID-ILP32-NEXT:    lw a2, 0(a0)
8774; RV32ID-ILP32-NEXT:    lw a3, 4(a0)
8775; RV32ID-ILP32-NEXT:    lw a4, 8(a0)
8776; RV32ID-ILP32-NEXT:    lw a5, 12(a0)
8777; RV32ID-ILP32-NEXT:    mv s0, a1
8778; RV32ID-ILP32-NEXT:    addi a0, sp, 8
8779; RV32ID-ILP32-NEXT:    sw a2, 8(sp)
8780; RV32ID-ILP32-NEXT:    sw a3, 12(sp)
8781; RV32ID-ILP32-NEXT:    sw a4, 16(sp)
8782; RV32ID-ILP32-NEXT:    sw a5, 20(sp)
8783; RV32ID-ILP32-NEXT:    call __trunctfhf2
8784; RV32ID-ILP32-NEXT:    sh a0, 0(s0)
8785; RV32ID-ILP32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8786; RV32ID-ILP32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8787; RV32ID-ILP32-NEXT:    addi sp, sp, 32
8788; RV32ID-ILP32-NEXT:    ret
8789;
8790; RV64ID-LP64-LABEL: fcvt_h_q:
8791; RV64ID-LP64:       # %bb.0:
8792; RV64ID-LP64-NEXT:    addi sp, sp, -16
8793; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8794; RV64ID-LP64-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8795; RV64ID-LP64-NEXT:    mv s0, a2
8796; RV64ID-LP64-NEXT:    call __trunctfhf2
8797; RV64ID-LP64-NEXT:    sh a0, 0(s0)
8798; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8799; RV64ID-LP64-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8800; RV64ID-LP64-NEXT:    addi sp, sp, 16
8801; RV64ID-LP64-NEXT:    ret
8802;
8803; RV32ID-LABEL: fcvt_h_q:
8804; RV32ID:       # %bb.0:
8805; RV32ID-NEXT:    addi sp, sp, -32
8806; RV32ID-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8807; RV32ID-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8808; RV32ID-NEXT:    lw a2, 0(a0)
8809; RV32ID-NEXT:    lw a3, 4(a0)
8810; RV32ID-NEXT:    lw a4, 8(a0)
8811; RV32ID-NEXT:    lw a5, 12(a0)
8812; RV32ID-NEXT:    mv s0, a1
8813; RV32ID-NEXT:    addi a0, sp, 8
8814; RV32ID-NEXT:    sw a2, 8(sp)
8815; RV32ID-NEXT:    sw a3, 12(sp)
8816; RV32ID-NEXT:    sw a4, 16(sp)
8817; RV32ID-NEXT:    sw a5, 20(sp)
8818; RV32ID-NEXT:    call __trunctfhf2
8819; RV32ID-NEXT:    fmv.x.w a0, fa0
8820; RV32ID-NEXT:    sh a0, 0(s0)
8821; RV32ID-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8822; RV32ID-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8823; RV32ID-NEXT:    addi sp, sp, 32
8824; RV32ID-NEXT:    ret
8825;
8826; RV64ID-LABEL: fcvt_h_q:
8827; RV64ID:       # %bb.0:
8828; RV64ID-NEXT:    addi sp, sp, -16
8829; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8830; RV64ID-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8831; RV64ID-NEXT:    mv s0, a2
8832; RV64ID-NEXT:    call __trunctfhf2
8833; RV64ID-NEXT:    fmv.x.w a0, fa0
8834; RV64ID-NEXT:    sh a0, 0(s0)
8835; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8836; RV64ID-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8837; RV64ID-NEXT:    addi sp, sp, 16
8838; RV64ID-NEXT:    ret
8839;
8840; CHECK32-IZFHMIN-LABEL: fcvt_h_q:
8841; CHECK32-IZFHMIN:       # %bb.0:
8842; CHECK32-IZFHMIN-NEXT:    addi sp, sp, -32
8843; CHECK32-IZFHMIN-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8844; CHECK32-IZFHMIN-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8845; CHECK32-IZFHMIN-NEXT:    lw a2, 0(a0)
8846; CHECK32-IZFHMIN-NEXT:    lw a3, 4(a0)
8847; CHECK32-IZFHMIN-NEXT:    lw a4, 8(a0)
8848; CHECK32-IZFHMIN-NEXT:    lw a5, 12(a0)
8849; CHECK32-IZFHMIN-NEXT:    mv s0, a1
8850; CHECK32-IZFHMIN-NEXT:    addi a0, sp, 8
8851; CHECK32-IZFHMIN-NEXT:    sw a2, 8(sp)
8852; CHECK32-IZFHMIN-NEXT:    sw a3, 12(sp)
8853; CHECK32-IZFHMIN-NEXT:    sw a4, 16(sp)
8854; CHECK32-IZFHMIN-NEXT:    sw a5, 20(sp)
8855; CHECK32-IZFHMIN-NEXT:    call __trunctfhf2
8856; CHECK32-IZFHMIN-NEXT:    fsh fa0, 0(s0)
8857; CHECK32-IZFHMIN-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8858; CHECK32-IZFHMIN-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8859; CHECK32-IZFHMIN-NEXT:    addi sp, sp, 32
8860; CHECK32-IZFHMIN-NEXT:    ret
8861;
8862; CHECK64-IZFHMIN-LABEL: fcvt_h_q:
8863; CHECK64-IZFHMIN:       # %bb.0:
8864; CHECK64-IZFHMIN-NEXT:    addi sp, sp, -16
8865; CHECK64-IZFHMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8866; CHECK64-IZFHMIN-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8867; CHECK64-IZFHMIN-NEXT:    mv s0, a2
8868; CHECK64-IZFHMIN-NEXT:    call __trunctfhf2
8869; CHECK64-IZFHMIN-NEXT:    fsh fa0, 0(s0)
8870; CHECK64-IZFHMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8871; CHECK64-IZFHMIN-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8872; CHECK64-IZFHMIN-NEXT:    addi sp, sp, 16
8873; CHECK64-IZFHMIN-NEXT:    ret
8874;
8875; CHECK32-IZHINXMIN-LABEL: fcvt_h_q:
8876; CHECK32-IZHINXMIN:       # %bb.0:
8877; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -32
8878; CHECK32-IZHINXMIN-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8879; CHECK32-IZHINXMIN-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8880; CHECK32-IZHINXMIN-NEXT:    lw a2, 0(a0)
8881; CHECK32-IZHINXMIN-NEXT:    lw a3, 4(a0)
8882; CHECK32-IZHINXMIN-NEXT:    lw a4, 8(a0)
8883; CHECK32-IZHINXMIN-NEXT:    lw a5, 12(a0)
8884; CHECK32-IZHINXMIN-NEXT:    mv s0, a1
8885; CHECK32-IZHINXMIN-NEXT:    addi a0, sp, 8
8886; CHECK32-IZHINXMIN-NEXT:    sw a2, 8(sp)
8887; CHECK32-IZHINXMIN-NEXT:    sw a3, 12(sp)
8888; CHECK32-IZHINXMIN-NEXT:    sw a4, 16(sp)
8889; CHECK32-IZHINXMIN-NEXT:    sw a5, 20(sp)
8890; CHECK32-IZHINXMIN-NEXT:    call __trunctfhf2
8891; CHECK32-IZHINXMIN-NEXT:    sh a0, 0(s0)
8892; CHECK32-IZHINXMIN-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8893; CHECK32-IZHINXMIN-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8894; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 32
8895; CHECK32-IZHINXMIN-NEXT:    ret
8896;
8897; CHECK64-IZHINXMIN-LABEL: fcvt_h_q:
8898; CHECK64-IZHINXMIN:       # %bb.0:
8899; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, -16
8900; CHECK64-IZHINXMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8901; CHECK64-IZHINXMIN-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8902; CHECK64-IZHINXMIN-NEXT:    mv s0, a2
8903; CHECK64-IZHINXMIN-NEXT:    call __trunctfhf2
8904; CHECK64-IZHINXMIN-NEXT:    sh a0, 0(s0)
8905; CHECK64-IZHINXMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8906; CHECK64-IZHINXMIN-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8907; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, 16
8908; CHECK64-IZHINXMIN-NEXT:    ret
8909;
8910; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_q:
8911; CHECK32-IZDINXZHINXMIN:       # %bb.0:
8912; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -32
8913; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8914; CHECK32-IZDINXZHINXMIN-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8915; CHECK32-IZDINXZHINXMIN-NEXT:    lw a2, 0(a0)
8916; CHECK32-IZDINXZHINXMIN-NEXT:    lw a3, 4(a0)
8917; CHECK32-IZDINXZHINXMIN-NEXT:    lw a4, 8(a0)
8918; CHECK32-IZDINXZHINXMIN-NEXT:    lw a5, 12(a0)
8919; CHECK32-IZDINXZHINXMIN-NEXT:    mv s0, a1
8920; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, sp, 8
8921; CHECK32-IZDINXZHINXMIN-NEXT:    sw a2, 8(sp)
8922; CHECK32-IZDINXZHINXMIN-NEXT:    sw a3, 12(sp)
8923; CHECK32-IZDINXZHINXMIN-NEXT:    sw a4, 16(sp)
8924; CHECK32-IZDINXZHINXMIN-NEXT:    sw a5, 20(sp)
8925; CHECK32-IZDINXZHINXMIN-NEXT:    call __trunctfhf2
8926; CHECK32-IZDINXZHINXMIN-NEXT:    sh a0, 0(s0)
8927; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8928; CHECK32-IZDINXZHINXMIN-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8929; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 32
8930; CHECK32-IZDINXZHINXMIN-NEXT:    ret
8931;
8932; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_q:
8933; CHECK64-IZDINXZHINXMIN:       # %bb.0:
8934; CHECK64-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
8935; CHECK64-IZDINXZHINXMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8936; CHECK64-IZDINXZHINXMIN-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
8937; CHECK64-IZDINXZHINXMIN-NEXT:    mv s0, a2
8938; CHECK64-IZDINXZHINXMIN-NEXT:    call __trunctfhf2
8939; CHECK64-IZDINXZHINXMIN-NEXT:    sh a0, 0(s0)
8940; CHECK64-IZDINXZHINXMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8941; CHECK64-IZDINXZHINXMIN-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
8942; CHECK64-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
8943; CHECK64-IZDINXZHINXMIN-NEXT:    ret
8944  %a = fptrunc fp128 %x to half
8945  store half %a, ptr %y
8946  ret void
8947}
8948
8949; Test lib call lowering for half->fp128 to make sure it follows the ABI.
8950define fp128 @fcvt_q_h(ptr %x) {
8951; RV32IZFH-LABEL: fcvt_q_h:
8952; RV32IZFH:       # %bb.0:
8953; RV32IZFH-NEXT:    addi sp, sp, -32
8954; RV32IZFH-NEXT:    .cfi_def_cfa_offset 32
8955; RV32IZFH-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8956; RV32IZFH-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8957; RV32IZFH-NEXT:    .cfi_offset ra, -4
8958; RV32IZFH-NEXT:    .cfi_offset s0, -8
8959; RV32IZFH-NEXT:    mv s0, a0
8960; RV32IZFH-NEXT:    flh fa5, 0(a1)
8961; RV32IZFH-NEXT:    fcvt.s.h fa0, fa5
8962; RV32IZFH-NEXT:    addi a0, sp, 8
8963; RV32IZFH-NEXT:    call __extendsftf2
8964; RV32IZFH-NEXT:    lw a0, 8(sp)
8965; RV32IZFH-NEXT:    lw a1, 12(sp)
8966; RV32IZFH-NEXT:    lw a2, 16(sp)
8967; RV32IZFH-NEXT:    lw a3, 20(sp)
8968; RV32IZFH-NEXT:    sw a0, 0(s0)
8969; RV32IZFH-NEXT:    sw a1, 4(s0)
8970; RV32IZFH-NEXT:    sw a2, 8(s0)
8971; RV32IZFH-NEXT:    sw a3, 12(s0)
8972; RV32IZFH-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8973; RV32IZFH-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8974; RV32IZFH-NEXT:    .cfi_restore ra
8975; RV32IZFH-NEXT:    .cfi_restore s0
8976; RV32IZFH-NEXT:    addi sp, sp, 32
8977; RV32IZFH-NEXT:    .cfi_def_cfa_offset 0
8978; RV32IZFH-NEXT:    ret
8979;
8980; RV64IZFH-LABEL: fcvt_q_h:
8981; RV64IZFH:       # %bb.0:
8982; RV64IZFH-NEXT:    addi sp, sp, -16
8983; RV64IZFH-NEXT:    .cfi_def_cfa_offset 16
8984; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
8985; RV64IZFH-NEXT:    .cfi_offset ra, -8
8986; RV64IZFH-NEXT:    flh fa5, 0(a0)
8987; RV64IZFH-NEXT:    fcvt.s.h fa0, fa5
8988; RV64IZFH-NEXT:    call __extendsftf2
8989; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
8990; RV64IZFH-NEXT:    .cfi_restore ra
8991; RV64IZFH-NEXT:    addi sp, sp, 16
8992; RV64IZFH-NEXT:    .cfi_def_cfa_offset 0
8993; RV64IZFH-NEXT:    ret
8994;
8995; RV32IDZFH-LABEL: fcvt_q_h:
8996; RV32IDZFH:       # %bb.0:
8997; RV32IDZFH-NEXT:    addi sp, sp, -32
8998; RV32IDZFH-NEXT:    .cfi_def_cfa_offset 32
8999; RV32IDZFH-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9000; RV32IDZFH-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9001; RV32IDZFH-NEXT:    .cfi_offset ra, -4
9002; RV32IDZFH-NEXT:    .cfi_offset s0, -8
9003; RV32IDZFH-NEXT:    mv s0, a0
9004; RV32IDZFH-NEXT:    flh fa5, 0(a1)
9005; RV32IDZFH-NEXT:    fcvt.s.h fa0, fa5
9006; RV32IDZFH-NEXT:    addi a0, sp, 8
9007; RV32IDZFH-NEXT:    call __extendsftf2
9008; RV32IDZFH-NEXT:    lw a0, 8(sp)
9009; RV32IDZFH-NEXT:    lw a1, 12(sp)
9010; RV32IDZFH-NEXT:    lw a2, 16(sp)
9011; RV32IDZFH-NEXT:    lw a3, 20(sp)
9012; RV32IDZFH-NEXT:    sw a0, 0(s0)
9013; RV32IDZFH-NEXT:    sw a1, 4(s0)
9014; RV32IDZFH-NEXT:    sw a2, 8(s0)
9015; RV32IDZFH-NEXT:    sw a3, 12(s0)
9016; RV32IDZFH-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9017; RV32IDZFH-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9018; RV32IDZFH-NEXT:    .cfi_restore ra
9019; RV32IDZFH-NEXT:    .cfi_restore s0
9020; RV32IDZFH-NEXT:    addi sp, sp, 32
9021; RV32IDZFH-NEXT:    .cfi_def_cfa_offset 0
9022; RV32IDZFH-NEXT:    ret
9023;
9024; RV64IDZFH-LABEL: fcvt_q_h:
9025; RV64IDZFH:       # %bb.0:
9026; RV64IDZFH-NEXT:    addi sp, sp, -16
9027; RV64IDZFH-NEXT:    .cfi_def_cfa_offset 16
9028; RV64IDZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9029; RV64IDZFH-NEXT:    .cfi_offset ra, -8
9030; RV64IDZFH-NEXT:    flh fa5, 0(a0)
9031; RV64IDZFH-NEXT:    fcvt.s.h fa0, fa5
9032; RV64IDZFH-NEXT:    call __extendsftf2
9033; RV64IDZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9034; RV64IDZFH-NEXT:    .cfi_restore ra
9035; RV64IDZFH-NEXT:    addi sp, sp, 16
9036; RV64IDZFH-NEXT:    .cfi_def_cfa_offset 0
9037; RV64IDZFH-NEXT:    ret
9038;
9039; RV32IZHINX-LABEL: fcvt_q_h:
9040; RV32IZHINX:       # %bb.0:
9041; RV32IZHINX-NEXT:    addi sp, sp, -32
9042; RV32IZHINX-NEXT:    .cfi_def_cfa_offset 32
9043; RV32IZHINX-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9044; RV32IZHINX-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9045; RV32IZHINX-NEXT:    .cfi_offset ra, -4
9046; RV32IZHINX-NEXT:    .cfi_offset s0, -8
9047; RV32IZHINX-NEXT:    mv s0, a0
9048; RV32IZHINX-NEXT:    lh a0, 0(a1)
9049; RV32IZHINX-NEXT:    fcvt.s.h a1, a0
9050; RV32IZHINX-NEXT:    addi a0, sp, 8
9051; RV32IZHINX-NEXT:    call __extendsftf2
9052; RV32IZHINX-NEXT:    lw a0, 8(sp)
9053; RV32IZHINX-NEXT:    lw a1, 12(sp)
9054; RV32IZHINX-NEXT:    lw a2, 16(sp)
9055; RV32IZHINX-NEXT:    lw a3, 20(sp)
9056; RV32IZHINX-NEXT:    sw a0, 0(s0)
9057; RV32IZHINX-NEXT:    sw a1, 4(s0)
9058; RV32IZHINX-NEXT:    sw a2, 8(s0)
9059; RV32IZHINX-NEXT:    sw a3, 12(s0)
9060; RV32IZHINX-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9061; RV32IZHINX-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9062; RV32IZHINX-NEXT:    .cfi_restore ra
9063; RV32IZHINX-NEXT:    .cfi_restore s0
9064; RV32IZHINX-NEXT:    addi sp, sp, 32
9065; RV32IZHINX-NEXT:    .cfi_def_cfa_offset 0
9066; RV32IZHINX-NEXT:    ret
9067;
9068; RV64IZHINX-LABEL: fcvt_q_h:
9069; RV64IZHINX:       # %bb.0:
9070; RV64IZHINX-NEXT:    addi sp, sp, -16
9071; RV64IZHINX-NEXT:    .cfi_def_cfa_offset 16
9072; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9073; RV64IZHINX-NEXT:    .cfi_offset ra, -8
9074; RV64IZHINX-NEXT:    lh a0, 0(a0)
9075; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
9076; RV64IZHINX-NEXT:    call __extendsftf2
9077; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9078; RV64IZHINX-NEXT:    .cfi_restore ra
9079; RV64IZHINX-NEXT:    addi sp, sp, 16
9080; RV64IZHINX-NEXT:    .cfi_def_cfa_offset 0
9081; RV64IZHINX-NEXT:    ret
9082;
9083; RV32IZDINXZHINX-LABEL: fcvt_q_h:
9084; RV32IZDINXZHINX:       # %bb.0:
9085; RV32IZDINXZHINX-NEXT:    addi sp, sp, -32
9086; RV32IZDINXZHINX-NEXT:    .cfi_def_cfa_offset 32
9087; RV32IZDINXZHINX-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9088; RV32IZDINXZHINX-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9089; RV32IZDINXZHINX-NEXT:    .cfi_offset ra, -4
9090; RV32IZDINXZHINX-NEXT:    .cfi_offset s0, -8
9091; RV32IZDINXZHINX-NEXT:    mv s0, a0
9092; RV32IZDINXZHINX-NEXT:    lh a0, 0(a1)
9093; RV32IZDINXZHINX-NEXT:    fcvt.s.h a1, a0
9094; RV32IZDINXZHINX-NEXT:    addi a0, sp, 8
9095; RV32IZDINXZHINX-NEXT:    call __extendsftf2
9096; RV32IZDINXZHINX-NEXT:    lw a0, 8(sp)
9097; RV32IZDINXZHINX-NEXT:    lw a1, 12(sp)
9098; RV32IZDINXZHINX-NEXT:    lw a2, 16(sp)
9099; RV32IZDINXZHINX-NEXT:    lw a3, 20(sp)
9100; RV32IZDINXZHINX-NEXT:    sw a0, 0(s0)
9101; RV32IZDINXZHINX-NEXT:    sw a1, 4(s0)
9102; RV32IZDINXZHINX-NEXT:    sw a2, 8(s0)
9103; RV32IZDINXZHINX-NEXT:    sw a3, 12(s0)
9104; RV32IZDINXZHINX-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9105; RV32IZDINXZHINX-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9106; RV32IZDINXZHINX-NEXT:    .cfi_restore ra
9107; RV32IZDINXZHINX-NEXT:    .cfi_restore s0
9108; RV32IZDINXZHINX-NEXT:    addi sp, sp, 32
9109; RV32IZDINXZHINX-NEXT:    .cfi_def_cfa_offset 0
9110; RV32IZDINXZHINX-NEXT:    ret
9111;
9112; RV64IZDINXZHINX-LABEL: fcvt_q_h:
9113; RV64IZDINXZHINX:       # %bb.0:
9114; RV64IZDINXZHINX-NEXT:    addi sp, sp, -16
9115; RV64IZDINXZHINX-NEXT:    .cfi_def_cfa_offset 16
9116; RV64IZDINXZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9117; RV64IZDINXZHINX-NEXT:    .cfi_offset ra, -8
9118; RV64IZDINXZHINX-NEXT:    lh a0, 0(a0)
9119; RV64IZDINXZHINX-NEXT:    fcvt.s.h a0, a0
9120; RV64IZDINXZHINX-NEXT:    call __extendsftf2
9121; RV64IZDINXZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9122; RV64IZDINXZHINX-NEXT:    .cfi_restore ra
9123; RV64IZDINXZHINX-NEXT:    addi sp, sp, 16
9124; RV64IZDINXZHINX-NEXT:    .cfi_def_cfa_offset 0
9125; RV64IZDINXZHINX-NEXT:    ret
9126;
9127; RV32I-LABEL: fcvt_q_h:
9128; RV32I:       # %bb.0:
9129; RV32I-NEXT:    addi sp, sp, -32
9130; RV32I-NEXT:    .cfi_def_cfa_offset 32
9131; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9132; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9133; RV32I-NEXT:    .cfi_offset ra, -4
9134; RV32I-NEXT:    .cfi_offset s0, -8
9135; RV32I-NEXT:    mv s0, a0
9136; RV32I-NEXT:    lh a0, 0(a1)
9137; RV32I-NEXT:    call __extendhfsf2
9138; RV32I-NEXT:    mv a1, a0
9139; RV32I-NEXT:    addi a0, sp, 8
9140; RV32I-NEXT:    call __extendsftf2
9141; RV32I-NEXT:    lw a0, 8(sp)
9142; RV32I-NEXT:    lw a1, 12(sp)
9143; RV32I-NEXT:    lw a2, 16(sp)
9144; RV32I-NEXT:    lw a3, 20(sp)
9145; RV32I-NEXT:    sw a0, 0(s0)
9146; RV32I-NEXT:    sw a1, 4(s0)
9147; RV32I-NEXT:    sw a2, 8(s0)
9148; RV32I-NEXT:    sw a3, 12(s0)
9149; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9150; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9151; RV32I-NEXT:    .cfi_restore ra
9152; RV32I-NEXT:    .cfi_restore s0
9153; RV32I-NEXT:    addi sp, sp, 32
9154; RV32I-NEXT:    .cfi_def_cfa_offset 0
9155; RV32I-NEXT:    ret
9156;
9157; RV64I-LABEL: fcvt_q_h:
9158; RV64I:       # %bb.0:
9159; RV64I-NEXT:    addi sp, sp, -16
9160; RV64I-NEXT:    .cfi_def_cfa_offset 16
9161; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9162; RV64I-NEXT:    .cfi_offset ra, -8
9163; RV64I-NEXT:    lh a0, 0(a0)
9164; RV64I-NEXT:    call __extendhfsf2
9165; RV64I-NEXT:    call __extendsftf2
9166; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9167; RV64I-NEXT:    .cfi_restore ra
9168; RV64I-NEXT:    addi sp, sp, 16
9169; RV64I-NEXT:    .cfi_def_cfa_offset 0
9170; RV64I-NEXT:    ret
9171;
9172; RV32ID-ILP32-LABEL: fcvt_q_h:
9173; RV32ID-ILP32:       # %bb.0:
9174; RV32ID-ILP32-NEXT:    addi sp, sp, -32
9175; RV32ID-ILP32-NEXT:    .cfi_def_cfa_offset 32
9176; RV32ID-ILP32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9177; RV32ID-ILP32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9178; RV32ID-ILP32-NEXT:    .cfi_offset ra, -4
9179; RV32ID-ILP32-NEXT:    .cfi_offset s0, -8
9180; RV32ID-ILP32-NEXT:    mv s0, a0
9181; RV32ID-ILP32-NEXT:    lhu a0, 0(a1)
9182; RV32ID-ILP32-NEXT:    call __extendhfsf2
9183; RV32ID-ILP32-NEXT:    mv a1, a0
9184; RV32ID-ILP32-NEXT:    addi a0, sp, 8
9185; RV32ID-ILP32-NEXT:    call __extendsftf2
9186; RV32ID-ILP32-NEXT:    lw a0, 8(sp)
9187; RV32ID-ILP32-NEXT:    lw a1, 12(sp)
9188; RV32ID-ILP32-NEXT:    lw a2, 16(sp)
9189; RV32ID-ILP32-NEXT:    lw a3, 20(sp)
9190; RV32ID-ILP32-NEXT:    sw a0, 0(s0)
9191; RV32ID-ILP32-NEXT:    sw a1, 4(s0)
9192; RV32ID-ILP32-NEXT:    sw a2, 8(s0)
9193; RV32ID-ILP32-NEXT:    sw a3, 12(s0)
9194; RV32ID-ILP32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9195; RV32ID-ILP32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9196; RV32ID-ILP32-NEXT:    .cfi_restore ra
9197; RV32ID-ILP32-NEXT:    .cfi_restore s0
9198; RV32ID-ILP32-NEXT:    addi sp, sp, 32
9199; RV32ID-ILP32-NEXT:    .cfi_def_cfa_offset 0
9200; RV32ID-ILP32-NEXT:    ret
9201;
9202; RV64ID-LP64-LABEL: fcvt_q_h:
9203; RV64ID-LP64:       # %bb.0:
9204; RV64ID-LP64-NEXT:    addi sp, sp, -16
9205; RV64ID-LP64-NEXT:    .cfi_def_cfa_offset 16
9206; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9207; RV64ID-LP64-NEXT:    .cfi_offset ra, -8
9208; RV64ID-LP64-NEXT:    lhu a0, 0(a0)
9209; RV64ID-LP64-NEXT:    call __extendhfsf2
9210; RV64ID-LP64-NEXT:    call __extendsftf2
9211; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9212; RV64ID-LP64-NEXT:    .cfi_restore ra
9213; RV64ID-LP64-NEXT:    addi sp, sp, 16
9214; RV64ID-LP64-NEXT:    .cfi_def_cfa_offset 0
9215; RV64ID-LP64-NEXT:    ret
9216;
9217; RV32ID-LABEL: fcvt_q_h:
9218; RV32ID:       # %bb.0:
9219; RV32ID-NEXT:    addi sp, sp, -32
9220; RV32ID-NEXT:    .cfi_def_cfa_offset 32
9221; RV32ID-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9222; RV32ID-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9223; RV32ID-NEXT:    .cfi_offset ra, -4
9224; RV32ID-NEXT:    .cfi_offset s0, -8
9225; RV32ID-NEXT:    mv s0, a0
9226; RV32ID-NEXT:    lhu a0, 0(a1)
9227; RV32ID-NEXT:    fmv.w.x fa0, a0
9228; RV32ID-NEXT:    call __extendhfsf2
9229; RV32ID-NEXT:    addi a0, sp, 8
9230; RV32ID-NEXT:    call __extendsftf2
9231; RV32ID-NEXT:    lw a0, 8(sp)
9232; RV32ID-NEXT:    lw a1, 12(sp)
9233; RV32ID-NEXT:    lw a2, 16(sp)
9234; RV32ID-NEXT:    lw a3, 20(sp)
9235; RV32ID-NEXT:    sw a0, 0(s0)
9236; RV32ID-NEXT:    sw a1, 4(s0)
9237; RV32ID-NEXT:    sw a2, 8(s0)
9238; RV32ID-NEXT:    sw a3, 12(s0)
9239; RV32ID-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9240; RV32ID-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9241; RV32ID-NEXT:    .cfi_restore ra
9242; RV32ID-NEXT:    .cfi_restore s0
9243; RV32ID-NEXT:    addi sp, sp, 32
9244; RV32ID-NEXT:    .cfi_def_cfa_offset 0
9245; RV32ID-NEXT:    ret
9246;
9247; RV64ID-LABEL: fcvt_q_h:
9248; RV64ID:       # %bb.0:
9249; RV64ID-NEXT:    addi sp, sp, -16
9250; RV64ID-NEXT:    .cfi_def_cfa_offset 16
9251; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9252; RV64ID-NEXT:    .cfi_offset ra, -8
9253; RV64ID-NEXT:    lhu a0, 0(a0)
9254; RV64ID-NEXT:    fmv.w.x fa0, a0
9255; RV64ID-NEXT:    call __extendhfsf2
9256; RV64ID-NEXT:    call __extendsftf2
9257; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9258; RV64ID-NEXT:    .cfi_restore ra
9259; RV64ID-NEXT:    addi sp, sp, 16
9260; RV64ID-NEXT:    .cfi_def_cfa_offset 0
9261; RV64ID-NEXT:    ret
9262;
9263; CHECK32-IZFHMIN-LABEL: fcvt_q_h:
9264; CHECK32-IZFHMIN:       # %bb.0:
9265; CHECK32-IZFHMIN-NEXT:    addi sp, sp, -32
9266; CHECK32-IZFHMIN-NEXT:    .cfi_def_cfa_offset 32
9267; CHECK32-IZFHMIN-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9268; CHECK32-IZFHMIN-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9269; CHECK32-IZFHMIN-NEXT:    .cfi_offset ra, -4
9270; CHECK32-IZFHMIN-NEXT:    .cfi_offset s0, -8
9271; CHECK32-IZFHMIN-NEXT:    mv s0, a0
9272; CHECK32-IZFHMIN-NEXT:    flh fa5, 0(a1)
9273; CHECK32-IZFHMIN-NEXT:    fcvt.s.h fa0, fa5
9274; CHECK32-IZFHMIN-NEXT:    addi a0, sp, 8
9275; CHECK32-IZFHMIN-NEXT:    call __extendsftf2
9276; CHECK32-IZFHMIN-NEXT:    lw a0, 8(sp)
9277; CHECK32-IZFHMIN-NEXT:    lw a1, 12(sp)
9278; CHECK32-IZFHMIN-NEXT:    lw a2, 16(sp)
9279; CHECK32-IZFHMIN-NEXT:    lw a3, 20(sp)
9280; CHECK32-IZFHMIN-NEXT:    sw a0, 0(s0)
9281; CHECK32-IZFHMIN-NEXT:    sw a1, 4(s0)
9282; CHECK32-IZFHMIN-NEXT:    sw a2, 8(s0)
9283; CHECK32-IZFHMIN-NEXT:    sw a3, 12(s0)
9284; CHECK32-IZFHMIN-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9285; CHECK32-IZFHMIN-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9286; CHECK32-IZFHMIN-NEXT:    .cfi_restore ra
9287; CHECK32-IZFHMIN-NEXT:    .cfi_restore s0
9288; CHECK32-IZFHMIN-NEXT:    addi sp, sp, 32
9289; CHECK32-IZFHMIN-NEXT:    .cfi_def_cfa_offset 0
9290; CHECK32-IZFHMIN-NEXT:    ret
9291;
9292; CHECK64-IZFHMIN-LABEL: fcvt_q_h:
9293; CHECK64-IZFHMIN:       # %bb.0:
9294; CHECK64-IZFHMIN-NEXT:    addi sp, sp, -16
9295; CHECK64-IZFHMIN-NEXT:    .cfi_def_cfa_offset 16
9296; CHECK64-IZFHMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9297; CHECK64-IZFHMIN-NEXT:    .cfi_offset ra, -8
9298; CHECK64-IZFHMIN-NEXT:    flh fa5, 0(a0)
9299; CHECK64-IZFHMIN-NEXT:    fcvt.s.h fa0, fa5
9300; CHECK64-IZFHMIN-NEXT:    call __extendsftf2
9301; CHECK64-IZFHMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9302; CHECK64-IZFHMIN-NEXT:    .cfi_restore ra
9303; CHECK64-IZFHMIN-NEXT:    addi sp, sp, 16
9304; CHECK64-IZFHMIN-NEXT:    .cfi_def_cfa_offset 0
9305; CHECK64-IZFHMIN-NEXT:    ret
9306;
9307; CHECK32-IZHINXMIN-LABEL: fcvt_q_h:
9308; CHECK32-IZHINXMIN:       # %bb.0:
9309; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, -32
9310; CHECK32-IZHINXMIN-NEXT:    .cfi_def_cfa_offset 32
9311; CHECK32-IZHINXMIN-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9312; CHECK32-IZHINXMIN-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9313; CHECK32-IZHINXMIN-NEXT:    .cfi_offset ra, -4
9314; CHECK32-IZHINXMIN-NEXT:    .cfi_offset s0, -8
9315; CHECK32-IZHINXMIN-NEXT:    mv s0, a0
9316; CHECK32-IZHINXMIN-NEXT:    lh a0, 0(a1)
9317; CHECK32-IZHINXMIN-NEXT:    fcvt.s.h a1, a0
9318; CHECK32-IZHINXMIN-NEXT:    addi a0, sp, 8
9319; CHECK32-IZHINXMIN-NEXT:    call __extendsftf2
9320; CHECK32-IZHINXMIN-NEXT:    lw a0, 8(sp)
9321; CHECK32-IZHINXMIN-NEXT:    lw a1, 12(sp)
9322; CHECK32-IZHINXMIN-NEXT:    lw a2, 16(sp)
9323; CHECK32-IZHINXMIN-NEXT:    lw a3, 20(sp)
9324; CHECK32-IZHINXMIN-NEXT:    sw a0, 0(s0)
9325; CHECK32-IZHINXMIN-NEXT:    sw a1, 4(s0)
9326; CHECK32-IZHINXMIN-NEXT:    sw a2, 8(s0)
9327; CHECK32-IZHINXMIN-NEXT:    sw a3, 12(s0)
9328; CHECK32-IZHINXMIN-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9329; CHECK32-IZHINXMIN-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9330; CHECK32-IZHINXMIN-NEXT:    .cfi_restore ra
9331; CHECK32-IZHINXMIN-NEXT:    .cfi_restore s0
9332; CHECK32-IZHINXMIN-NEXT:    addi sp, sp, 32
9333; CHECK32-IZHINXMIN-NEXT:    .cfi_def_cfa_offset 0
9334; CHECK32-IZHINXMIN-NEXT:    ret
9335;
9336; CHECK64-IZHINXMIN-LABEL: fcvt_q_h:
9337; CHECK64-IZHINXMIN:       # %bb.0:
9338; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, -16
9339; CHECK64-IZHINXMIN-NEXT:    .cfi_def_cfa_offset 16
9340; CHECK64-IZHINXMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9341; CHECK64-IZHINXMIN-NEXT:    .cfi_offset ra, -8
9342; CHECK64-IZHINXMIN-NEXT:    lh a0, 0(a0)
9343; CHECK64-IZHINXMIN-NEXT:    fcvt.s.h a0, a0
9344; CHECK64-IZHINXMIN-NEXT:    call __extendsftf2
9345; CHECK64-IZHINXMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9346; CHECK64-IZHINXMIN-NEXT:    .cfi_restore ra
9347; CHECK64-IZHINXMIN-NEXT:    addi sp, sp, 16
9348; CHECK64-IZHINXMIN-NEXT:    .cfi_def_cfa_offset 0
9349; CHECK64-IZHINXMIN-NEXT:    ret
9350;
9351; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_q_h:
9352; CHECK32-IZDINXZHINXMIN:       # %bb.0:
9353; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, -32
9354; CHECK32-IZDINXZHINXMIN-NEXT:    .cfi_def_cfa_offset 32
9355; CHECK32-IZDINXZHINXMIN-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9356; CHECK32-IZDINXZHINXMIN-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9357; CHECK32-IZDINXZHINXMIN-NEXT:    .cfi_offset ra, -4
9358; CHECK32-IZDINXZHINXMIN-NEXT:    .cfi_offset s0, -8
9359; CHECK32-IZDINXZHINXMIN-NEXT:    mv s0, a0
9360; CHECK32-IZDINXZHINXMIN-NEXT:    lh a0, 0(a1)
9361; CHECK32-IZDINXZHINXMIN-NEXT:    fcvt.s.h a1, a0
9362; CHECK32-IZDINXZHINXMIN-NEXT:    addi a0, sp, 8
9363; CHECK32-IZDINXZHINXMIN-NEXT:    call __extendsftf2
9364; CHECK32-IZDINXZHINXMIN-NEXT:    lw a0, 8(sp)
9365; CHECK32-IZDINXZHINXMIN-NEXT:    lw a1, 12(sp)
9366; CHECK32-IZDINXZHINXMIN-NEXT:    lw a2, 16(sp)
9367; CHECK32-IZDINXZHINXMIN-NEXT:    lw a3, 20(sp)
9368; CHECK32-IZDINXZHINXMIN-NEXT:    sw a0, 0(s0)
9369; CHECK32-IZDINXZHINXMIN-NEXT:    sw a1, 4(s0)
9370; CHECK32-IZDINXZHINXMIN-NEXT:    sw a2, 8(s0)
9371; CHECK32-IZDINXZHINXMIN-NEXT:    sw a3, 12(s0)
9372; CHECK32-IZDINXZHINXMIN-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9373; CHECK32-IZDINXZHINXMIN-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9374; CHECK32-IZDINXZHINXMIN-NEXT:    .cfi_restore ra
9375; CHECK32-IZDINXZHINXMIN-NEXT:    .cfi_restore s0
9376; CHECK32-IZDINXZHINXMIN-NEXT:    addi sp, sp, 32
9377; CHECK32-IZDINXZHINXMIN-NEXT:    .cfi_def_cfa_offset 0
9378; CHECK32-IZDINXZHINXMIN-NEXT:    ret
9379;
9380; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_q_h:
9381; CHECK64-IZDINXZHINXMIN:       # %bb.0:
9382; CHECK64-IZDINXZHINXMIN-NEXT:    addi sp, sp, -16
9383; CHECK64-IZDINXZHINXMIN-NEXT:    .cfi_def_cfa_offset 16
9384; CHECK64-IZDINXZHINXMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9385; CHECK64-IZDINXZHINXMIN-NEXT:    .cfi_offset ra, -8
9386; CHECK64-IZDINXZHINXMIN-NEXT:    lh a0, 0(a0)
9387; CHECK64-IZDINXZHINXMIN-NEXT:    fcvt.s.h a0, a0
9388; CHECK64-IZDINXZHINXMIN-NEXT:    call __extendsftf2
9389; CHECK64-IZDINXZHINXMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9390; CHECK64-IZDINXZHINXMIN-NEXT:    .cfi_restore ra
9391; CHECK64-IZDINXZHINXMIN-NEXT:    addi sp, sp, 16
9392; CHECK64-IZDINXZHINXMIN-NEXT:    .cfi_def_cfa_offset 0
9393; CHECK64-IZDINXZHINXMIN-NEXT:    ret
9394  %a = load half, ptr %x
9395  %b = fpext half %a to fp128
9396  ret fp128 %b
9397}
9398