[Beignet] [patch v2 1/2] add llvm Intrinsic call support.

xionghu.luo at intel.com xionghu.luo at intel.com
Sun Oct 26 20:14:49 PDT 2014


From: Luo Xionghu <xionghu.luo at intel.com>

so far this patch only support uadd_with_overflow.
sadd_with_overflow, usub_with_overflow, smul_with_overflow, umul_with_overflow, bswap are not supported yet.
this funtion should be implemented by carrier flag later.

v2: update comments.

Signed-off-by: Luo Xionghu <xionghu.luo at intel.com>
---
 backend/src/llvm/llvm_gen_backend.cpp |   66 ++++++++++++++++++++++++++++++++-
 1 file changed, 64 insertions(+), 2 deletions(-)

diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 39e22d7..bb2c1dd 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -365,6 +365,18 @@ namespace gbe
             return this->_newScalar(value, key, elementType, index, uniform);
           break;
         }
+        case Type::StructTyID:
+        {
+          auto structType = cast<StructType>(type);
+          auto elementType = structType->getElementType(index);
+          auto elementTypeID = elementType->getTypeID();
+          if (elementTypeID != Type::IntegerTyID &&
+              elementTypeID != Type::FloatTyID &&
+              elementTypeID != Type::DoubleTyID)
+            GBE_ASSERTM(false, "Strcuts of elements are not supported");
+            return this->_newScalar(value, key, elementType, index, uniform);
+          break;
+        }
         default: NOT_SUPPORTED;
       };
       return ir::Register();
@@ -586,6 +598,7 @@ namespace gbe
     DECL_VISIT_FN(FCmpInst, FCmpInst);
     DECL_VISIT_FN(InsertElement, InsertElementInst);
     DECL_VISIT_FN(ExtractElement, ExtractElementInst);
+    DECL_VISIT_FN(ExtractValue, ExtractValueInst);
     DECL_VISIT_FN(ShuffleVectorInst, ShuffleVectorInst);
     DECL_VISIT_FN(SelectInst, SelectInst);
     DECL_VISIT_FN(BranchInst, BranchInst);
@@ -613,7 +626,6 @@ namespace gbe
     void visitUnreachableInst(UnreachableInst &I) {NOT_SUPPORTED;}
     void visitGetElementPtrInst(GetElementPtrInst &I) {NOT_SUPPORTED;}
     void visitInsertValueInst(InsertValueInst &I) {NOT_SUPPORTED;}
-    void visitExtractValueInst(ExtractValueInst &I) {NOT_SUPPORTED;}
     template <bool isLoad, typename T> void visitLoadOrStore(T &I);
 
     INLINE void gatherBTI(Value *pointer, ir::BTI &bti);
@@ -1030,6 +1042,14 @@ namespace gbe
           regTranslator.newScalar(value, key, elemID, uniform);
         break;
       }
+      case Type::StructTyID:
+      {
+        auto structType = cast<StructType>(type);
+        const uint32_t elemNum = structType->getNumElements();
+        for (uint32_t elemID = 0; elemID < elemNum; ++elemID)
+          regTranslator.newScalar(value, key, elemID, uniform);
+        break;
+      }
       default: NOT_SUPPORTED;
     };
   }
@@ -2327,6 +2347,15 @@ namespace gbe
   void GenWriter::emitExtractElement(ExtractElementInst &I) {
   }
 
+  void GenWriter::regAllocateExtractValue(ExtractValueInst &I) {
+    Value *agg = I.getAggregateOperand();
+    for (const unsigned *i = I.idx_begin(), *e = I.idx_end(); i != e; i++)
+      regTranslator.newValueProxy(agg, &I, *i, 0);
+  }
+
+  void GenWriter::emitExtractValue(ExtractValueInst &I) {
+  }
+
   void GenWriter::regAllocateShuffleVectorInst(ShuffleVectorInst &I) {}
   void GenWriter::emitShuffleVectorInst(ShuffleVectorInst &I) {}
 
@@ -2442,6 +2471,17 @@ namespace gbe
           case Intrinsic::dbg_value:
           case Intrinsic::dbg_declare:
           break;
+          case Intrinsic::sadd_with_overflow:
+          case Intrinsic::uadd_with_overflow:
+          case Intrinsic::ssub_with_overflow:
+          case Intrinsic::usub_with_overflow:
+          case Intrinsic::smul_with_overflow:
+          case Intrinsic::umul_with_overflow:
+            this->newRegister(&I);
+          break;
+          case Intrinsic::bswap:
+            this->newRegister(&I);
+          break;
           default:
           GBE_ASSERTM(false, "Unsupported intrinsics");
         }
@@ -2741,7 +2781,6 @@ namespace gbe
             const ir::Register src2 = this->getRegister(I.getOperand(2));
             ctx.MUL(ir::TYPE_FLOAT, tmp, src0, src1);
             ctx.ADD(ir::TYPE_FLOAT, dst, tmp, src2);
-            break;
           }
           break;
           case Intrinsic::lifetime_start:
@@ -2752,6 +2791,29 @@ namespace gbe
           case Intrinsic::dbg_value:
           case Intrinsic::dbg_declare:
           break;
+          case Intrinsic::uadd_with_overflow:
+          {
+            Type *llvmDstType = I.getType();
+            GBE_ASSERT(llvmDstType->isStructTy());
+            ir::Type dst0Type = getType(ctx, llvmDstType->getStructElementType(0));
+            const ir::Register dst0  = this->getRegister(&I, 0);
+            const ir::Register src0 = this->getRegister(I.getOperand(0));
+            const ir::Register src1 = this->getRegister(I.getOperand(1));
+            ctx.ADD(dst0Type, dst0, src0, src1);
+
+            ir::Register overflow = this->getRegister(&I, 1);
+            ctx.LT(dst0Type, overflow, dst0, src1);
+          }
+          break;
+          case Intrinsic::sadd_with_overflow:
+          case Intrinsic::ssub_with_overflow:
+          case Intrinsic::usub_with_overflow:
+          case Intrinsic::smul_with_overflow:
+          case Intrinsic::umul_with_overflow:
+          NOT_IMPLEMENTED;
+          break;
+          case Intrinsic::bswap:
+          break;
           default: NOT_IMPLEMENTED;
         }
       } else {
-- 
1.7.9.5



More information about the Beignet mailing list