mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 19:40:10 +01:00
llvm ir code to fetch the elements
This commit is contained in:
parent
e20e89e482
commit
cad7bc74d6
2 changed files with 76 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue