gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
base_dyn_inst_impl.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011, 2019 ARM Limited
3  * All rights reserved.
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2004-2006 The Regents of The University of Michigan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  */
40 
41 #ifndef __CPU_BASE_DYN_INST_IMPL_HH__
42 #define __CPU_BASE_DYN_INST_IMPL_HH__
43 
44 #include <iostream>
45 #include <set>
46 #include <sstream>
47 #include <string>
48 
49 #include "base/cprintf.hh"
50 #include "base/trace.hh"
51 #include "config/the_isa.hh"
52 #include "cpu/base_dyn_inst.hh"
53 #include "cpu/exetrace.hh"
54 #include "debug/DynInst.hh"
55 #include "debug/IQ.hh"
56 #include "mem/request.hh"
57 #include "sim/faults.hh"
58 
59 template <class Impl>
61  const StaticInstPtr &_macroop,
62  TheISA::PCState _pc, TheISA::PCState _predPC,
63  InstSeqNum seq_num, ImplCPU *cpu)
64  : staticInst(_staticInst), cpu(cpu),
65  thread(nullptr),
66  traceData(nullptr),
67  macroop(_macroop),
68  memData(nullptr),
69  savedReq(nullptr),
70  reqToVerify(nullptr)
71 {
72  seqNum = seq_num;
73 
74  pc = _pc;
75  predPC = _predPC;
76 
77  initVars();
78 }
79 
80 template <class Impl>
82  const StaticInstPtr &_macroop)
83  : staticInst(_staticInst), traceData(NULL), macroop(_macroop)
84 {
85  seqNum = 0;
86  initVars();
87 }
88 
89 template <class Impl>
90 void
92 {
93  memData = NULL;
94  effAddr = 0;
95  physEffAddr = 0;
96  readyRegs = 0;
97  memReqFlags = 0;
98 
99  status.reset();
100 
101  instFlags.reset();
102  instFlags[RecordResult] = true;
103  instFlags[Predicate] = true;
104  instFlags[MemAccPredicate] = true;
105 
106  lqIdx = -1;
107  sqIdx = -1;
108 
109  // Eventually make this a parameter.
110  threadNumber = 0;
111 
112  // Initialize the fault to be NoFault.
113  fault = NoFault;
114 
115 #ifndef NDEBUG
116  ++cpu->instcount;
117 
118  if (cpu->instcount > 1500) {
119 #ifdef DEBUG
120  cpu->dumpInsts();
121  dumpSNList();
122 #endif
123  assert(cpu->instcount <= 1500);
124  }
125 
126  DPRINTF(DynInst,
127  "DynInst: [sn:%lli] Instruction created. Instcount for %s = %i\n",
128  seqNum, cpu->name(), cpu->instcount);
129 #endif
130 
131 #ifdef DEBUG
132  cpu->snList.insert(seqNum);
133 #endif
134 
135 }
136 
137 template <class Impl>
139 {
140  if (memData) {
141  delete [] memData;
142  }
143 
144  if (traceData) {
145  delete traceData;
146  }
147 
148  fault = NoFault;
149 
150 #ifndef NDEBUG
151  --cpu->instcount;
152 
153  DPRINTF(DynInst,
154  "DynInst: [sn:%lli] Instruction destroyed. Instcount for %s = %i\n",
155  seqNum, cpu->name(), cpu->instcount);
156 #endif
157 #ifdef DEBUG
158  cpu->snList.erase(seqNum);
159 #endif
160 
161 }
162 
163 #ifdef DEBUG
164 template <class Impl>
165 void
167 {
168  std::set<InstSeqNum>::iterator sn_it = cpu->snList.begin();
169 
170  int count = 0;
171  while (sn_it != cpu->snList.end()) {
172  cprintf("%i: [sn:%lli] not destroyed\n", count, (*sn_it));
173  count++;
174  sn_it++;
175  }
176 }
177 #endif
178 
179 template <class Impl>
180 void
182 {
183  cprintf("T%d : %#08d `", threadNumber, pc.instAddr());
184  std::cout << staticInst->disassemble(pc.instAddr());
185  cprintf("'\n");
186 }
187 
188 template <class Impl>
189 void
190 BaseDynInst<Impl>::dump(std::string &outstring)
191 {
192  std::ostringstream s;
193  s << "T" << threadNumber << " : 0x" << pc.instAddr() << " "
194  << staticInst->disassemble(pc.instAddr());
195 
196  outstring = s.str();
197 }
198 
199 template <class Impl>
200 void
202 {
203  DPRINTF(IQ, "[sn:%lli] has %d ready out of %d sources. RTI %d)\n",
205  if (++readyRegs == numSrcRegs()) {
206  setCanIssue();
207  }
208 }
209 
210 template <class Impl>
211 void
213 {
214  _readySrcRegIdx[src_idx] = true;
215 
216  markSrcRegReady();
217 }
218 
219 template <class Impl>
220 bool
222 {
223  // For now I am assuming that src registers 1..n-1 are the ones that the
224  // EA calc depends on. (i.e. src reg 0 is the source of the data to be
225  // stored)
226 
227  for (int i = 1; i < numSrcRegs(); ++i) {
228  if (!_readySrcRegIdx[i])
229  return false;
230  }
231 
232  return true;
233 }
234 
235 
236 
237 template <class Impl>
238 void
240 {
241  status.set(Squashed);
242 
244  return;
245 
246  // This inst has been renamed already so it may go through rename
247  // again (e.g. if the squash is due to memory access order violation).
248  // Reset the write counters for all pinned destination register to ensure
249  // that they are in a consistent state for a possible re-rename. This also
250  // ensures that dest regs will be pinned to the same phys register if
251  // re-rename happens.
252  for (int idx = 0; idx < numDestRegs(); idx++) {
253  PhysRegIdPtr phys_dest_reg = renamedDestRegIdx(idx);
254  if (phys_dest_reg->isPinned()) {
255  phys_dest_reg->incrNumPinnedWrites();
256  if (isPinnedRegsWritten())
257  phys_dest_reg->incrNumPinnedWritesToComplete();
258  }
259  }
261 }
262 
263 
264 
265 #endif//__CPU_BASE_DYN_INST_IMPL_HH__
#define DPRINTF(x,...)
Definition: trace.hh:222
virtual const std::string & disassemble(Addr pc, const Loader::SymbolTable *symtab=nullptr) const
Return string representation of disassembled instruction.
Definition: static_inst.cc:121
void setSquashed()
Sets this instruction as squashed.
decltype(nullptr) constexpr NoFault
Definition: types.hh:243
~BaseDynInst()
BaseDynInst destructor.
Bitfield< 7 > i
std::bitset< NumStatus > status
The status of this BaseDynInst.
InstSeqNum seqNum
The sequence number of the instruction.
unsigned memReqFlags
The memory request flags (from translation).
uint8_t readyRegs
How many source registers are ready.
int16_t lqIdx
Load queue index.
Declaration of a request, the overall memory request consisting of the parts of the request that are ...
Fault fault
The kind of fault this instruction has generated.
uint8_t * memData
Pointer to the data for the memory access.
Trace::InstRecord * traceData
InstRecord that tracks this instructions.
void markSrcRegReady()
Records that one of the source registers is ready.
Impl::CPUType ImplCPU
PhysRegIdPtr renamedDestRegIdx(int idx) const
Returns the physical register index of the i&#39;th destination register.
void incrNumPinnedWrites()
Definition: reg_class.hh:328
int8_t numSrcRegs() const
Returns the number of source registers.
void incrNumPinnedWritesToComplete()
Definition: reg_class.hh:343
bool isPinned() const
Definition: reg_class.hh:330
Bitfield< 4 > s
uint16_t RegIndex
Definition: types.hh:40
bool isPinnedRegsRenamed() const
Returns whether pinned registers are renamed.
bool isPinnedRegsWritten() const
Returns whether destination registers are written.
bool readyToIssue() const
Returns whether or not this instruction is ready to issue.
std::bitset< MaxFlags > instFlags
uint64_t InstSeqNum
Definition: inst_seq.hh:37
const StaticInstPtr staticInst
The StaticInst used by this BaseDynInst.
void setPinnedRegsSquashDone()
Sets dest registers&#39; status updated after squash.
TheISA::PCState pc
PC state for this instruction.
std::bitset< MaxInstSrcRegs > _readySrcRegIdx
Whether or not the source register is ready.
bool eaSrcsReady() const
Returns whether or not the eff.
int16_t sqIdx
Store queue index.
Physical register ID.
Definition: reg_class.hh:223
BaseDynInst(const StaticInstPtr &staticInst, const StaticInstPtr &macroop, TheISA::PCState pc, TheISA::PCState predPC, InstSeqNum seq_num, ImplCPU *cpu)
BaseDynInst constructor given a binary instruction.
ImplCPU * cpu
Pointer to the Impl&#39;s CPU object.
int8_t numDestRegs() const
Returns the number of destination registers.
Addr effAddr
The effective virtual address (lds & stores only).
Defines a dynamic instruction context.
const StaticInstPtr macroop
The Macroop if one exists.
void initVars()
Function to initialize variables in the constructors.
TheISA::PCState predPC
Predicted PC state after this instruction.
bool isPinnedRegsSquashDone() const
Return whether dest registers&#39; pinning status updated after squash.
ThreadID threadNumber
The thread this instruction is from.
void dump()
Dumps out contents of this BaseDynInst.
GenericISA::DelaySlotPCState< MachInst > PCState
Definition: types.hh:41
Instruction has committed.
Addr physEffAddr
The effective physical address.
int count
Definition: refcnt.hh:64
void setCanIssue()
Sets this instruction as ready to issue.
void cprintf(const char *format, const Args &...args)
Definition: cprintf.hh:152

Generated on Mon Jun 8 2020 15:45:08 for gem5 by doxygen 1.8.13