try to load the consts correctly
authorZack Rusin <zack@tungstengraphics.com>
Wed, 13 Feb 2008 12:28:26 +0000 (07:28 -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 e09e9e8fe7d2ade4e842ce87a339d27965be0f4d..7292333a80314520a67deebd4e92c09773be4f80 100644 (file)
@@ -81,6 +81,15 @@ std::vector<llvm::Value*> StorageSoa::constElement(int idx, int swizzle,
                                                    llvm::Value *indIdx)
 {
    std::vector<llvm::Value*> res(4);
+   llvm::Value *xChannel = elementPointer(m_consts, idx, 0);
+   llvm::Value *yChannel = elementPointer(m_consts, idx, 1);
+   llvm::Value *zChannel = elementPointer(m_consts, idx, 2);
+   llvm::Value *wChannel = elementPointer(m_consts, idx, 3);
+
+   res[0] = alignedArrayLoad(xChannel);
+   res[1] = alignedArrayLoad(yChannel);
+   res[2] = alignedArrayLoad(zChannel);
+   res[3] = alignedArrayLoad(wChannel);
 
    return res;
 }
@@ -206,3 +215,14 @@ llvm::ConstantInt * StorageSoa::constantInt(int idx) const
    m_constInts[idx] = constInt;
    return constInt;
 }
+
+llvm::Value *StorageSoa::alignedArrayLoad(llvm::Value *val)
+{
+   VectorType  *vectorType = VectorType::get(Type::FloatTy, 4);
+   PointerType *vectorPtr  = PointerType::get(vectorType, 0);
+
+   CastInst *cast = new BitCastInst(val, vectorPtr, name("toVector"), m_block);
+   LoadInst *load = new LoadInst(cast, name("alignLoad"), false, m_block);
+   load->setAlignment(8);
+   return load;
+}
index 84db7726a7ceaf136ac81f92352555cb18b65c68..43b23951debd23ec91390ce201acec19f37a6104 100644 (file)
@@ -74,6 +74,8 @@ private:
                         int channel) const;
    const char *name(const char *prefix) const;
    llvm::ConstantInt *constantInt(int) const;
+   llvm::Value *alignedArrayLoad(llvm::Value *val);
+
 private:
    llvm::BasicBlock *m_block;