Make branching work :) Simply allow output variables as valid

operand inputs when they've been assigned already.
This commit is contained in:
Zack Rusin 2007-10-24 19:26:09 -04:00
parent 1c5fec714d
commit 5022ee43fc
3 changed files with 31 additions and 2 deletions

View file

@ -195,8 +195,8 @@ translate_instruction(llvm::Module *module,
val = storage->inputElement(src->SrcRegister.Index, indIdx);
} else if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) {
val = storage->tempElement(src->SrcRegister.Index);
} else if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) {
fprintf(stderr, "FIXME: do somethign with immediates?\n");
} else if (src->SrcRegister.File == TGSI_FILE_OUTPUT) {
val = storage->outputElement(src->SrcRegister.Index, indIdx);
} else {
fprintf(stderr, "ERROR: not supported llvm source %d\n", src->SrcRegister.File);
return;

View file

@ -310,3 +310,31 @@ void Storage::declareTemp(int idx)
{
m_temps[idx] = new AllocaInst(m_floatVecType, name("temp"), m_block);
}
llvm::Value * Storage::outputElement(int idx, llvm::Value *indIdx )
{
GetElementPtrInst *getElem = 0;
if (indIdx) {
getElem = new GetElementPtrInst(m_IN,
BinaryOperator::create(Instruction::Add,
indIdx,
constantInt(idx),
name("add"),
m_block),
name("output_ptr"),
m_block);
} else {
getElem = new GetElementPtrInst(m_IN,
constantInt(idx),
name("output_ptr"),
m_block);
}
LoadInst *load = new LoadInst(getElem, name("output"),
false, m_block);
load->setAlignment(8);
m_inputs[idx] = load;
return load;
}

View file

@ -59,6 +59,7 @@ public:
llvm::Constant *shuffleMask(int vec);
llvm::Value *inputElement(int idx, llvm::Value *indIdx =0);
llvm::Value *constElement(int idx, llvm::Value *indIdx =0);
llvm::Value *outputElement(int idx, llvm::Value *indIdx =0);
llvm::Value *tempElement(int idx);
void setTempElement(int idx, llvm::Value *val, int mask);