diff options
author | Ruiling Song <ruiling.song@intel.com> | 2014-06-09 16:14:29 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@intel.com> | 2014-06-09 16:34:36 +0800 |
commit | 4ed6d95ab50fa6d3a30311a0796faaecd1dc53a5 (patch) | |
tree | 784cb9d3282fe6e97e0ba94a7f913b17d3021c8c | |
parent | 2f6e3903712d6633b7cabb347680b51d3fe53cc1 (diff) | |
download | beignet-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.cpp | 27 |
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)); } |