[Beignet] [PATCH 1/2] Backend: Add the logic to handle uniform src for BSwap Gen8.
junyan.he at inbox.com
junyan.he at inbox.com
Tue Mar 10 00:04:37 PDT 2015
From: Junyan He <junyan.he at linux.intel.com>
Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
backend/src/backend/gen8_context.cpp | 90 +++++++++++++++++++++++++-----------
1 file changed, 62 insertions(+), 28 deletions(-)
diff --git a/backend/src/backend/gen8_context.cpp b/backend/src/backend/gen8_context.cpp
index 0d4a40e..3f57cf6 100644
--- a/backend/src/backend/gen8_context.cpp
+++ b/backend/src/backend/gen8_context.cpp
@@ -117,7 +117,8 @@ namespace gbe
}
} else {
if (src.type == GEN_TYPE_UD || src.type == GEN_TYPE_D) {
- GBE_ASSERT(src.subnr == 0);
+ bool uniform_src = (src.hstride == GEN_HORIZONTAL_STRIDE_0);
+ GBE_ASSERT(uniform_src || src.subnr == 0);
GBE_ASSERT(dst.subnr == 0);
GBE_ASSERT(tmp.subnr == 0);
GBE_ASSERT(start_addr >= 0);
@@ -125,18 +126,33 @@ namespace gbe
new_a0[1] = start_addr + 2;
new_a0[2] = start_addr + 1;
new_a0[3] = start_addr;
- new_a0[4] = start_addr + 7;
- new_a0[5] = start_addr + 6;
- new_a0[6] = start_addr + 5;
- new_a0[7] = start_addr + 4;
- new_a0[8] = start_addr + 11;
- new_a0[9] = start_addr + 10;
- new_a0[10] = start_addr + 9;
- new_a0[11] = start_addr + 8;
- new_a0[12] = start_addr + 15;
- new_a0[13] = start_addr + 14;
- new_a0[14] = start_addr + 13;
- new_a0[15] = start_addr + 12;
+ if (!uniform_src) {
+ new_a0[4] = start_addr + 7;
+ new_a0[5] = start_addr + 6;
+ new_a0[6] = start_addr + 5;
+ new_a0[7] = start_addr + 4;
+ new_a0[8] = start_addr + 11;
+ new_a0[9] = start_addr + 10;
+ new_a0[10] = start_addr + 9;
+ new_a0[11] = start_addr + 8;
+ new_a0[12] = start_addr + 15;
+ new_a0[13] = start_addr + 14;
+ new_a0[14] = start_addr + 13;
+ new_a0[15] = start_addr + 12;
+ } else {
+ new_a0[4] = start_addr + 3;
+ new_a0[5] = start_addr + 2;
+ new_a0[6] = start_addr + 1;
+ new_a0[7] = start_addr;
+ new_a0[8] = start_addr + 3;
+ new_a0[9] = start_addr + 2;
+ new_a0[10] = start_addr + 1;
+ new_a0[11] = start_addr;
+ new_a0[12] = start_addr + 3;
+ new_a0[13] = start_addr + 2;
+ new_a0[14] = start_addr + 1;
+ new_a0[15] = start_addr;
+ }
this->setA0Content(new_a0, 48);
p->push();
@@ -158,26 +174,44 @@ namespace gbe
p->MOV(dst, tmp);
} else if (src.type == GEN_TYPE_UW || src.type == GEN_TYPE_W) {
- GBE_ASSERT(src.subnr == 0 || src.subnr == 16);
+ bool uniform_src = (src.hstride == GEN_HORIZONTAL_STRIDE_0);
+ GBE_ASSERT(uniform_src || src.subnr == 0 || src.subnr == 16);
GBE_ASSERT(dst.subnr == 0 || dst.subnr == 16);
GBE_ASSERT(tmp.subnr == 0 || tmp.subnr == 16);
GBE_ASSERT(start_addr >= 0);
new_a0[0] = start_addr + 1;
new_a0[1] = start_addr;
- new_a0[2] = start_addr + 3;
- new_a0[3] = start_addr + 2;
- new_a0[4] = start_addr + 5;
- new_a0[5] = start_addr + 4;
- new_a0[6] = start_addr + 7;
- new_a0[7] = start_addr + 6;
- new_a0[8] = start_addr + 9;
- new_a0[9] = start_addr + 8;
- new_a0[10] = start_addr + 11;
- new_a0[11] = start_addr + 10;
- new_a0[12] = start_addr + 13;
- new_a0[13] = start_addr + 12;
- new_a0[14] = start_addr + 15;
- new_a0[15] = start_addr + 14;
+ if (!uniform_src) {
+ new_a0[2] = start_addr + 3;
+ new_a0[3] = start_addr + 2;
+ new_a0[4] = start_addr + 5;
+ new_a0[5] = start_addr + 4;
+ new_a0[6] = start_addr + 7;
+ new_a0[7] = start_addr + 6;
+ new_a0[8] = start_addr + 9;
+ new_a0[9] = start_addr + 8;
+ new_a0[10] = start_addr + 11;
+ new_a0[11] = start_addr + 10;
+ new_a0[12] = start_addr + 13;
+ new_a0[13] = start_addr + 12;
+ new_a0[14] = start_addr + 15;
+ new_a0[15] = start_addr + 14;
+ } else {
+ new_a0[2] = start_addr + 1;
+ new_a0[3] = start_addr;
+ new_a0[4] = start_addr + 1;
+ new_a0[5] = start_addr;
+ new_a0[6] = start_addr + 1;
+ new_a0[7] = start_addr;
+ new_a0[8] = start_addr + 1;
+ new_a0[9] = start_addr;
+ new_a0[10] = start_addr + 1;
+ new_a0[11] = start_addr;
+ new_a0[12] = start_addr + 1;
+ new_a0[13] = start_addr;
+ new_a0[14] = start_addr + 1;
+ new_a0[15] = start_addr;
+ }
this->setA0Content(new_a0, 48);
p->push();
--
2.1.0
More information about the Beignet
mailing list