Gabe Black has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/49693 )
Change subject: cpu: In SimpleExecContext, use arrays to map reg classes to
stats.
......................................................................
cpu: In SimpleExecContext, use arrays to map reg classes to stats.
Use arrays to more efficiently look up what stats to increment instead
of using switch statements.
Change-Id: I845d0c01ba5b930d46b36147a3136fd721241ed9
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49693
Reviewed-by: Giacomo Travaglini <[email protected]>
Maintainer: Giacomo Travaglini <[email protected]>
Tested-by: kokoro <[email protected]>
---
M src/cpu/simple/exec_context.hh
1 file changed, 41 insertions(+), 88 deletions(-)
Approvals:
Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/cpu/simple/exec_context.hh b/src/cpu/simple/exec_context.hh
index 34dc2d6..98adf36 100644
--- a/src/cpu/simple/exec_context.hh
+++ b/src/cpu/simple/exec_context.hh
@@ -157,7 +157,23 @@
ADD_STAT(numBranchMispred, statistics::units::Count::get(),
"Number of branch mispredictions"),
ADD_STAT(statExecutedInstType,
statistics::units::Count::get(),
- "Class of executed instruction.")
+ "Class of executed instruction."),
+ numRegReads{
+ &numIntRegReads,
+ &numFpRegReads,
+ &numVecRegReads,
+ &numVecRegReads,
+ &numVecPredRegReads,
+ &numCCRegReads
+ },
+ numRegWrites{
+ &numIntRegWrites,
+ &numFpRegWrites,
+ &numVecRegWrites,
+ &numVecRegWrites,
+ &numVecPredRegWrites,
+ &numCCRegWrites
+ }
{
numCCRegReads
.flags(statistics::nozero);
@@ -278,6 +294,9 @@
// Instruction mix histogram by OpClass
statistics::Vector statExecutedInstType;
+ std::array<statistics::Scalar *, CCRegClass + 1> numRegReads;
+ std::array<statistics::Scalar *, CCRegClass + 1> numRegWrites;
+
} execContextStats;
public:
@@ -292,23 +311,7 @@
getRegOperand(const StaticInst *si, int idx) override
{
const RegId ® = si->srcRegIdx(idx);
- const RegClassType type = reg.classValue();
- switch (type) {
- case IntRegClass:
- execContextStats.numIntRegReads++;
- break;
- case FloatRegClass:
- execContextStats.numFpRegReads++;
- break;
- case CCRegClass:
- execContextStats.numCCRegReads++;
- break;
- case VecElemClass:
- execContextStats.numVecRegReads++;
- break;
- default:
- break;
- }
+ (*execContextStats.numRegReads[reg.classValue()])++;
return thread->getReg(reg);
}
@@ -316,27 +319,7 @@
getRegOperand(const StaticInst *si, int idx, void *val) override
{
const RegId ® = si->srcRegIdx(idx);
- const RegClassType type = reg.classValue();
- switch (type) {
- case IntRegClass:
- execContextStats.numIntRegReads++;
- break;
- case FloatRegClass:
- execContextStats.numFpRegReads++;
- break;
- case VecRegClass:
- case VecElemClass:
- execContextStats.numVecRegReads++;
- break;
- case VecPredRegClass:
- execContextStats.numVecPredRegReads++;
- break;
- case CCRegClass:
- execContextStats.numCCRegReads++;
- break;
- default:
- break;
- }
+ (*execContextStats.numRegReads[reg.classValue()])++;
thread->getReg(reg, val);
}
@@ -344,17 +327,7 @@
getWritableRegOperand(const StaticInst *si, int idx) override
{
const RegId ® = si->destRegIdx(idx);
- const RegClassType type = reg.classValue();
- switch (type) {
- case VecRegClass:
- execContextStats.numVecRegWrites++;
- break;
- case VecPredRegClass:
- execContextStats.numVecPredRegWrites++;
- break;
- default:
- break;
- }
+ (*execContextStats.numRegWrites[reg.classValue()])++;
return thread->getWritableReg(reg);
}
@@ -362,23 +335,7 @@
setRegOperand(const StaticInst *si, int idx, RegVal val) override
{
const RegId ® = si->destRegIdx(idx);
- const RegClassType type = reg.classValue();
- switch (type) {
- case IntRegClass:
- execContextStats.numIntRegWrites++;
- break;
- case FloatRegClass:
- execContextStats.numFpRegWrites++;
- break;
- case CCRegClass:
- execContextStats.numCCRegWrites++;
- break;
- case VecElemClass:
- execContextStats.numVecRegWrites++;
- break;
- default:
- break;
- }
+ (*execContextStats.numRegWrites[reg.classValue()])++;
thread->setReg(reg, val);
}
@@ -386,27 +343,7 @@
setRegOperand(const StaticInst *si, int idx, const void *val) override
{
const RegId ® = si->destRegIdx(idx);
- const RegClassType type = reg.classValue();
- switch (type) {
- case IntRegClass:
- execContextStats.numIntRegWrites++;
- break;
- case FloatRegClass:
- execContextStats.numFpRegWrites++;
- break;
- case VecRegClass:
- case VecElemClass:
- execContextStats.numVecRegWrites++;
- break;
- case VecPredRegClass:
- execContextStats.numVecPredRegWrites++;
- break;
- case CCRegClass:
- execContextStats.numCCRegWrites++;
- break;
- default:
- break;
- }
+ (*execContextStats.numRegWrites[reg.classValue()])++;
thread->setReg(reg, val);
}
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49693
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I845d0c01ba5b930d46b36147a3136fd721241ed9
Gerrit-Change-Number: 49693
Gerrit-PatchSet: 50
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-Reviewer: Gabe Black <[email protected]>
Gerrit-Reviewer: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-Reviewer: kokoro <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s