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/02/27 07:20:05 UTC
svn commit: r512149 - in /harmony/enhanced/drlvm/trunk:
src/test/microbenchmark/harmony-2247/ vm/jitrino/src/codegenerator/ia32/
vm/jitrino/src/translator/java/
Author: varlax
Date: Mon Feb 26 22:20:04 2007
New Revision: 512149
URL: http://svn.apache.org/viewvc?view=rev&rev=512149
Log:
Applied HARMONY-3063 [drlvm][jit] ArrayCopyRepMove does not work on EM64T
Modified:
harmony/enhanced/drlvm/trunk/src/test/microbenchmark/harmony-2247/ArraycopyTest.java
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/src/test/microbenchmark/harmony-2247/ArraycopyTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/microbenchmark/harmony-2247/ArraycopyTest.java?view=diff&rev=512149&r1=512148&r2=512149
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/microbenchmark/harmony-2247/ArraycopyTest.java (original)
+++ harmony/enhanced/drlvm/trunk/src/test/microbenchmark/harmony-2247/ArraycopyTest.java Mon Feb 26 22:20:04 2007
@@ -6,148 +6,64 @@
public static int length = 100000000;
- public static void main(String[] args) {
+ public static void copy(int[] src, int srcPos, int[] dst, int dstPos,
+ int length) {
+
+ System.arraycopy(src, srcPos, dst, dstPos, length);
+ }
+ public static void main(String[] args) {
int arrA[] = new int[length];
int arrB[] = new int[length];
- for (int i=0;i<length;i++) {
+ for (int i = 0; i < length; i++) {
arrA[i] = i;
}
-// this part is for debugging
-/*
- printArr(arrA,0,10, "arrA initial");
- printArr(arrB,0,10, "arrB initial");
-
- System.arraycopy(arrA,1,arrB,3,5);
- printArr(arrB,0,10, "arrB changed");
-
- System.arraycopy(arrB,3,arrB,8,5);
- printArr(arrB,0,10, "arrB self forward");
-
- System.arraycopy(arrB,4,arrB,0,3);
- printArr(arrB,0,10, "arrB self backward");
-*/
- System.out.println("");
- System.out.println("START!");
-
- long start = System.currentTimeMillis();
-
- System.arraycopy(arrA,1,arrB,0,length-1);
- System.arraycopy(arrA,1,arrB,0,length-1);
- System.arraycopy(arrA,1,arrB,0,length-1);
- System.out.print(". ");
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.out.print(". ");
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.out.print(". ");
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.out.print(". ");
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.out.print(". ");
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.out.print(". ");
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.out.print(". ");
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.out.print(". ");
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.out.print(". ");
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.out.print(". ");
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.out.print(". ");
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.out.print(". ");
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.out.print(". ");
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.out.print(". ");
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.out.print(". ");
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.out.print(". ");
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.out.print(". ");
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.out.print(". ");
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.out.print(". ");
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.arraycopy(arrA,2,arrB,0,length-2);
- System.out.print(". ");
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.arraycopy(arrA,3,arrB,0,length-3);
- System.out.print(". ");
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.arraycopy(arrA,4,arrB,0,length-4);
- System.out.print(". ");
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.arraycopy(arrA,5,arrB,0,length-5);
- System.out.print(". ");
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.arraycopy(arrA,6,arrB,0,length-6);
- System.out.println(". ");
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
- System.arraycopy(arrA,7,arrB,0,length-7);
+ // this part is for debugging
+ /*
+ * printArr(arrA,0,10, "arrA initial"); printArr(arrB,0,10, "arrB
+ * initial");
+ *
+ * System.arraycopy(arrA,1,arrB,3,5); printArr(arrB,0,10, "arrB
+ * changed");
+ *
+ * System.arraycopy(arrB,3,arrB,8,5); printArr(arrB,0,10, "arrB self
+ * forward");
+ *
+ * System.arraycopy(arrB,4,arrB,0,3); printArr(arrB,0,10, "arrB self
+ * backward");
+ */
+
+ if (args.length == 0) {
+ args = new String[]{"100"};
+ }
+ for (String s : args) {
+ int lim = Integer.parseInt(s);
+
+ System.out.println("");
+ System.out.println("START!");
+
+ long start = System.currentTimeMillis();
- long end = System.currentTimeMillis();
+ for (int i = 0; i < lim; i++) {
+ copy(arrA, i, arrB, i + 2, length - i - 2);
+ // System.out.print(". ");
+ }
- System.out.println("FINISHED");
+ long end = System.currentTimeMillis();
- System.out.println("duration = "+(end - start)+" millis");
+ System.out.println("FINISHED");
+ System.out.println("duration = " + (end - start) + " millis");
+ }
}
public static void printArr(int[] arr, int pos, int count, String prefix) {
String out = prefix + " : ";
- for(int i=pos;i < pos+count; i++) {
+ for (int i = pos; i < pos + count; i++) {
out = out + arr[i] + " ";
}
System.out.println(out);
}
}
-
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=512149&r1=512148&r2=512149
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp Mon Feb 26 22:20:04 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=512149&r1=512148&r2=512149
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Mon Feb 26 22:20:04 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) ) {
+ // we need to put index operand on a register to satisfy LEA constraint
+ int64 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);
@@ -2545,7 +2563,7 @@
#endif
// prepare counter
- Type* counterType = typeManager.getInt32Type();
+ Type* counterType = typeManager.getIntPtrType();
Opnd* counter = irManager.newRegOpnd(counterType,counterRegName);
copyOpnd(counter,(Opnd*)args[4]);
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=512149&r1=512148&r2=512149
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Mon Feb 26 22:20:04 2007
@@ -2890,12 +2890,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) )
{
@@ -2957,48 +2951,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();
@@ -3014,7 +3012,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);
@@ -3034,8 +3031,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);