From 661611a8f67674e7d3a896ea967482882e0e98fe Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 28 Jul 2021 01:28:42 -0700 Subject: [PATCH] cpu: Add a mechanism which lets a reg class name its members. This can be used to get the "pretty" name for a given register index within a register class, and can be specialized per ISA, or even per ISA object. Jira Issue: https://gem5.atlassian.net/browse/GEM5-1060 Change-Id: I7b290db73c7d04e0f61293ae82fc92ca5b4fe692 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/48706 Reviewed-by: Hoa Nguyen Maintainer: Gabe Black Tested-by: kokoro --- src/cpu/reg_class.cc | 7 +++++++ src/cpu/reg_class.hh | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/cpu/reg_class.cc b/src/cpu/reg_class.cc index c8065601c3..fc39e42a5e 100644 --- a/src/cpu/reg_class.cc +++ b/src/cpu/reg_class.cc @@ -39,10 +39,17 @@ */ #include "cpu/reg_class.hh" +#include "base/cprintf.hh" namespace gem5 { +std::string +DefaultRegClassOps::regName(const RegId &id) const +{ + return csprintf("r%d", id.index()); +} + const char *RegId::regClassStrings[] = { "IntRegClass", "FloatRegClass", diff --git a/src/cpu/reg_class.hh b/src/cpu/reg_class.hh index eaa2c0e6cd..0b57487aaf 100644 --- a/src/cpu/reg_class.hh +++ b/src/cpu/reg_class.hh @@ -43,6 +43,7 @@ #include #include +#include #include "arch/vecregs.hh" #include "base/types.hh" @@ -65,19 +66,43 @@ enum RegClass MiscRegClass ///< Control (misc) register }; +class RegId; + +class RegClassOps +{ + public: + virtual std::string regName(const RegId &id) const = 0; +}; + +class DefaultRegClassOps : public RegClassOps +{ + public: + std::string regName(const RegId &id) const override; +}; + class RegClassInfo { private: size_t _size; const RegIndex _zeroReg; + static inline DefaultRegClassOps defaultOps; + RegClassOps *_ops = &defaultOps; + public: - RegClassInfo(size_t new_size, RegIndex new_zero = -1) : + RegClassInfo(size_t new_size, RegIndex new_zero=-1) : _size(new_size), _zeroReg(new_zero) {} + RegClassInfo(size_t new_size, RegClassOps &new_ops, RegIndex new_zero=-1) : + RegClassInfo(new_size, new_zero) + { + _ops = &new_ops; + } size_t size() const { return _size; } RegIndex zeroReg() const { return _zeroReg; } + + std::string regName(const RegId &id) const { return _ops->regName(id); } }; /** Register ID: describe an architectural register with its class and index.