rename.hh revision 1689
111308Santhony.gutierrez@amd.com/* 212697Santhony.gutierrez@amd.com * Copyright (c) 2004-2005 The Regents of The University of Michigan 311308Santhony.gutierrez@amd.com * All rights reserved. 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 611308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 711308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 911308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1211308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1311308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1411308Santhony.gutierrez@amd.com * this software without specific prior written permission. 1511308Santhony.gutierrez@amd.com * 1611308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712697Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812697Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912697Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711308Santhony.gutierrez@amd.com */ 2811308Santhony.gutierrez@amd.com 2911308Santhony.gutierrez@amd.com// Todo: 3011308Santhony.gutierrez@amd.com// Fix up trap and barrier handling. 3111308Santhony.gutierrez@amd.com// May want to have different statuses to differentiate the different stall 3211308Santhony.gutierrez@amd.com// conditions. 3312697Santhony.gutierrez@amd.com 3412697Santhony.gutierrez@amd.com#ifndef __CPU_BETA_CPU_SIMPLE_RENAME_HH__ 3511308Santhony.gutierrez@amd.com#define __CPU_BETA_CPU_SIMPLE_RENAME_HH__ 3611308Santhony.gutierrez@amd.com 3711308Santhony.gutierrez@amd.com#include <list> 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com#include "base/statistics.hh" 4011308Santhony.gutierrez@amd.com#include "base/timebuf.hh" 4112334Sgabeblack@google.com 4211308Santhony.gutierrez@amd.com// Will need rename maps for both the int reg file and fp reg file. 4311308Santhony.gutierrez@amd.com// Or change rename map class to handle both. (RegFile handles both.) 4411308Santhony.gutierrez@amd.comtemplate<class Impl> 4511308Santhony.gutierrez@amd.comclass SimpleRename 4611308Santhony.gutierrez@amd.com{ 4711308Santhony.gutierrez@amd.com public: 4811308Santhony.gutierrez@amd.com // Typedefs from the Impl. 4911308Santhony.gutierrez@amd.com typedef typename Impl::ISA ISA; 5011308Santhony.gutierrez@amd.com typedef typename Impl::CPUPol CPUPol; 5111308Santhony.gutierrez@amd.com typedef typename Impl::DynInstPtr DynInstPtr; 5211308Santhony.gutierrez@amd.com typedef typename Impl::FullCPU FullCPU; 5311308Santhony.gutierrez@amd.com typedef typename Impl::Params Params; 5411308Santhony.gutierrez@amd.com 5511308Santhony.gutierrez@amd.com typedef typename CPUPol::FetchStruct FetchStruct; 5611308Santhony.gutierrez@amd.com typedef typename CPUPol::DecodeStruct DecodeStruct; 5711308Santhony.gutierrez@amd.com typedef typename CPUPol::RenameStruct RenameStruct; 5811308Santhony.gutierrez@amd.com typedef typename CPUPol::TimeStruct TimeStruct; 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.com // Typedefs from the CPUPol 6111308Santhony.gutierrez@amd.com typedef typename CPUPol::FreeList FreeList; 6211308Santhony.gutierrez@amd.com typedef typename CPUPol::RenameMap RenameMap; 6311308Santhony.gutierrez@amd.com 6411308Santhony.gutierrez@amd.com // Typedefs from the ISA. 6511308Santhony.gutierrez@amd.com typedef typename ISA::Addr Addr; 6611534Sjohn.kalamatianos@amd.com 6711308Santhony.gutierrez@amd.com public: 6811308Santhony.gutierrez@amd.com // Rename will block if ROB becomes full or issue queue becomes full, 6911308Santhony.gutierrez@amd.com // or there are no free registers to rename to. 7011308Santhony.gutierrez@amd.com // Only case where rename squashes is if IEW squashes. 7111308Santhony.gutierrez@amd.com enum Status { 7211308Santhony.gutierrez@amd.com Running, 7311308Santhony.gutierrez@amd.com Idle, 7411308Santhony.gutierrez@amd.com Squashing, 7511308Santhony.gutierrez@amd.com Blocked, 7611308Santhony.gutierrez@amd.com Unblocking, 7711308Santhony.gutierrez@amd.com BarrierStall 7811308Santhony.gutierrez@amd.com }; 7911308Santhony.gutierrez@amd.com 8011308Santhony.gutierrez@amd.com private: 8111308Santhony.gutierrez@amd.com Status _status; 8211308Santhony.gutierrez@amd.com 8311308Santhony.gutierrez@amd.com public: 8411308Santhony.gutierrez@amd.com SimpleRename(Params ¶ms); 8511308Santhony.gutierrez@amd.com 8611308Santhony.gutierrez@amd.com void regStats(); 8711308Santhony.gutierrez@amd.com 8811308Santhony.gutierrez@amd.com void setCPU(FullCPU *cpu_ptr); 8911308Santhony.gutierrez@amd.com 9011308Santhony.gutierrez@amd.com void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr); 9111308Santhony.gutierrez@amd.com 9211308Santhony.gutierrez@amd.com void setRenameQueue(TimeBuffer<RenameStruct> *rq_ptr); 9311308Santhony.gutierrez@amd.com 9411308Santhony.gutierrez@amd.com void setDecodeQueue(TimeBuffer<DecodeStruct> *dq_ptr); 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.com void setRenameMap(RenameMap *rm_ptr); 9711308Santhony.gutierrez@amd.com 9811308Santhony.gutierrez@amd.com void setFreeList(FreeList *fl_ptr); 9911308Santhony.gutierrez@amd.com 10011308Santhony.gutierrez@amd.com void dumpHistory(); 10111308Santhony.gutierrez@amd.com 10211308Santhony.gutierrez@amd.com void tick(); 10311308Santhony.gutierrez@amd.com 10411308Santhony.gutierrez@amd.com void rename(); 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.com void squash(); 10711308Santhony.gutierrez@amd.com 10811308Santhony.gutierrez@amd.com private: 10911308Santhony.gutierrez@amd.com void block(); 11011308Santhony.gutierrez@amd.com 11111308Santhony.gutierrez@amd.com inline void unblock(); 11211308Santhony.gutierrez@amd.com 11311308Santhony.gutierrez@amd.com void doSquash(); 11411308Santhony.gutierrez@amd.com 11511308Santhony.gutierrez@amd.com void removeFromHistory(InstSeqNum inst_seq_num); 11611308Santhony.gutierrez@amd.com 11711308Santhony.gutierrez@amd.com inline void renameSrcRegs(DynInstPtr &inst); 11811308Santhony.gutierrez@amd.com 11911308Santhony.gutierrez@amd.com inline void renameDestRegs(DynInstPtr &inst); 12011308Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.com inline int calcFreeROBEntries(); 12211308Santhony.gutierrez@amd.com 12311308Santhony.gutierrez@amd.com inline int calcFreeIQEntries(); 12411308Santhony.gutierrez@amd.com 12511699Santhony.gutierrez@amd.com /** Holds the previous information for each rename. 12611308Santhony.gutierrez@amd.com * Note that often times the inst may have been deleted, so only access 12711308Santhony.gutierrez@amd.com * the pointer for the address and do not dereference it. 12811308Santhony.gutierrez@amd.com */ 12911308Santhony.gutierrez@amd.com struct RenameHistory { 13011308Santhony.gutierrez@amd.com RenameHistory(InstSeqNum _instSeqNum, RegIndex _archReg, 13111308Santhony.gutierrez@amd.com PhysRegIndex _newPhysReg, PhysRegIndex _prevPhysReg) 13211308Santhony.gutierrez@amd.com : instSeqNum(_instSeqNum), archReg(_archReg), 13311308Santhony.gutierrez@amd.com newPhysReg(_newPhysReg), prevPhysReg(_prevPhysReg), 13411308Santhony.gutierrez@amd.com placeHolder(false) 13511308Santhony.gutierrez@amd.com { 13611308Santhony.gutierrez@amd.com } 13711308Santhony.gutierrez@amd.com 13811308Santhony.gutierrez@amd.com /** Constructor used specifically for cases where a place holder 13911308Santhony.gutierrez@amd.com * rename history entry is being made. 14011308Santhony.gutierrez@amd.com */ 14111308Santhony.gutierrez@amd.com RenameHistory(InstSeqNum _instSeqNum) 14211308Santhony.gutierrez@amd.com : instSeqNum(_instSeqNum), archReg(0), newPhysReg(0), 14311308Santhony.gutierrez@amd.com prevPhysReg(0), placeHolder(true) 14411308Santhony.gutierrez@amd.com { 14511308Santhony.gutierrez@amd.com } 14611308Santhony.gutierrez@amd.com 14711308Santhony.gutierrez@amd.com InstSeqNum instSeqNum; 14811308Santhony.gutierrez@amd.com RegIndex archReg; 14911308Santhony.gutierrez@amd.com PhysRegIndex newPhysReg; 15011308Santhony.gutierrez@amd.com PhysRegIndex prevPhysReg; 15111308Santhony.gutierrez@amd.com bool placeHolder; 15211308Santhony.gutierrez@amd.com }; 15311308Santhony.gutierrez@amd.com 15411308Santhony.gutierrez@amd.com std::list<RenameHistory> historyBuffer; 15511308Santhony.gutierrez@amd.com 15611692Santhony.gutierrez@amd.com /** CPU interface. */ 15711692Santhony.gutierrez@amd.com FullCPU *cpu; 15811308Santhony.gutierrez@amd.com 15911308Santhony.gutierrez@amd.com // Interfaces to objects outside of rename. 16011308Santhony.gutierrez@amd.com /** Time buffer interface. */ 16111308Santhony.gutierrez@amd.com TimeBuffer<TimeStruct> *timeBuffer; 16211308Santhony.gutierrez@amd.com 16311308Santhony.gutierrez@amd.com /** Wire to get IEW's output from backwards time buffer. */ 16411699Santhony.gutierrez@amd.com typename TimeBuffer<TimeStruct>::wire fromIEW; 16511308Santhony.gutierrez@amd.com 16611308Santhony.gutierrez@amd.com /** Wire to get commit's output from backwards time buffer. */ 16711308Santhony.gutierrez@amd.com typename TimeBuffer<TimeStruct>::wire fromCommit; 16811308Santhony.gutierrez@amd.com 16911308Santhony.gutierrez@amd.com /** Wire to write infromation heading to previous stages. */ 17011308Santhony.gutierrez@amd.com // Might not be the best name as not only decode will read it. 17111308Santhony.gutierrez@amd.com typename TimeBuffer<TimeStruct>::wire toDecode; 17211308Santhony.gutierrez@amd.com 17311308Santhony.gutierrez@amd.com /** Rename instruction queue. */ 17411308Santhony.gutierrez@amd.com TimeBuffer<RenameStruct> *renameQueue; 17511308Santhony.gutierrez@amd.com 17611308Santhony.gutierrez@amd.com /** Wire to write any information heading to IEW. */ 17711308Santhony.gutierrez@amd.com typename TimeBuffer<RenameStruct>::wire toIEW; 17811308Santhony.gutierrez@amd.com 17911308Santhony.gutierrez@amd.com /** Decode instruction queue interface. */ 18011308Santhony.gutierrez@amd.com TimeBuffer<DecodeStruct> *decodeQueue; 18111308Santhony.gutierrez@amd.com 18211308Santhony.gutierrez@amd.com /** Wire to get decode's output from decode queue. */ 18311308Santhony.gutierrez@amd.com typename TimeBuffer<DecodeStruct>::wire fromDecode; 18411308Santhony.gutierrez@amd.com 18511308Santhony.gutierrez@amd.com /** Skid buffer between rename and decode. */ 18611308Santhony.gutierrez@amd.com std::queue<DecodeStruct> skidBuffer; 18711308Santhony.gutierrez@amd.com 18811308Santhony.gutierrez@amd.com /** Rename map interface. */ 18911308Santhony.gutierrez@amd.com SimpleRenameMap *renameMap; 19011308Santhony.gutierrez@amd.com 19111308Santhony.gutierrez@amd.com /** Free list interface. */ 19211308Santhony.gutierrez@amd.com FreeList *freeList; 19311308Santhony.gutierrez@amd.com 19411308Santhony.gutierrez@amd.com /** Delay between iew and rename, in ticks. */ 19511308Santhony.gutierrez@amd.com int iewToRenameDelay; 19611308Santhony.gutierrez@amd.com 19711308Santhony.gutierrez@amd.com /** Delay between decode and rename, in ticks. */ 19811308Santhony.gutierrez@amd.com int decodeToRenameDelay; 19911308Santhony.gutierrez@amd.com 20011308Santhony.gutierrez@amd.com /** Delay between commit and rename, in ticks. */ 20111308Santhony.gutierrez@amd.com unsigned commitToRenameDelay; 20211308Santhony.gutierrez@amd.com 20311308Santhony.gutierrez@amd.com /** Rename width, in instructions. */ 20411308Santhony.gutierrez@amd.com unsigned renameWidth; 20511308Santhony.gutierrez@amd.com 20611308Santhony.gutierrez@amd.com /** Commit width, in instructions. Used so rename knows how many 20711308Santhony.gutierrez@amd.com * instructions might have freed registers in the previous cycle. 20811308Santhony.gutierrez@amd.com */ 20911308Santhony.gutierrez@amd.com unsigned commitWidth; 21011308Santhony.gutierrez@amd.com 21111308Santhony.gutierrez@amd.com /** The instruction that rename is currently on. It needs to have 21211308Santhony.gutierrez@amd.com * persistent state so that when a stall occurs in the middle of a 21311308Santhony.gutierrez@amd.com * group of instructions, it can restart at the proper instruction. 21411308Santhony.gutierrez@amd.com */ 21511308Santhony.gutierrez@amd.com unsigned numInst; 21611308Santhony.gutierrez@amd.com 21711308Santhony.gutierrez@amd.com Stats::Scalar<> renameSquashCycles; 21811308Santhony.gutierrez@amd.com Stats::Scalar<> renameIdleCycles; 21911308Santhony.gutierrez@amd.com Stats::Scalar<> renameBlockCycles; 22011699Santhony.gutierrez@amd.com Stats::Scalar<> renameUnblockCycles; 22111308Santhony.gutierrez@amd.com Stats::Scalar<> renameRenamedInsts; 22211308Santhony.gutierrez@amd.com Stats::Scalar<> renameSquashedInsts; 22311308Santhony.gutierrez@amd.com Stats::Scalar<> renameROBFullEvents; 22411308Santhony.gutierrez@amd.com Stats::Scalar<> renameIQFullEvents; 22511308Santhony.gutierrez@amd.com Stats::Scalar<> renameFullRegistersEvents; 22611308Santhony.gutierrez@amd.com Stats::Scalar<> renameRenamedOperands; 22711308Santhony.gutierrez@amd.com Stats::Scalar<> renameRenameLookups; 22811308Santhony.gutierrez@amd.com Stats::Scalar<> renameHBPlaceHolders; 22911308Santhony.gutierrez@amd.com Stats::Scalar<> renameCommittedMaps; 23011308Santhony.gutierrez@amd.com Stats::Scalar<> renameUndoneMaps; 23111308Santhony.gutierrez@amd.com Stats::Scalar<> renameValidUndoneMaps; 23211308Santhony.gutierrez@amd.com}; 23311308Santhony.gutierrez@amd.com 23411308Santhony.gutierrez@amd.com#endif // __CPU_BETA_CPU_SIMPLE_RENAME_HH__ 23511308Santhony.gutierrez@amd.com