From b0f80693434cb203f63d8fbab56c1522000ed88f Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Wed, 17 Oct 2007 11:28:26 -0400 Subject: Refactor the tgsi->llvm storage translator --- src/mesa/pipe/llvm/llvmtgsi.cpp | 5 +- src/mesa/pipe/llvm/storage.cpp | 140 +++++++++++++++++++++++++++ src/mesa/pipe/llvm/storage.h | 57 +++++++++++ src/mesa/pipe/llvm/tgsillvmbuilder.cpp | 170 --------------------------------- src/mesa/sources | 1 + 5 files changed, 201 insertions(+), 172 deletions(-) create mode 100644 src/mesa/pipe/llvm/storage.cpp create mode 100644 src/mesa/pipe/llvm/storage.h delete mode 100644 src/mesa/pipe/llvm/tgsillvmbuilder.cpp diff --git a/src/mesa/pipe/llvm/llvmtgsi.cpp b/src/mesa/pipe/llvm/llvmtgsi.cpp index 5cbd0ae89ff..c6cf2de4fc2 100644 --- a/src/mesa/pipe/llvm/llvmtgsi.cpp +++ b/src/mesa/pipe/llvm/llvmtgsi.cpp @@ -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" @@ -30,10 +33,8 @@ #include #include -#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 index 00000000000..c6e86ea4b43 --- /dev/null +++ b/src/mesa/pipe/llvm/storage.cpp @@ -0,0 +1,140 @@ +#include "storage.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +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 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 index 00000000000..b69c8d614e9 --- /dev/null +++ b/src/mesa/pipe/llvm/storage.h @@ -0,0 +1,57 @@ +#ifndef STORAGE_H +#define STORAGE_H + +#include +#include + +namespace llvm { + class BasicBlock; + class Constant; + class ConstantInt; + class LoadInst; + class Value; + class VectorType; +} + +class Storage +{ + typedef std::map 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 m_constInts; + std::map m_intVecs; + std::vector 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 index ca70a46648c..00000000000 --- a/src/mesa/pipe/llvm/tgsillvmbuilder.cpp +++ /dev/null @@ -1,170 +0,0 @@ - -#include - -class Storage -{ - typedef std::map 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 m_constInts; - std::map m_intVecs; - std::vector 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 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/sources b/src/mesa/sources index 7e1d909e286..1bc45c98132 100644 --- a/src/mesa/sources +++ b/src/mesa/sources @@ -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 -- cgit v1.2.3