summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/llvm/llvmtgsi.cpp
diff options
context:
space:
mode:
authorZack Rusin <zack@tungstengraphics.com>2007-10-24 07:49:24 -0400
committerZack Rusin <zack@tungstengraphics.com>2007-10-24 11:21:05 -0400
commit5040eefbb758fb0e02125ad3a6bfb3dba13cb7fa (patch)
treec41eadb25f4ac6cd5ac0edd3f7abdd3ac1239ba0 /src/mesa/pipe/llvm/llvmtgsi.cpp
parentba823b3ded1b6ec47b8a0e26ed08a229fe1a9140 (diff)
Implement arl, lerp opcodes and do a first stab at if/endif
handling and branching support.
Diffstat (limited to 'src/mesa/pipe/llvm/llvmtgsi.cpp')
-rw-r--r--src/mesa/pipe/llvm/llvmtgsi.cpp51
1 files changed, 41 insertions, 10 deletions
diff --git a/src/mesa/pipe/llvm/llvmtgsi.cpp b/src/mesa/pipe/llvm/llvmtgsi.cpp
index 8983f16297..ade4573fb8 100644
--- a/src/mesa/pipe/llvm/llvmtgsi.cpp
+++ b/src/mesa/pipe/llvm/llvmtgsi.cpp
@@ -146,10 +146,16 @@ translate_instruction(llvm::Module *module,
for (int i = 0; i < inst->Instruction.NumSrcRegs; ++i) {
struct tgsi_full_src_register *src = &inst->FullSrcRegisters[i];
llvm::Value *val = 0;
+ llvm::Value *indIdx = 0;
+
+ if (src->SrcRegister.Indirect) {
+ indIdx = storage->addrElement(src->SrcRegisterInd.Index);
+ indIdx = storage->extractIndex(indIdx);
+ }
if (src->SrcRegister.File == TGSI_FILE_CONSTANT) {
- val = storage->constElement(src->SrcRegister.Index);
+ val = storage->constElement(src->SrcRegister.Index, indIdx);
} else if (src->SrcRegister.File == TGSI_FILE_INPUT) {
- val = storage->inputElement(src->SrcRegister.Index);
+ val = storage->inputElement(src->SrcRegister.Index, indIdx);
} else if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) {
val = storage->tempElement(src->SrcRegister.Index);
} else {
@@ -204,7 +210,9 @@ translate_instruction(llvm::Module *module,
instr->printVector(inputs[1]);*/
llvm::Value *out = 0;
switch (inst->Instruction.Opcode) {
- case TGSI_OPCODE_ARL:
+ case TGSI_OPCODE_ARL: {
+ out = instr->arl(inputs[0]);
+ }
break;
case TGSI_OPCODE_MOV: {
out = inputs[0];
@@ -270,7 +278,9 @@ translate_instruction(llvm::Module *module,
out = instr->sub(inputs[0], inputs[1]);
}
break;
- case TGSI_OPCODE_LERP:
+ case TGSI_OPCODE_LERP: {
+ out = instr->lerp(inputs[0], inputs[1], inputs[2]);
+ }
break;
case TGSI_OPCODE_CND:
break;
@@ -344,7 +354,9 @@ translate_instruction(llvm::Module *module,
break;
case TGSI_OPCODE_SFL:
break;
- case TGSI_OPCODE_SGT:
+ case TGSI_OPCODE_SGT: {
+ out = instr->sgt(inputs[0], inputs[1]);
+ }
break;
case TGSI_OPCODE_SIN:
break;
@@ -398,7 +410,11 @@ translate_instruction(llvm::Module *module,
break;
case TGSI_OPCODE_BRK:
break;
- case TGSI_OPCODE_IF:
+ case TGSI_OPCODE_IF: {
+ instr->ifop(inputs[0]);
+ storage->setCurrentBlock(instr->currentBlock());
+ return; //just update the state
+ }
break;
case TGSI_OPCODE_LOOP:
break;
@@ -406,7 +422,12 @@ translate_instruction(llvm::Module *module,
break;
case TGSI_OPCODE_ELSE:
break;
- case TGSI_OPCODE_ENDIF:
+ case TGSI_OPCODE_ENDIF: {
+ instr->endif();
+ storage->setCurrentBlock(instr->currentBlock());
+ storage->popPhiNode();
+ return; //just update the state
+ }
break;
case TGSI_OPCODE_ENDLOOP:
break;
@@ -554,8 +575,11 @@ translate_instruction(llvm::Module *module,
storage->store(dst->DstRegister.Index, out, dst->DstRegister.WriteMask);
} else if (dst->DstRegister.File == TGSI_FILE_TEMPORARY) {
storage->setTempElement(dst->DstRegister.Index, out, dst->DstRegister.WriteMask);
+ } else if (dst->DstRegister.File == TGSI_FILE_ADDRESS) {
+ storage->setAddrElement(dst->DstRegister.Index, out, dst->DstRegister.WriteMask);
} else {
fprintf(stderr, "ERROR: unsupported LLVM destination!");
+ assert(!"wrong destination");
}
}
}
@@ -617,7 +641,7 @@ tgsi_to_llvm(struct ga_llvm_prog *prog, const struct tgsi_token *tokens)
}
}
- new ReturnInst(label_entry);
+ new ReturnInst(instr.currentBlock());
tgsi_parse_free(&parse);
@@ -635,7 +659,8 @@ ga_llvm_from_tgsi(struct pipe_context *pipe, const struct tgsi_token *tokens)
ga_llvm->id = GLOBAL_ID;
tgsi_dump(tokens, 0);
llvm::Module *mod = tgsi_to_llvm(ga_llvm, tokens);
-
+ ga_llvm->module = mod;
+ ga_llvm_prog_dump(ga_llvm, 0);
/* Run optimization passes over it */
PassManager passes;
passes.add(new TargetData(mod));
@@ -715,8 +740,14 @@ void ga_llvm_prog_dump(struct ga_llvm_prog *prog, const char *file_prefix)
out << (*mod);
out.close();
} else {
+ std::ostringstream stream;
+ stream << "execute_shader";
+ stream << prog->id;
+ std::string func_name = stream.str();
+ llvm::Function *func = mod->getFunction(func_name.c_str());
+ assert(func);
std::cout<<"; ---------- Start shader "<<prog->id<<std::endl;
- std::cout<<*mod<<std::endl;
+ std::cout<<*func<<std::endl;
std::cout<<"; ---------- End shader "<<prog->id<<std::endl;
}
}