diff options
Diffstat (limited to 'src/cpu/o3/cpu.hh')
-rw-r--r-- | src/cpu/o3/cpu.hh | 89 |
1 files changed, 88 insertions, 1 deletions
diff --git a/src/cpu/o3/cpu.hh b/src/cpu/o3/cpu.hh index b5cbc5fe2..d78d1b9d3 100644 --- a/src/cpu/o3/cpu.hh +++ b/src/cpu/o3/cpu.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 ARM Limited + * Copyright (c) 2011-2013, 2016 ARM Limited * Copyright (c) 2013 Advanced Micro Devices, Inc. * All rights reserved * @@ -53,6 +53,7 @@ #include <set> #include <vector> +#include "arch/generic/types.hh" #include "arch/types.hh" #include "base/statistics.hh" #include "config/the_isa.hh" @@ -103,6 +104,9 @@ class FullO3CPU : public BaseO3CPU typedef typename Impl::DynInstPtr DynInstPtr; typedef typename Impl::O3CPU O3CPU; + using VecElem = TheISA::VecElem; + using VecRegContainer = TheISA::VecRegContainer; + typedef O3ThreadState<Impl> ImplState; typedef O3ThreadState<Impl> Thread; @@ -417,6 +421,46 @@ class FullO3CPU : public BaseO3CPU TheISA::FloatRegBits readFloatRegBits(PhysRegIdPtr phys_reg); + const VecRegContainer& readVecReg(PhysRegIdPtr reg_idx) const; + + /** + * Read physical vector register for modification. + */ + VecRegContainer& getWritableVecReg(PhysRegIdPtr reg_idx); + + /** + * Read physical vector register lane + */ + template<typename VecElem, int LaneIdx> + VecLaneT<VecElem, true> + readVecLane(PhysRegIdPtr phys_reg) const + { + vecRegfileReads++; + return regFile.readVecLane<VecElem, LaneIdx>(phys_reg); + } + + /** + * Read physical vector register lane + */ + template<typename VecElem> + VecLaneT<VecElem, true> + readVecLane(PhysRegIdPtr phys_reg) const + { + vecRegfileReads++; + return regFile.readVecLane<VecElem>(phys_reg); + } + + /** Write a lane of the destination vector register. */ + template<typename LD> + void + setVecLane(PhysRegIdPtr phys_reg, const LD& val) + { + vecRegfileWrites++; + return regFile.setVecLane(phys_reg, val); + } + + const VecElem& readVecElem(PhysRegIdPtr reg_idx) const; + TheISA::CCReg readCCReg(PhysRegIdPtr phys_reg); void setIntReg(PhysRegIdPtr phys_reg, uint64_t val); @@ -425,6 +469,10 @@ class FullO3CPU : public BaseO3CPU void setFloatRegBits(PhysRegIdPtr phys_reg, TheISA::FloatRegBits val); + void setVecReg(PhysRegIdPtr reg_idx, const VecRegContainer& val); + + void setVecElem(PhysRegIdPtr reg_idx, const VecElem& val); + void setCCReg(PhysRegIdPtr phys_reg, TheISA::CCReg val); uint64_t readArchIntReg(int reg_idx, ThreadID tid); @@ -433,6 +481,34 @@ class FullO3CPU : public BaseO3CPU uint64_t readArchFloatRegInt(int reg_idx, ThreadID tid); + const VecRegContainer& readArchVecReg(int reg_idx, ThreadID tid) const; + /** Read architectural vector register for modification. */ + VecRegContainer& getWritableArchVecReg(int reg_idx, ThreadID tid); + + /** Read architectural vector register lane. */ + template<typename VecElem> + VecLaneT<VecElem, true> + readArchVecLane(int reg_idx, int lId, ThreadID tid) const + { + PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( + RegId(VecRegClass, reg_idx)); + return readVecLane<VecElem>(phys_reg); + } + + + /** Write a lane of the destination vector register. */ + template<typename LD> + void + setArchVecLane(int reg_idx, int lId, ThreadID tid, const LD& val) + { + PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( + RegId(VecRegClass, reg_idx)); + setVecLane(phys_reg, val); + } + + const VecElem& readArchVecElem(const RegIndex& reg_idx, + const ElemIndex& ldx, ThreadID tid) const; + TheISA::CCReg readArchCCReg(int reg_idx, ThreadID tid); /** Architectural register accessors. Looks up in the commit @@ -446,6 +522,11 @@ class FullO3CPU : public BaseO3CPU void setArchFloatRegInt(int reg_idx, uint64_t val, ThreadID tid); + void setArchVecReg(int reg_idx, const VecRegContainer& val, ThreadID tid); + + void setArchVecElem(const RegIndex& reg_idx, const ElemIndex& ldx, + const VecElem& val, ThreadID tid); + void setArchCCReg(int reg_idx, TheISA::CCReg val, ThreadID tid); /** Sets the commit PC state of a specific thread. */ @@ -540,6 +621,9 @@ class FullO3CPU : public BaseO3CPU /** The commit stage. */ typename CPUPolicy::Commit commit; + /** The rename mode of the vector registers */ + Enums::VecRegRenameMode vecMode; + /** The register file. */ PhysRegFile regFile; @@ -722,6 +806,9 @@ class FullO3CPU : public BaseO3CPU //number of float register file accesses Stats::Scalar fpRegfileReads; Stats::Scalar fpRegfileWrites; + //number of vector register file accesses + mutable Stats::Scalar vecRegfileReads; + Stats::Scalar vecRegfileWrites; //number of CC register file accesses Stats::Scalar ccRegfileReads; Stats::Scalar ccRegfileWrites; |