[Beignet] [PATCH] Backend: for BDW and after, According to BSpec no need to split CMP when src is DW DF

Song, Ruiling ruiling.song at intel.com
Fri Mar 3 07:19:38 UTC 2017



> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> rander
> Sent: Monday, February 27, 2017 12:25 PM
> To: beignet at lists.freedesktop.org
> Cc: Wang, Rander <rander.wang at intel.com>
> Subject: [Beignet] [PATCH] Backend: for BDW and after, According to BSpec no
> need to split CMP when src is DW DF
> 
> Signed-off-by: rander <rander.wang at intel.com>
> ---
>  backend/src/backend/gen8_encoder.cpp | 10 ++++++++++
>  backend/src/backend/gen8_encoder.hpp |  1 +
>  backend/src/backend/gen9_encoder.cpp |  5 +++++
>  backend/src/backend/gen9_encoder.hpp |  1 +
>  backend/src/backend/gen_encoder.cpp  |  7 ++++++-
>  backend/src/backend/gen_encoder.hpp  |  1 +
>  6 files changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/backend/src/backend/gen8_encoder.cpp
> b/backend/src/backend/gen8_encoder.cpp
> index a33fbac..bb4fdb0 100644
> --- a/backend/src/backend/gen8_encoder.cpp
> +++ b/backend/src/backend/gen8_encoder.cpp
> @@ -38,6 +38,7 @@ static const uint32_t untypedRWMask[] = {
>  namespace gbe
>  {
>    extern bool compactAlu3(GenEncoder *p, uint32_t opcode, GenRegister dst,
> GenRegister src0, GenRegister src1, GenRegister src2);
> +
>    void Gen8Encoder::setHeader(GenNativeInstruction *insn) {
>      Gen8NativeInstruction *gen8_insn = &insn->gen8_insn;
>      if (this->curr.execWidth == 8)
> @@ -883,4 +884,13 @@ namespace gbe
>                     msg_length,
>                     response_length);
>     }
> +
> +    /* for BDW and after, no need to split CMP when src is DW*/
> +    bool Gen8Encoder::needToSplitCmpBySrcType(GenEncoder *p, GenRegister
> src0, GenRegister src1) {
I am a little confusing, in the comment you said no need to split if src is DW.
Why do you still return "true" for GEN_TYPE_F?

> +      if (src0.type == GEN_TYPE_F)
> +        return true;
> +      if (src1.type == GEN_TYPE_F)
> +        return true;
> +      return false;
> +    }
>  } /* End of the name space. */
> diff --git a/backend/src/backend/gen8_encoder.hpp
> b/backend/src/backend/gen8_encoder.hpp
> index fa62a8d..51c079c 100644
> --- a/backend/src/backend/gen8_encoder.hpp
> +++ b/backend/src/backend/gen8_encoder.hpp
> @@ -83,6 +83,7 @@ namespace gbe
>      virtual void OBREADA64(GenRegister dst, GenRegister header, uint32_t bti,
> uint32_t elemSize);
>      /*! A64 OBlock write */
>      virtual void OBWRITEA64(GenRegister header, uint32_t bti, uint32_t
> elemSize);
> +    virtual bool needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0,
> GenRegister src1);
>    };
>  }
>  #endif /* __GBE_GEN8_ENCODER_HPP__ */
> diff --git a/backend/src/backend/gen9_encoder.cpp
> b/backend/src/backend/gen9_encoder.cpp
> index b37fd98..f2b9274 100644
> --- a/backend/src/backend/gen9_encoder.cpp
> +++ b/backend/src/backend/gen9_encoder.cpp
> @@ -301,4 +301,9 @@ namespace gbe
>                  response_length);
>      }
>    }
> +
> +  bool Gen9Encoder::needToSplitCmpBySrcType(GenEncoder *p, GenRegister
> src0, GenRegister src1)
> +  {
> +    return false;
> +  }
>  } /* End of the name space. */
> diff --git a/backend/src/backend/gen9_encoder.hpp
> b/backend/src/backend/gen9_encoder.hpp
> index 2eaa538..69b7490 100644
> --- a/backend/src/backend/gen9_encoder.hpp
> +++ b/backend/src/backend/gen9_encoder.hpp
> @@ -56,6 +56,7 @@ namespace gbe
>      virtual void ATOMIC(GenRegister dst, uint32_t function, GenRegister addr,
> GenRegister data, GenRegister bti, uint32_t srcNum, bool useSends);
>      virtual void OBWRITE(GenRegister header, GenRegister data, uint32_t bti,
> uint32_t ow_size, bool useSends);
>      virtual void MBWRITE(GenRegister header, GenRegister data, uint32_t bti,
> uint32_t data_size, bool useSends);
> +    virtual bool needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0,
> GenRegister src1);
>    };
>  }
>  #endif /* __GBE_GEN9_ENCODER_HPP__ */
> diff --git a/backend/src/backend/gen_encoder.cpp
> b/backend/src/backend/gen_encoder.cpp
> index 03ce0e2..296a0c5 100644
> --- a/backend/src/backend/gen_encoder.cpp
> +++ b/backend/src/backend/gen_encoder.cpp
> @@ -192,6 +192,10 @@ namespace gbe
>      if (isSrcDstDiffSpan(dst, src0) == true) return true;
>      if (isSrcDstDiffSpan(dst, src1) == true) return true;


I would like to see needToSplitCmpBySrcType be called here.
That is needToSplitCmp() will do all kind of check. That is conform to its name.
> 
> +    return false;
> +  }
> +
> +  bool GenEncoder::needToSplitCmpBySrcType(GenEncoder *p, GenRegister
> src0, GenRegister src1) {
>      if (src0.type == GEN_TYPE_D || src0.type == GEN_TYPE_UD || src0.type ==
> GEN_TYPE_F)
>        return true;
>      if (src1.type == GEN_TYPE_D || src1.type == GEN_TYPE_UD || src1.type ==
> GEN_TYPE_F)
> @@ -199,6 +203,7 @@ namespace gbe
>      return false;
>    }
> 
> +
>    void GenEncoder::setMessageDescriptor(GenNativeInstruction *inst, enum
> GenMessageTarget sfid,
>                                          unsigned msg_length, unsigned response_length,
>                                          bool header_present, bool end_of_thread)
> @@ -1041,7 +1046,7 @@ namespace gbe
>    }
> 
>    void GenEncoder::CMP(uint32_t conditional, GenRegister src0, GenRegister
> src1, GenRegister dst) {
> -    if (needToSplitCmp(this, src0, src1, dst) == false) {

Please remove the call to needToSplitCmpBySrcType() here. I think move it into needToSplitCmp() is more clear.
> +    if ((needToSplitCmp(this, src0, src1, dst) | needToSplitCmpBySrcType(this,
> src0, src1))== false) {
>        if(!GenRegister::isNull(dst) && compactAlu2(this, GEN_OPCODE_CMP, dst,
> src0, src1, conditional, false)) {
>          return;
>        }
> diff --git a/backend/src/backend/gen_encoder.hpp
> b/backend/src/backend/gen_encoder.hpp
> index 3e45c81..040b94a 100644
> --- a/backend/src/backend/gen_encoder.hpp
> +++ b/backend/src/backend/gen_encoder.hpp
> @@ -162,6 +162,7 @@ namespace gbe
>      void BRD(GenRegister src);
>      /*! Compare instructions */
>      void CMP(uint32_t conditional, GenRegister src0, GenRegister src1,
> GenRegister dst = GenRegister::null());
> +    virtual bool needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0,
> GenRegister src1);
>      /*! Select with embedded compare (like sel.le ...) */
>      void SEL_CMP(uint32_t conditional, GenRegister dst, GenRegister src0,
> GenRegister src1);
>      /*! EOT is used to finish GPGPU threads */
> --
> 2.7.4
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list