Implement a stub nnpc for alpha that is read only as npc+4.
authorGabe Black <gblack@eecs.umich.edu>
Thu, 28 Dec 2006 19:27:45 +0000 (14:27 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 28 Dec 2006 19:27:45 +0000 (14:27 -0500)
--HG--
extra : convert_revision : d08b740d32757fa5471c9bcde9084d59a1d8102d

src/arch/alpha/regfile.hh
src/cpu/base_dyn_inst.hh
src/cpu/o3/alpha/thread_context.hh
src/cpu/o3/cpu.cc
src/cpu/ozone/cpu.hh

index c73c32baddfa1ee63ddd2d5e79113bb86fb8b762..54372da360040176564062264220cd022ef31a2e 100644 (file)
@@ -78,13 +78,11 @@ namespace AlphaISA
 
         Addr readNextNPC()
         {
-            return nnpc;
+            return npc + sizeof(MachInst);
         }
 
         void setNextNPC(Addr val)
-        {
-            nnpc = val;
-        }
+        { }
 
       protected:
         IntRegFile intRegFile;         // (signed) integer register file
index 07d53d278c39c146b5a3ec6bc257ba64c855fcbd..515cd0836bd05befbf6c2b60e4483dfa297f13a1 100644 (file)
@@ -209,6 +209,7 @@ class BaseDynInst : public FastAlloc, public RefCounted
     /** PC of this instruction. */
     Addr PC;
 
+  protected:
     /** Next non-speculative PC.  It is not filled in at fetch, but rather
      *  once the target of the branch is truly known (either decode or
      *  execute).
@@ -227,6 +228,8 @@ class BaseDynInst : public FastAlloc, public RefCounted
     /** If this is a branch that was predicted taken */
     bool predTaken;
 
+  public:
+
     /** Count of total number of dynamic instructions. */
     static int instcount;
 
@@ -390,7 +393,14 @@ class BaseDynInst : public FastAlloc, public RefCounted
     /** Returns the next NPC.  This could be the speculative next NPC if it is
      *  called prior to the actual branch target being calculated.
      */
-    Addr readNextNPC() { return nextNPC; }
+    Addr readNextNPC()
+    {
+#if ISA_HAS_DELAY_SLOT
+        return nextNPC;
+#else
+        return nextPC + sizeof(TheISA::MachInst);
+#endif
+    }
 
     /** Set the predicted target of this current instruction. */
     void setPredTarg(Addr predicted_PC, Addr predicted_NPC)
@@ -419,7 +429,8 @@ class BaseDynInst : public FastAlloc, public RefCounted
     /** Returns whether the instruction mispredicted. */
     bool mispredicted()
     {
-        return predPC != nextPC || predNPC != nextNPC;
+        return readPredPC() != readNextPC() ||
+            readPredNPC() != readNextNPC();
     }
 
     //
index e4a6735c20d2c255ce6940de83674efdbb822b5f..6d61501aca8735670def8b898e2a9cbfd692d9a1 100644 (file)
@@ -45,8 +45,7 @@ class AlphaTC : public O3ThreadContext<Impl>
 
     virtual uint64_t readNextNPC()
     {
-        panic("Alpha has no NextNPC!");
-        return 0;
+        return this->readNextPC() + sizeof(TheISA::MachInst);
     }
 
     virtual void setNextNPC(uint64_t val)
index 5616ba3985c7632cfa82a68ac4b4086f6feab64f..7c8970299b845b41e1fbad444db180d2b7524f39 100644 (file)
@@ -659,9 +659,7 @@ FullO3CPU<Impl>::insertThread(unsigned tid)
     //Set PC/NPC/NNPC
     setPC(src_tc->readPC(), tid);
     setNextPC(src_tc->readNextPC(), tid);
-#if ISA_HAS_DELAY_SLOT
     setNextNPC(src_tc->readNextNPC(), tid);
-#endif
 
     src_tc->setStatus(ThreadContext::Active);
 
index 0da446c9c64bf733b8d55ba4ed702e62d1c54afe..baea7a546d2ff7dad64d2432ee3133853f4e3223 100644 (file)
@@ -219,11 +219,19 @@ class OzoneCPU : public BaseCPU
 
         uint64_t readNextNPC()
         {
-            return 0;
+#if ISA_HAS_DELAY_SLOT
+            panic("Ozone needs to support nextNPC");
+#else
+            return thread->nextPC + sizeof(TheISA::MachInst);
+#endif
         }
 
         void setNextNPC(uint64_t val)
-        { }
+        {
+#if ISA_HAS_DELAY_SLOT
+            panic("Ozone needs to support nextNPC");
+#endif
+        }
 
       public:
         // ISA stuff: