Implement the NOT operator.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2455 91177308-0d34-0410-b5e6-96231b3b80d8
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 @@
 
 
 //===----------------------------------------------------------------------===//
+//                      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 @@
     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;