summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/decode_cache.hh89
1 files changed, 32 insertions, 57 deletions
diff --git a/src/cpu/decode_cache.hh b/src/cpu/decode_cache.hh
index 1bff315d1..6ed820332 100644
--- a/src/cpu/decode_cache.hh
+++ b/src/cpu/decode_cache.hh
@@ -48,45 +48,8 @@ class DecodeCache
/// Hash of decoded instructions.
typedef m5::hash_map<ExtMachInst, StaticInstPtr> InstMap;
InstMap instMap;
-
- /// A table of instructions which are already been decoded, indexed by
- /// page offset.
- class DecodePage
- {
- protected:
- StaticInstPtr instructions[TheISA::PageBytes];
-
- // A helper function to compute the index of an address in the table.
- Addr offset(Addr addr) { return addr & (TheISA::PageBytes - 1); }
-
- public:
- /// Decode the given instruction. First attempt to find it in the
- /// table, then in the generic decode cache, and finally call the
- /// actual decode function.
- ///
- /// @param mach_inst The predecoded instruction to decode.
- /// @param addr The address the instruction came from.
- /// @param cache A cache of already decoded instructions.
- /// @retval The decoded instruction object.
- StaticInstPtr
- decode(const ExtMachInst &mach_inst, Addr addr, InstMap &instMap)
- {
- StaticInstPtr si = instructions[offset(addr)];
- if (si && (si->machInst == mach_inst)) {
- return si;
- }
-
- InstMap::iterator iter = instMap.find(mach_inst);
- if (iter != instMap.end()) {
- si = iter->second;
- } else {
- si = decodeInstFunc(mach_inst);
- instMap[mach_inst] = si;
- }
-
- instructions[offset(addr)] = si;
- return si;
- }
+ struct DecodePage {
+ StaticInstPtr insts[TheISA::PageBytes];
};
/// A store of DecodePages. Basically a slightly smarter hash_map.
@@ -107,6 +70,14 @@ class DecodeCache
recent[0] = recentest;
}
+ void
+ addPage(Addr addr, DecodePage *page)
+ {
+ Addr page_addr = addr & ~(TheISA::PageBytes - 1);
+ typename PageMap::value_type to_insert(page_addr, page);
+ update(pageMap.insert(to_insert).first);
+ }
+
public:
/// Constructor
DecodePages()
@@ -119,7 +90,7 @@ class DecodeCache
/// actually look in the hash_map.
/// @param addr The address to look up.
DecodePage *
- findPage(Addr addr)
+ getPage(Addr addr)
{
Addr page_addr = addr & ~(TheISA::PageBytes - 1);
@@ -142,16 +113,10 @@ class DecodeCache
return it->second;
}
- // Didn't find it so return NULL.
- return NULL;
- }
-
- void
- addPage(Addr addr, DecodePage *page)
- {
- Addr page_addr = addr & ~(TheISA::PageBytes - 1);
- typename PageMap::value_type to_insert(page_addr, page);
- update(pageMap.insert(to_insert).first);
+ // Didn't find an existing page, so add a new one.
+ DecodePage *newPage = new DecodePage;
+ addPage(page_addr, newPage);
+ return newPage;
}
} decodePages;
@@ -163,16 +128,26 @@ class DecodeCache
decode(ExtMachInst mach_inst, Addr addr)
{
// Try to find a matching address based table of instructions.
- DecodePage *page = decodePages.findPage(addr);
- if (!page) {
- // Nothing was found, so create a new one.
- page = new DecodePage;
- decodePages.addPage(addr, page);
- }
+ DecodePage *page = decodePages.getPage(addr);
// Use the table to decode the instruction. It will fall back to other
// mechanisms if it needs to.
- return page->decode(mach_inst, addr, instMap);
+ Addr offset = addr & (TheISA::PageBytes - 1);
+ StaticInstPtr si = page->insts[offset];
+ if (si && (si->machInst == mach_inst))
+ return si;
+
+ InstMap::iterator iter = instMap.find(mach_inst);
+ if (iter != instMap.end()) {
+ si = iter->second;
+ page->insts[offset] = si;
+ return si;
+ }
+
+ si = decodeInstFunc(mach_inst);
+ instMap[mach_inst] = si;
+ page->insts[offset] = si;
+ return si;
}
};