diff options
author | Giacomo Gabrielli <giacomo.gabrielli@arm.com> | 2018-10-16 16:04:08 +0100 |
---|---|---|
committer | Giacomo Gabrielli <giacomo.gabrielli@arm.com> | 2019-01-30 16:57:54 +0000 |
commit | 25474167e5b247d1b91fbf802c5b396a63ae705e (patch) | |
tree | b509597b23d792734f55c33b8125eebfbd9cd3a5 /src/cpu/simple_thread.hh | |
parent | c6f5db8743f19b02a38146d9cf2a829883387008 (diff) | |
download | gem5-25474167e5b247d1b91fbf802c5b396a63ae705e.tar.xz |
arch,cpu: Add vector predicate registers
Latest-gen. vector/SIMD extensions, including the Arm Scalable Vector
Extension (SVE), introduce the notion of a predicate register file.
This changeset adds this feature across architectures and CPU models.
Change-Id: Iebcadbad89c0a582ff8b1b70de353305db603946
Signed-off-by: Giacomo Gabrielli <giacomo.gabrielli@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/13715
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/cpu/simple_thread.hh')
-rw-r--r-- | src/cpu/simple_thread.hh | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/src/cpu/simple_thread.hh b/src/cpu/simple_thread.hh index 211a4c89f..00355c602 100644 --- a/src/cpu/simple_thread.hh +++ b/src/cpu/simple_thread.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2012, 2016 ARM Limited + * Copyright (c) 2011-2012, 2016-2018 ARM Limited * Copyright (c) 2013 Advanced Micro Devices, Inc. * All rights reserved * @@ -58,6 +58,7 @@ #include "debug/CCRegs.hh" #include "debug/FloatRegs.hh" #include "debug/IntRegs.hh" +#include "debug/VecPredRegs.hh" #include "debug/VecRegs.hh" #include "mem/page_table.hh" #include "mem/request.hh" @@ -102,6 +103,7 @@ class SimpleThread : public ThreadState typedef TheISA::CCReg CCReg; using VecRegContainer = TheISA::VecRegContainer; using VecElem = TheISA::VecElem; + using VecPredRegContainer = TheISA::VecPredRegContainer; public: typedef ThreadContext::Status Status; @@ -109,6 +111,7 @@ class SimpleThread : public ThreadState RegVal floatRegs[TheISA::NumFloatRegs]; RegVal intRegs[TheISA::NumIntRegs]; VecRegContainer vecRegs[TheISA::NumVecRegs]; + VecPredRegContainer vecPredRegs[TheISA::NumVecPredRegs]; #ifdef ISA_HAS_CC_REGS TheISA::CCReg ccRegs[TheISA::NumCCRegs]; #endif @@ -228,6 +231,9 @@ class SimpleThread : public ThreadState for (int i = 0; i < TheISA::NumVecRegs; i++) { vecRegs[i].zero(); } + for (int i = 0; i < TheISA::NumVecPredRegs; i++) { + vecPredRegs[i].reset(); + } #ifdef ISA_HAS_CC_REGS memset(ccRegs, 0, sizeof(ccRegs)); #endif @@ -266,7 +272,7 @@ class SimpleThread : public ThreadState assert(flatIndex < TheISA::NumVecRegs); const VecRegContainer& regVal = readVecRegFlat(flatIndex); DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s.\n", - reg.index(), flatIndex, regVal.as<TheISA::VecElem>().print()); + reg.index(), flatIndex, regVal.print()); return regVal; } @@ -277,7 +283,7 @@ class SimpleThread : public ThreadState assert(flatIndex < TheISA::NumVecRegs); VecRegContainer& regVal = getWritableVecRegFlat(flatIndex); DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s for modify.\n", - reg.index(), flatIndex, regVal.as<TheISA::VecElem>().print()); + reg.index(), flatIndex, regVal.print()); return regVal; } @@ -350,6 +356,28 @@ class SimpleThread : public ThreadState return regVal; } + const VecPredRegContainer& + readVecPredReg(const RegId& reg) const + { + int flatIndex = isa->flattenVecPredIndex(reg.index()); + assert(flatIndex < TheISA::NumVecPredRegs); + const VecPredRegContainer& regVal = readVecPredRegFlat(flatIndex); + DPRINTF(VecPredRegs, "Reading predicate reg %d (%d) as %s.\n", + reg.index(), flatIndex, regVal.print()); + return regVal; + } + + VecPredRegContainer& + getWritableVecPredReg(const RegId& reg) + { + int flatIndex = isa->flattenVecPredIndex(reg.index()); + assert(flatIndex < TheISA::NumVecPredRegs); + VecPredRegContainer& regVal = getWritableVecPredRegFlat(flatIndex); + DPRINTF(VecPredRegs, + "Reading predicate reg %d (%d) as %s for modify.\n", + reg.index(), flatIndex, regVal.print()); + return regVal; + } CCReg readCCReg(int reg_idx) { @@ -411,6 +439,16 @@ class SimpleThread : public ThreadState } void + setVecPredReg(const RegId& reg, const VecPredRegContainer& val) + { + int flatIndex = isa->flattenVecPredIndex(reg.index()); + assert(flatIndex < TheISA::NumVecPredRegs); + setVecPredRegFlat(flatIndex, val); + DPRINTF(VecPredRegs, "Setting predicate reg %d (%d) to %s.\n", + reg.index(), flatIndex, val.print()); + } + + void setCCReg(int reg_idx, CCReg val) { #ifdef ISA_HAS_CC_REGS @@ -568,6 +606,21 @@ class SimpleThread : public ThreadState vecRegs[reg].as<TheISA::VecElem>()[elemIndex] = val; } + const VecPredRegContainer& readVecPredRegFlat(const RegIndex& reg) const + { + return vecPredRegs[reg]; + } + + VecPredRegContainer& getWritableVecPredRegFlat(const RegIndex& reg) + { + return vecPredRegs[reg]; + } + + void setVecPredRegFlat(const RegIndex& reg, const VecPredRegContainer& val) + { + vecPredRegs[reg] = val; + } + #ifdef ISA_HAS_CC_REGS CCReg readCCRegFlat(int idx) { return ccRegs[idx]; } void setCCRegFlat(int idx, CCReg val) { ccRegs[idx] = val; } |