diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-11-01 03:41:05 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-11-01 03:41:05 +0000 |
commit | fe85526713ec54e5ab130d6bc1626458bd22115e (patch) | |
tree | 849b477b11ee6b46c8df2acfd8562399d54ecd92 | |
parent | 1d08d83230338ca5969ff6ae6737a978336538bf (diff) | |
download | external_llvm-fe85526713ec54e5ab130d6bc1626458bd22115e.zip external_llvm-fe85526713ec54e5ab130d6bc1626458bd22115e.tar.gz external_llvm-fe85526713ec54e5ab130d6bc1626458bd22115e.tar.bz2 |
Fix a bug in the interpreter where divides of unmatched signed operands
would fail. E.g. udiv sint X, Y or sdiv uint X, Y would fail to find a
type match in the switch statement and fail the operation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31338 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Execution.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index 41f0750..c10dbbd 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -254,16 +254,19 @@ static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2, return Dest; } +#define IMPLEMENT_SIGNLESS_BINOP(OP, TY1, TY2) \ + case Type::TY2##TyID: IMPLEMENT_BINARY_OPERATOR(OP, TY1) + static GenericValue executeUDivInst(GenericValue Src1, GenericValue Src2, const Type *Ty) { GenericValue Dest; if (Ty->isSigned()) Ty = Ty->getUnsignedVersion(); switch (Ty->getTypeID()) { - IMPLEMENT_BINARY_OPERATOR(/, UByte); - IMPLEMENT_BINARY_OPERATOR(/, UShort); - IMPLEMENT_BINARY_OPERATOR(/, UInt); - IMPLEMENT_BINARY_OPERATOR(/, ULong); + IMPLEMENT_SIGNLESS_BINOP(/, UByte, SByte); + IMPLEMENT_SIGNLESS_BINOP(/, UShort, Short); + IMPLEMENT_SIGNLESS_BINOP(/, UInt, Int); + IMPLEMENT_SIGNLESS_BINOP(/, ULong, Long); default: std::cout << "Unhandled type for UDiv instruction: " << *Ty << "\n"; abort(); @@ -277,10 +280,10 @@ static GenericValue executeSDivInst(GenericValue Src1, GenericValue Src2, if (Ty->isUnsigned()) Ty = Ty->getSignedVersion(); switch (Ty->getTypeID()) { - IMPLEMENT_BINARY_OPERATOR(/, SByte); - IMPLEMENT_BINARY_OPERATOR(/, Short); - IMPLEMENT_BINARY_OPERATOR(/, Int); - IMPLEMENT_BINARY_OPERATOR(/, Long); + IMPLEMENT_SIGNLESS_BINOP(/, SByte, UByte); + IMPLEMENT_SIGNLESS_BINOP(/, Short, UShort); + IMPLEMENT_SIGNLESS_BINOP(/, Int, UInt); + IMPLEMENT_SIGNLESS_BINOP(/, Long, ULong); default: std::cout << "Unhandled type for SDiv instruction: " << *Ty << "\n"; abort(); |