35,40c35,37
< // 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.
42,55c39
< 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()
57,58c41,76
< 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,
65,67c83,85
< //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);
69,72c87,88
< // 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);
74,81c90,95
< // 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++;
> }
83,90c97,108
< // 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);
92c110
< int float_reg_idx = numPhysicalIntRegs;
---
> PhysRegIndex temp_ireg = ireg_idx;
94,104c112,115
< // 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++;
> }
106,110c117
< for (PhysRegIndex index = numPhysicalIntRegs;
< index < numPhysicalIntRegs + numLogicalFloatRegs; ++index)
< {
< floatScoreboard[index] = 1;
< }
---
> PhysRegIndex temp_freg = freg_idx;
112,118c119,123
< // 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++;
> }
120,126d124
<
< // Initialize the entries in the misc register scoreboard to be ready.
< for (PhysRegIndex index = numPhysicalRegs;
< index < numPhysicalRegs + numMiscRegs; ++index)
< {
< miscScoreboard[index] = 1;
< }
129,135d126
< SimpleRenameMap::~SimpleRenameMap()
< {
< // Delete the rename maps as they were allocated with new.
< delete [] intRenameMap;
< delete [] floatRenameMap;
< }
<
139d129
< //Setup the interface to the freelist.
144,146d133
< // 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.
159,160c146,147
< // 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.
162d148
< // Get a free physical register to rename to.
165d150
< // Update the integer rename map.
170,171d154
< // Mark register as not ready.
< intScoreboard[renamed_reg] = false;
177,179d159
< // Subtract off the base offset for floating point registers.
< // arch_reg = arch_reg - numLogicalIntRegs;
<
184,185c164,165
< // 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.
187d166
< // Get a free floating point register to rename to.
190d168
< // Update the floating point rename map.
195,197d172
<
< // Mark register as not ready.
< floatScoreboard[renamed_reg] = false;
206,209c181,184
< // 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.
218,219d192
<
< miscScoreboard[renamed_reg] = false;
225,226d197
< //Perhaps give this a pair as a return value, of the physical register
< //and whether or not it's ready.
233,235d203
< // Subtract off the base FP offset.
< // arch_reg = arch_reg - numLogicalIntRegs;
<
247,267d214
< 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.
270a218,220
> // In this implementation the miscellaneous registers do not
> // actually rename, so this function does not allow you to try to
> // change their mappings.
276,278c226
< } else {
< assert(arch_reg < (numLogicalIntRegs + numLogicalFloatRegs));
<
---
> } else if (arch_reg < numLogicalIntRegs + numLogicalFloatRegs) {
286,334d233
< 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;
< }
< }
<