Implement xor operator


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1050 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp
index d7a60c7..069f2f2 100644
--- a/lib/ExecutionEngine/Interpreter/Execution.cpp
+++ b/lib/ExecutionEngine/Interpreter/Execution.cpp
@@ -332,6 +332,26 @@
   return Dest;
 }
 
+static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2, 
+				   const Type *Ty, ExecutionContext &SF) {
+  GenericValue Dest;
+  switch (Ty->getPrimitiveID()) {
+    IMPLEMENT_BINARY_OPERATOR(^, UByte);
+    IMPLEMENT_BINARY_OPERATOR(^, SByte);
+    IMPLEMENT_BINARY_OPERATOR(^, UShort);
+    IMPLEMENT_BINARY_OPERATOR(^, Short);
+    IMPLEMENT_BINARY_OPERATOR(^, UInt);
+    IMPLEMENT_BINARY_OPERATOR(^, Int);
+    IMPLEMENT_BINARY_OPERATOR(^, ULong);
+    IMPLEMENT_BINARY_OPERATOR(^, Long);
+    IMPLEMENT_BINARY_OPERATOR(^, Pointer);
+  default:
+    cout << "Unhandled type for Xor instruction: " << Ty << endl;
+  }
+  return Dest;
+}
+
+
 #define IMPLEMENT_SETCC(OP, TY) \
    case Type::TY##TyID: Dest.BoolVal = Src1.TY##Val OP Src2.TY##Val; break
 
@@ -473,6 +493,7 @@
   case Instruction::Mul:   R = executeMulInst  (Src1, Src2, Ty, SF); break;
   case Instruction::Div:   R = executeDivInst  (Src1, Src2, Ty, SF); break;
   case Instruction::Rem:   R = executeRemInst  (Src1, Src2, Ty, SF); break;
+  case Instruction::Xor:   R = executeXorInst  (Src1, Src2, Ty, SF); break;
   case Instruction::SetEQ: R = executeSetEQInst(Src1, Src2, Ty, SF); break;
   case Instruction::SetNE: R = executeSetNEInst(Src1, Src2, Ty, SF); break;
   case Instruction::SetLE: R = executeSetLEInst(Src1, Src2, Ty, SF); break;
@@ -481,6 +502,7 @@
   case Instruction::SetGT: R = executeSetGTInst(Src1, Src2, Ty, SF); break;
   default:
     cout << "Don't know how to handle this binary operator!\n-->" << I;
+    R = Src1;
   }
 
   SetValue(I, R, SF);