Implement else ops.
authorZack Rusin <zack@tungstengraphics.com>
Thu, 25 Oct 2007 11:18:01 +0000 (07:18 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Thu, 25 Oct 2007 13:04:41 +0000 (09:04 -0400)
src/mesa/pipe/llvm/instructions.cpp
src/mesa/pipe/llvm/instructions.h
src/mesa/pipe/llvm/llvmtgsi.cpp

index 622d420f64dcb4526e580dab1f8c28a83899cc3f..a0645c58045b4ef70d0867ea3eaa89df92a95b31 100644 (file)
@@ -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());
index 8b47accd15b2bf0d79618f6f0c368f731e79f7a1..b0608e1da6b0247a47300efe9ad52049052b8e4e 100644 (file)
@@ -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);
index 93dd2ea46a9d67717c83e2fd7e796a8e3cf134d6..6ff4bc227082f39efd1db48e545b74f408694eb7 100644 (file)
@@ -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();