aboutsummaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine/Interpreter/Execution.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/Execution.cpp')
-rw-r--r--lib/ExecutionEngine/Interpreter/Execution.cpp28
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;