xref: /llvm-project/llvm/test/CodeGen/RISCV/bfloat-convert.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
17a1b2adcSAlex Bradbury; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
232597685SJianjian Guan; RUN: llc -mtriple=riscv32 -mattr=+zfbfmin -verify-machineinstrs \
3380fd820SAlex Bradbury; RUN:   -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECK32ZFBFMIN,RV32IZFBFMIN %s
432597685SJianjian Guan; RUN: llc -mtriple=riscv32 -mattr=+d,+zfbfmin -verify-machineinstrs \
5380fd820SAlex Bradbury; RUN:   -target-abi ilp32d < %s | FileCheck -check-prefixes=CHECK32ZFBFMIN,R32IDZFBFMIN %s
6380fd820SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs \
7380fd820SAlex Bradbury; RUN:   -target-abi ilp32d < %s | FileCheck -check-prefixes=RV32ID %s
832597685SJianjian Guan; RUN: llc -mtriple=riscv64 -mattr=+zfbfmin -verify-machineinstrs \
9380fd820SAlex Bradbury; RUN:   -target-abi lp64f < %s | FileCheck -check-prefixes=CHECK64ZFBFMIN,RV64IZFBFMIN %s
1032597685SJianjian Guan; RUN: llc -mtriple=riscv64 -mattr=+d,+zfbfmin -verify-machineinstrs \
11380fd820SAlex Bradbury; RUN:   -target-abi lp64d < %s | FileCheck -check-prefixes=CHECK64ZFBFMIN,RV64IDZFBFMIN %s
12380fd820SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs \
13380fd820SAlex Bradbury; RUN:   -target-abi lp64d < %s | FileCheck -check-prefixes=RV64ID %s
147a1b2adcSAlex Bradbury
157a1b2adcSAlex Bradbury; These tests descend from float-arith.ll, where each function was targeted at
167a1b2adcSAlex Bradbury; a particular RISC-V FPU instruction.
177a1b2adcSAlex Bradbury
187a1b2adcSAlex Bradburydefine i16 @fcvt_si_bf16(bfloat %a) nounwind {
19380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_si_bf16:
20380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
212a9f93bfSCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
22380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
23380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
247a1b2adcSAlex Bradbury;
25380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_si_bf16:
26380fd820SAlex Bradbury; RV32ID:       # %bb.0:
27380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
28380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
29380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
30380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.w.s a0, fa5, rtz
31380fd820SAlex Bradbury; RV32ID-NEXT:    ret
32380fd820SAlex Bradbury;
33380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_si_bf16:
34380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
352a9f93bfSCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
36380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.l.s a0, fa5, rtz
37380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
38380fd820SAlex Bradbury;
39380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_si_bf16:
40380fd820SAlex Bradbury; RV64ID:       # %bb.0:
41380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
42380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
43380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
44380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.l.s a0, fa5, rtz
45380fd820SAlex Bradbury; RV64ID-NEXT:    ret
467a1b2adcSAlex Bradbury  %1 = fptosi bfloat %a to i16
477a1b2adcSAlex Bradbury  ret i16 %1
487a1b2adcSAlex Bradbury}
497a1b2adcSAlex Bradbury
507a1b2adcSAlex Bradburydefine i16 @fcvt_si_bf16_sat(bfloat %a) nounwind {
51380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_si_bf16_sat:
52380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
53380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
54*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    lui a0, %hi(.LCPI1_0)
55*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
56*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
57*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    lui a0, 815104
58*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    fmv.w.x fa3, a0
59380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmax.s fa5, fa5, fa3
60*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    neg a0, a1
61380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmin.s fa5, fa5, fa4
62380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a1, fa5, rtz
63380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a0, a0, a1
64380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
657a1b2adcSAlex Bradbury;
66380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_si_bf16_sat:
67380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
68380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
69380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 815104
70*9122c523SPengcheng Wang; RV32ID-NEXT:    fmv.w.x fa5, a1
71*9122c523SPengcheng Wang; RV32ID-NEXT:    lui a1, %hi(.LCPI1_0)
72*9122c523SPengcheng Wang; RV32ID-NEXT:    slli a0, a0, 16
73*9122c523SPengcheng Wang; RV32ID-NEXT:    flw fa4, %lo(.LCPI1_0)(a1)
74*9122c523SPengcheng Wang; RV32ID-NEXT:    fmv.w.x fa3, a0
75*9122c523SPengcheng Wang; RV32ID-NEXT:    feq.s a0, fa3, fa3
76*9122c523SPengcheng Wang; RV32ID-NEXT:    fmax.s fa5, fa3, fa5
77380fd820SAlex Bradbury; RV32ID-NEXT:    neg a0, a0
78380fd820SAlex Bradbury; RV32ID-NEXT:    fmin.s fa5, fa5, fa4
79380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.w.s a1, fa5, rtz
80380fd820SAlex Bradbury; RV32ID-NEXT:    and a0, a0, a1
81380fd820SAlex Bradbury; RV32ID-NEXT:    ret
82380fd820SAlex Bradbury;
83380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_si_bf16_sat:
84380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
85380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
86*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    lui a0, %hi(.LCPI1_0)
87*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
88*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    flw fa4, %lo(.LCPI1_0)(a0)
89*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    lui a0, 815104
90*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    fmv.w.x fa3, a0
91380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmax.s fa5, fa5, fa3
92*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    neg a0, a1
93380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmin.s fa5, fa5, fa4
94380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.l.s a1, fa5, rtz
95380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a0, a1
96380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
97380fd820SAlex Bradbury;
98380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_si_bf16_sat:
99380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
100380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
101380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 815104
102*9122c523SPengcheng Wang; RV64ID-NEXT:    fmv.w.x fa5, a1
103*9122c523SPengcheng Wang; RV64ID-NEXT:    lui a1, %hi(.LCPI1_0)
104*9122c523SPengcheng Wang; RV64ID-NEXT:    slli a0, a0, 16
105*9122c523SPengcheng Wang; RV64ID-NEXT:    flw fa4, %lo(.LCPI1_0)(a1)
106*9122c523SPengcheng Wang; RV64ID-NEXT:    fmv.w.x fa3, a0
107*9122c523SPengcheng Wang; RV64ID-NEXT:    feq.s a0, fa3, fa3
108*9122c523SPengcheng Wang; RV64ID-NEXT:    fmax.s fa5, fa3, fa5
109380fd820SAlex Bradbury; RV64ID-NEXT:    neg a0, a0
110380fd820SAlex Bradbury; RV64ID-NEXT:    fmin.s fa5, fa5, fa4
111380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.l.s a1, fa5, rtz
112380fd820SAlex Bradbury; RV64ID-NEXT:    and a0, a0, a1
113380fd820SAlex Bradbury; RV64ID-NEXT:    ret
1147a1b2adcSAlex Bradburystart:
1157a1b2adcSAlex Bradbury  %0 = tail call i16 @llvm.fptosi.sat.i16.bf16(bfloat %a)
1167a1b2adcSAlex Bradbury  ret i16 %0
1177a1b2adcSAlex Bradbury}
1187a1b2adcSAlex Bradburydeclare i16 @llvm.fptosi.sat.i16.bf16(bfloat)
1197a1b2adcSAlex Bradbury
1207a1b2adcSAlex Bradburydefine i16 @fcvt_ui_bf16(bfloat %a) nounwind {
121380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_ui_bf16:
122380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1232a9f93bfSCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
124db3792b8SCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
125380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
1267a1b2adcSAlex Bradbury;
127380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_ui_bf16:
128380fd820SAlex Bradbury; RV32ID:       # %bb.0:
129380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
130380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
131380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
132380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
133380fd820SAlex Bradbury; RV32ID-NEXT:    ret
134380fd820SAlex Bradbury;
135380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_ui_bf16:
136380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1372a9f93bfSCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
138db3792b8SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.l.s a0, fa5, rtz
139380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
140380fd820SAlex Bradbury;
141380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_ui_bf16:
142380fd820SAlex Bradbury; RV64ID:       # %bb.0:
143380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
144380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
145380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
146380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
147380fd820SAlex Bradbury; RV64ID-NEXT:    ret
1487a1b2adcSAlex Bradbury  %1 = fptoui bfloat %a to i16
1497a1b2adcSAlex Bradbury  ret i16 %1
1507a1b2adcSAlex Bradbury}
1517a1b2adcSAlex Bradbury
1527a1b2adcSAlex Bradburydefine i16 @fcvt_ui_bf16_sat(bfloat %a) nounwind {
153380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_ui_bf16_sat:
154380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
155380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lui a0, %hi(.LCPI3_0)
156380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
157380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0
158380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmv.w.x fa3, zero
159380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmax.s fa4, fa4, fa3
160380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmin.s fa5, fa4, fa5
161380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
162380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
1637a1b2adcSAlex Bradbury;
164380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_ui_bf16_sat:
165380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
166*9122c523SPengcheng Wang; RV32ID-NEXT:    lui a0, %hi(.LCPI3_0)
167*9122c523SPengcheng Wang; RV32ID-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
168380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
169380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
170380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa4, a0
171380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa3, zero
172380fd820SAlex Bradbury; RV32ID-NEXT:    fmax.s fa4, fa4, fa3
173380fd820SAlex Bradbury; RV32ID-NEXT:    fmin.s fa5, fa4, fa5
174380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
175380fd820SAlex Bradbury; RV32ID-NEXT:    ret
176380fd820SAlex Bradbury;
177380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_ui_bf16_sat:
178380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
179380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    lui a0, %hi(.LCPI3_0)
180380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
181380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa4, fa0
182380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmv.w.x fa3, zero
183380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmax.s fa4, fa4, fa3
184380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmin.s fa5, fa4, fa5
185380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
186380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
187380fd820SAlex Bradbury;
188380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_ui_bf16_sat:
189380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
190*9122c523SPengcheng Wang; RV64ID-NEXT:    lui a0, %hi(.LCPI3_0)
191*9122c523SPengcheng Wang; RV64ID-NEXT:    flw fa5, %lo(.LCPI3_0)(a0)
192380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
193380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
194380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa4, a0
195380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa3, zero
196380fd820SAlex Bradbury; RV64ID-NEXT:    fmax.s fa4, fa4, fa3
197380fd820SAlex Bradbury; RV64ID-NEXT:    fmin.s fa5, fa4, fa5
198380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
199380fd820SAlex Bradbury; RV64ID-NEXT:    ret
2007a1b2adcSAlex Bradburystart:
2017a1b2adcSAlex Bradbury  %0 = tail call i16 @llvm.fptoui.sat.i16.bf16(bfloat %a)
2027a1b2adcSAlex Bradbury  ret i16 %0
2037a1b2adcSAlex Bradbury}
2047a1b2adcSAlex Bradburydeclare i16 @llvm.fptoui.sat.i16.bf16(bfloat)
2057a1b2adcSAlex Bradbury
2067a1b2adcSAlex Bradburydefine i32 @fcvt_w_bf16(bfloat %a) nounwind {
207380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_w_bf16:
208380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
2092a9f93bfSCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
210380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
211380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
2127a1b2adcSAlex Bradbury;
213380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_w_bf16:
214380fd820SAlex Bradbury; RV32ID:       # %bb.0:
215380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
216380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
217380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
218380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.w.s a0, fa5, rtz
219380fd820SAlex Bradbury; RV32ID-NEXT:    ret
220380fd820SAlex Bradbury;
221380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_w_bf16:
222380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
223380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
224380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
225380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
226380fd820SAlex Bradbury;
227380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_w_bf16:
228380fd820SAlex Bradbury; RV64ID:       # %bb.0:
229380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
230380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
231380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
232380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.l.s a0, fa5, rtz
233380fd820SAlex Bradbury; RV64ID-NEXT:    ret
2347a1b2adcSAlex Bradbury  %1 = fptosi bfloat %a to i32
2357a1b2adcSAlex Bradbury  ret i32 %1
2367a1b2adcSAlex Bradbury}
2377a1b2adcSAlex Bradbury
2387a1b2adcSAlex Bradburydefine i32 @fcvt_w_bf16_sat(bfloat %a) nounwind {
239380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_w_bf16_sat:
240380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
241380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
242380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
243380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
244380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    seqz a1, a1
245380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi a1, a1, -1
246380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a0, a1, a0
247380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
2487a1b2adcSAlex Bradbury;
249380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_w_bf16_sat:
250380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
251380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
252380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
253380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
254380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.w.s a0, fa5, rtz
255380fd820SAlex Bradbury; RV32ID-NEXT:    feq.s a1, fa5, fa5
256380fd820SAlex Bradbury; RV32ID-NEXT:    seqz a1, a1
257380fd820SAlex Bradbury; RV32ID-NEXT:    addi a1, a1, -1
258380fd820SAlex Bradbury; RV32ID-NEXT:    and a0, a1, a0
259380fd820SAlex Bradbury; RV32ID-NEXT:    ret
260380fd820SAlex Bradbury;
261380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_w_bf16_sat:
262380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
263380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
264380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
265380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
266380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    seqz a1, a1
267380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    addi a1, a1, -1
268380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a1, a0
269380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
270380fd820SAlex Bradbury;
271380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_w_bf16_sat:
272380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
273380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
274380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
275380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
276380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.w.s a0, fa5, rtz
277380fd820SAlex Bradbury; RV64ID-NEXT:    feq.s a1, fa5, fa5
278380fd820SAlex Bradbury; RV64ID-NEXT:    seqz a1, a1
279380fd820SAlex Bradbury; RV64ID-NEXT:    addi a1, a1, -1
280380fd820SAlex Bradbury; RV64ID-NEXT:    and a0, a1, a0
281380fd820SAlex Bradbury; RV64ID-NEXT:    ret
2827a1b2adcSAlex Bradburystart:
2837a1b2adcSAlex Bradbury  %0 = tail call i32 @llvm.fptosi.sat.i32.bf16(bfloat %a)
2847a1b2adcSAlex Bradbury  ret i32 %0
2857a1b2adcSAlex Bradbury}
2867a1b2adcSAlex Bradburydeclare i32 @llvm.fptosi.sat.i32.bf16(bfloat)
2877a1b2adcSAlex Bradbury
2887a1b2adcSAlex Bradburydefine i32 @fcvt_wu_bf16(bfloat %a) nounwind {
289380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_wu_bf16:
290380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
2912a9f93bfSCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
292380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
293380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
2947a1b2adcSAlex Bradbury;
295380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_wu_bf16:
296380fd820SAlex Bradbury; RV32ID:       # %bb.0:
297380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
298380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
299380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
300380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
301380fd820SAlex Bradbury; RV32ID-NEXT:    ret
302380fd820SAlex Bradbury;
303380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_wu_bf16:
304380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
305380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
306380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
307380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
308380fd820SAlex Bradbury;
309380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_wu_bf16:
310380fd820SAlex Bradbury; RV64ID:       # %bb.0:
311380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
312380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
313380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
314380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
315380fd820SAlex Bradbury; RV64ID-NEXT:    ret
3167a1b2adcSAlex Bradbury  %1 = fptoui bfloat %a to i32
3177a1b2adcSAlex Bradbury  ret i32 %1
3187a1b2adcSAlex Bradbury}
3197a1b2adcSAlex Bradbury
3207a1b2adcSAlex Bradburydefine i32 @fcvt_wu_bf16_multiple_use(bfloat %x, ptr %y) nounwind {
321380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_wu_bf16_multiple_use:
322380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
3232a9f93bfSCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
324380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
325380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    seqz a1, a0
326380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    add a0, a0, a1
327380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
3287a1b2adcSAlex Bradbury;
329380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_wu_bf16_multiple_use:
330380fd820SAlex Bradbury; RV32ID:       # %bb.0:
331380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
332380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
333380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
334380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
335380fd820SAlex Bradbury; RV32ID-NEXT:    seqz a1, a0
336380fd820SAlex Bradbury; RV32ID-NEXT:    add a0, a0, a1
337380fd820SAlex Bradbury; RV32ID-NEXT:    ret
338380fd820SAlex Bradbury;
339380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_wu_bf16_multiple_use:
340380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
341380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
342380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
343380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    seqz a1, a0
344380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    add a0, a0, a1
345380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
346380fd820SAlex Bradbury;
347380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_wu_bf16_multiple_use:
348380fd820SAlex Bradbury; RV64ID:       # %bb.0:
349380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
350380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
351380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
352380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
353380fd820SAlex Bradbury; RV64ID-NEXT:    seqz a1, a0
354380fd820SAlex Bradbury; RV64ID-NEXT:    add a0, a0, a1
355380fd820SAlex Bradbury; RV64ID-NEXT:    ret
3567a1b2adcSAlex Bradbury  %a = fptoui bfloat %x to i32
3577a1b2adcSAlex Bradbury  %b = icmp eq i32 %a, 0
3587a1b2adcSAlex Bradbury  %c = select i1 %b, i32 1, i32 %a
3597a1b2adcSAlex Bradbury  ret i32 %c
3607a1b2adcSAlex Bradbury}
3617a1b2adcSAlex Bradbury
3627a1b2adcSAlex Bradburydefine i32 @fcvt_wu_bf16_sat(bfloat %a) nounwind {
363380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_wu_bf16_sat:
364380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
365380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
366380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
367380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
368380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    seqz a1, a1
369380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi a1, a1, -1
370380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a0, a1, a0
371380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
3727a1b2adcSAlex Bradbury;
373380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_wu_bf16_sat:
374380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
375380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
376380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
377380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
378380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
379380fd820SAlex Bradbury; RV32ID-NEXT:    feq.s a1, fa5, fa5
380380fd820SAlex Bradbury; RV32ID-NEXT:    seqz a1, a1
381380fd820SAlex Bradbury; RV32ID-NEXT:    addi a1, a1, -1
382380fd820SAlex Bradbury; RV32ID-NEXT:    and a0, a1, a0
383380fd820SAlex Bradbury; RV32ID-NEXT:    ret
384380fd820SAlex Bradbury;
385380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_wu_bf16_sat:
386380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
387380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
388380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
389380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
390380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    seqz a1, a1
39186240751SPhilip Reames; CHECK64ZFBFMIN-NEXT:    addi a1, a1, -1
392380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a0, a1
393380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    slli a0, a0, 32
394380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    srli a0, a0, 32
395380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
396380fd820SAlex Bradbury;
397380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_wu_bf16_sat:
398380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
399380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
400380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
401380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
402380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.wu.s a0, fa5, rtz
403380fd820SAlex Bradbury; RV64ID-NEXT:    feq.s a1, fa5, fa5
404380fd820SAlex Bradbury; RV64ID-NEXT:    seqz a1, a1
40586240751SPhilip Reames; RV64ID-NEXT:    addi a1, a1, -1
406380fd820SAlex Bradbury; RV64ID-NEXT:    and a0, a0, a1
407380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 32
408380fd820SAlex Bradbury; RV64ID-NEXT:    srli a0, a0, 32
409380fd820SAlex Bradbury; RV64ID-NEXT:    ret
4107a1b2adcSAlex Bradburystart:
4117a1b2adcSAlex Bradbury  %0 = tail call i32 @llvm.fptoui.sat.i32.bf16(bfloat %a)
4127a1b2adcSAlex Bradbury  ret i32 %0
4137a1b2adcSAlex Bradbury}
4147a1b2adcSAlex Bradburydeclare i32 @llvm.fptoui.sat.i32.bf16(bfloat)
4157a1b2adcSAlex Bradbury
416f7dbc850SAlex Bradburydefine i64 @fcvt_l_bf16(bfloat %a) nounwind {
417f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_l_bf16:
418f7dbc850SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
419f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi sp, sp, -16
420f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
421f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa0, fa0
422eabaee0cSFangrui Song; CHECK32ZFBFMIN-NEXT:    call __fixsfdi
423f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
424f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi sp, sp, 16
425f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
426f7dbc850SAlex Bradbury;
427f7dbc850SAlex Bradbury; RV32ID-LABEL: fcvt_l_bf16:
428f7dbc850SAlex Bradbury; RV32ID:       # %bb.0:
429f7dbc850SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
430f7dbc850SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
43189b8ebf3SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
43289b8ebf3SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
43389b8ebf3SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
434eabaee0cSFangrui Song; RV32ID-NEXT:    call __fixsfdi
435f7dbc850SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
436f7dbc850SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
437f7dbc850SAlex Bradbury; RV32ID-NEXT:    ret
438f7dbc850SAlex Bradbury;
439f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_l_bf16:
440f7dbc850SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
4412a9f93bfSCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
442f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.l.s a0, fa5, rtz
443f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
444f7dbc850SAlex Bradbury;
445f7dbc850SAlex Bradbury; RV64ID-LABEL: fcvt_l_bf16:
446f7dbc850SAlex Bradbury; RV64ID:       # %bb.0:
447f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
448f7dbc850SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
449f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
450f7dbc850SAlex Bradbury; RV64ID-NEXT:    fcvt.l.s a0, fa5, rtz
451f7dbc850SAlex Bradbury; RV64ID-NEXT:    ret
452f7dbc850SAlex Bradbury  %1 = fptosi bfloat %a to i64
453f7dbc850SAlex Bradbury  ret i64 %1
454f7dbc850SAlex Bradbury}
4557a1b2adcSAlex Bradbury
456f7dbc850SAlex Bradburydefine i64 @fcvt_l_bf16_sat(bfloat %a) nounwind {
457f7dbc850SAlex Bradbury; RV32IZFBFMIN-LABEL: fcvt_l_bf16_sat:
458f7dbc850SAlex Bradbury; RV32IZFBFMIN:       # %bb.0: # %start
45955c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    addi sp, sp, -16
46055c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
46155c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
46255c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
463f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fs0, fa0
464f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:    lui a0, 913408
465f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:    fmv.w.x fa5, a0
46655c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    fle.s s0, fa5, fs0
467f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:    fmv.s fa0, fs0
468eabaee0cSFangrui Song; RV32IZFBFMIN-NEXT:    call __fixsfdi
469*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    lui a3, 524288
47055c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    lui a2, 524288
47155c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    beqz s0, .LBB10_2
472f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:  # %bb.1: # %start
47355c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    mv a2, a1
474f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:  .LBB10_2: # %start
47555c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    lui a1, %hi(.LCPI10_0)
47655c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
477*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    flt.s a1, fa5, fs0
478*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    beqz a1, .LBB10_4
479f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:  # %bb.3:
480*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    addi a2, a3, -1
481f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:  .LBB10_4: # %start
482*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    feq.s a3, fs0, fs0
48355c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    neg a4, a1
484*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    neg a1, s0
485*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    neg a3, a3
486*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    and a0, a1, a0
487*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    and a1, a3, a2
488*9122c523SPengcheng Wang; RV32IZFBFMIN-NEXT:    or a0, a4, a0
48955c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    and a0, a3, a0
49055c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
49155c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
49255c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
49355c6bda0SBjorn Pettersson; RV32IZFBFMIN-NEXT:    addi sp, sp, 16
494f7dbc850SAlex Bradbury; RV32IZFBFMIN-NEXT:    ret
495f7dbc850SAlex Bradbury;
496f7dbc850SAlex Bradbury; R32IDZFBFMIN-LABEL: fcvt_l_bf16_sat:
497f7dbc850SAlex Bradbury; R32IDZFBFMIN:       # %bb.0: # %start
49855c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    addi sp, sp, -16
49955c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
50055c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
501f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
502f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:    fcvt.s.bf16 fs0, fa0
503f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:    lui a0, 913408
504f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:    fmv.w.x fa5, a0
50555c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    fle.s s0, fa5, fs0
506f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:    fmv.s fa0, fs0
507eabaee0cSFangrui Song; R32IDZFBFMIN-NEXT:    call __fixsfdi
508*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    lui a3, 524288
50955c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    lui a2, 524288
51055c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    beqz s0, .LBB10_2
511f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:  # %bb.1: # %start
51255c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    mv a2, a1
513f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:  .LBB10_2: # %start
51455c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    lui a1, %hi(.LCPI10_0)
51555c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
516*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    flt.s a1, fa5, fs0
517*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    beqz a1, .LBB10_4
518f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:  # %bb.3:
519*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    addi a2, a3, -1
520f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:  .LBB10_4: # %start
521*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    feq.s a3, fs0, fs0
52255c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    neg a4, a1
523*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    neg a1, s0
524*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    neg a3, a3
525*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    and a0, a1, a0
526*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    and a1, a3, a2
527*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    or a0, a4, a0
52855c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    and a0, a3, a0
52955c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
53055c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
531f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
53255c6bda0SBjorn Pettersson; R32IDZFBFMIN-NEXT:    addi sp, sp, 16
533f7dbc850SAlex Bradbury; R32IDZFBFMIN-NEXT:    ret
534f7dbc850SAlex Bradbury;
535f7dbc850SAlex Bradbury; RV32ID-LABEL: fcvt_l_bf16_sat:
536f7dbc850SAlex Bradbury; RV32ID:       # %bb.0: # %start
5376b270358SCraig Topper; RV32ID-NEXT:    addi sp, sp, -16
5386b270358SCraig Topper; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5396b270358SCraig Topper; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
540f7dbc850SAlex Bradbury; RV32ID-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
541f7dbc850SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
542f7dbc850SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
543f7dbc850SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fs0, a0
544f7dbc850SAlex Bradbury; RV32ID-NEXT:    lui a0, 913408
545f7dbc850SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
5466b270358SCraig Topper; RV32ID-NEXT:    fle.s s0, fa5, fs0
547f7dbc850SAlex Bradbury; RV32ID-NEXT:    fmv.s fa0, fs0
548eabaee0cSFangrui Song; RV32ID-NEXT:    call __fixsfdi
549*9122c523SPengcheng Wang; RV32ID-NEXT:    lui a3, 524288
5506b270358SCraig Topper; RV32ID-NEXT:    lui a2, 524288
5516b270358SCraig Topper; RV32ID-NEXT:    beqz s0, .LBB10_2
552f7dbc850SAlex Bradbury; RV32ID-NEXT:  # %bb.1: # %start
5536b270358SCraig Topper; RV32ID-NEXT:    mv a2, a1
554f7dbc850SAlex Bradbury; RV32ID-NEXT:  .LBB10_2: # %start
5556b270358SCraig Topper; RV32ID-NEXT:    lui a1, %hi(.LCPI10_0)
5566b270358SCraig Topper; RV32ID-NEXT:    flw fa5, %lo(.LCPI10_0)(a1)
557*9122c523SPengcheng Wang; RV32ID-NEXT:    flt.s a1, fa5, fs0
558*9122c523SPengcheng Wang; RV32ID-NEXT:    beqz a1, .LBB10_4
559f7dbc850SAlex Bradbury; RV32ID-NEXT:  # %bb.3:
560*9122c523SPengcheng Wang; RV32ID-NEXT:    addi a2, a3, -1
561f7dbc850SAlex Bradbury; RV32ID-NEXT:  .LBB10_4: # %start
562*9122c523SPengcheng Wang; RV32ID-NEXT:    feq.s a3, fs0, fs0
5636b270358SCraig Topper; RV32ID-NEXT:    neg a4, a1
564*9122c523SPengcheng Wang; RV32ID-NEXT:    neg a1, s0
565*9122c523SPengcheng Wang; RV32ID-NEXT:    neg a3, a3
566*9122c523SPengcheng Wang; RV32ID-NEXT:    and a0, a1, a0
567*9122c523SPengcheng Wang; RV32ID-NEXT:    and a1, a3, a2
568*9122c523SPengcheng Wang; RV32ID-NEXT:    or a0, a4, a0
5696b270358SCraig Topper; RV32ID-NEXT:    and a0, a3, a0
5706b270358SCraig Topper; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5716b270358SCraig Topper; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
572f7dbc850SAlex Bradbury; RV32ID-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
5736b270358SCraig Topper; RV32ID-NEXT:    addi sp, sp, 16
574f7dbc850SAlex Bradbury; RV32ID-NEXT:    ret
575f7dbc850SAlex Bradbury;
576f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_l_bf16_sat:
577f7dbc850SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
578f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
579f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.l.s a0, fa5, rtz
580f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
581f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    seqz a1, a1
582f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    addi a1, a1, -1
583f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a1, a0
584f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
585f7dbc850SAlex Bradbury;
586f7dbc850SAlex Bradbury; RV64ID-LABEL: fcvt_l_bf16_sat:
587f7dbc850SAlex Bradbury; RV64ID:       # %bb.0: # %start
588f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
589f7dbc850SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
590f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
591f7dbc850SAlex Bradbury; RV64ID-NEXT:    fcvt.l.s a0, fa5, rtz
592f7dbc850SAlex Bradbury; RV64ID-NEXT:    feq.s a1, fa5, fa5
593f7dbc850SAlex Bradbury; RV64ID-NEXT:    seqz a1, a1
594f7dbc850SAlex Bradbury; RV64ID-NEXT:    addi a1, a1, -1
595f7dbc850SAlex Bradbury; RV64ID-NEXT:    and a0, a1, a0
596f7dbc850SAlex Bradbury; RV64ID-NEXT:    ret
597f7dbc850SAlex Bradburystart:
598f7dbc850SAlex Bradbury  %0 = tail call i64 @llvm.fptosi.sat.i64.bf16(bfloat %a)
599f7dbc850SAlex Bradbury  ret i64 %0
600f7dbc850SAlex Bradbury}
601f7dbc850SAlex Bradburydeclare i64 @llvm.fptosi.sat.i64.bf16(bfloat)
6027a1b2adcSAlex Bradbury
603f7dbc850SAlex Bradburydefine i64 @fcvt_lu_bf16(bfloat %a) nounwind {
604f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_lu_bf16:
605f7dbc850SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
606f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi sp, sp, -16
607f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
608f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa0, fa0
609eabaee0cSFangrui Song; CHECK32ZFBFMIN-NEXT:    call __fixunssfdi
610f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
611f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi sp, sp, 16
612f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
613f7dbc850SAlex Bradbury;
614f7dbc850SAlex Bradbury; RV32ID-LABEL: fcvt_lu_bf16:
615f7dbc850SAlex Bradbury; RV32ID:       # %bb.0:
616f7dbc850SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
617f7dbc850SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
61889b8ebf3SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
61989b8ebf3SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
62089b8ebf3SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
621eabaee0cSFangrui Song; RV32ID-NEXT:    call __fixunssfdi
622f7dbc850SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
623f7dbc850SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
624f7dbc850SAlex Bradbury; RV32ID-NEXT:    ret
625f7dbc850SAlex Bradbury;
626f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_lu_bf16:
627f7dbc850SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
6282a9f93bfSCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
629f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
630f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
631f7dbc850SAlex Bradbury;
632f7dbc850SAlex Bradbury; RV64ID-LABEL: fcvt_lu_bf16:
633f7dbc850SAlex Bradbury; RV64ID:       # %bb.0:
634f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
635f7dbc850SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
636f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
637f7dbc850SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
638f7dbc850SAlex Bradbury; RV64ID-NEXT:    ret
639f7dbc850SAlex Bradbury  %1 = fptoui bfloat %a to i64
640f7dbc850SAlex Bradbury  ret i64 %1
641f7dbc850SAlex Bradbury}
642f7dbc850SAlex Bradbury
643f7dbc850SAlex Bradburydefine i64 @fcvt_lu_bf16_sat(bfloat %a) nounwind {
644f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_lu_bf16_sat:
645f7dbc850SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
646f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi sp, sp, -16
647f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
648f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
649f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
650f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lui a0, %hi(.LCPI12_0)
651f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    flw fa5, %lo(.LCPI12_0)(a0)
652f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa0, fa0
653*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    fmv.w.x fa4, zero
654*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    fle.s a0, fa4, fa0
655*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    flt.s a1, fa5, fa0
656*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    neg s0, a1
6576b270358SCraig Topper; CHECK32ZFBFMIN-NEXT:    neg s1, a0
658eabaee0cSFangrui Song; CHECK32ZFBFMIN-NEXT:    call __fixunssfdi
659f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a0, s1, a0
660f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a1, s1, a1
661*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    or a0, s0, a0
662f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    or a1, s0, a1
663f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
664f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
665f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
666f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi sp, sp, 16
667f7dbc850SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
668f7dbc850SAlex Bradbury;
669f7dbc850SAlex Bradbury; RV32ID-LABEL: fcvt_lu_bf16_sat:
670f7dbc850SAlex Bradbury; RV32ID:       # %bb.0: # %start
671f7dbc850SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
672f7dbc850SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
673f7dbc850SAlex Bradbury; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
674f7dbc850SAlex Bradbury; RV32ID-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
675f7dbc850SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
676*9122c523SPengcheng Wang; RV32ID-NEXT:    lui a1, %hi(.LCPI12_0)
677*9122c523SPengcheng Wang; RV32ID-NEXT:    fmv.w.x fa5, zero
678*9122c523SPengcheng Wang; RV32ID-NEXT:    flw fa4, %lo(.LCPI12_0)(a1)
679f7dbc850SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
680f7dbc850SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
681f7dbc850SAlex Bradbury; RV32ID-NEXT:    fle.s a0, fa5, fa0
682*9122c523SPengcheng Wang; RV32ID-NEXT:    flt.s a1, fa4, fa0
683*9122c523SPengcheng Wang; RV32ID-NEXT:    neg s0, a1
6846b270358SCraig Topper; RV32ID-NEXT:    neg s1, a0
685eabaee0cSFangrui Song; RV32ID-NEXT:    call __fixunssfdi
686f7dbc850SAlex Bradbury; RV32ID-NEXT:    and a0, s1, a0
687f7dbc850SAlex Bradbury; RV32ID-NEXT:    and a1, s1, a1
688*9122c523SPengcheng Wang; RV32ID-NEXT:    or a0, s0, a0
689f7dbc850SAlex Bradbury; RV32ID-NEXT:    or a1, s0, a1
690f7dbc850SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
691f7dbc850SAlex Bradbury; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
692f7dbc850SAlex Bradbury; RV32ID-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
693f7dbc850SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
694f7dbc850SAlex Bradbury; RV32ID-NEXT:    ret
695f7dbc850SAlex Bradbury;
696f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_lu_bf16_sat:
697f7dbc850SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
698f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
699f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
700f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
701f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    seqz a1, a1
702f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    addi a1, a1, -1
703f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a1, a0
704f7dbc850SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
705f7dbc850SAlex Bradbury;
706f7dbc850SAlex Bradbury; RV64ID-LABEL: fcvt_lu_bf16_sat:
707f7dbc850SAlex Bradbury; RV64ID:       # %bb.0: # %start
708f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
709f7dbc850SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
710f7dbc850SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
711f7dbc850SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
712f7dbc850SAlex Bradbury; RV64ID-NEXT:    feq.s a1, fa5, fa5
713f7dbc850SAlex Bradbury; RV64ID-NEXT:    seqz a1, a1
714f7dbc850SAlex Bradbury; RV64ID-NEXT:    addi a1, a1, -1
715f7dbc850SAlex Bradbury; RV64ID-NEXT:    and a0, a1, a0
716f7dbc850SAlex Bradbury; RV64ID-NEXT:    ret
717f7dbc850SAlex Bradburystart:
718f7dbc850SAlex Bradbury  %0 = tail call i64 @llvm.fptoui.sat.i64.bf16(bfloat %a)
719f7dbc850SAlex Bradbury  ret i64 %0
720f7dbc850SAlex Bradbury}
721f7dbc850SAlex Bradburydeclare i64 @llvm.fptoui.sat.i64.bf16(bfloat)
7227a1b2adcSAlex Bradbury
7237a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_si(i16 %a) nounwind {
724380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_si:
725380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
726380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    slli a0, a0, 16
727380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    srai a0, a0, 16
728380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
729380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
730380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
7317a1b2adcSAlex Bradbury;
732380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_si:
733380fd820SAlex Bradbury; RV32ID:       # %bb.0:
734380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
735380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
736380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
737380fd820SAlex Bradbury; RV32ID-NEXT:    srai a0, a0, 16
738380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.w fa0, a0
739eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
740380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
741380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
742380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
743380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
744380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
745380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
746380fd820SAlex Bradbury; RV32ID-NEXT:    ret
747380fd820SAlex Bradbury;
748380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_si:
749380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
750380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    slli a0, a0, 48
751380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    srai a0, a0, 48
752ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
753380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
754380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
755380fd820SAlex Bradbury;
756380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_si:
757380fd820SAlex Bradbury; RV64ID:       # %bb.0:
758380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
759380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
760380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 48
761380fd820SAlex Bradbury; RV64ID-NEXT:    srai a0, a0, 48
762380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.w fa0, a0
763eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
764380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
765380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
766380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
767380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
768380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
769380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
770380fd820SAlex Bradbury; RV64ID-NEXT:    ret
7717a1b2adcSAlex Bradbury  %1 = sitofp i16 %a to bfloat
7727a1b2adcSAlex Bradbury  ret bfloat %1
7737a1b2adcSAlex Bradbury}
7747a1b2adcSAlex Bradbury
7757a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_si_signext(i16 signext %a) nounwind {
776380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_si_signext:
777380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
778380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
779380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
780380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
7817a1b2adcSAlex Bradbury;
782380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_si_signext:
783380fd820SAlex Bradbury; RV32ID:       # %bb.0:
784380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
785380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
786380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.w fa0, a0
787eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
788380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
789380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
790380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
791380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
792380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
793380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
794380fd820SAlex Bradbury; RV32ID-NEXT:    ret
795380fd820SAlex Bradbury;
796380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_si_signext:
797380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
798ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
799380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
800380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
801380fd820SAlex Bradbury;
802380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_si_signext:
803380fd820SAlex Bradbury; RV64ID:       # %bb.0:
804380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
805380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
806380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.w fa0, a0
807eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
808380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
809380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
810380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
811380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
812380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
813380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
814380fd820SAlex Bradbury; RV64ID-NEXT:    ret
8157a1b2adcSAlex Bradbury  %1 = sitofp i16 %a to bfloat
8167a1b2adcSAlex Bradbury  ret bfloat %1
8177a1b2adcSAlex Bradbury}
8187a1b2adcSAlex Bradbury
8197a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_ui(i16 %a) nounwind {
820380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_ui:
821380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
822380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    slli a0, a0, 16
823380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    srli a0, a0, 16
824380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
825380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
826380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
8277a1b2adcSAlex Bradbury;
828380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_ui:
829380fd820SAlex Bradbury; RV32ID:       # %bb.0:
830380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
831380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
832380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
833380fd820SAlex Bradbury; RV32ID-NEXT:    srli a0, a0, 16
834380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.wu fa0, a0
835eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
836380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
837380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
838380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
839380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
840380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
841380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
842380fd820SAlex Bradbury; RV32ID-NEXT:    ret
843380fd820SAlex Bradbury;
844380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_ui:
845380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
846380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    slli a0, a0, 48
847380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    srli a0, a0, 48
848ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
849380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
850380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
851380fd820SAlex Bradbury;
852380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_ui:
853380fd820SAlex Bradbury; RV64ID:       # %bb.0:
854380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
855380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
856380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 48
857380fd820SAlex Bradbury; RV64ID-NEXT:    srli a0, a0, 48
858380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.wu fa0, a0
859eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
860380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
861380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
862380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
863380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
864380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
865380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
866380fd820SAlex Bradbury; RV64ID-NEXT:    ret
8677a1b2adcSAlex Bradbury  %1 = uitofp i16 %a to bfloat
8687a1b2adcSAlex Bradbury  ret bfloat %1
8697a1b2adcSAlex Bradbury}
8707a1b2adcSAlex Bradbury
8717a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_ui_zeroext(i16 zeroext %a) nounwind {
872380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_ui_zeroext:
873380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
874380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
875380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
876380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
8777a1b2adcSAlex Bradbury;
878380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_ui_zeroext:
879380fd820SAlex Bradbury; RV32ID:       # %bb.0:
880380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
881380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
882380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.wu fa0, a0
883eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
884380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
885380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
886380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
887380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
888380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
889380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
890380fd820SAlex Bradbury; RV32ID-NEXT:    ret
891380fd820SAlex Bradbury;
892380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_ui_zeroext:
893380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
894ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
895380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
896380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
897380fd820SAlex Bradbury;
898380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_ui_zeroext:
899380fd820SAlex Bradbury; RV64ID:       # %bb.0:
900380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
901380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
902380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.wu fa0, a0
903eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
904380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
905380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
906380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
907380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
908380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
909380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
910380fd820SAlex Bradbury; RV64ID-NEXT:    ret
9117a1b2adcSAlex Bradbury  %1 = uitofp i16 %a to bfloat
9127a1b2adcSAlex Bradbury  ret bfloat %1
9137a1b2adcSAlex Bradbury}
9147a1b2adcSAlex Bradbury
9157a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_w(i32 %a) nounwind {
916380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_w:
917380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
918380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
919380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
920380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
9217a1b2adcSAlex Bradbury;
922380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_w:
923380fd820SAlex Bradbury; RV32ID:       # %bb.0:
924380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
925380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
926380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.w fa0, a0
927eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
928380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
929380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
930380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
931380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
932380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
933380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
934380fd820SAlex Bradbury; RV32ID-NEXT:    ret
935380fd820SAlex Bradbury;
936380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_w:
937380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
938ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
939380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
940380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
941380fd820SAlex Bradbury;
942380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_w:
943380fd820SAlex Bradbury; RV64ID:       # %bb.0:
944380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
945380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
946380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.w fa0, a0
947eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
948380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
949380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
950380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
951380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
952380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
953380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
954380fd820SAlex Bradbury; RV64ID-NEXT:    ret
9557a1b2adcSAlex Bradbury  %1 = sitofp i32 %a to bfloat
9567a1b2adcSAlex Bradbury  ret bfloat %1
9577a1b2adcSAlex Bradbury}
9587a1b2adcSAlex Bradbury
9597a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_w_load(ptr %p) nounwind {
960380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_w_load:
961380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
962380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lw a0, 0(a0)
963380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
964380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
965380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
9667a1b2adcSAlex Bradbury;
967380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_w_load:
968380fd820SAlex Bradbury; RV32ID:       # %bb.0:
969380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
970380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
971380fd820SAlex Bradbury; RV32ID-NEXT:    lw a0, 0(a0)
972380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.w fa0, a0
973eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
974380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
975380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
976380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
977380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
978380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
979380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
980380fd820SAlex Bradbury; RV32ID-NEXT:    ret
981380fd820SAlex Bradbury;
982380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_w_load:
983380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
984380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    lw a0, 0(a0)
985ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
986380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
987380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
988380fd820SAlex Bradbury;
989380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_w_load:
990380fd820SAlex Bradbury; RV64ID:       # %bb.0:
991380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
992380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
993380fd820SAlex Bradbury; RV64ID-NEXT:    lw a0, 0(a0)
994380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.w fa0, a0
995eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
996380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
997380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
998380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
999380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
1000380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1001380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
1002380fd820SAlex Bradbury; RV64ID-NEXT:    ret
10037a1b2adcSAlex Bradbury  %a = load i32, ptr %p
10047a1b2adcSAlex Bradbury  %1 = sitofp i32 %a to bfloat
10057a1b2adcSAlex Bradbury  ret bfloat %1
10067a1b2adcSAlex Bradbury}
10077a1b2adcSAlex Bradbury
10087a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_wu(i32 %a) nounwind {
1009380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_wu:
1010380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1011380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
1012380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
1013380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
10147a1b2adcSAlex Bradbury;
1015380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_wu:
1016380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1017380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
1018380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1019380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.wu fa0, a0
1020eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
1021380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1022380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
1023380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
1024380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
1025380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1026380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
1027380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1028380fd820SAlex Bradbury;
1029380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_wu:
1030380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1031ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
1032380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
1033380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1034380fd820SAlex Bradbury;
1035380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_wu:
1036380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1037380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
1038380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1039380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.wu fa0, a0
1040eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
1041380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1042380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
1043380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
1044380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
1045380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1046380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
1047380fd820SAlex Bradbury; RV64ID-NEXT:    ret
10487a1b2adcSAlex Bradbury  %1 = uitofp i32 %a to bfloat
10497a1b2adcSAlex Bradbury  ret bfloat %1
10507a1b2adcSAlex Bradbury}
10517a1b2adcSAlex Bradbury
10527a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_wu_load(ptr %p) nounwind {
1053380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_wu_load:
1054380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1055380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lw a0, 0(a0)
1056380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
1057380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
1058380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
10597a1b2adcSAlex Bradbury;
1060380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_wu_load:
1061380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1062380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
1063380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1064380fd820SAlex Bradbury; RV32ID-NEXT:    lw a0, 0(a0)
1065380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.wu fa0, a0
1066eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
1067380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1068380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
1069380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
1070380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
1071380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1072380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
1073380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1074380fd820SAlex Bradbury;
1075380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_wu_load:
1076380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1077380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    lwu a0, 0(a0)
1078ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
1079380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
1080380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1081380fd820SAlex Bradbury;
1082380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_wu_load:
1083380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1084380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
1085380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1086380fd820SAlex Bradbury; RV64ID-NEXT:    lwu a0, 0(a0)
1087380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.wu fa0, a0
1088eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
1089380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1090380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
1091380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
1092380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
1093380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1094380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
1095380fd820SAlex Bradbury; RV64ID-NEXT:    ret
10967a1b2adcSAlex Bradbury  %a = load i32, ptr %p
10977a1b2adcSAlex Bradbury  %1 = uitofp i32 %a to bfloat
10987a1b2adcSAlex Bradbury  ret bfloat %1
10997a1b2adcSAlex Bradbury}
11007a1b2adcSAlex Bradbury
1101380fd820SAlex Bradbury; TODO: The following tests error on rv32 with zfbfmin enabled.
11027a1b2adcSAlex Bradbury
11037a1b2adcSAlex Bradbury; define bfloat @fcvt_bf16_l(i64 %a) nounwind {
11047a1b2adcSAlex Bradbury;   %1 = sitofp i64 %a to bfloat
11057a1b2adcSAlex Bradbury;   ret bfloat %1
11067a1b2adcSAlex Bradbury; }
11077a1b2adcSAlex Bradbury
11087a1b2adcSAlex Bradbury; define bfloat @fcvt_bf16_lu(i64 %a) nounwind {
11097a1b2adcSAlex Bradbury;   %1 = uitofp i64 %a to bfloat
11107a1b2adcSAlex Bradbury;   ret bfloat %1
11117a1b2adcSAlex Bradbury; }
11127a1b2adcSAlex Bradbury
11137a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_s(float %a) nounwind {
1114380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_s:
1115380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1116380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa0
1117380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
11187a1b2adcSAlex Bradbury;
1119380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_s:
1120380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1121380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
1122380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1123eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
1124380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1125380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
1126380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
1127380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
1128380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1129380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
1130380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1131380fd820SAlex Bradbury;
1132380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_s:
1133380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1134380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa0
1135380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1136380fd820SAlex Bradbury;
1137380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_s:
1138380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1139380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
1140380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1141eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
1142380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1143380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
1144380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
1145380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
1146380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1147380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
1148380fd820SAlex Bradbury; RV64ID-NEXT:    ret
11497a1b2adcSAlex Bradbury  %1 = fptrunc float %a to bfloat
11507a1b2adcSAlex Bradbury  ret bfloat %1
11517a1b2adcSAlex Bradbury}
11527a1b2adcSAlex Bradbury
11537a1b2adcSAlex Bradburydefine float @fcvt_s_bf16(bfloat %a) nounwind {
1154380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_s_bf16:
1155380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1156380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa0, fa0
1157380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
11587a1b2adcSAlex Bradbury;
1159380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_s_bf16:
1160380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1161380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1162380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
1163380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
1164380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1165380fd820SAlex Bradbury;
1166380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_s_bf16:
1167380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1168380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa0, fa0
1169380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1170380fd820SAlex Bradbury;
1171380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_s_bf16:
1172380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1173380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1174380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
1175380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
1176380fd820SAlex Bradbury; RV64ID-NEXT:    ret
11777a1b2adcSAlex Bradbury  %1 = fpext bfloat %a to float
11787a1b2adcSAlex Bradbury  ret float %1
11797a1b2adcSAlex Bradbury}
11807a1b2adcSAlex Bradbury
11817a1b2adcSAlex Bradburydefine bfloat @fcvt_bf16_d(double %a) nounwind {
11827a1b2adcSAlex Bradbury; RV32IZFBFMIN-LABEL: fcvt_bf16_d:
11837a1b2adcSAlex Bradbury; RV32IZFBFMIN:       # %bb.0:
11847a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    addi sp, sp, -16
11857a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1186eabaee0cSFangrui Song; RV32IZFBFMIN-NEXT:    call __truncdfbf2
11877a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11887a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    addi sp, sp, 16
11897a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    ret
11907a1b2adcSAlex Bradbury;
11917a1b2adcSAlex Bradbury; R32IDZFBFMIN-LABEL: fcvt_bf16_d:
11927a1b2adcSAlex Bradbury; R32IDZFBFMIN:       # %bb.0:
11937a1b2adcSAlex Bradbury; R32IDZFBFMIN-NEXT:    fcvt.s.d fa5, fa0
11947a1b2adcSAlex Bradbury; R32IDZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
11957a1b2adcSAlex Bradbury; R32IDZFBFMIN-NEXT:    ret
11967a1b2adcSAlex Bradbury;
1197380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_d:
1198380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1199380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
1200380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1201eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncdfbf2
1202380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1203380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
1204380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
1205380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
1206380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1207380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
1208380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1209380fd820SAlex Bradbury;
12107a1b2adcSAlex Bradbury; RV64IZFBFMIN-LABEL: fcvt_bf16_d:
12117a1b2adcSAlex Bradbury; RV64IZFBFMIN:       # %bb.0:
12127a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    addi sp, sp, -16
12137a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1214eabaee0cSFangrui Song; RV64IZFBFMIN-NEXT:    call __truncdfbf2
12157a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12167a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    addi sp, sp, 16
12177a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    ret
12187a1b2adcSAlex Bradbury;
12197a1b2adcSAlex Bradbury; RV64IDZFBFMIN-LABEL: fcvt_bf16_d:
12207a1b2adcSAlex Bradbury; RV64IDZFBFMIN:       # %bb.0:
1221380fd820SAlex Bradbury; RV64IDZFBFMIN-NEXT:    fcvt.s.d fa5, fa0
12227a1b2adcSAlex Bradbury; RV64IDZFBFMIN-NEXT:    fcvt.bf16.s fa0, fa5
12237a1b2adcSAlex Bradbury; RV64IDZFBFMIN-NEXT:    ret
1224380fd820SAlex Bradbury;
1225380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_d:
1226380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1227380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -16
1228380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1229eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncdfbf2
1230380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1231380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
1232380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
1233380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
1234380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1235380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 16
1236380fd820SAlex Bradbury; RV64ID-NEXT:    ret
12377a1b2adcSAlex Bradbury  %1 = fptrunc double %a to bfloat
12387a1b2adcSAlex Bradbury  ret bfloat %1
12397a1b2adcSAlex Bradbury}
12407a1b2adcSAlex Bradbury
12417a1b2adcSAlex Bradburydefine double @fcvt_d_bf16(bfloat %a) nounwind {
12427a1b2adcSAlex Bradbury; RV32IZFBFMIN-LABEL: fcvt_d_bf16:
12437a1b2adcSAlex Bradbury; RV32IZFBFMIN:       # %bb.0:
12447a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    addi sp, sp, -16
12457a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12467a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    fcvt.s.bf16 fa0, fa0
1247eabaee0cSFangrui Song; RV32IZFBFMIN-NEXT:    call __extendsfdf2
12487a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12497a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    addi sp, sp, 16
12507a1b2adcSAlex Bradbury; RV32IZFBFMIN-NEXT:    ret
12517a1b2adcSAlex Bradbury;
12527a1b2adcSAlex Bradbury; R32IDZFBFMIN-LABEL: fcvt_d_bf16:
12537a1b2adcSAlex Bradbury; R32IDZFBFMIN:       # %bb.0:
1254*9122c523SPengcheng Wang; R32IDZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0, dyn
12557a1b2adcSAlex Bradbury; R32IDZFBFMIN-NEXT:    fcvt.d.s fa0, fa5
12567a1b2adcSAlex Bradbury; R32IDZFBFMIN-NEXT:    ret
12577a1b2adcSAlex Bradbury;
1258380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_d_bf16:
1259380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1260380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1261380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
1262380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
1263380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.d.s fa0, fa5
1264380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1265380fd820SAlex Bradbury;
12667a1b2adcSAlex Bradbury; RV64IZFBFMIN-LABEL: fcvt_d_bf16:
12677a1b2adcSAlex Bradbury; RV64IZFBFMIN:       # %bb.0:
12687a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    addi sp, sp, -16
12697a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12707a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    fcvt.s.bf16 fa0, fa0
1271eabaee0cSFangrui Song; RV64IZFBFMIN-NEXT:    call __extendsfdf2
12727a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12737a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    addi sp, sp, 16
12747a1b2adcSAlex Bradbury; RV64IZFBFMIN-NEXT:    ret
12757a1b2adcSAlex Bradbury;
12767a1b2adcSAlex Bradbury; RV64IDZFBFMIN-LABEL: fcvt_d_bf16:
12777a1b2adcSAlex Bradbury; RV64IDZFBFMIN:       # %bb.0:
1278*9122c523SPengcheng Wang; RV64IDZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0, dyn
1279380fd820SAlex Bradbury; RV64IDZFBFMIN-NEXT:    fcvt.d.s fa0, fa5
12807a1b2adcSAlex Bradbury; RV64IDZFBFMIN-NEXT:    ret
1281380fd820SAlex Bradbury;
1282380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_d_bf16:
1283380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1284380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1285380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
1286380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
1287380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.d.s fa0, fa5
1288380fd820SAlex Bradbury; RV64ID-NEXT:    ret
12897a1b2adcSAlex Bradbury  %1 = fpext bfloat %a to double
12907a1b2adcSAlex Bradbury  ret double %1
12917a1b2adcSAlex Bradbury}
12927a1b2adcSAlex Bradbury
12937a1b2adcSAlex Bradburydefine bfloat @bitcast_bf16_i16(i16 %a) nounwind {
1294380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: bitcast_bf16_i16:
1295380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1296380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmv.h.x fa0, a0
1297380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
12987a1b2adcSAlex Bradbury;
1299380fd820SAlex Bradbury; RV32ID-LABEL: bitcast_bf16_i16:
1300380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1301380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 1048560
1302380fd820SAlex Bradbury; RV32ID-NEXT:    or a0, a0, a1
1303380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa0, a0
1304380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1305380fd820SAlex Bradbury;
1306380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: bitcast_bf16_i16:
1307380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1308380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmv.h.x fa0, a0
1309380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1310380fd820SAlex Bradbury;
1311380fd820SAlex Bradbury; RV64ID-LABEL: bitcast_bf16_i16:
1312380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1313380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 1048560
1314380fd820SAlex Bradbury; RV64ID-NEXT:    or a0, a0, a1
1315380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa0, a0
1316380fd820SAlex Bradbury; RV64ID-NEXT:    ret
13177a1b2adcSAlex Bradbury  %1 = bitcast i16 %a to bfloat
13187a1b2adcSAlex Bradbury  ret bfloat %1
13197a1b2adcSAlex Bradbury}
13207a1b2adcSAlex Bradbury
13217a1b2adcSAlex Bradburydefine i16 @bitcast_i16_bf16(bfloat %a) nounwind {
1322380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: bitcast_i16_bf16:
1323380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1324380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmv.x.h a0, fa0
1325380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
13267a1b2adcSAlex Bradbury;
1327380fd820SAlex Bradbury; RV32ID-LABEL: bitcast_i16_bf16:
1328380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1329380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1330380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1331380fd820SAlex Bradbury;
1332380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: bitcast_i16_bf16:
1333380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1334380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmv.x.h a0, fa0
1335380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1336380fd820SAlex Bradbury;
1337380fd820SAlex Bradbury; RV64ID-LABEL: bitcast_i16_bf16:
1338380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1339380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1340380fd820SAlex Bradbury; RV64ID-NEXT:    ret
13417a1b2adcSAlex Bradbury  %1 = bitcast bfloat %a to i16
13427a1b2adcSAlex Bradbury  ret i16 %1
13437a1b2adcSAlex Bradbury}
13447a1b2adcSAlex Bradbury
13457a1b2adcSAlex Bradburydefine signext i32 @fcvt_bf16_w_demanded_bits(i32 signext %0, ptr %1) nounwind {
1346380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_w_demanded_bits:
1347380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1348380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi a0, a0, 1
1349380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
1350380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
1351380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fsh fa5, 0(a1)
1352380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
13537a1b2adcSAlex Bradbury;
1354380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_w_demanded_bits:
1355380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1356380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
1357380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1358380fd820SAlex Bradbury; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1359380fd820SAlex Bradbury; RV32ID-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1360380fd820SAlex Bradbury; RV32ID-NEXT:    mv s0, a1
1361380fd820SAlex Bradbury; RV32ID-NEXT:    addi s1, a0, 1
1362380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.w fa0, s1
1363eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
1364380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1365380fd820SAlex Bradbury; RV32ID-NEXT:    sh a0, 0(s0)
1366380fd820SAlex Bradbury; RV32ID-NEXT:    mv a0, s1
1367380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1368380fd820SAlex Bradbury; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1369380fd820SAlex Bradbury; RV32ID-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1370380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
1371380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1372380fd820SAlex Bradbury;
1373380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_w_demanded_bits:
1374380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1375380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    addiw a0, a0, 1
1376ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.w fa5, a0
1377380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
1378380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fsh fa5, 0(a1)
1379380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1380380fd820SAlex Bradbury;
1381380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_w_demanded_bits:
1382380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1383380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -32
1384380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1385380fd820SAlex Bradbury; RV64ID-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1386380fd820SAlex Bradbury; RV64ID-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1387380fd820SAlex Bradbury; RV64ID-NEXT:    mv s0, a1
1388380fd820SAlex Bradbury; RV64ID-NEXT:    addiw s1, a0, 1
1389380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.w fa0, s1
1390eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
1391380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1392380fd820SAlex Bradbury; RV64ID-NEXT:    sh a0, 0(s0)
1393380fd820SAlex Bradbury; RV64ID-NEXT:    mv a0, s1
1394380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1395380fd820SAlex Bradbury; RV64ID-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1396380fd820SAlex Bradbury; RV64ID-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
1397380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 32
1398380fd820SAlex Bradbury; RV64ID-NEXT:    ret
13997a1b2adcSAlex Bradbury  %3 = add i32 %0, 1
14007a1b2adcSAlex Bradbury  %4 = sitofp i32 %3 to bfloat
14017a1b2adcSAlex Bradbury  store bfloat %4, ptr %1, align 2
14027a1b2adcSAlex Bradbury  ret i32 %3
14037a1b2adcSAlex Bradbury}
14047a1b2adcSAlex Bradbury
14057a1b2adcSAlex Bradburydefine signext i32 @fcvt_bf16_wu_demanded_bits(i32 signext %0, ptr %1) nounwind {
1406380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_bf16_wu_demanded_bits:
1407380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
1408380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi a0, a0, 1
1409380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
1410380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
1411380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fsh fa5, 0(a1)
1412380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
14137a1b2adcSAlex Bradbury;
1414380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_bf16_wu_demanded_bits:
1415380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1416380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, -16
1417380fd820SAlex Bradbury; RV32ID-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1418380fd820SAlex Bradbury; RV32ID-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1419380fd820SAlex Bradbury; RV32ID-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1420380fd820SAlex Bradbury; RV32ID-NEXT:    mv s0, a1
1421380fd820SAlex Bradbury; RV32ID-NEXT:    addi s1, a0, 1
1422380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.s.wu fa0, s1
1423eabaee0cSFangrui Song; RV32ID-NEXT:    call __truncsfbf2
1424380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1425380fd820SAlex Bradbury; RV32ID-NEXT:    sh a0, 0(s0)
1426380fd820SAlex Bradbury; RV32ID-NEXT:    mv a0, s1
1427380fd820SAlex Bradbury; RV32ID-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1428380fd820SAlex Bradbury; RV32ID-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1429380fd820SAlex Bradbury; RV32ID-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1430380fd820SAlex Bradbury; RV32ID-NEXT:    addi sp, sp, 16
1431380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1432380fd820SAlex Bradbury;
1433380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_bf16_wu_demanded_bits:
1434380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
1435380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    addiw a0, a0, 1
1436ec8e1c62SCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.wu fa5, a0
1437380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.bf16.s fa5, fa5
1438380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fsh fa5, 0(a1)
1439380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1440380fd820SAlex Bradbury;
1441380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_bf16_wu_demanded_bits:
1442380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1443380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, -32
1444380fd820SAlex Bradbury; RV64ID-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1445380fd820SAlex Bradbury; RV64ID-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1446380fd820SAlex Bradbury; RV64ID-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1447380fd820SAlex Bradbury; RV64ID-NEXT:    mv s0, a1
1448380fd820SAlex Bradbury; RV64ID-NEXT:    addiw s1, a0, 1
1449380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.s.wu fa0, s1
1450eabaee0cSFangrui Song; RV64ID-NEXT:    call __truncsfbf2
1451380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1452380fd820SAlex Bradbury; RV64ID-NEXT:    sh a0, 0(s0)
1453380fd820SAlex Bradbury; RV64ID-NEXT:    mv a0, s1
1454380fd820SAlex Bradbury; RV64ID-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1455380fd820SAlex Bradbury; RV64ID-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1456380fd820SAlex Bradbury; RV64ID-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
1457380fd820SAlex Bradbury; RV64ID-NEXT:    addi sp, sp, 32
1458380fd820SAlex Bradbury; RV64ID-NEXT:    ret
14597a1b2adcSAlex Bradbury  %3 = add i32 %0, 1
14607a1b2adcSAlex Bradbury  %4 = uitofp i32 %3 to bfloat
14617a1b2adcSAlex Bradbury  store bfloat %4, ptr %1, align 2
14627a1b2adcSAlex Bradbury  ret i32 %3
14637a1b2adcSAlex Bradbury}
14647a1b2adcSAlex Bradbury
14657a1b2adcSAlex Bradburydefine signext i8 @fcvt_w_s_i8(bfloat %a) nounwind {
1466380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_w_s_i8:
1467380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
14682a9f93bfSCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1469380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1470380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
14717a1b2adcSAlex Bradbury;
1472380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_w_s_i8:
1473380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1474380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1475380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
1476380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
1477380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.w.s a0, fa5, rtz
1478380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1479380fd820SAlex Bradbury;
1480380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_w_s_i8:
1481380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
14822a9f93bfSCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1483380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.l.s a0, fa5, rtz
1484380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1485380fd820SAlex Bradbury;
1486380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_w_s_i8:
1487380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1488380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1489380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
1490380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
1491380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.l.s a0, fa5, rtz
1492380fd820SAlex Bradbury; RV64ID-NEXT:    ret
14937a1b2adcSAlex Bradbury  %1 = fptosi bfloat %a to i8
14947a1b2adcSAlex Bradbury  ret i8 %1
14957a1b2adcSAlex Bradbury}
14967a1b2adcSAlex Bradbury
14977a1b2adcSAlex Bradburydefine signext i8 @fcvt_w_s_sat_i8(bfloat %a) nounwind {
1498380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_w_s_sat_i8:
1499380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
1500380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1501*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    lui a0, 798720
1502*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    lui a1, 274400
1503*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    fmv.w.x fa4, a0
1504380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    feq.s a0, fa5, fa5
1505380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    neg a0, a0
1506380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmax.s fa5, fa5, fa4
1507380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmv.w.x fa4, a1
1508380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmin.s fa5, fa5, fa4
1509380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a1, fa5, rtz
1510380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a0, a0, a1
1511380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
15127a1b2adcSAlex Bradbury;
1513380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_w_s_sat_i8:
1514380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
1515380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1516380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 798720
1517*9122c523SPengcheng Wang; RV32ID-NEXT:    fmv.w.x fa5, a1
1518380fd820SAlex Bradbury; RV32ID-NEXT:    lui a1, 274400
1519*9122c523SPengcheng Wang; RV32ID-NEXT:    slli a0, a0, 16
1520*9122c523SPengcheng Wang; RV32ID-NEXT:    fmv.w.x fa4, a0
1521*9122c523SPengcheng Wang; RV32ID-NEXT:    feq.s a0, fa4, fa4
1522*9122c523SPengcheng Wang; RV32ID-NEXT:    fmax.s fa5, fa4, fa5
1523380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa4, a1
1524*9122c523SPengcheng Wang; RV32ID-NEXT:    neg a0, a0
1525380fd820SAlex Bradbury; RV32ID-NEXT:    fmin.s fa5, fa5, fa4
1526380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.w.s a1, fa5, rtz
1527380fd820SAlex Bradbury; RV32ID-NEXT:    and a0, a0, a1
1528380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1529380fd820SAlex Bradbury;
1530380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_w_s_sat_i8:
1531380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
1532380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1533*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    lui a0, 798720
1534*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    lui a1, 274400
1535*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    fmv.w.x fa4, a0
1536380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    feq.s a0, fa5, fa5
1537380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    neg a0, a0
1538380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmax.s fa5, fa5, fa4
1539380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmv.w.x fa4, a1
1540380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmin.s fa5, fa5, fa4
1541380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.l.s a1, fa5, rtz
1542380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a0, a1
1543380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1544380fd820SAlex Bradbury;
1545380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_w_s_sat_i8:
1546380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
1547380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1548380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 798720
1549*9122c523SPengcheng Wang; RV64ID-NEXT:    fmv.w.x fa5, a1
1550380fd820SAlex Bradbury; RV64ID-NEXT:    lui a1, 274400
1551*9122c523SPengcheng Wang; RV64ID-NEXT:    slli a0, a0, 16
1552*9122c523SPengcheng Wang; RV64ID-NEXT:    fmv.w.x fa4, a0
1553*9122c523SPengcheng Wang; RV64ID-NEXT:    feq.s a0, fa4, fa4
1554*9122c523SPengcheng Wang; RV64ID-NEXT:    fmax.s fa5, fa4, fa5
1555380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa4, a1
1556*9122c523SPengcheng Wang; RV64ID-NEXT:    neg a0, a0
1557380fd820SAlex Bradbury; RV64ID-NEXT:    fmin.s fa5, fa5, fa4
1558380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.l.s a1, fa5, rtz
1559380fd820SAlex Bradbury; RV64ID-NEXT:    and a0, a0, a1
1560380fd820SAlex Bradbury; RV64ID-NEXT:    ret
15617a1b2adcSAlex Bradburystart:
15627a1b2adcSAlex Bradbury  %0 = tail call i8 @llvm.fptosi.sat.i8.bf16(bfloat %a)
15637a1b2adcSAlex Bradbury  ret i8 %0
15647a1b2adcSAlex Bradbury}
15657a1b2adcSAlex Bradburydeclare i8 @llvm.fptosi.sat.i8.bf16(bfloat)
15667a1b2adcSAlex Bradbury
15677a1b2adcSAlex Bradburydefine zeroext i8 @fcvt_wu_s_i8(bfloat %a) nounwind {
1568380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_wu_s_i8:
1569380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0:
15702a9f93bfSCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1571db3792b8SCraig Topper; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1572380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
15737a1b2adcSAlex Bradbury;
1574380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_wu_s_i8:
1575380fd820SAlex Bradbury; RV32ID:       # %bb.0:
1576380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1577380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
1578380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
1579380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
1580380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1581380fd820SAlex Bradbury;
1582380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_wu_s_i8:
1583380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0:
15842a9f93bfSCraig Topper; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1585380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
1586380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1587380fd820SAlex Bradbury;
1588380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_wu_s_i8:
1589380fd820SAlex Bradbury; RV64ID:       # %bb.0:
1590380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1591380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
1592380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
1593380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
1594380fd820SAlex Bradbury; RV64ID-NEXT:    ret
15957a1b2adcSAlex Bradbury  %1 = fptoui bfloat %a to i8
15967a1b2adcSAlex Bradbury  ret i8 %1
15977a1b2adcSAlex Bradbury}
15987a1b2adcSAlex Bradbury
15997a1b2adcSAlex Bradburydefine zeroext i8 @fcvt_wu_s_sat_i8(bfloat %a) nounwind {
1600380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_wu_s_sat_i8:
1601380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
1602380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1603380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmv.w.x fa4, zero
1604380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    lui a0, 276464
1605*9122c523SPengcheng Wang; CHECK32ZFBFMIN-NEXT:    fmax.s fa5, fa5, fa4
1606380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmv.w.x fa4, a0
1607380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fmin.s fa5, fa5, fa4
1608380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1609380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
16107a1b2adcSAlex Bradbury;
1611380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_wu_s_sat_i8:
1612380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
1613380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1614*9122c523SPengcheng Wang; RV32ID-NEXT:    fmv.w.x fa5, zero
1615380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
1616*9122c523SPengcheng Wang; RV32ID-NEXT:    fmv.w.x fa4, a0
1617380fd820SAlex Bradbury; RV32ID-NEXT:    lui a0, 276464
1618*9122c523SPengcheng Wang; RV32ID-NEXT:    fmax.s fa5, fa4, fa5
1619380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa4, a0
1620380fd820SAlex Bradbury; RV32ID-NEXT:    fmin.s fa5, fa5, fa4
1621380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
1622380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1623380fd820SAlex Bradbury;
1624380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_wu_s_sat_i8:
1625380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
1626380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1627380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmv.w.x fa4, zero
1628380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    lui a0, 276464
1629*9122c523SPengcheng Wang; CHECK64ZFBFMIN-NEXT:    fmax.s fa5, fa5, fa4
1630380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmv.w.x fa4, a0
1631380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fmin.s fa5, fa5, fa4
1632380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.lu.s a0, fa5, rtz
1633380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1634380fd820SAlex Bradbury;
1635380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_wu_s_sat_i8:
1636380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
1637380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1638*9122c523SPengcheng Wang; RV64ID-NEXT:    fmv.w.x fa5, zero
1639380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
1640*9122c523SPengcheng Wang; RV64ID-NEXT:    fmv.w.x fa4, a0
1641380fd820SAlex Bradbury; RV64ID-NEXT:    lui a0, 276464
1642*9122c523SPengcheng Wang; RV64ID-NEXT:    fmax.s fa5, fa4, fa5
1643380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa4, a0
1644380fd820SAlex Bradbury; RV64ID-NEXT:    fmin.s fa5, fa5, fa4
1645380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.lu.s a0, fa5, rtz
1646380fd820SAlex Bradbury; RV64ID-NEXT:    ret
16477a1b2adcSAlex Bradburystart:
16487a1b2adcSAlex Bradbury  %0 = tail call i8 @llvm.fptoui.sat.i8.bf16(bfloat %a)
16497a1b2adcSAlex Bradbury  ret i8 %0
16507a1b2adcSAlex Bradbury}
16517a1b2adcSAlex Bradburydeclare i8 @llvm.fptoui.sat.i8.bf16(bfloat)
16527a1b2adcSAlex Bradbury
16537a1b2adcSAlex Bradburydefine zeroext i32 @fcvt_wu_bf16_sat_zext(bfloat %a) nounwind {
1654380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_wu_bf16_sat_zext:
1655380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
1656380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1657380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1658380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
1659380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    seqz a1, a1
1660380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi a1, a1, -1
1661380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a0, a1, a0
1662380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
16637a1b2adcSAlex Bradbury;
1664380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_wu_bf16_sat_zext:
1665380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
1666380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1667380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
1668380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
1669380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.wu.s a0, fa5, rtz
1670380fd820SAlex Bradbury; RV32ID-NEXT:    feq.s a1, fa5, fa5
1671380fd820SAlex Bradbury; RV32ID-NEXT:    seqz a1, a1
1672380fd820SAlex Bradbury; RV32ID-NEXT:    addi a1, a1, -1
1673380fd820SAlex Bradbury; RV32ID-NEXT:    and a0, a1, a0
1674380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1675380fd820SAlex Bradbury;
1676380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_wu_bf16_sat_zext:
1677380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
1678380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1679380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.wu.s a0, fa5, rtz
1680380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
1681380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    seqz a1, a1
168286240751SPhilip Reames; CHECK64ZFBFMIN-NEXT:    addi a1, a1, -1
1683380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a0, a1
1684380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    slli a0, a0, 32
1685380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    srli a0, a0, 32
1686380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1687380fd820SAlex Bradbury;
1688380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_wu_bf16_sat_zext:
1689380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
1690380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1691380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
1692380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
1693380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.wu.s a0, fa5, rtz
1694380fd820SAlex Bradbury; RV64ID-NEXT:    feq.s a1, fa5, fa5
1695380fd820SAlex Bradbury; RV64ID-NEXT:    seqz a1, a1
169686240751SPhilip Reames; RV64ID-NEXT:    addi a1, a1, -1
1697380fd820SAlex Bradbury; RV64ID-NEXT:    and a0, a0, a1
1698380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 32
1699380fd820SAlex Bradbury; RV64ID-NEXT:    srli a0, a0, 32
1700380fd820SAlex Bradbury; RV64ID-NEXT:    ret
17017a1b2adcSAlex Bradburystart:
17027a1b2adcSAlex Bradbury  %0 = tail call i32 @llvm.fptoui.sat.i32.bf16(bfloat %a)
17037a1b2adcSAlex Bradbury  ret i32 %0
17047a1b2adcSAlex Bradbury}
17057a1b2adcSAlex Bradbury
17067a1b2adcSAlex Bradburydefine signext i32 @fcvt_w_bf16_sat_sext(bfloat %a) nounwind {
1707380fd820SAlex Bradbury; CHECK32ZFBFMIN-LABEL: fcvt_w_bf16_sat_sext:
1708380fd820SAlex Bradbury; CHECK32ZFBFMIN:       # %bb.0: # %start
1709380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1710380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1711380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
1712380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    seqz a1, a1
1713380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    addi a1, a1, -1
1714380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    and a0, a1, a0
1715380fd820SAlex Bradbury; CHECK32ZFBFMIN-NEXT:    ret
17167a1b2adcSAlex Bradbury;
1717380fd820SAlex Bradbury; RV32ID-LABEL: fcvt_w_bf16_sat_sext:
1718380fd820SAlex Bradbury; RV32ID:       # %bb.0: # %start
1719380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.x.w a0, fa0
1720380fd820SAlex Bradbury; RV32ID-NEXT:    slli a0, a0, 16
1721380fd820SAlex Bradbury; RV32ID-NEXT:    fmv.w.x fa5, a0
1722380fd820SAlex Bradbury; RV32ID-NEXT:    fcvt.w.s a0, fa5, rtz
1723380fd820SAlex Bradbury; RV32ID-NEXT:    feq.s a1, fa5, fa5
1724380fd820SAlex Bradbury; RV32ID-NEXT:    seqz a1, a1
1725380fd820SAlex Bradbury; RV32ID-NEXT:    addi a1, a1, -1
1726380fd820SAlex Bradbury; RV32ID-NEXT:    and a0, a1, a0
1727380fd820SAlex Bradbury; RV32ID-NEXT:    ret
1728380fd820SAlex Bradbury;
1729380fd820SAlex Bradbury; CHECK64ZFBFMIN-LABEL: fcvt_w_bf16_sat_sext:
1730380fd820SAlex Bradbury; CHECK64ZFBFMIN:       # %bb.0: # %start
1731380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.s.bf16 fa5, fa0
1732380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    fcvt.w.s a0, fa5, rtz
1733380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    feq.s a1, fa5, fa5
1734380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    seqz a1, a1
1735380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    addi a1, a1, -1
1736380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    and a0, a1, a0
1737380fd820SAlex Bradbury; CHECK64ZFBFMIN-NEXT:    ret
1738380fd820SAlex Bradbury;
1739380fd820SAlex Bradbury; RV64ID-LABEL: fcvt_w_bf16_sat_sext:
1740380fd820SAlex Bradbury; RV64ID:       # %bb.0: # %start
1741380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.x.w a0, fa0
1742380fd820SAlex Bradbury; RV64ID-NEXT:    slli a0, a0, 16
1743380fd820SAlex Bradbury; RV64ID-NEXT:    fmv.w.x fa5, a0
1744380fd820SAlex Bradbury; RV64ID-NEXT:    fcvt.w.s a0, fa5, rtz
1745380fd820SAlex Bradbury; RV64ID-NEXT:    feq.s a1, fa5, fa5
1746380fd820SAlex Bradbury; RV64ID-NEXT:    seqz a1, a1
1747380fd820SAlex Bradbury; RV64ID-NEXT:    addi a1, a1, -1
1748380fd820SAlex Bradbury; RV64ID-NEXT:    and a0, a1, a0
1749380fd820SAlex Bradbury; RV64ID-NEXT:    ret
17507a1b2adcSAlex Bradburystart:
17517a1b2adcSAlex Bradbury  %0 = tail call i32 @llvm.fptosi.sat.i32.bf16(bfloat %a)
17527a1b2adcSAlex Bradbury  ret i32 %0
17537a1b2adcSAlex Bradbury}
1754