#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, int mask); llvm::Value *shuffleVector(llvm::Value *vec, int shuffle); void store(int dstIdx, llvm::Value *val, int mask); int numConsts() const; private: llvm::Value *maskWrite(llvm::Value *src, int mask, llvm::Value *templ); const char *name(const char *prefix); 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; std::vector m_dstCache; 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; char m_name[32]; int m_idx; int m_numConsts; }; #endif