[Beignet] [PATCH V2] GBE: Give a zero-initialized register for Undef value.
Ruiling Song
ruiling.song at intel.com
Tue Oct 29 06:57:51 CET 2013
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 <ruiling.song at intel.com>
---
backend/src/ir/context.hpp | 6 ++++++
backend/src/llvm/llvm_gen_backend.cpp | 20 ++++++++++++++++++--
2 files changed, 24 insertions(+), 2 deletions(-)
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 <typename T> 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<GlobalValue>(c)) {
return regTranslator.getScalar(c, elemID);
}
+ if(isa<UndefValue>(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<ConstantExpr>(c)) {
ConstantExpr * ce = dyn_cast<ConstantExpr>(c);
--
1.7.9.5
More information about the Beignet
mailing list