[Beignet] [PATCH 17/19] Backend: Add ADD_ and SUB_ timestamps help functions.

junyan.he at inbox.com junyan.he at inbox.com
Tue Sep 8 17:01:08 PDT 2015


From: Junyan He <junyan.he at linux.intel.com>

The timestamps are calculated by Long type. Before BDW,
there is no Long type support and we use i32 operations
to implement them.

Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
 backend/src/backend/gen8_context.cpp |   24 +++++++++++++++
 backend/src/backend/gen8_context.hpp |    2 ++
 backend/src/backend/gen_context.cpp  |   53 ++++++++++++++++++++++++++++++++++
 backend/src/backend/gen_context.hpp  |    2 ++
 4 files changed, 81 insertions(+)

diff --git a/backend/src/backend/gen8_context.cpp b/backend/src/backend/gen8_context.cpp
index b497ee5..9b2fc97 100644
--- a/backend/src/backend/gen8_context.cpp
+++ b/backend/src/backend/gen8_context.cpp
@@ -943,6 +943,30 @@ namespace gbe
     p->pop();
   }
 
+  void Gen8Context::subTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp)
+  {
+    p->push(); {
+      p->curr.execWidth = 1;
+      p->curr.predicate = GEN_PREDICATE_NONE;
+      p->curr.noMask = 1;
+      p->ADD(GenRegister::retype(t0, GEN_TYPE_UL), GenRegister::retype(t0, GEN_TYPE_UL),
+          GenRegister::negate(GenRegister::retype(t1, GEN_TYPE_UL)));
+      p->MOV(GenRegister::retype(tmp, GEN_TYPE_UL), GenRegister::immuint64(0xffffffffffffffff));
+      p->ADD(GenRegister::retype(t0, GEN_TYPE_UL), GenRegister::retype(t0, GEN_TYPE_UL),
+          GenRegister::retype(tmp, GEN_TYPE_UL));
+    } p->pop();
+  }
+
+  void Gen8Context::addTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp) {
+    p->push(); {
+      p->curr.execWidth = 1;
+      p->curr.predicate = GEN_PREDICATE_NONE;
+      p->curr.noMask = 1;
+      p->ADD(GenRegister::retype(t0, GEN_TYPE_UL), GenRegister::retype(t0, GEN_TYPE_UL),
+          GenRegister::retype(t1, GEN_TYPE_UL));
+    } p->pop();
+  }
+
   void ChvContext::newSelection(void) {
     this->sel = GBE_NEW(SelectionChv, *this);
   }
diff --git a/backend/src/backend/gen8_context.hpp b/backend/src/backend/gen8_context.hpp
index 84508e9..aab1fd0 100644
--- a/backend/src/backend/gen8_context.hpp
+++ b/backend/src/backend/gen8_context.hpp
@@ -76,6 +76,8 @@ namespace gbe
 
   protected:
     virtual void setA0Content(uint16_t new_a0[16], uint16_t max_offset = 0, int sz = 0);
+    virtual void subTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp);
+    virtual void addTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp);
     virtual GenEncoder* generateEncoder(void) {
       return GBE_NEW(Gen8Encoder, this->simdWidth, 8, deviceID);
     }
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index a12d056..7789fe7 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -2242,6 +2242,59 @@ namespace gbe
 #undef CALC_GID
   }
 
+  void GenContext::subTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp)
+  {
+    p->push(); {
+      p->curr.execWidth = 1;
+      p->curr.predicate = GEN_PREDICATE_NONE;
+      p->curr.noMask = 1;
+      p->SUBB(GenRegister::retype(t0, GEN_TYPE_UD),
+          GenRegister::retype(t0, GEN_TYPE_UD), GenRegister::retype(t1, GEN_TYPE_UD));
+      /* FIXME We can not get the acc register's value correctly by set simd = 1. */
+      p->curr.execWidth = 8;
+      p->MOV(tmp, GenRegister::retype(GenRegister::acc(), GEN_TYPE_UD));
+      p->curr.execWidth = 1;
+      p->ADD(GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::negate(GenRegister::toUniform(tmp, GEN_TYPE_UD)));
+      p->ADD(GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::negate(GenRegister::retype(GenRegister::offset(t1, 0, sizeof(uint32_t)), GEN_TYPE_UD)));
+      // Mod 0xFFFFFFFF FFFFFFFF
+      p->ADDC(GenRegister::retype(t0, GEN_TYPE_UD),
+          GenRegister::retype(t0, GEN_TYPE_UD), GenRegister::immud(0xffffffff));
+      p->curr.execWidth = 8;
+      p->MOV(tmp, GenRegister::retype(GenRegister::acc(), GEN_TYPE_UD));
+      p->curr.execWidth = 1;
+      p->ADD(GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::toUniform(tmp, GEN_TYPE_UD));
+      p->ADD(GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::immud(0xffffffff));
+    } p->pop();
+  }
+
+  void GenContext::addTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp)
+  {
+    p->push(); {
+      p->curr.execWidth = 1;
+      p->curr.predicate = GEN_PREDICATE_NONE;
+      p->curr.noMask = 1;
+      p->ADDC(GenRegister::retype(t0, GEN_TYPE_UD),
+          GenRegister::retype(t0, GEN_TYPE_UD), GenRegister::retype(t1, GEN_TYPE_UD));
+      p->curr.execWidth = 8;
+      p->MOV(tmp, GenRegister::retype(GenRegister::acc(), GEN_TYPE_UD));
+      p->curr.execWidth = 1;
+      p->ADD(GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::offset(GenRegister::toUniform(tmp, GEN_TYPE_UD), 0, 6*sizeof(uint32_t)));
+      p->ADD(GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::retype(GenRegister::offset(t0, 0, sizeof(uint32_t)), GEN_TYPE_UD),
+          GenRegister::retype(GenRegister::offset(t1, 0, sizeof(uint32_t)), GEN_TYPE_UD));
+    } p->pop();
+  }
+
   void GenContext::profilingProlog(void) {
     // record the prolog, globalXYZ and lasttimestamp at the very beginning.
     GenRegister profilingReg2, profilingReg3, profilingReg4;
diff --git a/backend/src/backend/gen_context.hpp b/backend/src/backend/gen_context.hpp
index e36c8e6..5600dcd 100644
--- a/backend/src/backend/gen_context.hpp
+++ b/backend/src/backend/gen_context.hpp
@@ -223,6 +223,8 @@ namespace gbe
 
     virtual void setA0Content(uint16_t new_a0[16], uint16_t max_offset = 0, int sz = 0);
     void calcGlobalXYZRange(GenRegister& reg, GenRegister& tmp, int flag, int subFlag);
+    virtual void subTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp);
+    virtual void addTimestamps(GenRegister& t0, GenRegister& t1, GenRegister& tmp);
 
   private:
     CompileErrorCode errCode;
-- 
1.7.9.5





More information about the Beignet mailing list