[Beignet] [PATCH 1/2] support global scalar constants

Homer Hsing homer.xing at intel.com
Wed Jul 3 19:45:41 PDT 2013


support kind of "constant int n = 1;"

collect scalar value in constant collector
also do virtual register translation for scalar constants

Signed-off-by: Homer Hsing <homer.xing at intel.com>
---
 backend/src/llvm/llvm_gen_backend.cpp | 39 ++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index c2e37fa..40f2667 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -567,6 +567,35 @@ namespace gbe
       if(addrSpace == ir::AddressSpace::MEM_CONSTANT) {
         GBE_ASSERT(v.hasInitializer());
         const Constant *c = v.getInitializer();
+        if (c->getType()->getTypeID() != Type::ArrayTyID) {
+          void *mem = malloc(sizeof(double));
+          int size = 0;
+          switch(c->getType()->getTypeID()) {
+            case Type::TypeID::IntegerTyID: {
+              const ConstantInt *ci = dyn_cast<ConstantInt>(c);
+              *(int *)mem = ci->isNegative() ? ci->getSExtValue() : ci->getZExtValue();
+              size = sizeof(int);
+              break;
+            }
+            case Type::TypeID::FloatTyID: {
+              const ConstantFP *cf = dyn_cast<ConstantFP>(c);
+              *(float *)mem = cf->getValueAPF().convertToFloat();
+              size = sizeof(float);
+              break;
+            }
+            case Type::TypeID::DoubleTyID: {
+              const ConstantFP *cf = dyn_cast<ConstantFP>(c);
+              *(double *)mem = cf->getValueAPF().convertToDouble();
+              size = sizeof(double);
+              break;
+            }
+            default:
+              NOT_IMPLEMENTED;
+          }
+          unit.newConstant((char *)mem, name, size, size);
+          free(mem);
+          continue;
+        }
         GBE_ASSERT(c->getType()->getTypeID() == Type::ArrayTyID);
         const ConstantDataArray *cda = dyn_cast<ConstantDataArray>(c);
         GBE_ASSERT(cda);
@@ -782,7 +811,11 @@ namespace gbe
     }
     Constant *CPV = dyn_cast<Constant>(value);
     if (CPV) {
-      GBE_ASSERT(isa<GlobalValue>(CPV) == false);
+      if (isa<GlobalValue>(CPV)) {
+        auto name = CPV->getName().str();
+        uint16_t reg = unit.getConstantSet().getConstant(name).getReg();
+        return ir::Register(reg);
+      }
       const ir::ImmediateIndex immIndex = this->newImmediate(CPV, elemID);
       const ir::Immediate imm = ctx.getImmediate(immIndex);
       const ir::Register reg = ctx.reg(getFamily(imm.type));
@@ -1189,10 +1222,6 @@ namespace gbe
       if(addrSpace != ir::AddressSpace::MEM_CONSTANT)
         continue;
       GBE_ASSERT(v.hasInitializer());
-      const Constant *c = v.getInitializer();
-      GBE_ASSERT(c->getType()->getTypeID() == Type::ArrayTyID);
-      const ConstantDataArray *cda = dyn_cast<ConstantDataArray>(c);
-      GBE_ASSERT(cda);
       ir::Register reg = ctx.reg(ir::RegisterFamily::FAMILY_DWORD);
       ir::Constant &con = unit.getConstantSet().getConstant(j ++);
       con.setReg(reg.value());
-- 
1.8.1.2



More information about the Beignet mailing list