[Beignet] [PATCH 2/3] Add Indirect struct argument read support.

Zhigang Gong zhigang.gong at linux.intel.com
Tue May 12 00:10:09 PDT 2015


On Mon, May 11, 2015 at 02:02:53PM +0800, Yang Rong wrote:
> The steps to handle Indirect argument read:
> 1. Find out all indirect loads and its address caculation.
> 2. Add INDIRECT_MOV IR instruction, replace load to INDIRECT_MOV.
> 3. Replace the bass address and offset ADD instruction to offset MOV instruction. Could optimize.
> 
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
>  backend/src/backend/gen_context.cpp        |  31 +++++--
>  backend/src/backend/gen_insn_selection.cpp |  45 +++++----
>  backend/src/backend/gen_insn_selection.hpp |   1 +
>  backend/src/backend/gen_register.hpp       |  11 ++-
>  backend/src/ir/instruction.cpp             |  50 ++++++++++
>  backend/src/ir/instruction.hpp             |  10 ++
>  backend/src/ir/instruction.hxx             |   1 +
>  backend/src/ir/lowering.cpp                | 141 +++++++++++++++++++++++++++--
>  8 files changed, 254 insertions(+), 36 deletions(-)
> 
> diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
> index 62fd596..1d1dc40 100644
> --- a/backend/src/backend/gen_context.cpp
> +++ b/backend/src/backend/gen_context.cpp
> @@ -1695,21 +1695,32 @@ namespace gbe
>    }
>  
>    void GenContext::emitIndirectMoveInstruction(const SelectionInstruction &insn) {
> -    GenRegister src = ra->genReg(insn.src(0));
> -    if(sel->isScalarReg(src.reg()))
> -      src = GenRegister::retype(src, GEN_TYPE_UW);
> -    else
> -      src = GenRegister::unpacked_uw(src.nr, src.subnr / typeSize(GEN_TYPE_UW));
> +    GenRegister baseReg = ra->genReg(insn.src(0));
> +    GenRegister offset = GenRegister::retype(ra->genReg(insn.src(1)), GEN_TYPE_UW);
> +    uint32_t immoffset = insn.extra.indirect_offset;
>  
>      const GenRegister dst = ra->genReg(insn.dst(0));
>      const GenRegister a0 = GenRegister::addr8(0);
>      uint32_t simdWidth = p->curr.execWidth;
> +    GenRegister indirect_src;
> +
> +    if(sel->isScalarReg(offset.reg()))
> +      offset = GenRegister::retype(offset, GEN_TYPE_UW);
> +    else
> +      offset = GenRegister::unpacked_uw(offset.nr, offset.subnr / typeSize(GEN_TYPE_UW));
> +    uint32_t baseRegOffset = GenRegister::grfOffset(baseReg);
> +    //There is a restrict that: lower 5 bits indirect reg SubRegNum and
> +    //the lower 5 bits of indirect imm SubRegNum cannot exceed 5 bits.
> +    //So can't use AddrImm field, need a add.
> +    p->ADD(offset, offset, GenRegister::immuw(baseRegOffset + immoffset));
We should not use offset as destination here, as this offset may be reused latter.
Should use a temporary register here. The other part LGTM.

Thanks,
Zhigang Gong.



More information about the Beignet mailing list