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:
Korey Sewell 2011-06-19 21:43:41 -04:00
parent 8c0def8d03
commit 2dae0e8735
3 changed files with 13 additions and 8 deletions

View file

@ -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();

View file

@ -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.

View file

@ -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());