[Beignet] [PATCH 08/13] Backend: Add the MADM function to gen8 encoder.

Yang, Rong R rong.r.yang at intel.com
Mon Oct 19 23:34:44 PDT 2015


MADM function's accept float and double type, for float type madm, the simd size maybe 16, but 3 src instruction, the exec width is 8. so you should split it in MADM function for float and simd16 case.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> junyan.he at inbox.com
> Sent: Friday, September 18, 2015 17:58
> To: beignet at lists.freedesktop.org
> Subject: [Beignet] [PATCH 08/13] Backend: Add the MADM function to gen8
> encoder.
> 
> From: Junyan He <junyan.he at linux.intel.com>
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  backend/src/backend/gen8_encoder.cpp | 56
> ++++++++++++++++++++++++++++++++++++
>  backend/src/backend/gen8_encoder.hpp |  2 ++
>  2 files changed, 58 insertions(+)
> 
> diff --git a/backend/src/backend/gen8_encoder.cpp
> b/backend/src/backend/gen8_encoder.cpp
> index 3d1ce2d..583f975 100644
> --- a/backend/src/backend/gen8_encoder.cpp
> +++ b/backend/src/backend/gen8_encoder.cpp
> @@ -638,4 +638,60 @@ namespace gbe
>       this->setSrc0WithAcc(insn, src0, src0Acc);
>       this->setSrc1WithAcc(insn, src1, src1Acc);
>    }
> +
> +  void Gen8Encoder::MADM(GenRegister dst, GenRegister src0,
> GenRegister src1, GenRegister src2,
> +      uint32_t dstAcc, uint32_t src0Acc, uint32_t src1Acc, uint32_t
> + src2Acc)  {
> +    GenNativeInstruction *insn = this->next(GEN_OPCODE_MADM);
> +    Gen8NativeInstruction *gen8_insn = &insn->gen8_insn;
> +    assert(dst.file == GEN_GENERAL_REGISTER_FILE);
> +    assert(src0.file == GEN_GENERAL_REGISTER_FILE);
> +    assert(src1.file == GEN_GENERAL_REGISTER_FILE);
> +    assert(src2.file == GEN_GENERAL_REGISTER_FILE);
> +    assert(dst.hstride == GEN_HORIZONTAL_STRIDE_1 || dst.hstride ==
> GEN_HORIZONTAL_STRIDE_0);
> +    assert(src0.type == GEN_TYPE_DF || src0.type == GEN_TYPE_F);
> +    assert(src0.type == dst.type);
> +    assert(src0.type == src1.type);
> +    assert(src0.type == src2.type);
> +    int32_t dataType = src0.type == GEN_TYPE_DF ? 3 : 0;
> +
> +    this->setHeader(insn);
> +    gen8_insn->bits1.da3srcacc.dest_reg_nr = dst.nr;
> +    gen8_insn->bits1.da3srcacc.dest_subreg_nr = dst.subnr / 16;
> +    gen8_insn->bits1.da3srcacc.dst_special_acc = dstAcc;
> +    gen8_insn->bits1.da3srcacc.src_type = dataType;
> +    gen8_insn->bits1.da3srcacc.dest_type = dataType;
> +    gen8_insn->header.access_mode = GEN_ALIGN_16;
> +
> +    assert(src0.file == GEN_GENERAL_REGISTER_FILE);
> +    assert(src0.address_mode == GEN_ADDRESS_DIRECT);
> +    assert(src0.nr < 128);
> +    gen8_insn->bits2.da3srcacc.src0_special_acc = src0Acc;
> +    gen8_insn->bits2.da3srcacc.src0_subreg_nr = src0.subnr / 4 ;
> +    gen8_insn->bits2.da3srcacc.src0_reg_nr = src0.nr;
> +    gen8_insn->bits1.da3srcacc.src0_abs = src0.absolute;
> +    gen8_insn->bits1.da3srcacc.src0_negate = src0.negation;
> +    gen8_insn->bits2.da3srcacc.src0_rep_ctrl = src0.vstride ==
> + GEN_VERTICAL_STRIDE_0;
> +
> +    assert(src1.file == GEN_GENERAL_REGISTER_FILE);
> +    assert(src1.address_mode == GEN_ADDRESS_DIRECT);
> +    assert(src1.nr < 128);
> +    gen8_insn->bits2.da3srcacc.src1_special_acc = src1Acc;
> +    gen8_insn->bits2.da3srcacc.src1_subreg_nr_low = (src1.subnr / 4) & 0x3;
> +    gen8_insn->bits3.da3srcacc.src1_subreg_nr_high = (src1.subnr / 4) >> 2;
> +    gen8_insn->bits2.da3srcacc.src1_rep_ctrl = src1.vstride ==
> GEN_VERTICAL_STRIDE_0;
> +    gen8_insn->bits3.da3srcacc.src1_reg_nr = src1.nr;
> +    gen8_insn->bits1.da3srcacc.src1_abs = src1.absolute;
> +    gen8_insn->bits1.da3srcacc.src1_negate = src1.negation;
> +
> +    assert(src2.file == GEN_GENERAL_REGISTER_FILE);
> +    assert(src2.address_mode == GEN_ADDRESS_DIRECT);
> +    assert(src2.nr < 128);
> +    gen8_insn->bits3.da3srcacc.src2_special_acc = src2Acc;
> +    gen8_insn->bits3.da3srcacc.src2_subreg_nr = src2.subnr / 4;
> +    gen8_insn->bits3.da3srcacc.src2_rep_ctrl = src2.vstride ==
> GEN_VERTICAL_STRIDE_0;
> +    gen8_insn->bits3.da3srcacc.src2_reg_nr = src2.nr;
> +    gen8_insn->bits1.da3srcacc.src2_abs = src2.absolute;
> +    gen8_insn->bits1.da3srcacc.src2_negate = src2.negation;  }
>  } /* End of the name space. */
> diff --git a/backend/src/backend/gen8_encoder.hpp
> b/backend/src/backend/gen8_encoder.hpp
> index 06d01a4..4cd3664 100644
> --- a/backend/src/backend/gen8_encoder.hpp
> +++ b/backend/src/backend/gen8_encoder.hpp
> @@ -71,6 +71,8 @@ namespace gbe
> 
>      void MATH_WITH_ACC(GenRegister dst, uint32_t function, GenRegister
> src0, GenRegister src1,
>                         uint32_t dstAcc, uint32_t src0Acc, uint32_t src1Acc);
> +    void MADM(GenRegister dst, GenRegister src0, GenRegister src1,
> GenRegister src2,
> +              uint32_t dstAcc, uint32_t src0Acc, uint32_t src1Acc,
> + uint32_t src2Acc);
>    };
>  }
>  #endif /* __GBE_GEN8_ENCODER_HPP__ */
> --
> 1.9.1
> 
> 
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list