make swizzling on incoming arguments work
[mesa.git] / src / mesa / pipe / llvm / storagesoa.h
index 84db7726a7ceaf136ac81f92352555cb18b65c68..9443234c82f59ca37e45447730a56b6fa7e3e255 100644 (file)
@@ -38,10 +38,19 @@ namespace llvm {
    class LoadInst;
    class Value;
    class VectorType;
+   class Module;
 }
 
 class StorageSoa
 {
+public:
+   enum Argument {
+      Input,
+      Output,
+      Temp,
+      Const,
+      Immediate
+   };
 public:
    StorageSoa(llvm::BasicBlock *block,
               llvm::Value *input,
@@ -49,16 +58,12 @@ public:
               llvm::Value *consts,
               llvm::Value *temps);
 
+   std::vector<llvm::Value*> argument(Argument type, int idx, int swizzle, 
+                                      llvm::Value *indIdx =0);
    void addImmediate(float *vec);
 
    llvm::Value  * addrElement(int idx) const;
 
-   std::vector<llvm::Value*> inputElement(int idx, int swizzle, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> constElement(int idx, int swizzle, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> outputElement(int idx, int swizzle, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> tempElement(int idx, int swizzle, llvm::Value *indIdx =0);
-   std::vector<llvm::Value*> immediateElement(int idx, int swizzle);
-
    llvm::Value *extractIndex(llvm::Value *vec);
 
    void storeOutput(int dstIdx, const std::vector<llvm::Value*> &val,
@@ -74,6 +79,15 @@ private:
                         int channel) const;
    const char *name(const char *prefix) const;
    llvm::ConstantInt *constantInt(int) const;
+   llvm::Value  *alignedArrayLoad(llvm::Value *val);
+   llvm::Module *currentModule() const;
+   llvm::Value  *createConstGlobalVector(float *vec);
+
+   std::vector<llvm::Value*> inputElement(int idx, llvm::Value *indIdx =0);
+   std::vector<llvm::Value*> constElement(int idx, llvm::Value *indIdx =0);
+   std::vector<llvm::Value*> outputElement(int idx, llvm::Value *indIdx =0);
+   std::vector<llvm::Value*> tempElement(int idx, llvm::Value *indIdx =0);
+   std::vector<llvm::Value*> immediateElement(int idx);
 private:
    llvm::BasicBlock *m_block;
 
@@ -82,6 +96,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;