decode_cache.hh revision 9022
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" 39 40namespace TheISA 41{ 42 class Decoder; 43} 44 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; 53 struct DecodePage { 54 StaticInstPtr insts[TheISA::PageBytes]; 55 }; 56 57 /// A store of DecodePages. Basically a slightly smarter hash_map. 58 class DecodePages 59 { 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; 68 void update(PageIt recentest); 69 void addPage(Addr addr, DecodePage *page); 70 71 public: 72 /// Constructor 73 DecodePages(); 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. 79 DecodePage *getPage(Addr addr); 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. 86 StaticInstPtr decode(TheISA::Decoder * const decoder, 87 ExtMachInst mach_inst, Addr addr); 88}; 89 90#endif // __CPU_DECODE_CACHE_HH__ 91