You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/01/31 13:54:35 UTC

svn commit: r501830 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src: codegenerator/ia32/Ia32IRManager.cpp codegenerator/ia32/Ia32InstCodeSelector.cpp translator/java/JavaByteCodeTranslator.cpp

Author: varlax
Date: Wed Jan 31 04:54:34 2007
New Revision: 501830

URL: http://svn.apache.org/viewvc?view=rev&rev=501830
Log:
Applied HARMONY-3063 [drlvm][jit] ArrayCopyRepMove does not work on EM64T
Tested on SUSE9@x64

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp?view=diff&rev=501830&r1=501829&r2=501830
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp Wed Jan 31 04:54:34 2007
@@ -1752,9 +1752,9 @@
                         } else if (inst->getMnemonic() == Mnemonic_POP) {
                             stackDepth-=getByteSize(inst->getOpnd(it)->getSize());
                         } else if (inst->getMnemonic() == Mnemonic_PUSHFD) {
-                            stackDepth+=4;
+                            stackDepth+=sizeof(POINTER_SIZE_INT);
                         } else if (inst->getMnemonic() == Mnemonic_POPFD) {
-                            stackDepth-=4;
+                            stackDepth-=sizeof(POINTER_SIZE_INT);
                         } else if (inst->getMnemonic() == Mnemonic_CALL && ((CallInst *)inst)->getCallingConventionClient().getCallingConvention()->calleeRestoresStack()) {
                             stackDepth -= ((CallInst *)inst)->getArgStackDepth();
                         }

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp?view=diff&rev=501830&r1=501829&r2=501830
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Wed Jan 31 04:54:34 2007
@@ -1817,9 +1817,6 @@
     Type * elemType=arrayType->getElementType();
     Type * dstType=irManager.getManagedPtrType(elemType);
 
-    uint32 elemSize = getByteSize(irManager.getTypeSize(elemType));
-
-    
 #ifdef _EM64T_
     Type * indexType = typeManager.getInt64Type();
     Type * offType = typeManager.getInt64Type();
@@ -1828,11 +1825,32 @@
     Type * offType = typeManager.getInt32Type();
 #endif
         
+    uint32 elemSize = 0;
+    if (elemType->isReference()
+        && Type::isCompressedReference(elemType->tag, compilationInterface) 
+        && !elemType->isCompressedReference()) {
+        elemSize = 4;
+    } else {
+        elemSize = getByteSize(irManager.getTypeSize(elemType));
+    }
+    Opnd * elemSizeOpnd  = irManager.newImmOpnd(indexType, elemSize);
+    
     Opnd * indexOpnd = (Opnd *)index;
     indexOpnd = convert(indexOpnd, indexType);
-    
-    Opnd * addr = irManager.newMemOpnd(dstType,(Opnd*)array, (Opnd*)index,
-                                       irManager.newImmOpnd(indexType, elemSize),
+
+    if ( indexOpnd->isPlacedIn(OpndKind_Imm) ) {
+        // wee need to put index operand on a register to satisfy LEA constraint
+        uint64 immValue = indexOpnd->getImmValue();
+        if (immValue == 0) {
+            indexOpnd = NULL;
+            elemSizeOpnd = NULL;
+        } else {
+            Opnd * indexReg = irManager.newOpnd(indexType);
+            copyOpnd(indexReg,indexOpnd);
+            indexOpnd = indexReg;
+        }
+    }    
+    Opnd * addr = irManager.newMemOpnd(dstType,(Opnd*)array, indexOpnd, elemSizeOpnd,
                                        irManager.newImmOpnd(offType, arrayType->getArrayElemOffset())
                                        );
     Opnd * dst = irManager.newOpnd(dstType);

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?view=diff&rev=501830&r1=501829&r2=501830
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Wed Jan 31 04:54:34 2007
@@ -2888,12 +2888,6 @@
                                             uint32       numArgs,
                                             Opnd **      srcOpnds) {
 
-#ifdef _EM64T_
-    // FIXME: this was not tested (and does not work) on EM64T.
-    if (true) {
-        return false;
-    }
-#endif
     if( !methodIsArraycopy(methodDesc) ||
         !arraycopyOptimizable(methodDesc,numArgs,srcOpnds) )
     {
@@ -2955,48 +2949,52 @@
     LabelInst * reverseCopying = irBuilder.createLabel();
     LabelInst * boundsException = irBuilder.createLabel();
     LabelInst * Exit = irBuilder.createLabel();
+
     Type * intType = typeManager.getInt32Type();
+    Type::Tag intTag = intType->tag;
     Type * voidType = typeManager.getVoidType();
 
     newFallthroughBlock();
     Opnd * zero = irBuilder.genLdConstant((int32)0);
-    irBuilder.genBranch(Type::Int32,Cmp_GT,boundsException,zero,srcPos);        
+    Opnd * minusone = irBuilder.genLdConstant((int32)-1);
+
+    irBuilder.genBranch(intTag,Cmp_GT,boundsException,zero,srcPos);        
 
     newFallthroughBlock();
-    irBuilder.genBranch(Type::Int32,Cmp_GT,boundsException,zero,dstPos);
+    irBuilder.genBranch(intTag,Cmp_GT,boundsException,zero,dstPos);
 
     newFallthroughBlock();
-    irBuilder.genBranch(Type::Int32,Cmp_GT,boundsException,zero,len);
+    irBuilder.genBranch(intTag,Cmp_GT,boundsException,zero,len);
 
     Modifier mod = Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No);
 
     newFallthroughBlock();   
-    Opnd * srcLen = irBuilder.genArrayLen(intType,Type::Int32,src);
+    Opnd * srcLen = irBuilder.genArrayLen(intType,intTag,src);
     Opnd * srcEnd = irBuilder.genAdd(intType,mod,srcPos,len);
-    irBuilder.genBranch(Type::Int32,Cmp_GT,boundsException,srcEnd,srcLen);
+    irBuilder.genBranch(intTag,Cmp_GT,boundsException,srcEnd,srcLen);
     
     newFallthroughBlock();
     Opnd * dstEnd = irBuilder.genAdd(intType,mod,dstPos,len);
-    Opnd * dstLen = irBuilder.genArrayLen(intType,Type::Int32,dst);
-    irBuilder.genBranch(Type::Int32,Cmp_GT,boundsException,dstEnd,dstLen);
+    Opnd * dstLen = irBuilder.genArrayLen(intType,intTag,dst);
+    irBuilder.genBranch(intTag,Cmp_GT,boundsException,dstEnd,dstLen);
 
     newFallthroughBlock();
 
     // The case of same arrays and same positions
-    Opnd * diff = irBuilder.genCmp3(intType,Type::Int32,Cmp_GT,dstPos,srcPos);
+    Opnd * diff = irBuilder.genCmp3(intType,intTag,Cmp_GT,dstPos,srcPos);
     Opnd * sameArrays = irBuilder.genCmp(intType,Type::IntPtr,Cmp_EQ,src,dst);
-    Opnd * zeroDiff = irBuilder.genCmp(intType,Type::Int32,Cmp_EQ,diff,zero);
+    Opnd * zeroDiff = irBuilder.genCmp(intType,intTag,Cmp_EQ,diff,zero);
     Opnd * nothingToCopy = irBuilder.genAnd(intType,sameArrays,zeroDiff);
-    irBuilder.genBranch(Type::Int32,Cmp_GT,Exit,nothingToCopy,zero);
+    irBuilder.genBranch(intTag,Cmp_GT,Exit,nothingToCopy,zero);
 
     newFallthroughBlock();
 
     Opnd* tauTypesChecked = irBuilder.genTauSafe();
 
     // Choosing direction
-    Opnd * dstIsGreater = irBuilder.genCmp(intType,Type::Int32,Cmp_GT,diff,zero);
+    Opnd * dstIsGreater = irBuilder.genCmp(intType,intTag,Cmp_GT,diff,zero);
     Opnd * reverseCopy = irBuilder.genAnd(intType,sameArrays,dstIsGreater);
-    irBuilder.genBranch(Type::Int32,Cmp_GT,reverseCopying,reverseCopy,zero);
+    irBuilder.genBranch(intTag,Cmp_GT,reverseCopying,reverseCopy,zero);
 
     newFallthroughBlock();
 
@@ -3012,7 +3010,6 @@
     cfgBuilder.genBlockAfterCurrent(reverseCopying);
     {   // Reverse Copying
 
-    Opnd* minusone = irBuilder.genLdConstant((int32)-1);
     Opnd* lastSrcIdx = irBuilder.genAdd(srcPosType,mod,srcEnd,minusone);
     Opnd* lastDstIdx = irBuilder.genAdd(dstPosType,mod,dstEnd,minusone);
 
@@ -3032,8 +3029,7 @@
 
     irBuilder.genLabel(boundsException);
     cfgBuilder.genBlockAfterCurrent(boundsException);
-    Opnd * minusOne = irBuilder.genLdConstant((int32)-1);
-    irBuilder.genTauCheckBounds(src,minusOne,tauSrcNullChecked);
+    irBuilder.genTauCheckBounds(src,minusone,tauSrcNullChecked);
 
     irBuilder.genLabel(Exit);
     cfgBuilder.genBlockAfterCurrent(Exit);