[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