cpu: Work around gcc 4.9 issues with Num_OpClasses
This patch fixes a recent issue with gcc 4.9 (and possibly more) being convinced that indices outside the array bounds are used when initialising the FUPool members.
This commit is contained in:
parent
eb1a9977bf
commit
d0d933facc
4 changed files with 40 additions and 42 deletions
|
@ -150,7 +150,7 @@ Execute::Execute(const std::string &name_,
|
|||
}
|
||||
|
||||
/** Check that there is a functional unit for all operation classes */
|
||||
for (int op_class = No_OpClass + 1; op_class < Num_OpClass; op_class++) {
|
||||
for (int op_class = No_OpClass + 1; op_class < Num_OpClasses; op_class++) {
|
||||
bool found_fu = false;
|
||||
unsigned int fu_index = 0;
|
||||
|
||||
|
|
|
@ -87,10 +87,8 @@ FUPool::FUPool(const Params *p)
|
|||
|
||||
funcUnits.clear();
|
||||
|
||||
for (int i = 0; i < Num_OpClasses; ++i) {
|
||||
maxOpLatencies[i] = Cycles(0);
|
||||
pipelined[i] = true;
|
||||
}
|
||||
maxOpLatencies.fill(Cycles(0));
|
||||
pipelined.fill(true);
|
||||
|
||||
//
|
||||
// Iterate through the list of FUDescData structures
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#ifndef __CPU_O3_FU_POOL_HH__
|
||||
#define __CPU_O3_FU_POOL_HH__
|
||||
|
||||
#include <array>
|
||||
#include <bitset>
|
||||
#include <list>
|
||||
#include <string>
|
||||
|
@ -71,9 +72,9 @@ class FUPool : public SimObject
|
|||
{
|
||||
private:
|
||||
/** Maximum op execution latencies, per op class. */
|
||||
Cycles maxOpLatencies[Num_OpClasses];
|
||||
std::array<Cycles, Num_OpClasses> maxOpLatencies;
|
||||
/** Whether op is pipelined or not. */
|
||||
bool pipelined[Num_OpClasses];
|
||||
std::array<bool, Num_OpClasses> pipelined;
|
||||
|
||||
/** Bitvector listing capabilities of this FU pool. */
|
||||
std::bitset<Num_OpClasses> capabilityList;
|
||||
|
|
|
@ -51,41 +51,40 @@
|
|||
*/
|
||||
using Enums::OpClass;
|
||||
using Enums::No_OpClass;
|
||||
using Enums::Num_OpClass;
|
||||
|
||||
const OpClass IntAluOp = Enums::IntAlu;
|
||||
const OpClass IntMultOp = Enums::IntMult;
|
||||
const OpClass IntDivOp = Enums::IntDiv;
|
||||
const OpClass FloatAddOp = Enums::FloatAdd;
|
||||
const OpClass FloatCmpOp = Enums::FloatCmp;
|
||||
const OpClass FloatCvtOp = Enums::FloatCvt;
|
||||
const OpClass FloatMultOp = Enums::FloatMult;
|
||||
const OpClass FloatDivOp = Enums::FloatDiv;
|
||||
const OpClass FloatSqrtOp = Enums::FloatSqrt;
|
||||
const OpClass SimdAddOp = Enums::SimdAdd;
|
||||
const OpClass SimdAddAccOp = Enums::SimdAddAcc;
|
||||
const OpClass SimdAluOp = Enums::SimdAlu;
|
||||
const OpClass SimdCmpOp = Enums::SimdCmp;
|
||||
const OpClass SimdCvtOp = Enums::SimdCvt;
|
||||
const OpClass SimdMiscOp = Enums::SimdMisc;
|
||||
const OpClass SimdMultOp = Enums::SimdMult;
|
||||
const OpClass SimdMultAccOp = Enums::SimdMultAcc;
|
||||
const OpClass SimdShiftOp = Enums::SimdShift;
|
||||
const OpClass SimdShiftAccOp = Enums::SimdShiftAcc;
|
||||
const OpClass SimdSqrtOp = Enums::SimdSqrt;
|
||||
const OpClass SimdFloatAddOp = Enums::SimdFloatAdd;
|
||||
const OpClass SimdFloatAluOp = Enums::SimdFloatAlu;
|
||||
const OpClass SimdFloatCmpOp = Enums::SimdFloatCmp;
|
||||
const OpClass SimdFloatCvtOp = Enums::SimdFloatCvt;
|
||||
const OpClass SimdFloatDivOp = Enums::SimdFloatDiv;
|
||||
const OpClass SimdFloatMiscOp = Enums::SimdFloatMisc;
|
||||
const OpClass SimdFloatMultOp = Enums::SimdFloatMult;
|
||||
const OpClass SimdFloatMultAccOp = Enums::SimdFloatMultAcc;
|
||||
const OpClass SimdFloatSqrtOp = Enums::SimdFloatSqrt;
|
||||
const OpClass MemReadOp = Enums::MemRead;
|
||||
const OpClass MemWriteOp = Enums::MemWrite;
|
||||
const OpClass IprAccessOp = Enums::IprAccess;
|
||||
const OpClass InstPrefetchOp = Enums::InstPrefetch;
|
||||
const OpClass Num_OpClasses = Num_OpClass;
|
||||
static const OpClass IntAluOp = Enums::IntAlu;
|
||||
static const OpClass IntMultOp = Enums::IntMult;
|
||||
static const OpClass IntDivOp = Enums::IntDiv;
|
||||
static const OpClass FloatAddOp = Enums::FloatAdd;
|
||||
static const OpClass FloatCmpOp = Enums::FloatCmp;
|
||||
static const OpClass FloatCvtOp = Enums::FloatCvt;
|
||||
static const OpClass FloatMultOp = Enums::FloatMult;
|
||||
static const OpClass FloatDivOp = Enums::FloatDiv;
|
||||
static const OpClass FloatSqrtOp = Enums::FloatSqrt;
|
||||
static const OpClass SimdAddOp = Enums::SimdAdd;
|
||||
static const OpClass SimdAddAccOp = Enums::SimdAddAcc;
|
||||
static const OpClass SimdAluOp = Enums::SimdAlu;
|
||||
static const OpClass SimdCmpOp = Enums::SimdCmp;
|
||||
static const OpClass SimdCvtOp = Enums::SimdCvt;
|
||||
static const OpClass SimdMiscOp = Enums::SimdMisc;
|
||||
static const OpClass SimdMultOp = Enums::SimdMult;
|
||||
static const OpClass SimdMultAccOp = Enums::SimdMultAcc;
|
||||
static const OpClass SimdShiftOp = Enums::SimdShift;
|
||||
static const OpClass SimdShiftAccOp = Enums::SimdShiftAcc;
|
||||
static const OpClass SimdSqrtOp = Enums::SimdSqrt;
|
||||
static const OpClass SimdFloatAddOp = Enums::SimdFloatAdd;
|
||||
static const OpClass SimdFloatAluOp = Enums::SimdFloatAlu;
|
||||
static const OpClass SimdFloatCmpOp = Enums::SimdFloatCmp;
|
||||
static const OpClass SimdFloatCvtOp = Enums::SimdFloatCvt;
|
||||
static const OpClass SimdFloatDivOp = Enums::SimdFloatDiv;
|
||||
static const OpClass SimdFloatMiscOp = Enums::SimdFloatMisc;
|
||||
static const OpClass SimdFloatMultOp = Enums::SimdFloatMult;
|
||||
static const OpClass SimdFloatMultAccOp = Enums::SimdFloatMultAcc;
|
||||
static const OpClass SimdFloatSqrtOp = Enums::SimdFloatSqrt;
|
||||
static const OpClass MemReadOp = Enums::MemRead;
|
||||
static const OpClass MemWriteOp = Enums::MemWrite;
|
||||
static const OpClass IprAccessOp = Enums::IprAccess;
|
||||
static const OpClass InstPrefetchOp = Enums::InstPrefetch;
|
||||
static const OpClass Num_OpClasses = Enums::Num_OpClass;
|
||||
|
||||
#endif // __CPU__OP_CLASS_HH__
|
||||
|
|
Loading…
Reference in a new issue