arch-arm: Add TypeAtomicOp class to be used by new atomic instructions
authorJordi Vaquero <jordi.vaquero@metempsy.com>
Fri, 5 Jul 2019 17:02:05 +0000 (19:02 +0200)
committerJordi Vaquero <jordi.vaquero@metempsy.com>
Wed, 7 Aug 2019 17:19:11 +0000 (17:19 +0000)
Creating a new object TypeAtomicOp that will be used by the atomic
instructions following gem5 AMO feature.

Change-Id: If082b596fb37d7a1cb569a4320c23505591df6a5
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/19810
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/insts/mem64.hh

index 8e21bb3b690d5fd485360ead49a3e10c938cc866..34eb43fa902997d3aaef308bca40aa9cf4bbfb77 100644 (file)
@@ -260,6 +260,52 @@ class MemoryLiteral64 : public Memory64
     std::string generateDisassembly(
             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;
+};
+
 }
 
 #endif //__ARCH_ARM_INSTS_MEM_HH__