From: Bradley Wang Date: Fri, 20 Jul 2018 01:28:49 +0000 (-0700) Subject: cpu: Add hash functionality for RegId class X-Git-Tag: v19.0.0.0~1961 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1bab261961536d81ca325762385ead702b2318ff;p=gem5.git cpu: Add hash functionality for RegId class Having a hash function defined within the header will allow all classes using RegId to use the class as a Key in a STL unordered_map. Change-Id: I32fd302a087c74e844dcbfce93fef9d0ed98d6bf Signed-off-by: Bradley Wang Reviewed-on: https://gem5-review.googlesource.com/11870 Reviewed-by: Giacomo Travaglini Maintainer: Jason Lowe-Power --- diff --git a/src/cpu/reg_class.hh b/src/cpu/reg_class.hh index def275ee4..617d17e35 100644 --- a/src/cpu/reg_class.hh +++ b/src/cpu/reg_class.hh @@ -82,6 +82,7 @@ class RegId { RegIndex regIdx; ElemIndex elemIdx; static constexpr size_t Scale = TheISA::NumVecElemPerVecReg; + friend struct std::hash; public: RegId() {}; RegId(RegClass reg_class, RegIndex reg_idx) @@ -201,4 +202,33 @@ class RegId { return os << rid.className() << "{" << rid.index() << "}"; } }; + +namespace std +{ +template<> +struct hash +{ + size_t operator()(const RegId& reg_id) const + { + // Extract unique integral values for the effective fields of a RegId. + const size_t flat_index = static_cast(reg_id.flatIndex()); + const size_t class_num = static_cast(reg_id.regClass); + + const size_t shifted_class_num = class_num << (sizeof(RegIndex) << 3); + + // Concatenate the class_num to the end of the flat_index, in order to + // maximize information retained. + const size_t concatenated_hash = flat_index | shifted_class_num; + + // If RegIndex is larger than size_t, then class_num will not be + // considered by this hash function, so we may wish to perform a + // different operation to include that information in the hash. + static_assert(sizeof(RegIndex) < sizeof(size_t), + "sizeof(RegIndex) should be less than sizeof(size_t)"); + + return concatenated_hash; + } +}; +} + #endif // __CPU__REG_CLASS_HH__