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

xionghu.luo at intel.com xionghu.luo at intel.com
Thu Jan 29 19:46:50 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.

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



More information about the Beignet mailing list