summaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-11-01 03:41:05 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-11-01 03:41:05 +0000
commitfe85526713ec54e5ab130d6bc1626458bd22115e (patch)
tree849b477b11ee6b46c8df2acfd8562399d54ecd92 /lib/ExecutionEngine
parent1d08d83230338ca5969ff6ae6737a978336538bf (diff)
downloadllvm-fe85526713ec54e5ab130d6bc1626458bd22115e.tar.gz
llvm-fe85526713ec54e5ab130d6bc1626458bd22115e.tar.bz2
llvm-fe85526713ec54e5ab130d6bc1626458bd22115e.tar.xz
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
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r--lib/ExecutionEngine/Interpreter/Execution.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp
index 41f07507d4..c10dbbd123 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();