hsail,gpu-compute: fixes to appease clang++
authorTony Gutierrez <anthony.gutierrez@amd.com>
Thu, 27 Oct 2016 02:48:45 +0000 (22:48 -0400)
committerTony Gutierrez <anthony.gutierrez@amd.com>
Thu, 27 Oct 2016 02:48:45 +0000 (22:48 -0400)
fixes to appease clang++. tested on:

Ubuntu clang version 3.5.0-4ubuntu2~trusty2
(tags/RELEASE_350/final) (based on LLVM 3.5.0)

Ubuntu clang version 3.6.0-2ubuntu1~trusty1
(tags/RELEASE_360/final) (based on LLVM 3.6.0)

the fixes address the following five issues:

1) the exec continuations in gpu_static_inst.hh were marked
   as protected when they should be public. here we mark
   them as public

2) the Abs instruction uses std::abs() in its execute method.
   because Abs is templated, it can also operate on U32 and U64,
   types, which cause Abs::execute() to pass uint32_t and uint64_t
   types to std::abs() respectively. this triggers a warning
   because std::abs() has no effect in this case. to rememdy this
   we add template specialization for the execute() method of Abs
   when its template paramter is U32 or U64.

3) Some potocols that utilize the code in cprintf.hh were missing
   includes to BoolVec.hh, which defines operator<< for the BoolVec
   type. This would cause issues when the generated code would try
   to pass a BoolVec type to a method in cprintf.hh that used
   operator<< on an instance of a BoolVec.

4) Surprise, clang doesn't like it when you clobber all the bits
   in a newly allocated object. I.e., this code:

   tlb = new GpuTlbEntry\[size\];
   std::memset(tlb, 0, sizeof(GpuTlbEntry) \* size);

   Let's use std::vector to track the TLB entries in the GpuTlb now...

5) There were a few variables used only in DPRINTFs, so we mark them
   with M5_VAR_USED.

src/arch/hsail/gen.py
src/arch/x86/process.cc
src/gpu-compute/gpu_static_inst.hh
src/gpu-compute/gpu_tlb.cc
src/gpu-compute/gpu_tlb.hh
src/mem/slicc/symbols/StateMachine.py

index 92fc5c5108063af78128d7dd5852244b01234cb2..ec6ceec3dbc3e7124bef96aff170adfbd7ef4809 100755 (executable)
@@ -776,6 +776,52 @@ gen('Call', base_class='SpecialInstNoSrcNoDest')
 # Generate file epilogs
 #
 ###############
+header_code('''
+template<>
+inline void
+Abs<U32>::execute(GPUDynInstPtr gpuDynInst)
+{
+    Wavefront *w = gpuDynInst->wavefront();
+
+    const VectorMask &mask = w->getPred();
+
+    for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
+        if (mask[lane]) {
+            CType dest_val;
+            CType src_val;
+
+            src_val = this->src[0].template get<CType>(w, lane);
+
+            dest_val = (CType)(src_val);
+
+            this->dest.set(w, lane, dest_val);
+        }
+    }
+}
+
+template<>
+inline void
+Abs<U64>::execute(GPUDynInstPtr gpuDynInst)
+{
+    Wavefront *w = gpuDynInst->wavefront();
+
+    const VectorMask &mask = w->getPred();
+
+    for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
+        if (mask[lane]) {
+            CType dest_val;
+            CType src_val;
+
+            src_val = this->src[0].template get<CType>(w, lane);
+
+            dest_val = (CType)(src_val);
+
+            this->dest.set(w, lane, dest_val);
+        }
+    }
+}
+''')
+
 header_code.dedent()
 header_code('''
 } // namespace HsailISA
index 66a520bc3f4cfe4e229761e7ec4f082e5a4523b2..4b71357b025a0741ea411b6b199085dfe9892c42 100644 (file)
@@ -73,7 +73,10 @@ static const int ArgumentReg[] = {
     INTREG_R8W,
     INTREG_R9W
 };
-static const int NumArgumentRegs = sizeof(ArgumentReg) / sizeof(const int);
+
+static const int NumArgumentRegs M5_VAR_USED =
+    sizeof(ArgumentReg) / sizeof(const int);
+
 static const int ArgumentReg32[] = {
     INTREG_EBX,
     INTREG_ECX,
@@ -82,7 +85,9 @@ static const int ArgumentReg32[] = {
     INTREG_EDI,
     INTREG_EBP
 };
-static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int);
+
+static const int NumArgumentRegs32 M5_VAR_USED =
+    sizeof(ArgumentReg) / sizeof(const int);
 
 X86LiveProcess::X86LiveProcess(LiveProcessParams * params, ObjectFile *objFile,
         SyscallDesc *_syscallDescs, int _numSyscallDescs) :
index e851c52e6bf79e676124f9be68815464461ad5be..372eee8dfb52b7c24268166e4025fddb18935139 100644 (file)
@@ -221,7 +221,6 @@ class GPUStaticInst : public GPUStaticInstFlags
 
     void setFlag(Flags flag) { _flags[flag] = true; }
 
-  protected:
     virtual void
     execLdAcq(GPUDynInstPtr gpuDynInst)
     {
@@ -246,6 +245,7 @@ class GPUStaticInst : public GPUStaticInstFlags
         fatal("calling execAtomicAcq() on a non-atomic instruction.\n");
     }
 
+  protected:
     const std::string opcode;
     std::string disassembly;
     int _instNum;
index 2021af9a92bce813f30c4c01afaf11524f1b6c37..1f1a4cc61dea7ae74de4b1f533e68d7233746727 100644 (file)
@@ -71,16 +71,15 @@ namespace X86ISA
         accessDistance = p->accessDistance;
         clock = p->clk_domain->clockPeriod();
 
-        tlb = new GpuTlbEntry[size];
-        std::memset(tlb, 0, sizeof(GpuTlbEntry) * size);
+        tlb.assign(size, GpuTlbEntry());
 
         freeList.resize(numSets);
         entryList.resize(numSets);
 
         for (int set = 0; set < numSets; ++set) {
             for (int way = 0; way < assoc; ++way) {
-                int x = set*assoc + way;
-                freeList[set].push_back(&tlb[x]);
+                int x = set * assoc + way;
+                freeList[set].push_back(&tlb.at(x));
             }
         }
 
@@ -133,9 +132,6 @@ namespace X86ISA
     {
         // make sure all the hash-maps are empty
         assert(translationReturnEvent.empty());
-
-        // delete the TLB
-        delete[] tlb;
     }
 
     BaseSlavePort&
index 3549c598ba18d1c9322c36120628874cf9c1fa24..9c1a7b32614a7094b55d2b6cf89ba6e4dc13b7a4 100644 (file)
@@ -170,7 +170,7 @@ namespace X86ISA
          */
         bool accessDistance;
 
-        GpuTlbEntry *tlb;
+        std::vector<GpuTlbEntry> tlb;
 
         /*
          * It's a per-set list. As long as we have not reached
index 6a398423f6e23eb1855e8f594f8f6d0f12c5f293..3f88d8387504c4f939d7596ab432958463d6b9e0 100644 (file)
@@ -459,6 +459,7 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr);
 #include <typeinfo>
 
 #include "base/compiler.hh"
+#include "mem/ruby/common/BoolVec.hh"
 #include "base/cprintf.hh"
 
 ''')