diff options
author | Chris Lattner <sabre@nondot.org> | 2002-05-03 19:52:30 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-05-03 19:52:30 +0000 |
commit | 2adcd83b89d1eb38c7118861454b528d5812aad0 (patch) | |
tree | c30b122015a7e045415323ea39f0568b25db1765 | |
parent | 966112323faca55aeeaed7826294618504b2966a (diff) | |
download | external_llvm-2adcd83b89d1eb38c7118861454b528d5812aad0.zip external_llvm-2adcd83b89d1eb38c7118861454b528d5812aad0.tar.gz external_llvm-2adcd83b89d1eb38c7118861454b528d5812aad0.tar.bz2 |
Implement the NOT operator.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2455 91177308-0d34-0410-b5e6-96231b3b80d8
-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 6254293..b9f8030 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; |