[Beignet] [PATCH] GBE: Fix bitcast between long and other type.
Ruiling Song
ruiling.song at intel.com
Fri May 30 01:22:30 PDT 2014
As we store long low/high 32bits separately, when we do bitcast
like int64 --> int16, the horizontal stride of the int64's low/high
half should be set as 2 instead of 4.
This fix an regression of opencv test:
Imgproc/Threshold.Mat/40, where GetParam() = (16SC1, 0, 0, false)
Signed-off-by: Ruiling Song <ruiling.song at intel.com>
---
backend/src/backend/gen_insn_selection.cpp | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index 74f7cfe..6e6e6eb 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -3081,7 +3081,7 @@ namespace gbe
wideReg = sel.selReg(insn.getDst(index/multiple), narrowType);
narrowReg = sel.selReg(insn.getSrc(i), narrowType); //retype to narrow type
}
- if(wideReg.hstride != GEN_VERTICAL_STRIDE_0) {
+ if(wideReg.hstride != GEN_HORIZONTAL_STRIDE_0) {
if(multiple == 2) {
wideReg = sel.unpacked_uw(wideReg.reg());
wideReg = GenRegister::retype(wideReg, getGenType(narrowType));
@@ -3098,6 +3098,15 @@ namespace gbe
wideReg.subphysical = 1;
}
if(isInt64) {
+ if(wideReg.hstride != GEN_HORIZONTAL_STRIDE_0) {
+ // as we store long by bottom & high part separately, we have to divide hstride by 2
+ if (wideReg.hstride == GEN_HORIZONTAL_STRIDE_2)
+ wideReg.hstride = GEN_HORIZONTAL_STRIDE_1;
+ else if (wideReg.hstride == GEN_HORIZONTAL_STRIDE_4)
+ wideReg.hstride = GEN_HORIZONTAL_STRIDE_2;
+ else
+ GBE_ASSERT(0);
+ }
// offset to next half
wideReg.subphysical = 1;
if(i >= multiple/2)
--
1.7.10.4
More information about the Beignet
mailing list