[Beignet] [patch v2 1/2] add llvm Intrinsic call support.
Zhigang Gong
zhigang.gong at linux.intel.com
Mon Oct 27 18:31:16 PDT 2014
This version LGTM, will push latter, thanks.
On Mon, Oct 27, 2014 at 11:14:49AM +0800, xionghu.luo at intel.com wrote:
> 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
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list