gem5  v19.0.0.0
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  * Authors: Kevin Lim
41  */
42 
43 #ifndef __CPU_BASE_DYN_INST_IMPL_HH__
44 #define __CPU_BASE_DYN_INST_IMPL_HH__
45 
46 #include <iostream>
47 #include <set>
48 #include <sstream>
49 #include <string>
50 
51 #include "base/cprintf.hh"
52 #include "base/trace.hh"
53 #include "config/the_isa.hh"
54 #include "cpu/base_dyn_inst.hh"
55 #include "cpu/exetrace.hh"
56 #include "debug/DynInst.hh"
57 #include "debug/IQ.hh"
58 #include "mem/request.hh"
59 #include "sim/faults.hh"
60 
61 template <class Impl>
63  const StaticInstPtr &_macroop,
64  TheISA::PCState _pc, TheISA::PCState _predPC,
65  InstSeqNum seq_num, ImplCPU *cpu)
66  : staticInst(_staticInst), cpu(cpu),
67  thread(nullptr),
68  traceData(nullptr),
69  macroop(_macroop),
70  memData(nullptr),
71  savedReq(nullptr),
72  reqToVerify(nullptr)
73 {
74  seqNum = seq_num;
75 
76  pc = _pc;
77  predPC = _predPC;
78 
79  initVars();
80 }
81 
82 template <class Impl>
84  const StaticInstPtr &_macroop)
85  : staticInst(_staticInst), traceData(NULL), macroop(_macroop)
86 {
87  seqNum = 0;
88  initVars();
89 }
90 
91 template <class Impl>
92 void
94 {
95  memData = NULL;
96  effAddr = 0;
97  physEffAddr = 0;
98  readyRegs = 0;
99  memReqFlags = 0;
100 
101  status.reset();
102 
103  instFlags.reset();
104  instFlags[RecordResult] = true;
105  instFlags[Predicate] = true;
106  instFlags[MemAccPredicate] = true;
107 
108  lqIdx = -1;
109  sqIdx = -1;
110 
111  // Eventually make this a parameter.
112  threadNumber = 0;
113 
114  // Also make this a parameter, or perhaps get it from xc or cpu.
115  asid = 0;
116 
117  // Initialize the fault to be NoFault.
118  fault = NoFault;
119 
120 #ifndef NDEBUG
121  ++cpu->instcount;
122 
123  if (cpu->instcount > 1500) {
124 #ifdef DEBUG
125  cpu->dumpInsts();
126  dumpSNList();
127 #endif
128  assert(cpu->instcount <= 1500);
129  }
130 
131  DPRINTF(DynInst,
132  "DynInst: [sn:%lli] Instruction created. Instcount for %s = %i\n",
133  seqNum, cpu->name(), cpu->instcount);
134 #endif
135 
136 #ifdef DEBUG
137  cpu->snList.insert(seqNum);
138 #endif
139 
140 }
141 
142 template <class Impl>
144 {
145  if (memData) {
146  delete [] memData;
147  }
148 
149  if (traceData) {
150  delete traceData;
151  }
152 
153  fault = NoFault;
154 
155 #ifndef NDEBUG
156  --cpu->instcount;
157 
158  DPRINTF(DynInst,
159  "DynInst: [sn:%lli] Instruction destroyed. Instcount for %s = %i\n",
160  seqNum, cpu->name(), cpu->instcount);
161 #endif
162 #ifdef DEBUG
163  cpu->snList.erase(seqNum);
164 #endif
165 
166 }
167 
168 #ifdef DEBUG
169 template <class Impl>
170 void
172 {
173  std::set<InstSeqNum>::iterator sn_it = cpu->snList.begin();
174 
175  int count = 0;
176  while (sn_it != cpu->snList.end()) {
177  cprintf("%i: [sn:%lli] not destroyed\n", count, (*sn_it));
178  count++;
179  sn_it++;
180  }
181 }
182 #endif
183 
184 template <class Impl>
185 void
187 {
188  cprintf("T%d : %#08d `", threadNumber, pc.instAddr());
189  std::cout << staticInst->disassemble(pc.instAddr());
190  cprintf("'\n");
191 }
192 
193 template <class Impl>
194 void
195 BaseDynInst<Impl>::dump(std::string &outstring)
196 {
197  std::ostringstream s;
198  s << "T" << threadNumber << " : 0x" << pc.instAddr() << " "
199  << staticInst->disassemble(pc.instAddr());
200 
201  outstring = s.str();
202 }
203 
204 template <class Impl>
205 void
207 {
208  DPRINTF(IQ, "[sn:%lli] has %d ready out of %d sources. RTI %d)\n",
210  if (++readyRegs == numSrcRegs()) {
211  setCanIssue();
212  }
213 }
214 
215 template <class Impl>
216 void
218 {
219  _readySrcRegIdx[src_idx] = true;
220 
221  markSrcRegReady();
222 }
223 
224 template <class Impl>
225 bool
227 {
228  // For now I am assuming that src registers 1..n-1 are the ones that the
229  // EA calc depends on. (i.e. src reg 0 is the source of the data to be
230  // stored)
231 
232  for (int i = 1; i < numSrcRegs(); ++i) {
233  if (!_readySrcRegIdx[i])
234  return false;
235  }
236 
237  return true;
238 }
239 
240 
241 
242 template <class Impl>
243 void
245 {
246  status.set(Squashed);
247 
249  return;
250 
251  // This inst has been renamed already so it may go through rename
252  // again (e.g. if the squash is due to memory access order violation).
253  // Reset the write counters for all pinned destination register to ensure
254  // that they are in a consistent state for a possible re-rename. This also
255  // ensures that dest regs will be pinned to the same phys register if
256  // re-rename happens.
257  for (int idx = 0; idx < numDestRegs(); idx++) {
258  PhysRegIdPtr phys_dest_reg = renamedDestRegIdx(idx);
259  if (phys_dest_reg->isPinned()) {
260  phys_dest_reg->incrNumPinnedWrites();
261  if (isPinnedRegsWritten())
262  phys_dest_reg->incrNumPinnedWritesToComplete();
263  }
264  }
266 }
267 
268 
269 
270 #endif//__CPU_BASE_DYN_INST_IMPL_HH__
#define DPRINTF(x,...)
Definition: trace.hh:229
void setSquashed()
Sets this instruction as squashed.
decltype(nullptr) constexpr NoFault
Definition: types.hh:245
~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.
virtual const std::string & disassemble(Addr pc, const SymbolTable *symtab=0) const
Return string representation of disassembled instruction.
Definition: static_inst.cc:123
short asid
data address space ID, for loads & stores.
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:334
int8_t numSrcRegs() const
Returns the number of source registers.
void incrNumPinnedWritesToComplete()
Definition: reg_class.hh:349
bool isPinned() const
Definition: reg_class.hh:336
Bitfield< 4 > s
uint16_t RegIndex
Definition: types.hh:42
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:40
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:229
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.
GenericISA::SimplePCState< MachInst > PCState
Definition: types.hh:43
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.
Instruction has committed.
Addr physEffAddr
The effective physical address.
int count
Definition: refcnt.hh:66
void setCanIssue()
Sets this instruction as ready to issue.
void cprintf(const char *format, const Args &...args)
Definition: cprintf.hh:156

Generated on Fri Feb 28 2020 16:26:59 for gem5 by doxygen 1.8.13