gem5 v24.0.0.0
Loading...
Searching...
No Matches
dyn_inst.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013-2014, 2016,2018 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 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include "cpu/minor/dyn_inst.hh"
39
40#include <iomanip>
41#include <sstream>
42
43#include "cpu/base.hh"
44#include "cpu/minor/trace.hh"
46#include "cpu/reg_class.hh"
47#include "debug/MinorExecute.hh"
48#include "enums/OpClass.hh"
49
50namespace gem5
51{
52
53namespace minor
54{
55
61
62std::ostream &
63operator <<(std::ostream &os, const InstId &id)
64{
65 os << id.threadId << '/' << id.streamSeqNum << '.'
66 << id.predictionSeqNum << '/' << id.lineSeqNum;
67
68 /* Not all structures have fetch and exec sequence numbers */
69 if (id.fetchSeqNum != 0) {
70 os << '/' << id.fetchSeqNum;
71 if (id.execSeqNum != 0)
72 os << '.' << id.execSeqNum;
73 }
74
75 return os;
76}
77
79 auto *inst = new MinorDynInst(nullStaticInstPtr);
80 assert(inst->isBubble());
81 // Make bubbleInst immortal.
82 inst->incref();
83 return inst;
84}();
85
86bool
88{
89 assert(staticInst);
90 return !(staticInst->isMicroop() && !staticInst->isLastMicroop());
91}
92
93bool
95{
96 return isInst() && staticInst->opClass() == No_OpClass;
97}
98
99void
100MinorDynInst::reportData(std::ostream &os) const
101{
102 if (isBubble())
103 os << "-";
104 else if (isFault())
105 os << "F;" << id;
106 else if (translationFault != NoFault)
107 os << "TF;" << id;
108 else
109 os << id;
110}
111
112std::ostream &
113operator <<(std::ostream &os, const MinorDynInst &inst)
114{
115 if (!inst.pc) {
116 os << inst.id << " pc: 0x???????? (bubble)";
117 return os;
118 }
119
120 os << inst.id << " pc: 0x"
121 << std::hex << inst.pc->instAddr() << std::dec << " (";
122
123 if (inst.isFault())
124 os << "fault: \"" << inst.fault->name() << '"';
125 else if (inst.translationFault != NoFault)
126 os << "translation fault: \"" << inst.translationFault->name() << '"';
127 else if (inst.staticInst)
128 os << inst.staticInst->getName();
129 else
130 os << "bubble";
131
132 os << ')';
133
134 return os;
135}
136
139static void
140printRegName(std::ostream &os, const RegId& reg)
141{
142 switch (reg.classValue()) {
143 case InvalidRegClass:
144 os << 'z';
145 break;
146 case MiscRegClass:
147 {
148 RegIndex misc_reg = reg.index();
149 os << 'm' << misc_reg << '(' << reg << ')';
150 }
151 break;
152 case FloatRegClass:
153 os << 'f' << reg.index();
154 break;
155 case VecRegClass:
156 os << 'v' << reg.index();
157 break;
158 case VecElemClass:
159 os << reg;
160 break;
161 case IntRegClass:
162 os << 'r' << reg.index();
163 break;
164 case CCRegClass:
165 os << 'c' << reg.index();
166 break;
167 default:
168 panic("Unknown register class: %d", (int)reg.classValue());
169 }
170}
171
172void
173MinorDynInst::minorTraceInst(const Named &named_object) const
174{
175 if (isFault()) {
176 minorInst(named_object, "id=F;%s addr=0x%x fault=\"%s\"\n",
177 id, pc ? pc->instAddr() : 0, fault->name());
178 } else {
179 unsigned int num_src_regs = staticInst->numSrcRegs();
180 unsigned int num_dest_regs = staticInst->numDestRegs();
181
182 std::ostringstream regs_str;
183
184 /* Format lists of src and dest registers for microops and
185 * 'full' instructions */
186 if (!staticInst->isMacroop()) {
187 regs_str << " srcRegs=";
188
189 unsigned int src_reg = 0;
190 while (src_reg < num_src_regs) {
191 printRegName(regs_str, staticInst->srcRegIdx(src_reg));
192
193 src_reg++;
194 if (src_reg != num_src_regs)
195 regs_str << ',';
196 }
197
198 regs_str << " destRegs=";
199
200 unsigned int dest_reg = 0;
201 while (dest_reg < num_dest_regs) {
202 printRegName(regs_str, staticInst->destRegIdx(dest_reg));
203
204 dest_reg++;
205 if (dest_reg != num_dest_regs)
206 regs_str << ',';
207 }
208
209 ccprintf(regs_str, " extMachInst=%160x", staticInst->getEMI());
210 }
211
212 std::ostringstream flags;
214
215 minorInst(named_object, "id=%s addr=0x%x inst=\"%s\" class=%s"
216 " flags=\"%s\"%s%s\n",
217 id, pc ? pc->instAddr() : 0,
218 (staticInst->opClass() == No_OpClass ?
219 "(invalid)" : staticInst->disassemble(0,NULL)),
220 enums::OpClassStrings[staticInst->opClass()],
221 flags.str(),
222 regs_str.str(),
223 (predictedTaken ? " predictedTaken" : ""));
224 }
225}
226
228{
229 if (traceData)
230 delete traceData;
231}
232
233} // namespace minor
234} // namespace gem5
Interface for things with names.
Definition named.hh:39
Register ID: describe an architectural register with its class and index.
Definition reg_class.hh:94
void printFlags(std::ostream &outs, const std::string &separator) const
Print a separator separated list of this instruction's set flag names on the given stream.
virtual const std::string & disassemble(Addr pc, const loader::SymbolTable *symtab=nullptr) const
Return string representation of disassembled instruction.
virtual uint64_t getEMI() const
uint8_t numSrcRegs() const
Number of source registers.
OpClass opClass() const
Operation class. Used to select appropriate function unit in issue.
uint8_t numDestRegs() const
Number of destination registers.
bool isMacroop() const
std::string getName()
Return name of machine instruction.
const RegId & destRegIdx(int i) const
Return logical index (architectural reg num) of i'th destination reg.
bool isLastMicroop() const
bool isMicroop() const
const RegId & srcRegIdx(int i) const
Return logical index (architectural reg num) of i'th source reg.
Id for lines and instructions.
Definition dyn_inst.hh:76
static const InstSeqNum firstFetchSeqNum
Definition dyn_inst.hh:83
static const InstSeqNum firstExecSeqNum
Definition dyn_inst.hh:84
static const InstSeqNum firstLineSeqNum
Definition dyn_inst.hh:82
static const InstSeqNum firstStreamSeqNum
First sequence numbers to use in initialisation of the pipeline and to be expected on the first line/...
Definition dyn_inst.hh:80
static const InstSeqNum firstPredictionSeqNum
Definition dyn_inst.hh:81
Dynamic instruction for Minor.
Definition dyn_inst.hh:163
bool isFault() const
Is this a fault rather than instruction.
Definition dyn_inst.hh:253
bool isNoCostInst() const
Is this an instruction that can be executed ‘for free’ and needn't spend time in an FU.
Definition dyn_inst.cc:94
bool isInst() const
Is this a real instruction.
Definition dyn_inst.hh:256
Fault translationFault
Translation fault in case of a mem ref.
Definition dyn_inst.hh:203
trace::InstRecord * traceData
Trace information for this instruction's execution.
Definition dyn_inst.hh:175
std::unique_ptr< PCStateBase > pc
The fetch address of this instruction.
Definition dyn_inst.hh:178
void minorTraceInst(const Named &named_object) const
Print (possibly verbose) instruction information for MinorTrace using the given Named object's name.
Definition dyn_inst.cc:173
const StaticInstPtr staticInst
Definition dyn_inst.hh:170
bool isLastOpInInst() const
Assuming this is not a fault, is this instruction either a whole instruction or the last microop from...
Definition dyn_inst.cc:87
void reportData(std::ostream &os) const
ReportIF interface.
Definition dyn_inst.cc:100
static MinorDynInstPtr bubbleInst
A prototypical bubble instruction.
Definition dyn_inst.hh:167
bool predictedTaken
This instruction was predicted to change control flow and the following instructions will have a newe...
Definition dyn_inst.hh:189
Fault fault
This is actually a fault masquerading as an instruction.
Definition dyn_inst.hh:181
bool isBubble() const
The BubbleIF interface.
Definition dyn_inst.hh:247
This file contains miscellaneous classes and functions for formatting general trace information and a...
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:188
uint8_t flags
Definition helpers.cc:87
The dynamic instruction and instruction/line id (sequence numbers) definition for Minor.
Bitfield< 5, 3 > reg
Definition types.hh:92
Bitfield< 17 > os
Definition misc.hh:838
static void printRegName(std::ostream &os, const RegId &reg)
Print a register in the form r<n>, f<n>, m<n>(<name>) for integer, float, and misc given an 'architec...
Definition dyn_inst.cc:140
RefCountingPtr< MinorDynInst > MinorDynInstPtr
MinorDynInsts are currently reference counted.
Definition dyn_inst.hh:71
std::ostream & operator<<(std::ostream &os, const InstId &id)
Print this id in the usual slash-separated format expected by MinorTrace.
Definition dyn_inst.cc:63
void minorInst(const Named &named, const char *fmt, Args ...args)
DPRINTFN for MinorTrace MinorInst line reporting.
Definition trace.hh:74
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint16_t RegIndex
Definition types.hh:176
const StaticInstPtr nullStaticInstPtr
Statically allocated null StaticInstPtr.
constexpr decltype(nullptr) NoFault
Definition types.hh:253
uint64_t InstSeqNum
Definition inst_seq.hh:40
@ FloatRegClass
Floating-point register.
Definition reg_class.hh:62
@ CCRegClass
Condition-code register.
Definition reg_class.hh:69
@ VecRegClass
Vector Register.
Definition reg_class.hh:64
@ IntRegClass
Integer register.
Definition reg_class.hh:61
@ InvalidRegClass
Definition reg_class.hh:71
@ MiscRegClass
Control (misc) register.
Definition reg_class.hh:70
@ VecElemClass
Vector Register Native Elem lane.
Definition reg_class.hh:66
void ccprintf(cp::Print &print)
Definition cprintf.hh:130
Minor contains all the definitions within the MinorCPU apart from the CPU class itself.

Generated on Tue Jun 18 2024 16:24:01 for gem5 by doxygen 1.11.0