diff options
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/Execution.cpp')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Execution.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index 6254293ad7..b9f8030a46 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -260,6 +260,33 @@ Annotation *GlobalAddress::Create(AnnotationID AID, const Annotable *O, void *){ //===----------------------------------------------------------------------===// +// Unary Instruction Implementations +//===----------------------------------------------------------------------===// + +#define IMPLEMENT_UNARY_OPERATOR(OP, TY) \ + case Type::TY##TyID: Dest.TY##Val = OP Src.TY##Val; break + +static void executeNotInst(UnaryOperator *I, ExecutionContext &SF) { + const Type *Ty = I->getOperand(0)->getType(); + GenericValue Src = getOperandValue(I->getOperand(0), SF); + GenericValue Dest; + switch (Ty->getPrimitiveID()) { + IMPLEMENT_UNARY_OPERATOR(~, UByte); + IMPLEMENT_UNARY_OPERATOR(~, SByte); + IMPLEMENT_UNARY_OPERATOR(~, UShort); + IMPLEMENT_UNARY_OPERATOR(~, Short); + IMPLEMENT_UNARY_OPERATOR(~, UInt); + IMPLEMENT_UNARY_OPERATOR(~, Int); + IMPLEMENT_UNARY_OPERATOR(~, ULong); + IMPLEMENT_UNARY_OPERATOR(~, Long); + IMPLEMENT_UNARY_OPERATOR(~, Pointer); + default: + cout << "Unhandled type for Not instruction: " << Ty << "\n"; + } + SetValue(I, Dest, SF); +} + +//===----------------------------------------------------------------------===// // Binary Instruction Implementations //===----------------------------------------------------------------------===// @@ -1152,6 +1179,7 @@ bool Interpreter::executeInstruction() { executeBinaryInst(cast<BinaryOperator>(I), SF); } else { switch (I->getOpcode()) { + case Instruction::Not: executeNotInst(cast<UnaryOperator>(I),SF); break; // Terminators case Instruction::Ret: executeRetInst (cast<ReturnInst>(I), SF); break; case Instruction::Br: executeBrInst (cast<BranchInst>(I), SF); break; |