arch-arm,cpu: Introduce a getEMI virtual method on StaticInst.
authorGabe Black <gabe.black@gmail.com>
Fri, 29 Jan 2021 01:18:26 +0000 (17:18 -0800)
committerGabe Black <gabe.black@gmail.com>
Wed, 3 Feb 2021 06:08:37 +0000 (06:08 +0000)
This takes the place of direct access to the machInst field as used in
the MinorCPU model which makes the incorrect assumption that it can
arbitrarily treat the ExtMachInst as an integer, and that masking in a
certain way can meaningfully classify what the instruction will do.

Because that assumption is not correct in general, that had been
ifdef-ed out in most ISAs except ARM, and for the other ISAs the value
was simply set to zero.

Change-Id: I8ac05e65475edc3ccc044afdff09490e2c05ba07
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/40098
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Bobby R. Bruce <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/insts/static_inst.hh
src/cpu/minor/func_unit.cc
src/cpu/static_inst.hh

index e101d93fa8fec078271ca9da5f4b7943032b8e7f..908641c49f9dcd341810704a7c6d56bfe8245a37 100644 (file)
@@ -197,6 +197,8 @@ class ArmStaticInst : public StaticInst
         pcState.advance();
     }
 
+    uint64_t getEMI() const override { return machInst; }
+
     std::string generateDisassembly(
             Addr pc, const Loader::SymbolTable *symtab) const override;
 
index 58f3a1e7219e7ed1cf7df0b66b4d6184ab52ad0d..8c5e3a6bb40d4e4946edb323b4ecc78a4319f31a 100644 (file)
@@ -171,13 +171,12 @@ FUPipeline::advance()
 MinorFUTiming *
 FUPipeline::findTiming(const StaticInstPtr &inst)
 {
-#if THE_ISA == ARM_ISA
-    /* This should work for any ISA with a POD mach_inst */
-    TheISA::ExtMachInst mach_inst = inst->machInst;
-#else
-    /* Just allow extra decode based on op classes */
-    uint64_t mach_inst = 0;
-#endif
+    /*
+     * This will only work on ISAs with an instruction format with a fixed size
+     * which can be categorized using bit masks. This is really only supported
+     * on ARM and is a bit of a hack.
+     */
+    uint64_t mach_inst = inst->getEMI();
 
     const std::vector<MinorFUTiming *> &timings =
         description.timings;
index 09f171f5bafdc9e10548ceda31a7dd2b5481b009..b2cd50851bf6256527052b920ec5127d466ef99e 100644 (file)
@@ -258,6 +258,8 @@ class StaticInst : public RefCounted, public StaticInstFlags
     /// The binary machine instruction.
     const TheISA::ExtMachInst machInst;
 
+    virtual uint64_t getEMI() const { return 0; }
+
   protected:
 
     /**