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>
This commit is contained in:
Giacomo Travaglini
2019-12-05 11:16:12 +00:00
parent b653e5ea10
commit 3225c4075b
2 changed files with 63 additions and 67 deletions

View File

@@ -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__

View File

@@ -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__