cpu: Avoid duplicate entries in tracking structures for writes to misc regs

setMiscReg currently makes a new entry for each write to a misc reg without
checking for duplicates, this can cause a triggering of the assert if an
instruction get replayed and writes to the same misc regs multiple times.
This fix prevents duplicate entries and instead updates the value.
This commit is contained in:
Geoffrey Blake 2013-02-15 17:40:10 -05:00
parent 8e79c68936
commit ca96e7bff1

View file

@ -149,8 +149,18 @@ class BaseO3DynInst : public BaseDynInst<Impl>
void setMiscReg(int misc_reg, const MiscReg &val) void setMiscReg(int misc_reg, const MiscReg &val)
{ {
/** Writes to misc. registers are recorded and deferred until the /** Writes to misc. registers are recorded and deferred until the
* commit stage, when updateMiscRegs() is called. * commit stage, when updateMiscRegs() is called. First, check if
* the misc reg has been written before and update its value to be
* committed instead of making a new entry. If not, make a new
* entry and record the write.
*/ */
for (int idx = 0; idx < _numDestMiscRegs; idx++) {
if (_destMiscRegIdx[idx] == misc_reg) {
_destMiscRegVal[idx] = val;
return;
}
}
assert(_numDestMiscRegs < TheISA::MaxMiscDestRegs); assert(_numDestMiscRegs < TheISA::MaxMiscDestRegs);
_destMiscRegIdx[_numDestMiscRegs] = misc_reg; _destMiscRegIdx[_numDestMiscRegs] = misc_reg;
_destMiscRegVal[_numDestMiscRegs] = val; _destMiscRegVal[_numDestMiscRegs] = val;