// Todo: Create destructor. // Make it so that there's a proper separation between int and fp. Also // have it so that there's a more meaningful name given to the variable // that marks the beginning of the FP registers. #ifndef __RENAME_MAP_HH__ #define __RENAME_MAP_HH__ #include #include #include //Will want to include faults #include "cpu/beta_cpu/free_list.hh" using namespace std; class SimpleRenameMap { public: // typedef typename Impl::RegIndex RegIndex; /** * Pair of a logical register and a physical register. Tells the * previous mapping of a logical register to a physical register. * Used to roll back the rename map to a previous state. */ typedef pair UnmapInfo; /** * Pair of a physical register and a physical register. Used to * return the physical register that a logical register has been * renamed to, and the previous physical register that the same * logical register was previously mapped to. */ typedef pair RenameInfo; public: //Constructor SimpleRenameMap(unsigned _numLogicalIntRegs, unsigned _numPhysicalIntRegs, unsigned _numLogicalFloatRegs, unsigned _numPhysicalFloatRegs, unsigned _numMiscRegs, RegIndex _intZeroReg, RegIndex _floatZeroReg); void setFreeList(SimpleFreeList *fl_ptr); //Tell rename map to get a free physical register for a given //architected register. Not sure it should have a return value, //but perhaps it should have some sort of fault in case there are //no free registers. RenameInfo rename(RegIndex arch_reg); PhysRegIndex lookup(RegIndex phys_reg); bool isReady(PhysRegIndex arch_reg); /** * Marks the given register as ready, meaning that its value has been * calculated and written to the register file. * @params ready_reg The index of the physical register that is now * ready. */ void markAsReady(PhysRegIndex ready_reg); void setEntry(RegIndex arch_reg, PhysRegIndex renamed_reg); void squash(vector freed_regs, vector unmaps); int numFreeEntries(); private: /** Number of logical integer registers. */ int numLogicalIntRegs; /** Number of physical integer registers. */ int numPhysicalIntRegs; /** Number of logical floating point registers. */ int numLogicalFloatRegs; /** Number of physical floating point registers. */ int numPhysicalFloatRegs; /** Number of miscellaneous registers. */ int numMiscRegs; /** Number of logical integer + float registers. */ int numLogicalRegs; /** Number of physical integer + float registers. */ int numPhysicalRegs; /** The integer zero register. This implementation assumes it is always * zero and never can be anything else. */ RegIndex intZeroReg; /** The floating point zero register. This implementation assumes it is * always zero and never can be anything else. */ RegIndex floatZeroReg; class RenameEntry { public: PhysRegIndex physical_reg; bool valid; RenameEntry(); }; /** Integer rename map. */ RenameEntry *intRenameMap; /** Floating point rename map. */ RenameEntry *floatRenameMap; /** Free list interface. */ SimpleFreeList *freeList; /** Scoreboard of physical integer registers, saying whether or not they * are ready. */ vector intScoreboard; /** Scoreboard of physical floating registers, saying whether or not they * are ready. */ vector floatScoreboard; /** Scoreboard of miscellaneous registers, saying whether or not they * are ready. */ vector miscScoreboard; }; #endif //__RENAME_MAP_HH__