Add support to LLI for switch instruction

llvm-svn: 5851
This commit is contained in:
Chris Lattner 2003-04-22 20:34:47 +00:00
parent 62fa743e75
commit d215af03a3
1 changed files with 22 additions and 0 deletions

View File

@ -635,6 +635,27 @@ void Interpreter::executeBrInst(BranchInst &I, ExecutionContext &SF) {
SF.CurInst = SF.CurBB->begin(); // Update new instruction ptr... 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 // Memory Instruction Implementations
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -1106,6 +1127,7 @@ bool Interpreter::executeInstruction() {
// Terminators // Terminators
case Instruction::Ret: executeRetInst (cast<ReturnInst>(I), SF); break; case Instruction::Ret: executeRetInst (cast<ReturnInst>(I), SF); break;
case Instruction::Br: executeBrInst (cast<BranchInst>(I), SF); break; case Instruction::Br: executeBrInst (cast<BranchInst>(I), SF); break;
case Instruction::Switch: executeSwitch (cast<SwitchInst>(I), SF); break;
// Memory Instructions // Memory Instructions
case Instruction::Alloca: case Instruction::Alloca:
case Instruction::Malloc: executeAllocInst((AllocationInst&)I, SF); break; case Instruction::Malloc: executeAllocInst((AllocationInst&)I, SF); break;