Refactor the tgsi->llvm storage translator
authorZack Rusin <zack@tungstengraphics.com>
Wed, 17 Oct 2007 15:28:26 +0000 (11:28 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Wed, 24 Oct 2007 15:21:03 +0000 (11:21 -0400)
src/mesa/pipe/llvm/llvmtgsi.cpp
src/mesa/pipe/llvm/storage.cpp [new file with mode: 0644]
src/mesa/pipe/llvm/storage.h [new file with mode: 0644]
src/mesa/pipe/llvm/tgsillvmbuilder.cpp [deleted file]
src/mesa/sources

index 5cbd0ae89ffa60ce9acaf0dba6348072ef3cc668..c6cf2de4fc2b4dd344a5f863fc5b562576e96e04 100644 (file)
@@ -1,5 +1,8 @@
 #include "llvmtgsi.h"
 
+#include "instructions.h"
+#include "storage.h"
+
 #include "pipe/p_context.h"
 #include "pipe/tgsi/exec/tgsi_exec.h"
 #include "pipe/tgsi/exec/tgsi_token.h"
 #include <llvm/Bitcode/ReaderWriter.h>
 #include <iostream>
 
-#include "instructions.h"
 using namespace llvm;
 #include "llvm_base_shader.cpp"
-#include "tgsillvmbuilder.cpp"
 
 
 static inline void addPass(PassManager &PM, Pass *P) {
diff --git a/src/mesa/pipe/llvm/storage.cpp b/src/mesa/pipe/llvm/storage.cpp
new file mode 100644 (file)
index 0000000..c6e86ea
--- /dev/null
@@ -0,0 +1,140 @@
+#include "storage.h"
+
+#include <llvm/BasicBlock.h>
+#include <llvm/Module.h>
+#include <llvm/Value.h>
+
+#include <llvm/CallingConv.h>
+#include <llvm/Constants.h>
+#include <llvm/DerivedTypes.h>
+#include <llvm/InstrTypes.h>
+#include <llvm/Instructions.h>
+
+using namespace llvm;
+
+Storage::Storage(llvm::BasicBlock *block, llvm::Value *out,
+                                         llvm::Value *in, llvm::Value *consts)
+   : m_block(block), m_OUT(out),
+     m_IN(in), m_CONST(consts),
+     m_temps(32)
+{
+   m_floatVecType = VectorType::get(Type::FloatTy, 4);
+   m_intVecType   = VectorType::get(IntegerType::get(32), 4);
+
+   m_undefFloatVec = UndefValue::get(m_floatVecType);
+   m_undefIntVec   = UndefValue::get(m_intVecType);
+
+   m_shuffleId = 0;
+}
+
+//can only build vectors with all members in the [0, 9] range
+llvm::Constant *Storage::shuffleMask(int vec)
+{
+   if (m_intVecs.find(vec) != m_intVecs.end()) {
+      return m_intVecs[vec];
+   }
+   int origVec = vec;
+   Constant* const_vec = 0;
+   if (origVec == 0) {
+      const_vec = Constant::getNullValue(m_intVecType);
+   } else {
+      int x = vec / 1000; vec -= x * 1000;
+      int y = vec / 100;  vec -= y * 100;
+      int z = vec / 10;   vec -= z * 10;
+      int w = vec;
+      std::vector<Constant*> elems;
+      elems.push_back(constantInt(x));
+      elems.push_back(constantInt(y));
+      elems.push_back(constantInt(z));
+      elems.push_back(constantInt(w));
+      const_vec = ConstantVector::get(m_intVecType, elems);
+   }
+
+   m_intVecs[origVec] = const_vec;
+   return const_vec;
+}
+
+llvm::ConstantInt *Storage::constantInt(int idx)
+{
+   if (m_constInts.find(idx) != m_constInts.end()) {
+      return m_constInts[idx];
+   }
+   ConstantInt *const_int = ConstantInt::get(APInt(32,  idx));
+   m_constInts[idx] = const_int;
+   return const_int;
+}
+
+llvm::Value *Storage::inputElement(int idx)
+{
+   if (m_inputs.find(idx) != m_inputs.end()) {
+      return m_inputs[idx];
+   }
+   char ptrName[13];
+   char name[9];
+   snprintf(ptrName, 13, "input_ptr%d", idx);
+   snprintf(name, 9, "input%d", idx);
+   GetElementPtrInst *getElem = new GetElementPtrInst(m_IN,
+                                                      constantInt(idx),
+                                                      ptrName,
+                                                      m_block);
+   LoadInst *load = new LoadInst(getElem, name,
+                                 false, m_block);
+   m_inputs[idx] = load;
+   return load;
+}
+
+llvm::Value *Storage::constElement(int idx)
+{
+   if (m_consts.find(idx) != m_consts.end()) {
+      return m_consts[idx];
+   }
+   char ptrName[13];
+   char name[9];
+   snprintf(ptrName, 13, "const_ptr%d", idx);
+   snprintf(name, 9, "const%d", idx);
+   GetElementPtrInst *getElem = new GetElementPtrInst(m_CONST,
+                                                      constantInt(idx),
+                                                      ptrName,
+                                                      m_block);
+   LoadInst *load = new LoadInst(getElem, name,
+                                 false, m_block);
+   m_consts[idx] = load;
+   return load;
+}
+
+llvm::Value *Storage::shuffleVector(llvm::Value *vec, int shuffle)
+{
+   Constant *mask = shuffleMask(shuffle);
+   ++m_shuffleId;
+   char name[11];
+   snprintf(name, 11, "shuffle%d", m_shuffleId);
+   ShuffleVectorInst *res =
+      new ShuffleVectorInst(vec, m_undefFloatVec, mask,
+                            name, m_block);
+   return res;
+}
+
+
+llvm::Value *Storage::tempElement(int idx) const
+{
+   Value *ret = m_temps[idx];
+   if (!ret)
+      return m_undefFloatVec;
+   return ret;
+}
+
+void Storage::setTempElement(int idx, llvm::Value *val)
+{
+   m_temps[idx] = val;
+}
+
+void Storage::store(int dstIdx, llvm::Value *val)
+{
+   char ptrName[13];
+   snprintf(ptrName, 13, "out_ptr%d", dstIdx);
+   GetElementPtrInst *getElem = new GetElementPtrInst(m_OUT,
+                                                      constantInt(dstIdx),
+                                                      ptrName,
+                                                      m_block);
+   new StoreInst(val, getElem, false, m_block);
+}
diff --git a/src/mesa/pipe/llvm/storage.h b/src/mesa/pipe/llvm/storage.h
new file mode 100644 (file)
index 0000000..b69c8d6
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef STORAGE_H
+#define STORAGE_H
+
+#include <map>
+#include <vector>
+
+namespace llvm {
+   class BasicBlock;
+   class Constant;
+   class ConstantInt;
+   class LoadInst;
+   class Value;
+   class VectorType;
+}
+
+class Storage
+{
+   typedef std::map<int, llvm::LoadInst*> LoadMap;
+public:
+   Storage(llvm::BasicBlock *block,
+           llvm::Value *out,
+           llvm::Value *in, llvm::Value *consts);
+
+   llvm::ConstantInt *constantInt(int);
+   llvm::Constant *shuffleMask(int vec);
+   llvm::Value *inputElement(int idx);
+   llvm::Value *constElement(int idx);
+
+   llvm::Value *tempElement(int idx) const;
+   void setTempElement(int idx, llvm::Value *val);
+
+   llvm::Value *shuffleVector(llvm::Value *vec, int shuffle);
+
+
+   void store(int dstIdx, llvm::Value *val);
+private:
+   llvm::BasicBlock *m_block;
+   llvm::Value *m_OUT;
+   llvm::Value *m_IN;
+   llvm::Value *m_CONST;
+
+   std::map<int, llvm::ConstantInt*> m_constInts;
+   std::map<int, llvm::Constant*>    m_intVecs;
+   std::vector<llvm::Value*>         m_temps;
+   LoadMap                           m_inputs;
+   LoadMap                           m_consts;
+
+   llvm::VectorType *m_floatVecType;
+   llvm::VectorType *m_intVecType;
+
+   llvm::Value      *m_undefFloatVec;
+   llvm::Value      *m_undefIntVec;
+
+   int         m_shuffleId;
+};
+
+#endif
diff --git a/src/mesa/pipe/llvm/tgsillvmbuilder.cpp b/src/mesa/pipe/llvm/tgsillvmbuilder.cpp
deleted file mode 100644 (file)
index ca70a46..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-
-#include <map>
-
-class Storage
-{
-   typedef std::map<int, llvm::LoadInst*> LoadMap;
-public:
-   Storage(llvm::BasicBlock *block,
-                       llvm::Value *out,
-                       llvm::Value *in, llvm::Value *consts);
-
-   llvm::ConstantInt *constantInt(int);
-   llvm::Constant *shuffleMask(int vec);
-   llvm::Value *inputElement(int idx);
-   llvm::Value *constElement(int idx);
-
-   llvm::Value *tempElement(int idx) const;
-   void setTempElement(int idx, llvm::Value *val);
-
-   llvm::Value *shuffleVector(llvm::Value *vec, int shuffle);
-
-
-   void store(int dstIdx, llvm::Value *val);
-private:
-   llvm::BasicBlock *m_block;
-   llvm::Value *m_OUT;
-   llvm::Value *m_IN;
-   llvm::Value *m_CONST;
-
-   std::map<int, llvm::ConstantInt*> m_constInts;
-   std::map<int, llvm::Constant*>    m_intVecs;
-   std::vector<llvm::Value*>         m_temps;
-   LoadMap                           m_inputs;
-   LoadMap                           m_consts;
-
-   llvm::VectorType *m_floatVecType;
-   llvm::VectorType *m_intVecType;
-
-   llvm::Value      *m_undefFloatVec;
-   llvm::Value      *m_undefIntVec;
-
-   int         m_shuffleId;
-};
-
-Storage::Storage(llvm::BasicBlock *block, llvm::Value *out,
-                                         llvm::Value *in, llvm::Value *consts)
-   : m_block(block), m_OUT(out),
-     m_IN(in), m_CONST(consts),
-     m_temps(32)
-{
-   m_floatVecType = VectorType::get(Type::FloatTy, 4);
-   m_intVecType   = VectorType::get(IntegerType::get(32), 4);
-
-   m_undefFloatVec = UndefValue::get(m_floatVecType);
-   m_undefIntVec   = UndefValue::get(m_intVecType);
-
-   m_shuffleId = 0;
-}
-
-//can only build vectors with all members in the [0, 9] range
-llvm::Constant *Storage::shuffleMask(int vec)
-{
-   if (m_intVecs.find(vec) != m_intVecs.end()) {
-      return m_intVecs[vec];
-   }
-   int origVec = vec;
-   Constant* const_vec = 0;
-   if (origVec == 0) {
-      const_vec = Constant::getNullValue(m_intVecType);
-   } else {
-      int x = vec / 1000; vec -= x * 1000;
-      int y = vec / 100;  vec -= y * 100;
-      int z = vec / 10;   vec -= z * 10;
-      int w = vec;
-      std::vector<Constant*> elems;
-      elems.push_back(constantInt(x));
-      elems.push_back(constantInt(y));
-      elems.push_back(constantInt(z));
-      elems.push_back(constantInt(w));
-      const_vec = ConstantVector::get(m_intVecType, elems);
-   }
-
-   m_intVecs[origVec] = const_vec;
-   return const_vec;
-}
-
-llvm::ConstantInt *Storage::constantInt(int idx)
-{
-   if (m_constInts.find(idx) != m_constInts.end()) {
-      return m_constInts[idx];
-   }
-   ConstantInt *const_int = ConstantInt::get(APInt(32,  idx));
-   m_constInts[idx] = const_int;
-   return const_int;
-}
-
-llvm::Value *Storage::inputElement(int idx)
-{
-   if (m_inputs.find(idx) != m_inputs.end()) {
-      return m_inputs[idx];
-   }
-   char ptrName[13];
-   char name[9];
-   snprintf(ptrName, 13, "input_ptr%d", idx);
-   snprintf(name, 9, "input%d", idx);
-   GetElementPtrInst *getElem = new GetElementPtrInst(m_IN,
-                                                      constantInt(idx),
-                                                      ptrName,
-                                                      m_block);
-   LoadInst *load = new LoadInst(getElem, name,
-                                 false, m_block);
-   m_inputs[idx] = load;
-   return load;
-}
-
-llvm::Value *Storage::constElement(int idx)
-{
-   if (m_consts.find(idx) != m_consts.end()) {
-      return m_consts[idx];
-   }
-   char ptrName[13];
-   char name[9];
-   snprintf(ptrName, 13, "const_ptr%d", idx);
-   snprintf(name, 9, "const%d", idx);
-   GetElementPtrInst *getElem = new GetElementPtrInst(m_CONST,
-                                                      constantInt(idx),
-                                                      ptrName,
-                                                      m_block);
-   LoadInst *load = new LoadInst(getElem, name,
-                                 false, m_block);
-   m_consts[idx] = load;
-   return load;
-}
-
-llvm::Value *Storage::shuffleVector(llvm::Value *vec, int shuffle)
-{
-   Constant *mask = shuffleMask(shuffle);
-   ++m_shuffleId;
-   char name[11];
-   snprintf(name, 11, "shuffle%d", m_shuffleId);
-   ShuffleVectorInst *res =
-      new ShuffleVectorInst(vec, m_undefFloatVec, mask,
-                            name, m_block);
-   return res;
-}
-
-
-llvm::Value *Storage::tempElement(int idx) const
-{
-   Value *ret = m_temps[idx];
-   if (!ret)
-      return m_undefFloatVec;
-   return ret;
-}
-
-void Storage::setTempElement(int idx, llvm::Value *val)
-{
-   m_temps[idx] = val;
-}
-
-void Storage::store(int dstIdx, llvm::Value *val)
-{
-   char ptrName[13];
-   snprintf(ptrName, 13, "out_ptr%d", dstIdx);
-   GetElementPtrInst *getElem = new GetElementPtrInst(m_OUT,
-                                                      constantInt(dstIdx),
-                                                      ptrName,
-                                                      m_block);
-   new StoreInst(val, getElem, false, m_block);
-}
index 7e1d909e2865e8665556f55d10a0592968b53854..1bc45c981327ef758c046361a662b0189af92ffb 100644 (file)
@@ -192,6 +192,7 @@ TGSIMESA_SOURCES = \
 ifeq ($(MESA_NO_LLVM),0)
   LLVMTGSI_SOURCES = \
        pipe/llvm/llvmtgsi.cpp \
+       pipe/llvm/storage.cpp \
        pipe/llvm/instructions.cpp
 endif