summaryrefslogtreecommitdiff
path: root/src/cpu/simple_thread.hh
diff options
context:
space:
mode:
authorGiacomo Gabrielli <giacomo.gabrielli@arm.com>2018-10-16 16:04:08 +0100
committerGiacomo Gabrielli <giacomo.gabrielli@arm.com>2019-01-30 16:57:54 +0000
commit25474167e5b247d1b91fbf802c5b396a63ae705e (patch)
treeb509597b23d792734f55c33b8125eebfbd9cd3a5 /src/cpu/simple_thread.hh
parentc6f5db8743f19b02a38146d9cf2a829883387008 (diff)
downloadgem5-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.hh59
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; }