diff options
author | Zhigang Gong <zhigang.gong@intel.com> | 2015-04-13 10:36:37 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@intel.com> | 2015-04-13 16:12:09 +0800 |
commit | ad68ac93fb01be7e1bbfee77c675b8868e05a6e2 (patch) | |
tree | 04e192db774c22206f7ca4d6d3233da9a2d334ef | |
parent | 8853578ec6c479134131d03e2c7ec2761c6a71d2 (diff) |
GBE: fix a bug in byte scatter write.
In uniform mode, we should set simd width to 1 and set noMask bit.
Signed-off-by: Zhigang Gong <zhigang.gong@intel.com>
Reviewed-by: "Yang, Rong R" <rong.r.yang@intel.com>
-rw-r--r-- | backend/src/backend/gen_insn_selection.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp index 68ca7610..3ac932bb 100644 --- a/backend/src/backend/gen_insn_selection.cpp +++ b/backend/src/backend/gen_insn_selection.cpp @@ -3525,11 +3525,17 @@ namespace gbe const GenRegister value = sel.selReg(insn.getValue(0)); GBE_ASSERT(insn.getValueNum() == 1); const GenRegister tmp = sel.selReg(sel.reg(FAMILY_DWORD, isUniform), ir::TYPE_U32); - if (elemSize == GEN_BYTE_SCATTER_WORD) { - sel.MOV(tmp, GenRegister::retype(value, GEN_TYPE_UW)); - } else if (elemSize == GEN_BYTE_SCATTER_BYTE) { - sel.MOV(tmp, GenRegister::retype(value, GEN_TYPE_UB)); - } + sel.push(); + if (isUniform) { + sel.curr.noMask = 1; + sel.curr.execWidth = 1; + } + + if (elemSize == GEN_BYTE_SCATTER_WORD) + sel.MOV(tmp, GenRegister::retype(value, GEN_TYPE_UW)); + else if (elemSize == GEN_BYTE_SCATTER_BYTE) + sel.MOV(tmp, GenRegister::retype(value, GEN_TYPE_UB)); + sel.pop(); sel.BYTE_SCATTER(addr, tmp, elemSize, bti); } } |