[Beignet] [PATCH] HSW: Remove the jmpi distance limit of HSW.

Zhigang Gong zhigang.gong at linux.intel.com
Thu Jun 12 01:16:30 PDT 2014


LGTM, pushed, thanks.

On Thu, Jun 12, 2014 at 11:22:15PM +0800, Yang Rong wrote:
> Because the HSW's jmpi distance's unit is byte, the distance in JMPI instruction should
> be S31, so remove S16 restriction.
> It can fix luxmark fail when OCL_STRICT_CONFORMANCE=1.
> 
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
>  backend/src/backend/gen75_encoder.cpp | 25 +++++++++++++++++++++++++
>  backend/src/backend/gen75_encoder.hpp |  6 +++++-
>  backend/src/backend/gen_encoder.cpp   | 22 +++++++++++-----------
>  backend/src/backend/gen_encoder.hpp   | 13 ++++++++-----
>  4 files changed, 49 insertions(+), 17 deletions(-)
> 
> diff --git a/backend/src/backend/gen75_encoder.cpp b/backend/src/backend/gen75_encoder.cpp
> index 81364a9..69d2de0 100644
> --- a/backend/src/backend/gen75_encoder.cpp
> +++ b/backend/src/backend/gen75_encoder.cpp
> @@ -241,4 +241,29 @@ namespace gbe
>        pop();
>      }
>    }
> +
> +  void Gen75Encoder::JMPI(GenRegister src, bool longjmp) {
> +    alu2(this, GEN_OPCODE_JMPI, GenRegister::ip(), GenRegister::ip(), src);
> +  }
> +
> +  void Gen75Encoder::patchJMPI(uint32_t insnID, int32_t jumpDistance) {
> +    GenNativeInstruction &insn = *(GenNativeInstruction *)&this->store[insnID];
> +    GBE_ASSERT(insnID < this->store.size());
> +    GBE_ASSERT(insn.header.opcode == GEN_OPCODE_JMPI ||
> +               insn.header.opcode == GEN_OPCODE_BRD  ||
> +               insn.header.opcode == GEN_OPCODE_ENDIF ||
> +               insn.header.opcode == GEN_OPCODE_IF ||
> +               insn.header.opcode == GEN_OPCODE_BRC);
> +
> +    if (insn.header.opcode == GEN_OPCODE_IF) {
> +      this->setSrc1(&insn, GenRegister::immd(jumpDistance));
> +      return;
> +    }
> +    else if (insn.header.opcode == GEN_OPCODE_JMPI) {
> +      //jumpDistance'unit is Qword, and the HSW's offset of jmpi is in byte, so multi 8
> +      jumpDistance = (jumpDistance - 2) * 8;
> +    }
> +
> +    this->setSrc1(&insn, GenRegister::immd(jumpDistance));
> +  }
>  } /* End of the name space. */
> diff --git a/backend/src/backend/gen75_encoder.hpp b/backend/src/backend/gen75_encoder.hpp
> index 01520ed..c10dac9 100644
> --- a/backend/src/backend/gen75_encoder.hpp
> +++ b/backend/src/backend/gen75_encoder.hpp
> @@ -36,8 +36,12 @@ namespace gbe
>      virtual ~Gen75Encoder(void) { }
>  
>      Gen75Encoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID)
> -         : GenEncoder(simdWidth, gen, deviceID, 8) { }
> +         : GenEncoder(simdWidth, gen, deviceID) { }
>  
> +    /*! Jump indexed instruction */
> +    virtual void JMPI(GenRegister src, bool longjmp = false);
> +    /*! Patch JMPI/BRC/BRD (located at index insnID) with the given jump distance */
> +    virtual void patchJMPI(uint32_t insnID, int32_t jumpDistance);
>      /*! Get double/long exec width */
>      virtual int getDoubleExecWidth(void) { return GEN75_DOUBLE_EXEC_WIDTH; }
>      virtual void MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp = GenRegister::null());
> diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp
> index d836995..26337e9 100644
> --- a/backend/src/backend/gen_encoder.cpp
> +++ b/backend/src/backend/gen_encoder.cpp
> @@ -218,8 +218,8 @@ namespace gbe
>    //////////////////////////////////////////////////////////////////////////
>    // Gen Emitter encoding class
>    //////////////////////////////////////////////////////////////////////////
> -  GenEncoder::GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID, int jump_width) :
> -    stateNum(0), gen(gen), deviceID(deviceID), jump_width(jump_width)
> +  GenEncoder::GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID) :
> +    stateNum(0), gen(gen), deviceID(deviceID)
>    {
>      this->simdWidth = simdWidth;
>      this->curr.execWidth = simdWidth;
> @@ -609,8 +609,8 @@ namespace gbe
>        }
>    }
>  
> -  INLINE void alu1(GenEncoder *p, uint32_t opcode, GenRegister dst,
> -                   GenRegister src, uint32_t condition = 0) {
> +  void alu1(GenEncoder *p, uint32_t opcode, GenRegister dst,
> +            GenRegister src, uint32_t condition) {
>       if (dst.isdf() && src.isdf()) {
>         handleDouble(p, opcode, dst, src);
>       } else if (dst.isint64() && src.isint64()) { // handle int64
> @@ -649,12 +649,12 @@ namespace gbe
>       }
>    }
>  
> -  INLINE void alu2(GenEncoder *p,
> -                   uint32_t opcode,
> -                   GenRegister dst,
> -                   GenRegister src0,
> -                   GenRegister src1,
> -                   uint32_t condition = 0)
> +  void alu2(GenEncoder *p,
> +            uint32_t opcode,
> +            GenRegister dst,
> +            GenRegister src0,
> +            GenRegister src1,
> +            uint32_t condition)
>    {
>      if (dst.isdf() && src0.isdf() && src1.isdf()) {
>         handleDouble(p, opcode, dst, src0, src1);
> @@ -1043,7 +1043,7 @@ namespace gbe
>               return;
>             }
>             else if (insn.header.opcode == GEN_OPCODE_JMPI) {
> -             jumpDistance = (jumpDistance - 2)* jump_width;
> +             jumpDistance = jumpDistance - 2;
>             }
>  
>             this->setSrc1(&insn, GenRegister::immd(jumpDistance));
> diff --git a/backend/src/backend/gen_encoder.hpp b/backend/src/backend/gen_encoder.hpp
> index 02661d3..eb2d3d7 100644
> --- a/backend/src/backend/gen_encoder.hpp
> +++ b/backend/src/backend/gen_encoder.hpp
> @@ -65,7 +65,7 @@ namespace gbe
>    {
>    public:
>      /*! simdWidth is the default width for the instructions */
> -    GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID, int jump_width = 1);
> +    GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID);
>  
>      virtual ~GenEncoder(void) { }
>      /*! Size of the stack (should be large enough) */
> @@ -88,8 +88,6 @@ namespace gbe
>      uint32_t gen;
>      /*! Device ID */
>      uint32_t deviceID;
> -    /*! The constant for jump. */
> -    const int jump_width;
>      /*! simd width for this codegen */
>      uint32_t simdWidth;
>      ////////////////////////////////////////////////////////////////////////
> @@ -149,7 +147,7 @@ namespace gbe
>      /*! Memory fence message (to order loads and stores between threads) */
>      void FENCE(GenRegister dst);
>      /*! Jump indexed instruction */
> -    void JMPI(GenRegister src, bool longjmp = false);
> +    virtual void JMPI(GenRegister src, bool longjmp = false);
>      /*! IF indexed instruction */
>      void IF(GenRegister src);
>      /*! ENDIF indexed instruction */
> @@ -206,7 +204,7 @@ namespace gbe
>      void MATH(GenRegister dst, uint32_t function, GenRegister src);
>  
>      /*! Patch JMPI/BRC/BRD (located at index insnID) with the given jump distance */
> -    void patchJMPI(uint32_t insnID, int32_t jumpDistance);
> +    virtual void patchJMPI(uint32_t insnID, int32_t jumpDistance);
>  
>      ////////////////////////////////////////////////////////////////////////
>      // Helper functions to encode
> @@ -230,6 +228,11 @@ namespace gbe
>      GBE_CLASS(GenEncoder); //!< Use custom allocators
>    };
>  
> +  void alu1(GenEncoder *p, uint32_t opcode, GenRegister dst,
> +            GenRegister src, uint32_t condition = 0);
> +
> +  void alu2(GenEncoder *p, uint32_t opcode, GenRegister dst,
> +            GenRegister src0, GenRegister src1, uint32_t condition = 0);
>  } /* namespace gbe */
>  
>  #endif /* __GBE_GEN_ENCODER_HPP__ */
> -- 
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list