[Beignet] [PATCH 1/4] replace sin/cos with llvm intrinsic.
xionghu.luo at intel.com
xionghu.luo at intel.com
Thu Jan 29 22:15:18 PST 2015
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.
v2: some file changes like ocl_math.tmpl.cl and hxx missed.
Signed-off-by: Luo Xionghu <xionghu.luo at intel.com>
---
backend/src/libocl/tmpl/ocl_math.tmpl.cl | 4 +-
backend/src/llvm/llvm_gen_backend.cpp | 59 ++++++++----------------------
backend/src/llvm/llvm_gen_ocl_function.hxx | 2 -
3 files changed, 18 insertions(+), 47 deletions(-)
diff --git a/backend/src/libocl/tmpl/ocl_math.tmpl.cl b/backend/src/libocl/tmpl/ocl_math.tmpl.cl
index 49c4efa..8f726ff 100644
--- a/backend/src/libocl/tmpl/ocl_math.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math.tmpl.cl
@@ -24,8 +24,8 @@
constant int __ocl_math_fastpath_flag = 1;
PURE CONST float __gen_ocl_fabs(float x);
-PURE CONST float __gen_ocl_sin(float x);
-PURE CONST float __gen_ocl_cos(float x);
+CONST float __gen_ocl_sin(float x) __asm("llvm.sin" ".f32");
+CONST float __gen_ocl_cos(float x) __asm("llvm.cos" ".f32");
PURE CONST float __gen_ocl_sqrt(float x);
PURE CONST float __gen_ocl_rsqrt(float x);
PURE CONST float __gen_ocl_log(float x);
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;
diff --git a/backend/src/llvm/llvm_gen_ocl_function.hxx b/backend/src/llvm/llvm_gen_ocl_function.hxx
index 8ec8336..0ae7ec2 100644
--- a/backend/src/llvm/llvm_gen_ocl_function.hxx
+++ b/backend/src/llvm/llvm_gen_ocl_function.hxx
@@ -20,8 +20,6 @@ DECL_LLVM_GEN_FUNCTION(GET_WORK_DIM, __gen_ocl_get_work_dim)
// Math function
DECL_LLVM_GEN_FUNCTION(FABS, __gen_ocl_fabs)
-DECL_LLVM_GEN_FUNCTION(COS, __gen_ocl_cos)
-DECL_LLVM_GEN_FUNCTION(SIN, __gen_ocl_sin)
DECL_LLVM_GEN_FUNCTION(SQR, __gen_ocl_sqrt)
DECL_LLVM_GEN_FUNCTION(RSQ, __gen_ocl_rsqrt)
DECL_LLVM_GEN_FUNCTION(LOG, __gen_ocl_log)
--
1.9.1
More information about the Beignet
mailing list