general: Mark hash functions as noexcept
Generally hash functions shouldn't throw exceptions. It's also a requirement for the standard library-provided hash functions to not throw exceptions. An exception to this rule is made for user-defined specializations, however we can just be consistent with the standard library on this to allow it to play nicer with it. While we're at it, we can also make the std::less specializations noexcpet as well, since they also can't throw.
This commit is contained in:
parent
4a3d808354
commit
7bb5440507
7 changed files with 19 additions and 19 deletions
|
@ -196,7 +196,7 @@ void A32JitState::SetFpscr(u32 FPSCR) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 A32JitState::GetUniqueHash() const {
|
u64 A32JitState::GetUniqueHash() const noexcept {
|
||||||
return CPSR_et | FPSCR_mode | (static_cast<u64>(Reg[15]) << 32);
|
return CPSR_et | FPSCR_mode | (static_cast<u64>(Reg[15]) << 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ struct A32JitState {
|
||||||
u32 Fpscr() const;
|
u32 Fpscr() const;
|
||||||
void SetFpscr(u32 FPSCR);
|
void SetFpscr(u32 FPSCR);
|
||||||
|
|
||||||
u64 GetUniqueHash() const;
|
u64 GetUniqueHash() const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
|
|
||||||
namespace Dynarmic::BackendX64 {
|
namespace Dynarmic::BackendX64 {
|
||||||
|
|
||||||
u64 A64JitState::GetUniqueHash() const {
|
u64 A64JitState::GetUniqueHash() const noexcept {
|
||||||
u64 fpcr_u64 = static_cast<u64>(fpcr & A64::LocationDescriptor::FPCR_MASK) << 37;
|
const u64 fpcr_u64 = static_cast<u64>(fpcr & A64::LocationDescriptor::FPCR_MASK) << 37;
|
||||||
u64 pc_u64 = pc & A64::LocationDescriptor::PC_MASK;
|
const u64 pc_u64 = pc & A64::LocationDescriptor::PC_MASK;
|
||||||
return pc_u64 | fpcr_u64;
|
return pc_u64 | fpcr_u64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ struct A64JitState {
|
||||||
void SetFpcr(u32 new_fpcr);
|
void SetFpcr(u32 new_fpcr);
|
||||||
void SetFpsr(u32 new_fpcr);
|
void SetFpsr(u32 new_fpcr);
|
||||||
|
|
||||||
u64 GetUniqueHash() const;
|
u64 GetUniqueHash() const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
|
|
@ -79,13 +79,13 @@ public:
|
||||||
return LocationDescriptor(arm_pc, cpsr, A32::FPSCR{new_fpscr & FPSCR_MODE_MASK});
|
return LocationDescriptor(arm_pc, cpsr, A32::FPSCR{new_fpscr & FPSCR_MODE_MASK});
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 UniqueHash() const {
|
u64 UniqueHash() const noexcept {
|
||||||
// This value MUST BE UNIQUE.
|
// This value MUST BE UNIQUE.
|
||||||
// This calculation has to match up with EmitX64::EmitTerminalPopRSBHint
|
// This calculation has to match up with EmitX64::EmitTerminalPopRSBHint
|
||||||
u64 pc_u64 = u64(arm_pc) << 32;
|
const u64 pc_u64 = u64(arm_pc) << 32;
|
||||||
u64 fpscr_u64 = u64(fpscr.Value());
|
const u64 fpscr_u64 = u64(fpscr.Value());
|
||||||
u64 t_u64 = cpsr.T() ? 1 : 0;
|
const u64 t_u64 = cpsr.T() ? 1 : 0;
|
||||||
u64 e_u64 = cpsr.E() ? 2 : 0;
|
const u64 e_u64 = cpsr.E() ? 2 : 0;
|
||||||
return pc_u64 | fpscr_u64 | t_u64 | e_u64;
|
return pc_u64 | fpscr_u64 | t_u64 | e_u64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,13 +112,13 @@ std::ostream& operator<<(std::ostream& o, const LocationDescriptor& descriptor);
|
||||||
namespace std {
|
namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct less<Dynarmic::A32::LocationDescriptor> {
|
struct less<Dynarmic::A32::LocationDescriptor> {
|
||||||
bool operator()(const Dynarmic::A32::LocationDescriptor& x, const Dynarmic::A32::LocationDescriptor& y) const {
|
bool operator()(const Dynarmic::A32::LocationDescriptor& x, const Dynarmic::A32::LocationDescriptor& y) const noexcept {
|
||||||
return x.UniqueHash() < y.UniqueHash();
|
return x.UniqueHash() < y.UniqueHash();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template <>
|
template <>
|
||||||
struct hash<Dynarmic::A32::LocationDescriptor> {
|
struct hash<Dynarmic::A32::LocationDescriptor> {
|
||||||
size_t operator()(const Dynarmic::A32::LocationDescriptor& x) const {
|
size_t operator()(const Dynarmic::A32::LocationDescriptor& x) const noexcept {
|
||||||
return std::hash<u64>()(x.UniqueHash());
|
return std::hash<u64>()(x.UniqueHash());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -51,10 +51,10 @@ public:
|
||||||
return LocationDescriptor(static_cast<u64>(pc + amount), fpcr);
|
return LocationDescriptor(static_cast<u64>(pc + amount), fpcr);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 UniqueHash() const {
|
u64 UniqueHash() const noexcept {
|
||||||
// This value MUST BE UNIQUE.
|
// This value MUST BE UNIQUE.
|
||||||
// This calculation has to match up with EmitTerminalPopRSBHint
|
// This calculation has to match up with EmitTerminalPopRSBHint
|
||||||
u64 fpcr_u64 = static_cast<u64>(fpcr.Value()) << 37;
|
const u64 fpcr_u64 = static_cast<u64>(fpcr.Value()) << 37;
|
||||||
return pc | fpcr_u64;
|
return pc | fpcr_u64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,13 +80,13 @@ std::ostream& operator<<(std::ostream& o, const LocationDescriptor& descriptor);
|
||||||
namespace std {
|
namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct less<Dynarmic::A64::LocationDescriptor> {
|
struct less<Dynarmic::A64::LocationDescriptor> {
|
||||||
bool operator()(const Dynarmic::A64::LocationDescriptor& x, const Dynarmic::A64::LocationDescriptor& y) const {
|
bool operator()(const Dynarmic::A64::LocationDescriptor& x, const Dynarmic::A64::LocationDescriptor& y) const noexcept {
|
||||||
return x.UniqueHash() < y.UniqueHash();
|
return x.UniqueHash() < y.UniqueHash();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template <>
|
template <>
|
||||||
struct hash<Dynarmic::A64::LocationDescriptor> {
|
struct hash<Dynarmic::A64::LocationDescriptor> {
|
||||||
size_t operator()(const Dynarmic::A64::LocationDescriptor& x) const {
|
size_t operator()(const Dynarmic::A64::LocationDescriptor& x) const noexcept {
|
||||||
return std::hash<u64>()(x.UniqueHash());
|
return std::hash<u64>()(x.UniqueHash());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -38,13 +38,13 @@ std::ostream& operator<<(std::ostream& o, const LocationDescriptor& descriptor);
|
||||||
namespace std {
|
namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct less<Dynarmic::IR::LocationDescriptor> {
|
struct less<Dynarmic::IR::LocationDescriptor> {
|
||||||
bool operator()(const Dynarmic::IR::LocationDescriptor& x, const Dynarmic::IR::LocationDescriptor& y) const {
|
bool operator()(const Dynarmic::IR::LocationDescriptor& x, const Dynarmic::IR::LocationDescriptor& y) const noexcept {
|
||||||
return x.Value() < y.Value();
|
return x.Value() < y.Value();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template <>
|
template <>
|
||||||
struct hash<Dynarmic::IR::LocationDescriptor> {
|
struct hash<Dynarmic::IR::LocationDescriptor> {
|
||||||
size_t operator()(const Dynarmic::IR::LocationDescriptor& x) const {
|
size_t operator()(const Dynarmic::IR::LocationDescriptor& x) const noexcept {
|
||||||
return std::hash<u64>()(x.Value());
|
return std::hash<u64>()(x.Value());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue