Made x86 ExtMachInsts distinguishable from each other by defining a real == and a real hash function.
--HG-- extra : convert_revision : 30f29a36f6ab44e67e62aaf81b685fbe1267c746
This commit is contained in:
parent
6010c6ded4
commit
65fedeb5a7
2 changed files with 29 additions and 3 deletions
|
@ -161,7 +161,26 @@ namespace X86ISA
|
|||
inline static bool
|
||||
operator == (const ExtMachInst &emi1, const ExtMachInst &emi2)
|
||||
{
|
||||
//Since this is empty, it's always equal
|
||||
if(emi1.legacy != emi2.legacy)
|
||||
return false;
|
||||
if(emi1.rex != emi2.rex)
|
||||
return false;
|
||||
if(emi1.opcode.num != emi2.opcode.num)
|
||||
return false;
|
||||
if(emi1.opcode.op != emi2.opcode.op)
|
||||
return false;
|
||||
if(emi1.opcode.prefixA != emi2.opcode.prefixA)
|
||||
return false;
|
||||
if(emi1.opcode.prefixB != emi2.opcode.prefixB)
|
||||
return false;
|
||||
if(emi1.modRM != emi2.modRM)
|
||||
return false;
|
||||
if(emi1.sib != emi2.sib)
|
||||
return false;
|
||||
if(emi1.immediate != emi2.immediate)
|
||||
return false;
|
||||
if(emi1.displacement != emi2.displacement)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -70,8 +70,15 @@ namespace __hash_namespace {
|
|||
template<>
|
||||
struct hash<X86ISA::ExtMachInst> {
|
||||
size_t operator()(const X86ISA::ExtMachInst &emi) const {
|
||||
//Because these are all the same, return 0
|
||||
return 0;
|
||||
return (((uint64_t)emi.legacy << 56) |
|
||||
((uint64_t)emi.rex << 48) |
|
||||
((uint64_t)emi.modRM << 40) |
|
||||
((uint64_t)emi.sib << 32) |
|
||||
((uint64_t)emi.opcode.num << 24) |
|
||||
((uint64_t)emi.opcode.prefixA << 16) |
|
||||
((uint64_t)emi.opcode.prefixB << 8) |
|
||||
((uint64_t)emi.opcode.op)) ^
|
||||
emi.immediate ^ emi.displacement;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue