hsail-x86: fix gpu dynamic instruction error

The gpu_dyn_inst.hh file was missing a clone method from
inherited classes. (The clone method is the way to implement
the prototype design pattern.) Because the inherited clone
method was declare as pure virtual, the method needed to
be implemented. Otherwise, the compiler complains that the
class is abstract.

Change-Id: I38782d5f7379f32be886401f7c127fe60d2f8811
Reviewed-on: https://gem5-review.googlesource.com/12108
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Anthony Gutierrez <anthony.gutierrez@amd.com>
Maintainer: Anthony Gutierrez <anthony.gutierrez@amd.com>
diff --git a/src/gpu-compute/gpu_dyn_inst.hh b/src/gpu-compute/gpu_dyn_inst.hh
index 4b1c9fd..0d357de 100644
--- a/src/gpu-compute/gpu_dyn_inst.hh
+++ b/src/gpu-compute/gpu_dyn_inst.hh
@@ -54,6 +54,7 @@
 
     AtomicOpAnd(T _a) : a(_a) { }
     void execute(T *b) { *b &= a; }
+    AtomicOpFunctor* clone () { return new AtomicOpAnd(a); }
 };
 
 template<typename T>
@@ -63,6 +64,7 @@
     T a;
     AtomicOpOr(T _a) : a(_a) { }
     void execute(T *b) { *b |= a; }
+    AtomicOpFunctor* clone () { return new AtomicOpOr(a); }
 };
 
 template<typename T>
@@ -72,6 +74,7 @@
     T a;
     AtomicOpXor(T _a) : a(_a) {}
     void execute(T *b) { *b ^= a; }
+    AtomicOpFunctor* clone () { return new AtomicOpXor(a); }
 };
 
 template<typename T>
@@ -101,6 +104,7 @@
             computeUnit->xactCasLoadMap.clear();
         }
     }
+    AtomicOpFunctor* clone () { return new AtomicOpCAS(c, s, computeUnit); }
 };
 
 template<typename T>
@@ -110,6 +114,7 @@
     T a;
     AtomicOpExch(T _a) : a(_a) { }
     void execute(T *b) { *b = a; }
+    AtomicOpFunctor* clone () { return new AtomicOpExch(a); }
 };
 
 template<typename T>
@@ -119,6 +124,7 @@
     T a;
     AtomicOpAdd(T _a) : a(_a) { }
     void execute(T *b) { *b += a; }
+    AtomicOpFunctor* clone () { return new AtomicOpAdd(a); }
 };
 
 template<typename T>
@@ -128,6 +134,7 @@
     T a;
     AtomicOpSub(T _a) : a(_a) { }
     void execute(T *b) { *b -= a; }
+    AtomicOpFunctor* clone () { return new AtomicOpSub(a); }
 };
 
 template<typename T>
@@ -136,6 +143,7 @@
   public:
     AtomicOpInc() { }
     void execute(T *b) { *b += 1; }
+    AtomicOpFunctor* clone () { return new AtomicOpInc(); }
 };
 
 template<typename T>
@@ -144,6 +152,7 @@
   public:
     AtomicOpDec() {}
     void execute(T *b) { *b -= 1; }
+    AtomicOpFunctor* clone () { return new AtomicOpDec(); }
 };
 
 template<typename T>
@@ -159,6 +168,7 @@
         if (a > *b)
             *b = a;
     }
+    AtomicOpFunctor* clone () { return new AtomicOpMax(a); }
 };
 
 template<typename T>
@@ -174,6 +184,7 @@
         if (a < *b)
             *b = a;
     }
+    AtomicOpFunctor* clone () { return new AtomicOpMin(a); }
 };
 
 typedef enum