gem5 [DEVELOP-FOR-25.0]
Loading...
Searching...
No Matches
fplib.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2013, 2017-2018, 2024-2025 ARM Limited
3 * Copyright (c) 2020 Metempsy Technology Consulting
4 * All rights reserved
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating
9 * to a hardware implementation of the functionality of the software
10 * licensed hereunder. You may use the software subject to the license
11 * terms below provided that you ensure that this notice is replicated
12 * unmodified and in its entirety in all distributions of the software,
13 * modified or unmodified, in source code or in binary form.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions are
17 * met: redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer;
19 * redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution;
22 * neither the name of the copyright holders nor the names of its
23 * contributors may be used to endorse or promote products derived from
24 * this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 */
38
46
47#ifndef __ARCH_ARM_INSTS_FPLIB_HH__
48#define __ARCH_ARM_INSTS_FPLIB_HH__
49
50#include <stdint.h>
51
52#include "arch/arm/regs/misc.hh"
53
54namespace gem5
55{
56
57namespace ArmISA
58{
59
69
70static inline FPRounding
71FPCRRounding(FPSCR &fpscr)
72{
73 return (FPRounding)((uint32_t)fpscr >> 22 & 3);
74}
75
77template <class T>
80template <class T>
81T fplibAdd(T op1, T op2, FPSCR &fpscr);
83template <class T>
84int fplibCompare(T op1, T op2, bool signal_nans, FPSCR &fpscr);
86template <class T>
87bool fplibCompareEQ(T op1, T op2, FPSCR &fpscr);
89template <class T>
90bool fplibCompareGE(T op1, T op2, FPSCR &fpscr);
92template <class T>
93bool fplibCompareGT(T op1, T op2, FPSCR &fpscr);
95template <class T>
96bool fplibCompareUN(T op1, T op2, FPSCR &fpscr);
98template <class T1, class T2>
99T2 fplibConvert(T1 op, FPRounding rounding, FPSCR &fpscr);
101template <class T>
102T fplibDiv(T op1, T op2, FPSCR &fpscr);
104template <class T>
107template <class T>
108T fplibMax(T op1, T op2, FPSCR &fpscr);
110template <class T>
111T fplibMaxNum(T op1, T op2, FPSCR &fpscr);
113template <class T>
114T fplibMin(T op1, T op2, FPSCR &fpscr);
116template <class T>
117T fplibMinNum(T op1, T op2, FPSCR &fpscr);
119template <class T>
120T fplibMul(T op1, T op2, FPSCR &fpscr);
122template <class T>
123T fplibMulAdd(T addend, T op1, T op2, FPSCR &fpscr);
125template <class T>
126T fplibMulX(T op1, T op2, FPSCR &fpscr);
128template <class T>
131template <class T>
132T fplibRSqrtEstimate(T op, FPSCR &fpscr);
134template <class T>
135T fplibRSqrtStepFused(T op1, T op2, FPSCR &fpscr);
137template <class T>
138T fplibRecipEstimate(T op, FPSCR &fpscr);
140template <class T>
141T fplibRecipStepFused(T op1, T op2, FPSCR &fpscr);
143template <class T>
144T fplibRecpX(T op, FPSCR &fpscr);
146template <class T>
147T fplibRoundInt(T op, FPRounding rounding, bool exact, FPSCR &fpscr);
149template <class T>
150T fplibScale(T op1, T op2, FPSCR &fpscr);
152template <class T>
153T fplibSqrt(T op, FPSCR &fpscr);
155template <class T>
156T fplibSub(T op1, T op2, FPSCR &fpscr);
158template <class T>
159T fplibTrigMulAdd(uint8_t coeff_index, T op1, T op2, FPSCR &fpscr);
161template <class T>
162T fplibTrigSMul(T op1, T op2, FPSCR &fpscr);
164template <class T>
165T fplibTrigSSel(T op1, T op2, FPSCR &fpscr);
167template <class T1, class T2>
168T2 fplibFPToFixed(T1 op, int fbits, bool u, FPRounding rounding, FPSCR &fpscr);
170template <class T>
171T fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
172 FPSCR &fpscr);
174template <class T>
175T fplibInfinity(int sgn);
177template <class T>
180uint32_t fplibFPToFixedJS(uint64_t op, FPSCR &fpscr, bool Is64, uint8_t &nz);
181
182template <class T>
183T fplib32RSqrtStep(T op1, T op2, FPSCR &fpscr);
184template <class T>
185T fplib32RecipStep(T op1, T op2, FPSCR &fpscr);
186
187/* Function specializations... */
188template <>
189uint16_t fplibAbs(uint16_t op);
190template <>
191uint32_t fplibAbs(uint32_t op);
192template <>
193uint64_t fplibAbs(uint64_t op);
194template <>
195uint16_t fplibAdd(uint16_t op1, uint16_t op2, FPSCR &fpscr);
196template <>
197uint32_t fplibAdd(uint32_t op1, uint32_t op2, FPSCR &fpscr);
198template <>
199uint64_t fplibAdd(uint64_t op1, uint64_t op2, FPSCR &fpscr);
200template <>
201int fplibCompare(uint16_t op1, uint16_t op2, bool signal_nans, FPSCR &fpscr);
202template <>
203int fplibCompare(uint32_t op1, uint32_t op2, bool signal_nans, FPSCR &fpscr);
204template <>
205int fplibCompare(uint64_t op1, uint64_t op2, bool signal_nans, FPSCR &fpscr);
206template <>
207bool fplibCompareEQ(uint16_t op1, uint16_t op2, FPSCR &fpscr);
208template <>
209bool fplibCompareEQ(uint32_t op1, uint32_t op2, FPSCR &fpscr);
210template <>
211bool fplibCompareEQ(uint64_t op1, uint64_t op2, FPSCR &fpscr);
212template <>
213bool fplibCompareGE(uint16_t op1, uint16_t op2, FPSCR &fpscr);
214template <>
215bool fplibCompareGE(uint32_t op1, uint32_t op2, FPSCR &fpscr);
216template <>
217bool fplibCompareGE(uint64_t op1, uint64_t op2, FPSCR &fpscr);
218template <>
219bool fplibCompareGT(uint16_t op1, uint16_t op2, FPSCR &fpscr);
220template <>
221bool fplibCompareGT(uint32_t op1, uint32_t op2, FPSCR &fpscr);
222template <>
223bool fplibCompareGT(uint64_t op1, uint64_t op2, FPSCR &fpscr);
224template <>
225bool fplibCompareUN(uint16_t op1, uint16_t op2, FPSCR &fpscr);
226template <>
227bool fplibCompareUN(uint32_t op1, uint32_t op2, FPSCR &fpscr);
228template <>
229bool fplibCompareUN(uint64_t op1, uint64_t op2, FPSCR &fpscr);
230template <>
231uint16_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr);
232template <>
233uint16_t fplibConvert(uint64_t op, FPRounding rounding, FPSCR &fpscr);
234template <>
235uint32_t fplibConvert(uint16_t op, FPRounding rounding, FPSCR &fpscr);
236template <>
237uint32_t fplibConvert(uint64_t op, FPRounding rounding, FPSCR &fpscr);
238template <>
239uint64_t fplibConvert(uint16_t op, FPRounding rounding, FPSCR &fpscr);
240template <>
241uint64_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr);
242template <>
243uint16_t fplibDiv(uint16_t op1, uint16_t op2, FPSCR &fpscr);
244template <>
245uint32_t fplibDiv(uint32_t op1, uint32_t op2, FPSCR &fpscr);
246template <>
247uint64_t fplibDiv(uint64_t op1, uint64_t op2, FPSCR &fpscr);
248template <>
249uint16_t fplibExpA(uint16_t op);
250template <>
251uint32_t fplibExpA(uint32_t op);
252template <>
253uint64_t fplibExpA(uint64_t op);
254template <>
255uint16_t fplibMax(uint16_t op1, uint16_t op2, FPSCR &fpscr);
256template <>
257uint32_t fplibMax(uint32_t op1, uint32_t op2, FPSCR &fpscr);
258template <>
259uint64_t fplibMax(uint64_t op1, uint64_t op2, FPSCR &fpscr);
260template <>
261uint16_t fplibMaxNum(uint16_t op1, uint16_t op2, FPSCR &fpscr);
262template <>
263uint32_t fplibMaxNum(uint32_t op1, uint32_t op2, FPSCR &fpscr);
264template <>
265uint64_t fplibMaxNum(uint64_t op1, uint64_t op2, FPSCR &fpscr);
266template <>
267uint16_t fplibMin(uint16_t op1, uint16_t op2, FPSCR &fpscr);
268template <>
269uint32_t fplibMin(uint32_t op1, uint32_t op2, FPSCR &fpscr);
270template <>
271uint64_t fplibMin(uint64_t op1, uint64_t op2, FPSCR &fpscr);
272template <>
273uint16_t fplibMinNum(uint16_t op1, uint16_t op2, FPSCR &fpscr);
274template <>
275uint32_t fplibMinNum(uint32_t op1, uint32_t op2, FPSCR &fpscr);
276template <>
277uint64_t fplibMinNum(uint64_t op1, uint64_t op2, FPSCR &fpscr);
278template <>
279uint16_t fplibMul(uint16_t op1, uint16_t op2, FPSCR &fpscr);
280template <>
281uint32_t fplibMul(uint32_t op1, uint32_t op2, FPSCR &fpscr);
282template <>
283uint64_t fplibMul(uint64_t op1, uint64_t op2, FPSCR &fpscr);
284template <>
285uint16_t fplibMulAdd(uint16_t addend, uint16_t op1, uint16_t op2,
286 FPSCR &fpscr);
287template <>
288uint32_t fplibMulAdd(uint32_t addend, uint32_t op1, uint32_t op2,
289 FPSCR &fpscr);
290template <>
291uint64_t fplibMulAdd(uint64_t addend, uint64_t op1, uint64_t op2,
292 FPSCR &fpscr);
293template <>
294uint16_t fplibMulX(uint16_t op1, uint16_t op2, FPSCR &fpscr);
295template <>
296uint32_t fplibMulX(uint32_t op1, uint32_t op2, FPSCR &fpscr);
297template <>
298uint64_t fplibMulX(uint64_t op1, uint64_t op2, FPSCR &fpscr);
299template <>
300uint16_t fplibNeg(uint16_t op);
301template <>
302uint32_t fplibNeg(uint32_t op);
303template <>
304uint64_t fplibNeg(uint64_t op);
305template <>
306uint16_t fplibRSqrtEstimate(uint16_t op, FPSCR &fpscr);
307template <>
308uint32_t fplibRSqrtEstimate(uint32_t op, FPSCR &fpscr);
309template<>
310uint64_t fplibRSqrtEstimate(uint64_t op, FPSCR &fpscr);
311template <>
312uint16_t fplibRSqrtStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr);
313template <>
314uint32_t fplibRSqrtStepFused(uint32_t op1, uint32_t op2, FPSCR &fpscr);
315template <>
316uint64_t fplibRSqrtStepFused(uint64_t op1, uint64_t op2, FPSCR &fpscr);
317template <>
318uint16_t fplibRecipEstimate(uint16_t op, FPSCR &fpscr);
319template <>
320uint32_t fplibRecipEstimate(uint32_t op, FPSCR &fpscr);
321template <>
322uint64_t fplibRecipEstimate(uint64_t op, FPSCR &fpscr);
323template <>
324uint16_t fplibRecipStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr);
325template <>
326uint32_t fplibRecipStepFused(uint32_t op1, uint32_t op2, FPSCR &fpscr);
327template <>
328uint64_t fplibRecipStepFused(uint64_t op1, uint64_t op2, FPSCR &fpscr);
329template <>
330uint16_t fplibRecpX(uint16_t op, FPSCR &fpscr);
331template <>
332uint32_t fplibRecpX(uint32_t op, FPSCR &fpscr);
333template <>
334uint64_t fplibRecpX(uint64_t op, FPSCR &fpscr);
335template <>
336uint16_t fplibRoundInt(uint16_t op, FPRounding rounding, bool exact,
337 FPSCR &fpscr);
338template <>
339uint32_t fplibRoundInt(uint32_t op, FPRounding rounding, bool exact,
340 FPSCR &fpscr);
341template <>
342uint64_t fplibRoundInt(uint64_t op, FPRounding rounding, bool exact,
343 FPSCR &fpscr);
344template <>
345uint16_t fplibScale(uint16_t op1, uint16_t op2, FPSCR &fpscr);
346template <>
347uint32_t fplibScale(uint32_t op1, uint32_t op2, FPSCR &fpscr);
348template <>
349uint64_t fplibScale(uint64_t op1, uint64_t op2, FPSCR &fpscr);
350template <>
351uint16_t fplibSqrt(uint16_t op, FPSCR &fpscr);
352template <>
353uint32_t fplibSqrt(uint32_t op, FPSCR &fpscr);
354template <>
355uint64_t fplibSqrt(uint64_t op, FPSCR &fpscr);
356template <>
357uint16_t fplibSub(uint16_t op1, uint16_t op2, FPSCR &fpscr);
358template <>
359uint32_t fplibSub(uint32_t op1, uint32_t op2, FPSCR &fpscr);
360template <>
361uint64_t fplibSub(uint64_t op1, uint64_t op2, FPSCR &fpscr);
362template <>
363uint16_t fplibTrigMulAdd(uint8_t coeff_index, uint16_t op1, uint16_t op2,
364 FPSCR &fpscr);
365template <>
366uint32_t fplibTrigMulAdd(uint8_t coeff_index, uint32_t op1, uint32_t op2,
367 FPSCR &fpscr);
368template <>
369uint64_t fplibTrigMulAdd(uint8_t coeff_index, uint64_t op1, uint64_t op2,
370 FPSCR &fpscr);
371template <>
372uint16_t fplibTrigSMul(uint16_t op1, uint16_t op2, FPSCR &fpscr);
373template <>
374uint32_t fplibTrigSMul(uint32_t op1, uint32_t op2, FPSCR &fpscr);
375template <>
376uint64_t fplibTrigSMul(uint64_t op1, uint64_t op2, FPSCR &fpscr);
377template <>
378uint16_t fplibTrigSSel(uint16_t op1, uint16_t op2, FPSCR &fpscr);
379template <>
380uint32_t fplibTrigSSel(uint32_t op1, uint32_t op2, FPSCR &fpscr);
381template <>
382uint64_t fplibTrigSSel(uint64_t op1, uint64_t op2, FPSCR &fpscr);
383template <>
384uint16_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding,
385 FPSCR &fpscr);
386template <>
387uint32_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding,
388 FPSCR &fpscr);
389template <>
390uint32_t fplibFPToFixed(uint32_t op, int fbits, bool u, FPRounding rounding,
391 FPSCR &fpscr);
392template <>
393uint32_t fplibFPToFixed(uint64_t op, int fbits, bool u, FPRounding rounding,
394 FPSCR &fpscr);
395template <>
396uint64_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding,
397 FPSCR &fpscr);
398template <>
399uint64_t fplibFPToFixed(uint32_t op, int fbits, bool u, FPRounding rounding,
400 FPSCR &fpscr);
401template <>
402uint64_t fplibFPToFixed(uint64_t op, int fbits, bool u, FPRounding rounding,
403 FPSCR &fpscr);
404template <>
405uint16_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
406 FPSCR &fpscr);
407template <>
408uint32_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
409 FPSCR &fpscr);
410template <>
411uint64_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
412 FPSCR &fpscr);
413template <>
414uint16_t fplibInfinity(int sgn);
415template <>
416uint32_t fplibInfinity(int sgn);
417template <>
418uint64_t fplibInfinity(int sgn);
419template <>
420uint16_t fplibDefaultNaN();
421template <>
422uint32_t fplibDefaultNaN();
423template <>
424uint64_t fplibDefaultNaN();
425
426template <>
427uint16_t fplib32RSqrtStep(uint16_t op1, uint16_t op2, FPSCR &fpscr);
428template <>
429uint16_t fplib32RecipStep(uint16_t op1, uint16_t op2, FPSCR &fpscr);
430
431} // namespace ArmISA
432} // namespace gem5
433
434#endif
uint16_t fplibMax(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3243
uint16_t fplib32RSqrtStep(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:5107
uint32_t fplibFPToFixedJS(uint64_t op, FPSCR &fpscr, bool is64, uint8_t &nz)
Floating-point JS convert to a signed integer, with rounding to zero.
Definition fplib.cc:4816
uint16_t fplib32RecipStep(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:5136
static FPRounding FPCRRounding(FPSCR &fpscr)
Definition fplib.hh:71
uint16_t fplibMinNum(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3405
uint16_t fplibMaxNum(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3312
uint16_t fplibDiv(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:2969
uint16_t fplibRSqrtEstimate(uint16_t op, FPSCR &fpscr)
Definition fplib.cc:3592
uint16_t fplibNeg(uint16_t op)
Definition fplib.cc:3552
bool fplibCompareGT(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition fplib.cc:2333
uint16_t fplibRecipEstimate(uint16_t op, FPSCR &fpscr)
Definition fplib.cc:3787
uint16_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr)
Definition fplib.cc:2688
uint16_t fplibExpA(uint16_t op)
Definition fplib.cc:2999
uint16_t fplibTrigSSel(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:4589
uint16_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding, FPSCR &fpscr)
Definition fplib.cc:5027
uint16_t fplibSqrt(uint16_t op, FPSCR &fpscr)
Definition fplib.cc:4369
bool fplibCompareEQ(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition fplib.cc:2313
uint16_t fplibAdd(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:2454
uint16_t fplibMulX(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3459
uint16_t fplibAbs(uint16_t op)
Definition fplib.cc:2433
bool fplibCompareGE(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition fplib.cc:2323
uint16_t fplibMul(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3429
uint16_t fplibScale(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:4339
Bitfield< 22 > u
uint16_t fplibRecpX(uint16_t op, FPSCR &fpscr)
Definition fplib.cc:4063
uint16_t fplibRecipStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3973
uint16_t fplibTrigSMul(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:4531
uint16_t fplibTrigMulAdd(uint8_t coeff_index, uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:4429
uint16_t fplibRSqrtStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3697
int fplibCompare(uint16_t op1, uint16_t op2, bool signal_nans, FPSCR &fpscr)
Definition fplib.cc:2484
uint16_t fplibDefaultNaN()
Definition fplib.cc:5085
uint16_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding, FPSCR &fpscr)
Definition fplib.cc:4699
uint16_t fplibSub(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:4399
uint16_t fplibMulAdd(uint16_t addend, uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:2939
uint16_t fplibInfinity(int sgn)
Definition fplib.cc:5064
uint16_t fplibRoundInt(uint16_t op, FPRounding rounding, bool exact, FPSCR &fpscr)
Definition fplib.cc:4144
@ FPRounding_POSINF
Definition fplib.hh:63
@ FPRounding_ZERO
Definition fplib.hh:65
@ FPRounding_TIEEVEN
Definition fplib.hh:62
@ FPRounding_TIEAWAY
Definition fplib.hh:66
@ FPRounding_ODD
Definition fplib.hh:67
@ FPRounding_NEGINF
Definition fplib.hh:64
uint16_t fplibMin(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition fplib.cc:3336
bool fplibCompareUN(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition fplib.cc:2343
Bitfield< 4 > op
Definition types.hh:83
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36

Generated on Mon May 26 2025 09:18:57 for gem5 by doxygen 1.13.2