diff options
author | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2019-12-05 11:16:12 +0000 |
---|---|---|
committer | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2020-01-08 09:32:08 +0000 |
commit | 3225c4075b0ddfd83a9f7a220d39740f86a64f16 (patch) | |
tree | 0164f730cf7afb0ed1a1bdb17b74c98a799cc844 | |
parent | b653e5ea1053502b99fbd886b75b916adcc14c7a (diff) | |
download | gem5-3225c4075b0ddfd83a9f7a220d39740f86a64f16.tar.xz |
arch, base: Move arm AtomicOpFunctor into the generic header
These AtomicGenericxOp functors are not arm specific:
They just define a set of different functors depending
on the number of operands they are using.
Change-Id: Ida75066823c7718aee05717194cdb8225b700c5d
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23564
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Tested-by: kokoro <noreply+kokoro@google.com>
-rw-r--r-- | src/arch/arm/insts/mem64.hh | 67 | ||||
-rw-r--r-- | src/base/amo.hh | 63 |
2 files changed, 63 insertions, 67 deletions
diff --git a/src/arch/arm/insts/mem64.hh b/src/arch/arm/insts/mem64.hh index 25ef14841..0561dc60d 100644 --- a/src/arch/arm/insts/mem64.hh +++ b/src/arch/arm/insts/mem64.hh @@ -264,73 +264,6 @@ class MemoryLiteral64 : public Memory64 Addr pc, const SymbolTable *symtab) const override; }; -/** - * A generic atomic op class - */ - -template<typename T> -class AtomicGeneric2Op : public TypedAtomicOpFunctor<T> -{ - public: - AtomicGeneric2Op(T _a, std::function<void(T*,T)> _op) - : a(_a), op(_op) - {} - AtomicOpFunctor* clone() override - { - return new AtomicGeneric2Op<T>(*this); - } - void execute(T *b) override - { - op(b, a); - } - private: - T a; - std::function<void(T*,T)> op; - }; - -template<typename T> -class AtomicGeneric3Op : public TypedAtomicOpFunctor<T> -{ - public: - AtomicGeneric3Op(T _a, T _c, std::function<void(T*, T, T)> _op) - : a(_a), c(_c), op(_op) - {} - AtomicOpFunctor* clone() override - { - return new AtomicGeneric3Op<T>(*this); - } - void execute(T *b) override - { - op(b, a, c); - } - private: - T a; - T c; - std::function<void(T*, T, T)> op; -}; - -template<typename T> -class AtomicGenericPair3Op : public TypedAtomicOpFunctor<T> -{ - public: - AtomicGenericPair3Op(std::array<T, 2>& _a, std::array<T, 2> _c, - std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> _op) - : a(_a), c(_c), op(_op) - {} - AtomicOpFunctor* clone() override - { - return new AtomicGenericPair3Op<T>(*this); - } - void execute(T* b) override - { - op(b, a, c); - } - private: - std::array<T, 2> a; - std::array<T, 2> c; - std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> op; -}; - } #endif //__ARCH_ARM_INSTS_MEM_HH__ diff --git a/src/base/amo.hh b/src/base/amo.hh index 504190e92..624c755ed 100644 --- a/src/base/amo.hh +++ b/src/base/amo.hh @@ -46,6 +46,69 @@ struct TypedAtomicOpFunctor : public AtomicOpFunctor virtual void execute(T * p) = 0; }; +template<typename T> +class AtomicGeneric2Op : public TypedAtomicOpFunctor<T> +{ + public: + AtomicGeneric2Op(T _a, std::function<void(T*,T)> _op) + : a(_a), op(_op) + {} + AtomicOpFunctor* clone() override + { + return new AtomicGeneric2Op<T>(*this); + } + void execute(T *b) override + { + op(b, a); + } + private: + T a; + std::function<void(T*,T)> op; + }; + +template<typename T> +class AtomicGeneric3Op : public TypedAtomicOpFunctor<T> +{ + public: + AtomicGeneric3Op(T _a, T _c, std::function<void(T*, T, T)> _op) + : a(_a), c(_c), op(_op) + {} + AtomicOpFunctor* clone() override + { + return new AtomicGeneric3Op<T>(*this); + } + void execute(T *b) override + { + op(b, a, c); + } + private: + T a; + T c; + std::function<void(T*, T, T)> op; +}; + +template<typename T> +class AtomicGenericPair3Op : public TypedAtomicOpFunctor<T> +{ + public: + AtomicGenericPair3Op(std::array<T, 2>& _a, std::array<T, 2> _c, + std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> _op) + : a(_a), c(_c), op(_op) + {} + AtomicOpFunctor* clone() override + { + return new AtomicGenericPair3Op<T>(*this); + } + void execute(T* b) override + { + op(b, a, c); + } + private: + std::array<T, 2> a; + std::array<T, 2> c; + std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> op; +}; + typedef std::unique_ptr<AtomicOpFunctor> AtomicOpFunctorPtr; #endif // __BASE_AMO_HH__ |