decode_cache.hh (8541:27aaee8ec7cc) decode_cache.hh (9021:736048daf279)
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;

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

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;
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;

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

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;
51
52 /// A table of instructions which are already been decoded, indexed by
53 /// page offset.
54 class DecodePage
55 {
56 protected:
57 StaticInstPtr instructions[TheISA::PageBytes];
58
59 // A helper function to compute the index of an address in the table.
60 Addr offset(Addr addr) { return addr & (TheISA::PageBytes - 1); }
61
62 public:
63 /// Decode the given instruction. First attempt to find it in the
64 /// table, then in the generic decode cache, and finally call the
65 /// actual decode function.
66 ///
67 /// @param mach_inst The predecoded instruction to decode.
68 /// @param addr The address the instruction came from.
69 /// @param cache A cache of already decoded instructions.
70 /// @retval The decoded instruction object.
71 StaticInstPtr
72 decode(const ExtMachInst &mach_inst, Addr addr, InstMap &instMap)
73 {
74 StaticInstPtr si = instructions[offset(addr)];
75 if (si && (si->machInst == mach_inst)) {
76 return si;
77 }
78
79 InstMap::iterator iter = instMap.find(mach_inst);
80 if (iter != instMap.end()) {
81 si = iter->second;
82 } else {
83 si = decodeInstFunc(mach_inst);
84 instMap[mach_inst] = si;
85 }
86
87 instructions[offset(addr)] = si;
88 return si;
89 }
51 struct DecodePage {
52 StaticInstPtr insts[TheISA::PageBytes];
90 };
91
92 /// A store of DecodePages. Basically a slightly smarter hash_map.
93 class DecodePages
94 {
95 protected:
96 typedef typename m5::hash_map<Addr, DecodePage *> PageMap;
97 typedef typename PageMap::iterator PageIt;

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

102 /// @param recentest The most recent result;
103 void
104 update(PageIt recentest)
105 {
106 recent[1] = recent[0];
107 recent[0] = recentest;
108 }
109
53 };
54
55 /// A store of DecodePages. Basically a slightly smarter hash_map.
56 class DecodePages
57 {
58 protected:
59 typedef typename m5::hash_map<Addr, DecodePage *> PageMap;
60 typedef typename PageMap::iterator PageIt;

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

65 /// @param recentest The most recent result;
66 void
67 update(PageIt recentest)
68 {
69 recent[1] = recent[0];
70 recent[0] = recentest;
71 }
72
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
110 public:
111 /// Constructor
112 DecodePages()
113 {
114 recent[0] = recent[1] = pageMap.end();
115 }
116
117 /// Attempt to find the DecodePage which goes with a particular
118 /// address. First check the small cache of recent results, then
119 /// actually look in the hash_map.
120 /// @param addr The address to look up.
121 DecodePage *
81 public:
82 /// Constructor
83 DecodePages()
84 {
85 recent[0] = recent[1] = pageMap.end();
86 }
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.
92 DecodePage *
122 findPage(Addr addr)
93 getPage(Addr addr)
123 {
124 Addr page_addr = addr & ~(TheISA::PageBytes - 1);
125
126 // Check against recent lookups.
127 if (recent[0] != pageMap.end()) {
128 if (recent[0]->first == page_addr)
129 return recent[0]->second;
130 if (recent[1] != pageMap.end() &&

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

137
138 // Actually look in the has_map.
139 PageIt it = pageMap.find(page_addr);
140 if (it != pageMap.end()) {
141 update(it);
142 return it->second;
143 }
144
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() &&

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

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
145 // Didn't find it so return NULL.
146 return NULL;
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;
147 }
120 }
148
149 void
150 addPage(Addr addr, DecodePage *page)
151 {
152 Addr page_addr = addr & ~(TheISA::PageBytes - 1);
153 typename PageMap::value_type to_insert(page_addr, page);
154 update(pageMap.insert(to_insert).first);
155 }
156 } decodePages;
157
158 public:
159 /// Decode a machine instruction.
160 /// @param mach_inst The binary instruction to decode.
161 /// @retval A pointer to the corresponding StaticInst object.
162 StaticInstPtr
163 decode(ExtMachInst mach_inst, Addr addr)
164 {
165 // Try to find a matching address based table of instructions.
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.
127 StaticInstPtr
128 decode(ExtMachInst mach_inst, Addr addr)
129 {
130 // Try to find a matching address based table of instructions.
166 DecodePage *page = decodePages.findPage(addr);
167 if (!page) {
168 // Nothing was found, so create a new one.
169 page = new DecodePage;
170 decodePages.addPage(addr, page);
171 }
131 DecodePage *page = decodePages.getPage(addr);
172
173 // Use the table to decode the instruction. It will fall back to other
174 // mechanisms if it needs to.
132
133 // Use the table to decode the instruction. It will fall back to other
134 // mechanisms if it needs to.
175 return page->decode(mach_inst, addr, instMap);
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;
176 }
177};
178
179#endif // __CPU_DECODE_CACHE_HH__
151 }
152};
153
154#endif // __CPU_DECODE_CACHE_HH__