From 25474167e5b247d1b91fbf802c5b396a63ae705e Mon Sep 17 00:00:00 2001 From: Giacomo Gabrielli Date: Tue, 16 Oct 2018 16:04:08 +0100 Subject: 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 Reviewed-on: https://gem5-review.googlesource.com/c/13715 Maintainer: Andreas Sandberg Reviewed-by: Jason Lowe-Power --- src/cpu/checker/cpu.hh | 35 ++++++++++++++++++++++++++++++++++- src/cpu/checker/thread_context.hh | 24 +++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) (limited to 'src/cpu/checker') 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 + void + setVecPredResult(T&& t) + { + result.push(InstResult(std::forward(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); } @@ -294,6 +300,13 @@ class CheckerThreadContext : public ThreadContext checkerTC->setVecElem(reg, val); } + void + setVecPredReg(const RegId& reg, const VecPredRegContainer& val) + { + actualTC->setVecPredReg(reg, val); + checkerTC->setVecPredReg(reg, val); + } + void setCCReg(int reg_idx, CCReg 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); } -- cgit v1.2.3