37,42c37,39
< // 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.
---
> // @todo: Consider making inline bool functions that determine if the
> // register is a logical int, logical fp, physical int, physical fp,
> // etc.
44,57c41
< 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)
---
> SimpleRenameMap::~SimpleRenameMap()
59,60c43,78
< DPRINTF(Rename, "Rename: Creating rename map. Phys: %i / %i, Float: "
< "%i / %i.\n", numLogicalIntRegs, numPhysicalIntRegs,
---
> }
>
> 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,
67,69c85,87
< //Create the rename maps, and their scoreboards.
< intRenameMap = new RenameEntry[numLogicalIntRegs];
< floatRenameMap = new RenameEntry[numLogicalRegs];
---
> //Create the rename maps
> intRenameMap.resize(numLogicalIntRegs);
> floatRenameMap.resize(numLogicalRegs);
71,74c89,90
< // Should combine this into one scoreboard.
< intScoreboard.resize(numPhysicalIntRegs);
< floatScoreboard.resize(numPhysicalRegs);
< miscScoreboard.resize(numPhysicalRegs + numMiscRegs);
---
> if (bindRegs) {
> DPRINTF(Rename, "Binding registers into rename map %i",id);
76,83c92,97
< // 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;
< }
---
> // 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++;
> }
85,92c99,110
< // 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;
< }
---
> // 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);
94c112
< int float_reg_idx = numPhysicalIntRegs;
---
> PhysRegIndex temp_ireg = ireg_idx;
96,106c114,117
< // 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++;
< }
---
> for (RegIndex index = 0; index < numLogicalIntRegs; ++index)
> {
> intRenameMap[index].physical_reg = temp_ireg++;
> }
108,112c119
< for (PhysRegIndex index = numPhysicalIntRegs;
< index < numPhysicalIntRegs + numLogicalFloatRegs; ++index)
< {
< floatScoreboard[index] = 1;
< }
---
> PhysRegIndex temp_freg = freg_idx;
114,120c121,125
< // 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;
---
> for (PhysRegIndex index = numLogicalIntRegs;
> index < numLogicalRegs; ++index)
> {
> floatRenameMap[index].physical_reg = temp_freg++;
> }
122,128d126
<
< // Initialize the entries in the misc register scoreboard to be ready.
< for (PhysRegIndex index = numPhysicalRegs;
< index < numPhysicalRegs + numMiscRegs; ++index)
< {
< miscScoreboard[index] = 1;
< }
131,137d128
< SimpleRenameMap::~SimpleRenameMap()
< {
< // Delete the rename maps as they were allocated with new.
< delete [] intRenameMap;
< delete [] floatRenameMap;
< }
<
141d131
< //Setup the interface to the freelist.
146,148d135
< // 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.
161,162c148,149
< // If it's not referencing the zero register, then mark the register
< // as not ready.
---
> // If it's not referencing the zero register, then rename the
> // register.
164d150
< // Get a free physical register to rename to.
167d152
< // Update the integer rename map.
172,173d156
< // Mark register as not ready.
< intScoreboard[renamed_reg] = false;
179,181d161
< // Subtract off the base offset for floating point registers.
< // arch_reg = arch_reg - numLogicalIntRegs;
<
186,187c166,167
< // If it's not referencing the zero register, then mark the register
< // as not ready.
---
> // If it's not referencing the zero register, then rename the
> // register.
189d168
< // Get a free floating point register to rename to.
192d170
< // Update the floating point rename map.
197,199d174
<
< // Mark register as not ready.
< floatScoreboard[renamed_reg] = false;
208,211c183,186
< // 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.
220,221d194
<
< miscScoreboard[renamed_reg] = false;
227,228d199
< //Perhaps give this a pair as a return value, of the physical register
< //and whether or not it's ready.
235,237d205
< // Subtract off the base FP offset.
< // arch_reg = arch_reg - numLogicalIntRegs;
<
249,269d216
< 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.
272a220,222
> // In this implementation the miscellaneous registers do not
> // actually rename, so this function does not allow you to try to
> // change their mappings.
278,280c228
< } else {
< assert(arch_reg < (numLogicalIntRegs + numLogicalFloatRegs));
<
---
> } else if (arch_reg < numLogicalIntRegs + numLogicalFloatRegs) {
288,336d235
< 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;
< }
< }
<