From: Junyan He <junyan...@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...@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 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet