O3: Generaize the O3 dynamic instruction class so it isn't split out by ISA.
[gem5.git] / src / cpu / o3 / mips / cpu_builder.cc
index 6a30ff099ae4ad5aae4f25bb0d74b8750037d964..11942e5974d28f391f2003d0722ea2ca86c107d7 100644 (file)
 
 #include <string>
 
+#include "config/full_system.hh"
 #include "config/use_checker.hh"
-#include "cpu/base.hh"
-#include "cpu/o3/mips/cpu.hh"
+#include "cpu/o3/cpu.hh"
 #include "cpu/o3/mips/impl.hh"
-#include "cpu/o3/mips/params.hh"
-#include "cpu/o3/fu_pool.hh"
 #include "params/DerivO3CPU.hh"
 
-class DerivO3CPU : public MipsO3CPU<MipsSimpleImpl>
+class DerivO3CPU : public FullO3CPU<MipsSimpleImpl>
 {
   public:
-    DerivO3CPU(MipsSimpleParams *p)
-        : MipsO3CPU<MipsSimpleImpl>(p)
+    DerivO3CPU(DerivO3CPUParams *p)
+        : FullO3CPU<MipsSimpleImpl>(p)
     { }
 };
 
 DerivO3CPU *
 DerivO3CPUParams::create()
 {
-    DerivO3CPU *cpu;
-
+#if FULL_SYSTEM
+    // Full-system only supports a single thread for the moment.
+    int actual_num_threads = 1;
+#else
     // In non-full-system mode, we infer the number of threads from
     // the workload if it's not explicitly specified.
     int actual_num_threads =
@@ -60,121 +60,20 @@ DerivO3CPUParams::create()
     if (workload.size() == 0) {
         fatal("Must specify at least one workload!");
     }
-
-    MipsSimpleParams *params = new MipsSimpleParams;
-
-    params->clock = clock;
-    params->phase = phase;
-
-    params->name = name;
-    params->numberOfThreads = actual_num_threads;
-    params->cpu_id = cpu_id;
-    params->activity = activity;
-
-    params->workload = workload;
-
-#if USE_CHECKER
-    params->checker = checker;
 #endif
 
-    params->max_insts_any_thread = max_insts_any_thread;
-    params->max_insts_all_threads = max_insts_all_threads;
-    params->max_loads_any_thread = max_loads_any_thread;
-    params->max_loads_all_threads = max_loads_all_threads;
-
-    //
-    // Caches
-    //
-    params->cachePorts = cachePorts;
-
-    params->decodeToFetchDelay = decodeToFetchDelay;
-    params->renameToFetchDelay = renameToFetchDelay;
-    params->iewToFetchDelay = iewToFetchDelay;
-    params->commitToFetchDelay = commitToFetchDelay;
-    params->fetchWidth = fetchWidth;
-
-    params->renameToDecodeDelay = renameToDecodeDelay;
-    params->iewToDecodeDelay = iewToDecodeDelay;
-    params->commitToDecodeDelay = commitToDecodeDelay;
-    params->fetchToDecodeDelay = fetchToDecodeDelay;
-    params->decodeWidth = decodeWidth;
-
-    params->iewToRenameDelay = iewToRenameDelay;
-    params->commitToRenameDelay = commitToRenameDelay;
-    params->decodeToRenameDelay = decodeToRenameDelay;
-    params->renameWidth = renameWidth;
-
-    params->commitToIEWDelay = commitToIEWDelay;
-    params->renameToIEWDelay = renameToIEWDelay;
-    params->issueToExecuteDelay = issueToExecuteDelay;
-    params->dispatchWidth = dispatchWidth;
-    params->issueWidth = issueWidth;
-    params->wbWidth = wbWidth;
-    params->wbDepth = wbDepth;
-    params->fuPool = fuPool;
-
-    params->iewToCommitDelay = iewToCommitDelay;
-    params->renameToROBDelay = renameToROBDelay;
-    params->commitWidth = commitWidth;
-    params->squashWidth = squashWidth;
-    params->trapLatency = trapLatency;
-
-    params->backComSize = backComSize;
-    params->forwardComSize = forwardComSize;
-
-    params->predType = predType;
-    params->localPredictorSize = localPredictorSize;
-    params->localCtrBits = localCtrBits;
-    params->localHistoryTableSize = localHistoryTableSize;
-    params->localHistoryBits = localHistoryBits;
-    params->globalPredictorSize = globalPredictorSize;
-    params->globalCtrBits = globalCtrBits;
-    params->globalHistoryBits = globalHistoryBits;
-    params->choicePredictorSize = choicePredictorSize;
-    params->choiceCtrBits = choiceCtrBits;
-
-    params->BTBEntries = BTBEntries;
-    params->BTBTagSize = BTBTagSize;
-
-    params->RASSize = RASSize;
-
-    params->LQEntries = LQEntries;
-    params->SQEntries = SQEntries;
-
-    params->SSITSize = SSITSize;
-    params->LFSTSize = LFSTSize;
-
-    params->numPhysIntRegs = numPhysIntRegs;
-    params->numPhysFloatRegs = numPhysFloatRegs;
-    params->numIQEntries = numIQEntries;
-    params->numROBEntries = numROBEntries;
-
-    params->smtNumFetchingThreads = smtNumFetchingThreads;
+    numThreads = actual_num_threads;
 
     // Default smtFetchPolicy to "RoundRobin", if necessary.
     std::string round_robin_policy = "RoundRobin";
     std::string single_thread = "SingleThread";
 
     if (actual_num_threads > 1 && single_thread.compare(smtFetchPolicy) == 0)
-        params->smtFetchPolicy = round_robin_policy;
+        smtFetchPolicy = round_robin_policy;
     else
-        params->smtFetchPolicy = smtFetchPolicy;
-
-    params->smtIQPolicy    = smtIQPolicy;
-    params->smtLSQPolicy    = smtLSQPolicy;
-    params->smtLSQThreshold = smtLSQThreshold;
-    params->smtROBPolicy   = smtROBPolicy;
-    params->smtROBThreshold = smtROBThreshold;
-    params->smtCommitPolicy = smtCommitPolicy;
-
-    params->instShiftAmt = 2;
-
-    params->deferRegistration = defer_registration;
-
-    params->functionTrace = function_trace;
-    params->functionTraceStart = function_trace_start;
+        smtFetchPolicy = smtFetchPolicy;
 
-    cpu = new DerivO3CPU(params);
+    instShiftAmt = 2;
 
-    return cpu;
+    return new DerivO3CPU(this);
 }