Implement xor operator
authorChris Lattner <sabre@nondot.org>
Tue, 30 Oct 2001 20:54:36 +0000 (20:54 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 30 Oct 2001 20:54:36 +0000 (20:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1050 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Interpreter/Execution.cpp

index d7a60c7311cb456a76e8dd1bf293e32eb868b052..069f2f210ce85d9c43daf9d8eedc9eae637c5446 100644 (file)
@@ -332,6 +332,26 @@ static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2,
   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 @@ static void executeBinaryInst(BinaryOperator *I, ExecutionContext &SF) {
   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 @@ static void executeBinaryInst(BinaryOperator *I, ExecutionContext &SF) {
   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);