From: Zack Rusin Date: Thu, 25 Oct 2007 11:18:01 +0000 (-0400) Subject: Implement else ops. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7073ef96824242669735a8681519e1a0cee14309;p=mesa.git Implement else ops. --- diff --git a/src/mesa/pipe/llvm/instructions.cpp b/src/mesa/pipe/llvm/instructions.cpp index 622d420f64d..a0645c58045 100644 --- a/src/mesa/pipe/llvm/instructions.cpp +++ b/src/mesa/pipe/llvm/instructions.cpp @@ -956,7 +956,7 @@ Function* makeLitFunction(Module *mod) { void Instructions::ifop(llvm::Value *in) { BasicBlock *ifthen = new BasicBlock(name("ifthen"), m_func,0); - BasicBlock *ifend = new BasicBlock(name("ifend"), m_func,0); + BasicBlock *ifend = new BasicBlock(name("ifthenend"), m_func,0); //BasicBlock *yblock = new BasicBlock(name("yblock"), m_func,0); //BasicBlock *zblock = new BasicBlock(name("zblock"), m_func,0); @@ -981,6 +981,17 @@ llvm::BasicBlock * Instructions::currentBlock() const return m_block; } +void Instructions::elseop() +{ + assert(!m_ifStack.empty()); + BasicBlock *ifend = new BasicBlock(name("ifend"), m_func,0); + new BranchInst(ifend, m_block); + m_block = m_ifStack.top(); + m_block->setName(name("ifelse")); + m_ifStack.pop(); + m_ifStack.push(ifend); +} + void Instructions::endif() { assert(!m_ifStack.empty()); diff --git a/src/mesa/pipe/llvm/instructions.h b/src/mesa/pipe/llvm/instructions.h index 8b47accd15b..b0608e1da6b 100644 --- a/src/mesa/pipe/llvm/instructions.h +++ b/src/mesa/pipe/llvm/instructions.h @@ -60,6 +60,7 @@ public: llvm::Value *dph(llvm::Value *in1, llvm::Value *in2); llvm::Value *dst(llvm::Value *in1, llvm::Value *in2); void endif(); + void elseop(); llvm::Value *ex2(llvm::Value *in); llvm::Value *floor(llvm::Value *in); llvm::Value *frc(llvm::Value *in); diff --git a/src/mesa/pipe/llvm/llvmtgsi.cpp b/src/mesa/pipe/llvm/llvmtgsi.cpp index 93dd2ea46a9..6ff4bc22708 100644 --- a/src/mesa/pipe/llvm/llvmtgsi.cpp +++ b/src/mesa/pipe/llvm/llvmtgsi.cpp @@ -459,7 +459,11 @@ translate_instruction(llvm::Module *module, break; case TGSI_OPCODE_REP: break; - case TGSI_OPCODE_ELSE: + case TGSI_OPCODE_ELSE: { + instr->elseop(); + storage->setCurrentBlock(instr->currentBlock()); + return; //only state update + } break; case TGSI_OPCODE_ENDIF: { instr->endif();