llvm ir code to fetch the elements
authorZack Rusin <zack@tungstengraphics.com>
Tue, 12 Feb 2008 10:35:51 +0000 (05:35 -0500)
committerZack Rusin <zack@tungstengraphics.com>
Wed, 13 Feb 2008 04:11:05 +0000 (23:11 -0500)
src/mesa/pipe/llvm/storagesoa.cpp
src/mesa/pipe/llvm/storagesoa.h

index b2aca3557a98afc14641352d5f811da6ff6e0e91..ff94307c85d7f8ab786c61cc2852181394025e15 100644 (file)
@@ -45,6 +45,11 @@ StorageSoa::StorageSoa(llvm::BasicBlock *block,
                        llvm::Value *input,
                        llvm::Value *output,
                        llvm::Value *consts)
+   : m_block(block),
+     m_input(input),
+     m_output(output),
+     m_consts(consts),
+     m_idx(0)
 {
 }
 
@@ -62,6 +67,11 @@ std::vector<llvm::Value*> StorageSoa::inputElement(int idx, int swizzle,
 {
    std::vector<llvm::Value*> res(4);
 
+   res[0] = element(m_input, idx, 0);
+   res[1] = element(m_input, idx, 0);
+   res[2] = element(m_input, idx, 0);
+   res[3] = element(m_input, idx, 0);
+
    return res;
 }
 
@@ -78,6 +88,11 @@ std::vector<llvm::Value*> StorageSoa::outputElement(int idx, int swizzle,
 {
    std::vector<llvm::Value*> res(4);
 
+   res[0] = element(m_output, idx, 0);
+   res[1] = element(m_output, idx, 0);
+   res[2] = element(m_output, idx, 0);
+   res[3] = element(m_output, idx, 0);
+
    return res;
 }
 
@@ -115,3 +130,47 @@ void StorageSoa::storeAddress(int idx, const std::vector<llvm::Value*> &val,
                               int mask)
 {
 }
+
+llvm::Value * StorageSoa::elementPointer(llvm::Value *ptr, int index,
+                                         int channel) const
+{
+   std::vector<Value*> indices;
+   indices.push_back(constantInt(index));
+   indices.push_back(constantInt(0));//first element in the struct
+   indices.push_back(constantInt(channel));
+   indices.push_back(constantInt(0));//f channel
+   indices.push_back(constantInt(0));//first ptr in the f channel
+
+   GetElementPtrInst *getElem = new GetElementPtrInst(ptr,
+                                                      indices.begin(),
+                                                      indices.end(),
+                                                      name("ptr"),
+                                                      m_block);
+   return getElem;
+}
+
+llvm::Value * StorageSoa::element(llvm::Value *ptr, int index,
+                                  int channel) const
+{
+   llvm::Value *res = elementPointer(ptr, index, channel);
+   LoadInst *load = new LoadInst(res, name("element"), false, m_block);
+   //load->setAlignment(8);
+   return load;
+}
+
+const char * StorageSoa::name(const char *prefix) const
+{
+   ++m_idx;
+   snprintf(m_name, 32, "%s%d", prefix, m_idx);
+   return m_name;
+}
+
+llvm::ConstantInt * StorageSoa::constantInt(int idx) const
+{
+   if (m_constInts.find(idx) != m_constInts.end()) {
+      return m_constInts[idx];
+   }
+   ConstantInt *constInt = ConstantInt::get(APInt(32,  idx));
+   m_constInts[idx] = constInt;
+   return constInt;
+}
index 551b0b973423ea961ae3239d72228754c2018848..9d5609f539898fc0b597f5e41a10e0a35d30cd3b 100644 (file)
@@ -29,6 +29,7 @@
 #define STORAGESOA_H
 
 #include <vector>
+#include <map>
 
 namespace llvm {
    class BasicBlock;
@@ -65,7 +66,23 @@ public:
                   int mask);
    void storeAddress(int idx, const std::vector<llvm::Value*> &val,
                      int mask);
+private:
+   llvm::Value *elementPointer(llvm::Value *ptr, int index,
+                               int channel) const;
+   llvm::Value *element(llvm::Value *ptr, int index,
+                        int channel) const;
+   const char *name(const char *prefix) const;
+   llvm::ConstantInt *constantInt(int) const;
+private:
+   llvm::BasicBlock *m_block;
 
+   llvm::Value *m_input;
+   llvm::Value *m_output;
+   llvm::Value *m_consts;
+
+   mutable std::map<int, llvm::ConstantInt*> m_constInts;
+   mutable char        m_name[32];
+   mutable int         m_idx;
 };
 
 #endif