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:
parent
8e79c68936
commit
ca96e7bff1
1 changed files with 11 additions and 1 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue