84a85
> friend struct std::hash<RegId>;
203a205,233
>
> 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;
> }
> };
> }
>