xref: /llvm-project/llvm/test/CodeGen/RISCV/rv64-half-convert.ll (revision 73186546f0c0209c65c4b4ef1379a4832545b871)
1768b0b4eSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2768b0b4eSCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs \
3768b0b4eSCraig Topper; RUN:   -target-abi lp64 < %s | FileCheck %s -check-prefixes=CHECK,RV64I
4768b0b4eSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \
5768b0b4eSCraig Topper; RUN:   -target-abi lp64f < %s | FileCheck %s -check-prefixes=CHECK,RV64IZFH
6768b0b4eSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \
7768b0b4eSCraig Topper; RUN:   -target-abi lp64 < %s | FileCheck %s -check-prefixes=CHECK,RV64IZHINX
8768b0b4eSCraig Topper
9768b0b4eSCraig Topperdefine half @sitofp_i128_to_f16(i128 %a) nounwind {
10768b0b4eSCraig Topper; RV64I-LABEL: sitofp_i128_to_f16:
11768b0b4eSCraig Topper; RV64I:       # %bb.0:
12768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, -16
13768b0b4eSCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14768b0b4eSCraig Topper; RV64I-NEXT:    call __floattisf
15768b0b4eSCraig Topper; RV64I-NEXT:    call __truncsfhf2
16768b0b4eSCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
17768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, 16
18768b0b4eSCraig Topper; RV64I-NEXT:    ret
19768b0b4eSCraig Topper;
20768b0b4eSCraig Topper; RV64IZFH-LABEL: sitofp_i128_to_f16:
21768b0b4eSCraig Topper; RV64IZFH:       # %bb.0:
22768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, -16
23768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24768b0b4eSCraig Topper; RV64IZFH-NEXT:    call __floattihf
25768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
26768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, 16
27768b0b4eSCraig Topper; RV64IZFH-NEXT:    ret
28768b0b4eSCraig Topper;
29768b0b4eSCraig Topper; RV64IZHINX-LABEL: sitofp_i128_to_f16:
30768b0b4eSCraig Topper; RV64IZHINX:       # %bb.0:
31768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, -16
32768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
33768b0b4eSCraig Topper; RV64IZHINX-NEXT:    call __floattihf
34768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
35768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, 16
36768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ret
37768b0b4eSCraig Topper  %1 = sitofp i128 %a to half
38768b0b4eSCraig Topper  ret half %1
39768b0b4eSCraig Topper}
40768b0b4eSCraig Topper
41768b0b4eSCraig Topperdefine half @uitofp_i128_to_f16(i128 %a) nounwind {
42768b0b4eSCraig Topper; RV64I-LABEL: uitofp_i128_to_f16:
43768b0b4eSCraig Topper; RV64I:       # %bb.0:
44768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, -16
45768b0b4eSCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
46768b0b4eSCraig Topper; RV64I-NEXT:    call __floatuntisf
47768b0b4eSCraig Topper; RV64I-NEXT:    call __truncsfhf2
48768b0b4eSCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
49768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, 16
50768b0b4eSCraig Topper; RV64I-NEXT:    ret
51768b0b4eSCraig Topper;
52768b0b4eSCraig Topper; RV64IZFH-LABEL: uitofp_i128_to_f16:
53768b0b4eSCraig Topper; RV64IZFH:       # %bb.0:
54768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, -16
55768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
56768b0b4eSCraig Topper; RV64IZFH-NEXT:    call __floatuntihf
57768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
58768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, 16
59768b0b4eSCraig Topper; RV64IZFH-NEXT:    ret
60768b0b4eSCraig Topper;
61768b0b4eSCraig Topper; RV64IZHINX-LABEL: uitofp_i128_to_f16:
62768b0b4eSCraig Topper; RV64IZHINX:       # %bb.0:
63768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, -16
64768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
65768b0b4eSCraig Topper; RV64IZHINX-NEXT:    call __floatuntihf
66768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
67768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, 16
68768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ret
69768b0b4eSCraig Topper  %1 = uitofp i128 %a to half
70768b0b4eSCraig Topper  ret half %1
71768b0b4eSCraig Topper}
72768b0b4eSCraig Topper
73768b0b4eSCraig Topperdefine i128 @fptosi_f16_to_i128(half %a) nounwind {
74768b0b4eSCraig Topper; RV64I-LABEL: fptosi_f16_to_i128:
75768b0b4eSCraig Topper; RV64I:       # %bb.0:
76768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, -16
77768b0b4eSCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
78768b0b4eSCraig Topper; RV64I-NEXT:    call __extendhfsf2
79768b0b4eSCraig Topper; RV64I-NEXT:    call __fixsfti
80768b0b4eSCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
81768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, 16
82768b0b4eSCraig Topper; RV64I-NEXT:    ret
83768b0b4eSCraig Topper;
84768b0b4eSCraig Topper; RV64IZFH-LABEL: fptosi_f16_to_i128:
85768b0b4eSCraig Topper; RV64IZFH:       # %bb.0:
86768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, -16
87768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
88768b0b4eSCraig Topper; RV64IZFH-NEXT:    call __fixhfti
89768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
90768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, 16
91768b0b4eSCraig Topper; RV64IZFH-NEXT:    ret
92768b0b4eSCraig Topper;
93768b0b4eSCraig Topper; RV64IZHINX-LABEL: fptosi_f16_to_i128:
94768b0b4eSCraig Topper; RV64IZHINX:       # %bb.0:
95768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, -16
96768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
97768b0b4eSCraig Topper; RV64IZHINX-NEXT:    call __fixhfti
98768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
99768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, 16
100768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ret
101768b0b4eSCraig Topper  %1 = fptosi half %a to i128
102768b0b4eSCraig Topper  ret i128 %1
103768b0b4eSCraig Topper}
104768b0b4eSCraig Topper
105768b0b4eSCraig Topperdefine i128 @fptoui_f16_to_i128(half %a) nounwind {
106768b0b4eSCraig Topper; RV64I-LABEL: fptoui_f16_to_i128:
107768b0b4eSCraig Topper; RV64I:       # %bb.0:
108768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, -16
109768b0b4eSCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
110768b0b4eSCraig Topper; RV64I-NEXT:    call __extendhfsf2
111768b0b4eSCraig Topper; RV64I-NEXT:    call __fixunssfti
112768b0b4eSCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
113768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, 16
114768b0b4eSCraig Topper; RV64I-NEXT:    ret
115768b0b4eSCraig Topper;
116768b0b4eSCraig Topper; RV64IZFH-LABEL: fptoui_f16_to_i128:
117768b0b4eSCraig Topper; RV64IZFH:       # %bb.0:
118768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, -16
119768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
120768b0b4eSCraig Topper; RV64IZFH-NEXT:    call __fixunshfti
121768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
122768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, 16
123768b0b4eSCraig Topper; RV64IZFH-NEXT:    ret
124768b0b4eSCraig Topper;
125768b0b4eSCraig Topper; RV64IZHINX-LABEL: fptoui_f16_to_i128:
126768b0b4eSCraig Topper; RV64IZHINX:       # %bb.0:
127768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, -16
128768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
129768b0b4eSCraig Topper; RV64IZHINX-NEXT:    call __fixunshfti
130768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
131768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, 16
132768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ret
133768b0b4eSCraig Topper  %1 = fptoui half %a to i128
134768b0b4eSCraig Topper  ret i128 %1
135768b0b4eSCraig Topper}
136768b0b4eSCraig Topper
137768b0b4eSCraig Topperdefine i128 @fptosi_sat_f16_to_i128(half %a) nounwind {
138768b0b4eSCraig Topper; RV64I-LABEL: fptosi_sat_f16_to_i128:
139768b0b4eSCraig Topper; RV64I:       # %bb.0:
140768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, -64
141768b0b4eSCraig Topper; RV64I-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill
142768b0b4eSCraig Topper; RV64I-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill
143768b0b4eSCraig Topper; RV64I-NEXT:    sd s1, 40(sp) # 8-byte Folded Spill
144768b0b4eSCraig Topper; RV64I-NEXT:    sd s2, 32(sp) # 8-byte Folded Spill
145768b0b4eSCraig Topper; RV64I-NEXT:    sd s3, 24(sp) # 8-byte Folded Spill
146768b0b4eSCraig Topper; RV64I-NEXT:    sd s4, 16(sp) # 8-byte Folded Spill
147768b0b4eSCraig Topper; RV64I-NEXT:    sd s5, 8(sp) # 8-byte Folded Spill
148768b0b4eSCraig Topper; RV64I-NEXT:    call __extendhfsf2
149*73186546SCraig Topper; RV64I-NEXT:    mv s2, a0
150768b0b4eSCraig Topper; RV64I-NEXT:    lui a1, 1044480
151768b0b4eSCraig Topper; RV64I-NEXT:    call __gesf2
152768b0b4eSCraig Topper; RV64I-NEXT:    mv s0, a0
153*73186546SCraig Topper; RV64I-NEXT:    mv a0, s2
154768b0b4eSCraig Topper; RV64I-NEXT:    call __fixsfti
155*73186546SCraig Topper; RV64I-NEXT:    mv s1, a0
156768b0b4eSCraig Topper; RV64I-NEXT:    mv s3, a1
157768b0b4eSCraig Topper; RV64I-NEXT:    li s5, -1
158768b0b4eSCraig Topper; RV64I-NEXT:    bgez s0, .LBB4_2
159768b0b4eSCraig Topper; RV64I-NEXT:  # %bb.1:
160768b0b4eSCraig Topper; RV64I-NEXT:    slli s3, s5, 63
161768b0b4eSCraig Topper; RV64I-NEXT:  .LBB4_2:
162768b0b4eSCraig Topper; RV64I-NEXT:    lui a1, 520192
163768b0b4eSCraig Topper; RV64I-NEXT:    addiw a1, a1, -1
164*73186546SCraig Topper; RV64I-NEXT:    mv a0, s2
165768b0b4eSCraig Topper; RV64I-NEXT:    call __gtsf2
166768b0b4eSCraig Topper; RV64I-NEXT:    mv s4, a0
167768b0b4eSCraig Topper; RV64I-NEXT:    blez a0, .LBB4_4
168768b0b4eSCraig Topper; RV64I-NEXT:  # %bb.3:
169768b0b4eSCraig Topper; RV64I-NEXT:    srli s3, s5, 1
170768b0b4eSCraig Topper; RV64I-NEXT:  .LBB4_4:
171*73186546SCraig Topper; RV64I-NEXT:    mv a0, s2
172*73186546SCraig Topper; RV64I-NEXT:    mv a1, s2
173768b0b4eSCraig Topper; RV64I-NEXT:    call __unordsf2
174768b0b4eSCraig Topper; RV64I-NEXT:    snez a0, a0
1759122c523SPengcheng Wang; RV64I-NEXT:    sgtz a1, s4
1769122c523SPengcheng Wang; RV64I-NEXT:    slti a2, s0, 0
177768b0b4eSCraig Topper; RV64I-NEXT:    addi a0, a0, -1
1789122c523SPengcheng Wang; RV64I-NEXT:    neg a3, a1
1799122c523SPengcheng Wang; RV64I-NEXT:    addi a2, a2, -1
180768b0b4eSCraig Topper; RV64I-NEXT:    and a1, a0, s3
181*73186546SCraig Topper; RV64I-NEXT:    and a2, a2, s1
1829122c523SPengcheng Wang; RV64I-NEXT:    or a2, a3, a2
183768b0b4eSCraig Topper; RV64I-NEXT:    and a0, a0, a2
184768b0b4eSCraig Topper; RV64I-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload
185768b0b4eSCraig Topper; RV64I-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload
186768b0b4eSCraig Topper; RV64I-NEXT:    ld s1, 40(sp) # 8-byte Folded Reload
187768b0b4eSCraig Topper; RV64I-NEXT:    ld s2, 32(sp) # 8-byte Folded Reload
188768b0b4eSCraig Topper; RV64I-NEXT:    ld s3, 24(sp) # 8-byte Folded Reload
189768b0b4eSCraig Topper; RV64I-NEXT:    ld s4, 16(sp) # 8-byte Folded Reload
190768b0b4eSCraig Topper; RV64I-NEXT:    ld s5, 8(sp) # 8-byte Folded Reload
191768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, 64
192768b0b4eSCraig Topper; RV64I-NEXT:    ret
193768b0b4eSCraig Topper;
194768b0b4eSCraig Topper; RV64IZFH-LABEL: fptosi_sat_f16_to_i128:
195768b0b4eSCraig Topper; RV64IZFH:       # %bb.0:
196768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, -32
197768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
198768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
199768b0b4eSCraig Topper; RV64IZFH-NEXT:    fsw fs0, 12(sp) # 4-byte Folded Spill
200768b0b4eSCraig Topper; RV64IZFH-NEXT:    fcvt.s.h fs0, fa0
201768b0b4eSCraig Topper; RV64IZFH-NEXT:    lui a0, 1044480
202768b0b4eSCraig Topper; RV64IZFH-NEXT:    fmv.w.x fa5, a0
203768b0b4eSCraig Topper; RV64IZFH-NEXT:    fle.s s0, fa5, fs0
204768b0b4eSCraig Topper; RV64IZFH-NEXT:    fmv.s fa0, fs0
205768b0b4eSCraig Topper; RV64IZFH-NEXT:    call __fixsfti
206768b0b4eSCraig Topper; RV64IZFH-NEXT:    li a2, -1
207768b0b4eSCraig Topper; RV64IZFH-NEXT:    bnez s0, .LBB4_2
208768b0b4eSCraig Topper; RV64IZFH-NEXT:  # %bb.1:
209768b0b4eSCraig Topper; RV64IZFH-NEXT:    slli a1, a2, 63
210768b0b4eSCraig Topper; RV64IZFH-NEXT:  .LBB4_2:
211768b0b4eSCraig Topper; RV64IZFH-NEXT:    lui a3, %hi(.LCPI4_0)
212768b0b4eSCraig Topper; RV64IZFH-NEXT:    flw fa5, %lo(.LCPI4_0)(a3)
213768b0b4eSCraig Topper; RV64IZFH-NEXT:    flt.s a3, fa5, fs0
214768b0b4eSCraig Topper; RV64IZFH-NEXT:    beqz a3, .LBB4_4
215768b0b4eSCraig Topper; RV64IZFH-NEXT:  # %bb.3:
216768b0b4eSCraig Topper; RV64IZFH-NEXT:    srli a1, a2, 1
217768b0b4eSCraig Topper; RV64IZFH-NEXT:  .LBB4_4:
218768b0b4eSCraig Topper; RV64IZFH-NEXT:    feq.s a2, fs0, fs0
219768b0b4eSCraig Topper; RV64IZFH-NEXT:    neg a3, a3
220768b0b4eSCraig Topper; RV64IZFH-NEXT:    neg a4, s0
2219122c523SPengcheng Wang; RV64IZFH-NEXT:    neg a2, a2
222768b0b4eSCraig Topper; RV64IZFH-NEXT:    and a0, a4, a0
2239122c523SPengcheng Wang; RV64IZFH-NEXT:    and a1, a2, a1
224768b0b4eSCraig Topper; RV64IZFH-NEXT:    or a0, a3, a0
225768b0b4eSCraig Topper; RV64IZFH-NEXT:    and a0, a2, a0
226768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
227768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
228768b0b4eSCraig Topper; RV64IZFH-NEXT:    flw fs0, 12(sp) # 4-byte Folded Reload
229768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, 32
230768b0b4eSCraig Topper; RV64IZFH-NEXT:    ret
231768b0b4eSCraig Topper;
232768b0b4eSCraig Topper; RV64IZHINX-LABEL: fptosi_sat_f16_to_i128:
233768b0b4eSCraig Topper; RV64IZHINX:       # %bb.0:
234768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, -32
235768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
236768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
237768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
238768b0b4eSCraig Topper; RV64IZHINX-NEXT:    fcvt.s.h s0, a0
239768b0b4eSCraig Topper; RV64IZHINX-NEXT:    lui a0, 1044480
240768b0b4eSCraig Topper; RV64IZHINX-NEXT:    fle.s s1, a0, s0
241768b0b4eSCraig Topper; RV64IZHINX-NEXT:    mv a0, s0
242768b0b4eSCraig Topper; RV64IZHINX-NEXT:    call __fixsfti
243768b0b4eSCraig Topper; RV64IZHINX-NEXT:    li a2, -1
244768b0b4eSCraig Topper; RV64IZHINX-NEXT:    bnez s1, .LBB4_2
245768b0b4eSCraig Topper; RV64IZHINX-NEXT:  # %bb.1:
246768b0b4eSCraig Topper; RV64IZHINX-NEXT:    slli a1, a2, 63
247768b0b4eSCraig Topper; RV64IZHINX-NEXT:  .LBB4_2:
248768b0b4eSCraig Topper; RV64IZHINX-NEXT:    lui a3, 520192
249768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addiw a3, a3, -1
250768b0b4eSCraig Topper; RV64IZHINX-NEXT:    flt.s a3, a3, s0
251768b0b4eSCraig Topper; RV64IZHINX-NEXT:    beqz a3, .LBB4_4
252768b0b4eSCraig Topper; RV64IZHINX-NEXT:  # %bb.3:
253768b0b4eSCraig Topper; RV64IZHINX-NEXT:    srli a1, a2, 1
254768b0b4eSCraig Topper; RV64IZHINX-NEXT:  .LBB4_4:
255768b0b4eSCraig Topper; RV64IZHINX-NEXT:    feq.s a2, s0, s0
256768b0b4eSCraig Topper; RV64IZHINX-NEXT:    neg a3, a3
257768b0b4eSCraig Topper; RV64IZHINX-NEXT:    neg a4, s1
2589122c523SPengcheng Wang; RV64IZHINX-NEXT:    neg a2, a2
259768b0b4eSCraig Topper; RV64IZHINX-NEXT:    and a0, a4, a0
2609122c523SPengcheng Wang; RV64IZHINX-NEXT:    and a1, a2, a1
261768b0b4eSCraig Topper; RV64IZHINX-NEXT:    or a0, a3, a0
262768b0b4eSCraig Topper; RV64IZHINX-NEXT:    and a0, a2, a0
263768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
264768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
265768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
266768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, 32
267768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ret
268768b0b4eSCraig Topper  %1 = tail call i128 @llvm.fptosi.sat.i128.f16(half %a)
269768b0b4eSCraig Topper  ret i128 %1
270768b0b4eSCraig Topper}
271768b0b4eSCraig Topperdeclare i128 @llvm.fptosi.sat.i128.f16(half)
272768b0b4eSCraig Topper
273768b0b4eSCraig Topperdefine i128 @fptoui_sat_f16_to_i128(half %a) nounwind {
274768b0b4eSCraig Topper; RV64I-LABEL: fptoui_sat_f16_to_i128:
275768b0b4eSCraig Topper; RV64I:       # %bb.0:
276768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, -32
277768b0b4eSCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
278768b0b4eSCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
279768b0b4eSCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
280768b0b4eSCraig Topper; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
281768b0b4eSCraig Topper; RV64I-NEXT:    call __extendhfsf2
282768b0b4eSCraig Topper; RV64I-NEXT:    mv s0, a0
283768b0b4eSCraig Topper; RV64I-NEXT:    lui a1, 522240
284768b0b4eSCraig Topper; RV64I-NEXT:    addiw a1, a1, -1
285768b0b4eSCraig Topper; RV64I-NEXT:    call __gtsf2
286768b0b4eSCraig Topper; RV64I-NEXT:    sgtz a0, a0
287768b0b4eSCraig Topper; RV64I-NEXT:    neg s1, a0
288768b0b4eSCraig Topper; RV64I-NEXT:    mv a0, s0
289768b0b4eSCraig Topper; RV64I-NEXT:    li a1, 0
290768b0b4eSCraig Topper; RV64I-NEXT:    call __gesf2
291768b0b4eSCraig Topper; RV64I-NEXT:    slti a0, a0, 0
292768b0b4eSCraig Topper; RV64I-NEXT:    addi s2, a0, -1
293*73186546SCraig Topper; RV64I-NEXT:    mv a0, s0
294768b0b4eSCraig Topper; RV64I-NEXT:    call __fixunssfti
295768b0b4eSCraig Topper; RV64I-NEXT:    and a0, s2, a0
296768b0b4eSCraig Topper; RV64I-NEXT:    and a1, s2, a1
2979122c523SPengcheng Wang; RV64I-NEXT:    or a0, s1, a0
298768b0b4eSCraig Topper; RV64I-NEXT:    or a1, s1, a1
299768b0b4eSCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
300768b0b4eSCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
301768b0b4eSCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
302768b0b4eSCraig Topper; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
303768b0b4eSCraig Topper; RV64I-NEXT:    addi sp, sp, 32
304768b0b4eSCraig Topper; RV64I-NEXT:    ret
305768b0b4eSCraig Topper;
306768b0b4eSCraig Topper; RV64IZFH-LABEL: fptoui_sat_f16_to_i128:
307768b0b4eSCraig Topper; RV64IZFH:       # %bb.0:
308768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, -32
309768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
310768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
311768b0b4eSCraig Topper; RV64IZFH-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
312768b0b4eSCraig Topper; RV64IZFH-NEXT:    lui a0, %hi(.LCPI5_0)
313768b0b4eSCraig Topper; RV64IZFH-NEXT:    flw fa5, %lo(.LCPI5_0)(a0)
314768b0b4eSCraig Topper; RV64IZFH-NEXT:    fcvt.s.h fa0, fa0
3159122c523SPengcheng Wang; RV64IZFH-NEXT:    fmv.w.x fa4, zero
3169122c523SPengcheng Wang; RV64IZFH-NEXT:    fle.s a0, fa4, fa0
3179122c523SPengcheng Wang; RV64IZFH-NEXT:    flt.s a1, fa5, fa0
3189122c523SPengcheng Wang; RV64IZFH-NEXT:    neg s0, a1
319768b0b4eSCraig Topper; RV64IZFH-NEXT:    neg s1, a0
320768b0b4eSCraig Topper; RV64IZFH-NEXT:    call __fixunssfti
321768b0b4eSCraig Topper; RV64IZFH-NEXT:    and a0, s1, a0
322768b0b4eSCraig Topper; RV64IZFH-NEXT:    and a1, s1, a1
3239122c523SPengcheng Wang; RV64IZFH-NEXT:    or a0, s0, a0
324768b0b4eSCraig Topper; RV64IZFH-NEXT:    or a1, s0, a1
325768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
326768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
327768b0b4eSCraig Topper; RV64IZFH-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
328768b0b4eSCraig Topper; RV64IZFH-NEXT:    addi sp, sp, 32
329768b0b4eSCraig Topper; RV64IZFH-NEXT:    ret
330768b0b4eSCraig Topper;
331768b0b4eSCraig Topper; RV64IZHINX-LABEL: fptoui_sat_f16_to_i128:
332768b0b4eSCraig Topper; RV64IZHINX:       # %bb.0:
333768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, -32
334768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
335768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
336768b0b4eSCraig Topper; RV64IZHINX-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
337768b0b4eSCraig Topper; RV64IZHINX-NEXT:    fcvt.s.h a0, a0
338768b0b4eSCraig Topper; RV64IZHINX-NEXT:    lui a1, 522240
339768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addiw a1, a1, -1
3409122c523SPengcheng Wang; RV64IZHINX-NEXT:    fle.s a2, zero, a0
341768b0b4eSCraig Topper; RV64IZHINX-NEXT:    flt.s a1, a1, a0
342768b0b4eSCraig Topper; RV64IZHINX-NEXT:    neg s0, a1
3439122c523SPengcheng Wang; RV64IZHINX-NEXT:    neg s1, a2
344768b0b4eSCraig Topper; RV64IZHINX-NEXT:    call __fixunssfti
345768b0b4eSCraig Topper; RV64IZHINX-NEXT:    and a0, s1, a0
346768b0b4eSCraig Topper; RV64IZHINX-NEXT:    and a1, s1, a1
3479122c523SPengcheng Wang; RV64IZHINX-NEXT:    or a0, s0, a0
348768b0b4eSCraig Topper; RV64IZHINX-NEXT:    or a1, s0, a1
349768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
350768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
351768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
352768b0b4eSCraig Topper; RV64IZHINX-NEXT:    addi sp, sp, 32
353768b0b4eSCraig Topper; RV64IZHINX-NEXT:    ret
354768b0b4eSCraig Topper  %1 = tail call i128 @llvm.fptoui.sat.i128.f16(half %a)
355768b0b4eSCraig Topper  ret i128 %1
356768b0b4eSCraig Topper}
357768b0b4eSCraig Topperdeclare i128 @llvm.fptoui.sat.i128.f16(half)
358768b0b4eSCraig Topper;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
359768b0b4eSCraig Topper; CHECK: {{.*}}
360