From: Junyan He
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
---
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(0x));
+ 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 0x
+ p->ADDC(GenRegister::retype(t0, GEN_TYPE_UD),
+ GenRegister::retype(t0, GEN_TYPE_UD),
GenRegister::immud(0x));
+ 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(0x));
+} 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),
+