[Beignet] [PATCH 1/2] Multiple register's hstride in suboffset.
Yang Rong
rong.r.yang at intel.com
Sat Jan 25 19:21:14 PST 2014
When register's hstride is not 0 or 1, suboffset will get wrong element.
Also change some offsets that already multiple hstride by hard code.
Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
backend/src/backend/gen_context.cpp | 26 +++++++++++++-------------
backend/src/backend/gen_encoder.cpp | 8 ++++----
backend/src/backend/gen_register.hpp | 2 +-
3 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index ecb8ef3..7d47a1e 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -206,7 +206,7 @@ namespace gbe
p->curr.chooseNib(i);
p->MOV(xdst, xsrc);
xdst = GenRegister::suboffset(xdst, 4);
- xsrc = GenRegister::suboffset(xsrc, 8);
+ xsrc = GenRegister::suboffset(xsrc, 4);
}
p->pop();
break;
@@ -1205,10 +1205,10 @@ namespace gbe
p->curr.predicate = GEN_PREDICATE_NONE;
p->curr.execWidth = 8;
p->MOV(dest, src);
- p->MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(src, 8));
+ p->MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(src, 4));
if (execWidth == 16) {
- p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 16));
- p->MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(src, 24));
+ p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 8));
+ p->MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(src, 12));
}
p->pop();
}
@@ -1220,13 +1220,13 @@ namespace gbe
p->curr.execWidth = 8;
p->MOV(dest, src);
p->curr.nibControl = 1;
- p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 4));
+ p->MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(src, 4));
if (execWidth == 16) {
p->curr.quarterControl = 1;
p->curr.nibControl = 0;
- p->MOV(GenRegister::suboffset(dest, 16), GenRegister::suboffset(src, 8));
+ p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 8));
p->curr.nibControl = 1;
- p->MOV(GenRegister::suboffset(dest, 24), GenRegister::suboffset(src, 12));
+ p->MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(src, 12));
}
p->pop();
}
@@ -1238,10 +1238,10 @@ namespace gbe
p->curr.predicate = GEN_PREDICATE_NONE;
p->curr.execWidth = 8;
p->MOV(dest, src);
- p->MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(src, 8));
+ p->MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(src, 4));
if (execWidth == 16) {
- p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 16));
- p->MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(src, 24));
+ p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 8));
+ p->MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(src, 12));
}
p->pop();
}
@@ -1253,13 +1253,13 @@ namespace gbe
p->curr.execWidth = 8;
p->MOV(dest, src);
p->curr.nibControl = 1;
- p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 4));
+ p->MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(src, 4));
if (execWidth == 16) {
p->curr.quarterControl = 1;
p->curr.nibControl = 0;
- p->MOV(GenRegister::suboffset(dest, 16), GenRegister::suboffset(src, 8));
+ p->MOV(GenRegister::suboffset(dest, 8), GenRegister::suboffset(src, 8));
p->curr.nibControl = 1;
- p->MOV(GenRegister::suboffset(dest, 24), GenRegister::suboffset(src, 12));
+ p->MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(src, 12));
}
p->pop();
}
diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp
index c372e36..2ba5fd1 100644
--- a/backend/src/backend/gen_encoder.cpp
+++ b/backend/src/backend/gen_encoder.cpp
@@ -908,26 +908,26 @@ namespace gbe
curr.execWidth = 8;
curr.predicate = GEN_PREDICATE_NONE;
MOV(r0, src0);
- MOV(GenRegister::suboffset(r0, 8), GenRegister::suboffset(src0, 4));
+ MOV(GenRegister::suboffset(r0, 4), GenRegister::suboffset(src0, 4));
curr.predicate = GEN_PREDICATE_NORMAL;
curr.quarterControl = 0;
curr.nibControl = 0;
MOV(dest, r);
curr.nibControl = 1;
- MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(r, 8));
+ MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(r, 4));
pop();
if (w == 16) {
push();
curr.execWidth = 8;
curr.predicate = GEN_PREDICATE_NONE;
MOV(r0, GenRegister::suboffset(src0, 8));
- MOV(GenRegister::suboffset(r0, 8), GenRegister::suboffset(src0, 12));
+ MOV(GenRegister::suboffset(r0, 4), GenRegister::suboffset(src0, 12));
curr.predicate = GEN_PREDICATE_NORMAL;
curr.quarterControl = 1;
curr.nibControl = 0;
MOV(GenRegister::suboffset(dest, 8), r);
curr.nibControl = 1;
- MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(r, 8));
+ MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(r, 4));
pop();
}
}
diff --git a/backend/src/backend/gen_register.hpp b/backend/src/backend/gen_register.hpp
index 57c78d9..8794318 100644
--- a/backend/src/backend/gen_register.hpp
+++ b/backend/src/backend/gen_register.hpp
@@ -763,7 +763,7 @@ namespace gbe
static INLINE GenRegister suboffset(GenRegister reg, uint32_t delta) {
if (reg.hstride != GEN_HORIZONTAL_STRIDE_0) {
- reg.subnr += delta * typeSize(reg.type);
+ reg.subnr += delta * typeSize(reg.type) * hstride_size(reg);
reg.nr += reg.subnr / 32;
reg.subnr %= 32;
}
--
1.8.3.2
More information about the Beignet
mailing list