[vmkit-commits] [vmkit] r103117 - /vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed May 5 13:33:47 PDT 2010
Author: geoffray
Date: Wed May 5 15:33:47 2010
New Revision: 103117
URL: http://llvm.org/viewvc/llvm-project?rev=103117&view=rev
Log:
Implement correct division wrt to SIGFPE.
Modified:
vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp
Modified: vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp?rev=103117&r1=103116&r2=103117&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp Wed May 5 15:33:47 2010
@@ -1010,10 +1010,27 @@
BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock);
currentBlock = ifTrue;
throwException(intrinsics->ArithmeticExceptionFunction, 0, 0);
- currentBlock = ifFalse;
+ currentBlock = ifFalse;
}
- push(BinaryOperator::CreateSDiv(val1, val2, "", currentBlock),
- false);
+ Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2,
+ intrinsics->constantMinusOne, "");
+ BasicBlock* ifFalse = createBasicBlock("non -1 div");
+ BasicBlock* ifTrue = createBasicBlock("-1 div");
+ BasicBlock* endBlock = createBasicBlock("End division");
+ PHINode* node = PHINode::Create(val1->getType(), "", endBlock);
+ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock);
+ currentBlock = ifTrue;
+ node->addIncoming(BinaryOperator::CreateSub(intrinsics->constantZero,
+ val1, "", currentBlock),
+ currentBlock);
+ BranchInst::Create(endBlock, currentBlock);
+ currentBlock = ifFalse;
+ node->addIncoming(
+ BinaryOperator::CreateSDiv(val1, val2, "", currentBlock),
+ currentBlock);
+ BranchInst::Create(endBlock, currentBlock);
+ currentBlock = endBlock;
+ push(node, false);
break;
}
@@ -1061,8 +1078,31 @@
case IREM : {
Value* val2 = popAsInt();
Value* val1 = popAsInt();
- push(BinaryOperator::CreateSRem(val1, val2, "", currentBlock),
- false);
+ if (TheCompiler->hasExceptionsEnabled()) {
+ Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2,
+ intrinsics->constantZero, "");
+ BasicBlock* ifFalse = createBasicBlock("non null rem");
+ BasicBlock* ifTrue = createBasicBlock("null rem");
+
+ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock);
+ currentBlock = ifTrue;
+ throwException(intrinsics->ArithmeticExceptionFunction, 0, 0);
+ currentBlock = ifFalse;
+ }
+ Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2,
+ intrinsics->constantMinusOne, "");
+ BasicBlock* ifFalse = createBasicBlock("non -1 rem");
+ BasicBlock* endBlock = createBasicBlock("end block");
+ PHINode* node = PHINode::Create(val1->getType(), "", endBlock);
+ node->addIncoming(intrinsics->constantZero, currentBlock);
+ BranchInst::Create(endBlock, ifFalse, cmp, currentBlock);
+ currentBlock = ifFalse;
+ node->addIncoming(
+ BinaryOperator::CreateSRem(val1, val2, "", currentBlock),
+ currentBlock);
+ BranchInst::Create(endBlock, currentBlock);
+ currentBlock = endBlock;
+ push(node, false);
break;
}
@@ -1071,6 +1111,17 @@
llvm::Value* val2 = pop();
pop();
llvm::Value* val1 = pop();
+ if (TheCompiler->hasExceptionsEnabled()) {
+ Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2,
+ intrinsics->constantLongZero, "");
+ BasicBlock* ifFalse = createBasicBlock("non null div");
+ BasicBlock* ifTrue = createBasicBlock("null div");
+
+ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock);
+ currentBlock = ifTrue;
+ throwException(intrinsics->ArithmeticExceptionFunction, 0, 0);
+ currentBlock = ifFalse;
+ }
push(BinaryOperator::CreateSRem(val1, val2, "", currentBlock),
false);
push(intrinsics->constantZero, false);
More information about the vmkit-commits
mailing list