arch: Templatize the BasicDecodeCache.
authorGabe Black <gabe.black@gmail.com>
Fri, 29 Jan 2021 01:02:47 +0000 (17:02 -0800)
committerGabe Black <gabe.black@gmail.com>
Wed, 3 Feb 2021 03:54:34 +0000 (03:54 +0000)
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 <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/decoder.cc
src/arch/arm/decoder.hh
src/arch/generic/SConscript
src/arch/generic/decode_cache.cc [deleted file]
src/arch/generic/decode_cache.hh
src/arch/mips/decoder.cc
src/arch/mips/decoder.hh
src/arch/power/decoder.cc
src/arch/power/decoder.hh
src/arch/sparc/decoder.cc
src/arch/sparc/decoder.hh

index d7de6a255e76c322370ed6bf34622a97662b2001..f45849c5f4d305cde123c6808258b3064fcefbbd 100644 (file)
@@ -50,7 +50,7 @@
 namespace ArmISA
 {
 
-GenericISA::BasicDecodeCache Decoder::defaultCache;
+GenericISA::BasicDecodeCache<Decoder, ExtMachInst> Decoder::defaultCache;
 
 Decoder::Decoder(ISA* isa)
     : data(0), fpscrLen(0), fpscrStride(0),
index fa5b15eb1d73a2c286dfdc3deb4107c4d7bcd76d..4f8e71a02169ce646973e664a8d5ea5f89866974 100644 (file)
@@ -80,7 +80,7 @@ class Decoder : public InstDecoder
     Enums::DecoderFlavor decoderFlavor;
 
     /// A cache of decoded instruction objects.
-    static GenericISA::BasicDecodeCache defaultCache;
+    static GenericISA::BasicDecodeCache<Decoder, ExtMachInst> defaultCache;
 
     /**
      * Pre-decode an instruction from the current state of the
index 60b24d0cdef35962b4c0f1d08877ee24432f37f3..3ad4878ccc5c6cd539bba6d4a66680d825257949 100644 (file)
@@ -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 (file)
index 341cb70..0000000
+++ /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
index 564cb3ef0281e529c3c54befc71a316aca82392f..84f90ca3efcb955db7144d4fc4034774568d49e9 100644 (file)
 #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 <typename Decoder, typename EMI>
 class BasicDecodeCache
 {
   private:
-    DecodeCache::InstMap<TheISA::ExtMachInst> instMap;
-    DecodeCache::AddrMap<StaticInstPtr> decodePages;
+    DecodeCache::InstMap<EMI> instMap;
+    struct AddrMapEntry
+    {
+        StaticInstPtr inst;
+        EMI machInst;
+    };
+    DecodeCache::AddrMap<AddrMapEntry> 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
index 59272f68afbf91741cac3a88e5687aedf8706bec..de5381788c29a27068c52421e5a56e7f929d003b 100644 (file)
@@ -31,6 +31,6 @@
 namespace MipsISA
 {
 
-GenericISA::BasicDecodeCache Decoder::defaultCache;
+GenericISA::BasicDecodeCache<Decoder, ExtMachInst> Decoder::defaultCache;
 
 }
index 99b2e6964cc4898de8c7987ca44f7081cd9dc187..9c6ae18f12110bf01d5d293eb6b1a8e3eb148f7b 100644 (file)
@@ -87,7 +87,7 @@ class Decoder : public InstDecoder
 
   protected:
     /// A cache of decoded instruction objects.
-    static GenericISA::BasicDecodeCache defaultCache;
+    static GenericISA::BasicDecodeCache<Decoder, ExtMachInst> defaultCache;
 
   public:
     StaticInstPtr decodeInst(ExtMachInst mach_inst);
index e57a4e5de7f92fc9b8f10f5cd52ec46b95662b6b..cc2a2bf7648f2e37f6efcd7338375429a6ce92b1 100644 (file)
@@ -31,6 +31,6 @@
 namespace PowerISA
 {
 
-GenericISA::BasicDecodeCache Decoder::defaultCache;
+GenericISA::BasicDecodeCache<Decoder, ExtMachInst> Decoder::defaultCache;
 
 }
index c76ffd9a0f0f13a061fb396ae38dfe54968f42d9..d89c9b1d3926f8bc01c55a2a9b8a94fa4e3e5f31 100644 (file)
@@ -94,7 +94,7 @@ class Decoder : public InstDecoder
 
   protected:
     /// A cache of decoded instruction objects.
-    static GenericISA::BasicDecodeCache defaultCache;
+    static GenericISA::BasicDecodeCache<Decoder, ExtMachInst> defaultCache;
 
   public:
     StaticInstPtr decodeInst(ExtMachInst mach_inst);
index 2a57d00244f94303db9e39c5b9e153b9bd3d289f..6df388c578ec848745ac54392e25cc37b682495d 100644 (file)
@@ -31,6 +31,6 @@
 namespace SparcISA
 {
 
-GenericISA::BasicDecodeCache Decoder::defaultCache;
+GenericISA::BasicDecodeCache<Decoder, ExtMachInst> Decoder::defaultCache;
 
 }
index e8267fe698337755b4877d3561f3ba1d3098229f..8e6845131cec1410da1af62c46eb6cb777f68070 100644 (file)
@@ -101,7 +101,7 @@ class Decoder : public InstDecoder
 
   protected:
     /// A cache of decoded instruction objects.
-    static GenericISA::BasicDecodeCache defaultCache;
+    static GenericISA::BasicDecodeCache<Decoder, ExtMachInst> defaultCache;
 
   public:
     StaticInstPtr decodeInst(ExtMachInst mach_inst);