gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
fplib.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2013, 2017-2018 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  * Authors: Edmund Grimley Evans
39  * Thomas Grocutt
40  */
41 
50 #ifndef __ARCH_ARM_INSTS_FPLIB_HH__
51 #define __ARCH_ARM_INSTS_FPLIB_HH__
52 
53 #include <stdint.h>
54 
55 #include "arch/arm/miscregs.hh"
56 
57 namespace ArmISA
58 {
59 
60 enum FPRounding {
67 };
68 
69 static inline FPRounding
70 FPCRRounding(FPSCR &fpscr)
71 {
72  return (FPRounding)((uint32_t)fpscr >> 22 & 3);
73 }
74 
76 template <class T>
77 T fplibAbs(T op);
79 template <class T>
80 T fplibAdd(T op1, T op2, FPSCR &fpscr);
82 template <class T>
83 int fplibCompare(T op1, T op2, bool signal_nans, FPSCR &fpscr);
85 template <class T>
86 bool fplibCompareEQ(T op1, T op2, FPSCR &fpscr);
88 template <class T>
89 bool fplibCompareGE(T op1, T op2, FPSCR &fpscr);
91 template <class T>
92 bool fplibCompareGT(T op1, T op2, FPSCR &fpscr);
94 template <class T>
95 bool fplibCompareUN(T op1, T op2, FPSCR &fpscr);
97 template <class T1, class T2>
98 T2 fplibConvert(T1 op, FPRounding rounding, FPSCR &fpscr);
100 template <class T>
101 T fplibDiv(T op1, T op2, FPSCR &fpscr);
103 template <class T>
104 T fplibExpA(T op);
106 template <class T>
107 T fplibMax(T op1, T op2, FPSCR &fpscr);
109 template <class T>
110 T fplibMaxNum(T op1, T op2, FPSCR &fpscr);
112 template <class T>
113 T fplibMin(T op1, T op2, FPSCR &fpscr);
115 template <class T>
116 T fplibMinNum(T op1, T op2, FPSCR &fpscr);
118 template <class T>
119 T fplibMul(T op1, T op2, FPSCR &fpscr);
121 template <class T>
122 T fplibMulAdd(T addend, T op1, T op2, FPSCR &fpscr);
124 template <class T>
125 T fplibMulX(T op1, T op2, FPSCR &fpscr);
127 template <class T>
128 T fplibNeg(T op);
130 template <class T>
131 T fplibRSqrtEstimate(T op, FPSCR &fpscr);
133 template <class T>
134 T fplibRSqrtStepFused(T op1, T op2, FPSCR &fpscr);
136 template <class T>
137 T fplibRecipEstimate(T op, FPSCR &fpscr);
139 template <class T>
140 T fplibRecipStepFused(T op1, T op2, FPSCR &fpscr);
142 template <class T>
143 T fplibRecpX(T op, FPSCR &fpscr);
145 template <class T>
146 T fplibRoundInt(T op, FPRounding rounding, bool exact, FPSCR &fpscr);
148 template <class T>
149 T fplibScale(T op1, T op2, FPSCR &fpscr);
151 template <class T>
152 T fplibSqrt(T op, FPSCR &fpscr);
154 template <class T>
155 T fplibSub(T op1, T op2, FPSCR &fpscr);
157 template <class T>
158 T fplibTrigMulAdd(uint8_t coeff_index, T op1, T op2, FPSCR &fpscr);
160 template <class T>
161 T fplibTrigSMul(T op1, T op2, FPSCR &fpscr);
163 template <class T>
164 T fplibTrigSSel(T op1, T op2, FPSCR &fpscr);
166 template <class T1, class T2>
167 T2 fplibFPToFixed(T1 op, int fbits, bool u, FPRounding rounding, FPSCR &fpscr);
169 template <class T>
170 T fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
171  FPSCR &fpscr);
173 template <class T>
174 T fplibInfinity(int sgn);
176 template <class T>
177 T fplibDefaultNaN();
179 uint32_t fplibFPToFixedJS(uint64_t op, FPSCR &fpscr, bool Is64, uint8_t &nz);
180 
181 /* Function specializations... */
182 template <>
183 uint16_t fplibAbs(uint16_t op);
184 template <>
185 uint32_t fplibAbs(uint32_t op);
186 template <>
187 uint64_t fplibAbs(uint64_t op);
188 template <>
189 uint16_t fplibAdd(uint16_t op1, uint16_t op2, FPSCR &fpscr);
190 template <>
191 uint32_t fplibAdd(uint32_t op1, uint32_t op2, FPSCR &fpscr);
192 template <>
193 uint64_t fplibAdd(uint64_t op1, uint64_t op2, FPSCR &fpscr);
194 template <>
195 int fplibCompare(uint16_t op1, uint16_t op2, bool signal_nans, FPSCR &fpscr);
196 template <>
197 int fplibCompare(uint32_t op1, uint32_t op2, bool signal_nans, FPSCR &fpscr);
198 template <>
199 int fplibCompare(uint64_t op1, uint64_t op2, bool signal_nans, FPSCR &fpscr);
200 template <>
201 bool fplibCompareEQ(uint16_t op1, uint16_t op2, FPSCR &fpscr);
202 template <>
203 bool fplibCompareEQ(uint32_t op1, uint32_t op2, FPSCR &fpscr);
204 template <>
205 bool fplibCompareEQ(uint64_t op1, uint64_t op2, FPSCR &fpscr);
206 template <>
207 bool fplibCompareGE(uint16_t op1, uint16_t op2, FPSCR &fpscr);
208 template <>
209 bool fplibCompareGE(uint32_t op1, uint32_t op2, FPSCR &fpscr);
210 template <>
211 bool fplibCompareGE(uint64_t op1, uint64_t op2, FPSCR &fpscr);
212 template <>
213 bool fplibCompareGT(uint16_t op1, uint16_t op2, FPSCR &fpscr);
214 template <>
215 bool fplibCompareGT(uint32_t op1, uint32_t op2, FPSCR &fpscr);
216 template <>
217 bool fplibCompareGT(uint64_t op1, uint64_t op2, FPSCR &fpscr);
218 template <>
219 bool fplibCompareUN(uint16_t op1, uint16_t op2, FPSCR &fpscr);
220 template <>
221 bool fplibCompareUN(uint32_t op1, uint32_t op2, FPSCR &fpscr);
222 template <>
223 bool fplibCompareUN(uint64_t op1, uint64_t op2, FPSCR &fpscr);
224 template <>
225 uint16_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr);
226 template <>
227 uint16_t fplibConvert(uint64_t op, FPRounding rounding, FPSCR &fpscr);
228 template <>
229 uint32_t fplibConvert(uint16_t op, FPRounding rounding, FPSCR &fpscr);
230 template <>
231 uint32_t fplibConvert(uint64_t op, FPRounding rounding, FPSCR &fpscr);
232 template <>
233 uint64_t fplibConvert(uint16_t op, FPRounding rounding, FPSCR &fpscr);
234 template <>
235 uint64_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr);
236 template <>
237 uint16_t fplibDiv(uint16_t op1, uint16_t op2, FPSCR &fpscr);
238 template <>
239 uint32_t fplibDiv(uint32_t op1, uint32_t op2, FPSCR &fpscr);
240 template <>
241 uint64_t fplibDiv(uint64_t op1, uint64_t op2, FPSCR &fpscr);
242 template <>
243 uint16_t fplibExpA(uint16_t op);
244 template <>
245 uint32_t fplibExpA(uint32_t op);
246 template <>
247 uint64_t fplibExpA(uint64_t op);
248 template <>
249 uint16_t fplibMax(uint16_t op1, uint16_t op2, FPSCR &fpscr);
250 template <>
251 uint32_t fplibMax(uint32_t op1, uint32_t op2, FPSCR &fpscr);
252 template <>
253 uint64_t fplibMax(uint64_t op1, uint64_t op2, FPSCR &fpscr);
254 template <>
255 uint16_t fplibMaxNum(uint16_t op1, uint16_t op2, FPSCR &fpscr);
256 template <>
257 uint32_t fplibMaxNum(uint32_t op1, uint32_t op2, FPSCR &fpscr);
258 template <>
259 uint64_t fplibMaxNum(uint64_t op1, uint64_t op2, FPSCR &fpscr);
260 template <>
261 uint16_t fplibMin(uint16_t op1, uint16_t op2, FPSCR &fpscr);
262 template <>
263 uint32_t fplibMin(uint32_t op1, uint32_t op2, FPSCR &fpscr);
264 template <>
265 uint64_t fplibMin(uint64_t op1, uint64_t op2, FPSCR &fpscr);
266 template <>
267 uint16_t fplibMinNum(uint16_t op1, uint16_t op2, FPSCR &fpscr);
268 template <>
269 uint32_t fplibMinNum(uint32_t op1, uint32_t op2, FPSCR &fpscr);
270 template <>
271 uint64_t fplibMinNum(uint64_t op1, uint64_t op2, FPSCR &fpscr);
272 template <>
273 uint16_t fplibMul(uint16_t op1, uint16_t op2, FPSCR &fpscr);
274 template <>
275 uint32_t fplibMul(uint32_t op1, uint32_t op2, FPSCR &fpscr);
276 template <>
277 uint64_t fplibMul(uint64_t op1, uint64_t op2, FPSCR &fpscr);
278 template <>
279 uint16_t fplibMulAdd(uint16_t addend, uint16_t op1, uint16_t op2,
280  FPSCR &fpscr);
281 template <>
282 uint32_t fplibMulAdd(uint32_t addend, uint32_t op1, uint32_t op2,
283  FPSCR &fpscr);
284 template <>
285 uint64_t fplibMulAdd(uint64_t addend, uint64_t op1, uint64_t op2,
286  FPSCR &fpscr);
287 template <>
288 uint16_t fplibMulX(uint16_t op1, uint16_t op2, FPSCR &fpscr);
289 template <>
290 uint32_t fplibMulX(uint32_t op1, uint32_t op2, FPSCR &fpscr);
291 template <>
292 uint64_t fplibMulX(uint64_t op1, uint64_t op2, FPSCR &fpscr);
293 template <>
294 uint16_t fplibNeg(uint16_t op);
295 template <>
296 uint32_t fplibNeg(uint32_t op);
297 template <>
298 uint64_t fplibNeg(uint64_t op);
299 template <>
300 uint16_t fplibRSqrtEstimate(uint16_t op, FPSCR &fpscr);
301 template <>
302 uint32_t fplibRSqrtEstimate(uint32_t op, FPSCR &fpscr);
303 template<>
304 uint64_t fplibRSqrtEstimate(uint64_t op, FPSCR &fpscr);
305 template <>
306 uint16_t fplibRSqrtStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr);
307 template <>
308 uint32_t fplibRSqrtStepFused(uint32_t op1, uint32_t op2, FPSCR &fpscr);
309 template <>
310 uint64_t fplibRSqrtStepFused(uint64_t op1, uint64_t op2, FPSCR &fpscr);
311 template <>
312 uint16_t fplibRecipEstimate(uint16_t op, FPSCR &fpscr);
313 template <>
314 uint32_t fplibRecipEstimate(uint32_t op, FPSCR &fpscr);
315 template <>
316 uint64_t fplibRecipEstimate(uint64_t op, FPSCR &fpscr);
317 template <>
318 uint16_t fplibRecipStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr);
319 template <>
320 uint32_t fplibRecipStepFused(uint32_t op1, uint32_t op2, FPSCR &fpscr);
321 template <>
322 uint64_t fplibRecipStepFused(uint64_t op1, uint64_t op2, FPSCR &fpscr);
323 template <>
324 uint16_t fplibRecpX(uint16_t op, FPSCR &fpscr);
325 template <>
326 uint32_t fplibRecpX(uint32_t op, FPSCR &fpscr);
327 template <>
328 uint64_t fplibRecpX(uint64_t op, FPSCR &fpscr);
329 template <>
330 uint16_t fplibRoundInt(uint16_t op, FPRounding rounding, bool exact,
331  FPSCR &fpscr);
332 template <>
333 uint32_t fplibRoundInt(uint32_t op, FPRounding rounding, bool exact,
334  FPSCR &fpscr);
335 template <>
336 uint64_t fplibRoundInt(uint64_t op, FPRounding rounding, bool exact,
337  FPSCR &fpscr);
338 template <>
339 uint16_t fplibScale(uint16_t op1, uint16_t op2, FPSCR &fpscr);
340 template <>
341 uint32_t fplibScale(uint32_t op1, uint32_t op2, FPSCR &fpscr);
342 template <>
343 uint64_t fplibScale(uint64_t op1, uint64_t op2, FPSCR &fpscr);
344 template <>
345 uint16_t fplibSqrt(uint16_t op, FPSCR &fpscr);
346 template <>
347 uint32_t fplibSqrt(uint32_t op, FPSCR &fpscr);
348 template <>
349 uint64_t fplibSqrt(uint64_t op, FPSCR &fpscr);
350 template <>
351 uint16_t fplibSub(uint16_t op1, uint16_t op2, FPSCR &fpscr);
352 template <>
353 uint32_t fplibSub(uint32_t op1, uint32_t op2, FPSCR &fpscr);
354 template <>
355 uint64_t fplibSub(uint64_t op1, uint64_t op2, FPSCR &fpscr);
356 template <>
357 uint16_t fplibTrigMulAdd(uint8_t coeff_index, uint16_t op1, uint16_t op2,
358  FPSCR &fpscr);
359 template <>
360 uint32_t fplibTrigMulAdd(uint8_t coeff_index, uint32_t op1, uint32_t op2,
361  FPSCR &fpscr);
362 template <>
363 uint64_t fplibTrigMulAdd(uint8_t coeff_index, uint64_t op1, uint64_t op2,
364  FPSCR &fpscr);
365 template <>
366 uint16_t fplibTrigSMul(uint16_t op1, uint16_t op2, FPSCR &fpscr);
367 template <>
368 uint32_t fplibTrigSMul(uint32_t op1, uint32_t op2, FPSCR &fpscr);
369 template <>
370 uint64_t fplibTrigSMul(uint64_t op1, uint64_t op2, FPSCR &fpscr);
371 template <>
372 uint16_t fplibTrigSSel(uint16_t op1, uint16_t op2, FPSCR &fpscr);
373 template <>
374 uint32_t fplibTrigSSel(uint32_t op1, uint32_t op2, FPSCR &fpscr);
375 template <>
376 uint64_t fplibTrigSSel(uint64_t op1, uint64_t op2, FPSCR &fpscr);
377 template <>
378 uint16_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding,
379  FPSCR &fpscr);
380 template <>
381 uint32_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding,
382  FPSCR &fpscr);
383 template <>
384 uint32_t fplibFPToFixed(uint32_t op, int fbits, bool u, FPRounding rounding,
385  FPSCR &fpscr);
386 template <>
387 uint32_t fplibFPToFixed(uint64_t op, int fbits, bool u, FPRounding rounding,
388  FPSCR &fpscr);
389 template <>
390 uint64_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding,
391  FPSCR &fpscr);
392 template <>
393 uint64_t fplibFPToFixed(uint32_t op, int fbits, bool u, FPRounding rounding,
394  FPSCR &fpscr);
395 template <>
396 uint64_t fplibFPToFixed(uint64_t op, int fbits, bool u, FPRounding rounding,
397  FPSCR &fpscr);
398 template <>
399 uint16_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
400  FPSCR &fpscr);
401 template <>
402 uint32_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
403  FPSCR &fpscr);
404 template <>
405 uint64_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding,
406  FPSCR &fpscr);
407 template <>
408 uint16_t fplibInfinity(int sgn);
409 template <>
410 uint32_t fplibInfinity(int sgn);
411 template <>
412 uint64_t fplibInfinity(int sgn);
413 template <>
414 uint16_t fplibDefaultNaN();
415 template <>
416 uint32_t fplibDefaultNaN();
417 template <>
418 uint64_t fplibDefaultNaN();
419 }
420 
421 #endif
uint16_t fplibAdd(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:2382
uint16_t fplibExpA(uint16_t op)
Definition: fplib.cc:2927
uint16_t fplibFPToFixed(uint16_t op, int fbits, bool u, FPRounding rounding, FPSCR &fpscr)
Definition: fplib.cc:4627
bool fplibCompareGT(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition: fplib.cc:2261
uint16_t fplibRoundInt(uint16_t op, FPRounding rounding, bool exact, FPSCR &fpscr)
Definition: fplib.cc:4072
uint16_t fplibRSqrtEstimate(uint16_t op, FPSCR &fpscr)
Definition: fplib.cc:3520
uint16_t fplibDefaultNaN()
Foating-point value for default NaN.
Definition: fplib.cc:5013
uint16_t fplibNeg(uint16_t op)
Definition: fplib.cc:3480
uint16_t fplibScale(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:4267
uint16_t fplibMaxNum(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3240
uint16_t fplibMinNum(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3333
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:4744
uint16_t fplibMulX(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3387
Definition: ccregs.hh:42
bool fplibCompareEQ(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition: fplib.cc:2241
FPRounding
Definition: fplib.hh:60
uint16_t fplibRSqrtStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3625
uint16_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr)
Definition: fplib.cc:2616
static FPRounding FPCRRounding(FPSCR &fpscr)
Definition: fplib.hh:70
uint16_t fplibRecpX(uint16_t op, FPSCR &fpscr)
Definition: fplib.cc:3991
uint16_t fplibMul(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3357
Bitfield< 22 > u
uint16_t fplibMin(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3264
uint16_t fplibRecipStepFused(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3901
uint16_t fplibRecipEstimate(uint16_t op, FPSCR &fpscr)
Definition: fplib.cc:3715
uint16_t fplibInfinity(int sgn)
Floating-point value for +/- infinity.
Definition: fplib.cc:4992
uint16_t fplibSub(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:4327
uint16_t fplibAbs(uint16_t op)
Definition: fplib.cc:2361
uint16_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding, FPSCR &fpscr)
Floating-point convert from fixed-point.
Definition: fplib.cc:4955
uint16_t fplibMax(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:3171
bool fplibCompareGE(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition: fplib.cc:2251
uint16_t fplibMulAdd(uint16_t addend, uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:2867
uint16_t fplibTrigSMul(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:4459
int fplibCompare(uint16_t op1, uint16_t op2, bool signal_nans, FPSCR &fpscr)
Definition: fplib.cc:2412
bool fplibCompareUN(uint16_t a, uint16_t b, FPSCR &fpscr)
Definition: fplib.cc:2271
uint16_t fplibSqrt(uint16_t op, FPSCR &fpscr)
Definition: fplib.cc:4297
uint16_t fplibDiv(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:2897
Bitfield< 4 > op
Definition: types.hh:80
uint16_t fplibTrigMulAdd(uint8_t coeff_index, uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:4357
uint16_t fplibTrigSSel(uint16_t op1, uint16_t op2, FPSCR &fpscr)
Definition: fplib.cc:4517

Generated on Fri Feb 28 2020 16:26:57 for gem5 by doxygen 1.8.13