[Beignet] [PATCH] replace sin/cos with llvm intrinsic.

Zhigang Gong zhigang.gong at linux.intel.com
Thu Jan 29 20:54:57 PST 2015


Xionghu,

Before you replace all the __gen_ocl_sin/__gen_ocl_cos to llvm.sin/llvm.cos,
you can't remove GEN_OCL_COS/GEN_OCL_SIN.
 
On Fri, Jan 30, 2015 at 11:46:50AM +0800, xionghu.luo at intel.com wrote:
> From: Luo Xionghu <xionghu.luo at intel.com>
> 
> replace sin/cos non-stardard math intrinsic call with llvm intrinsic.
> translate them to llvm.xxx for fast path, refine the calls to call
> emitUnaryCallInst.
> 
> Signed-off-by: Luo Xionghu <xionghu.luo at intel.com>
> ---
>  backend/src/llvm/llvm_gen_backend.cpp | 59 ++++++++++-------------------------
>  1 file changed, 16 insertions(+), 43 deletions(-)
> 
> diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
> index d10d5c0..34c571e 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -2794,13 +2794,13 @@ error:
>            case Intrinsic::bswap:
>              this->newRegister(&I);
>            break;
> +          case Intrinsic::fabs:
>            case Intrinsic::sqrt:
>            case Intrinsic::ceil:
>            case Intrinsic::fma:
>            case Intrinsic::trunc:
> -            this->newRegister(&I);
> -          break;
> -          case Intrinsic::fabs:
> +          case Intrinsic::sin:
> +          case Intrinsic::cos:
>              this->newRegister(&I);
>            break;
>            default:
> @@ -2854,8 +2854,6 @@ error:
>        case GEN_OCL_FBH:
>        case GEN_OCL_FBL:
>        case GEN_OCL_CBIT:
> -      case GEN_OCL_COS:
> -      case GEN_OCL_SIN:
>        case GEN_OCL_SQR:
>        case GEN_OCL_RSQ:
>        case GEN_OCL_LOG:
> @@ -3056,6 +3054,13 @@ error:
>      if (Function *F = I.getCalledFunction()) {
>        if (F->getIntrinsicID() != 0) {
>          const ir::Function &fn = ctx.getFunction();
> +
> +        // Get the function arguments
> +        CallSite CS(&I);
> +        CallSite::arg_iterator AI = CS.arg_begin();
> +#if GBE_DEBUG
> +        CallSite::arg_iterator AE = CS.arg_end();
> +#endif /* GBE_DEBUG */
>          switch (F->getIntrinsicID()) {
>            case Intrinsic::stacksave:
>            {
> @@ -3212,29 +3217,6 @@ error:
>              }
>            }
>            break;
> -          case Intrinsic::sqrt:
> -          {
> -            const ir::Register dst = this->getRegister(&I);
> -            const ir::Register src = this->getRegister(I.getOperand(0));
> -            ctx.ALU1(ir::OP_SQR, ir::TYPE_FLOAT, dst, src);
> -          }
> -          break;
> -          case Intrinsic::fabs:
> -          {
> -            ir::Type srcType = getType(ctx, I.getType());
> -            const ir::Register dst = this->getRegister(&I);
> -            const ir::Register src = this->getRegister(I.getOperand(0));
> -            ctx.ALU1(ir::OP_ABS, srcType, dst, src);
> -          }
> -          break;
> -          case Intrinsic::ceil:
> -          {
> -            ir::Type srcType = getType(ctx, I.getType());
> -            const ir::Register dst = this->getRegister(&I);
> -            const ir::Register src = this->getRegister(I.getOperand(0));
> -            ctx.ALU1(ir::OP_RNDU, srcType, dst, src);
> -          }
> -          break;
>            case Intrinsic::ctlz:
>            {
>              Type *llvmDstType = I.getType();
> @@ -3286,19 +3268,12 @@ error:
>              ctx.MAD(srcType, dst, src0, src1, src2);
>            }
>            break;
> -          case Intrinsic::trunc:
> -          {
> -            Type *llvmDstType = I.getType();
> -            Type *llvmSrcType = I.getOperand(0)->getType();
> -            ir::Type dstType = getType(ctx, llvmDstType);
> -            ir::Type srcType = getType(ctx, llvmSrcType);
> -            GBE_ASSERT(srcType == dstType);
> -
> -            const ir::Register dst = this->getRegister(&I);
> -            const ir::Register src = this->getRegister(I.getOperand(0));
> -            ctx.RNDZ(dstType, dst, src);
> -          }
> -          break;
> +          case Intrinsic::sqrt: this->emitUnaryCallInst(I,CS,ir::OP_SQR); break;
> +          case Intrinsic::ceil: this->emitUnaryCallInst(I,CS,ir::OP_RNDU); break;
> +          case Intrinsic::fabs: this->emitUnaryCallInst(I,CS,ir::OP_ABS); break;
> +          case Intrinsic::trunc: this->emitUnaryCallInst(I,CS,ir::OP_RNDZ); break;
> +          case Intrinsic::sin: this->emitUnaryCallInst(I,CS,ir::OP_SIN); break;
> +          case Intrinsic::cos: this->emitUnaryCallInst(I,CS,ir::OP_COS); break;
>            default: NOT_IMPLEMENTED;
>          }
>        } else {
> @@ -3367,8 +3342,6 @@ error:
>              ctx.REGION(dst, src, x.getIntegerValue());
>              break;
>            }
> -          case GEN_OCL_COS: this->emitUnaryCallInst(I,CS,ir::OP_COS); break;
> -          case GEN_OCL_SIN: this->emitUnaryCallInst(I,CS,ir::OP_SIN); break;
>            case GEN_OCL_LOG: this->emitUnaryCallInst(I,CS,ir::OP_LOG); break;
>            case GEN_OCL_EXP: this->emitUnaryCallInst(I,CS,ir::OP_EXP); break;
>            case GEN_OCL_SQR: this->emitUnaryCallInst(I,CS,ir::OP_SQR); break;
> -- 
> 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