aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-05-03 19:52:30 +0000
committerChris Lattner <sabre@nondot.org>2002-05-03 19:52:30 +0000
commit2adcd83b89d1eb38c7118861454b528d5812aad0 (patch)
treec30b122015a7e045415323ea39f0568b25db1765
parent966112323faca55aeeaed7826294618504b2966a (diff)
downloadexternal_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.cpp28
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;