[Beignet] [PATCH] GBE: Fixed a bug in byte gather/scatter.
Zhigang Gong
zhigang.gong at linux.intel.com
Wed May 22 20:11:56 PDT 2013
Sorry, I made a mistake, this bug is reported by Lv Meng, not yang rong.
So lv meng, please test it and give feedback. Thanks
> -----Original Message-----
> From: Zhigang Gong [mailto:zhigang.gong at linux.intel.com]
> Sent: Thursday, May 23, 2013 11:11 AM
> To: Yang, Rong R (rong.r.yang at intel.com)
> Cc: 'beignet at lists.freedesktop.org'
> Subject: RE: [Beignet] [PATCH] GBE: Fixed a bug in byte gather/scatter.
>
> Please try this patch with your original kernel which is use a short
element in a
> structure.
>
> > -----Original Message-----
> > From:
> > beignet-bounces+zhigang.gong=linux.intel.com at lists.freedesktop.org
> > [mailto:beignet-bounces+zhigang.gong=linux.intel.com at lists.freedesktop
> > .org]
> > On Behalf Of Zhigang Gong
> > Sent: Thursday, May 23, 2013 11:11 AM
> > To: beignet at lists.freedesktop.org
> > Cc: Zhigang Gong
> > Subject: [Beignet] [PATCH] GBE: Fixed a bug in byte gather/scatter.
> >
> > We can't just use the alignment to determine whether use the
> > gather/scatter or not. As for a short type, the compiler may also
> > generate a 4 alignment, thus it will trigger this bug.
> >
> > Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
> > ---
> > backend/src/backend/gen_insn_selection.cpp | 18 ++++++++++--------
> > 1 file changed, 10 insertions(+), 8 deletions(-)
> >
> > diff --git a/backend/src/backend/gen_insn_selection.cpp
> > b/backend/src/backend/gen_insn_selection.cpp
> > index 08bc6af..561e32f 100644
> > --- a/backend/src/backend/gen_insn_selection.cpp
> > +++ b/backend/src/backend/gen_insn_selection.cpp
> > @@ -1665,14 +1665,13 @@ namespace gbe
> >
> > void emitByteGather(Selection::Opaque &sel,
> > const ir::LoadInstruction &insn,
> > + const uint32_t elemSize,
> > GenRegister address,
> > GenRegister value,
> > uint32_t bti) const
> > {
> > using namespace ir;
> > GBE_ASSERT(insn.getValueNum() == 1);
> > - const Type type = insn.getValueType();
> > - const uint32_t elemSize = getByteScatterGatherSize(type);
> > const uint32_t simdWidth = sel.ctx.getSimdWidth();
> >
> > // We need a temporary register if we read bytes or words @@
> > -1711,13 +1710,15 @@ namespace gbe
> > insn.getAddressSpace() == MEM_PRIVATE ||
> > insn.getAddressSpace() == MEM_LOCAL);
> > GBE_ASSERT(sel.ctx.isScalarReg(insn.getValue(0)) == false);
> > + const Type type = insn.getValueType();
> > + const uint32_t elemSize = getByteScatterGatherSize(type);
> > if (insn.getAddressSpace() == MEM_CONSTANT)
> > this->emitIndirectMove(sel, insn, address);
> > - else if (insn.isAligned() == true)
> > + else if (insn.isAligned() == true && elemSize ==
> > + GEN_BYTE_SCATTER_DWORD)
> > this->emitUntypedRead(sel, insn, address, space ==
> MEM_LOCAL ?
> > 0xfe : 0x00);
> > else {
> > const GenRegister value = sel.selReg(insn.getValue(0));
> > - this->emitByteGather(sel, insn, address, value, space ==
> > MEM_LOCAL ? 0xfe : 0x01);
> > + this->emitByteGather(sel, insn, elemSize, address, value,
> > + space == MEM_LOCAL ? 0xfe : 0x01);
> > }
> > return true;
> > }
> > @@ -1745,13 +1746,12 @@ namespace gbe
> >
> > void emitByteScatter(Selection::Opaque &sel,
> > const ir::StoreInstruction &insn,
> > + const uint32_t elemSize,
> > GenRegister addr,
> > GenRegister value,
> > uint32_t bti) const
> > {
> > using namespace ir;
> > - const Type type = insn.getValueType();
> > - const uint32_t elemSize = getByteScatterGatherSize(type);
> > const uint32_t simdWidth = sel.ctx.getSimdWidth();
> > const GenRegister dst = value;
> >
> > @@ -1771,12 +1771,14 @@ namespace gbe
> > using namespace ir;
> > const AddressSpace space = insn.getAddressSpace();
> > const uint32_t bti = space == MEM_LOCAL ? 0xfe : 0x01;
> > - if (insn.isAligned() == true)
> > + const Type type = insn.getValueType();
> > + const uint32_t elemSize = getByteScatterGatherSize(type);
> > + if (insn.isAligned() == true && elemSize ==
> > + GEN_BYTE_SCATTER_DWORD)
> > this->emitUntypedWrite(sel, insn, bti);
> > else {
> > const GenRegister address = sel.selReg(insn.getAddress());
> > const GenRegister value = sel.selReg(insn.getValue(0));
> > - this->emitByteScatter(sel, insn, address, value, bti);
> > + this->emitByteScatter(sel, insn, elemSize, address, value,
> > + bti);
> > }
> > return true;
> > }
> > --
> > 1.7.11.7
> >
> > _______________________________________________
> > Beignet mailing list
> > Beignet at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list