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; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Gabe Black 29 */ 30 31#ifndef __CPU_DECODE_CACHE_HH__ 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"
| 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; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Gabe Black 29 */ 30 31#ifndef __CPU_DECODE_CACHE_HH__ 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"
| 38#include "cpu/static_inst_fwd.hh"
|
39 40namespace TheISA 41{ 42 class Decoder; 43} 44
| 39 40namespace TheISA 41{ 42 class Decoder; 43} 44
|
45class DecodeCache
| 45namespace DecodeCache
|
46{
| 46{
|
47 private: 48 typedef TheISA::ExtMachInst ExtMachInst;
| |
49
| 47
|
50 /// Hash of decoded instructions. 51 typedef m5::hash_map<ExtMachInst, StaticInstPtr> InstMap; 52 InstMap instMap; 53 struct DecodePage { 54 StaticInstPtr insts[TheISA::PageBytes];
| 48/// Hash for decoded instructions. 49typedef m5::hash_map<TheISA::ExtMachInst, StaticInstPtr> InstMap; 50 51/// A sparse map from an Addr to a Value, stored in page chunks. 52template<class Value> 53class AddrMap 54{ 55 protected: 56 // A pages worth of cache entries. 57 struct CachePage { 58 Value items[TheISA::PageBytes];
|
55 };
| 59 };
|
| 60 // A map of cache pages which allows a sparse mapping. 61 typedef typename m5::hash_map<Addr, CachePage *> PageMap; 62 typedef typename PageMap::iterator PageIt; 63 // Mini cache of recent lookups. 64 PageIt recent[2]; 65 PageMap pageMap;
|
56
| 66
|
57 /// A store of DecodePages. Basically a slightly smarter hash_map. 58 class DecodePages
| 67 /// Update the mini cache of recent lookups. 68 /// @param recentest The most recent result; 69 void 70 update(PageIt recentest)
|
59 {
| 71 {
|
60 protected: 61 typedef typename m5::hash_map<Addr, DecodePage *> PageMap; 62 typedef typename PageMap::iterator PageIt; 63 PageIt recent[2]; 64 PageMap pageMap;
| 72 recent[1] = recent[0]; 73 recent[0] = recentest; 74 }
|
65
| 75
|
66 /// Update the small cache of recent lookups. 67 /// @param recentest The most recent result; 68 void update(PageIt recentest); 69 void addPage(Addr addr, DecodePage *page);
| 76 /// Attempt to find the CacheePage which goes with a particular 77 /// address. First check the small cache of recent results, then 78 /// actually look in the hash_map. 79 /// @param addr The address to look up. 80 CachePage * 81 getPage(Addr addr) 82 { 83 Addr page_addr = addr & ~(TheISA::PageBytes - 1);
|
70
| 84
|
71 public: 72 /// Constructor 73 DecodePages();
| 85 // Check against recent lookups. 86 if (recent[0] != pageMap.end()) { 87 if (recent[0]->first == page_addr) 88 return recent[0]->second; 89 if (recent[1] != pageMap.end() && 90 recent[1]->first == page_addr) { 91 update(recent[1]); 92 // recent[1] has just become recent[0]. 93 return recent[0]->second; 94 } 95 }
|
74
| 96
|
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. 79 DecodePage *getPage(Addr addr); 80 } decodePages;
| 97 // Actually look in the has_map. 98 PageIt it = pageMap.find(page_addr); 99 if (it != pageMap.end()) { 100 update(it); 101 return it->second; 102 }
|
81
| 103
|
| 104 // Didn't find an existing page, so add a new one. 105 CachePage *newPage = new CachePage; 106 page_addr = page_addr & ~(TheISA::PageBytes - 1); 107 typename PageMap::value_type to_insert(page_addr, newPage); 108 update(pageMap.insert(to_insert).first); 109 return newPage; 110 } 111
|
82 public:
| 112 public:
|
83 /// Decode a machine instruction. 84 /// @param mach_inst The binary instruction to decode. 85 /// @retval A pointer to the corresponding StaticInst object. 86 StaticInstPtr decode(TheISA::Decoder * const decoder, 87 ExtMachInst mach_inst, Addr addr);
| 113 /// Constructor 114 AddrMap() 115 { 116 recent[0] = recent[1] = pageMap.end(); 117 } 118 119 Value & 120 lookup(Addr addr) 121 { 122 CachePage *page = getPage(addr); 123 return page->items[addr & (TheISA::PageBytes - 1)]; 124 }
|
88}; 89
| 125}; 126
|
| 127} // namespace DecodeCache 128
|
90#endif // __CPU_DECODE_CACHE_HH__
| 129#endif // __CPU_DECODE_CACHE_HH__
|