xref: /llvm-project/llvm/test/CodeGen/RISCV/float-convert-strict.ll (revision 0a4e1c518bbca5f3bced6ded6dd71d2fe6622ac3)
1b7b260e1SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2b7b260e1SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \
3b271184fSCraig Topper; RUN:   -disable-strictnode-mutation -target-abi=ilp32f \
484bacb18SShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIF,RV32IF %s
5b7b260e1SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \
6b271184fSCraig Topper; RUN:   -disable-strictnode-mutation -target-abi=lp64f \
784bacb18SShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIF,RV64IF %s
8fe558efeSShao-Ce SUN; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s \
9fe558efeSShao-Ce SUN; RUN:   -disable-strictnode-mutation -target-abi=ilp32 \
10fe558efeSShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIZFINX,RV32IZFINX %s
11fe558efeSShao-Ce SUN; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s \
12fe558efeSShao-Ce SUN; RUN:   -disable-strictnode-mutation -target-abi=lp64 \
13fe558efeSShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIZFINX,RV64IZFINX %s
14b7b260e1SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
15b7b260e1SCraig Topper; RUN:   -disable-strictnode-mutation | FileCheck -check-prefix=RV32I %s
16b7b260e1SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
17b7b260e1SCraig Topper; RUN:   -disable-strictnode-mutation | FileCheck -check-prefix=RV64I %s
18b7b260e1SCraig Topper
19b7b260e1SCraig Topper; NOTE: The rounding mode metadata does not effect which instruction is
20b7b260e1SCraig Topper; selected. Dynamic rounding mode is always used for operations that
21b7b260e1SCraig Topper; support rounding mode.
22b7b260e1SCraig Topper
23b7b260e1SCraig Topperdefine i32 @fcvt_w_s(float %a) nounwind strictfp {
2484bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_w_s:
2584bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
2684bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.w.s a0, fa0, rtz
2784bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
28b7b260e1SCraig Topper;
29fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_w_s:
30fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
31fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.w.s a0, a0, rtz
32fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
33fe558efeSShao-Ce SUN;
34b7b260e1SCraig Topper; RV32I-LABEL: fcvt_w_s:
35b7b260e1SCraig Topper; RV32I:       # %bb.0:
36b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
37b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
38eabaee0cSFangrui Song; RV32I-NEXT:    call __fixsfsi
39b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
40b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
41b7b260e1SCraig Topper; RV32I-NEXT:    ret
42b7b260e1SCraig Topper;
43b7b260e1SCraig Topper; RV64I-LABEL: fcvt_w_s:
44b7b260e1SCraig Topper; RV64I:       # %bb.0:
45b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
46b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
47eabaee0cSFangrui Song; RV64I-NEXT:    call __fixsfsi
48b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
49b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
50b7b260e1SCraig Topper; RV64I-NEXT:    ret
5195c2d01dSKevin P. Neal  %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f32(float %a, metadata !"fpexcept.strict")
52b7b260e1SCraig Topper  ret i32 %1
53b7b260e1SCraig Topper}
54b7b260e1SCraig Topperdeclare i32 @llvm.experimental.constrained.fptosi.i32.f32(float, metadata)
55b7b260e1SCraig Topper
56b7b260e1SCraig Topperdefine i32 @fcvt_wu_s(float %a) nounwind strictfp {
5784bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_wu_s:
5884bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
5984bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.wu.s a0, fa0, rtz
6084bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
61b7b260e1SCraig Topper;
62fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_wu_s:
63fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
64fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.wu.s a0, a0, rtz
65fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
66fe558efeSShao-Ce SUN;
67b7b260e1SCraig Topper; RV32I-LABEL: fcvt_wu_s:
68b7b260e1SCraig Topper; RV32I:       # %bb.0:
69b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
70b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
71eabaee0cSFangrui Song; RV32I-NEXT:    call __fixunssfsi
72b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
73b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
74b7b260e1SCraig Topper; RV32I-NEXT:    ret
75b7b260e1SCraig Topper;
76b7b260e1SCraig Topper; RV64I-LABEL: fcvt_wu_s:
77b7b260e1SCraig Topper; RV64I:       # %bb.0:
78b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
79b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
80eabaee0cSFangrui Song; RV64I-NEXT:    call __fixunssfsi
81b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
82b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
83b7b260e1SCraig Topper; RV64I-NEXT:    ret
8495c2d01dSKevin P. Neal  %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %a, metadata !"fpexcept.strict")
85b7b260e1SCraig Topper  ret i32 %1
86b7b260e1SCraig Topper}
87b7b260e1SCraig Topperdeclare i32 @llvm.experimental.constrained.fptoui.i32.f32(float, metadata)
88b7b260e1SCraig Topper
89b7b260e1SCraig Topper; Test where the fptoui has multiple uses, one of which causes a sext to be
90b7b260e1SCraig Topper; inserted on RV64.
9195c2d01dSKevin P. Nealdefine i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind strictfp {
9284bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_wu_s_multiple_use:
9384bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
947b970290SLiaoChunyu; CHECKIF-NEXT:    fcvt.wu.s a0, fa0, rtz
95fc973037SLiaoChunyu; CHECKIF-NEXT:    seqz a1, a0
96fc973037SLiaoChunyu; CHECKIF-NEXT:    add a0, a0, a1
9784bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
98b7b260e1SCraig Topper;
99fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_wu_s_multiple_use:
100fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
101fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.wu.s a0, a0, rtz
102fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    seqz a1, a0
103fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    add a0, a0, a1
104fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
105fe558efeSShao-Ce SUN;
106b7b260e1SCraig Topper; RV32I-LABEL: fcvt_wu_s_multiple_use:
107b7b260e1SCraig Topper; RV32I:       # %bb.0:
108b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
109b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
110eabaee0cSFangrui Song; RV32I-NEXT:    call __fixunssfsi
111fc973037SLiaoChunyu; RV32I-NEXT:    seqz a1, a0
112fc973037SLiaoChunyu; RV32I-NEXT:    add a0, a0, a1
113b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
114b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
115b7b260e1SCraig Topper; RV32I-NEXT:    ret
116b7b260e1SCraig Topper;
117b7b260e1SCraig Topper; RV64I-LABEL: fcvt_wu_s_multiple_use:
118b7b260e1SCraig Topper; RV64I:       # %bb.0:
119b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
120b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
121eabaee0cSFangrui Song; RV64I-NEXT:    call __fixunssfsi
122fc973037SLiaoChunyu; RV64I-NEXT:    seqz a1, a0
123fc973037SLiaoChunyu; RV64I-NEXT:    add a0, a0, a1
124b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
125b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
126b7b260e1SCraig Topper; RV64I-NEXT:    ret
12795c2d01dSKevin P. Neal  %a = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %x, metadata !"fpexcept.strict")
128b7b260e1SCraig Topper  %b = icmp eq i32 %a, 0
129b7b260e1SCraig Topper  %c = select i1 %b, i32 1, i32 %a
130b7b260e1SCraig Topper  ret i32 %c
131b7b260e1SCraig Topper}
132b7b260e1SCraig Topper
133b7b260e1SCraig Topperdefine float @fcvt_s_w(i32 %a) nounwind strictfp {
13484bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_s_w:
13584bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
13684bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.s.w fa0, a0
13784bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
138b7b260e1SCraig Topper;
139fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_s_w:
140fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
141fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.s.w a0, a0
142fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
143fe558efeSShao-Ce SUN;
144b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_w:
145b7b260e1SCraig Topper; RV32I:       # %bb.0:
146b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
147b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
148eabaee0cSFangrui Song; RV32I-NEXT:    call __floatsisf
149b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
150b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
151b7b260e1SCraig Topper; RV32I-NEXT:    ret
152b7b260e1SCraig Topper;
153b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_w:
154b7b260e1SCraig Topper; RV64I:       # %bb.0:
155b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
156b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
157b7b260e1SCraig Topper; RV64I-NEXT:    sext.w a0, a0
158eabaee0cSFangrui Song; RV64I-NEXT:    call __floatsisf
159b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
160b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
161b7b260e1SCraig Topper; RV64I-NEXT:    ret
16295c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
163b7b260e1SCraig Topper  ret float %1
164b7b260e1SCraig Topper}
165b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)
166b7b260e1SCraig Topper
1671456b686SNikita Popovdefine float @fcvt_s_w_load(ptr %p) nounwind strictfp {
16884bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_s_w_load:
16984bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
17084bacb18SShao-Ce SUN; CHECKIF-NEXT:    lw a0, 0(a0)
17184bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.s.w fa0, a0
17284bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
173b7b260e1SCraig Topper;
174fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_s_w_load:
175fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
176fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    lw a0, 0(a0)
177fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.s.w a0, a0
178fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
179fe558efeSShao-Ce SUN;
180b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_w_load:
181b7b260e1SCraig Topper; RV32I:       # %bb.0:
182b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
183b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
184b7b260e1SCraig Topper; RV32I-NEXT:    lw a0, 0(a0)
185eabaee0cSFangrui Song; RV32I-NEXT:    call __floatsisf
186b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
187b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
188b7b260e1SCraig Topper; RV32I-NEXT:    ret
189b7b260e1SCraig Topper;
190b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_w_load:
191b7b260e1SCraig Topper; RV64I:       # %bb.0:
192b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
193b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
194b7b260e1SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
195eabaee0cSFangrui Song; RV64I-NEXT:    call __floatsisf
196b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
197b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
198b7b260e1SCraig Topper; RV64I-NEXT:    ret
1991456b686SNikita Popov  %a = load i32, ptr %p
20095c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
201b7b260e1SCraig Topper  ret float %1
202b7b260e1SCraig Topper}
203b7b260e1SCraig Topper
204b7b260e1SCraig Topperdefine float @fcvt_s_wu(i32 %a) nounwind strictfp {
20584bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_s_wu:
20684bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
20784bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.s.wu fa0, a0
20884bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
209b7b260e1SCraig Topper;
210fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_s_wu:
211fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
212fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.s.wu a0, a0
213fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
214fe558efeSShao-Ce SUN;
215b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_wu:
216b7b260e1SCraig Topper; RV32I:       # %bb.0:
217b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
218b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
219eabaee0cSFangrui Song; RV32I-NEXT:    call __floatunsisf
220b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
221b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
222b7b260e1SCraig Topper; RV32I-NEXT:    ret
223b7b260e1SCraig Topper;
224b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_wu:
225b7b260e1SCraig Topper; RV64I:       # %bb.0:
226b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
227b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
228b7b260e1SCraig Topper; RV64I-NEXT:    sext.w a0, a0
229eabaee0cSFangrui Song; RV64I-NEXT:    call __floatunsisf
230b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
231b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
232b7b260e1SCraig Topper; RV64I-NEXT:    ret
23395c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
234b7b260e1SCraig Topper  ret float %1
235b7b260e1SCraig Topper}
236b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata, metadata)
237b7b260e1SCraig Topper
2381456b686SNikita Popovdefine float @fcvt_s_wu_load(ptr %p) nounwind strictfp {
239b7b260e1SCraig Topper; RV32IF-LABEL: fcvt_s_wu_load:
240b7b260e1SCraig Topper; RV32IF:       # %bb.0:
241b7b260e1SCraig Topper; RV32IF-NEXT:    lw a0, 0(a0)
242b271184fSCraig Topper; RV32IF-NEXT:    fcvt.s.wu fa0, a0
243b7b260e1SCraig Topper; RV32IF-NEXT:    ret
244b7b260e1SCraig Topper;
245b7b260e1SCraig Topper; RV64IF-LABEL: fcvt_s_wu_load:
246b7b260e1SCraig Topper; RV64IF:       # %bb.0:
247b7b260e1SCraig Topper; RV64IF-NEXT:    lwu a0, 0(a0)
248b271184fSCraig Topper; RV64IF-NEXT:    fcvt.s.wu fa0, a0
249b7b260e1SCraig Topper; RV64IF-NEXT:    ret
250b7b260e1SCraig Topper;
251fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fcvt_s_wu_load:
252fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
253fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    lw a0, 0(a0)
254fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    fcvt.s.wu a0, a0
255fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
256fe558efeSShao-Ce SUN;
257fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fcvt_s_wu_load:
258fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
259fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    lwu a0, 0(a0)
260fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    fcvt.s.wu a0, a0
261fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
262fe558efeSShao-Ce SUN;
263b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_wu_load:
264b7b260e1SCraig Topper; RV32I:       # %bb.0:
265b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
266b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
267b7b260e1SCraig Topper; RV32I-NEXT:    lw a0, 0(a0)
268eabaee0cSFangrui Song; RV32I-NEXT:    call __floatunsisf
269b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
270b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
271b7b260e1SCraig Topper; RV32I-NEXT:    ret
272b7b260e1SCraig Topper;
273b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_wu_load:
274b7b260e1SCraig Topper; RV64I:       # %bb.0:
275b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
276b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
277b7b260e1SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
278eabaee0cSFangrui Song; RV64I-NEXT:    call __floatunsisf
279b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
280b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
281b7b260e1SCraig Topper; RV64I-NEXT:    ret
2821456b686SNikita Popov  %a = load i32, ptr %p
28395c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
284b7b260e1SCraig Topper  ret float %1
285b7b260e1SCraig Topper}
286b7b260e1SCraig Topper
287b7b260e1SCraig Topperdefine i64 @fcvt_l_s(float %a) nounwind strictfp {
288b7b260e1SCraig Topper; RV32IF-LABEL: fcvt_l_s:
289b7b260e1SCraig Topper; RV32IF:       # %bb.0:
290b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, -16
291b7b260e1SCraig Topper; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
292eabaee0cSFangrui Song; RV32IF-NEXT:    call __fixsfdi
293b7b260e1SCraig Topper; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
294b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, 16
295b7b260e1SCraig Topper; RV32IF-NEXT:    ret
296b7b260e1SCraig Topper;
297b7b260e1SCraig Topper; RV64IF-LABEL: fcvt_l_s:
298b7b260e1SCraig Topper; RV64IF:       # %bb.0:
299b271184fSCraig Topper; RV64IF-NEXT:    fcvt.l.s a0, fa0, rtz
300b7b260e1SCraig Topper; RV64IF-NEXT:    ret
301b7b260e1SCraig Topper;
302fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fcvt_l_s:
303fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
304fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, -16
305fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
306eabaee0cSFangrui Song; RV32IZFINX-NEXT:    call __fixsfdi
307fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
308fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, 16
309fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
310fe558efeSShao-Ce SUN;
311fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fcvt_l_s:
312fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
313fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    fcvt.l.s a0, a0, rtz
314fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
315fe558efeSShao-Ce SUN;
316b7b260e1SCraig Topper; RV32I-LABEL: fcvt_l_s:
317b7b260e1SCraig Topper; RV32I:       # %bb.0:
318b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
319b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
320eabaee0cSFangrui Song; RV32I-NEXT:    call __fixsfdi
321b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
322b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
323b7b260e1SCraig Topper; RV32I-NEXT:    ret
324b7b260e1SCraig Topper;
325b7b260e1SCraig Topper; RV64I-LABEL: fcvt_l_s:
326b7b260e1SCraig Topper; RV64I:       # %bb.0:
327b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
328b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
329eabaee0cSFangrui Song; RV64I-NEXT:    call __fixsfdi
330b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
331b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
332b7b260e1SCraig Topper; RV64I-NEXT:    ret
33395c2d01dSKevin P. Neal  %1 = call i64 @llvm.experimental.constrained.fptosi.i64.f32(float %a, metadata !"fpexcept.strict")
334b7b260e1SCraig Topper  ret i64 %1
335b7b260e1SCraig Topper}
336b7b260e1SCraig Topperdeclare i64 @llvm.experimental.constrained.fptosi.i64.f32(float, metadata)
337b7b260e1SCraig Topper
338b7b260e1SCraig Topperdefine i64 @fcvt_lu_s(float %a) nounwind strictfp {
339b7b260e1SCraig Topper; RV32IF-LABEL: fcvt_lu_s:
340b7b260e1SCraig Topper; RV32IF:       # %bb.0:
341b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, -16
342b7b260e1SCraig Topper; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
343eabaee0cSFangrui Song; RV32IF-NEXT:    call __fixunssfdi
344b7b260e1SCraig Topper; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
345b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, 16
346b7b260e1SCraig Topper; RV32IF-NEXT:    ret
347b7b260e1SCraig Topper;
348b7b260e1SCraig Topper; RV64IF-LABEL: fcvt_lu_s:
349b7b260e1SCraig Topper; RV64IF:       # %bb.0:
350b271184fSCraig Topper; RV64IF-NEXT:    fcvt.lu.s a0, fa0, rtz
351b7b260e1SCraig Topper; RV64IF-NEXT:    ret
352b7b260e1SCraig Topper;
353fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fcvt_lu_s:
354fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
355fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, -16
356fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
357eabaee0cSFangrui Song; RV32IZFINX-NEXT:    call __fixunssfdi
358fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
359fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, 16
360fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
361fe558efeSShao-Ce SUN;
362fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fcvt_lu_s:
363fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
364fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    fcvt.lu.s a0, a0, rtz
365fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
366fe558efeSShao-Ce SUN;
367b7b260e1SCraig Topper; RV32I-LABEL: fcvt_lu_s:
368b7b260e1SCraig Topper; RV32I:       # %bb.0:
369b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
370b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
371eabaee0cSFangrui Song; RV32I-NEXT:    call __fixunssfdi
372b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
373b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
374b7b260e1SCraig Topper; RV32I-NEXT:    ret
375b7b260e1SCraig Topper;
376b7b260e1SCraig Topper; RV64I-LABEL: fcvt_lu_s:
377b7b260e1SCraig Topper; RV64I:       # %bb.0:
378b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
379b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
380eabaee0cSFangrui Song; RV64I-NEXT:    call __fixunssfdi
381b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
382b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
383b7b260e1SCraig Topper; RV64I-NEXT:    ret
38495c2d01dSKevin P. Neal  %1 = call i64 @llvm.experimental.constrained.fptoui.i64.f32(float %a, metadata !"fpexcept.strict")
385b7b260e1SCraig Topper  ret i64 %1
386b7b260e1SCraig Topper}
387b7b260e1SCraig Topperdeclare i64 @llvm.experimental.constrained.fptoui.i64.f32(float, metadata)
388b7b260e1SCraig Topper
389b7b260e1SCraig Topperdefine float @fcvt_s_l(i64 %a) nounwind strictfp {
390b7b260e1SCraig Topper; RV32IF-LABEL: fcvt_s_l:
391b7b260e1SCraig Topper; RV32IF:       # %bb.0:
392b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, -16
393b7b260e1SCraig Topper; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
394eabaee0cSFangrui Song; RV32IF-NEXT:    call __floatdisf
395b7b260e1SCraig Topper; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
396b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, 16
397b7b260e1SCraig Topper; RV32IF-NEXT:    ret
398b7b260e1SCraig Topper;
399b7b260e1SCraig Topper; RV64IF-LABEL: fcvt_s_l:
400b7b260e1SCraig Topper; RV64IF:       # %bb.0:
401b271184fSCraig Topper; RV64IF-NEXT:    fcvt.s.l fa0, a0
402b7b260e1SCraig Topper; RV64IF-NEXT:    ret
403b7b260e1SCraig Topper;
404fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fcvt_s_l:
405fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
406fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, -16
407fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
408eabaee0cSFangrui Song; RV32IZFINX-NEXT:    call __floatdisf
409fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
410fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, 16
411fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
412fe558efeSShao-Ce SUN;
413fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fcvt_s_l:
414fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
415fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    fcvt.s.l a0, a0
416fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
417fe558efeSShao-Ce SUN;
418b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_l:
419b7b260e1SCraig Topper; RV32I:       # %bb.0:
420b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
421b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
422eabaee0cSFangrui Song; RV32I-NEXT:    call __floatdisf
423b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
424b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
425b7b260e1SCraig Topper; RV32I-NEXT:    ret
426b7b260e1SCraig Topper;
427b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_l:
428b7b260e1SCraig Topper; RV64I:       # %bb.0:
429b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
430b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
431eabaee0cSFangrui Song; RV64I-NEXT:    call __floatdisf
432b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
433b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
434b7b260e1SCraig Topper; RV64I-NEXT:    ret
43595c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.sitofp.f32.i64(i64 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
436b7b260e1SCraig Topper  ret float %1
437b7b260e1SCraig Topper}
438b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.sitofp.f32.i64(i64, metadata, metadata)
439b7b260e1SCraig Topper
440b7b260e1SCraig Topperdefine float @fcvt_s_lu(i64 %a) nounwind strictfp {
441b7b260e1SCraig Topper; RV32IF-LABEL: fcvt_s_lu:
442b7b260e1SCraig Topper; RV32IF:       # %bb.0:
443b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, -16
444b7b260e1SCraig Topper; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
445eabaee0cSFangrui Song; RV32IF-NEXT:    call __floatundisf
446b7b260e1SCraig Topper; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
447b7b260e1SCraig Topper; RV32IF-NEXT:    addi sp, sp, 16
448b7b260e1SCraig Topper; RV32IF-NEXT:    ret
449b7b260e1SCraig Topper;
450b7b260e1SCraig Topper; RV64IF-LABEL: fcvt_s_lu:
451b7b260e1SCraig Topper; RV64IF:       # %bb.0:
452b271184fSCraig Topper; RV64IF-NEXT:    fcvt.s.lu fa0, a0
453b7b260e1SCraig Topper; RV64IF-NEXT:    ret
454b7b260e1SCraig Topper;
455fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fcvt_s_lu:
456fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
457fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, -16
458fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
459eabaee0cSFangrui Song; RV32IZFINX-NEXT:    call __floatundisf
460fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
461fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, 16
462fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
463fe558efeSShao-Ce SUN;
464fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fcvt_s_lu:
465fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
466fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    fcvt.s.lu a0, a0
467fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
468fe558efeSShao-Ce SUN;
469b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_lu:
470b7b260e1SCraig Topper; RV32I:       # %bb.0:
471b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
472b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
473eabaee0cSFangrui Song; RV32I-NEXT:    call __floatundisf
474b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
475b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
476b7b260e1SCraig Topper; RV32I-NEXT:    ret
477b7b260e1SCraig Topper;
478b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_lu:
479b7b260e1SCraig Topper; RV64I:       # %bb.0:
480b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
481b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
482eabaee0cSFangrui Song; RV64I-NEXT:    call __floatundisf
483b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
484b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
485b7b260e1SCraig Topper; RV64I-NEXT:    ret
48695c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.uitofp.f32.i64(i64 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
487b7b260e1SCraig Topper  ret float %1
488b7b260e1SCraig Topper}
489b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.uitofp.f32.i64(i64, metadata, metadata)
490b7b260e1SCraig Topper
491b7b260e1SCraig Topperdefine float @fcvt_s_w_i8(i8 signext %a) nounwind strictfp {
49284bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_s_w_i8:
49384bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
49484bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.s.w fa0, a0
49584bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
496b7b260e1SCraig Topper;
497fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_s_w_i8:
498fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
499fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.s.w a0, a0
500fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
501fe558efeSShao-Ce SUN;
502b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_w_i8:
503b7b260e1SCraig Topper; RV32I:       # %bb.0:
504b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
505b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
506eabaee0cSFangrui Song; RV32I-NEXT:    call __floatsisf
507b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
508b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
509b7b260e1SCraig Topper; RV32I-NEXT:    ret
510b7b260e1SCraig Topper;
511b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_w_i8:
512b7b260e1SCraig Topper; RV64I:       # %bb.0:
513b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
514b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
515eabaee0cSFangrui Song; RV64I-NEXT:    call __floatsisf
516b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
517b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
518b7b260e1SCraig Topper; RV64I-NEXT:    ret
51995c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.sitofp.f32.i8(i8 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
520b7b260e1SCraig Topper  ret float %1
521b7b260e1SCraig Topper}
522b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.sitofp.f32.i8(i8, metadata, metadata)
523b7b260e1SCraig Topper
524b7b260e1SCraig Topperdefine float @fcvt_s_wu_i8(i8 zeroext %a) nounwind strictfp {
52584bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_s_wu_i8:
52684bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
52784bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.s.wu fa0, a0
52884bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
529b7b260e1SCraig Topper;
530fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_s_wu_i8:
531fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
532fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.s.wu a0, a0
533fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
534fe558efeSShao-Ce SUN;
535b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_wu_i8:
536b7b260e1SCraig Topper; RV32I:       # %bb.0:
537b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
538b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
539eabaee0cSFangrui Song; RV32I-NEXT:    call __floatunsisf
540b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
541b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
542b7b260e1SCraig Topper; RV32I-NEXT:    ret
543b7b260e1SCraig Topper;
544b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_wu_i8:
545b7b260e1SCraig Topper; RV64I:       # %bb.0:
546b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
547b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
548eabaee0cSFangrui Song; RV64I-NEXT:    call __floatunsisf
549b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
550b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
551b7b260e1SCraig Topper; RV64I-NEXT:    ret
552b7b260e1SCraig Topper  %1 = call float @llvm.experimental.constrained.uitofp.f32.i8(i8 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
553b7b260e1SCraig Topper  ret float %1
554b7b260e1SCraig Topper}
555b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.uitofp.f32.i8(i8, metadata, metadata)
556b7b260e1SCraig Topper
557b7b260e1SCraig Topperdefine float @fcvt_s_w_i16(i16 signext %a) nounwind strictfp {
55884bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_s_w_i16:
55984bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
56084bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.s.w fa0, a0
56184bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
562b7b260e1SCraig Topper;
563fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_s_w_i16:
564fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
565fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.s.w a0, a0
566fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
567fe558efeSShao-Ce SUN;
568b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_w_i16:
569b7b260e1SCraig Topper; RV32I:       # %bb.0:
570b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
571b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
572eabaee0cSFangrui Song; RV32I-NEXT:    call __floatsisf
573b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
574b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
575b7b260e1SCraig Topper; RV32I-NEXT:    ret
576b7b260e1SCraig Topper;
577b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_w_i16:
578b7b260e1SCraig Topper; RV64I:       # %bb.0:
579b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
580b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
581eabaee0cSFangrui Song; RV64I-NEXT:    call __floatsisf
582b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
583b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
584b7b260e1SCraig Topper; RV64I-NEXT:    ret
58595c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.sitofp.f32.i16(i16 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
586b7b260e1SCraig Topper  ret float %1
587b7b260e1SCraig Topper}
588b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.sitofp.f32.i16(i16, metadata, metadata)
589b7b260e1SCraig Topper
590b7b260e1SCraig Topperdefine float @fcvt_s_wu_i16(i16 zeroext %a) nounwind strictfp {
59184bacb18SShao-Ce SUN; CHECKIF-LABEL: fcvt_s_wu_i16:
59284bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
59384bacb18SShao-Ce SUN; CHECKIF-NEXT:    fcvt.s.wu fa0, a0
59484bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
595b7b260e1SCraig Topper;
596fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fcvt_s_wu_i16:
597fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
598fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fcvt.s.wu a0, a0
599fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
600fe558efeSShao-Ce SUN;
601b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_wu_i16:
602b7b260e1SCraig Topper; RV32I:       # %bb.0:
603b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
604b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
605eabaee0cSFangrui Song; RV32I-NEXT:    call __floatunsisf
606b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
607b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
608b7b260e1SCraig Topper; RV32I-NEXT:    ret
609b7b260e1SCraig Topper;
610b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_wu_i16:
611b7b260e1SCraig Topper; RV64I:       # %bb.0:
612b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
613b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
614eabaee0cSFangrui Song; RV64I-NEXT:    call __floatunsisf
615b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
616b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
617b7b260e1SCraig Topper; RV64I-NEXT:    ret
61895c2d01dSKevin P. Neal  %1 = call float @llvm.experimental.constrained.uitofp.f32.i16(i16 %a, metadata !"round.dynamic", metadata !"fpexcept.strict")
619b7b260e1SCraig Topper  ret float %1
620b7b260e1SCraig Topper}
621b7b260e1SCraig Topperdeclare float @llvm.experimental.constrained.uitofp.f32.i16(i16, metadata, metadata)
622b7b260e1SCraig Topper
623b7b260e1SCraig Topper; Make sure we select W version of addi on RV64.
62495c2d01dSKevin P. Nealdefine signext i32 @fcvt_s_w_demanded_bits(i32 signext %0, ptr %1) nounwind strictfp {
625b7b260e1SCraig Topper; RV32IF-LABEL: fcvt_s_w_demanded_bits:
626b7b260e1SCraig Topper; RV32IF:       # %bb.0:
627b7b260e1SCraig Topper; RV32IF-NEXT:    addi a0, a0, 1
6287b0c4184SCraig Topper; RV32IF-NEXT:    fcvt.s.w fa5, a0
6297b0c4184SCraig Topper; RV32IF-NEXT:    fsw fa5, 0(a1)
630b7b260e1SCraig Topper; RV32IF-NEXT:    ret
631b7b260e1SCraig Topper;
632b7b260e1SCraig Topper; RV64IF-LABEL: fcvt_s_w_demanded_bits:
633b7b260e1SCraig Topper; RV64IF:       # %bb.0:
634b7b260e1SCraig Topper; RV64IF-NEXT:    addiw a0, a0, 1
6357b0c4184SCraig Topper; RV64IF-NEXT:    fcvt.s.w fa5, a0
6367b0c4184SCraig Topper; RV64IF-NEXT:    fsw fa5, 0(a1)
637b7b260e1SCraig Topper; RV64IF-NEXT:    ret
638b7b260e1SCraig Topper;
639fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fcvt_s_w_demanded_bits:
640fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
641fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi a0, a0, 1
642fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    fcvt.s.w a2, a0
643fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw a2, 0(a1)
644fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
645fe558efeSShao-Ce SUN;
646fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fcvt_s_w_demanded_bits:
647fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
648*0a4e1c51SCraig Topper; RV64IZFINX-NEXT:    addiw a0, a0, 1
649*0a4e1c51SCraig Topper; RV64IZFINX-NEXT:    fcvt.s.w a2, a0
650*0a4e1c51SCraig Topper; RV64IZFINX-NEXT:    sw a2, 0(a1)
651fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
652fe558efeSShao-Ce SUN;
653b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_w_demanded_bits:
654b7b260e1SCraig Topper; RV32I:       # %bb.0:
655b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
656b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
657b7b260e1SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
658b7b260e1SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
659b7b260e1SCraig Topper; RV32I-NEXT:    mv s0, a1
660b7b260e1SCraig Topper; RV32I-NEXT:    addi s1, a0, 1
661b7b260e1SCraig Topper; RV32I-NEXT:    mv a0, s1
662eabaee0cSFangrui Song; RV32I-NEXT:    call __floatsisf
663b7b260e1SCraig Topper; RV32I-NEXT:    sw a0, 0(s0)
664b7b260e1SCraig Topper; RV32I-NEXT:    mv a0, s1
665b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
666b7b260e1SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
667b7b260e1SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
668b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
669b7b260e1SCraig Topper; RV32I-NEXT:    ret
670b7b260e1SCraig Topper;
671b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_w_demanded_bits:
672b7b260e1SCraig Topper; RV64I:       # %bb.0:
673b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
674b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
675b7b260e1SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
676b7b260e1SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
677b7b260e1SCraig Topper; RV64I-NEXT:    mv s0, a1
678b7b260e1SCraig Topper; RV64I-NEXT:    addiw s1, a0, 1
679b7b260e1SCraig Topper; RV64I-NEXT:    mv a0, s1
680eabaee0cSFangrui Song; RV64I-NEXT:    call __floatsisf
681b7b260e1SCraig Topper; RV64I-NEXT:    sw a0, 0(s0)
682b7b260e1SCraig Topper; RV64I-NEXT:    mv a0, s1
683b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
684b7b260e1SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
685b7b260e1SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
686b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
687b7b260e1SCraig Topper; RV64I-NEXT:    ret
688b7b260e1SCraig Topper  %3 = add i32 %0, 1
68995c2d01dSKevin P. Neal  %4 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %3, metadata !"round.dynamic", metadata !"fpexcept.strict")
6901456b686SNikita Popov  store float %4, ptr %1, align 4
691b7b260e1SCraig Topper  ret i32 %3
692b7b260e1SCraig Topper}
693b7b260e1SCraig Topper
694b7b260e1SCraig Topper; Make sure we select W version of addi on RV64.
69595c2d01dSKevin P. Nealdefine signext i32 @fcvt_s_wu_demanded_bits(i32 signext %0, ptr %1) nounwind strictfp {
696b7b260e1SCraig Topper; RV32IF-LABEL: fcvt_s_wu_demanded_bits:
697b7b260e1SCraig Topper; RV32IF:       # %bb.0:
698b7b260e1SCraig Topper; RV32IF-NEXT:    addi a0, a0, 1
6997b0c4184SCraig Topper; RV32IF-NEXT:    fcvt.s.wu fa5, a0
7007b0c4184SCraig Topper; RV32IF-NEXT:    fsw fa5, 0(a1)
701b7b260e1SCraig Topper; RV32IF-NEXT:    ret
702b7b260e1SCraig Topper;
703b7b260e1SCraig Topper; RV64IF-LABEL: fcvt_s_wu_demanded_bits:
704b7b260e1SCraig Topper; RV64IF:       # %bb.0:
705b7b260e1SCraig Topper; RV64IF-NEXT:    addiw a0, a0, 1
7067b0c4184SCraig Topper; RV64IF-NEXT:    fcvt.s.wu fa5, a0
7077b0c4184SCraig Topper; RV64IF-NEXT:    fsw fa5, 0(a1)
708b7b260e1SCraig Topper; RV64IF-NEXT:    ret
709b7b260e1SCraig Topper;
710fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fcvt_s_wu_demanded_bits:
711fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
712fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi a0, a0, 1
713fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    fcvt.s.wu a2, a0
714fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw a2, 0(a1)
715fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
716fe558efeSShao-Ce SUN;
717fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fcvt_s_wu_demanded_bits:
718fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
719fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    addiw a0, a0, 1
720fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    fcvt.s.wu a2, a0
721fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    sw a2, 0(a1)
722fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
723fe558efeSShao-Ce SUN;
724b7b260e1SCraig Topper; RV32I-LABEL: fcvt_s_wu_demanded_bits:
725b7b260e1SCraig Topper; RV32I:       # %bb.0:
726b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
727b7b260e1SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
728b7b260e1SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
729b7b260e1SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
730b7b260e1SCraig Topper; RV32I-NEXT:    mv s0, a1
731b7b260e1SCraig Topper; RV32I-NEXT:    addi s1, a0, 1
732b7b260e1SCraig Topper; RV32I-NEXT:    mv a0, s1
733eabaee0cSFangrui Song; RV32I-NEXT:    call __floatunsisf
734b7b260e1SCraig Topper; RV32I-NEXT:    sw a0, 0(s0)
735b7b260e1SCraig Topper; RV32I-NEXT:    mv a0, s1
736b7b260e1SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
737b7b260e1SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
738b7b260e1SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
739b7b260e1SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
740b7b260e1SCraig Topper; RV32I-NEXT:    ret
741b7b260e1SCraig Topper;
742b7b260e1SCraig Topper; RV64I-LABEL: fcvt_s_wu_demanded_bits:
743b7b260e1SCraig Topper; RV64I:       # %bb.0:
744b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
745b7b260e1SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
746b7b260e1SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
747b7b260e1SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
748b7b260e1SCraig Topper; RV64I-NEXT:    mv s0, a1
749b7b260e1SCraig Topper; RV64I-NEXT:    addiw s1, a0, 1
750b7b260e1SCraig Topper; RV64I-NEXT:    mv a0, s1
751eabaee0cSFangrui Song; RV64I-NEXT:    call __floatunsisf
752b7b260e1SCraig Topper; RV64I-NEXT:    sw a0, 0(s0)
753b7b260e1SCraig Topper; RV64I-NEXT:    mv a0, s1
754b7b260e1SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
755b7b260e1SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
756b7b260e1SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
757b7b260e1SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
758b7b260e1SCraig Topper; RV64I-NEXT:    ret
759b7b260e1SCraig Topper  %3 = add i32 %0, 1
76095c2d01dSKevin P. Neal  %4 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %3, metadata !"round.dynamic", metadata !"fpexcept.strict")
7611456b686SNikita Popov  store float %4, ptr %1, align 4
762b7b260e1SCraig Topper  ret i32 %3
763b7b260e1SCraig Topper}
764