Add support to LLI for switch instruction
authorChris Lattner <sabre@nondot.org>
Tue, 22 Apr 2003 20:34:47 +0000 (20:34 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 22 Apr 2003 20:34:47 +0000 (20:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5851 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Interpreter/Execution.cpp

index ff62ac849655b70a1ac0f516113b85741687f949..6b872fbc10eab497767631e5eac15a1130866a7f 100644 (file)
@@ -635,6 +635,27 @@ void Interpreter::executeBrInst(BranchInst &I, ExecutionContext &SF) {
   SF.CurInst = SF.CurBB->begin();     // Update new instruction ptr...
 }
 
+static void executeSwitch(SwitchInst &I, ExecutionContext &SF) {
+  GenericValue CondVal = getOperandValue(I.getOperand(0), SF);
+  const Type *ElTy = I.getOperand(0)->getType();
+  SF.PrevBB = SF.CurBB;               // Update PrevBB so that PHI nodes work...
+  BasicBlock *Dest = 0;
+
+  // Check to see if any of the cases match...
+  for (unsigned i = 2, e = I.getNumOperands(); i != e; i += 2) {
+    if (executeSetEQInst(CondVal,
+                         getOperandValue(I.getOperand(i), SF),ElTy,SF).BoolVal){
+      Dest = cast<BasicBlock>(I.getOperand(i+1));
+      break;
+    }
+  }
+  
+  if (!Dest) Dest = I.getDefaultDest();   // No cases matched: use default
+  SF.CurBB = Dest;                        // Update CurBB to branch destination
+  SF.CurInst = SF.CurBB->begin();         // Update new instruction ptr...
+}
+
+
 //===----------------------------------------------------------------------===//
 //                     Memory Instruction Implementations
 //===----------------------------------------------------------------------===//
@@ -1106,6 +1127,7 @@ bool Interpreter::executeInstruction() {
       // Terminators
     case Instruction::Ret:     executeRetInst  (cast<ReturnInst>(I), SF); break;
     case Instruction::Br:      executeBrInst   (cast<BranchInst>(I), SF); break;
+    case Instruction::Switch:  executeSwitch   (cast<SwitchInst>(I), SF); break;
       // Memory Instructions
     case Instruction::Alloca:
     case Instruction::Malloc:  executeAllocInst((AllocationInst&)I, SF); break;