[Beignet] [PATCH] Backend: refine mix with hardware lrp function

Yang, Rong R rong.r.yang at intel.com
Wed Oct 21 00:55:08 PDT 2015


Some indent is not correct. The other part LGTM. And you'd better add a utest for it.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Pan Xiuli
> Sent: Tuesday, October 20, 2015 16:25
> To: beignet at lists.freedesktop.org
> Cc: Pan, Xiuli
> Subject: [Beignet] [PATCH] Backend: refine mix with hardware lrp function
> 
> EU support lrp function that simillar to mix, but only with float, so refine only
> float related mix with lrp.
> There will be little errors whit mix now with lrp.
> 
> Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
> ---
>  backend/src/backend/gen/gen_mesa_disasm.c  |  1 +
>  backend/src/backend/gen_context.cpp        |  1 +
>  backend/src/backend/gen_defs.hpp           |  1 +
>  backend/src/backend/gen_encoder.cpp        |  1 +
>  backend/src/backend/gen_encoder.hpp        |  1 +
>  backend/src/backend/gen_insn_selection.cpp |  6 ++++++
> backend/src/backend/gen_insn_selection.hxx |  1 +
>  backend/src/ir/context.hpp                 |  1 +
>  backend/src/ir/instruction.cpp             |  4 ++++
>  backend/src/ir/instruction.hpp             |  2 ++
>  backend/src/ir/instruction.hxx             |  1 +
>  backend/src/libocl/tmpl/ocl_common.tmpl.cl |  3 ++-
>  backend/src/llvm/llvm_gen_backend.cpp      | 13 +++++++++++++
>  backend/src/llvm/llvm_gen_ocl_function.hxx |  3 +++
>  14 files changed, 38 insertions(+), 1 deletion(-)
> 
> diff --git a/backend/src/backend/gen/gen_mesa_disasm.c
> b/backend/src/backend/gen/gen_mesa_disasm.c
> index 5220233..8824f3a 100644
> --- a/backend/src/backend/gen/gen_mesa_disasm.c
> +++ b/backend/src/backend/gen/gen_mesa_disasm.c
> @@ -77,6 +77,7 @@ static const struct {
>    [GEN_OPCODE_LINE] = { .name = "line", .nsrc = 2, .ndst = 1 },
>    [GEN_OPCODE_PLN] = { .name = "pln", .nsrc = 2, .ndst = 1 },
>    [GEN_OPCODE_MAD] = { .name = "mad", .nsrc = 3, .ndst = 1 },
> +  [GEN_OPCODE_LRP] = { .name = "lrp", .nsrc = 3, .ndst = 1 },
>    [GEN_OPCODE_SAD2] = { .name = "sad2", .nsrc = 2, .ndst = 1 },
>    [GEN_OPCODE_SADA2] = { .name = "sada2", .nsrc = 2, .ndst = 1 },
>    [GEN_OPCODE_DP4] = { .name = "dp4", .nsrc = 2, .ndst = 1 }, diff --git
> a/backend/src/backend/gen_context.cpp
> b/backend/src/backend/gen_context.cpp
> index baf3897..cff56c9 100644
> --- a/backend/src/backend/gen_context.cpp
> +++ b/backend/src/backend/gen_context.cpp
> @@ -1795,6 +1795,7 @@ namespace gbe
>      const GenRegister src2 = ra->genReg(insn.src(2));
>      switch (insn.opcode) {
>        case SEL_OP_MAD:  p->MAD(dst, src0, src1, src2); break;
> +      case SEL_OP_LRP:  p->LRP(dst, src0, src1, src2); break;
>        default: NOT_IMPLEMENTED;
>      }
>    }
> diff --git a/backend/src/backend/gen_defs.hpp
> b/backend/src/backend/gen_defs.hpp
> index 1ca148c..31f2666 100644
> --- a/backend/src/backend/gen_defs.hpp
> +++ b/backend/src/backend/gen_defs.hpp
> @@ -174,6 +174,7 @@ enum opcode {
>    GEN_OPCODE_LINE = 89,
>    GEN_OPCODE_PLN = 90,
>    GEN_OPCODE_MAD = 91,
> +  GEN_OPCODE_LRP = 92,
>    GEN_OPCODE_NOP = 126,
>  };
> 
> diff --git a/backend/src/backend/gen_encoder.cpp
> b/backend/src/backend/gen_encoder.cpp
> index cac29e8..4fbc31b 100644
> --- a/backend/src/backend/gen_encoder.cpp
> +++ b/backend/src/backend/gen_encoder.cpp
> @@ -879,6 +879,7 @@ namespace gbe
>    ALU2(PLN)
>    ALU2(MACH)
>    ALU3(MAD)
> +  ALU3(LRP)
>   // ALU2(BRC)
>   // ALU1(ENDIF)
>   //  ALU1(IF)
> diff --git a/backend/src/backend/gen_encoder.hpp
> b/backend/src/backend/gen_encoder.hpp
> index 79e7b6e..c720bdf 100644
> --- a/backend/src/backend/gen_encoder.hpp
> +++ b/backend/src/backend/gen_encoder.hpp
> @@ -125,6 +125,7 @@ namespace gbe
>      ALU2(LINE)
>      ALU2(PLN)
>      ALU3(MAD)
> +    ALU3(LRP)
>      //ALU2(MOV_DF);
>      ALU2(BRC)
>      ALU1(BRD)
> diff --git a/backend/src/backend/gen_insn_selection.cpp
> b/backend/src/backend/gen_insn_selection.cpp
> index da437d1..f6a2073 100644
> --- a/backend/src/backend/gen_insn_selection.cpp
> +++ b/backend/src/backend/gen_insn_selection.cpp
> @@ -546,6 +546,7 @@ namespace gbe
>      ALU2(MACH)
>      ALU1(LZD)
>      ALU3(MAD)
> +    ALU3(LRP)
>      ALU2WithTemp(MUL_HI)
>      ALU1(FBH)
>      ALU1(FBL)
> @@ -4715,6 +4716,11 @@ namespace gbe
>            sel.MAD(dst, src2, src0, src1);
>            break;
>           }
> +        case OP_LRP:
> +         {
> +          sel.LRP(dst, src0, src1, src2);
> +          break;
> +         }
>          default:
>            NOT_IMPLEMENTED;
>        }
> diff --git a/backend/src/backend/gen_insn_selection.hxx
> b/backend/src/backend/gen_insn_selection.hxx
> index adbb137..cf6bb1f 100644
> --- a/backend/src/backend/gen_insn_selection.hxx
> +++ b/backend/src/backend/gen_insn_selection.hxx
> @@ -45,6 +45,7 @@ DECL_SELECTION_IR(CMP, CompareInstruction)
> DECL_SELECTION_IR(I64CMP, I64CompareInstruction)
> DECL_SELECTION_IR(SEL_CMP, CompareInstruction)
> DECL_SELECTION_IR(MAD, TernaryInstruction)
> +DECL_SELECTION_IR(LRP, TernaryInstruction)
>  DECL_SELECTION_IR(JMPI, JumpInstruction)  DECL_SELECTION_IR(EOT,
> EotInstruction)  DECL_SELECTION_IR(INDIRECT_MOVE,
> IndirectMoveInstruction) diff --git a/backend/src/ir/context.hpp
> b/backend/src/ir/context.hpp index 0f7ded4..cf9d62b 100644
> --- a/backend/src/ir/context.hpp
> +++ b/backend/src/ir/context.hpp
> @@ -175,6 +175,7 @@ namespace ir {
>      DECL_THREE_SRC_INSN(SEL);
>      DECL_THREE_SRC_INSN(I64MADSAT);
>      DECL_THREE_SRC_INSN(MAD);
> +    DECL_THREE_SRC_INSN(LRP);
>  #undef DECL_THREE_SRC_INSN
> 
>      /*! For all nullary functions */
> diff --git a/backend/src/ir/instruction.cpp b/backend/src/ir/instruction.cpp
> index f93c528..fc30f16 100644
> --- a/backend/src/ir/instruction.cpp
> +++ b/backend/src/ir/instruction.cpp
> @@ -1800,6 +1800,10 @@ DECL_MEM_FN(GetImageInfoInstruction, uint8_t,
> getImageIndex(void), getImageIndex
>    Instruction MAD(Type type, Register dst, Tuple src) {
>      return internal::TernaryInstruction(OP_MAD, type, dst, src).convert();
>    }
> +
> +  Instruction LRP(Type type, Register dst, Tuple src) {
> +    return internal::TernaryInstruction(OP_LRP, type, dst,
> + src).convert();  }
>    // All compare functions
>  #define DECL_EMIT_FUNCTION(NAME) \
>    Instruction NAME(Type type, Register dst,  Register src0, Register src1) { \
> diff --git a/backend/src/ir/instruction.hpp b/backend/src/ir/instruction.hpp
> index 3f3c655..16aabda 100644
> --- a/backend/src/ir/instruction.hpp
> +++ b/backend/src/ir/instruction.hpp
> @@ -616,6 +616,8 @@ namespace ir {
>    Instruction I64MADSAT(Type type, Register dst, Tuple src);
>    /*! mad.type dst src */
>    Instruction MAD(Type type, Register dst, Tuple src);
> +  /*! lrp.type dst src */
> +  Instruction LRP(Type type, Register dst, Tuple src);
>    /*! upsample_short.type dst src */
>    Instruction UPSAMPLE_SHORT(Type type, Register dst, Register src0,
> Register src1);
>    /*! upsample_int.type dst src */
> diff --git a/backend/src/ir/instruction.hxx b/backend/src/ir/instruction.hxx
> index 81548c9..09afa7b 100644
> --- a/backend/src/ir/instruction.hxx
> +++ b/backend/src/ir/instruction.hxx
> @@ -102,6 +102,7 @@ DECL_INSN(UPSAMPLE_INT, BinaryInstruction)
> DECL_INSN(UPSAMPLE_LONG, BinaryInstruction)  DECL_INSN(I64MADSAT,
> TernaryInstruction)  DECL_INSN(MAD, TernaryInstruction)
> +DECL_INSN(LRP, TernaryInstruction)
>  DECL_INSN(IF, BranchInstruction)
>  DECL_INSN(ENDIF, BranchInstruction)
>  DECL_INSN(ELSE, BranchInstruction)
> diff --git a/backend/src/libocl/tmpl/ocl_common.tmpl.cl
> b/backend/src/libocl/tmpl/ocl_common.tmpl.cl
> index b6b09b5..0b6a8fb 100644
> --- a/backend/src/libocl/tmpl/ocl_common.tmpl.cl
> +++ b/backend/src/libocl/tmpl/ocl_common.tmpl.cl
> @@ -24,6 +24,7 @@
>  /////////////////////////////////////////////////////////////////////////////
>  PURE CONST OVERLOADABLE float __gen_ocl_fmax(float a, float b);  PURE
> CONST OVERLOADABLE float __gen_ocl_fmin(float a, float b);
> +PURE CONST OVERLOADABLE float __gen_ocl_lrp(float a, float b, float c);
> 
>  OVERLOADABLE float step(float edge, float x) {
>    return x < edge ? 0.0 : 1.0;
> @@ -36,7 +37,7 @@ OVERLOADABLE float min(float a, float b) {
>    return __gen_ocl_fmin(a, b);
>  }
>  OVERLOADABLE float mix(float x, float y, float a) {
> -  return x + (y-x)*a;
> +  return __gen_ocl_lrp(a,y,x); //The lrp using a different order with
> + mix
>  }
>  OVERLOADABLE float clamp(float v, float l, float u) {
>    return max(min(v, u), l);
> diff --git a/backend/src/llvm/llvm_gen_backend.cpp
> b/backend/src/llvm/llvm_gen_backend.cpp
> index 980996e..ffd3ba0 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -3543,6 +3543,7 @@ namespace gbe
>        case GEN_OCL_REGION:
>        case GEN_OCL_SIMD_ID:
>        case GEN_OCL_SIMD_SHUFFLE:
> +	  case GEN_OCL_LRP:
>          this->newRegister(&I);
>          break;
>        case GEN_OCL_PRINTF:
> @@ -4251,6 +4252,18 @@ namespace gbe
>              ctx.SIMD_SHUFFLE(getType(ctx, I.getType()), dst, src0, src1);
>              break;
>            }
> +		  case GEN_OCL_LRP:
> +		  {
> +            const ir::Register dst  = this->getRegister(&I);
> +            GBE_ASSERT(AI != AE);
> +            const ir::Register src0 = this->getRegister(*(AI++));
> +            GBE_ASSERT(AI != AE);
> +            const ir::Register src1 = this->getRegister(*(AI++));
> +            GBE_ASSERT(AI != AE);
> +            const ir::Register src2 = this->getRegister(*(AI++));
> +            ctx.LRP(ir::TYPE_FLOAT, dst, src0, src1, src2);
> +			break;
> +		  }
>            default: break;
>          }
>        }
> diff --git a/backend/src/llvm/llvm_gen_ocl_function.hxx
> b/backend/src/llvm/llvm_gen_ocl_function.hxx
> index cabb225..221ca8e 100644
> --- a/backend/src/llvm/llvm_gen_ocl_function.hxx
> +++ b/backend/src/llvm/llvm_gen_ocl_function.hxx
> @@ -170,3 +170,6 @@ DECL_LLVM_GEN_FUNCTION(REGION,
> __gen_ocl_region)
> 
>  // printf function
>  DECL_LLVM_GEN_FUNCTION(PRINTF, __gen_ocl_printf)
> +
> +// common function
> +DECL_LLVM_GEN_FUNCTION(LRP, __gen_ocl_lrp)
> --
> 2.1.4
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list