Changes in directory llvm/lib/ExecutionEngine/Interpreter:
Execution.cpp updated: 1.139.6.5 -> 1.139.6.6 --- Log message: --- Diffs of the changes: (+51 -14) Execution.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 51 insertions(+), 14 deletions(-) Index: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp diff -u llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.139.6.5 llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.139.6.6 --- llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.139.6.5 Wed Oct 25 20:58:05 2006 +++ llvm/lib/ExecutionEngine/Interpreter/Execution.cpp Sun Oct 29 01:35:49 2006 @@ -40,7 +40,11 @@ const Type *Ty); static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2, const Type *Ty); -static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2, +static GenericValue executeURemInst(GenericValue Src1, GenericValue Src2, + const Type *Ty); +static GenericValue executeSRemInst(GenericValue Src1, GenericValue Src2, + const Type *Ty); +static GenericValue executeFRemInst(GenericValue Src1, GenericValue Src2, const Type *Ty); static GenericValue executeUDivInst(GenericValue Src1, GenericValue Src2, const Type *Ty); @@ -106,10 +110,17 @@ getOperandValue(CE->getOperand(1), SF), CE->getOperand(0)->getType()); case Instruction::URem: + return executeURemInst(getOperandValue(CE->getOperand(0), SF), + getOperandValue(CE->getOperand(1), SF), + CE->getOperand(0)->getType()); case Instruction::SRem: - return executeRemInst(getOperandValue(CE->getOperand(0), SF), - getOperandValue(CE->getOperand(1), SF), - CE->getOperand(0)->getType()); + return executeSRemInst(getOperandValue(CE->getOperand(0), SF), + getOperandValue(CE->getOperand(1), SF), + CE->getOperand(0)->getType()); + case Instruction::FRem: + return executeFRemInst(getOperandValue(CE->getOperand(0), SF), + getOperandValue(CE->getOperand(1), SF), + CE->getOperand(0)->getType()); case Instruction::And: return executeAndInst(getOperandValue(CE->getOperand(0), SF), getOperandValue(CE->getOperand(1), SF), @@ -296,24 +307,50 @@ IMPLEMENT_BINARY_OPERATOR(/, Float); IMPLEMENT_BINARY_OPERATOR(/, Double); default: - std::cout << "Unhandled type for Div instruction: " << *Ty << "\n"; + std::cout << "Unhandled type for FDiv instruction: " << *Ty << "\n"; abort(); } return Dest; } -static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2, - const Type *Ty) { +static GenericValue executeURemInst(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(%, SByte); IMPLEMENT_BINARY_OPERATOR(%, UShort); - IMPLEMENT_BINARY_OPERATOR(%, Short); IMPLEMENT_BINARY_OPERATOR(%, UInt); - IMPLEMENT_BINARY_OPERATOR(%, Int); IMPLEMENT_BINARY_OPERATOR(%, ULong); + default: + std::cout << "Unhandled type for URem instruction: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeSRemInst(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + 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); + default: + std::cout << "Unhandled type for SRem instruction: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeFRemInst(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { case Type::FloatTyID: Dest.FloatVal = fmod(Src1.FloatVal, Src2.FloatVal); break; @@ -321,7 +358,7 @@ Dest.DoubleVal = fmod(Src1.DoubleVal, Src2.DoubleVal); break; default: - std::cout << "Unhandled type for Rem instruction: " << *Ty << "\n"; + std::cout << "Unhandled type for FRem instruction: " << *Ty << "\n"; abort(); } return Dest; @@ -543,9 +580,9 @@ case Instruction::Add: R = executeAddInst (Src1, Src2, Ty); break; case Instruction::Sub: R = executeSubInst (Src1, Src2, Ty); break; case Instruction::Mul: R = executeMulInst (Src1, Src2, Ty); break; - case Instruction::URem: - case Instruction::SRem: - case Instruction::FRem: R = executeRemInst (Src1, Src2, Ty); break; + case Instruction::URem: R = executeURemInst (Src1, Src2, Ty); break; + case Instruction::SRem: R = executeSRemInst (Src1, Src2, Ty); break; + case Instruction::FRem: R = executeFRemInst (Src1, Src2, Ty); break; case Instruction::UDiv: R = executeUDivInst (Src1, Src2, Ty); break; case Instruction::SDiv: R = executeSDivInst (Src1, Src2, Ty); break; case Instruction::FDiv: R = executeFDivInst (Src1, Src2, Ty); break; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits