From: Ruiling Song Date: Tue, 29 Oct 2013 05:57:51 +0000 (+0800) Subject: GBE: Give a zero-initialized register for Undef value. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7391c63fad9f05a745b81cf21beb9d5d5278e271;p=contrib%2Fbeignet.git GBE: Give a zero-initialized register for Undef value. For instructions that reference an undef value, we simply allocate a register to the undef operand and set as 0. v2: handle float and double type. also fix some typos about double type. Signed-off-by: Ruiling Song Reviewed-by: Zhigang Gong Reviewed-by: "Xing, Homer" --- diff --git a/backend/src/ir/context.hpp b/backend/src/ir/context.hpp index a7337e6..7bb6e5a 100644 --- a/backend/src/ir/context.hpp +++ b/backend/src/ir/context.hpp @@ -82,6 +82,12 @@ namespace ir { } return ImmediateIndex(0); } + INLINE ImmediateIndex newFloatImmediate(float x) { + return this->newImmediate(x); + } + INLINE ImmediateIndex newDoubleImmediate(double x) { + return this->newImmediate(x); + } /*! Set an immediate value */ template INLINE void setImmediate(ImmediateIndex index, T value) { diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp index c2ed4b9..6f4ed72 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -740,7 +740,7 @@ namespace gbe const float f32 = seq->getElementAsFloat(index); return doIt(f32); } else if (Ty == Type::getDoubleTy(CPV->getContext())) { - const float f64 = seq->getElementAsDouble(index); + const double f64 = seq->getElementAsDouble(index); return doIt(f64); } } else @@ -769,7 +769,7 @@ namespace gbe const float f32 = 0; return doIt(f32); } else if (Ty == Type::getDoubleTy(CPV->getContext())) { - const float f64 = 0; + const double f64 = 0; return doIt(f64); } else { GBE_ASSERTM(false, "Unsupporte aggregate zero type."); @@ -879,6 +879,22 @@ namespace gbe if(isa(c)) { return regTranslator.getScalar(c, elemID); } + if(isa(c)) { + Type* llvmType = c->getType(); + ir::Type dstType = getType(ctx, llvmType); + ir::Register reg = ctx.reg(getFamily(dstType)); + + ir::ImmediateIndex immIndex; + if(llvmType->isIntegerTy()) + immIndex = ctx.newIntegerImmediate(0, dstType); + else if(llvmType->isFloatTy()) { + immIndex = ctx.newFloatImmediate((float)0.0); + } else { + immIndex = ctx.newDoubleImmediate((double)0.0); + } + ctx.LOADI(dstType, reg, immIndex); + return reg; + } if(isa(c)) { ConstantExpr * ce = dyn_cast(c);