implement immediates and make them work
authorZack Rusin <zack@tungstengraphics.com>
Wed, 13 Feb 2008 13:31:13 +0000 (08:31 -0500)
committerZack Rusin <zack@tungstengraphics.com>
Wed, 13 Feb 2008 13:33:16 +0000 (08:33 -0500)
src/mesa/pipe/llvm/storagesoa.cpp
src/mesa/pipe/llvm/storagesoa.h

index 7292333a80314520a67deebd4e92c09773be4f80..7b758b1665c94e03931fdecc26142391937ffdbf 100644 (file)
@@ -41,6 +41,7 @@
 
 using namespace llvm;
 
+
 StorageSoa::StorageSoa(llvm::BasicBlock *block,
                        llvm::Value *input,
                        llvm::Value *output,
@@ -57,6 +58,28 @@ StorageSoa::StorageSoa(llvm::BasicBlock *block,
 
 void StorageSoa::addImmediate(float *vec)
 {
+   float vals[4]; //decompose into soa
+
+   vals[0] = vec[0]; vals[1] = vec[0]; vals[2] = vec[0]; vals[3] = vec[0];
+   llvm::Value *xChannel = createConstGlobalVector(vals);
+
+   vals[0] = vec[1]; vals[1] = vec[1]; vals[2] = vec[1]; vals[3] = vec[1];
+   llvm::Value *yChannel = createConstGlobalVector(vals);
+
+
+   vals[0] = vec[2]; vals[1] = vec[2]; vals[2] = vec[2]; vals[3] = vec[2];
+   llvm::Value *zChannel = createConstGlobalVector(vals);
+
+   vals[0] = vec[3]; vals[1] = vec[3]; vals[2] = vec[3]; vals[3] = vec[3];
+   llvm::Value *wChannel = createConstGlobalVector(vals);
+
+   std::vector<llvm::Value*> res(4);
+   res[0] = xChannel;
+   res[1] = yChannel;
+   res[2] = zChannel;
+   res[3] = wChannel;
+
+   m_immediates[m_immediates.size()] = res;
 }
 
 llvm::Value *StorageSoa::addrElement(int idx) const
@@ -123,6 +146,12 @@ std::vector<llvm::Value*> StorageSoa::tempElement(int idx, int swizzle,
 std::vector<llvm::Value*> StorageSoa::immediateElement(int idx, int swizzle)
 {
    std::vector<llvm::Value*> res(4);
+   res = m_immediates[idx];
+
+   res[0] = new LoadInst(res[0], name("immx"), false, m_block);
+   res[1] = new LoadInst(res[1], name("immx"), false, m_block);
+   res[2] = new LoadInst(res[2], name("immx"), false, m_block);
+   res[3] = new LoadInst(res[3], name("immx"), false, m_block);
 
    return res;
 }
@@ -226,3 +255,39 @@ llvm::Value *StorageSoa::alignedArrayLoad(llvm::Value *val)
    load->setAlignment(8);
    return load;
 }
+
+llvm::Module * StorageSoa::currentModule() const
+{
+    if (!m_block || !m_block->getParent())
+       return 0;
+
+    return m_block->getParent()->getParent();
+}
+
+llvm::Value * StorageSoa::createConstGlobalVector(float *vec)
+{
+   VectorType *vectorType = VectorType::get(Type::FloatTy, 4);
+   GlobalVariable *immediate = new GlobalVariable(
+      /*Type=*/vectorType,
+      /*isConstant=*/true,
+      /*Linkage=*/GlobalValue::ExternalLinkage,
+      /*Initializer=*/0, // has initializer, specified below
+      /*Name=*/name("immediate"),
+      currentModule());
+
+   std::vector<Constant*> immValues;
+   ConstantFP *constx = ConstantFP::get(Type::FloatTy, APFloat(vec[0]));
+   ConstantFP *consty = ConstantFP::get(Type::FloatTy, APFloat(vec[1]));
+   ConstantFP *constz = ConstantFP::get(Type::FloatTy, APFloat(vec[2]));
+   ConstantFP *constw = ConstantFP::get(Type::FloatTy, APFloat(vec[3]));
+   immValues.push_back(constx);
+   immValues.push_back(consty);
+   immValues.push_back(constz);
+   immValues.push_back(constw);
+   Constant  *constVector = ConstantVector::get(vectorType, immValues);
+
+   // Global Variable Definitions
+   immediate->setInitializer(constVector);
+
+   return immediate;
+}
index 43b23951debd23ec91390ce201acec19f37a6104..2d07e836f4b4f85ffec2eade09c0cb727624a1c6 100644 (file)
@@ -38,6 +38,7 @@ namespace llvm {
    class LoadInst;
    class Value;
    class VectorType;
+   class Module;
 }
 
 class StorageSoa
@@ -74,7 +75,9 @@ private:
                         int channel) const;
    const char *name(const char *prefix) const;
    llvm::ConstantInt *constantInt(int) const;
-   llvm::Value *alignedArrayLoad(llvm::Value *val);
+   llvm::Value  *alignedArrayLoad(llvm::Value *val);
+   llvm::Module *currentModule() const;
+   llvm::Value  *createConstGlobalVector(float *vec);
 
 private:
    llvm::BasicBlock *m_block;
@@ -84,6 +87,8 @@ private:
    llvm::Value *m_consts;
    llvm::Value *m_temps;
 
+   std::map<int, std::vector<llvm::Value*> > m_immediates;
+
    mutable std::map<int, llvm::ConstantInt*> m_constInts;
    mutable char        m_name[32];
    mutable int         m_idx;