ARM: Keep a copy of the fpscr len and stride fields in the decoder.

Avoid reading them every instruction, and also eliminate the last use of the
thread context in the decoders.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>
This commit is contained in:
Gabe Black
2013-01-04 18:09:35 -06:00
parent 1945f9963d
commit a83e74b37a
4 changed files with 15 additions and 5 deletions

View File

@@ -113,9 +113,8 @@ Decoder::moreBytes(const PCState &pc, Addr fetchPC, MachInst inst)
data = inst;
offset = (fetchPC >= pc.instAddr()) ? 0 : pc.instAddr() - fetchPC;
emi.thumb = pc.thumb();
FPSCR fpscr = tc->readMiscReg(MISCREG_FPSCR);
emi.fpscrLen = fpscr.len;
emi.fpscrStride = fpscr.stride;
emi.fpscrLen = fpscrLen;
emi.fpscrStride = fpscrStride;
outOfBytes = false;
process();

View File

@@ -58,6 +58,9 @@ class Decoder
bool foundIt;
ITSTATE itBits;
int fpscrLen;
int fpscrStride;
public:
void reset()
{
@@ -69,7 +72,8 @@ class Decoder
foundIt = false;
}
Decoder(ThreadContext * _tc) : tc(_tc), data(0)
Decoder(ThreadContext * _tc) : tc(_tc), data(0),
fpscrLen(0), fpscrStride(0)
{
reset();
}
@@ -121,6 +125,12 @@ class Decoder
return (!emi.thumb || emi.bigThumb) ? 4 : 2;
}
void setContext(FPSCR fpscr)
{
fpscrLen = fpscr.len;
fpscrStride = fpscr.stride;
}
protected:
/// A cache of decoded instruction objects.
static GenericISA::BasicDecodeCache defaultCache;

View File

@@ -381,6 +381,7 @@ ISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
fpscrMask.n = ones;
newVal = (newVal & (uint32_t)fpscrMask) |
(miscRegs[MISCREG_FPSCR] & ~(uint32_t)fpscrMask);
tc->getDecodePtr()->setContext(newVal);
}
break;
case MISCREG_CPSR_Q:

View File

@@ -293,7 +293,7 @@ RemoteGDB::setregs()
}
//FPSCR
context->setMiscRegNoEffect(MISCREG_FPSCR, gdbregs.regs[REG_FPSCR]>>32);
context->setMiscReg(MISCREG_FPSCR, gdbregs.regs[REG_FPSCR]>>32);
}
void