arch: Minimize use of RegClassType constants and the RegId constructor.
These are global values which prevent making register types ISA specific. Change-Id: I513adcae5ad316122c24f25a9e01b9974629510f Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49785 Maintainer: Gabe Black <gabe.black@gmail.com> Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -191,7 +191,7 @@ struct Argument<Aapcs32, Integer, typename std::enable_if_t<
|
||||
get(ThreadContext *tc, Aapcs32::State &state)
|
||||
{
|
||||
if (state.ncrn <= state.MAX_CRN) {
|
||||
return tc->getReg(RegId(IntRegClass, state.ncrn++));
|
||||
return tc->getReg(ArmISA::intRegClass[state.ncrn++]);
|
||||
}
|
||||
|
||||
// Max out the ncrn since we effectively exhausted it.
|
||||
@@ -216,11 +216,13 @@ struct Argument<Aapcs32, Integer, typename std::enable_if_t<
|
||||
state.ncrn + 1 <= state.MAX_CRN) {
|
||||
Integer low, high;
|
||||
if (ArmISA::byteOrder(tc) == ByteOrder::little) {
|
||||
low = tc->getReg(RegId(IntRegClass, state.ncrn++)) & mask(32);
|
||||
high = tc->getReg(RegId(IntRegClass, state.ncrn++)) & mask(32);
|
||||
low = tc->getReg(ArmISA::intRegClass[state.ncrn++]) & mask(32);
|
||||
high = tc->getReg(ArmISA::intRegClass[state.ncrn++]) &
|
||||
mask(32);
|
||||
} else {
|
||||
high = tc->getReg(RegId(IntRegClass, state.ncrn++)) & mask(32);
|
||||
low = tc->getReg(RegId(IntRegClass, state.ncrn++)) & mask(32);
|
||||
high = tc->getReg(ArmISA::intRegClass[state.ncrn++]) &
|
||||
mask(32);
|
||||
low = tc->getReg(ArmISA::intRegClass[state.ncrn++]) & mask(32);
|
||||
}
|
||||
return low | (high << 32);
|
||||
}
|
||||
@@ -295,7 +297,7 @@ struct Result<Aapcs32, Composite, typename std::enable_if_t<
|
||||
prepare(ThreadContext *tc, Aapcs32::State &state)
|
||||
{
|
||||
if (sizeof(Composite) > sizeof(uint32_t))
|
||||
state.retAddr = tc->getReg(RegId(IntRegClass, state.ncrn++));
|
||||
state.retAddr = tc->getReg(ArmISA::intRegClass[state.ncrn++]);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -316,7 +318,7 @@ struct Argument<Aapcs32, Composite, typename std::enable_if_t<
|
||||
if (bytes <= chunk_size) {
|
||||
if (state.ncrn++ <= state.MAX_CRN) {
|
||||
alignas(alignof(Composite)) uint32_t val =
|
||||
tc->getReg(RegId(IntRegClass, state.ncrn++));
|
||||
tc->getReg(ArmISA::intRegClass[state.ncrn++]);
|
||||
val = htog(val, ArmISA::byteOrder(tc));
|
||||
return gtoh(*(Composite *)&val, ArmISA::byteOrder(tc));
|
||||
}
|
||||
@@ -328,7 +330,7 @@ struct Argument<Aapcs32, Composite, typename std::enable_if_t<
|
||||
if (state.ncrn + regs - 1 <= state.MAX_CRN) {
|
||||
alignas(alignof(Composite)) uint8_t buf[bytes];
|
||||
for (int i = 0; i < regs; i++) {
|
||||
Chunk val = tc->getReg(RegId(IntRegClass, state.ncrn++));
|
||||
Chunk val = tc->getReg(ArmISA::intRegClass[state.ncrn++]);
|
||||
val = htog(val, ArmISA::byteOrder(tc));
|
||||
size_t to_copy = std::min<size_t>(bytes, chunk_size);
|
||||
memcpy(buf + i * chunk_size, &val, to_copy);
|
||||
@@ -342,7 +344,7 @@ struct Argument<Aapcs32, Composite, typename std::enable_if_t<
|
||||
|
||||
int offset = 0;
|
||||
while (state.ncrn <= state.MAX_CRN) {
|
||||
Chunk val = tc->getReg(RegId(IntRegClass, state.ncrn++));
|
||||
Chunk val = tc->getReg(ArmISA::intRegClass[state.ncrn++]);
|
||||
val = htog(val, ArmISA::byteOrder(tc));
|
||||
size_t to_copy = std::min<size_t>(bytes, chunk_size);
|
||||
memcpy(buf + offset, &val, to_copy);
|
||||
@@ -479,7 +481,7 @@ struct Result<Aapcs32Vfp, Float, typename std::enable_if_t<
|
||||
auto *vec_elems = static_cast<ArmISA::VecElem *>(&bytes);
|
||||
constexpr int chunks = sizeof(Float) / sizeof(ArmISA::VecElem);
|
||||
for (int chunk = 0; chunk < chunks; chunk++)
|
||||
tc->setReg(RegId(VecElemClass, chunk), vec_elems[chunk]);
|
||||
tc->setReg(ArmISA::vecElemClass[chunk], vec_elems[chunk]);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -503,7 +505,7 @@ struct Argument<Aapcs32Vfp, Float, typename std::enable_if_t<
|
||||
|
||||
constexpr int chunks = sizeof(Float) / sizeof(ArmISA::VecElem);
|
||||
for (int chunk = 0; chunk < chunks; chunk++)
|
||||
vec_elems[chunk] = tc->getReg(RegId(VecElemClass, chunk));
|
||||
vec_elems[chunk] = tc->getReg(ArmISA::vecElemClass[chunk]);
|
||||
|
||||
return bitsToFloat(result);
|
||||
}
|
||||
@@ -571,7 +573,7 @@ struct Argument<Aapcs32Vfp, HA, typename std::enable_if_t<
|
||||
const int reg = index / lane_per_reg;
|
||||
const int lane = index % lane_per_reg;
|
||||
|
||||
RegId id(VecRegClass, reg);
|
||||
RegId id = ArmISA::vecRegClass[reg];
|
||||
ArmISA::VecRegContainer val;
|
||||
tc->getReg(id, &val);
|
||||
ha[i] = val.as<Elem>()[lane];
|
||||
@@ -619,7 +621,7 @@ struct Result<Aapcs32Vfp, HA,
|
||||
const int reg = i / lane_per_reg;
|
||||
const int lane = i % lane_per_reg;
|
||||
|
||||
RegId id(VecRegClass, reg);
|
||||
RegId id = ArmISA::vecRegClass[reg];
|
||||
ArmISA::VecRegContainer val;
|
||||
tc->getReg(id, &val);
|
||||
val.as<Elem>()[lane] = ha[i];
|
||||
|
||||
@@ -201,7 +201,7 @@ struct Argument<Aapcs64, Float, typename std::enable_if_t<
|
||||
get(ThreadContext *tc, Aapcs64::State &state)
|
||||
{
|
||||
if (state.nsrn <= state.MAX_SRN) {
|
||||
RegId id(VecRegClass, state.nsrn++);
|
||||
RegId id = ArmISA::vecRegClass[state.nsrn++];
|
||||
ArmISA::VecRegContainer vc;
|
||||
tc->getReg(id, &vc);
|
||||
return vc.as<Float>()[0];
|
||||
@@ -218,7 +218,7 @@ struct Result<Aapcs64, Float, typename std::enable_if_t<
|
||||
static void
|
||||
store(ThreadContext *tc, const Float &f)
|
||||
{
|
||||
RegId id(VecRegClass, 0);
|
||||
RegId id = ArmISA::vecRegClass[0];
|
||||
ArmISA::VecRegContainer reg;
|
||||
tc->getReg(id, ®);
|
||||
reg.as<Float>()[0] = f;
|
||||
@@ -241,7 +241,7 @@ struct Argument<Aapcs64, Integer, typename std::enable_if_t<
|
||||
get(ThreadContext *tc, Aapcs64::State &state)
|
||||
{
|
||||
if (state.ngrn <= state.MAX_GRN)
|
||||
return tc->getReg(RegId(IntRegClass, state.ngrn++));
|
||||
return tc->getReg(ArmISA::intRegClass[state.ngrn++]);
|
||||
|
||||
// Max out ngrn since we've effectively saturated it.
|
||||
state.ngrn = state.MAX_GRN + 1;
|
||||
@@ -262,8 +262,8 @@ struct Argument<Aapcs64, Integer, typename std::enable_if_t<
|
||||
state.ngrn++;
|
||||
|
||||
if (sizeof(Integer) == 16 && state.ngrn + 1 <= state.MAX_GRN) {
|
||||
Integer low = tc->getReg(RegId(IntRegClass, state.ngrn++));
|
||||
Integer high = tc->getReg(RegId(IntRegClass, state.ngrn++));
|
||||
Integer low = tc->getReg(ArmISA::intRegClass[state.ngrn++]);
|
||||
Integer high = tc->getReg(ArmISA::intRegClass[state.ngrn++]);
|
||||
high = high << 64;
|
||||
return high | low;
|
||||
}
|
||||
@@ -382,7 +382,7 @@ struct Argument<Aapcs64, Composite, typename std::enable_if_t<
|
||||
if (state.ngrn + regs - 1 <= state.MAX_GRN) {
|
||||
alignas(alignof(Composite)) uint8_t buf[bytes];
|
||||
for (int i = 0; i < regs; i++) {
|
||||
Chunk val = tc->getReg(RegId(IntRegClass, state.ngrn++));
|
||||
Chunk val = tc->getReg(ArmISA::intRegClass[state.ngrn++]);
|
||||
val = htog(val, ArmISA::byteOrder(tc));
|
||||
size_t to_copy = std::min<size_t>(bytes, chunk_size);
|
||||
memcpy(buf + i * chunk_size, &val, to_copy);
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
|
||||
#include "arch/arm/fastmodel/iris/cpu.hh"
|
||||
#include "arch/arm/fastmodel/iris/memory_spaces.hh"
|
||||
#include "arch/arm/regs/vec.hh"
|
||||
#include "arch/arm/system.hh"
|
||||
#include "arch/arm/utility.hh"
|
||||
#include "base/logging.hh"
|
||||
@@ -878,7 +879,7 @@ ThreadContext::readVecReg(const RegId ®_id) const
|
||||
const ArmISA::VecRegContainer &
|
||||
ThreadContext::readVecRegFlat(RegIndex idx) const
|
||||
{
|
||||
return readVecReg(RegId(VecRegClass, idx));
|
||||
return readVecReg(ArmISA::vecRegClass[idx]);
|
||||
}
|
||||
|
||||
const ArmISA::VecPredRegContainer &
|
||||
@@ -913,7 +914,7 @@ ThreadContext::readVecPredReg(const RegId ®_id) const
|
||||
ArmISA::VecPredRegContainer
|
||||
ThreadContext::readVecPredRegFlat(RegIndex idx) const
|
||||
{
|
||||
return readVecPredReg(RegId(VecPredRegClass, idx));
|
||||
return readVecPredReg(ArmISA::vecPredRegClass[idx]);
|
||||
}
|
||||
|
||||
} // namespace Iris
|
||||
|
||||
@@ -77,17 +77,13 @@ ArmISA::HTMCheckpoint::save(ThreadContext *tc)
|
||||
nzcv = tc->readMiscReg(MISCREG_NZCV);
|
||||
daif = tc->readMiscReg(MISCREG_DAIF);
|
||||
for (auto n = 0; n < int_reg::NumArchRegs; n++) {
|
||||
x[n] = tc->getReg(RegId(IntRegClass, n));
|
||||
x[n] = tc->getReg(intRegClass[n]);
|
||||
}
|
||||
// TODO first detect if FP is enabled at this EL
|
||||
for (auto n = 0; n < NumVecRegs; n++) {
|
||||
RegId idx = RegId(VecRegClass, n);
|
||||
tc->getReg(idx, &z[n]);
|
||||
}
|
||||
for (auto n = 0; n < NumVecPredRegs; n++) {
|
||||
RegId idx = RegId(VecPredRegClass, n);
|
||||
tc->getReg(idx, &p[n]);
|
||||
}
|
||||
for (auto n = 0; n < NumVecRegs; n++)
|
||||
tc->getReg(vecRegClass[n], &z[n]);
|
||||
for (auto n = 0; n < NumVecPredRegs; n++)
|
||||
tc->getReg(vecPredRegClass[n], &p[n]);
|
||||
fpcr = tc->readMiscReg(MISCREG_FPCR);
|
||||
fpsr = tc->readMiscReg(MISCREG_FPSR);
|
||||
pcstateckpt = tc->pcState().as<PCState>();
|
||||
@@ -103,18 +99,13 @@ ArmISA::HTMCheckpoint::restore(ThreadContext *tc, HtmFailureFaultCause cause)
|
||||
//tc->setMiscReg(MISCREG_ICC_PMR_EL1, tme_checkpoint->iccPmrEl1);
|
||||
tc->setMiscReg(MISCREG_NZCV, nzcv);
|
||||
tc->setMiscReg(MISCREG_DAIF, daif);
|
||||
for (auto n = 0; n < int_reg::NumArchRegs; n++) {
|
||||
tc->setReg(RegId(IntRegClass, n), x[n]);
|
||||
}
|
||||
for (auto n = 0; n < int_reg::NumArchRegs; n++)
|
||||
tc->setReg(intRegClass[n], x[n]);
|
||||
// TODO first detect if FP is enabled at this EL
|
||||
for (auto n = 0; n < NumVecRegs; n++) {
|
||||
RegId idx = RegId(VecRegClass, n);
|
||||
tc->setReg(idx, &z[n]);
|
||||
}
|
||||
for (auto n = 0; n < NumVecPredRegs; n++) {
|
||||
RegId idx = RegId(VecPredRegClass, n);
|
||||
tc->setReg(idx, &p[n]);
|
||||
}
|
||||
for (auto n = 0; n < NumVecRegs; n++)
|
||||
tc->setReg(vecRegClass[n], &z[n]);
|
||||
for (auto n = 0; n < NumVecPredRegs; n++)
|
||||
tc->setReg(vecPredRegClass[n], &p[n]);
|
||||
tc->setMiscReg(MISCREG_FPCR, fpcr);
|
||||
tc->setMiscReg(MISCREG_FPSR, fpsr);
|
||||
|
||||
@@ -158,7 +149,7 @@ ArmISA::HTMCheckpoint::restore(ThreadContext *tc, HtmFailureFaultCause cause)
|
||||
replaceBits(error_code, 15, 1);
|
||||
if (interrupt)
|
||||
replaceBits(error_code, 23, 1);
|
||||
tc->setReg(RegId(IntRegClass, rt), error_code);
|
||||
tc->setReg(intRegClass[rt], error_code);
|
||||
|
||||
// set next PC
|
||||
pcstateckpt.uReset();
|
||||
|
||||
@@ -123,7 +123,7 @@ Tstart64::Tstart64(ExtMachInst machInst, RegIndex _dest)
|
||||
|
||||
_numSrcRegs = 0;
|
||||
_numDestRegs = 0;
|
||||
setDestRegIdx(_numDestRegs++, RegId(IntRegClass, dest));
|
||||
setDestRegIdx(_numDestRegs++, intRegClass[dest]);
|
||||
_numTypedDestRegs[IntRegClass]++;
|
||||
flags[IsHtmStart] = true;
|
||||
flags[IsInteger] = true;
|
||||
@@ -152,7 +152,7 @@ Ttest64::Ttest64(ExtMachInst machInst, RegIndex _dest)
|
||||
|
||||
_numSrcRegs = 0;
|
||||
_numDestRegs = 0;
|
||||
setDestRegIdx(_numDestRegs++, RegId(IntRegClass, dest));
|
||||
setDestRegIdx(_numDestRegs++, intRegClass[dest]);
|
||||
_numTypedDestRegs[IntRegClass]++;
|
||||
flags[IsInteger] = true;
|
||||
flags[IsMicroop] = true;
|
||||
|
||||
@@ -550,30 +550,23 @@ ISA::takeOverFrom(ThreadContext *new_tc, ThreadContext *old_tc)
|
||||
void
|
||||
ISA::copyRegsFrom(ThreadContext *src)
|
||||
{
|
||||
for (int i = 0; i < int_reg::NumRegs; i++) {
|
||||
RegId reg(IntRegClass, i);
|
||||
tc->setRegFlat(reg, src->getRegFlat(reg));
|
||||
}
|
||||
for (auto &id: intRegClass)
|
||||
tc->setRegFlat(id, src->getRegFlat(id));
|
||||
|
||||
for (int i = 0; i < cc_reg::NumRegs; i++) {
|
||||
RegId reg(CCRegClass, i);
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
for (auto &id: ccRegClass)
|
||||
tc->setReg(id, src->getReg(id));
|
||||
|
||||
for (int i = 0; i < NUM_MISCREGS; i++)
|
||||
tc->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i));
|
||||
|
||||
ArmISA::VecRegContainer vc;
|
||||
for (int i = 0; i < NumVecRegs; i++) {
|
||||
RegId reg(VecRegClass, i);
|
||||
src->getRegFlat(reg, &vc);
|
||||
tc->setRegFlat(reg, &vc);
|
||||
for (auto &id: vecRegClass) {
|
||||
src->getRegFlat(id, &vc);
|
||||
tc->setRegFlat(id, &vc);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NumVecRegs * NumVecElemPerVecReg; i++) {
|
||||
RegId reg(VecElemClass, i);
|
||||
tc->setRegFlat(reg, src->getRegFlat(reg));
|
||||
}
|
||||
for (auto &id: vecElemClass)
|
||||
tc->setRegFlat(id, src->getRegFlat(id));
|
||||
|
||||
// setMiscReg "with effect" will set the misc register mapping correctly.
|
||||
// e.g. updateRegMap(val)
|
||||
|
||||
@@ -650,20 +650,19 @@ namespace ArmISA
|
||||
{
|
||||
switch (regId.classValue()) {
|
||||
case IntRegClass:
|
||||
return RegId(IntRegClass, flattenIntIndex(regId.index()));
|
||||
return intRegClass[flattenIntIndex(regId.index())];
|
||||
case FloatRegClass:
|
||||
return RegId(FloatRegClass, flattenFloatIndex(regId.index()));
|
||||
panic("ARM doesn't use FloatRegClass.");
|
||||
case VecRegClass:
|
||||
return RegId(VecRegClass, flattenVecIndex(regId.index()));
|
||||
return vecRegClass[flattenVecIndex(regId.index())];
|
||||
case VecElemClass:
|
||||
return RegId(VecElemClass, flattenVecElemIndex(regId.index()));
|
||||
return vecElemClass[flattenVecElemIndex(regId.index())];
|
||||
case VecPredRegClass:
|
||||
return RegId(VecPredRegClass,
|
||||
flattenVecPredIndex(regId.index()));
|
||||
return vecPredRegClass[flattenVecPredIndex(regId.index())];
|
||||
case CCRegClass:
|
||||
return RegId(CCRegClass, flattenCCIndex(regId.index()));
|
||||
return ccRegClass[flattenCCIndex(regId.index())];
|
||||
case MiscRegClass:
|
||||
return RegId(MiscRegClass, flattenMiscIndex(regId.index()));
|
||||
return miscRegClass[flattenMiscIndex(regId.index())];
|
||||
case InvalidRegClass:
|
||||
return RegId();
|
||||
}
|
||||
|
||||
@@ -324,7 +324,7 @@ let {{
|
||||
msr_check_code = '''
|
||||
auto pre_flat = (MiscRegIndex)snsBankedIndex64(dest, xc->tcBase());
|
||||
MiscRegIndex flat_idx = (MiscRegIndex) xc->tcBase()->
|
||||
flattenRegId(RegId(MiscRegClass, pre_flat)).index();
|
||||
flattenRegId(miscRegClass[pre_flat]).index();
|
||||
CPSR cpsr = Cpsr;
|
||||
ExceptionLevel el = (ExceptionLevel) (uint8_t) cpsr.el;
|
||||
%s
|
||||
@@ -333,7 +333,7 @@ let {{
|
||||
mrs_check_code = '''
|
||||
auto pre_flat = (MiscRegIndex)snsBankedIndex64(op1, xc->tcBase());
|
||||
MiscRegIndex flat_idx = (MiscRegIndex) xc->tcBase()->
|
||||
flattenRegId(RegId(MiscRegClass, pre_flat)).index();
|
||||
flattenRegId(miscRegClass[pre_flat]).index();
|
||||
CPSR cpsr = Cpsr;
|
||||
ExceptionLevel el = (ExceptionLevel) (uint8_t) cpsr.el;
|
||||
%s
|
||||
@@ -545,7 +545,7 @@ let {{
|
||||
auto pre_flat =
|
||||
(MiscRegIndex)snsBankedIndex64(dest, xc->tcBase());
|
||||
MiscRegIndex misc_index = (MiscRegIndex) xc->tcBase()->
|
||||
flattenRegId(RegId(MiscRegClass, pre_flat)).index();
|
||||
flattenRegId(miscRegClass[pre_flat]).index();
|
||||
|
||||
if (!miscRegInfo[misc_index][MISCREG_IMPLEMENTED]) {
|
||||
return std::make_shared<UndefinedInstruction>(
|
||||
|
||||
@@ -213,7 +213,7 @@ let {{
|
||||
if (!isSecure(xc->tcBase()) && (cpsr.mode != MODE_HYP)) {
|
||||
HCR hcr = Hcr;
|
||||
bool hypTrap = false;
|
||||
switch(xc->tcBase()->flattenRegId(RegId(MiscRegClass, op1)).index()) {
|
||||
switch (xc->tcBase()->flattenRegId(miscRegClass[op1]).index()) {
|
||||
case MISCREG_FPSID:
|
||||
hypTrap = hcr.tid0;
|
||||
break;
|
||||
|
||||
@@ -890,7 +890,7 @@ let {{
|
||||
|
||||
mrc14code = '''
|
||||
MiscRegIndex miscReg = (MiscRegIndex) xc->tcBase()->flattenRegId(
|
||||
RegId(MiscRegClass, op1)).index();
|
||||
miscRegClass[op1]).index();
|
||||
auto [can_read, undefined] = canReadCoprocReg(miscReg, Scr, Cpsr,
|
||||
xc->tcBase());
|
||||
if (!can_read || undefined) {
|
||||
@@ -914,7 +914,7 @@ let {{
|
||||
|
||||
mcr14code = '''
|
||||
MiscRegIndex miscReg = (MiscRegIndex) xc->tcBase()->flattenRegId(
|
||||
RegId(MiscRegClass, dest)).index();
|
||||
miscRegClass[dest]).index();
|
||||
auto [can_write, undefined] = canWriteCoprocReg(miscReg, Scr, Cpsr,
|
||||
xc->tcBase());
|
||||
if (undefined || !can_write) {
|
||||
@@ -938,8 +938,8 @@ let {{
|
||||
mrc15code = '''
|
||||
int preFlatOp1 = snsBankedIndex(op1, xc->tcBase());
|
||||
MiscRegIndex miscReg = (MiscRegIndex)
|
||||
xc->tcBase()->flattenRegId(RegId(MiscRegClass,
|
||||
preFlatOp1)).index();
|
||||
xc->tcBase()->flattenRegId(miscRegClass[
|
||||
preFlatOp1]).index();
|
||||
|
||||
Fault fault = mcrMrc15Trap(miscReg, machInst, xc->tcBase(), imm);
|
||||
|
||||
@@ -970,8 +970,8 @@ let {{
|
||||
mcr15CheckCode = '''
|
||||
int preFlatDest = snsBankedIndex(dest, xc->tcBase());
|
||||
MiscRegIndex miscReg = (MiscRegIndex)
|
||||
xc->tcBase()->flattenRegId(RegId(MiscRegClass,
|
||||
preFlatDest)).index();
|
||||
xc->tcBase()->flattenRegId(miscRegClass[
|
||||
preFlatDest]).index();
|
||||
|
||||
Fault fault = mcrMrc15Trap(miscReg, machInst, xc->tcBase(), imm);
|
||||
|
||||
@@ -1016,8 +1016,8 @@ let {{
|
||||
mrrc15code = '''
|
||||
int preFlatOp1 = snsBankedIndex(op1, xc->tcBase());
|
||||
MiscRegIndex miscReg = (MiscRegIndex)
|
||||
xc->tcBase()->flattenRegId(RegId(MiscRegClass,
|
||||
preFlatOp1)).index();
|
||||
xc->tcBase()->flattenRegId(miscRegClass[
|
||||
preFlatOp1]).index();
|
||||
|
||||
Fault fault = mcrrMrrc15Trap(miscReg, machInst, xc->tcBase(), imm);
|
||||
|
||||
@@ -1048,8 +1048,8 @@ let {{
|
||||
mcrr15code = '''
|
||||
int preFlatDest = snsBankedIndex(dest, xc->tcBase());
|
||||
MiscRegIndex miscReg = (MiscRegIndex)
|
||||
xc->tcBase()->flattenRegId(RegId(MiscRegClass,
|
||||
preFlatDest)).index();
|
||||
xc->tcBase()->flattenRegId(miscRegClass[
|
||||
preFlatDest]).index();
|
||||
|
||||
Fault fault = mcrrMrrc15Trap(miscReg, machInst, xc->tcBase(), imm);
|
||||
|
||||
|
||||
@@ -923,7 +923,7 @@ def template AmoArithmeticOpConstructor {{
|
||||
%(set_reg_idx_arr)s;
|
||||
%(constructor)s;
|
||||
isXZR = false;
|
||||
uint32_t r2 = RegId(IntRegClass, dest).index() ;
|
||||
uint32_t r2 = dest;
|
||||
flags[IsStore] = false;
|
||||
flags[IsLoad] = false;
|
||||
if (r2 == 31) {
|
||||
|
||||
@@ -664,7 +664,7 @@ ArmKvmCPU::updateKvmStateCore()
|
||||
for (const KvmIntRegInfo *ri(kvmIntRegs);
|
||||
ri->idx != init_reg::NumRegs; ++ri) {
|
||||
|
||||
uint64_t value = tc->getRegFlat(RegId(IntRegClass, ri->idx));
|
||||
uint64_t value = tc->getRegFlat(intRegClass[ri->idx]);
|
||||
DPRINTF(KvmContext, "kvm(%s) := 0x%x\n", ri->name, value);
|
||||
setOneReg(ri->id, value);
|
||||
}
|
||||
@@ -772,9 +772,8 @@ ArmKvmCPU::updateKvmStateVFP(uint64_t id, bool show_warnings)
|
||||
const unsigned idx_base = idx << 1;
|
||||
const unsigned idx_hi = idx_base + 1;
|
||||
const unsigned idx_lo = idx_base + 0;
|
||||
uint64_t value =
|
||||
((uint64_t)tc->getRegFlat(RegId(FloatRegClass, idx_hi)) << 32) |
|
||||
tc->getRegFlat(RegId(FloatRegClass, idx_lo));
|
||||
uint64_t value = (tc->getRegFlat(floatRegClass[idx_hi]) << 32) |
|
||||
tc->getRegFlat(floatRegClass[idx_lo]);
|
||||
|
||||
setOneReg(id, value);
|
||||
} else if (regIsVfpCtrl(id)) {
|
||||
@@ -804,7 +803,7 @@ ArmKvmCPU::updateTCStateCore()
|
||||
for (const KvmIntRegInfo *ri(kvmIntRegs);
|
||||
ri->idx != int_reg::NumRegs; ++ri) {
|
||||
|
||||
tc->setRegFlat(RegId(IntRegClass, ri->idx), getOneRegU32(ri->id));
|
||||
tc->setRegFlat(intRegClass[ri->idx], getOneRegU32(ri->id));
|
||||
}
|
||||
|
||||
for (const KvmCoreMiscRegInfo *ri(kvmCoreMiscRegs);
|
||||
@@ -915,9 +914,8 @@ ArmKvmCPU::updateTCStateVFP(uint64_t id, bool show_warnings)
|
||||
const unsigned idx_lo = idx_base + 0;
|
||||
uint64_t value = getOneRegU64(id);
|
||||
|
||||
tc->setRegFlat(RegId(FloatRegClass, idx_hi),
|
||||
(value >> 32) & 0xFFFFFFFF);
|
||||
tc->setRegFlat(RegId(FloatRegClass, idx_lo), value & 0xFFFFFFFF);
|
||||
tc->setRegFlat(floatRegClass[idx_hi], (value >> 32) & 0xFFFFFFFF);
|
||||
tc->setRegFlat(floatRegClass[idx_lo], value & 0xFFFFFFFF);
|
||||
} else if (regIsVfpCtrl(id)) {
|
||||
MiscRegIndex idx = decodeVFPCtrlReg(id);
|
||||
if (idx == NUM_MISCREGS) {
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
|
||||
#include <linux/kvm.h>
|
||||
|
||||
#include "arch/arm/regs/int.hh"
|
||||
#include "arch/arm/regs/vec.hh"
|
||||
#include "debug/KvmContext.hh"
|
||||
#include "params/ArmV8KvmCPU.hh"
|
||||
|
||||
@@ -249,7 +251,7 @@ ArmV8KvmCPU::updateKvmState()
|
||||
}
|
||||
|
||||
for (const auto &ri : intRegMap) {
|
||||
const uint64_t value = tc->getReg(RegId(IntRegClass, ri.idx));
|
||||
const uint64_t value = tc->getReg(intRegClass[ri.idx]);
|
||||
DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
|
||||
setOneReg(ri.kvm, value);
|
||||
}
|
||||
@@ -259,7 +261,7 @@ ArmV8KvmCPU::updateKvmState()
|
||||
if (!inAArch64(tc))
|
||||
syncVecElemsToRegs(tc);
|
||||
ArmISA::VecRegContainer vc;
|
||||
tc->getReg(RegId(VecRegClass, i), &vc);
|
||||
tc->getReg(vecRegClass[i], &vc);
|
||||
auto v = vc.as<VecElem>();
|
||||
for (int j = 0; j < FP_REGS_PER_VFP_REG; j++)
|
||||
reg.s[j].i = v[j];
|
||||
@@ -327,14 +329,14 @@ ArmV8KvmCPU::updateThreadContext()
|
||||
for (const auto &ri : intRegMap) {
|
||||
const auto value(getOneRegU64(ri.kvm));
|
||||
DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
|
||||
tc->setReg(RegId(IntRegClass, ri.idx), value);
|
||||
tc->setReg(intRegClass[ri.idx], value);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_QREGS; ++i) {
|
||||
KvmFPReg reg;
|
||||
DPRINTF(KvmContext, " Q%i: %s\n", i, getAndFormatOneReg(kvmFPReg(i)));
|
||||
getOneReg(kvmFPReg(i), reg.data);
|
||||
auto v = tc->getWritableVecReg(RegId(VecRegClass, i)).as<VecElem>();
|
||||
auto v = tc->getWritableVecReg(vecRegClass[i]).as<VecElem>();
|
||||
for (int j = 0; j < FP_REGS_PER_VFP_REG; j++)
|
||||
v[j] = reg.s[j].i;
|
||||
if (!inAArch64(tc))
|
||||
|
||||
@@ -41,7 +41,9 @@
|
||||
#include "arch/arm/nativetrace.hh"
|
||||
|
||||
#include "arch/arm/regs/cc.hh"
|
||||
#include "arch/arm/regs/int.hh"
|
||||
#include "arch/arm/regs/misc.hh"
|
||||
#include "arch/arm/regs/vec.hh"
|
||||
#include "base/compiler.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "debug/ExecRegDelta.hh"
|
||||
@@ -109,7 +111,7 @@ Trace::ArmNativeTrace::ThreadState::update(ThreadContext *tc)
|
||||
|
||||
// Regular int regs
|
||||
for (int i = 0; i < 15; i++) {
|
||||
newState[i] = tc->getReg(RegId(IntRegClass, i));
|
||||
newState[i] = tc->getReg(intRegClass[i]);
|
||||
changed[i] = (oldState[i] != newState[i]);
|
||||
}
|
||||
|
||||
@@ -129,7 +131,7 @@ Trace::ArmNativeTrace::ThreadState::update(ThreadContext *tc)
|
||||
|
||||
for (int i = 0; i < NumVecV7ArchRegs; i++) {
|
||||
ArmISA::VecRegContainer vec_container;
|
||||
tc->getReg(RegId(VecRegClass, i), &vec_container);
|
||||
tc->getReg(vecRegClass[i], &vec_container);
|
||||
auto *vec = vec_container.as<uint64_t>();
|
||||
newState[STATE_F0 + 2*i] = vec[0];
|
||||
newState[STATE_F0 + 2*i + 1] = vec[1];
|
||||
|
||||
@@ -61,13 +61,21 @@ enum : RegIndex
|
||||
NumRegs
|
||||
};
|
||||
|
||||
} // namespace cc_reg
|
||||
|
||||
inline constexpr RegClass ccRegClass(CCRegClass, cc_reg::NumRegs,
|
||||
debug::CCRegs);
|
||||
|
||||
namespace cc_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
Nz(CCRegClass, _NzIdx),
|
||||
C(CCRegClass, _CIdx),
|
||||
V(CCRegClass, _VIdx),
|
||||
Ge(CCRegClass, _GeIdx),
|
||||
Fp(CCRegClass, _FpIdx),
|
||||
Zero(CCRegClass, _ZeroIdx);
|
||||
Nz = ccRegClass[_NzIdx],
|
||||
C = ccRegClass[_CIdx],
|
||||
V = ccRegClass[_VIdx],
|
||||
Ge = ccRegClass[_GeIdx],
|
||||
Fp = ccRegClass[_FpIdx],
|
||||
Zero = ccRegClass[_ZeroIdx];
|
||||
|
||||
const char * const RegName[NumRegs] = {
|
||||
"nz",
|
||||
@@ -80,9 +88,6 @@ const char * const RegName[NumRegs] = {
|
||||
|
||||
} // namespace cc_reg
|
||||
|
||||
inline constexpr RegClass ccRegClass(CCRegClass, cc_reg::NumRegs,
|
||||
debug::CCRegs);
|
||||
|
||||
enum ConditionCode
|
||||
{
|
||||
COND_EQ = 0,
|
||||
|
||||
@@ -161,94 +161,102 @@ enum : RegIndex
|
||||
_X31Idx
|
||||
};
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
namespace int_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
/* All the unique register indices. */
|
||||
R0(IntRegClass, _R0Idx),
|
||||
R1(IntRegClass, _R1Idx),
|
||||
R2(IntRegClass, _R2Idx),
|
||||
R3(IntRegClass, _R3Idx),
|
||||
R4(IntRegClass, _R4Idx),
|
||||
R5(IntRegClass, _R5Idx),
|
||||
R6(IntRegClass, _R6Idx),
|
||||
R7(IntRegClass, _R7Idx),
|
||||
R8(IntRegClass, _R8Idx),
|
||||
R9(IntRegClass, _R9Idx),
|
||||
R10(IntRegClass, _R10Idx),
|
||||
R11(IntRegClass, _R11Idx),
|
||||
R12(IntRegClass, _R12Idx),
|
||||
R13(IntRegClass, _R13Idx),
|
||||
R14(IntRegClass, _R14Idx),
|
||||
R15(IntRegClass, _R15Idx),
|
||||
R0 = intRegClass[_R0Idx],
|
||||
R1 = intRegClass[_R1Idx],
|
||||
R2 = intRegClass[_R2Idx],
|
||||
R3 = intRegClass[_R3Idx],
|
||||
R4 = intRegClass[_R4Idx],
|
||||
R5 = intRegClass[_R5Idx],
|
||||
R6 = intRegClass[_R6Idx],
|
||||
R7 = intRegClass[_R7Idx],
|
||||
R8 = intRegClass[_R8Idx],
|
||||
R9 = intRegClass[_R9Idx],
|
||||
R10 = intRegClass[_R10Idx],
|
||||
R11 = intRegClass[_R11Idx],
|
||||
R12 = intRegClass[_R12Idx],
|
||||
R13 = intRegClass[_R13Idx],
|
||||
R14 = intRegClass[_R14Idx],
|
||||
R15 = intRegClass[_R15Idx],
|
||||
|
||||
R13Svc(IntRegClass, _R13SvcIdx),
|
||||
R14Svc(IntRegClass, _R14SvcIdx),
|
||||
R13Svc = intRegClass[_R13SvcIdx],
|
||||
R14Svc = intRegClass[_R14SvcIdx],
|
||||
|
||||
R13Mon(IntRegClass, _R13MonIdx),
|
||||
R14Mon(IntRegClass, _R14MonIdx),
|
||||
R13Mon = intRegClass[_R13MonIdx],
|
||||
R14Mon = intRegClass[_R14MonIdx],
|
||||
|
||||
R13Hyp(IntRegClass, _R13HypIdx),
|
||||
R13Hyp = intRegClass[_R13HypIdx],
|
||||
|
||||
R13Abt(IntRegClass, _R13AbtIdx),
|
||||
R14Abt(IntRegClass, _R14AbtIdx),
|
||||
R13Abt = intRegClass[_R13AbtIdx],
|
||||
R14Abt = intRegClass[_R14AbtIdx],
|
||||
|
||||
R13Und(IntRegClass, _R13UndIdx),
|
||||
R14Und(IntRegClass, _R14UndIdx),
|
||||
R13Und = intRegClass[_R13UndIdx],
|
||||
R14Und = intRegClass[_R14UndIdx],
|
||||
|
||||
R13Irq(IntRegClass, _R13IrqIdx),
|
||||
R14Irq(IntRegClass, _R14IrqIdx),
|
||||
R13Irq = intRegClass[_R13IrqIdx],
|
||||
R14Irq = intRegClass[_R14IrqIdx],
|
||||
|
||||
R8Fiq(IntRegClass, _R8FiqIdx),
|
||||
R9Fiq(IntRegClass, _R9FiqIdx),
|
||||
R10Fiq(IntRegClass, _R10FiqIdx),
|
||||
R11Fiq(IntRegClass, _R11FiqIdx),
|
||||
R12Fiq(IntRegClass, _R12FiqIdx),
|
||||
R13Fiq(IntRegClass, _R13FiqIdx),
|
||||
R14Fiq(IntRegClass, _R14FiqIdx),
|
||||
R8Fiq = intRegClass[_R8FiqIdx],
|
||||
R9Fiq = intRegClass[_R9FiqIdx],
|
||||
R10Fiq = intRegClass[_R10FiqIdx],
|
||||
R11Fiq = intRegClass[_R11FiqIdx],
|
||||
R12Fiq = intRegClass[_R12FiqIdx],
|
||||
R13Fiq = intRegClass[_R13FiqIdx],
|
||||
R14Fiq = intRegClass[_R14FiqIdx],
|
||||
|
||||
Zero(IntRegClass, _ZeroIdx),
|
||||
Ureg0(IntRegClass, _Ureg0Idx),
|
||||
Ureg1(IntRegClass, _Ureg1Idx),
|
||||
Ureg2(IntRegClass, _Ureg2Idx),
|
||||
Zero = intRegClass[_ZeroIdx],
|
||||
Ureg0 = intRegClass[_Ureg0Idx],
|
||||
Ureg1 = intRegClass[_Ureg1Idx],
|
||||
Ureg2 = intRegClass[_Ureg2Idx],
|
||||
|
||||
Sp0(IntRegClass, _Sp0Idx),
|
||||
Sp1(IntRegClass, _Sp1Idx),
|
||||
Sp2(IntRegClass, _Sp2Idx),
|
||||
Sp3(IntRegClass, _Sp3Idx),
|
||||
Sp0 = intRegClass[_Sp0Idx],
|
||||
Sp1 = intRegClass[_Sp1Idx],
|
||||
Sp2 = intRegClass[_Sp2Idx],
|
||||
Sp3 = intRegClass[_Sp3Idx],
|
||||
|
||||
Spx(IntRegClass, _SpxIdx),
|
||||
Spx = intRegClass[_SpxIdx],
|
||||
|
||||
X0(IntRegClass, _X0Idx),
|
||||
X1(IntRegClass, _X1Idx),
|
||||
X2(IntRegClass, _X2Idx),
|
||||
X3(IntRegClass, _X3Idx),
|
||||
X4(IntRegClass, _X4Idx),
|
||||
X5(IntRegClass, _X5Idx),
|
||||
X6(IntRegClass, _X6Idx),
|
||||
X7(IntRegClass, _X7Idx),
|
||||
X8(IntRegClass, _X8Idx),
|
||||
X9(IntRegClass, _X9Idx),
|
||||
X10(IntRegClass, _X10Idx),
|
||||
X11(IntRegClass, _X11Idx),
|
||||
X12(IntRegClass, _X12Idx),
|
||||
X13(IntRegClass, _X13Idx),
|
||||
X14(IntRegClass, _X14Idx),
|
||||
X15(IntRegClass, _X15Idx),
|
||||
X16(IntRegClass, _X16Idx),
|
||||
X17(IntRegClass, _X17Idx),
|
||||
X18(IntRegClass, _X18Idx),
|
||||
X19(IntRegClass, _X19Idx),
|
||||
X20(IntRegClass, _X20Idx),
|
||||
X21(IntRegClass, _X21Idx),
|
||||
X22(IntRegClass, _X22Idx),
|
||||
X23(IntRegClass, _X23Idx),
|
||||
X24(IntRegClass, _X24Idx),
|
||||
X25(IntRegClass, _X25Idx),
|
||||
X26(IntRegClass, _X26Idx),
|
||||
X27(IntRegClass, _X27Idx),
|
||||
X28(IntRegClass, _X28Idx),
|
||||
X29(IntRegClass, _X29Idx),
|
||||
X30(IntRegClass, _X30Idx),
|
||||
X31(IntRegClass, _X31Idx);
|
||||
X0 = intRegClass[_X0Idx],
|
||||
X1 = intRegClass[_X1Idx],
|
||||
X2 = intRegClass[_X2Idx],
|
||||
X3 = intRegClass[_X3Idx],
|
||||
X4 = intRegClass[_X4Idx],
|
||||
X5 = intRegClass[_X5Idx],
|
||||
X6 = intRegClass[_X6Idx],
|
||||
X7 = intRegClass[_X7Idx],
|
||||
X8 = intRegClass[_X8Idx],
|
||||
X9 = intRegClass[_X9Idx],
|
||||
X10 = intRegClass[_X10Idx],
|
||||
X11 = intRegClass[_X11Idx],
|
||||
X12 = intRegClass[_X12Idx],
|
||||
X13 = intRegClass[_X13Idx],
|
||||
X14 = intRegClass[_X14Idx],
|
||||
X15 = intRegClass[_X15Idx],
|
||||
X16 = intRegClass[_X16Idx],
|
||||
X17 = intRegClass[_X17Idx],
|
||||
X18 = intRegClass[_X18Idx],
|
||||
X19 = intRegClass[_X19Idx],
|
||||
X20 = intRegClass[_X20Idx],
|
||||
X21 = intRegClass[_X21Idx],
|
||||
X22 = intRegClass[_X22Idx],
|
||||
X23 = intRegClass[_X23Idx],
|
||||
X24 = intRegClass[_X24Idx],
|
||||
X25 = intRegClass[_X25Idx],
|
||||
X26 = intRegClass[_X26Idx],
|
||||
X27 = intRegClass[_X27Idx],
|
||||
X28 = intRegClass[_X28Idx],
|
||||
X29 = intRegClass[_X29Idx],
|
||||
X30 = intRegClass[_X30Idx],
|
||||
X31 = intRegClass[_X31Idx];
|
||||
|
||||
inline constexpr auto
|
||||
&Sp = R13,
|
||||
@@ -425,7 +433,7 @@ static inline RegId
|
||||
x(unsigned index)
|
||||
{
|
||||
assert(index < NumArchRegs);
|
||||
return RegId(IntRegClass, _X0Idx + index);
|
||||
return intRegClass[_X0Idx + index];
|
||||
}
|
||||
|
||||
const RegMap RegUsrMap = {
|
||||
@@ -551,9 +559,6 @@ regInMode(OperatingMode mode, int reg)
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
static inline int
|
||||
flattenIntRegModeIndex(int reg)
|
||||
{
|
||||
|
||||
@@ -243,7 +243,7 @@ RemoteGDB::AArch64GdbRegCache::getRegs(ThreadContext *context)
|
||||
size_t base = 0;
|
||||
for (int i = 0; i < NumVecV8ArchRegs; i++) {
|
||||
ArmISA::VecRegContainer vc;
|
||||
context->getReg(RegId(VecRegClass, i), &vc);
|
||||
context->getReg(vecRegClass[i], &vc);
|
||||
auto v = vc.as<VecElem>();
|
||||
for (size_t j = 0; j < NumVecElemPerNeonVecReg; j++) {
|
||||
r.v[base] = v[j];
|
||||
@@ -273,7 +273,7 @@ RemoteGDB::AArch64GdbRegCache::setRegs(ThreadContext *context) const
|
||||
size_t base = 0;
|
||||
for (int i = 0; i < NumVecV8ArchRegs; i++) {
|
||||
auto *vc = static_cast<ArmISA::VecRegContainer *>(
|
||||
context->getWritableReg(RegId(VecRegClass, i)));
|
||||
context->getWritableReg(vecRegClass[i]));
|
||||
auto v = vc->as<VecElem>();
|
||||
for (size_t j = 0; j < NumVecElemPerNeonVecReg; j++) {
|
||||
v[j] = r.v[base];
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
|
||||
#include "arch/arm/insts/static_inst.hh"
|
||||
#include "arch/arm/mmu.hh"
|
||||
#include "arch/arm/regs/int.hh"
|
||||
#include "arch/arm/regs/vec.hh"
|
||||
#include "cpu/static_inst.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "mem/packet.hh"
|
||||
@@ -755,31 +757,28 @@ TarmacParserRecord::TarmacParserRecordEvent::process()
|
||||
switch (it->type) {
|
||||
case REG_R:
|
||||
case REG_X:
|
||||
values.push_back(thread->getReg(RegId(IntRegClass, it->index)));
|
||||
values.push_back(thread->getReg(intRegClass[it->index]));
|
||||
break;
|
||||
case REG_S:
|
||||
if (instRecord.isetstate == ISET_A64) {
|
||||
ArmISA::VecRegContainer vc;
|
||||
thread->getReg(RegId(VecRegClass, it->index), &vc);
|
||||
thread->getReg(vecRegClass[it->index], &vc);
|
||||
auto vv = vc.as<uint32_t>();
|
||||
values.push_back(vv[0]);
|
||||
} else {
|
||||
const VecElem elem = thread->getReg(
|
||||
RegId(VecElemClass, it->index));
|
||||
const VecElem elem = thread->getReg(vecElemClass[it->index]);
|
||||
values.push_back(elem);
|
||||
}
|
||||
break;
|
||||
case REG_D:
|
||||
if (instRecord.isetstate == ISET_A64) {
|
||||
ArmISA::VecRegContainer vc;
|
||||
thread->getReg(RegId(VecRegClass, it->index), &vc);
|
||||
thread->getReg(vecRegClass[it->index], &vc);
|
||||
auto vv = vc.as<uint64_t>();
|
||||
values.push_back(vv[0]);
|
||||
} else {
|
||||
const VecElem w0 = thread->getReg(
|
||||
RegId(VecElemClass, it->index));
|
||||
const VecElem w1 = thread->getReg(
|
||||
RegId(VecElemClass, it->index + 1));
|
||||
const VecElem w0 = thread->getReg(vecElemClass[it->index]);
|
||||
const VecElem w1 = thread->getReg(vecElemClass[it->index + 1]);
|
||||
|
||||
values.push_back((uint64_t)(w1) << 32 | w0);
|
||||
}
|
||||
@@ -787,7 +786,7 @@ TarmacParserRecord::TarmacParserRecordEvent::process()
|
||||
case REG_P:
|
||||
{
|
||||
ArmISA::VecPredRegContainer pc;
|
||||
thread->getReg(RegId(VecPredRegClass, it->index), &pc);
|
||||
thread->getReg(vecPredRegClass[it->index], &pc);
|
||||
auto pv = pc.as<uint8_t>();
|
||||
uint64_t p = 0;
|
||||
for (int i = maxVectorLength * 8; i > 0; ) {
|
||||
@@ -799,19 +798,15 @@ TarmacParserRecord::TarmacParserRecordEvent::process()
|
||||
case REG_Q:
|
||||
if (instRecord.isetstate == ISET_A64) {
|
||||
ArmISA::VecRegContainer vc;
|
||||
thread->getReg(RegId(VecRegClass, it->index), &vc);
|
||||
thread->getReg(vecRegClass[it->index], &vc);
|
||||
auto vv = vc.as<uint64_t>();
|
||||
values.push_back(vv[0]);
|
||||
values.push_back(vv[1]);
|
||||
} else {
|
||||
const VecElem w0 = thread->getReg(
|
||||
RegId(VecElemClass, it->index));
|
||||
const VecElem w1 = thread->getReg(
|
||||
RegId(VecElemClass, it->index + 1));
|
||||
const VecElem w2 = thread->getReg(
|
||||
RegId(VecElemClass, it->index + 2));
|
||||
const VecElem w3 = thread->getReg(
|
||||
RegId(VecElemClass, it->index + 3));
|
||||
const VecElem w0 = thread->getReg(vecElemClass[it->index]);
|
||||
const VecElem w1 = thread->getReg(vecElemClass[it->index + 1]);
|
||||
const VecElem w2 = thread->getReg(vecElemClass[it->index + 2]);
|
||||
const VecElem w3 = thread->getReg(vecElemClass[it->index + 3]);
|
||||
|
||||
values.push_back((uint64_t)(w1) << 32 | w0);
|
||||
values.push_back((uint64_t)(w3) << 32 | w2);
|
||||
@@ -821,7 +816,7 @@ TarmacParserRecord::TarmacParserRecordEvent::process()
|
||||
{
|
||||
int8_t i = maxVectorLength;
|
||||
ArmISA::VecRegContainer vc;
|
||||
thread->getReg(RegId(VecRegClass, it->index), &vc);
|
||||
thread->getReg(vecRegClass[it->index], &vc);
|
||||
auto vv = vc.as<uint64_t>();
|
||||
while (i > 0) {
|
||||
values.push_back(vv[--i]);
|
||||
|
||||
@@ -233,7 +233,7 @@ TarmacTracerRecord::TraceRegEntry::updateCC(
|
||||
|
||||
regValid = true;
|
||||
regName = cc_reg::RegName[regRelIdx];
|
||||
values[Lo] = thread->getReg(RegId(CCRegClass, regRelIdx));
|
||||
values[Lo] = thread->getReg(ccRegClass[regRelIdx]);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -242,12 +242,9 @@ TarmacTracerRecord::TraceRegEntry::updateFloat(
|
||||
RegIndex regRelIdx
|
||||
)
|
||||
{
|
||||
auto thread = tarmCtx.thread;
|
||||
|
||||
regValid = true;
|
||||
regName = "f" + std::to_string(regRelIdx);
|
||||
RegId reg(FloatRegClass, regRelIdx);
|
||||
values[Lo] = bitsToFloat32(thread->getReg(reg));
|
||||
panic("ARM doesn't support float registers.");
|
||||
}
|
||||
|
||||
void
|
||||
@@ -287,7 +284,7 @@ TarmacTracerRecord::TraceRegEntry::updateInt(
|
||||
regName = "r" + std::to_string(regRelIdx);
|
||||
break;
|
||||
}
|
||||
values[Lo] = thread->getReg(RegId(IntRegClass, regRelIdx));
|
||||
values[Lo] = thread->getReg(intRegClass[regRelIdx]);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -249,7 +249,7 @@ class TarmacTracerRecord : public TarmacBaseRecord
|
||||
|
||||
// If CPSR entry not present, generate one
|
||||
if (cpsr_it == queue.end()) {
|
||||
RegId reg(MiscRegClass, ArmISA::MISCREG_CPSR);
|
||||
RegId reg = ArmISA::miscRegClass[ArmISA::MISCREG_CPSR];
|
||||
queue.push_back(
|
||||
std::make_unique<RegEntry>(
|
||||
genRegister<RegEntry>(tarmCtx, reg))
|
||||
|
||||
@@ -1340,13 +1340,10 @@ syncVecRegsToElems(ThreadContext *tc)
|
||||
{
|
||||
int ei = 0;
|
||||
for (int ri = 0; ri < NumVecRegs; ri++) {
|
||||
RegId reg_id(VecRegClass, ri);
|
||||
VecRegContainer reg;
|
||||
tc->getReg(reg_id, ®);
|
||||
for (int j = 0; j < NumVecElemPerVecReg; j++, ei++) {
|
||||
RegId elem_id(VecElemClass, ei);
|
||||
tc->setReg(elem_id, reg.as<VecElem>()[j]);
|
||||
}
|
||||
tc->getReg(vecRegClass[ri], ®);
|
||||
for (int j = 0; j < NumVecElemPerVecReg; j++, ei++)
|
||||
tc->setReg(vecElemClass[ei], reg.as<VecElem>()[j]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1360,8 +1357,7 @@ syncVecElemsToRegs(ThreadContext *tc)
|
||||
RegId elem_id(VecElemClass, ei);
|
||||
reg.as<VecElem>()[j] = tc->getReg(elem_id);
|
||||
}
|
||||
RegId reg_id(VecRegClass, ri);
|
||||
tc->setReg(reg_id, ®);
|
||||
tc->setReg(vecRegClass[ri], ®);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -182,16 +182,12 @@ void
|
||||
ISA::copyRegsFrom(ThreadContext *src)
|
||||
{
|
||||
// First loop through the integer registers.
|
||||
for (int i = 0; i < int_reg::NumRegs; i++) {
|
||||
RegId reg(IntRegClass, i);
|
||||
tc->setRegFlat(reg, src->getRegFlat(reg));
|
||||
}
|
||||
for (auto &id: intRegClass)
|
||||
tc->setRegFlat(id, src->getRegFlat(id));
|
||||
|
||||
// Then loop through the floating point registers.
|
||||
for (int i = 0; i < float_reg::NumRegs; i++) {
|
||||
RegId reg(FloatRegClass, i);
|
||||
tc->setRegFlat(reg, src->getRegFlat(reg));
|
||||
}
|
||||
for (auto &id: floatRegClass)
|
||||
tc->setRegFlat(id, src->getRegFlat(id));
|
||||
|
||||
// Copy misc. registers
|
||||
for (int i = 0; i < misc_reg::NumRegs; i++)
|
||||
|
||||
@@ -382,13 +382,12 @@ decode OPCODE_HI default Unknown::unknown() {
|
||||
// Decode MIPS MT MFTR instruction into sub-instructions
|
||||
0x8: decode MT_U {
|
||||
0x0: mftc0({{
|
||||
data = readRegOtherThread(xc, RegId(MiscRegClass,
|
||||
(RT << 3 | SEL)));
|
||||
data = readRegOtherThread(xc,
|
||||
miscRegClass[RT << 3 | SEL]);
|
||||
}});
|
||||
0x1: decode SEL {
|
||||
0x0: mftgpr({{
|
||||
data = readRegOtherThread(xc,
|
||||
RegId(IntRegClass, RT));
|
||||
data = readRegOtherThread(xc, intRegClass[RT]);
|
||||
}});
|
||||
0x1: decode RT {
|
||||
0x0: mftlo_dsp0({{
|
||||
@@ -448,11 +447,11 @@ decode OPCODE_HI default Unknown::unknown() {
|
||||
0x2: decode MT_H {
|
||||
0x0: mftc1({{
|
||||
data = readRegOtherThread(xc,
|
||||
RegId(FloatRegClass, RT));
|
||||
floatRegClass[RT]);
|
||||
}});
|
||||
0x1: mfthc1({{
|
||||
data = readRegOtherThread(xc,
|
||||
RegId(FloatRegClass, RT));
|
||||
floatRegClass[RT]);
|
||||
}});
|
||||
}
|
||||
0x3: cftc1({{
|
||||
@@ -491,11 +490,11 @@ decode OPCODE_HI default Unknown::unknown() {
|
||||
// Decode MIPS MT MTTR instruction into sub-instructions
|
||||
0xC: decode MT_U {
|
||||
0x0: mttc0({{ setRegOtherThread(xc,
|
||||
RegId(MiscRegClass, (RD << 3 | SEL)), Rt);
|
||||
miscRegClass[RD << 3 | SEL], Rt);
|
||||
}});
|
||||
0x1: decode SEL {
|
||||
0x0: mttgpr({{ setRegOtherThread(xc,
|
||||
RegId(IntRegClass, RD), Rt);
|
||||
intRegClass[RD], Rt);
|
||||
}});
|
||||
0x1: decode RT {
|
||||
0x0: mttlo_dsp0({{ setRegOtherThread(xc,
|
||||
@@ -542,11 +541,10 @@ decode OPCODE_HI default Unknown::unknown() {
|
||||
}
|
||||
0x2: mttc1({{
|
||||
uint64_t data = readRegOtherThread(xc,
|
||||
RegId(FloatRegClass, RD));
|
||||
floatRegClass[RD]);
|
||||
data = insertBits(data, MT_H ? 63 : 31,
|
||||
MT_H ? 32 : 0, Rt);
|
||||
setRegOtherThread(xc, RegId(FloatRegClass, RD),
|
||||
data);
|
||||
setRegOtherThread(xc, floatRegClass[RD], data);
|
||||
}});
|
||||
0x3: cttc1({{
|
||||
uint32_t data;
|
||||
|
||||
@@ -93,8 +93,7 @@ output exec {{
|
||||
MVPConf0Reg &mvp_conf0)
|
||||
{
|
||||
vpe_conf0 = xc->readMiscReg(misc_reg::VpeConf0);
|
||||
tc_bind_mt = readRegOtherThread(xc, RegId(MiscRegClass,
|
||||
misc_reg::TcBind));
|
||||
tc_bind_mt = readRegOtherThread(xc, miscRegClass[misc_reg::TcBind]);
|
||||
tc_bind = xc->readMiscReg(misc_reg::TcBind);
|
||||
vpe_control = xc->readMiscReg(misc_reg::VpeControl);
|
||||
mvp_conf0 = xc->readMiscReg(misc_reg::MvpConf0);
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "arch/mips/mt_constants.hh"
|
||||
#include "arch/mips/pcstate.hh"
|
||||
#include "arch/mips/pra_constants.hh"
|
||||
#include "arch/mips/regs/int.hh"
|
||||
#include "arch/mips/regs/misc.hh"
|
||||
#include "base/bitfield.hh"
|
||||
#include "base/logging.hh"
|
||||
@@ -173,25 +174,23 @@ forkThread(TC *tc, Fault &fault, int Rd_bits, int Rs, int Rt)
|
||||
int success = 0;
|
||||
for (ThreadID tid = 0; tid < num_threads && success == 0; tid++) {
|
||||
TCBindReg tidTCBind =
|
||||
readRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcBind), tid);
|
||||
readRegOtherThread(tc, miscRegClass[misc_reg::TcBind], tid);
|
||||
TCBindReg tcBind = tc->readMiscRegNoEffect(misc_reg::TcBind);
|
||||
|
||||
if (tidTCBind.curVPE == tcBind.curVPE) {
|
||||
|
||||
TCStatusReg tidTCStatus =
|
||||
readRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcStatus),
|
||||
tid);
|
||||
readRegOtherThread(tc, miscRegClass[misc_reg::TcStatus], tid);
|
||||
|
||||
TCHaltReg tidTCHalt =
|
||||
readRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcHalt),
|
||||
tid);
|
||||
readRegOtherThread(tc, miscRegClass[misc_reg::TcHalt], tid);
|
||||
|
||||
if (tidTCStatus.da == 1 && tidTCHalt.h == 0 &&
|
||||
tidTCStatus.a == 0 && success == 0) {
|
||||
|
||||
setRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcRestart),
|
||||
Rs, tid);
|
||||
setRegOtherThread(tc, RegId(IntRegClass, Rd_bits), Rt, tid);
|
||||
setRegOtherThread(tc, miscRegClass[misc_reg::TcRestart], Rs,
|
||||
tid);
|
||||
setRegOtherThread(tc, intRegClass[Rd_bits], Rt, tid);
|
||||
|
||||
StatusReg status = tc->readMiscReg(misc_reg::Status);
|
||||
TCStatusReg tcStatus = tc->readMiscReg(misc_reg::TcStatus);
|
||||
@@ -210,8 +209,8 @@ forkThread(TC *tc, Fault &fault, int Rd_bits, int Rs, int Rt)
|
||||
tidTCStatus.asid = tcStatus.asid;
|
||||
|
||||
// Write Status Register
|
||||
setRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcStatus),
|
||||
tidTCStatus, tid);
|
||||
setRegOtherThread(tc, miscRegClass[misc_reg::TcStatus],
|
||||
tidTCStatus, tid);
|
||||
|
||||
// Mark As Successful Fork
|
||||
success = 1;
|
||||
@@ -246,14 +245,11 @@ yieldThread(TC *tc, Fault &fault, int src_reg, uint32_t yield_mask)
|
||||
|
||||
for (ThreadID tid = 0; tid < num_threads; tid++) {
|
||||
TCStatusReg tidTCStatus =
|
||||
readRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcStatus),
|
||||
tid);
|
||||
readRegOtherThread(tc, miscRegClass[misc_reg::TcStatus], tid);
|
||||
TCHaltReg tidTCHalt =
|
||||
readRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcHalt),
|
||||
tid);
|
||||
readRegOtherThread(tc, miscRegClass[misc_reg::TcHalt], tid);
|
||||
TCBindReg tidTCBind =
|
||||
readRegOtherThread(tc, RegId(MiscRegClass, misc_reg::TcBind),
|
||||
tid);
|
||||
readRegOtherThread(tc, miscRegClass[misc_reg::TcBind], tid);
|
||||
|
||||
if (tidTCBind.curVPE == tcBind.curVPE &&
|
||||
tidTCBind.curTC == tcBind.curTC &&
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace MipsISA
|
||||
namespace float_reg
|
||||
{
|
||||
|
||||
enum FPControlRegNums
|
||||
enum : RegIndex
|
||||
{
|
||||
_F0Idx,
|
||||
_F1Idx,
|
||||
@@ -87,45 +87,53 @@ enum FPControlRegNums
|
||||
NumRegs,
|
||||
};
|
||||
|
||||
inline constexpr RegId
|
||||
F0(FloatRegClass, _F0Idx),
|
||||
F1(FloatRegClass, _F1Idx),
|
||||
F2(FloatRegClass, _F2Idx),
|
||||
F3(FloatRegClass, _F3Idx),
|
||||
F4(FloatRegClass, _F4Idx),
|
||||
F5(FloatRegClass, _F5Idx),
|
||||
F6(FloatRegClass, _F6Idx),
|
||||
F7(FloatRegClass, _F7Idx),
|
||||
F8(FloatRegClass, _F8Idx),
|
||||
F9(FloatRegClass, _F9Idx),
|
||||
F10(FloatRegClass, _F10Idx),
|
||||
F11(FloatRegClass, _F11Idx),
|
||||
F12(FloatRegClass, _F12Idx),
|
||||
F13(FloatRegClass, _F13Idx),
|
||||
F14(FloatRegClass, _F14Idx),
|
||||
F15(FloatRegClass, _F15Idx),
|
||||
F16(FloatRegClass, _F16Idx),
|
||||
F17(FloatRegClass, _F17Idx),
|
||||
F18(FloatRegClass, _F18Idx),
|
||||
F19(FloatRegClass, _F19Idx),
|
||||
F20(FloatRegClass, _F20Idx),
|
||||
F21(FloatRegClass, _F21Idx),
|
||||
F22(FloatRegClass, _F22Idx),
|
||||
F23(FloatRegClass, _F23Idx),
|
||||
F24(FloatRegClass, _F24Idx),
|
||||
F25(FloatRegClass, _F25Idx),
|
||||
F26(FloatRegClass, _F26Idx),
|
||||
F27(FloatRegClass, _F27Idx),
|
||||
F28(FloatRegClass, _F28Idx),
|
||||
F29(FloatRegClass, _F29Idx),
|
||||
F30(FloatRegClass, _F30Idx),
|
||||
F31(FloatRegClass, _F31Idx),
|
||||
} // namespace float_reg
|
||||
|
||||
Fir(FloatRegClass, _FirIdx),
|
||||
Fccr(FloatRegClass, _FccrIdx),
|
||||
Fexr(FloatRegClass, _FexrIdx),
|
||||
Fenr(FloatRegClass, _FenrIdx),
|
||||
Fcsr(FloatRegClass, _FcsrIdx);
|
||||
inline constexpr RegClass floatRegClass(FloatRegClass, float_reg::NumRegs,
|
||||
debug::FloatRegs);
|
||||
|
||||
namespace float_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
F0 = floatRegClass[_F0Idx],
|
||||
F1 = floatRegClass[_F1Idx],
|
||||
F2 = floatRegClass[_F2Idx],
|
||||
F3 = floatRegClass[_F3Idx],
|
||||
F4 = floatRegClass[_F4Idx],
|
||||
F5 = floatRegClass[_F5Idx],
|
||||
F6 = floatRegClass[_F6Idx],
|
||||
F7 = floatRegClass[_F7Idx],
|
||||
F8 = floatRegClass[_F8Idx],
|
||||
F9 = floatRegClass[_F9Idx],
|
||||
F10 = floatRegClass[_F10Idx],
|
||||
F11 = floatRegClass[_F11Idx],
|
||||
F12 = floatRegClass[_F12Idx],
|
||||
F13 = floatRegClass[_F13Idx],
|
||||
F14 = floatRegClass[_F14Idx],
|
||||
F15 = floatRegClass[_F15Idx],
|
||||
F16 = floatRegClass[_F16Idx],
|
||||
F17 = floatRegClass[_F17Idx],
|
||||
F18 = floatRegClass[_F18Idx],
|
||||
F19 = floatRegClass[_F19Idx],
|
||||
F20 = floatRegClass[_F20Idx],
|
||||
F21 = floatRegClass[_F21Idx],
|
||||
F22 = floatRegClass[_F22Idx],
|
||||
F23 = floatRegClass[_F23Idx],
|
||||
F24 = floatRegClass[_F24Idx],
|
||||
F25 = floatRegClass[_F25Idx],
|
||||
F26 = floatRegClass[_F26Idx],
|
||||
F27 = floatRegClass[_F27Idx],
|
||||
F28 = floatRegClass[_F28Idx],
|
||||
F29 = floatRegClass[_F29Idx],
|
||||
F30 = floatRegClass[_F30Idx],
|
||||
F31 = floatRegClass[_F31Idx],
|
||||
|
||||
Fir = floatRegClass[_FirIdx],
|
||||
Fccr = floatRegClass[_FccrIdx],
|
||||
Fexr = floatRegClass[_FexrIdx],
|
||||
Fenr = floatRegClass[_FenrIdx],
|
||||
Fcsr = floatRegClass[_FcsrIdx];
|
||||
|
||||
} // namespace float_reg
|
||||
|
||||
@@ -149,9 +157,6 @@ enum FCSRFields
|
||||
const uint32_t MIPS32_QNAN = 0x7fbfffff;
|
||||
const uint64_t MIPS64_QNAN = 0x7ff7ffffffffffffULL;
|
||||
|
||||
inline constexpr RegClass floatRegClass(FloatRegClass, float_reg::NumRegs,
|
||||
debug::FloatRegs);
|
||||
|
||||
} // namespace MipsISA
|
||||
} // namespace gem5
|
||||
|
||||
|
||||
@@ -117,78 +117,86 @@ enum : RegIndex
|
||||
NumRegs
|
||||
};
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
namespace int_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
// Zero register.
|
||||
Zero(IntRegClass, _ZeroIdx),
|
||||
Zero = intRegClass[_ZeroIdx],
|
||||
|
||||
// Assembly temporary.
|
||||
At(IntRegClass, _AtIdx),
|
||||
At = intRegClass[_AtIdx],
|
||||
|
||||
// Value returned by subroutine.
|
||||
V0(IntRegClass, _V0Idx),
|
||||
V1(IntRegClass, _V1Idx),
|
||||
V0 = intRegClass[_V0Idx],
|
||||
V1 = intRegClass[_V1Idx],
|
||||
|
||||
// Arguments for subroutine.
|
||||
A0(IntRegClass, _A0Idx),
|
||||
A1(IntRegClass, _A1Idx),
|
||||
A2(IntRegClass, _A2Idx),
|
||||
A3(IntRegClass, _A3Idx),
|
||||
A0 = intRegClass[_A0Idx],
|
||||
A1 = intRegClass[_A1Idx],
|
||||
A2 = intRegClass[_A2Idx],
|
||||
A3 = intRegClass[_A3Idx],
|
||||
|
||||
// Temporaries.
|
||||
T0(IntRegClass, _T0Idx),
|
||||
T1(IntRegClass, _T1Idx),
|
||||
T2(IntRegClass, _T2Idx),
|
||||
T3(IntRegClass, _T3Idx),
|
||||
T4(IntRegClass, _T4Idx),
|
||||
T5(IntRegClass, _T5Idx),
|
||||
T6(IntRegClass, _T6Idx),
|
||||
T7(IntRegClass, _T7Idx),
|
||||
T8(IntRegClass, _T8Idx),
|
||||
T9(IntRegClass, _T9Idx),
|
||||
T0 = intRegClass[_T0Idx],
|
||||
T1 = intRegClass[_T1Idx],
|
||||
T2 = intRegClass[_T2Idx],
|
||||
T3 = intRegClass[_T3Idx],
|
||||
T4 = intRegClass[_T4Idx],
|
||||
T5 = intRegClass[_T5Idx],
|
||||
T6 = intRegClass[_T6Idx],
|
||||
T7 = intRegClass[_T7Idx],
|
||||
T8 = intRegClass[_T8Idx],
|
||||
T9 = intRegClass[_T9Idx],
|
||||
|
||||
// Subroutine registers.
|
||||
S0(IntRegClass, _S0Idx),
|
||||
S1(IntRegClass, _S1Idx),
|
||||
S2(IntRegClass, _S2Idx),
|
||||
S3(IntRegClass, _S3Idx),
|
||||
S4(IntRegClass, _S4Idx),
|
||||
S5(IntRegClass, _S5Idx),
|
||||
S6(IntRegClass, _S6Idx),
|
||||
S7(IntRegClass, _S7Idx),
|
||||
S0 = intRegClass[_S0Idx],
|
||||
S1 = intRegClass[_S1Idx],
|
||||
S2 = intRegClass[_S2Idx],
|
||||
S3 = intRegClass[_S3Idx],
|
||||
S4 = intRegClass[_S4Idx],
|
||||
S5 = intRegClass[_S5Idx],
|
||||
S6 = intRegClass[_S6Idx],
|
||||
S7 = intRegClass[_S7Idx],
|
||||
|
||||
// For use in an interrupt/trap handler.
|
||||
K0(IntRegClass, _K0Idx),
|
||||
K1(IntRegClass, _K1Idx),
|
||||
K0 = intRegClass[_K0Idx],
|
||||
K1 = intRegClass[_K1Idx],
|
||||
|
||||
// Global pointer.
|
||||
Gp(IntRegClass, _GpIdx),
|
||||
Gp = intRegClass[_GpIdx],
|
||||
|
||||
// Stack pointer.
|
||||
Sp(IntRegClass, _SpIdx),
|
||||
Sp = intRegClass[_SpIdx],
|
||||
|
||||
// Frame pointer.
|
||||
Fp(IntRegClass, _FpIdx),
|
||||
Fp = intRegClass[_FpIdx],
|
||||
|
||||
// Return address.
|
||||
Ra(IntRegClass, _RaIdx),
|
||||
Ra = intRegClass[_RaIdx],
|
||||
|
||||
DspLo0(IntRegClass, _DspLo0Idx),
|
||||
DspHi0(IntRegClass, _DspHi0Idx),
|
||||
DspAcx0(IntRegClass, _DspAcx0Idx),
|
||||
DspLo0 = intRegClass[_DspLo0Idx],
|
||||
DspHi0 = intRegClass[_DspHi0Idx],
|
||||
DspAcx0 = intRegClass[_DspAcx0Idx],
|
||||
|
||||
DspLo1(IntRegClass, _DspLo1Idx),
|
||||
DspHi1(IntRegClass, _DspHi1Idx),
|
||||
DspAcx1(IntRegClass, _DspAcx1Idx),
|
||||
DspLo1 = intRegClass[_DspLo1Idx],
|
||||
DspHi1 = intRegClass[_DspHi1Idx],
|
||||
DspAcx1 = intRegClass[_DspAcx1Idx],
|
||||
|
||||
DspLo2(IntRegClass, _DspLo2Idx),
|
||||
DspHi2(IntRegClass, _DspHi2Idx),
|
||||
DspAcx2(IntRegClass, _DspAcx2Idx),
|
||||
DspLo2 = intRegClass[_DspLo2Idx],
|
||||
DspHi2 = intRegClass[_DspHi2Idx],
|
||||
DspAcx2 = intRegClass[_DspAcx2Idx],
|
||||
|
||||
DspLo3(IntRegClass, _DspLo3Idx),
|
||||
DspHi3(IntRegClass, _DspHi3Idx),
|
||||
DspAcx3(IntRegClass, _DspAcx3Idx),
|
||||
DspLo3 = intRegClass[_DspLo3Idx],
|
||||
DspHi3 = intRegClass[_DspHi3Idx],
|
||||
DspAcx3 = intRegClass[_DspAcx3Idx],
|
||||
|
||||
DspControl(IntRegClass, _DspControlIdx);
|
||||
DspControl = intRegClass[_DspControlIdx];
|
||||
|
||||
// Register aliases.
|
||||
inline constexpr auto
|
||||
@@ -200,10 +208,6 @@ inline constexpr auto
|
||||
&SyscallSuccess = A3;
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
} // namespace MipsISA
|
||||
} // namespace gem5
|
||||
|
||||
|
||||
@@ -174,7 +174,7 @@ RemoteGDB::MipsGdbRegCache::getRegs(ThreadContext *context)
|
||||
DPRINTF(GDBAcc, "getregs in remotegdb \n");
|
||||
|
||||
for (int i = 0; i < 32; i++)
|
||||
r.gpr[i] = context->getReg(RegId(IntRegClass, i));
|
||||
r.gpr[i] = context->getReg(intRegClass[i]);
|
||||
r.sr = context->readMiscRegNoEffect(misc_reg::Status);
|
||||
r.lo = context->getReg(int_reg::Lo);
|
||||
r.hi = context->getReg(int_reg::Hi);
|
||||
@@ -182,7 +182,7 @@ RemoteGDB::MipsGdbRegCache::getRegs(ThreadContext *context)
|
||||
r.cause = context->readMiscRegNoEffect(misc_reg::Cause);
|
||||
r.pc = context->pcState().instAddr();
|
||||
for (int i = 0; i < 32; i++)
|
||||
r.fpr[i] = context->getReg(RegId(FloatRegClass, i));
|
||||
r.fpr[i] = context->getReg(floatRegClass[i]);
|
||||
r.fsr = context->getReg(float_reg::Fccr);
|
||||
r.fir = context->getReg(float_reg::Fir);
|
||||
}
|
||||
@@ -193,7 +193,7 @@ RemoteGDB::MipsGdbRegCache::setRegs(ThreadContext *context) const
|
||||
DPRINTF(GDBAcc, "setregs in remotegdb \n");
|
||||
|
||||
for (int i = 1; i < 32; i++)
|
||||
context->setReg(RegId(IntRegClass, i), r.gpr[i]);
|
||||
context->setReg(intRegClass[i], r.gpr[i]);
|
||||
context->setMiscRegNoEffect(misc_reg::Status, r.sr);
|
||||
context->setReg(int_reg::Lo, r.lo);
|
||||
context->setReg(int_reg::Hi, r.hi);
|
||||
@@ -201,7 +201,7 @@ RemoteGDB::MipsGdbRegCache::setRegs(ThreadContext *context) const
|
||||
context->setMiscRegNoEffect(misc_reg::Cause, r.cause);
|
||||
context->pcState(r.pc);
|
||||
for (int i = 0; i < 32; i++)
|
||||
context->setReg(RegId(FloatRegClass, i), r.fpr[i]);
|
||||
context->setReg(floatRegClass[i], r.fpr[i]);
|
||||
context->setReg(float_reg::Fccr, r.fsr);
|
||||
context->setReg(float_reg::Fir, r.fir);
|
||||
}
|
||||
|
||||
@@ -75,16 +75,12 @@ void
|
||||
ISA::copyRegsFrom(ThreadContext *src)
|
||||
{
|
||||
// First loop through the integer registers.
|
||||
for (int i = 0; i < int_reg::NumRegs; ++i) {
|
||||
RegId reg(IntRegClass, i);
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
for (auto &id: intRegClass)
|
||||
tc->setReg(id, src->getReg(id));
|
||||
|
||||
// Then loop through the floating point registers.
|
||||
for (int i = 0; i < float_reg::NumRegs; ++i) {
|
||||
RegId reg(FloatRegClass, i);
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
for (auto &id: floatRegClass)
|
||||
tc->setReg(id, src->getReg(id));
|
||||
|
||||
//TODO Copy misc. registers
|
||||
|
||||
|
||||
@@ -341,7 +341,7 @@ PowerProcess::argsInit(int pageSize)
|
||||
|
||||
//Reset the special-purpose registers
|
||||
for (int i = int_reg::NumArchRegs; i < int_reg::NumRegs; i++)
|
||||
tc->setReg(RegId(IntRegClass, i), (RegVal)0);
|
||||
tc->setReg(intRegClass[i], (RegVal)0);
|
||||
|
||||
//Set the machine status for a typical userspace
|
||||
Msr msr = 0;
|
||||
|
||||
@@ -93,56 +93,61 @@ enum : RegIndex
|
||||
NumRegs
|
||||
};
|
||||
|
||||
inline constexpr RegId
|
||||
R0(IntRegClass, _R0Idx),
|
||||
R1(IntRegClass, _R1Idx),
|
||||
R2(IntRegClass, _R2Idx),
|
||||
R3(IntRegClass, _R3Idx),
|
||||
R4(IntRegClass, _R4Idx),
|
||||
R5(IntRegClass, _R5Idx),
|
||||
R6(IntRegClass, _R6Idx),
|
||||
R7(IntRegClass, _R7Idx),
|
||||
R8(IntRegClass, _R8Idx),
|
||||
R9(IntRegClass, _R9Idx),
|
||||
R10(IntRegClass, _R10Idx),
|
||||
R11(IntRegClass, _R11Idx),
|
||||
R12(IntRegClass, _R12Idx),
|
||||
R13(IntRegClass, _R13Idx),
|
||||
R14(IntRegClass, _R14Idx),
|
||||
R15(IntRegClass, _R15Idx),
|
||||
R16(IntRegClass, _R16Idx),
|
||||
R17(IntRegClass, _R17Idx),
|
||||
R18(IntRegClass, _R18Idx),
|
||||
R19(IntRegClass, _R19Idx),
|
||||
R20(IntRegClass, _R20Idx),
|
||||
R21(IntRegClass, _R21Idx),
|
||||
R22(IntRegClass, _R22Idx),
|
||||
R23(IntRegClass, _R23Idx),
|
||||
R24(IntRegClass, _R24Idx),
|
||||
R25(IntRegClass, _R25Idx),
|
||||
R26(IntRegClass, _R26Idx),
|
||||
R27(IntRegClass, _R27Idx),
|
||||
R28(IntRegClass, _R28Idx),
|
||||
R29(IntRegClass, _R29Idx),
|
||||
R30(IntRegClass, _R30Idx),
|
||||
R31(IntRegClass, _R31Idx),
|
||||
|
||||
Cr(IntRegClass, _CrIdx),
|
||||
Xer(IntRegClass, _XerIdx),
|
||||
Lr(IntRegClass, _LrIdx),
|
||||
Ctr(IntRegClass, _CtrIdx),
|
||||
Tar(IntRegClass, _TarIdx),
|
||||
Fpscr(IntRegClass, _FpscrIdx),
|
||||
Msr(IntRegClass, _MsrIdx),
|
||||
Rsv(IntRegClass, _RsvIdx),
|
||||
RsvLen(IntRegClass, _RsvLenIdx),
|
||||
RsvAddr(IntRegClass, _RsvAddrIdx);
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
namespace int_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
R0 = intRegClass[_R0Idx],
|
||||
R1 = intRegClass[_R1Idx],
|
||||
R2 = intRegClass[_R2Idx],
|
||||
R3 = intRegClass[_R3Idx],
|
||||
R4 = intRegClass[_R4Idx],
|
||||
R5 = intRegClass[_R5Idx],
|
||||
R6 = intRegClass[_R6Idx],
|
||||
R7 = intRegClass[_R7Idx],
|
||||
R8 = intRegClass[_R8Idx],
|
||||
R9 = intRegClass[_R9Idx],
|
||||
R10 = intRegClass[_R10Idx],
|
||||
R11 = intRegClass[_R11Idx],
|
||||
R12 = intRegClass[_R12Idx],
|
||||
R13 = intRegClass[_R13Idx],
|
||||
R14 = intRegClass[_R14Idx],
|
||||
R15 = intRegClass[_R15Idx],
|
||||
R16 = intRegClass[_R16Idx],
|
||||
R17 = intRegClass[_R17Idx],
|
||||
R18 = intRegClass[_R18Idx],
|
||||
R19 = intRegClass[_R19Idx],
|
||||
R20 = intRegClass[_R20Idx],
|
||||
R21 = intRegClass[_R21Idx],
|
||||
R22 = intRegClass[_R22Idx],
|
||||
R23 = intRegClass[_R23Idx],
|
||||
R24 = intRegClass[_R24Idx],
|
||||
R25 = intRegClass[_R25Idx],
|
||||
R26 = intRegClass[_R26Idx],
|
||||
R27 = intRegClass[_R27Idx],
|
||||
R28 = intRegClass[_R28Idx],
|
||||
R29 = intRegClass[_R29Idx],
|
||||
R30 = intRegClass[_R30Idx],
|
||||
R31 = intRegClass[_R31Idx],
|
||||
|
||||
Cr = intRegClass[_CrIdx],
|
||||
Xer = intRegClass[_XerIdx],
|
||||
Lr = intRegClass[_LrIdx],
|
||||
Ctr = intRegClass[_CtrIdx],
|
||||
Tar = intRegClass[_TarIdx],
|
||||
Fpscr = intRegClass[_FpscrIdx],
|
||||
Msr = intRegClass[_MsrIdx],
|
||||
Rsv = intRegClass[_RsvIdx],
|
||||
RsvLen = intRegClass[_RsvLenIdx],
|
||||
RsvAddr = intRegClass[_RsvAddrIdx];
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
// Semantically meaningful register indices
|
||||
inline constexpr auto
|
||||
&ReturnValueReg = int_reg::R3,
|
||||
|
||||
@@ -188,12 +188,12 @@ RemoteGDB::PowerGdbRegCache::getRegs(ThreadContext *context)
|
||||
// PC, MSR, CR, LR, CTR, XER, FPSCR (32-bit each)
|
||||
|
||||
for (int i = 0; i < int_reg::NumArchRegs; i++) {
|
||||
RegId reg(IntRegClass, i);
|
||||
RegId reg = intRegClass[i];
|
||||
r.gpr[i] = htog((uint32_t)context->getReg(reg), order);
|
||||
}
|
||||
|
||||
for (int i = 0; i < float_reg::NumArchRegs; i++)
|
||||
r.fpr[i] = context->getReg(RegId(FloatRegClass, i));
|
||||
r.fpr[i] = context->getReg(floatRegClass[i]);
|
||||
|
||||
r.pc = htog((uint32_t)context->pcState().instAddr(), order);
|
||||
r.msr = 0; // MSR is privileged, hence not exposed here
|
||||
@@ -213,10 +213,10 @@ RemoteGDB::PowerGdbRegCache::setRegs(ThreadContext *context) const
|
||||
ByteOrder order = (msr.le ? ByteOrder::little : ByteOrder::big);
|
||||
|
||||
for (int i = 0; i < int_reg::NumArchRegs; i++)
|
||||
context->setReg(RegId(IntRegClass, i), gtoh(r.gpr[i], order));
|
||||
context->setReg(intRegClass[i], gtoh(r.gpr[i], order));
|
||||
|
||||
for (int i = 0; i < float_reg::NumArchRegs; i++)
|
||||
context->setReg(RegId(FloatRegClass, i), r.fpr[i]);
|
||||
context->setReg(floatRegClass[i], r.fpr[i]);
|
||||
|
||||
auto pc = context->pcState().as<PowerISA::PCState>();
|
||||
pc.byteOrder(order);
|
||||
@@ -244,10 +244,10 @@ RemoteGDB::Power64GdbRegCache::getRegs(ThreadContext *context)
|
||||
// each and the rest are 64-bit)
|
||||
|
||||
for (int i = 0; i < int_reg::NumArchRegs; i++)
|
||||
r.gpr[i] = htog(context->getReg(RegId(IntRegClass, i)), order);
|
||||
r.gpr[i] = htog(context->getReg(intRegClass[i]), order);
|
||||
|
||||
for (int i = 0; i < float_reg::NumArchRegs; i++)
|
||||
r.fpr[i] = context->getReg(RegId(FloatRegClass, i));
|
||||
r.fpr[i] = context->getReg(floatRegClass[i]);
|
||||
|
||||
r.pc = htog(context->pcState().instAddr(), order);
|
||||
r.msr = 0; // MSR is privileged, hence not exposed here
|
||||
@@ -267,10 +267,10 @@ RemoteGDB::Power64GdbRegCache::setRegs(ThreadContext *context) const
|
||||
ByteOrder order = (msr.le ? ByteOrder::little : ByteOrder::big);
|
||||
|
||||
for (int i = 0; i < int_reg::NumArchRegs; i++)
|
||||
context->setReg(RegId(IntRegClass, i), gtoh(r.gpr[i], order));
|
||||
context->setReg(intRegClass[i], gtoh(r.gpr[i], order));
|
||||
|
||||
for (int i = 0; i < float_reg::NumArchRegs; i++)
|
||||
context->setReg(RegId(FloatRegClass, i), r.fpr[i]);
|
||||
context->setReg(floatRegClass[i], r.fpr[i]);
|
||||
|
||||
auto pc = context->pcState().as<PowerISA::PCState>();
|
||||
pc.byteOrder(order);
|
||||
|
||||
@@ -72,8 +72,8 @@ LoadReserved::generateDisassembly(
|
||||
ss << "aq";
|
||||
if (RL)
|
||||
ss << "rl";
|
||||
ss << ' ' << registerName(RegId(IntRegClass, RD)) << ", ("
|
||||
<< registerName(RegId(IntRegClass, RS1)) << ')';
|
||||
ss << ' ' << registerName(intRegClass[RD]) << ", ("
|
||||
<< registerName(intRegClass[RS1]) << ')';
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
@@ -100,9 +100,9 @@ StoreCond::generateDisassembly(
|
||||
ss << "aq";
|
||||
if (RL)
|
||||
ss << "rl";
|
||||
ss << ' ' << registerName(RegId(IntRegClass, RD)) << ", "
|
||||
<< registerName(RegId(IntRegClass, RS2)) << ", ("
|
||||
<< registerName(RegId(IntRegClass, RS1)) << ')';
|
||||
ss << ' ' << registerName(intRegClass[RD]) << ", "
|
||||
<< registerName(intRegClass[RS2]) << ", ("
|
||||
<< registerName(intRegClass[RS1]) << ')';
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
@@ -130,9 +130,9 @@ AtomicMemOp::generateDisassembly(
|
||||
ss << "aq";
|
||||
if (RL)
|
||||
ss << "rl";
|
||||
ss << ' ' << registerName(RegId(IntRegClass, RD)) << ", "
|
||||
<< registerName(RegId(IntRegClass, RS2)) << ", ("
|
||||
<< registerName(RegId(IntRegClass, RS1)) << ')';
|
||||
ss << ' ' << registerName(intRegClass[RD]) << ", "
|
||||
<< registerName(intRegClass[RS2]) << ", ("
|
||||
<< registerName(intRegClass[RS1]) << ')';
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
|
||||
@@ -225,16 +225,12 @@ void
|
||||
ISA::copyRegsFrom(ThreadContext *src)
|
||||
{
|
||||
// First loop through the integer registers.
|
||||
for (int i = 0; i < int_reg::NumRegs; ++i) {
|
||||
RegId reg(IntRegClass, i);
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
for (auto &id: intRegClass)
|
||||
tc->setReg(id, src->getReg(id));
|
||||
|
||||
// Second loop through the float registers.
|
||||
for (int i = 0; i < float_reg::NumRegs; ++i) {
|
||||
RegId reg(FloatRegClass, i);
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
for (auto &id: floatRegClass)
|
||||
tc->setReg(id, src->getReg(id));
|
||||
|
||||
// Lastly copy PC/NPC
|
||||
tc->pcState(src->pcState());
|
||||
|
||||
@@ -152,43 +152,51 @@ enum : RegIndex
|
||||
NumRegs
|
||||
};
|
||||
|
||||
} // namespace float_reg
|
||||
|
||||
inline constexpr RegClass floatRegClass(FloatRegClass, float_reg::NumRegs,
|
||||
debug::FloatRegs);
|
||||
|
||||
namespace float_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
Ft0(FloatRegClass, _Ft0Idx),
|
||||
Ft1(FloatRegClass, _Ft1Idx),
|
||||
Ft2(FloatRegClass, _Ft2Idx),
|
||||
Ft3(FloatRegClass, _Ft3Idx),
|
||||
Ft4(FloatRegClass, _Ft4Idx),
|
||||
Ft5(FloatRegClass, _Ft5Idx),
|
||||
Ft6(FloatRegClass, _Ft6Idx),
|
||||
Ft7(FloatRegClass, _Ft7Idx),
|
||||
Ft0 = floatRegClass[_Ft0Idx],
|
||||
Ft1 = floatRegClass[_Ft1Idx],
|
||||
Ft2 = floatRegClass[_Ft2Idx],
|
||||
Ft3 = floatRegClass[_Ft3Idx],
|
||||
Ft4 = floatRegClass[_Ft4Idx],
|
||||
Ft5 = floatRegClass[_Ft5Idx],
|
||||
Ft6 = floatRegClass[_Ft6Idx],
|
||||
Ft7 = floatRegClass[_Ft7Idx],
|
||||
|
||||
Fs0(FloatRegClass, _Fs0Idx),
|
||||
Fs1(FloatRegClass, _Fs1Idx),
|
||||
Fs0 = floatRegClass[_Fs0Idx],
|
||||
Fs1 = floatRegClass[_Fs1Idx],
|
||||
|
||||
Fa0(FloatRegClass, _Fa0Idx),
|
||||
Fa1(FloatRegClass, _Fa1Idx),
|
||||
Fa2(FloatRegClass, _Fa2Idx),
|
||||
Fa3(FloatRegClass, _Fa3Idx),
|
||||
Fa4(FloatRegClass, _Fa4Idx),
|
||||
Fa5(FloatRegClass, _Fa5Idx),
|
||||
Fa6(FloatRegClass, _Fa6Idx),
|
||||
Fa7(FloatRegClass, _Fa7Idx),
|
||||
Fa0 = floatRegClass[_Fa0Idx],
|
||||
Fa1 = floatRegClass[_Fa1Idx],
|
||||
Fa2 = floatRegClass[_Fa2Idx],
|
||||
Fa3 = floatRegClass[_Fa3Idx],
|
||||
Fa4 = floatRegClass[_Fa4Idx],
|
||||
Fa5 = floatRegClass[_Fa5Idx],
|
||||
Fa6 = floatRegClass[_Fa6Idx],
|
||||
Fa7 = floatRegClass[_Fa7Idx],
|
||||
|
||||
Fs2(FloatRegClass, _Fs2Idx),
|
||||
Fs3(FloatRegClass, _Fs3Idx),
|
||||
Fs4(FloatRegClass, _Fs4Idx),
|
||||
Fs5(FloatRegClass, _Fs5Idx),
|
||||
Fs6(FloatRegClass, _Fs6Idx),
|
||||
Fs7(FloatRegClass, _Fs7Idx),
|
||||
Fs8(FloatRegClass, _Fs8Idx),
|
||||
Fs9(FloatRegClass, _Fs9Idx),
|
||||
Fs10(FloatRegClass, _Fs10Idx),
|
||||
Fs11(FloatRegClass, _Fs11Idx),
|
||||
Fs2 = floatRegClass[_Fs2Idx],
|
||||
Fs3 = floatRegClass[_Fs3Idx],
|
||||
Fs4 = floatRegClass[_Fs4Idx],
|
||||
Fs5 = floatRegClass[_Fs5Idx],
|
||||
Fs6 = floatRegClass[_Fs6Idx],
|
||||
Fs7 = floatRegClass[_Fs7Idx],
|
||||
Fs8 = floatRegClass[_Fs8Idx],
|
||||
Fs9 = floatRegClass[_Fs9Idx],
|
||||
Fs10 = floatRegClass[_Fs10Idx],
|
||||
Fs11 = floatRegClass[_Fs11Idx],
|
||||
|
||||
Ft8(FloatRegClass, _Ft8Idx),
|
||||
Ft9(FloatRegClass, _Ft9Idx),
|
||||
Ft10(FloatRegClass, _Ft10Idx),
|
||||
Ft11(FloatRegClass, _Ft11Idx);
|
||||
Ft8 = floatRegClass[_Ft8Idx],
|
||||
Ft9 = floatRegClass[_Ft9Idx],
|
||||
Ft10 = floatRegClass[_Ft10Idx],
|
||||
Ft11 = floatRegClass[_Ft11Idx];
|
||||
|
||||
const std::vector<std::string> RegNames = {
|
||||
"ft0", "ft1", "ft2", "ft3",
|
||||
@@ -203,9 +211,6 @@ const std::vector<std::string> RegNames = {
|
||||
|
||||
} // namespace float_reg
|
||||
|
||||
inline constexpr RegClass floatRegClass(FloatRegClass, float_reg::NumRegs,
|
||||
debug::FloatRegs);
|
||||
|
||||
} // namespace RiscvISA
|
||||
} // namespace gem5
|
||||
|
||||
|
||||
@@ -79,40 +79,48 @@ enum : RegIndex
|
||||
NumRegs
|
||||
};
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
namespace int_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
Zero(IntRegClass, _ZeroIdx),
|
||||
Ra(IntRegClass, _RaIdx),
|
||||
Sp(IntRegClass, _SpIdx),
|
||||
Gp(IntRegClass, _GpIdx),
|
||||
Tp(IntRegClass, _TpIdx),
|
||||
T0(IntRegClass, _T0Idx),
|
||||
T1(IntRegClass, _T1Idx),
|
||||
T2(IntRegClass, _T2Idx),
|
||||
S0(IntRegClass, _S0Idx),
|
||||
S1(IntRegClass, _S1Idx),
|
||||
A0(IntRegClass, _A0Idx),
|
||||
A1(IntRegClass, _A1Idx),
|
||||
A2(IntRegClass, _A2Idx),
|
||||
A3(IntRegClass, _A3Idx),
|
||||
A4(IntRegClass, _A4Idx),
|
||||
A5(IntRegClass, _A5Idx),
|
||||
A6(IntRegClass, _A6Idx),
|
||||
A7(IntRegClass, _A7Idx),
|
||||
S2(IntRegClass, _S2Idx),
|
||||
S3(IntRegClass, _S3Idx),
|
||||
S4(IntRegClass, _S4Idx),
|
||||
S5(IntRegClass, _S5Idx),
|
||||
S6(IntRegClass, _S6Idx),
|
||||
S7(IntRegClass, _S7Idx),
|
||||
S8(IntRegClass, _S8Idx),
|
||||
S9(IntRegClass, _S9Idx),
|
||||
S10(IntRegClass, _S10Idx),
|
||||
S11(IntRegClass, _S11Idx),
|
||||
T3(IntRegClass, _T3Idx),
|
||||
T4(IntRegClass, _T4Idx),
|
||||
T5(IntRegClass, _T5Idx),
|
||||
T6(IntRegClass, _T6Idx),
|
||||
Ureg0(IntRegClass, _Ureg0Idx);
|
||||
Zero = intRegClass[_ZeroIdx],
|
||||
Ra = intRegClass[_RaIdx],
|
||||
Sp = intRegClass[_SpIdx],
|
||||
Gp = intRegClass[_GpIdx],
|
||||
Tp = intRegClass[_TpIdx],
|
||||
T0 = intRegClass[_T0Idx],
|
||||
T1 = intRegClass[_T1Idx],
|
||||
T2 = intRegClass[_T2Idx],
|
||||
S0 = intRegClass[_S0Idx],
|
||||
S1 = intRegClass[_S1Idx],
|
||||
A0 = intRegClass[_A0Idx],
|
||||
A1 = intRegClass[_A1Idx],
|
||||
A2 = intRegClass[_A2Idx],
|
||||
A3 = intRegClass[_A3Idx],
|
||||
A4 = intRegClass[_A4Idx],
|
||||
A5 = intRegClass[_A5Idx],
|
||||
A6 = intRegClass[_A6Idx],
|
||||
A7 = intRegClass[_A7Idx],
|
||||
S2 = intRegClass[_S2Idx],
|
||||
S3 = intRegClass[_S3Idx],
|
||||
S4 = intRegClass[_S4Idx],
|
||||
S5 = intRegClass[_S5Idx],
|
||||
S6 = intRegClass[_S6Idx],
|
||||
S7 = intRegClass[_S7Idx],
|
||||
S8 = intRegClass[_S8Idx],
|
||||
S9 = intRegClass[_S9Idx],
|
||||
S10 = intRegClass[_S10Idx],
|
||||
S11 = intRegClass[_S11Idx],
|
||||
T3 = intRegClass[_T3Idx],
|
||||
T4 = intRegClass[_T4Idx],
|
||||
T5 = intRegClass[_T5Idx],
|
||||
T6 = intRegClass[_T6Idx],
|
||||
Ureg0 = intRegClass[_Ureg0Idx];
|
||||
|
||||
const std::vector<std::string> RegNames = {
|
||||
"zero", "ra", "sp", "gp",
|
||||
@@ -127,9 +135,6 @@ const std::vector<std::string> RegNames = {
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
// Semantically meaningful register indices
|
||||
inline constexpr auto
|
||||
&ReturnAddrReg = int_reg::Ra,
|
||||
|
||||
@@ -192,13 +192,13 @@ RemoteGDB::RiscvGdbRegCache::getRegs(ThreadContext *context)
|
||||
|
||||
// General registers
|
||||
for (int i = 0; i < int_reg::NumArchRegs; i++) {
|
||||
r.gpr[i] = context->getReg(RegId(IntRegClass, i));
|
||||
r.gpr[i] = context->getReg(intRegClass[i]);
|
||||
}
|
||||
r.pc = context->pcState().instAddr();
|
||||
|
||||
// Floating point registers
|
||||
for (int i = 0; i < float_reg::NumRegs; i++)
|
||||
r.fpu[i] = context->getReg(RegId(FloatRegClass, i));
|
||||
r.fpu[i] = context->getReg(floatRegClass[i]);
|
||||
r.fflags = context->readMiscRegNoEffect(
|
||||
CSRData.at(CSR_FFLAGS).physIndex) & CSRMasks.at(CSR_FFLAGS);
|
||||
r.frm = context->readMiscRegNoEffect(
|
||||
@@ -303,12 +303,12 @@ RemoteGDB::RiscvGdbRegCache::setRegs(ThreadContext *context) const
|
||||
|
||||
DPRINTF(GDBAcc, "setregs in remotegdb \n");
|
||||
for (int i = 0; i < int_reg::NumArchRegs; i++)
|
||||
context->setReg(RegId(IntRegClass, i), r.gpr[i]);
|
||||
context->setReg(intRegClass[i], r.gpr[i]);
|
||||
context->pcState(r.pc);
|
||||
|
||||
// Floating point registers
|
||||
for (int i = 0; i < float_reg::NumRegs; i++)
|
||||
context->setReg(RegId(FloatRegClass, i), r.fpu[i]);
|
||||
context->setReg(floatRegClass[i], r.fpu[i]);
|
||||
|
||||
oldVal = context->readMiscRegNoEffect(
|
||||
CSRData.at(CSR_FFLAGS).physIndex);
|
||||
|
||||
@@ -236,7 +236,7 @@ ISA::copyRegsFrom(ThreadContext *src)
|
||||
tc->setMiscReg(MISCREG_GL, x);
|
||||
// Skip %g0 which is always zero.
|
||||
for (int y = 1; y < 8; y++) {
|
||||
RegId reg(IntRegClass, y);
|
||||
RegId reg = intRegClass[y];
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
}
|
||||
@@ -245,14 +245,14 @@ ISA::copyRegsFrom(ThreadContext *src)
|
||||
src->setMiscReg(MISCREG_CWP, x);
|
||||
tc->setMiscReg(MISCREG_CWP, x);
|
||||
for (int y = 16; y < 32; y++) {
|
||||
RegId reg(IntRegClass, y);
|
||||
RegId reg = intRegClass[y];
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
}
|
||||
// Microcode reg and pseudo int regs (misc regs in the integer regfile).
|
||||
for (int y = int_reg::NumArchRegs;
|
||||
y < int_reg::NumArchRegs + int_reg::NumMicroRegs; ++y) {
|
||||
RegId reg(IntRegClass, y);
|
||||
RegId reg = intRegClass[y];
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
|
||||
@@ -263,7 +263,7 @@ ISA::copyRegsFrom(ThreadContext *src)
|
||||
|
||||
// Then loop through the floating point registers.
|
||||
for (int i = 0; i < SparcISA::float_reg::NumArchRegs; ++i) {
|
||||
RegId reg(FloatRegClass, i);
|
||||
RegId reg = floatRegClass[i];
|
||||
tc->setReg(reg, src->getReg(reg));
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include "arch/generic/isa.hh"
|
||||
#include "arch/sparc/pcstate.hh"
|
||||
#include "arch/sparc/regs/float.hh"
|
||||
#include "arch/sparc/regs/int.hh"
|
||||
#include "arch/sparc/regs/misc.hh"
|
||||
#include "arch/sparc/sparc_traits.hh"
|
||||
@@ -196,13 +197,11 @@ class ISA : public BaseISA
|
||||
{
|
||||
switch (regId.classValue()) {
|
||||
case IntRegClass:
|
||||
return RegId(IntRegClass, flattenIntIndex(regId.index()));
|
||||
return intRegClass[flattenIntIndex(regId.index())];
|
||||
case FloatRegClass:
|
||||
return RegId(FloatRegClass, flattenFloatIndex(regId.index()));
|
||||
case CCRegClass:
|
||||
return RegId(CCRegClass, flattenCCIndex(regId.index()));
|
||||
return floatRegClass[flattenFloatIndex(regId.index())];
|
||||
case MiscRegClass:
|
||||
return RegId(MiscRegClass, flattenMiscIndex(regId.index()));
|
||||
return miscRegClass[flattenMiscIndex(regId.index())];
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -230,7 +230,7 @@ class SparcLinux : public Linux, public OpenFlagTable<SparcLinux>
|
||||
ctc->setMiscRegNoEffect(SparcISA::MISCREG_TL, (RegVal)0);
|
||||
ctc->setMiscReg(SparcISA::MISCREG_ASI, SparcISA::ASI_PRIMARY);
|
||||
for (int y = 8; y < 32; y++) {
|
||||
RegId reg(IntRegClass, y);
|
||||
RegId reg = SparcISA::intRegClass[y];
|
||||
ctc->setReg(reg, ptc->getReg(reg));
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
#include "arch/sparc/page_size.hh"
|
||||
#include "arch/sparc/process.hh"
|
||||
#include "arch/sparc/regs/int.hh"
|
||||
#include "base/loader/object_file.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
@@ -117,7 +118,7 @@ EmuLinux::syscall32(ThreadContext *tc)
|
||||
// This will move into the base SEWorkload function at some point.
|
||||
process->Process::syscall(tc);
|
||||
|
||||
syscall32Descs.get(tc->getReg(RegId(IntRegClass, 1)))->doSyscall(tc);
|
||||
syscall32Descs.get(tc->getReg(int_reg::G1))->doSyscall(tc);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -128,7 +129,7 @@ EmuLinux::syscall64(ThreadContext *tc)
|
||||
// This will move into the base SEWorkload function at some point.
|
||||
process->Process::syscall(tc);
|
||||
|
||||
syscallDescs.get(tc->getReg(RegId(IntRegClass, 1)))->doSyscall(tc);
|
||||
syscallDescs.get(tc->getReg(int_reg::G1))->doSyscall(tc);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -63,7 +63,7 @@ Trace::SparcNativeTrace::check(NativeTraceRecord *record)
|
||||
assert(SparcISA::int_reg::NumArchRegs == 32);
|
||||
const char **regName = intRegNames;
|
||||
for (int i = 0; i < SparcISA::int_reg::NumArchRegs; i++) {
|
||||
regVal = tc->getReg(RegId(IntRegClass, i));
|
||||
regVal = tc->getReg(SparcISA::intRegClass[i]);
|
||||
read(&realRegVal, sizeof(realRegVal));
|
||||
realRegVal = betoh(realRegVal);
|
||||
checkReg(*(regName++), regVal, realRegVal);
|
||||
|
||||
@@ -64,81 +64,6 @@ enum {
|
||||
NumMicroRegs = _GsrIdx - _Ureg0Idx + 1
|
||||
};
|
||||
|
||||
inline constexpr RegId
|
||||
// Globals
|
||||
G0(IntRegClass, _G0Idx),
|
||||
G1(IntRegClass, _G1Idx),
|
||||
G2(IntRegClass, _G2Idx),
|
||||
G3(IntRegClass, _G3Idx),
|
||||
G4(IntRegClass, _G4Idx),
|
||||
G5(IntRegClass, _G5Idx),
|
||||
G6(IntRegClass, _G6Idx),
|
||||
G7(IntRegClass, _G7Idx),
|
||||
|
||||
// Outputs
|
||||
O0(IntRegClass, _O0Idx),
|
||||
O1(IntRegClass, _O1Idx),
|
||||
O2(IntRegClass, _O2Idx),
|
||||
O3(IntRegClass, _O3Idx),
|
||||
O4(IntRegClass, _O4Idx),
|
||||
O5(IntRegClass, _O5Idx),
|
||||
O6(IntRegClass, _O6Idx),
|
||||
O7(IntRegClass, _O7Idx),
|
||||
|
||||
// Locals
|
||||
L0(IntRegClass, _L0Idx),
|
||||
L1(IntRegClass, _L1Idx),
|
||||
L2(IntRegClass, _L2Idx),
|
||||
L3(IntRegClass, _L3Idx),
|
||||
L4(IntRegClass, _L4Idx),
|
||||
L5(IntRegClass, _L5Idx),
|
||||
L6(IntRegClass, _L6Idx),
|
||||
L7(IntRegClass, _L7Idx),
|
||||
|
||||
// Inputs
|
||||
I0(IntRegClass, _I0Idx),
|
||||
I1(IntRegClass, _I1Idx),
|
||||
I2(IntRegClass, _I2Idx),
|
||||
I3(IntRegClass, _I3Idx),
|
||||
I4(IntRegClass, _I4Idx),
|
||||
I5(IntRegClass, _I5Idx),
|
||||
I6(IntRegClass, _I6Idx),
|
||||
I7(IntRegClass, _I7Idx),
|
||||
|
||||
Ureg0(IntRegClass, _Ureg0Idx),
|
||||
Y(IntRegClass, _YIdx),
|
||||
Ccr(IntRegClass, _CcrIdx),
|
||||
Cansave(IntRegClass, _CansaveIdx),
|
||||
Canrestore(IntRegClass, _CanrestoreIdx),
|
||||
Cleanwin(IntRegClass, _CleanwinIdx),
|
||||
Otherwin(IntRegClass, _OtherwinIdx),
|
||||
Wstate(IntRegClass, _WstateIdx),
|
||||
Gsr(IntRegClass, _GsrIdx);
|
||||
|
||||
inline constexpr RegId
|
||||
g(int index)
|
||||
{
|
||||
return RegId(IntRegClass, G0 + index);
|
||||
}
|
||||
|
||||
inline constexpr RegId
|
||||
o(int index)
|
||||
{
|
||||
return RegId(IntRegClass, O0 + index);
|
||||
}
|
||||
|
||||
inline constexpr RegId
|
||||
l(int index)
|
||||
{
|
||||
return RegId(IntRegClass, L0 + index);
|
||||
}
|
||||
|
||||
inline constexpr RegId
|
||||
i(int index)
|
||||
{
|
||||
return RegId(IntRegClass, I0 + index);
|
||||
}
|
||||
|
||||
const int NumRegs = (MaxGL + 1) * 8 + NWindows * 16 + NumMicroRegs;
|
||||
|
||||
} // namespace int_reg
|
||||
@@ -146,6 +71,86 @@ const int NumRegs = (MaxGL + 1) * 8 + NWindows * 16 + NumMicroRegs;
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
namespace int_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
// Globals
|
||||
G0 = intRegClass[_G0Idx],
|
||||
G1 = intRegClass[_G1Idx],
|
||||
G2 = intRegClass[_G2Idx],
|
||||
G3 = intRegClass[_G3Idx],
|
||||
G4 = intRegClass[_G4Idx],
|
||||
G5 = intRegClass[_G5Idx],
|
||||
G6 = intRegClass[_G6Idx],
|
||||
G7 = intRegClass[_G7Idx],
|
||||
|
||||
// Outputs
|
||||
O0 = intRegClass[_O0Idx],
|
||||
O1 = intRegClass[_O1Idx],
|
||||
O2 = intRegClass[_O2Idx],
|
||||
O3 = intRegClass[_O3Idx],
|
||||
O4 = intRegClass[_O4Idx],
|
||||
O5 = intRegClass[_O5Idx],
|
||||
O6 = intRegClass[_O6Idx],
|
||||
O7 = intRegClass[_O7Idx],
|
||||
|
||||
// Locals
|
||||
L0 = intRegClass[_L0Idx],
|
||||
L1 = intRegClass[_L1Idx],
|
||||
L2 = intRegClass[_L2Idx],
|
||||
L3 = intRegClass[_L3Idx],
|
||||
L4 = intRegClass[_L4Idx],
|
||||
L5 = intRegClass[_L5Idx],
|
||||
L6 = intRegClass[_L6Idx],
|
||||
L7 = intRegClass[_L7Idx],
|
||||
|
||||
// Inputs
|
||||
I0 = intRegClass[_I0Idx],
|
||||
I1 = intRegClass[_I1Idx],
|
||||
I2 = intRegClass[_I2Idx],
|
||||
I3 = intRegClass[_I3Idx],
|
||||
I4 = intRegClass[_I4Idx],
|
||||
I5 = intRegClass[_I5Idx],
|
||||
I6 = intRegClass[_I6Idx],
|
||||
I7 = intRegClass[_I7Idx],
|
||||
|
||||
Ureg0 = intRegClass[_Ureg0Idx],
|
||||
Y = intRegClass[_YIdx],
|
||||
Ccr = intRegClass[_CcrIdx],
|
||||
Cansave = intRegClass[_CansaveIdx],
|
||||
Canrestore = intRegClass[_CanrestoreIdx],
|
||||
Cleanwin = intRegClass[_CleanwinIdx],
|
||||
Otherwin = intRegClass[_OtherwinIdx],
|
||||
Wstate = intRegClass[_WstateIdx],
|
||||
Gsr = intRegClass[_GsrIdx];
|
||||
|
||||
inline constexpr RegId
|
||||
g(int index)
|
||||
{
|
||||
return intRegClass[G0 + index];
|
||||
}
|
||||
|
||||
inline constexpr RegId
|
||||
o(int index)
|
||||
{
|
||||
return intRegClass[O0 + index];
|
||||
}
|
||||
|
||||
inline constexpr RegId
|
||||
l(int index)
|
||||
{
|
||||
return intRegClass[L0 + index];
|
||||
}
|
||||
|
||||
inline constexpr RegId
|
||||
i(int index)
|
||||
{
|
||||
return intRegClass[I0 + index];
|
||||
}
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
// the rest of these depend on the ABI
|
||||
inline constexpr auto
|
||||
&ReturnAddressReg = int_reg::I7, // post call, precall is 15
|
||||
|
||||
@@ -177,7 +177,7 @@ RemoteGDB::SPARCGdbRegCache::getRegs(ThreadContext *context)
|
||||
{
|
||||
DPRINTF(GDBAcc, "getRegs in remotegdb \n");
|
||||
for (int i = 0; i < 32; i++)
|
||||
r.gpr[i] = htobe((uint32_t)context->getReg(RegId(IntRegClass, i)));
|
||||
r.gpr[i] = htobe((uint32_t)context->getReg(intRegClass[i]));
|
||||
auto &pc = context->pcState().as<SparcISA::PCState>();
|
||||
r.pc = htobe((uint32_t)pc.pc());
|
||||
r.npc = htobe((uint32_t)pc.npc());
|
||||
@@ -193,7 +193,7 @@ RemoteGDB::SPARC64GdbRegCache::getRegs(ThreadContext *context)
|
||||
{
|
||||
DPRINTF(GDBAcc, "getRegs in remotegdb \n");
|
||||
for (int i = 0; i < 32; i++)
|
||||
r.gpr[i] = htobe(context->getReg(RegId(IntRegClass, i)));
|
||||
r.gpr[i] = htobe(context->getReg(intRegClass[i]));
|
||||
for (int i = 0; i < 32; i++)
|
||||
r.fpr[i] = 0;
|
||||
auto &pc = context->pcState().as<SparcISA::PCState>();
|
||||
@@ -214,7 +214,7 @@ void
|
||||
RemoteGDB::SPARCGdbRegCache::setRegs(ThreadContext *context) const
|
||||
{
|
||||
for (int i = 0; i < 32; i++)
|
||||
context->setReg(RegId(IntRegClass, i), r.gpr[i]);
|
||||
context->setReg(intRegClass[i], r.gpr[i]);
|
||||
PCState pc;
|
||||
pc.pc(r.pc);
|
||||
pc.npc(r.npc);
|
||||
@@ -231,7 +231,7 @@ void
|
||||
RemoteGDB::SPARC64GdbRegCache::setRegs(ThreadContext *context) const
|
||||
{
|
||||
for (int i = 0; i < 32; i++)
|
||||
context->setReg(RegId(IntRegClass, i), r.gpr[i]);
|
||||
context->setReg(intRegClass[i], r.gpr[i]);
|
||||
PCState pc;
|
||||
pc.pc(r.pc);
|
||||
pc.npc(r.npc);
|
||||
|
||||
@@ -119,7 +119,7 @@ SEWorkload::flushWindows(ThreadContext *tc)
|
||||
|
||||
Addr addr = is_64 ? sp + 2047 : sp;
|
||||
for (int index = 16; index < 32; index++) {
|
||||
RegId reg(IntRegClass, index);
|
||||
RegId reg = intRegClass[index];
|
||||
if (is_64) {
|
||||
uint64_t regVal = htobe<uint64_t>(tc->getReg(reg));
|
||||
memcpy(bytes, ®Val, reg_bytes);
|
||||
|
||||
@@ -52,8 +52,8 @@ void EmulEnv::doModRM(const ExtMachInst & machInst)
|
||||
//Use the SIB byte for addressing if the modrm byte calls for it.
|
||||
if (machInst.modRM.rm == 4 && machInst.addrSize != 2) {
|
||||
scale = 1 << machInst.sib.scale;
|
||||
index = RegId(IntRegClass, machInst.sib.index | (machInst.rex.x << 3));
|
||||
base = RegId(IntRegClass, machInst.sib.base | (machInst.rex.b << 3));
|
||||
index = intRegClass[machInst.sib.index | (machInst.rex.x << 3)];
|
||||
base = intRegClass[machInst.sib.base | (machInst.rex.b << 3)];
|
||||
//In this special case, we don't use a base. The displacement also
|
||||
//changes, but that's managed by the decoder.
|
||||
if (machInst.sib.base == (RegIndex)int_reg::Rbp &&
|
||||
@@ -72,8 +72,7 @@ void EmulEnv::doModRM(const ExtMachInst & machInst)
|
||||
} else {
|
||||
base = int_reg::Rbp;
|
||||
}
|
||||
index = RegId(IntRegClass,
|
||||
(rm % 2) ? int_reg::Rdi : int_reg::Rsi);
|
||||
index = intRegClass[(rm % 2) ? int_reg::Rdi : int_reg::Rsi];
|
||||
} else {
|
||||
scale = 0;
|
||||
switch (rm) {
|
||||
@@ -95,8 +94,7 @@ void EmulEnv::doModRM(const ExtMachInst & machInst)
|
||||
}
|
||||
} else {
|
||||
scale = 0;
|
||||
base = RegId(IntRegClass,
|
||||
machInst.modRM.rm | (machInst.rex.b << 3));
|
||||
base = intRegClass[machInst.modRM.rm | (machInst.rex.b << 3)];
|
||||
if (machInst.modRM.mod == 0 && machInst.modRM.rm == 5) {
|
||||
//Since we need to use a different encoding of this
|
||||
//instruction anyway, just ignore the base in those cases
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "arch/x86/generated/decoder.hh"
|
||||
#include "arch/x86/insts/static_inst.hh"
|
||||
#include "arch/x86/mmu.hh"
|
||||
#include "arch/x86/regs/int.hh"
|
||||
#include "arch/x86/regs/misc.hh"
|
||||
#include "base/loader/symtab.hh"
|
||||
#include "base/trace.hh"
|
||||
@@ -184,7 +185,7 @@ InitInterrupt::invoke(ThreadContext *tc, const StaticInstPtr &inst)
|
||||
DPRINTF(Faults, "Init interrupt.\n");
|
||||
// The otherwise unmodified integer registers should be set to 0.
|
||||
for (int index = 0; index < int_reg::NumArchRegs; index++) {
|
||||
tc->setReg(RegId(IntRegClass, index), (RegVal)0);
|
||||
tc->setReg(intRegClass[index], (RegVal)0);
|
||||
}
|
||||
|
||||
CR0 cr0 = tc->readMiscReg(misc_reg::Cr0);
|
||||
|
||||
@@ -36,7 +36,9 @@
|
||||
#include <utility>
|
||||
|
||||
#include "arch/x86/insts/static_inst.hh"
|
||||
#include "arch/x86/regs/float.hh"
|
||||
#include "arch/x86/regs/int.hh"
|
||||
#include "arch/x86/regs/misc.hh"
|
||||
#include "arch/x86/regs/segment.hh"
|
||||
#include "arch/x86/types.hh"
|
||||
#include "base/compiler.hh"
|
||||
@@ -144,8 +146,7 @@ struct IntOp : public Base
|
||||
void
|
||||
print(std::ostream &os) const
|
||||
{
|
||||
X86StaticInst::printReg(os, RegId(IntRegClass, this->opIndex()),
|
||||
this->size);
|
||||
X86StaticInst::printReg(os, intRegClass[this->opIndex()], this->size);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -162,8 +163,7 @@ struct FoldedOp : public Base
|
||||
void
|
||||
print(std::ostream &os) const
|
||||
{
|
||||
X86StaticInst::printReg(os, RegId(IntRegClass, this->opIndex()),
|
||||
this->size);
|
||||
X86StaticInst::printReg(os, intRegClass[this->opIndex()], this->size);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -224,8 +224,7 @@ struct MiscOp : public Base
|
||||
void
|
||||
print(std::ostream &os) const
|
||||
{
|
||||
X86StaticInst::printReg(os, RegId(MiscRegClass, this->opIndex()),
|
||||
this->size);
|
||||
X86StaticInst::printReg(os, miscRegClass[this->opIndex()], this->size);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -247,7 +246,7 @@ struct FloatOp : public Base
|
||||
void
|
||||
print(std::ostream &os) const
|
||||
{
|
||||
X86StaticInst::printReg(os, RegId(FloatRegClass, this->opIndex()),
|
||||
X86StaticInst::printReg(os, floatRegClass[this->opIndex()],
|
||||
this->size);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -269,13 +269,13 @@ X86StaticInst::printMem(std::ostream &os, uint8_t segment,
|
||||
if (scale != 0 && index != int_reg::NumRegs) {
|
||||
if (scale != 1)
|
||||
ccprintf(os, "%d*", scale);
|
||||
printReg(os, RegId(IntRegClass, index), addressSize);
|
||||
printReg(os, intRegClass[index], addressSize);
|
||||
someAddr = true;
|
||||
}
|
||||
if (base != int_reg::NumRegs) {
|
||||
if (someAddr)
|
||||
os << " + ";
|
||||
printReg(os, RegId(IntRegClass, base), addressSize);
|
||||
printReg(os, intRegClass[base], addressSize);
|
||||
someAddr = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,20 +188,14 @@ void
|
||||
ISA::copyRegsFrom(ThreadContext *src)
|
||||
{
|
||||
//copy int regs
|
||||
for (int i = 0; i < int_reg::NumRegs; ++i) {
|
||||
RegId reg(IntRegClass, i);
|
||||
tc->setRegFlat(reg, src->getRegFlat(reg));
|
||||
}
|
||||
for (auto &id: intRegClass)
|
||||
tc->setRegFlat(id, src->getRegFlat(id));
|
||||
//copy float regs
|
||||
for (int i = 0; i < float_reg::NumRegs; ++i) {
|
||||
RegId reg(FloatRegClass, i);
|
||||
tc->setRegFlat(reg, src->getRegFlat(reg));
|
||||
}
|
||||
for (auto &id: floatRegClass)
|
||||
tc->setRegFlat(id, src->getRegFlat(id));
|
||||
//copy condition-code regs
|
||||
for (int i = 0; i < cc_reg::NumRegs; ++i) {
|
||||
RegId reg(CCRegClass, i);
|
||||
tc->setRegFlat(reg, src->getRegFlat(reg));
|
||||
}
|
||||
for (auto &id: ccRegClass)
|
||||
tc->setRegFlat(id, src->getRegFlat(id));
|
||||
copyMiscRegs(src, tc);
|
||||
tc->pcState(src->pcState());
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include "arch/generic/isa.hh"
|
||||
#include "arch/x86/pcstate.hh"
|
||||
#include "arch/x86/regs/ccr.hh"
|
||||
#include "arch/x86/regs/float.hh"
|
||||
#include "arch/x86/regs/int.hh"
|
||||
#include "arch/x86/regs/misc.hh"
|
||||
@@ -82,13 +83,13 @@ class ISA : public BaseISA
|
||||
{
|
||||
switch (regId.classValue()) {
|
||||
case IntRegClass:
|
||||
return RegId(IntRegClass, flattenIntIndex(regId.index()));
|
||||
return intRegClass[flattenIntIndex(regId.index())];
|
||||
case FloatRegClass:
|
||||
return RegId(FloatRegClass, flattenFloatIndex(regId.index()));
|
||||
return floatRegClass[flattenFloatIndex(regId.index())];
|
||||
case CCRegClass:
|
||||
return RegId(CCRegClass, flattenCCIndex(regId.index()));
|
||||
return ccRegClass[flattenCCIndex(regId.index())];
|
||||
case MiscRegClass:
|
||||
return RegId(MiscRegClass, flattenMiscIndex(regId.index()));
|
||||
return miscRegClass[flattenMiscIndex(regId.index())];
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ let {{
|
||||
else:
|
||||
regString = "env.reg"
|
||||
env.addToDisassembly(
|
||||
"printReg(out, RegId(IntRegClass, %s), regSize);\n" %
|
||||
"printReg(out, intRegClass[%s], regSize);\n" %
|
||||
regString)
|
||||
|
||||
Name += "_R"
|
||||
@@ -170,7 +170,7 @@ let {{
|
||||
# This refers to registers whose index is encoded as part of
|
||||
# the opcode.
|
||||
env.addToDisassembly(
|
||||
"printReg(out, RegId(IntRegClass, %s), regSize);\n" %
|
||||
"printReg(out, intRegClass[%s], regSize);\n" %
|
||||
InstRegIndex)
|
||||
|
||||
Name += "_R"
|
||||
@@ -216,7 +216,7 @@ let {{
|
||||
Name += "_XMM"
|
||||
else:
|
||||
regFormat = \
|
||||
"printReg(out, RegId(IntRegClass, %s), regSize);\n"
|
||||
"printReg(out, intRegClass[%s], regSize);\n"
|
||||
Name += "_R"
|
||||
env.addToDisassembly(regFormat % ModRMRegIndex)
|
||||
elif opType.tag in ("E", "Q", "W"):
|
||||
@@ -238,7 +238,7 @@ let {{
|
||||
regSuffix = "_XMM"
|
||||
else:
|
||||
regFormat = \
|
||||
"printReg(out, RegId(IntRegClass, %s), regSize);\n"
|
||||
"printReg(out, intRegClass[%s], regSize);\n"
|
||||
regSuffix = "_R"
|
||||
env.addToDisassembly(regFormat % ModRMRegIndex)
|
||||
return doSplitDecode("MODRM_MOD",
|
||||
@@ -266,7 +266,7 @@ let {{
|
||||
Name += "_XMM"
|
||||
else:
|
||||
regFormat = \
|
||||
"printReg(out, RegId(IntRegClass, %s), regSize);\n"
|
||||
"printReg(out, intRegClass[%s], regSize);\n"
|
||||
Name += "_R"
|
||||
env.addToDisassembly(regFormat % ModRMRegIndex)
|
||||
elif opType.tag in ("X", "Y"):
|
||||
|
||||
@@ -59,18 +59,23 @@ enum : RegIndex
|
||||
NumRegs
|
||||
};
|
||||
|
||||
inline constexpr RegId
|
||||
Zaps(CCRegClass, _ZapsIdx),
|
||||
Cfof(CCRegClass, _CfofIdx),
|
||||
Df(CCRegClass, _DfIdx),
|
||||
Ecf(CCRegClass, _EcfIdx),
|
||||
Ezf(CCRegClass, _EzfIdx);
|
||||
|
||||
} // namespace cc_reg
|
||||
|
||||
inline constexpr RegClass ccRegClass(CCRegClass, cc_reg::NumRegs,
|
||||
debug::CCRegs);
|
||||
|
||||
namespace cc_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
Zaps = ccRegClass[_ZapsIdx],
|
||||
Cfof = ccRegClass[_CfofIdx],
|
||||
Df = ccRegClass[_DfIdx],
|
||||
Ecf = ccRegClass[_EcfIdx],
|
||||
Ezf = ccRegClass[_EzfIdx];
|
||||
|
||||
} // namespace cc_reg
|
||||
|
||||
} // namespace X86ISA
|
||||
} // namespace gem5
|
||||
|
||||
|
||||
@@ -119,40 +119,48 @@ enum FloatRegIndex
|
||||
NumRegs = MicrofpBase + NumMicroFpRegs
|
||||
};
|
||||
|
||||
} // namespace float_reg
|
||||
|
||||
inline constexpr RegClass floatRegClass(FloatRegClass, float_reg::NumRegs,
|
||||
debug::FloatRegs);
|
||||
|
||||
namespace float_reg
|
||||
{
|
||||
|
||||
static inline RegId
|
||||
mmx(int index)
|
||||
{
|
||||
return RegId(FloatRegClass, MmxBase + index);
|
||||
return floatRegClass[MmxBase + index];
|
||||
}
|
||||
|
||||
static inline RegId
|
||||
fpr(int index)
|
||||
{
|
||||
return RegId(FloatRegClass, FprBase + index);
|
||||
return floatRegClass[FprBase + index];
|
||||
}
|
||||
|
||||
static inline RegId
|
||||
xmm(int index)
|
||||
{
|
||||
return RegId(FloatRegClass, XmmBase + index);
|
||||
return floatRegClass[XmmBase + index];
|
||||
}
|
||||
|
||||
static inline RegId
|
||||
xmmLow(int index)
|
||||
{
|
||||
return RegId(FloatRegClass, XmmBase + 2 * index);
|
||||
return floatRegClass[XmmBase + 2 * index];
|
||||
}
|
||||
|
||||
static inline RegId
|
||||
xmmHigh(int index)
|
||||
{
|
||||
return RegId(FloatRegClass, XmmBase + 2 * index + 1);
|
||||
return floatRegClass[XmmBase + 2 * index + 1];
|
||||
}
|
||||
|
||||
static inline RegId
|
||||
microfp(int index)
|
||||
{
|
||||
return RegId(FloatRegClass, MicrofpBase + index);
|
||||
return floatRegClass[MicrofpBase + index];
|
||||
}
|
||||
|
||||
static inline RegId
|
||||
@@ -163,9 +171,6 @@ stack(int index, int top)
|
||||
|
||||
} // namespace float_reg
|
||||
|
||||
inline constexpr RegClass floatRegClass(FloatRegClass, float_reg::NumRegs,
|
||||
debug::FloatRegs);
|
||||
|
||||
} // namespace X86ISA
|
||||
} // namespace gem5
|
||||
|
||||
|
||||
@@ -100,30 +100,38 @@ enum : RegIndex
|
||||
NumRegs
|
||||
};
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
namespace int_reg
|
||||
{
|
||||
|
||||
inline constexpr RegId
|
||||
Rax(IntRegClass, _RaxIdx),
|
||||
Rcx(IntRegClass, _RcxIdx),
|
||||
Rdx(IntRegClass, _RdxIdx),
|
||||
Rbx(IntRegClass, _RbxIdx),
|
||||
Rsp(IntRegClass, _RspIdx),
|
||||
Rbp(IntRegClass, _RbpIdx),
|
||||
Rsi(IntRegClass, _RsiIdx),
|
||||
Rdi(IntRegClass, _RdiIdx),
|
||||
R8(IntRegClass, _R8Idx),
|
||||
R9(IntRegClass, _R9Idx),
|
||||
R10(IntRegClass, _R10Idx),
|
||||
R11(IntRegClass, _R11Idx),
|
||||
R12(IntRegClass, _R12Idx),
|
||||
R13(IntRegClass, _R13Idx),
|
||||
R14(IntRegClass, _R14Idx),
|
||||
R15(IntRegClass, _R15Idx),
|
||||
T0(IntRegClass, _T0Idx),
|
||||
Prodlow(IntRegClass, _ProdlowIdx),
|
||||
Prodhi(IntRegClass, _ProdhiIdx),
|
||||
Quotient(IntRegClass, _QuotientIdx),
|
||||
Remainder(IntRegClass, _RemainderIdx),
|
||||
Divisor(IntRegClass, _DivisorIdx),
|
||||
Doublebits(IntRegClass, _DoublebitsIdx);
|
||||
Rax = intRegClass[_RaxIdx],
|
||||
Rcx = intRegClass[_RcxIdx],
|
||||
Rdx = intRegClass[_RdxIdx],
|
||||
Rbx = intRegClass[_RbxIdx],
|
||||
Rsp = intRegClass[_RspIdx],
|
||||
Rbp = intRegClass[_RbpIdx],
|
||||
Rsi = intRegClass[_RsiIdx],
|
||||
Rdi = intRegClass[_RdiIdx],
|
||||
R8 = intRegClass[_R8Idx],
|
||||
R9 = intRegClass[_R9Idx],
|
||||
R10 = intRegClass[_R10Idx],
|
||||
R11 = intRegClass[_R11Idx],
|
||||
R12 = intRegClass[_R12Idx],
|
||||
R13 = intRegClass[_R13Idx],
|
||||
R14 = intRegClass[_R14Idx],
|
||||
R15 = intRegClass[_R15Idx],
|
||||
T0 = intRegClass[_T0Idx],
|
||||
Prodlow = intRegClass[_ProdlowIdx],
|
||||
Prodhi = intRegClass[_ProdhiIdx],
|
||||
Quotient = intRegClass[_QuotientIdx],
|
||||
Remainder = intRegClass[_RemainderIdx],
|
||||
Divisor = intRegClass[_DivisorIdx],
|
||||
Doublebits = intRegClass[_DoublebitsIdx];
|
||||
|
||||
// Aliases for other register sizes.
|
||||
inline constexpr auto
|
||||
@@ -146,16 +154,13 @@ inline constexpr auto
|
||||
|
||||
} // namespace int_reg
|
||||
|
||||
inline constexpr RegClass intRegClass(IntRegClass, int_reg::NumRegs,
|
||||
debug::IntRegs);
|
||||
|
||||
// This needs to be large enough to miss all the other bits of an index.
|
||||
inline constexpr RegIndex IntFoldBit = 1 << 6;
|
||||
|
||||
inline static constexpr RegId
|
||||
intRegMicro(int index)
|
||||
{
|
||||
return RegId(IntRegClass, int_reg::MicroBegin + index);
|
||||
return intRegClass[int_reg::MicroBegin + index];
|
||||
}
|
||||
|
||||
inline static constexpr RegId
|
||||
@@ -163,7 +168,7 @@ intRegFolded(RegIndex index, RegIndex foldBit)
|
||||
{
|
||||
if ((index & 0x1C) == 4 && foldBit)
|
||||
index = (index - 4) | foldBit;
|
||||
return RegId(IntRegClass, index);
|
||||
return intRegClass[index];
|
||||
}
|
||||
|
||||
} // namespace X86ISA
|
||||
|
||||
Reference in New Issue
Block a user