decode_cache.hh (9021:736048daf279) decode_cache.hh (9022:bb25e7646c41)
1/*
2 * Copyright (c) 2011 Google
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 23 unchanged lines hidden (view full) ---

32#define __CPU_DECODE_CACHE_HH__
33
34#include "arch/isa_traits.hh"
35#include "arch/types.hh"
36#include "base/hashmap.hh"
37#include "config/the_isa.hh"
38#include "cpu/static_inst.hh"
39
1/*
2 * Copyright (c) 2011 Google
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 23 unchanged lines hidden (view full) ---

32#define __CPU_DECODE_CACHE_HH__
33
34#include "arch/isa_traits.hh"
35#include "arch/types.hh"
36#include "base/hashmap.hh"
37#include "config/the_isa.hh"
38#include "cpu/static_inst.hh"
39
40typedef StaticInstPtr (*DecodeInstFunc)(TheISA::ExtMachInst);
40namespace TheISA
41{
42 class Decoder;
43}
41
44
42template <DecodeInstFunc decodeInstFunc>
43class DecodeCache
44{
45 private:
46 typedef TheISA::ExtMachInst ExtMachInst;
47
48 /// Hash of decoded instructions.
49 typedef m5::hash_map<ExtMachInst, StaticInstPtr> InstMap;
50 InstMap instMap;

--- 7 unchanged lines hidden (view full) ---

58 protected:
59 typedef typename m5::hash_map<Addr, DecodePage *> PageMap;
60 typedef typename PageMap::iterator PageIt;
61 PageIt recent[2];
62 PageMap pageMap;
63
64 /// Update the small cache of recent lookups.
65 /// @param recentest The most recent result;
45class DecodeCache
46{
47 private:
48 typedef TheISA::ExtMachInst ExtMachInst;
49
50 /// Hash of decoded instructions.
51 typedef m5::hash_map<ExtMachInst, StaticInstPtr> InstMap;
52 InstMap instMap;

--- 7 unchanged lines hidden (view full) ---

60 protected:
61 typedef typename m5::hash_map<Addr, DecodePage *> PageMap;
62 typedef typename PageMap::iterator PageIt;
63 PageIt recent[2];
64 PageMap pageMap;
65
66 /// Update the small cache of recent lookups.
67 /// @param recentest The most recent result;
66 void
67 update(PageIt recentest)
68 {
69 recent[1] = recent[0];
70 recent[0] = recentest;
71 }
68 void update(PageIt recentest);
69 void addPage(Addr addr, DecodePage *page);
72
70
73 void
74 addPage(Addr addr, DecodePage *page)
75 {
76 Addr page_addr = addr & ~(TheISA::PageBytes - 1);
77 typename PageMap::value_type to_insert(page_addr, page);
78 update(pageMap.insert(to_insert).first);
79 }
80
81 public:
82 /// Constructor
71 public:
72 /// Constructor
83 DecodePages()
84 {
85 recent[0] = recent[1] = pageMap.end();
86 }
73 DecodePages();
87
88 /// Attempt to find the DecodePage which goes with a particular
89 /// address. First check the small cache of recent results, then
90 /// actually look in the hash_map.
91 /// @param addr The address to look up.
74
75 /// Attempt to find the DecodePage which goes with a particular
76 /// address. First check the small cache of recent results, then
77 /// actually look in the hash_map.
78 /// @param addr The address to look up.
92 DecodePage *
93 getPage(Addr addr)
94 {
95 Addr page_addr = addr & ~(TheISA::PageBytes - 1);
96
97 // Check against recent lookups.
98 if (recent[0] != pageMap.end()) {
99 if (recent[0]->first == page_addr)
100 return recent[0]->second;
101 if (recent[1] != pageMap.end() &&
102 recent[1]->first == page_addr) {
103 update(recent[1]);
104 // recent[1] has just become recent[0].
105 return recent[0]->second;
106 }
107 }
108
109 // Actually look in the has_map.
110 PageIt it = pageMap.find(page_addr);
111 if (it != pageMap.end()) {
112 update(it);
113 return it->second;
114 }
115
116 // Didn't find an existing page, so add a new one.
117 DecodePage *newPage = new DecodePage;
118 addPage(page_addr, newPage);
119 return newPage;
120 }
79 DecodePage *getPage(Addr addr);
121 } decodePages;
122
123 public:
124 /// Decode a machine instruction.
125 /// @param mach_inst The binary instruction to decode.
126 /// @retval A pointer to the corresponding StaticInst object.
80 } decodePages;
81
82 public:
83 /// Decode a machine instruction.
84 /// @param mach_inst The binary instruction to decode.
85 /// @retval A pointer to the corresponding StaticInst object.
127 StaticInstPtr
128 decode(ExtMachInst mach_inst, Addr addr)
129 {
130 // Try to find a matching address based table of instructions.
131 DecodePage *page = decodePages.getPage(addr);
132
133 // Use the table to decode the instruction. It will fall back to other
134 // mechanisms if it needs to.
135 Addr offset = addr & (TheISA::PageBytes - 1);
136 StaticInstPtr si = page->insts[offset];
137 if (si && (si->machInst == mach_inst))
138 return si;
139
140 InstMap::iterator iter = instMap.find(mach_inst);
141 if (iter != instMap.end()) {
142 si = iter->second;
143 page->insts[offset] = si;
144 return si;
145 }
146
147 si = decodeInstFunc(mach_inst);
148 instMap[mach_inst] = si;
149 page->insts[offset] = si;
150 return si;
151 }
86 StaticInstPtr decode(TheISA::Decoder * const decoder,
87 ExtMachInst mach_inst, Addr addr);
152};
153
154#endif // __CPU_DECODE_CACHE_HH__
88};
89
90#endif // __CPU_DECODE_CACHE_HH__