xref: /llvm-project/llvm/test/CodeGen/RISCV/half-zfa.ll (revision 261d4bbb3bb847b90b9734daefe13618dea91613)
1df56b55eSJun Sha (Joshua); NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2eae1e28cSAlex Bradbury; RUN: llc -mtriple=riscv32 -target-abi ilp32f -mattr=+zfa,+zfh < %s \
3df56b55eSJun Sha (Joshua); RUN:     | FileCheck %s
4eae1e28cSAlex Bradbury; RUN: llc -mtriple=riscv64 -target-abi lp64f -mattr=+zfa,+zfh < %s \
5df56b55eSJun Sha (Joshua); RUN:     | FileCheck %s
6c30c0659SCraig Topper; RUN: llc -mtriple=riscv32 -target-abi ilp32f -mattr=+zfa,+zfhmin < %s \
7c30c0659SCraig Topper; RUN:     | FileCheck %s --check-prefix=ZFHMIN
8c30c0659SCraig Topper; RUN: llc -mtriple=riscv64 -target-abi lp64f -mattr=+zfa,+zfhmin < %s \
9c30c0659SCraig Topper; RUN:     | FileCheck %s --check-prefix=ZFHMIN
10df56b55eSJun Sha (Joshua)
11df56b55eSJun Sha (Joshua)declare half @llvm.minimum.f16(half, half)
12df56b55eSJun Sha (Joshua)
13df56b55eSJun Sha (Joshua)define half @fminm_h(half %a, half %b) nounwind {
14df56b55eSJun Sha (Joshua); CHECK-LABEL: fminm_h:
15df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
16df56b55eSJun Sha (Joshua); CHECK-NEXT:    fminm.h fa0, fa0, fa1
17df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
18c30c0659SCraig Topper;
19c30c0659SCraig Topper; ZFHMIN-LABEL: fminm_h:
20c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
21c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
22c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
23c30c0659SCraig Topper; ZFHMIN-NEXT:    fminm.s fa5, fa4, fa5
24c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
25c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
26df56b55eSJun Sha (Joshua)  %1 = call half @llvm.minimum.f16(half %a, half %b)
27df56b55eSJun Sha (Joshua)  ret half %1
28df56b55eSJun Sha (Joshua)}
29df56b55eSJun Sha (Joshua)
30df56b55eSJun Sha (Joshua)declare half @llvm.maximum.f16(half, half)
31df56b55eSJun Sha (Joshua)
32df56b55eSJun Sha (Joshua)define half @fmaxm_h(half %a, half %b) nounwind {
33df56b55eSJun Sha (Joshua); CHECK-LABEL: fmaxm_h:
34df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
35df56b55eSJun Sha (Joshua); CHECK-NEXT:    fmaxm.h fa0, fa0, fa1
36df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
37c30c0659SCraig Topper;
38c30c0659SCraig Topper; ZFHMIN-LABEL: fmaxm_h:
39c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
40c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
41c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
42c30c0659SCraig Topper; ZFHMIN-NEXT:    fmaxm.s fa5, fa4, fa5
43c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
44c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
45df56b55eSJun Sha (Joshua)  %1 = tail call half @llvm.maximum.f16(half %a, half %b)
46df56b55eSJun Sha (Joshua)  ret half %1
47df56b55eSJun Sha (Joshua)}
48df56b55eSJun Sha (Joshua)
49df56b55eSJun Sha (Joshua)define half @fround_h_1(half %a) nounwind {
50df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_h_1:
51df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
52df56b55eSJun Sha (Joshua); CHECK-NEXT:    fround.h fa0, fa0, rmm
53df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
54c30c0659SCraig Topper;
55c30c0659SCraig Topper; ZFHMIN-LABEL: fround_h_1:
56c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
57c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
58c30c0659SCraig Topper; ZFHMIN-NEXT:    fround.s fa5, fa5, rmm
59c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
60c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
61df56b55eSJun Sha (Joshua)  %call = tail call half @llvm.round.f16(half %a) nounwind readnone
62df56b55eSJun Sha (Joshua)  ret half %call
63df56b55eSJun Sha (Joshua)}
64df56b55eSJun Sha (Joshua)
65df56b55eSJun Sha (Joshua)declare half @llvm.round.f16(half) nounwind readnone
66df56b55eSJun Sha (Joshua)
67df56b55eSJun Sha (Joshua)
68df56b55eSJun Sha (Joshua)define half @fround_h_2(half %a) nounwind {
69df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_h_2:
70df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
714bbbae61SJun Sha (Joshua); CHECK-NEXT:    fround.h fa0, fa0, rdn
72df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
73c30c0659SCraig Topper;
74c30c0659SCraig Topper; ZFHMIN-LABEL: fround_h_2:
75c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
76c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
77c30c0659SCraig Topper; ZFHMIN-NEXT:    fround.s fa5, fa5, rdn
78c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
79c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
80df56b55eSJun Sha (Joshua)  %call = tail call half @llvm.floor.f16(half %a) nounwind readnone
81df56b55eSJun Sha (Joshua)  ret half %call
82df56b55eSJun Sha (Joshua)}
83df56b55eSJun Sha (Joshua)
84df56b55eSJun Sha (Joshua)declare half @llvm.floor.f16(half) nounwind readnone
85df56b55eSJun Sha (Joshua)
86df56b55eSJun Sha (Joshua)
87df56b55eSJun Sha (Joshua)define half @fround_h_3(half %a) nounwind {
88df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_h_3:
89df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
904bbbae61SJun Sha (Joshua); CHECK-NEXT:    fround.h fa0, fa0, rup
91df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
92c30c0659SCraig Topper;
93c30c0659SCraig Topper; ZFHMIN-LABEL: fround_h_3:
94c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
95c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
96c30c0659SCraig Topper; ZFHMIN-NEXT:    fround.s fa5, fa5, rup
97c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
98c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
99df56b55eSJun Sha (Joshua)  %call = tail call half @llvm.ceil.f16(half %a) nounwind readnone
100df56b55eSJun Sha (Joshua)  ret half %call
101df56b55eSJun Sha (Joshua)}
102df56b55eSJun Sha (Joshua)
103df56b55eSJun Sha (Joshua)declare half @llvm.ceil.f16(half) nounwind readnone
104df56b55eSJun Sha (Joshua)
105df56b55eSJun Sha (Joshua)
106df56b55eSJun Sha (Joshua)define half @fround_h_4(half %a) nounwind {
107df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_h_4:
108df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
109df56b55eSJun Sha (Joshua); CHECK-NEXT:    fround.h fa0, fa0, rtz
110df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
111c30c0659SCraig Topper;
112c30c0659SCraig Topper; ZFHMIN-LABEL: fround_h_4:
113c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
114c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
115c30c0659SCraig Topper; ZFHMIN-NEXT:    fround.s fa5, fa5, rtz
116c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
117c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
118df56b55eSJun Sha (Joshua)  %call = tail call half @llvm.trunc.f16(half %a) nounwind readnone
119df56b55eSJun Sha (Joshua)  ret half %call
120df56b55eSJun Sha (Joshua)}
121df56b55eSJun Sha (Joshua)
122df56b55eSJun Sha (Joshua)declare half @llvm.trunc.f16(half) nounwind readnone
123df56b55eSJun Sha (Joshua)
124df56b55eSJun Sha (Joshua)
125df56b55eSJun Sha (Joshua)define half @fround_h_5(half %a) nounwind {
126df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_h_5:
127df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
128df56b55eSJun Sha (Joshua); CHECK-NEXT:    fround.h fa0, fa0
129df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
130c30c0659SCraig Topper;
131c30c0659SCraig Topper; ZFHMIN-LABEL: fround_h_5:
132c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
133c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
134c30c0659SCraig Topper; ZFHMIN-NEXT:    fround.s fa5, fa5
135c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
136c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
137df56b55eSJun Sha (Joshua)  %call = tail call half @llvm.nearbyint.f16(half %a) nounwind readnone
138df56b55eSJun Sha (Joshua)  ret half %call
139df56b55eSJun Sha (Joshua)}
140df56b55eSJun Sha (Joshua)
141df56b55eSJun Sha (Joshua)declare half @llvm.nearbyint.f16(half) nounwind readnone
142df56b55eSJun Sha (Joshua)
143*261d4bbbSLuke Quinndefine half @fround_h_6(half %a) nounwind {
144*261d4bbbSLuke Quinn; CHECK-LABEL: fround_h_6:
145*261d4bbbSLuke Quinn; CHECK:       # %bb.0:
146*261d4bbbSLuke Quinn; CHECK-NEXT:    fround.h fa0, fa0, rne
147*261d4bbbSLuke Quinn; CHECK-NEXT:    ret
148*261d4bbbSLuke Quinn;
149*261d4bbbSLuke Quinn; ZFHMIN-LABEL: fround_h_6:
150*261d4bbbSLuke Quinn; ZFHMIN:       # %bb.0:
151*261d4bbbSLuke Quinn; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
152*261d4bbbSLuke Quinn; ZFHMIN-NEXT:    fround.s fa5, fa5, rne
153*261d4bbbSLuke Quinn; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
154*261d4bbbSLuke Quinn; ZFHMIN-NEXT:    ret
155*261d4bbbSLuke Quinn  %call = tail call half @llvm.roundeven.f16(half %a) nounwind readnone
156*261d4bbbSLuke Quinn  ret half %call
157*261d4bbbSLuke Quinn}
158*261d4bbbSLuke Quinn
159*261d4bbbSLuke Quinndeclare half @llvm.roundeven.f16(half) nounwind readnone
160*261d4bbbSLuke Quinn
161df56b55eSJun Sha (Joshua)
162df56b55eSJun Sha (Joshua)define half @froundnx_h(half %a) nounwind {
163df56b55eSJun Sha (Joshua); CHECK-LABEL: froundnx_h:
164df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
165df56b55eSJun Sha (Joshua); CHECK-NEXT:    froundnx.h fa0, fa0
166df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
167c30c0659SCraig Topper;
168c30c0659SCraig Topper; ZFHMIN-LABEL: froundnx_h:
169c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
170c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
171c30c0659SCraig Topper; ZFHMIN-NEXT:    froundnx.s fa5, fa5
172c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
173c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
174df56b55eSJun Sha (Joshua)  %call = tail call half @llvm.rint.f16(half %a) nounwind readnone
175df56b55eSJun Sha (Joshua)  ret half %call
176df56b55eSJun Sha (Joshua)}
177df56b55eSJun Sha (Joshua)
178df56b55eSJun Sha (Joshua)declare half @llvm.rint.f16(half) nounwind readnone
179df56b55eSJun Sha (Joshua)
180df56b55eSJun Sha (Joshua)declare i1 @llvm.experimental.constrained.fcmp.f16(half, half, metadata, metadata)
181df56b55eSJun Sha (Joshua)
182df56b55eSJun Sha (Joshua)define i32 @fcmp_olt_q(half %a, half %b) nounwind strictfp {
183df56b55eSJun Sha (Joshua); CHECK-LABEL: fcmp_olt_q:
184df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
185df56b55eSJun Sha (Joshua); CHECK-NEXT:    fltq.h a0, fa0, fa1
186df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
187c30c0659SCraig Topper;
188c30c0659SCraig Topper; ZFHMIN-LABEL: fcmp_olt_q:
189c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
190c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
191c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
192c30c0659SCraig Topper; ZFHMIN-NEXT:    fltq.s a0, fa4, fa5
193c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
194df56b55eSJun Sha (Joshua)  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
195df56b55eSJun Sha (Joshua)  %2 = zext i1 %1 to i32
196df56b55eSJun Sha (Joshua)  ret i32 %2
197df56b55eSJun Sha (Joshua)}
198df56b55eSJun Sha (Joshua)
199df56b55eSJun Sha (Joshua)define i32 @fcmp_ole_q(half %a, half %b) nounwind strictfp {
200df56b55eSJun Sha (Joshua); CHECK-LABEL: fcmp_ole_q:
201df56b55eSJun Sha (Joshua); CHECK:       # %bb.0:
202df56b55eSJun Sha (Joshua); CHECK-NEXT:    fleq.h a0, fa0, fa1
203df56b55eSJun Sha (Joshua); CHECK-NEXT:    ret
204c30c0659SCraig Topper;
205c30c0659SCraig Topper; ZFHMIN-LABEL: fcmp_ole_q:
206c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
207c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
208c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
209c30c0659SCraig Topper; ZFHMIN-NEXT:    fleq.s a0, fa4, fa5
210c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
211df56b55eSJun Sha (Joshua)  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") strictfp
212df56b55eSJun Sha (Joshua)  %2 = zext i1 %1 to i32
213df56b55eSJun Sha (Joshua)  ret i32 %2
214df56b55eSJun Sha (Joshua)}
2153d0a5bf7SCraig Topper
2163d0a5bf7SCraig Topperdefine i32 @fcmp_one_q(half %a, half %b) nounwind strictfp {
2173d0a5bf7SCraig Topper; CHECK-LABEL: fcmp_one_q:
2183d0a5bf7SCraig Topper; CHECK:       # %bb.0:
2193d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.h a0, fa0, fa1
2203d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.h a1, fa1, fa0
2213d0a5bf7SCraig Topper; CHECK-NEXT:    or a0, a1, a0
2223d0a5bf7SCraig Topper; CHECK-NEXT:    ret
223c30c0659SCraig Topper;
224c30c0659SCraig Topper; ZFHMIN-LABEL: fcmp_one_q:
225c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
226c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
227c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
228c30c0659SCraig Topper; ZFHMIN-NEXT:    fltq.s a0, fa4, fa5
229c30c0659SCraig Topper; ZFHMIN-NEXT:    fltq.s a1, fa5, fa4
230c30c0659SCraig Topper; ZFHMIN-NEXT:    or a0, a1, a0
231c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
2323d0a5bf7SCraig Topper  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") strictfp
2333d0a5bf7SCraig Topper  %2 = zext i1 %1 to i32
2343d0a5bf7SCraig Topper  ret i32 %2
2353d0a5bf7SCraig Topper}
2363d0a5bf7SCraig Topper
2373d0a5bf7SCraig Topperdefine i32 @fcmp_ueq_q(half %a, half %b) nounwind strictfp {
2383d0a5bf7SCraig Topper; CHECK-LABEL: fcmp_ueq_q:
2393d0a5bf7SCraig Topper; CHECK:       # %bb.0:
2403d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.h a0, fa0, fa1
2413d0a5bf7SCraig Topper; CHECK-NEXT:    fltq.h a1, fa1, fa0
2423d0a5bf7SCraig Topper; CHECK-NEXT:    or a0, a1, a0
2433d0a5bf7SCraig Topper; CHECK-NEXT:    xori a0, a0, 1
2443d0a5bf7SCraig Topper; CHECK-NEXT:    ret
245c30c0659SCraig Topper;
246c30c0659SCraig Topper; ZFHMIN-LABEL: fcmp_ueq_q:
247c30c0659SCraig Topper; ZFHMIN:       # %bb.0:
248c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
249c30c0659SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
250c30c0659SCraig Topper; ZFHMIN-NEXT:    fltq.s a0, fa4, fa5
251c30c0659SCraig Topper; ZFHMIN-NEXT:    fltq.s a1, fa5, fa4
252c30c0659SCraig Topper; ZFHMIN-NEXT:    or a0, a1, a0
253c30c0659SCraig Topper; ZFHMIN-NEXT:    xori a0, a0, 1
254c30c0659SCraig Topper; ZFHMIN-NEXT:    ret
2553d0a5bf7SCraig Topper  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp
2563d0a5bf7SCraig Topper  %2 = zext i1 %1 to i32
2573d0a5bf7SCraig Topper  ret i32 %2
2583d0a5bf7SCraig Topper}
259de6d7a6cSCraig Topper
260de6d7a6cSCraig Topperdefine half @fadd_neg_0p5(half %x) {
261de6d7a6cSCraig Topper; CHECK-LABEL: fadd_neg_0p5:
262de6d7a6cSCraig Topper; CHECK:       # %bb.0:
263de6d7a6cSCraig Topper; CHECK-NEXT:    fli.h fa5, 0.5
264de6d7a6cSCraig Topper; CHECK-NEXT:    fsub.h fa0, fa0, fa5
265de6d7a6cSCraig Topper; CHECK-NEXT:    ret
266de6d7a6cSCraig Topper;
267de6d7a6cSCraig Topper; ZFHMIN-LABEL: fadd_neg_0p5:
268de6d7a6cSCraig Topper; ZFHMIN:       # %bb.0:
269de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
270de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fli.s fa4, 0.5
271de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fsub.s fa5, fa5, fa4
272de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
273de6d7a6cSCraig Topper; ZFHMIN-NEXT:    ret
274de6d7a6cSCraig Topper  %a = fadd half %x, -0.5
275de6d7a6cSCraig Topper  ret half %a
276de6d7a6cSCraig Topper}
277de6d7a6cSCraig Topper
278de6d7a6cSCraig Topperdefine half @fma_neg_addend(half %x, half %y) nounwind {
279de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_addend:
280de6d7a6cSCraig Topper; CHECK:       # %bb.0:
281de6d7a6cSCraig Topper; CHECK-NEXT:    fli.h fa5, 0.5
282de6d7a6cSCraig Topper; CHECK-NEXT:    fmsub.h fa0, fa0, fa1, fa5
283de6d7a6cSCraig Topper; CHECK-NEXT:    ret
284de6d7a6cSCraig Topper;
285de6d7a6cSCraig Topper; ZFHMIN-LABEL: fma_neg_addend:
286de6d7a6cSCraig Topper; ZFHMIN:       # %bb.0:
287de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
288de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
289de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fli.s fa3, 0.5
290de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fmsub.s fa5, fa4, fa5, fa3
291de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
292de6d7a6cSCraig Topper; ZFHMIN-NEXT:    ret
293de6d7a6cSCraig Topper  %a = call half @llvm.fma.f32(half %x, half %y, half -0.5)
294de6d7a6cSCraig Topper  ret half %a
295de6d7a6cSCraig Topper}
296de6d7a6cSCraig Topper
297de6d7a6cSCraig Topperdefine half @fma_neg_multiplicand(half %x, half %y) nounwind {
298de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_multiplicand:
299de6d7a6cSCraig Topper; CHECK:       # %bb.0:
300de6d7a6cSCraig Topper; CHECK-NEXT:    fli.h fa5, 0.125
301de6d7a6cSCraig Topper; CHECK-NEXT:    fnmsub.h fa0, fa5, fa0, fa1
302de6d7a6cSCraig Topper; CHECK-NEXT:    ret
303de6d7a6cSCraig Topper;
304de6d7a6cSCraig Topper; ZFHMIN-LABEL: fma_neg_multiplicand:
305de6d7a6cSCraig Topper; ZFHMIN:       # %bb.0:
306de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa1
307de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa4, fa0
308de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fli.s fa3, 0.125
309de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fnmsub.s fa5, fa3, fa4, fa5
310de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
311de6d7a6cSCraig Topper; ZFHMIN-NEXT:    ret
312de6d7a6cSCraig Topper  %a = call half @llvm.fma.f32(half %x, half -0.125, half %y)
313de6d7a6cSCraig Topper  ret half %a
314de6d7a6cSCraig Topper}
315de6d7a6cSCraig Topper
316de6d7a6cSCraig Topperdefine half @fma_neg_addend_multiplicand(half %x) nounwind {
317de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_addend_multiplicand:
318de6d7a6cSCraig Topper; CHECK:       # %bb.0:
319de6d7a6cSCraig Topper; CHECK-NEXT:    fli.h fa5, 0.25
320de6d7a6cSCraig Topper; CHECK-NEXT:    fli.h fa4, 0.5
321de6d7a6cSCraig Topper; CHECK-NEXT:    fnmadd.h fa0, fa4, fa0, fa5
322de6d7a6cSCraig Topper; CHECK-NEXT:    ret
323de6d7a6cSCraig Topper;
324de6d7a6cSCraig Topper; ZFHMIN-LABEL: fma_neg_addend_multiplicand:
325de6d7a6cSCraig Topper; ZFHMIN:       # %bb.0:
326de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
327de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fli.s fa4, 0.25
328de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fli.s fa3, 0.5
329de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fnmadd.s fa5, fa3, fa5, fa4
330de6d7a6cSCraig Topper; ZFHMIN-NEXT:    fcvt.h.s fa0, fa5
331de6d7a6cSCraig Topper; ZFHMIN-NEXT:    ret
332de6d7a6cSCraig Topper  %a = call half @llvm.fma.f32(half %x, half -0.5, half -0.25)
333de6d7a6cSCraig Topper  ret half %a
334de6d7a6cSCraig Topper}
335079f31c1SCraig Topper
336079f31c1SCraig Topperdefine half @select_loadfpimm(half %x) nounwind {
337079f31c1SCraig Topper; CHECK-LABEL: select_loadfpimm:
338079f31c1SCraig Topper; CHECK:       # %bb.0: # %entry
339079f31c1SCraig Topper; CHECK-NEXT:    fmv.h.x fa5, zero
340079f31c1SCraig Topper; CHECK-NEXT:    fle.h a0, fa5, fa0
341079f31c1SCraig Topper; CHECK-NEXT:    fli.h fa0, 0.5
342*261d4bbbSLuke Quinn; CHECK-NEXT:    bnez a0, .LBB17_2
343079f31c1SCraig Topper; CHECK-NEXT:  # %bb.1:
344079f31c1SCraig Topper; CHECK-NEXT:    fneg.h fa0, fa0
345*261d4bbbSLuke Quinn; CHECK-NEXT:  .LBB17_2: # %entry
346079f31c1SCraig Topper; CHECK-NEXT:    ret
347079f31c1SCraig Topper;
348079f31c1SCraig Topper; ZFHMIN-LABEL: select_loadfpimm:
349079f31c1SCraig Topper; ZFHMIN:       # %bb.0: # %entry
350079f31c1SCraig Topper; ZFHMIN-NEXT:    fcvt.s.h fa5, fa0
351079f31c1SCraig Topper; ZFHMIN-NEXT:    fmv.w.x fa4, zero
352079f31c1SCraig Topper; ZFHMIN-NEXT:    fle.s a0, fa4, fa5
353079f31c1SCraig Topper; ZFHMIN-NEXT:    xori a0, a0, 1
354079f31c1SCraig Topper; ZFHMIN-NEXT:    slli a0, a0, 1
355*261d4bbbSLuke Quinn; ZFHMIN-NEXT:    lui a1, %hi(.LCPI17_0)
356*261d4bbbSLuke Quinn; ZFHMIN-NEXT:    addi a1, a1, %lo(.LCPI17_0)
357079f31c1SCraig Topper; ZFHMIN-NEXT:    add a0, a1, a0
358079f31c1SCraig Topper; ZFHMIN-NEXT:    flh fa0, 0(a0)
359079f31c1SCraig Topper; ZFHMIN-NEXT:    ret
360079f31c1SCraig Topperentry:
361079f31c1SCraig Topper  %cmp = fcmp ult half %x, 0.000000e+00
362079f31c1SCraig Topper  %sel = select i1 %cmp, half -5.000000e-01, half 5.000000e-01
363079f31c1SCraig Topper  ret half %sel
364079f31c1SCraig Topper}
365