diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2007-04-04 14:27:00 +0000 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2007-04-04 14:27:00 +0000 |
commit | 65fedeb5a7fd6ebb25379e20845f75635f28fdb6 (patch) | |
tree | 1c4d40eda67d7b8b27c95cdd498df05c1c313b85 /src/arch | |
parent | 6010c6ded4e6d6c2cdaf5ac08678165580a29008 (diff) | |
download | gem5-65fedeb5a7fd6ebb25379e20845f75635f28fdb6.tar.xz |
Made x86 ExtMachInsts distinguishable from each other by defining a real == and a real hash function.
--HG--
extra : convert_revision : 30f29a36f6ab44e67e62aaf81b685fbe1267c746
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/types.hh | 21 | ||||
-rw-r--r-- | src/arch/x86/utility.hh | 11 |
2 files changed, 29 insertions, 3 deletions
diff --git a/src/arch/x86/types.hh b/src/arch/x86/types.hh index ca4a15d24..cdac3c00e 100644 --- a/src/arch/x86/types.hh +++ b/src/arch/x86/types.hh @@ -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; } diff --git a/src/arch/x86/utility.hh b/src/arch/x86/utility.hh index d89e223de..e0bd09515 100644 --- a/src/arch/x86/utility.hh +++ b/src/arch/x86/utility.hh @@ -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; }; }; } |