inorder: use separate float-reg bits function in dyninst
this will make sure we get the correct view of a FP register
This commit is contained in:
parent
8c0def8d03
commit
2dae0e8735
3 changed files with 13 additions and 8 deletions
|
@ -500,8 +500,8 @@ InOrderDynInst::setIntRegOperand(const StaticInst *si, int idx, IntReg val)
|
||||||
void
|
void
|
||||||
InOrderDynInst::setFloatRegOperand(const StaticInst *si, int idx, FloatReg val)
|
InOrderDynInst::setFloatRegOperand(const StaticInst *si, int idx, FloatReg val)
|
||||||
{
|
{
|
||||||
instResult[idx].res.fpVal.f = val;
|
|
||||||
instResult[idx].type = Float;
|
instResult[idx].type = Float;
|
||||||
|
instResult[idx].res.fpVal.f = val;
|
||||||
instResult[idx].tick = curTick();
|
instResult[idx].tick = curTick();
|
||||||
|
|
||||||
DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Result Float Reg. %i "
|
DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Result Float Reg. %i "
|
||||||
|
@ -514,7 +514,7 @@ void
|
||||||
InOrderDynInst::setFloatRegOperandBits(const StaticInst *si, int idx,
|
InOrderDynInst::setFloatRegOperandBits(const StaticInst *si, int idx,
|
||||||
FloatRegBits val)
|
FloatRegBits val)
|
||||||
{
|
{
|
||||||
instResult[idx].type = Integer;
|
instResult[idx].type = FloatBits;
|
||||||
instResult[idx].res.fpVal.i = val;
|
instResult[idx].res.fpVal.i = val;
|
||||||
instResult[idx].tick = curTick();
|
instResult[idx].tick = curTick();
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,7 @@ class InOrderDynInst : public FastAlloc, public RefCounted
|
||||||
None,
|
None,
|
||||||
Integer,
|
Integer,
|
||||||
Float,
|
Float,
|
||||||
|
FloatBits,
|
||||||
Double
|
Double
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -889,7 +890,7 @@ class InOrderDynInst : public FastAlloc, public RefCounted
|
||||||
return instResult[idx].type;
|
return instResult[idx].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t readIntResult(int idx)
|
IntReg readIntResult(int idx)
|
||||||
{
|
{
|
||||||
return instResult[idx].res.intVal;
|
return instResult[idx].res.intVal;
|
||||||
}
|
}
|
||||||
|
@ -899,9 +900,14 @@ class InOrderDynInst : public FastAlloc, public RefCounted
|
||||||
return instResult[idx].res.fpVal.f;
|
return instResult[idx].res.fpVal.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FloatRegBits readFloatBitsResult(int idx)
|
||||||
|
{
|
||||||
|
return instResult[idx].res.fpVal.i;
|
||||||
|
}
|
||||||
|
|
||||||
Tick readResultTime(int idx) { return instResult[idx].tick; }
|
Tick readResultTime(int idx) { return instResult[idx].tick; }
|
||||||
|
|
||||||
uint64_t* getIntResultPtr(int idx) { return &instResult[idx].res.intVal; }
|
IntReg* getIntResultPtr(int idx) { return &instResult[idx].res.intVal; }
|
||||||
|
|
||||||
/** This is the interface that an instruction will use to write
|
/** This is the interface that an instruction will use to write
|
||||||
* it's destination register.
|
* it's destination register.
|
||||||
|
|
|
@ -404,18 +404,18 @@ UseDefUnit::execute(int slot_idx)
|
||||||
regDepMap[tid]->removeFront(reg_type, flat_idx, inst);
|
regDepMap[tid]->removeFront(reg_type, flat_idx, inst);
|
||||||
|
|
||||||
if (inst->resultType(ud_idx) ==
|
if (inst->resultType(ud_idx) ==
|
||||||
InOrderDynInst::Integer) {
|
InOrderDynInst::FloatBits) {
|
||||||
DPRINTF(InOrderUseDef, "[tid:%i]: [sn:%i]: Writing FP-Bits "
|
DPRINTF(InOrderUseDef, "[tid:%i]: [sn:%i]: Writing FP-Bits "
|
||||||
"Result %08f (bits:0x%x) to register "
|
"Result %08f (bits:0x%x) to register "
|
||||||
"idx %i (%i).\n",
|
"idx %i (%i).\n",
|
||||||
tid, seq_num,
|
tid, seq_num,
|
||||||
inst->readFloatResult(ud_idx),
|
inst->readFloatResult(ud_idx),
|
||||||
inst->readIntResult(ud_idx),
|
inst->readFloatBitsResult(ud_idx),
|
||||||
reg_idx - FP_Base_DepTag, flat_idx);
|
reg_idx - FP_Base_DepTag, flat_idx);
|
||||||
|
|
||||||
// Check for FloatRegBits Here
|
// Check for FloatRegBits Here
|
||||||
cpu->setFloatRegBits(flat_idx,
|
cpu->setFloatRegBits(flat_idx,
|
||||||
inst->readIntResult(ud_idx),
|
inst->readFloatBitsResult(ud_idx),
|
||||||
inst->readTid());
|
inst->readTid());
|
||||||
} else if (inst->resultType(ud_idx) ==
|
} else if (inst->resultType(ud_idx) ==
|
||||||
InOrderDynInst::Float) {
|
InOrderDynInst::Float) {
|
||||||
|
@ -439,7 +439,6 @@ UseDefUnit::execute(int slot_idx)
|
||||||
inst->readIntResult(ud_idx),
|
inst->readIntResult(ud_idx),
|
||||||
reg_idx - FP_Base_DepTag, flat_idx);
|
reg_idx - FP_Base_DepTag, flat_idx);
|
||||||
|
|
||||||
// Check for FloatRegBits Here
|
|
||||||
cpu->setFloatReg(flat_idx,
|
cpu->setFloatReg(flat_idx,
|
||||||
inst->readFloatResult(ud_idx),
|
inst->readFloatResult(ud_idx),
|
||||||
inst->readTid());
|
inst->readTid());
|
||||||
|
|
Loading…
Reference in a new issue