26a27,28
> *
> * Authors: Kevin Lim
35,37c37,42
< // @todo: Consider making inline bool functions that determine if the
< // register is a logical int, logical fp, physical int, physical fp,
< // etc.
---
> // Todo: Consider making functions inline. Avoid having things that are
> // using the zero register or misc registers from adding on the registers
> // to the free list. Possibly remove the direct communication between
> // this and the freelist. Considering making inline bool functions that
> // determine if the register is a logical int, logical fp, physical int,
> // physical fp, etc.
39c44,57
< SimpleRenameMap::~SimpleRenameMap()
---
> SimpleRenameMap::SimpleRenameMap(unsigned _numLogicalIntRegs,
> unsigned _numPhysicalIntRegs,
> unsigned _numLogicalFloatRegs,
> unsigned _numPhysicalFloatRegs,
> unsigned _numMiscRegs,
> RegIndex _intZeroReg,
> RegIndex _floatZeroReg)
> : numLogicalIntRegs(_numLogicalIntRegs),
> numPhysicalIntRegs(_numPhysicalIntRegs),
> numLogicalFloatRegs(_numLogicalFloatRegs),
> numPhysicalFloatRegs(_numPhysicalFloatRegs),
> numMiscRegs(_numMiscRegs),
> intZeroReg(_intZeroReg),
> floatZeroReg(_floatZeroReg)
41,76c59,60
< }
<
< void
< SimpleRenameMap::init(unsigned _numLogicalIntRegs,
< unsigned _numPhysicalIntRegs,
< PhysRegIndex &ireg_idx,
<
< unsigned _numLogicalFloatRegs,
< unsigned _numPhysicalFloatRegs,
< PhysRegIndex &freg_idx,
<
< unsigned _numMiscRegs,
<
< RegIndex _intZeroReg,
< RegIndex _floatZeroReg,
<
< int map_id,
< bool bindRegs)
< {
< id = map_id;
<
< numLogicalIntRegs = _numLogicalIntRegs;
<
< numLogicalFloatRegs = _numLogicalFloatRegs;
<
< numPhysicalIntRegs = _numPhysicalIntRegs;
<
< numPhysicalFloatRegs = _numPhysicalFloatRegs;
<
< numMiscRegs = _numMiscRegs;
<
< intZeroReg = _intZeroReg;
< floatZeroReg = _floatZeroReg;
<
< DPRINTF(Rename, "Creating rename map %i. Phys: %i / %i, Float: "
< "%i / %i.\n", id, numLogicalIntRegs, numPhysicalIntRegs,
---
> DPRINTF(Rename, "Rename: Creating rename map. Phys: %i / %i, Float: "
> "%i / %i.\n", numLogicalIntRegs, numPhysicalIntRegs,
83,85c67,69
< //Create the rename maps
< intRenameMap.resize(numLogicalIntRegs);
< floatRenameMap.resize(numLogicalRegs);
---
> //Create the rename maps, and their scoreboards.
> intRenameMap = new RenameEntry[numLogicalIntRegs];
> floatRenameMap = new RenameEntry[numLogicalRegs];
87,88c71,74
< if (bindRegs) {
< DPRINTF(Rename, "Binding registers into rename map %i",id);
---
> // Should combine this into one scoreboard.
> intScoreboard.resize(numPhysicalIntRegs);
> floatScoreboard.resize(numPhysicalRegs);
> miscScoreboard.resize(numPhysicalRegs + numMiscRegs);
90,95c76,83
< // Initialize the entries in the integer rename map to point to the
< // physical registers of the same index
< for (RegIndex index = 0; index < numLogicalIntRegs; ++index)
< {
< intRenameMap[index].physical_reg = ireg_idx++;
< }
---
> // Initialize the entries in the integer rename map to point to the
> // physical registers of the same index, and consider each register
> // ready until the first rename occurs.
> for (RegIndex index = 0; index < numLogicalIntRegs; ++index)
> {
> intRenameMap[index].physical_reg = index;
> intScoreboard[index] = 1;
> }
97,108c85,92
< // Initialize the entries in the floating point rename map to point to
< // the physical registers of the same index
< // Although the index refers purely to architected registers, because
< // the floating reg indices come after the integer reg indices, they
< // may exceed the size of a normal RegIndex (short).
< for (PhysRegIndex index = numLogicalIntRegs;
< index < numLogicalRegs; ++index)
< {
< floatRenameMap[index].physical_reg = freg_idx++;
< }
< } else {
< DPRINTF(Rename, "Binding registers into rename map %i",id);
---
> // Initialize the rest of the physical registers (the ones that don't
> // directly map to a logical register) as unready.
> for (PhysRegIndex index = numLogicalIntRegs;
> index < numPhysicalIntRegs;
> ++index)
> {
> intScoreboard[index] = 0;
> }
110c94
< PhysRegIndex temp_ireg = ireg_idx;
---
> int float_reg_idx = numPhysicalIntRegs;
112,115c96,106
< for (RegIndex index = 0; index < numLogicalIntRegs; ++index)
< {
< intRenameMap[index].physical_reg = temp_ireg++;
< }
---
> // Initialize the entries in the floating point rename map to point to
> // the physical registers of the same index, and consider each register
> // ready until the first rename occurs.
> // Although the index refers purely to architected registers, because
> // the floating reg indices come after the integer reg indices, they
> // may exceed the size of a normal RegIndex (short).
> for (PhysRegIndex index = numLogicalIntRegs;
> index < numLogicalRegs; ++index)
> {
> floatRenameMap[index].physical_reg = float_reg_idx++;
> }
117c108,112
< PhysRegIndex temp_freg = freg_idx;
---
> for (PhysRegIndex index = numPhysicalIntRegs;
> index < numPhysicalIntRegs + numLogicalFloatRegs; ++index)
> {
> floatScoreboard[index] = 1;
> }
119,123c114,120
< for (PhysRegIndex index = numLogicalIntRegs;
< index < numLogicalRegs; ++index)
< {
< floatRenameMap[index].physical_reg = temp_freg++;
< }
---
> // Initialize the rest of the physical registers (the ones that don't
> // directly map to a logical register) as unready.
> for (PhysRegIndex index = numPhysicalIntRegs + numLogicalFloatRegs;
> index < numPhysicalRegs;
> ++index)
> {
> floatScoreboard[index] = 0;
124a122,128
>
> // Initialize the entries in the misc register scoreboard to be ready.
> for (PhysRegIndex index = numPhysicalRegs;
> index < numPhysicalRegs + numMiscRegs; ++index)
> {
> miscScoreboard[index] = 1;
> }
126a131,137
> SimpleRenameMap::~SimpleRenameMap()
> {
> // Delete the rename maps as they were allocated with new.
> delete [] intRenameMap;
> delete [] floatRenameMap;
> }
>
129a141
> //Setup the interface to the freelist.
133a146,148
> // Don't allow this stage to fault; force that check to the rename stage.
> // Simply ask to rename a logical register and get back a new physical
> // register index.
146,147c161,162
< // If it's not referencing the zero register, then rename the
< // register.
---
> // If it's not referencing the zero register, then mark the register
> // as not ready.
148a164
> // Get a free physical register to rename to.
150a167
> // Update the integer rename map.
154a172,173
> // Mark register as not ready.
> intScoreboard[renamed_reg] = false;
159a179,181
> // Subtract off the base offset for floating point registers.
> // arch_reg = arch_reg - numLogicalIntRegs;
>
164,165c186,187
< // If it's not referencing the zero register, then rename the
< // register.
---
> // If it's not referencing the zero register, then mark the register
> // as not ready.
166a189
> // Get a free floating point register to rename to.
168a192
> // Update the floating point rename map.
172a197,199
>
> // Mark register as not ready.
> floatScoreboard[renamed_reg] = false;
181,184c208,211
< // No renaming happens to the misc. registers. They are
< // simply the registers that come after all the physical
< // registers; thus take the base architected register and add
< // the physical registers to it.
---
> // No renaming happens to the misc. registers. They are simply the
> // registers that come after all the physical registers; thus
> // take the base architected register and add the physical registers
> // to it.
192a220,221
>
> miscScoreboard[renamed_reg] = false;
197a227,228
> //Perhaps give this a pair as a return value, of the physical register
> //and whether or not it's ready.
203a235,237
> // Subtract off the base FP offset.
> // arch_reg = arch_reg - numLogicalIntRegs;
>
214a249,269
> bool
> SimpleRenameMap::isReady(PhysRegIndex phys_reg)
> {
> if (phys_reg < numPhysicalIntRegs) {
> return intScoreboard[phys_reg];
> } else if (phys_reg < numPhysicalRegs) {
>
> // Subtract off the base FP offset.
> // phys_reg = phys_reg - numPhysicalIntRegs;
>
> return floatScoreboard[phys_reg];
> } else {
> // Subtract off the misc registers offset.
> // phys_reg = phys_reg - numPhysicalRegs;
>
> return miscScoreboard[phys_reg];
> }
> }
>
> // In this implementation the miscellaneous registers do not actually rename,
> // so this function does not allow you to try to change their mappings.
218,220d272
< // In this implementation the miscellaneous registers do not
< // actually rename, so this function does not allow you to try to
< // change their mappings.
226c278,280
< } else if (arch_reg < numLogicalIntRegs + numLogicalFloatRegs) {
---
> } else {
> assert(arch_reg < (numLogicalIntRegs + numLogicalFloatRegs));
>
233a288,336
> void
> SimpleRenameMap::squash(vector<RegIndex> freed_regs,
> vector<UnmapInfo> unmaps)
> {
> panic("Not sure this function should be called.");
>
> // Not sure the rename map should be able to access the free list
> // like this.
> while (!freed_regs.empty()) {
> RegIndex free_register = freed_regs.back();
>
> if (free_register < numPhysicalIntRegs) {
> freeList->addIntReg(free_register);
> } else {
> // Subtract off the base FP dependence tag.
> free_register = free_register - numPhysicalIntRegs;
> freeList->addFloatReg(free_register);
> }
>
> freed_regs.pop_back();
> }
>
> // Take unmap info and roll back the rename map.
> }
>
> void
> SimpleRenameMap::markAsReady(PhysRegIndex ready_reg)
> {
> DPRINTF(Rename, "Rename map: Marking register %i as ready.\n",
> (int)ready_reg);
>
> if (ready_reg < numPhysicalIntRegs) {
> assert(ready_reg >= 0);
>
> intScoreboard[ready_reg] = 1;
> } else if (ready_reg < numPhysicalRegs) {
>
> // Subtract off the base FP offset.
> // ready_reg = ready_reg - numPhysicalIntRegs;
>
> floatScoreboard[ready_reg] = 1;
> } else {
> //Subtract off the misc registers offset.
> // ready_reg = ready_reg - numPhysicalRegs;
>
> miscScoreboard[ready_reg] = 1;
> }
> }
>