44#ifndef __ARCH_RISCV_UTILITY_HH__
45#define __ARCH_RISCV_UTILITY_HH__
58#include "enums/RiscvType.hh"
67template<
typename T>
inline bool
76 return std::isnan(
val)
77 && (
reinterpret_cast<uint32_t&
>(
val)&0x00400000);
83 return std::isnan(
val)
84 && (
reinterpret_cast<uint64_t&
>(
val)&0x0008000000000000ULL);
87template<
typename T>
inline bool
96 return std::isnan(
val)
97 && (
reinterpret_cast<uint32_t&
>(
val)&0x00200000);
100template<>
inline bool
103 return std::isnan(
val)
104 && (
reinterpret_cast<uint64_t&
>(
val)&0x0004000000000000ULL);
121 std::stringstream str;
122 str <<
"?? (x" <<
reg.index() <<
')';
128 std::stringstream str;
129 str <<
"?? (f" <<
reg.index() <<
')';
144 return ((uint64_t)
rs1 *
rs2) >> 32;
150 uint64_t rs1_lo = (uint32_t)
rs1;
151 uint64_t rs1_hi =
rs1 >> 32;
152 uint64_t rs2_lo = (uint32_t)
rs2;
153 uint64_t rs2_hi =
rs2 >> 32;
155 uint64_t hi = rs1_hi * rs2_hi;
156 uint64_t mid1 = rs1_hi * rs2_lo;
157 uint64_t mid2 = rs1_lo * rs2_hi;
158 uint64_t
lo = rs1_lo * rs2_lo;
159 uint64_t carry = ((uint64_t)(uint32_t)mid1
160 + (uint64_t)(uint32_t)mid2
163 return hi + (mid1 >> 32) + (mid2 >> 32) + carry;
169 return ((int64_t)
rs1 *
rs2) >> 32;
175 bool negate = (
rs1 < 0) != (
rs2 < 0);
177 return negate ? ~res + (
rs1 *
rs2 == 0 ? 1 : 0) : res;
183 return ((int64_t)
rs1 *
rs2) >> 32;
189 bool negate =
rs1 < 0;
191 return negate ? ~res + (
rs1 *
rs2 == 0 ? 1 : 0) : res;
194template<
typename T>
inline T
197 constexpr T kRsMin = std::numeric_limits<T>::min();
200 }
else if (
rs1 == kRsMin &&
rs2 == -1) {
207template<
typename T>
inline T
211 return std::numeric_limits<T>::max();
217template<
typename T>
inline T
220 constexpr T kRsMin = std::numeric_limits<T>::min();
223 }
else if (
rs1 == kRsMin &&
rs2 == -1) {
230template<
typename T>
inline T
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
Register ID: describe an architectural register with its class and index.
const std::vector< std::string > RegNames
const std::vector< std::string > RegNames
int32_t mulh_32(int32_t rs1, int32_t rs2)
bool issignalingnan< double >(double val)
uint64_t mulhu_64(uint64_t rs1, uint64_t rs2)
bool isquietnan< double >(double val)
bool issignalingnan(T val)
bool isquietnan< float >(float val)
std::string registerName(RegId reg)
int32_t mulhsu_32(int32_t rs1, uint32_t rs2)
int64_t mulhsu_64(int64_t rs1, uint64_t rs2)
uint32_t mulhu_32(uint32_t rs1, uint32_t rs2)
bool issignalingnan< float >(float val)
int64_t mulh_64(int64_t rs1, int64_t rs2)
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
@ FloatRegClass
Floating-point register.
@ IntRegClass
Integer register.