summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuiling Song <ruiling.song@intel.com>2014-06-09 16:14:29 +0800
committerZhigang Gong <zhigang.gong@intel.com>2014-06-09 16:34:36 +0800
commit4ed6d95ab50fa6d3a30311a0796faaecd1dc53a5 (patch)
tree784cb9d3282fe6e97e0ba94a7f913b17d3021c8c
parent2f6e3903712d6633b7cabb347680b51d3fe53cc1 (diff)
downloadbeignet-4ed6d95ab50fa6d3a30311a0796faaecd1dc53a5.tar.gz
GBE: Fix an assert on bitcast long to char8
Signed-off-by: Ruiling Song <ruiling.song@intel.com> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r--backend/src/backend/gen_insn_selection.cpp27
1 files changed, 15 insertions, 12 deletions
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index a90a9993..46d58465 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -3098,15 +3098,26 @@ namespace gbe
wideReg = sel.selReg(insn.getDst(index/multiple), narrowType);
narrowReg = sel.selReg(insn.getSrc(i), narrowType); //retype to narrow type
}
+
+ // set correct horizontal stride
if(wideReg.hstride != GEN_HORIZONTAL_STRIDE_0) {
if(multiple == 2) {
wideReg = sel.unpacked_uw(wideReg.reg());
wideReg = GenRegister::retype(wideReg, getGenType(narrowType));
+ if(isInt64)
+ wideReg.hstride = GEN_HORIZONTAL_STRIDE_1;
} else if(multiple == 4) {
wideReg = sel.unpacked_ub(wideReg.reg());
wideReg = GenRegister::retype(wideReg, getGenType(narrowType));
- } else if(multiple == 8) { //need to specail handle long to char
- GBE_ASSERT(multiple == 8);
+ if(isInt64)
+ wideReg.hstride = GEN_HORIZONTAL_STRIDE_2;
+ } else if(multiple == 8) {
+ // we currently store high/low 32bit separately in register,
+ // so, its hstride is 4 here.
+ wideReg = sel.unpacked_ub(wideReg.reg());
+ wideReg = GenRegister::retype(wideReg, getGenType(narrowType));
+ } else {
+ GBE_ASSERT(0);
}
}
@@ -3115,19 +3126,11 @@ 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;
+ // Offset to next half
if(i >= multiple/2)
wideReg = GenRegister::offset(wideReg, 0, sel.isScalarReg(wideReg.reg()) ? 4 : simdWidth*4);
+ // Offset to desired narrow element in wideReg
if(index % (multiple/2))
wideReg = GenRegister::offset(wideReg, 0, (index % (multiple/2)) * typeSize(wideReg.type));
}