summaryrefslogtreecommitdiff
path: root/src/cpu/checker
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/checker
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/checker')
-rw-r--r--src/cpu/checker/cpu.hh35
-rw-r--r--src/cpu/checker/thread_context.hh24
2 files changed, 57 insertions, 2 deletions
diff --git a/src/cpu/checker/cpu.hh b/src/cpu/checker/cpu.hh
index 4468689bd..9d6061ad8 100644
--- a/src/cpu/checker/cpu.hh
+++ b/src/cpu/checker/cpu.hh
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2016 ARM Limited
+ * Copyright (c) 2011, 2016-2017 ARM Limited
* Copyright (c) 2013 Advanced Micro Devices, Inc.
* All rights reserved
*
@@ -304,6 +304,22 @@ class CheckerCPU : public BaseCPU, public ExecContext
return thread->readVecElem(reg);
}
+ const VecPredRegContainer&
+ readVecPredRegOperand(const StaticInst *si, int idx) const override
+ {
+ const RegId& reg = si->srcRegIdx(idx);
+ assert(reg.isVecPredReg());
+ return thread->readVecPredReg(reg);
+ }
+
+ VecPredRegContainer&
+ getWritableVecPredRegOperand(const StaticInst *si, int idx) override
+ {
+ const RegId& reg = si->destRegIdx(idx);
+ assert(reg.isVecPredReg());
+ return thread->getWritableVecPredReg(reg);
+ }
+
CCReg
readCCRegOperand(const StaticInst *si, int idx) override
{
@@ -336,6 +352,14 @@ class CheckerCPU : public BaseCPU, public ExecContext
InstResult::ResultType::VecElem));
}
+ template<typename T>
+ void
+ setVecPredResult(T&& t)
+ {
+ result.push(InstResult(std::forward<T>(t),
+ InstResult::ResultType::VecPredReg));
+ }
+
void
setIntRegOperand(const StaticInst *si, int idx, RegVal val) override
{
@@ -383,6 +407,15 @@ class CheckerCPU : public BaseCPU, public ExecContext
setVecElemResult(val);
}
+ void setVecPredRegOperand(const StaticInst *si, int idx,
+ const VecPredRegContainer& val) override
+ {
+ const RegId& reg = si->destRegIdx(idx);
+ assert(reg.isVecPredReg());
+ thread->setVecPredReg(reg, val);
+ setVecPredResult(val);
+ }
+
bool readPredicate() const override { return thread->readPredicate(); }
void
diff --git a/src/cpu/checker/thread_context.hh b/src/cpu/checker/thread_context.hh
index b5a2079ea..8ce5a740d 100644
--- a/src/cpu/checker/thread_context.hh
+++ b/src/cpu/checker/thread_context.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
*
@@ -263,6 +263,12 @@ class CheckerThreadContext : public ThreadContext
const VecElem& readVecElem(const RegId& reg) const
{ return actualTC->readVecElem(reg); }
+ const VecPredRegContainer& readVecPredReg(const RegId& reg) const override
+ { return actualTC->readVecPredReg(reg); }
+
+ VecPredRegContainer& getWritableVecPredReg(const RegId& reg) override
+ { return actualTC->getWritableVecPredReg(reg); }
+
CCReg readCCReg(int reg_idx)
{ return actualTC->readCCReg(reg_idx); }
@@ -295,6 +301,13 @@ class CheckerThreadContext : public ThreadContext
}
void
+ setVecPredReg(const RegId& reg, const VecPredRegContainer& val)
+ {
+ actualTC->setVecPredReg(reg, val);
+ checkerTC->setVecPredReg(reg, val);
+ }
+
+ void
setCCReg(int reg_idx, CCReg val)
{
actualTC->setCCReg(reg_idx, val);
@@ -428,6 +441,15 @@ class CheckerThreadContext : public ThreadContext
const ElemIndex& elem_idx, const VecElem& val)
{ actualTC->setVecElemFlat(idx, elem_idx, val); }
+ const VecPredRegContainer& readVecPredRegFlat(int idx) const override
+ { return actualTC->readVecPredRegFlat(idx); }
+
+ VecPredRegContainer& getWritableVecPredRegFlat(int idx) override
+ { return actualTC->getWritableVecPredRegFlat(idx); }
+
+ void setVecPredRegFlat(int idx, const VecPredRegContainer& val) override
+ { actualTC->setVecPredRegFlat(idx, val); }
+
CCReg readCCRegFlat(int idx)
{ return actualTC->readCCRegFlat(idx); }