From: Gabe Black Date: Fri, 29 Jan 2021 01:02:47 +0000 (-0800) Subject: arch: Templatize the BasicDecodeCache. X-Git-Tag: develop-gem5-snapshot~162 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=eb7acc7c6567bbc47b3adaf6a5d84c25afa85bba;p=gem5.git arch: Templatize the BasicDecodeCache. While the arch/generic directory is in arch/, it still shouldn't assume any particular ISA. This change templatizes away the ISA specific types so it can be used in multiple ISAs at a time. Change-Id: I1abb4f5081a0a25f743be786ad8e7e3d55cfc67a Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/40097 Reviewed-by: Giacomo Travaglini Maintainer: Giacomo Travaglini Tested-by: kokoro --- diff --git a/src/arch/arm/decoder.cc b/src/arch/arm/decoder.cc index d7de6a255..f45849c5f 100644 --- a/src/arch/arm/decoder.cc +++ b/src/arch/arm/decoder.cc @@ -50,7 +50,7 @@ namespace ArmISA { -GenericISA::BasicDecodeCache Decoder::defaultCache; +GenericISA::BasicDecodeCache Decoder::defaultCache; Decoder::Decoder(ISA* isa) : data(0), fpscrLen(0), fpscrStride(0), diff --git a/src/arch/arm/decoder.hh b/src/arch/arm/decoder.hh index fa5b15eb1..4f8e71a02 100644 --- a/src/arch/arm/decoder.hh +++ b/src/arch/arm/decoder.hh @@ -80,7 +80,7 @@ class Decoder : public InstDecoder Enums::DecoderFlavor decoderFlavor; /// A cache of decoded instruction objects. - static GenericISA::BasicDecodeCache defaultCache; + static GenericISA::BasicDecodeCache defaultCache; /** * Pre-decode an instruction from the current state of the diff --git a/src/arch/generic/SConscript b/src/arch/generic/SConscript index 60b24d0cd..3ad4878cc 100644 --- a/src/arch/generic/SConscript +++ b/src/arch/generic/SConscript @@ -52,5 +52,4 @@ DebugFlag('TLB') if env['TARGET_ISA'] == 'null': Return() -Source('decode_cache.cc') Source('decoder.cc') diff --git a/src/arch/generic/decode_cache.cc b/src/arch/generic/decode_cache.cc deleted file mode 100644 index 341cb70fe..000000000 --- a/src/arch/generic/decode_cache.cc +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2011-2012 Google - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "arch/generic/decode_cache.hh" - -#include "arch/decoder.hh" -#include "arch/types.hh" -#include "config/the_isa.hh" -#include "cpu/static_inst.hh" - -namespace GenericISA -{ - -StaticInstPtr -BasicDecodeCache::decode(TheISA::Decoder *decoder, - TheISA::ExtMachInst mach_inst, Addr addr) -{ - StaticInstPtr &si = decodePages.lookup(addr); - if (si && (si->machInst == mach_inst)) - return si; - - auto iter = instMap.find(mach_inst); - if (iter != instMap.end()) { - si = iter->second; - return si; - } - - si = decoder->decodeInst(mach_inst); - instMap[mach_inst] = si; - return si; -} - -} // namespace GenericISA diff --git a/src/arch/generic/decode_cache.hh b/src/arch/generic/decode_cache.hh index 564cb3ef0..84f90ca3e 100644 --- a/src/arch/generic/decode_cache.hh +++ b/src/arch/generic/decode_cache.hh @@ -29,31 +29,48 @@ #ifndef __ARCH_GENERIC_DECODE_CACHE_HH__ #define __ARCH_GENERIC_DECODE_CACHE_HH__ -#include "arch/types.hh" -#include "config/the_isa.hh" +#include "base/types.hh" #include "cpu/decode_cache.hh" #include "cpu/static_inst_fwd.hh" -namespace TheISA -{ - class Decoder; -} - namespace GenericISA { +template class BasicDecodeCache { private: - DecodeCache::InstMap instMap; - DecodeCache::AddrMap decodePages; + DecodeCache::InstMap instMap; + struct AddrMapEntry + { + StaticInstPtr inst; + EMI machInst; + }; + DecodeCache::AddrMap decodePages; public: /// Decode a machine instruction. /// @param mach_inst The binary instruction to decode. /// @retval A pointer to the corresponding StaticInst object. - StaticInstPtr decode(TheISA::Decoder * const decoder, - TheISA::ExtMachInst mach_inst, Addr addr); + StaticInstPtr + decode(Decoder *const decoder, EMI mach_inst, Addr addr) + { + auto &entry = decodePages.lookup(addr); + if (entry.inst && (entry.machInst == mach_inst)) + return entry.inst; + + entry.machInst = mach_inst; + + auto iter = instMap.find(mach_inst); + if (iter != instMap.end()) { + entry.inst = iter->second; + return entry.inst; + } + + entry.inst = decoder->decodeInst(mach_inst); + instMap[mach_inst] = entry.inst; + return entry.inst; + } }; } // namespace GenericISA diff --git a/src/arch/mips/decoder.cc b/src/arch/mips/decoder.cc index 59272f68a..de5381788 100644 --- a/src/arch/mips/decoder.cc +++ b/src/arch/mips/decoder.cc @@ -31,6 +31,6 @@ namespace MipsISA { -GenericISA::BasicDecodeCache Decoder::defaultCache; +GenericISA::BasicDecodeCache Decoder::defaultCache; } diff --git a/src/arch/mips/decoder.hh b/src/arch/mips/decoder.hh index 99b2e6964..9c6ae18f1 100644 --- a/src/arch/mips/decoder.hh +++ b/src/arch/mips/decoder.hh @@ -87,7 +87,7 @@ class Decoder : public InstDecoder protected: /// A cache of decoded instruction objects. - static GenericISA::BasicDecodeCache defaultCache; + static GenericISA::BasicDecodeCache defaultCache; public: StaticInstPtr decodeInst(ExtMachInst mach_inst); diff --git a/src/arch/power/decoder.cc b/src/arch/power/decoder.cc index e57a4e5de..cc2a2bf76 100644 --- a/src/arch/power/decoder.cc +++ b/src/arch/power/decoder.cc @@ -31,6 +31,6 @@ namespace PowerISA { -GenericISA::BasicDecodeCache Decoder::defaultCache; +GenericISA::BasicDecodeCache Decoder::defaultCache; } diff --git a/src/arch/power/decoder.hh b/src/arch/power/decoder.hh index c76ffd9a0..d89c9b1d3 100644 --- a/src/arch/power/decoder.hh +++ b/src/arch/power/decoder.hh @@ -94,7 +94,7 @@ class Decoder : public InstDecoder protected: /// A cache of decoded instruction objects. - static GenericISA::BasicDecodeCache defaultCache; + static GenericISA::BasicDecodeCache defaultCache; public: StaticInstPtr decodeInst(ExtMachInst mach_inst); diff --git a/src/arch/sparc/decoder.cc b/src/arch/sparc/decoder.cc index 2a57d0024..6df388c57 100644 --- a/src/arch/sparc/decoder.cc +++ b/src/arch/sparc/decoder.cc @@ -31,6 +31,6 @@ namespace SparcISA { -GenericISA::BasicDecodeCache Decoder::defaultCache; +GenericISA::BasicDecodeCache Decoder::defaultCache; } diff --git a/src/arch/sparc/decoder.hh b/src/arch/sparc/decoder.hh index e8267fe69..8e6845131 100644 --- a/src/arch/sparc/decoder.hh +++ b/src/arch/sparc/decoder.hh @@ -101,7 +101,7 @@ class Decoder : public InstDecoder protected: /// A cache of decoded instruction objects. - static GenericISA::BasicDecodeCache defaultCache; + static GenericISA::BasicDecodeCache defaultCache; public: StaticInstPtr decodeInst(ExtMachInst mach_inst);