109 std::stringstream
ss;
122 std::stringstream
ss;
137 std::stringstream
ss;
151 std::stringstream
ss;
167 std::stringstream
ss;
184 int roundingMode = fegetround();
207 bool underflow =
false;
222 if ((exceptions &
FeInexact) && !(underflow && flush) &&
mask.ixc) {
228template <
class fpType>
232 int fpClass = std::fpclassify(
val);
234 if (fpClass == FP_NAN) {
235 const bool single = (
sizeof(
val) ==
sizeof(float));
236 const uint64_t qnan = single ? 0x7fc00000 : 0x7ff8000000000000ULL;
238 if (!nan || defaultNan) {
243 }
else if (fpClass == FP_SUBNORMAL && flush == 1) {
245 uint64_t bitMask = 0x1ULL << (
sizeof(fpType) * 8 - 1);
258template <
class fpType>
260fixDest(
bool flush,
bool defaultNan, fpType
val, fpType op1, fpType op2)
262 int fpClass = std::fpclassify(
val);
264 if (fpClass == FP_NAN) {
265 const bool single = (
sizeof(
val) ==
sizeof(float));
266 const uint64_t qnan = single ? 0x7fc00000 : 0x7ff8000000000000ULL;
269 const bool signal1 = nan1 && ((
fpToBits(op1) & qnan) != qnan);
270 const bool signal2 = nan2 && ((
fpToBits(op2) & qnan) != qnan);
271 if ((!nan1 && !nan2) || defaultNan) {
273 }
else if (signal1) {
275 }
else if (signal2) {
282 }
else if (fpClass == FP_SUBNORMAL && flush) {
284 uint64_t bitMask = 0x1ULL << (
sizeof(fpType) * 8 - 1);
294 float val,
float op1,
float op2);
297 double val,
double op1,
double op2);
299template <
class fpType>
303 fpType mid =
fixDest(flush, defaultNan,
val, op1, op2);
304 const bool single = (
sizeof(fpType) ==
sizeof(float));
305 const fpType junk = 0.0;
306 if ((single && (
val ==
bitsToFp(0x00800000, junk) ||
308 (!single && (
val ==
bitsToFp(0x0010000000000000ULL, junk) ||
311 __asm__ __volatile__(
"" :
"=m" (op1) :
"m" (op1));
314 __asm__ __volatile__(
"" :
"=m" (temp) :
"m" (temp));
323 __asm__ __volatile__(
"" ::
"m" (temp));
330 float val,
float op1,
float op2);
333 double val,
double op1,
double op2);
338 const float junk = 0.0;
342 uint32_t op1Bits =
bits(valBits, 50, 29) |
344 (
bits(valBits, 63) << 31);
347 float mid =
fixDest(fpscr.fz, fpscr.dn, (
float)
val, op1);
352 if (mid ==
bitsToFp(0x00800000, junk) ||
353 mid ==
bitsToFp(0x80800000, junk)) {
354 __asm__ __volatile__(
"" :
"=m" (
val) :
"m" (
val));
357 __asm__ __volatile__(
"" :
"=m" (temp) :
"m" (temp));
366 __asm__ __volatile__(
"" ::
"m" (temp));
374 const double junk = 0.0;
378 uint64_t op1Bits = ((uint64_t)
bits(valBits, 21, 0) << 29) |
380 ((uint64_t)
bits(valBits, 31) << 63);
383 double mid =
fixDest(fpscr.fz, fpscr.dn, (
double)
val, op1);
384 if (mid ==
bitsToFp(0x0010000000000000ULL, junk) ||
385 mid ==
bitsToFp(0x8010000000000000ULL, junk)) {
386 __asm__ __volatile__(
"" :
"=m" (
val) :
"m" (
val));
389 __asm__ __volatile__(
"" :
"=m" (temp) :
"m" (temp));
398 __asm__ __volatile__(
"" ::
"m" (temp));
403static inline uint16_t
405 uint32_t
rMode,
bool ahp, uint64_t opBits,
bool isDouble)
419 sBitPos = eWidth + mWidth;
420 eHalfRange = (1 << (eWidth-1)) - 1;
423 bool neg =
bits(opBits, sBitPos);
424 uint32_t exponent =
bits(opBits, sBitPos-1, mWidth);
425 uint64_t oldMantissa =
bits(opBits, mWidth-1, 0);
426 uint32_t mantissa = oldMantissa >> (mWidth - 10);
428 uint64_t extra = oldMantissa &
mask(mWidth - 10);
429 if (exponent ==
mask(eWidth)) {
430 if (oldMantissa != 0) {
432 if (
bits(mantissa, 9) == 0) {
440 }
else if (defaultNan) {
446 mantissa |= (1 << 9);
458 }
else if (exponent == 0 && oldMantissa == 0) {
463 bool inexact = (extra != 0);
471 if (inexact || fpscr.ufe)
480 (extra == (1 << 9) &&
bits(mantissa, 0))))) {
485 if (mantissa == (1 << 10)) {
494 bool topOne =
bits(extra, mWidth - 10 - 1);
495 bool restZeros =
bits(extra, mWidth - 10 - 2, 0) == 0;
497 if (exponent <= (eHalfRange - 15)) {
499 mantissa |= (1 << 10);
500 while (mantissa && exponent <= (eHalfRange - 15)) {
501 restZeros = restZeros && !topOne;
502 topOne =
bits(mantissa, 0);
503 mantissa = mantissa >> 1;
506 if (topOne || !restZeros)
511 exponent -= (eHalfRange - 15);
514 if (exponent == 0 && (inexact || fpscr.ufe)) {
521 bool nonZero = topOne || !restZeros;
525 (!restZeros ||
bits(mantissa, 0)))) {
530 if (mantissa == (1 << 10)) {
537 if (exponent >= 0x20) {
545 if (exponent >= 0x1f) {
568 uint32_t result =
bits(mantissa, 9, 0);
591static inline uint64_t
606 sBitPos = eWidth + mWidth;
607 eHalfRange = (1 << (eWidth-1)) - 1;
611 uint32_t exponent =
bits(
op, 14, 10);
612 uint64_t mantissa =
bits(
op, 9, 0);
617 exponent = exponent + (eHalfRange - 15) + 1;
618 while (mantissa < (1 << 10)) {
619 mantissa = mantissa << 1;
623 mantissa = mantissa << (mWidth - 10);
624 }
else if (exponent == 0x1f && !
ahp) {
626 exponent =
mask(eWidth);
629 mantissa = mantissa << (mWidth - 10);
630 if (
bits(mantissa, mWidth-1) == 0) {
633 mantissa |= (((uint64_t) 1) << (mWidth-1));
636 mantissa &=
~mask(mWidth-1);
641 exponent = exponent + (eHalfRange - 15);
642 mantissa = mantissa << (mWidth - 10);
645 uint64_t result =
bits(mantissa, mWidth-1, 0);
648 result |= (((uint64_t) 1) << sBitPos);
680 else if (
width == 32)
682 else if (
width != 64)
685 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
687 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
698 else if (
width == 32)
700 else if (
width != 64)
704 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
706 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
718 else if (
width == 32)
720 else if (
width != 64)
724 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
726 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
737 else if (
width == 32)
739 else if (
width != 64)
743 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
745 __asm__ __volatile__(
"" :
"=m" (
scale) :
"m" (
scale));
757 q0 = (int64_t)(
a * 512.0);
758 r = 1.0 / sqrt(((
double)q0 + 0.5) / 512.0);
760 q1 = (int64_t)(
a * 256.0);
761 r = 1.0 / sqrt(((
double)q1 + 0.5) / 256.0);
763 s = (int64_t)(256.0 *
r + 0.5);
764 return (
double)
s / 256.0;
772 const uint32_t qnan = 0x7fc00000;
774 int fpClass = std::fpclassify(
op);
775 if (fpClass == FP_NAN) {
779 }
else if (fpClass == FP_ZERO) {
783 (0xFF << 23) | (0 << 0), junk);
784 }
else if (std::signbit(
op)) {
788 }
else if (fpClass == FP_INFINITE) {
793 if (
bits(opBits, 23)) {
794 scaled =
bitsToFp((0 << 0) | (
bits(opBits, 22, 0) << 29) |
795 (0x3fdULL << 52) | (
bits(opBits, 31) << 63),
798 scaled =
bitsToFp((0 << 0) | (
bits(opBits, 22, 0) << 29) |
799 (0x3feULL << 52) | (
bits(opBits, 31) << 63),
802 uint64_t resultExp = (380 -
bits(opBits, 30, 23)) / 2;
807 (
bits(resultExp, 7, 0) << 23) |
808 (
bits(estimate, 51, 29) << 0), junk);
815 const uint16_t qnan = 0x7e00;
818 if (fpClass == FP_NAN) {
819 if ((
op & qnan) != qnan)
822 }
else if ((fpscr.fz16 && fpClass == FP_SUBNORMAL)
823 || fpClass == FP_ZERO) {
826 return (sign << 15) | (0x1F << 10) | (0 << 0);
831 }
else if (fpClass == FP_INFINITE) {
834 uint64_t opBits =
op;
835 uint64_t fraction =
bits(opBits, 9, 0) << 42;
836 int16_t exp =
bits(opBits, 14, 10);
839 while (
bits(fraction, 51) == 0) {
840 fraction =
bits(fraction, 50, 0) << 1;
843 fraction =
bits(fraction, 50, 0) << 1;
849 scaled =
bitsToFp((0 << 0) | (
bits(fraction, 51, 42) << 42) |
850 (0x3fdULL << 52) | (0ULL << 63),
853 scaled =
bitsToFp((0 << 0) | (
bits(fraction, 51, 41) << 41) |
854 (0x3feULL << 52) | (0ULL << 63),
857 uint64_t resultExp = (44 - exp) / 2;
863 if (resultExp == 0) {
868 return (
bits(resultExp, 4, 0) << 10) | (
bits(estimate, 51, 44) << 2);
875 if (
bits(
op, 31, 30) == 0) {
882 (
bits((uint64_t)
op, 30, 0) << 21) |
883 (0 << 0), (
double)0.0);
887 (
bits((uint64_t)
op, 29, 0) << 22) |
888 (0 << 0), (
double)0.0);
891 return (1 << 31) |
bits(estimate, 51, 21);
903 q = (int64_t)(
a * 512.0);
904 r = 1.0 / (((double)
q + 0.5) / 512.0);
905 s = (int64_t)(256.0 *
r + 0.5);
906 return (
double)
s / 256.0;
914 const uint32_t qnan = 0x7fc00000;
916 int fpClass = std::fpclassify(
op);
917 if (fpClass == FP_NAN) {
921 }
else if (fpClass == FP_INFINITE) {
922 return bitsToFp(std::signbit(
op) << 31, junk);
923 }
else if (fpClass == FP_ZERO) {
927 (0xFF << 23) | (0 << 0), junk);
928 }
else if (fabs(
op) >= pow(2.0, 126)) {
930 return bitsToFp(std::signbit(
op) << 31, junk);
934 scaled =
bitsToFp((0 << 0) | (
bits(opBits, 22, 0) << 29) |
935 (0x3feULL << 52) | (0ULL << 63),
937 uint64_t resultExp = 253 -
bits(opBits, 30, 23);
942 (
bits(resultExp, 7, 0) << 23) |
943 (
bits(estimate, 51, 29) << 0), junk);
950 const uint16_t qnan = 0x7e00;
953 if (fpClass == FP_NAN) {
954 if ((
op & qnan) != qnan)
957 }
else if (fpClass == FP_INFINITE) {
959 }
else if ((fpscr.fz16 && fpClass == FP_SUBNORMAL)
960 || fpClass == FP_ZERO) {
963 return (sign << 15) | (0x1F << 10) | (0 << 0);
964 }
else if (
bits(
op, 14, 8) == 0) {
967 return (sign << 15) | (0x1F << 10) | (0 << 0);
968 }
else if (fpscr.fz16 &&
bits(
op, 14, 10) >= 29) {
972 uint64_t opBits =
op;
973 uint64_t fraction =
bits(opBits, 9, 0) << 42;
974 int16_t exp =
bits(opBits, 14, 10);
977 if (
bits(fraction, 51) == 0) {
979 fraction =
bits(fraction, 49, 0) << 2;
981 fraction =
bits(fraction, 50, 0) << 1;
987 scaled =
bitsToFp((0 << 0) | (
bits(fraction, 51, 44) << 44) |
988 (0x3feULL << 52) | (0ULL << 63),
990 uint64_t resultExp = 29 - exp;
993 fraction =
bits(estimate, 51, 0);
995 if (resultExp == 0) {
996 fraction = (1ULL << 51) |
bits(fraction, 51, 1);
997 }
else if (resultExp == -1) {
998 fraction = (1ULL << 50) |
bits(fraction, 51, 2);
1004 if (resultExp == 0) {
1009 return (sign << 15) | (
bits(resultExp, 4, 0) << 10) |
1010 (
bits(fraction, 51, 42) << 0);
1023 (
bits((uint64_t)
op, 30, 0) << 21) |
1024 (0 << 0), (
double)0.0);
1026 return (1 << 31) |
bits(estimate, 51, 21);
1034 new_fpscr.ahp = fpscr.ahp;
1037 new_fpscr.fz16 = fpscr.fz16;
1041template <
class fpType>
1044 fpType op1, fpType op2)
const
1049 const bool single = (
sizeof(fpType) ==
sizeof(float));
1050 const uint64_t qnan =
1051 single ? 0x7fc00000 : 0x7ff8000000000000ULL;
1054 const bool signal1 = nan1 && ((
fpToBits(op1) & qnan) != qnan);
1055 const bool signal2 = nan2 && ((
fpToBits(op2) & qnan) != qnan);
1059 }
else if (signal1) {
1061 }
else if (signal2) {
1068 if (signal1 || signal2) {
1079 float op1,
float op2)
const;
1082 double op1,
double op2)
const;
1085template <
class fpType>
1088 fpType (*func)(fpType, fpType, fpType),
1089 bool flush,
bool defaultNan, uint32_t
rMode)
const
1091 const bool single = (
sizeof(fpType) ==
sizeof(float));
1097 __asm__ __volatile__ (
"" :
"=m" (op1),
"=m" (op2),
"=m" (op3),
"=m" (state)
1098 :
"m" (op1),
"m" (op2),
"m" (op3),
"m" (state));
1099 fpType dest = func(op1, op2, op3);
1100 __asm__ __volatile__ (
"" :
"=m" (dest) :
"m" (dest));
1102 int fpClass = std::fpclassify(dest);
1104 if (fpClass == FP_NAN) {
1105 const uint64_t qnan =
1106 single ? 0x7fc00000 : 0x7ff8000000000000ULL;
1110 const bool signal1 = nan1 && ((
fpToBits(op1) & qnan) != qnan);
1111 const bool signal2 = nan2 && ((
fpToBits(op2) & qnan) != qnan);
1112 const bool signal3 = nan3 && ((
fpToBits(op3) & qnan) != qnan);
1113 if ((!nan1 && !nan2 && !nan3) || (defaultNan == 1)) {
1115 }
else if (signal1) {
1117 }
else if (signal2) {
1119 }
else if (signal3) {
1131 (single && (dest ==
bitsToFp(0x00800000, junk) ||
1132 dest ==
bitsToFp(0x80800000, junk))) ||
1134 (dest ==
bitsToFp(0x0010000000000000ULL, junk) ||
1135 dest ==
bitsToFp(0x8010000000000000ULL, junk)))
1142 __asm__ __volatile__ (
"" :
"=m" (op1),
"=m" (op2),
"=m" (op3)
1143 :
"m" (op1),
"m" (op2),
"m" (op3));
1144 fpType temp = func(op1, op2, op2);
1145 __asm__ __volatile__ (
"" :
"=m" (temp) :
"m" (temp));
1156 float (*func)(
float,
float,
float),
1157 bool flush,
bool defaultNan, uint32_t
rMode)
const;
1159double FpOp::ternaryOp(FPSCR &fpscr,
double op1,
double op2,
double op3,
1160 double (*func)(
double,
double,
double),
1161 bool flush,
bool defaultNan, uint32_t
rMode)
const;
1163template <
class fpType>
1166 fpType (*func)(fpType, fpType),
1167 bool flush,
bool defaultNan, uint32_t
rMode)
const
1169 const bool single = (
sizeof(fpType) ==
sizeof(float));
1175 __asm__ __volatile__ (
"" :
"=m" (op1),
"=m" (op2),
"=m" (state)
1176 :
"m" (op1),
"m" (op2),
"m" (state));
1177 fpType dest = func(op1, op2);
1178 __asm__ __volatile__ (
"" :
"=m" (dest) :
"m" (dest));
1182 const uint64_t qnan =
1183 single ? 0x7fc00000 : 0x7ff8000000000000ULL;
1186 const bool signal1 = nan1 && ((
fpToBits(op1) & qnan) != qnan);
1187 const bool signal2 = nan2 && ((
fpToBits(op2) & qnan) != qnan);
1188 if ((!nan1 && !nan2) || (defaultNan == 1)) {
1190 }
else if (signal1) {
1192 }
else if (signal2) {
1202 (single && (dest ==
bitsToFp(0x00800000, junk) ||
1203 dest ==
bitsToFp(0x80800000, junk))) ||
1205 (dest ==
bitsToFp(0x0010000000000000ULL, junk) ||
1206 dest ==
bitsToFp(0x8010000000000000ULL, junk)))
1213 __asm__ __volatile__ (
"" :
"=m" (op1),
"=m" (op2)
1214 :
"m" (op1),
"m" (op2));
1215 fpType temp = func(op1, op2);
1216 __asm__ __volatile__ (
"" :
"=m" (temp) :
"m" (temp));
1227 float (*func)(
float,
float),
1228 bool flush,
bool defaultNan, uint32_t
rMode)
const;
1231 double (*func)(
double,
double),
1232 bool flush,
bool defaultNan, uint32_t
rMode)
const;
1234template <
class fpType>
1237 bool flush, uint32_t
rMode)
const
1239 const bool single = (
sizeof(fpType) ==
sizeof(float));
1245 __asm__ __volatile__ (
"" :
"=m" (op1),
"=m" (state)
1246 :
"m" (op1),
"m" (state));
1247 fpType dest = func(op1);
1248 __asm__ __volatile__ (
"" :
"=m" (dest) :
"m" (dest));
1252 const uint64_t qnan =
1253 single ? 0x7fc00000 : 0x7ff8000000000000ULL;
1255 if (!nan || fpscr.dn == 1) {
1263 (single && (dest ==
bitsToFp(0x00800000, junk) ||
1264 dest ==
bitsToFp(0x80800000, junk))) ||
1266 (dest ==
bitsToFp(0x0010000000000000ULL, junk) ||
1267 dest ==
bitsToFp(0x8010000000000000ULL, junk)))
1274 __asm__ __volatile__ (
"" :
"=m" (op1) :
"m" (op1));
1275 fpType temp = func(op1);
1276 __asm__ __volatile__ (
"" :
"=m" (temp) :
"m" (temp));
1286float FpOp::unaryOp(FPSCR &fpscr,
float op1,
float (*func)(
float),
1287 bool flush, uint32_t
rMode)
const;
1289double FpOp::unaryOp(FPSCR &fpscr,
double op1,
double (*func)(
double),
1290 bool flush, uint32_t
rMode)
const;
1298 unsigned offset = idx % 8;
1344 new_fpscr.fz16 = fpscr.fz16;
1352 new_fpscr.ahp = fpscr.ahp;
1356 new_fpscr.fz16 = fpscr.fz16;
1363 FPSCR new_fpscr(fpscr_exec);
1364 new_fpscr.idc = fpscr_exec.idc | fpscr.idc;
1365 new_fpscr.ixc = fpscr_exec.ixc | fpscr.ixc;
1366 new_fpscr.ufc = fpscr_exec.ufc | fpscr.ufc;
1367 new_fpscr.ofc = fpscr_exec.ofc | fpscr.ofc;
1368 new_fpscr.dzc = fpscr_exec.dzc | fpscr.dzc;
1369 new_fpscr.ioc = fpscr_exec.ioc | fpscr.ioc;
void printCondition(std::ostream &os, unsigned code, bool noImplicit=false) const
void printMnemonic(std::ostream &os, const std::string &suffix="", bool withPred=true, bool withCond64=false, ConditionCode cond64=COND_UC) const
void printIntReg(std::ostream &os, RegIndex reg_idx, uint8_t opWidth=0) const
Print a register name for disassembly given the unique dependence tag number (FP or int).
void printFloatReg(std::ostream &os, RegIndex reg_idx) const
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
fpType unaryOp(FPSCR &fpscr, fpType op1, fpType(*func)(fpType), bool flush, uint32_t rMode) const
fpType processNans(FPSCR &fpscr, bool &done, bool defaultNan, fpType op1, fpType op2) const
fpType ternaryOp(FPSCR &fpscr, fpType op1, fpType op2, fpType op3, fpType(*func)(fpType, fpType, fpType), bool flush, bool defaultNan, uint32_t rMode) const
fpType binaryOp(FPSCR &fpscr, fpType op1, fpType op2, fpType(*func)(fpType, fpType), bool flush, bool defaultNan, uint32_t rMode) const
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
static bool inScalarBank(RegIndex idx)
void nextIdxs(RegIndex &dest, RegIndex &op1, RegIndex &op2)
RegIndex addStride(RegIndex idx, unsigned stride)
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
constexpr uint64_t szext(uint64_t val)
Sign-extend an N-bit value to 64 bits.
constexpr void replaceBits(T &val, unsigned first, unsigned last, B bit_val)
A convenience function to replace bits first to last of val with bit_val in place.
#define panic(...)
This implements a cprintf based panic() function.
uint32_t unsignedRecipEstimate(uint32_t op)
static uint32_t fpToBits(float)
fpType fixDivDest(bool flush, bool defaultNan, fpType val, fpType op1, fpType op2)
static uint16_t vcvtFpFpH(FPSCR &fpscr, bool flush, bool defaultNan, uint32_t rMode, bool ahp, uint64_t opBits, bool isDouble)
uint16_t fpRecipEstimateFpH(FPSCR &fpscr, uint16_t op)
double vfpSFixedToFpD(bool flush, bool defaultNan, int64_t val, uint8_t width, uint8_t imm)
double vcvtFpHFpD(FPSCR &fpscr, bool defaultNan, bool ahp, uint16_t op)
static uint64_t vcvtFpHFp(FPSCR &fpscr, bool defaultNan, bool ahp, uint16_t op, bool isDouble)
uint16_t fprSqrtEstimateFpH(FPSCR &fpscr, uint16_t op)
float vfpUFixedToFpS(bool flush, bool defaultNan, uint64_t val, uint8_t width, uint8_t imm)
uint32_t unsignedRSqrtEstimate(uint32_t op)
VfpSavedState prepFpState(uint32_t rMode)
float fixFpDFpSDest(FPSCR fpscr, double val)
void finishVfp(FPSCR &fpscr, VfpSavedState state, bool flush, FPSCR mask)
double fixFpSFpDDest(FPSCR fpscr, float val)
float vcvtFpHFpS(FPSCR &fpscr, bool defaultNan, bool ahp, uint16_t op)
float vfpSFixedToFpS(bool flush, bool defaultNan, int64_t val, uint8_t width, uint8_t imm)
fpType fixDest(bool flush, bool defaultNan, fpType val, fpType op1)
double vfpUFixedToFpD(bool flush, bool defaultNan, uint64_t val, uint8_t width, uint8_t imm)
Bitfield< 21, 20 > stride
static float bitsToFp(uint64_t, float)
constexpr int fpclassifyFpH(uint16_t __x)
static double recipEstimate(double a)
FPSCR fpVASimdCvtFPSCRValue(const FPSCR &fpscr)
uint16_t vcvtFpDFpH(FPSCR &fpscr, bool flush, bool defaultNan, uint32_t rMode, bool ahp, double op)
FPSCR fpStandardFPSCRValue(const FPSCR &fpscr)
uint16_t vcvtFpSFpH(FPSCR &fpscr, bool flush, bool defaultNan, uint32_t rMode, bool ahp, float op)
float fprSqrtEstimate(FPSCR &fpscr, float op)
static double recipSqrtEstimate(double a)
float fpRecipEstimate(FPSCR &fpscr, float op)
FPSCR fpRestoreFPSCRValue(const FPSCR fpscr_exec, const FPSCR &fpscr)
FPSCR fpVASimdFPSCRValue(const FPSCR &fpscr)
Copyright (c) 2024 Arm Limited All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void ccprintf(cp::Print &print)
constexpr bool isnan(gem5::AMDGPU::fp16_e5m10_info a)