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 <radwang@ucdavis.edu> Reviewed-on: https://gem5-review.googlesource.com/11870 Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Maintainer: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
@@ -82,6 +82,7 @@ class RegId {
|
||||
RegIndex regIdx;
|
||||
ElemIndex elemIdx;
|
||||
static constexpr size_t Scale = TheISA::NumVecElemPerVecReg;
|
||||
friend struct std::hash<RegId>;
|
||||
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<RegId>
|
||||
{
|
||||
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<size_t>(reg_id.flatIndex());
|
||||
const size_t class_num = static_cast<size_t>(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__
|
||||
|
||||
Reference in New Issue
Block a user