rename.hh revision 1689
1/* 2 * Copyright (c) 2004-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29// Todo: 30// Fix up trap and barrier handling. 31// May want to have different statuses to differentiate the different stall 32// conditions. 33 34#ifndef __CPU_BETA_CPU_SIMPLE_RENAME_HH__ 35#define __CPU_BETA_CPU_SIMPLE_RENAME_HH__ 36 37#include <list> 38 39#include "base/statistics.hh" 40#include "base/timebuf.hh" 41 42// Will need rename maps for both the int reg file and fp reg file. 43// Or change rename map class to handle both. (RegFile handles both.) 44template<class Impl> 45class SimpleRename 46{ 47 public: 48 // Typedefs from the Impl. 49 typedef typename Impl::ISA ISA; 50 typedef typename Impl::CPUPol CPUPol; 51 typedef typename Impl::DynInstPtr DynInstPtr; 52 typedef typename Impl::FullCPU FullCPU; 53 typedef typename Impl::Params Params; 54 55 typedef typename CPUPol::FetchStruct FetchStruct; 56 typedef typename CPUPol::DecodeStruct DecodeStruct; 57 typedef typename CPUPol::RenameStruct RenameStruct; 58 typedef typename CPUPol::TimeStruct TimeStruct; 59 60 // Typedefs from the CPUPol 61 typedef typename CPUPol::FreeList FreeList; 62 typedef typename CPUPol::RenameMap RenameMap; 63 64 // Typedefs from the ISA. 65 typedef typename ISA::Addr Addr; 66 67 public: 68 // Rename will block if ROB becomes full or issue queue becomes full, 69 // or there are no free registers to rename to. 70 // Only case where rename squashes is if IEW squashes. 71 enum Status { 72 Running, 73 Idle, 74 Squashing, 75 Blocked, 76 Unblocking, 77 BarrierStall 78 }; 79 80 private: 81 Status _status; 82 83 public: 84 SimpleRename(Params ¶ms); 85 86 void regStats(); 87 88 void setCPU(FullCPU *cpu_ptr); 89 90 void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr); 91 92 void setRenameQueue(TimeBuffer<RenameStruct> *rq_ptr); 93 94 void setDecodeQueue(TimeBuffer<DecodeStruct> *dq_ptr); 95 96 void setRenameMap(RenameMap *rm_ptr); 97 98 void setFreeList(FreeList *fl_ptr); 99 100 void dumpHistory(); 101 102 void tick(); 103 104 void rename(); 105 106 void squash(); 107 108 private: 109 void block(); 110 111 inline void unblock(); 112 113 void doSquash(); 114 115 void removeFromHistory(InstSeqNum inst_seq_num); 116 117 inline void renameSrcRegs(DynInstPtr &inst); 118 119 inline void renameDestRegs(DynInstPtr &inst); 120 121 inline int calcFreeROBEntries(); 122 123 inline int calcFreeIQEntries(); 124 125 /** Holds the previous information for each rename. 126 * Note that often times the inst may have been deleted, so only access 127 * the pointer for the address and do not dereference it. 128 */ 129 struct RenameHistory { 130 RenameHistory(InstSeqNum _instSeqNum, RegIndex _archReg, 131 PhysRegIndex _newPhysReg, PhysRegIndex _prevPhysReg) 132 : instSeqNum(_instSeqNum), archReg(_archReg), 133 newPhysReg(_newPhysReg), prevPhysReg(_prevPhysReg), 134 placeHolder(false) 135 { 136 } 137 138 /** Constructor used specifically for cases where a place holder 139 * rename history entry is being made. 140 */ 141 RenameHistory(InstSeqNum _instSeqNum) 142 : instSeqNum(_instSeqNum), archReg(0), newPhysReg(0), 143 prevPhysReg(0), placeHolder(true) 144 { 145 } 146 147 InstSeqNum instSeqNum; 148 RegIndex archReg; 149 PhysRegIndex newPhysReg; 150 PhysRegIndex prevPhysReg; 151 bool placeHolder; 152 }; 153 154 std::list<RenameHistory> historyBuffer; 155 156 /** CPU interface. */ 157 FullCPU *cpu; 158 159 // Interfaces to objects outside of rename. 160 /** Time buffer interface. */ 161 TimeBuffer<TimeStruct> *timeBuffer; 162 163 /** Wire to get IEW's output from backwards time buffer. */ 164 typename TimeBuffer<TimeStruct>::wire fromIEW; 165 166 /** Wire to get commit's output from backwards time buffer. */ 167 typename TimeBuffer<TimeStruct>::wire fromCommit; 168 169 /** Wire to write infromation heading to previous stages. */ 170 // Might not be the best name as not only decode will read it. 171 typename TimeBuffer<TimeStruct>::wire toDecode; 172 173 /** Rename instruction queue. */ 174 TimeBuffer<RenameStruct> *renameQueue; 175 176 /** Wire to write any information heading to IEW. */ 177 typename TimeBuffer<RenameStruct>::wire toIEW; 178 179 /** Decode instruction queue interface. */ 180 TimeBuffer<DecodeStruct> *decodeQueue; 181 182 /** Wire to get decode's output from decode queue. */ 183 typename TimeBuffer<DecodeStruct>::wire fromDecode; 184 185 /** Skid buffer between rename and decode. */ 186 std::queue<DecodeStruct> skidBuffer; 187 188 /** Rename map interface. */ 189 SimpleRenameMap *renameMap; 190 191 /** Free list interface. */ 192 FreeList *freeList; 193 194 /** Delay between iew and rename, in ticks. */ 195 int iewToRenameDelay; 196 197 /** Delay between decode and rename, in ticks. */ 198 int decodeToRenameDelay; 199 200 /** Delay between commit and rename, in ticks. */ 201 unsigned commitToRenameDelay; 202 203 /** Rename width, in instructions. */ 204 unsigned renameWidth; 205 206 /** Commit width, in instructions. Used so rename knows how many 207 * instructions might have freed registers in the previous cycle. 208 */ 209 unsigned commitWidth; 210 211 /** The instruction that rename is currently on. It needs to have 212 * persistent state so that when a stall occurs in the middle of a 213 * group of instructions, it can restart at the proper instruction. 214 */ 215 unsigned numInst; 216 217 Stats::Scalar<> renameSquashCycles; 218 Stats::Scalar<> renameIdleCycles; 219 Stats::Scalar<> renameBlockCycles; 220 Stats::Scalar<> renameUnblockCycles; 221 Stats::Scalar<> renameRenamedInsts; 222 Stats::Scalar<> renameSquashedInsts; 223 Stats::Scalar<> renameROBFullEvents; 224 Stats::Scalar<> renameIQFullEvents; 225 Stats::Scalar<> renameFullRegistersEvents; 226 Stats::Scalar<> renameRenamedOperands; 227 Stats::Scalar<> renameRenameLookups; 228 Stats::Scalar<> renameHBPlaceHolders; 229 Stats::Scalar<> renameCommittedMaps; 230 Stats::Scalar<> renameUndoneMaps; 231 Stats::Scalar<> renameValidUndoneMaps; 232}; 233 234#endif // __CPU_BETA_CPU_SIMPLE_RENAME_HH__ 235