cpu: Dynamically instantiate O3 CPU LSQUnits
authorJoel Hestness <jthestness@gmail.com>
Wed, 11 Sep 2013 20:34:50 +0000 (15:34 -0500)
committerJoel Hestness <jthestness@gmail.com>
Wed, 11 Sep 2013 20:34:50 +0000 (15:34 -0500)
Previously, the LSQ would instantiate MaxThreads LSQUnits in the body of it's
object, but it would only initialize numThreads LSQUnits as specified by the
user. This had the effect of leaving some LSQUnits uninitialized when the
number of threads was less than MaxThreads, and when adding statistics to the
LSQUnit that must be initialized, this caused the stats initialization check to
fail. By dynamically instantiating LSQUnits, they are all initialized and this
avoids uninitialized LSQUnits from floating around during runtime.

src/cpu/o3/lsq.hh
src/cpu/o3/lsq_impl.hh

index 6857a6aca5bf39a2c7af3b4e960b2c571c34d005..36ad75aed355a2348585480a926bb12cf8f3f0d0 100644 (file)
@@ -70,6 +70,9 @@ class LSQ {
 
     /** Constructs an LSQ with the given parameters. */
     LSQ(O3CPU *cpu_ptr, IEW *iew_ptr, DerivO3CPUParams *params);
+    ~LSQ() {
+        if (thread) delete [] thread;
+    }
 
     /** Returns the name of the LSQ. */
     std::string name() const;
@@ -316,7 +319,7 @@ class LSQ {
     LSQPolicy lsqPolicy;
 
     /** The LSQ units for individual threads. */
-    LSQUnit thread[Impl::MaxThreads];
+    LSQUnit *thread;
 
     /** List of Active Threads in System. */
     std::list<ThreadID> *activeThreads;
index c796d7078fbc83a8f3aa75e13a6d0230f0ed47c7..70db92714c9e84a6f48842df1c4d4d545103ad92 100644 (file)
@@ -61,6 +61,8 @@ LSQ<Impl>::LSQ(O3CPU *cpu_ptr, IEW *iew_ptr, DerivO3CPUParams *params)
       numThreads(params->numThreads),
       retryTid(-1)
 {
+    assert(numThreads > 0 && numThreads <= Impl::MaxThreads);
+
     //**********************************************/
     //************ Handle SMT Parameters ***********/
     //**********************************************/
@@ -109,6 +111,7 @@ LSQ<Impl>::LSQ(O3CPU *cpu_ptr, IEW *iew_ptr, DerivO3CPUParams *params)
     }
 
     //Initialize LSQs
+    thread = new LSQUnit[numThreads];
     for (ThreadID tid = 0; tid < numThreads; tid++) {
         thread[tid].init(cpu, iew_ptr, params, this,
                          maxLQEntries, maxSQEntries, tid);