Index: vm/gc_gen/src/jni/java_natives.cpp =================================================================== --- vm/gc_gen/src/jni/java_natives.cpp (revision 599434) +++ vm/gc_gen/src/jni/java_natives.cpp (working copy) @@ -58,6 +58,40 @@ GCHelper_clss = *vm_class_ptr; } +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getPrefetchDist(JNIEnv *e, jclass c) +{ + return (jint)PREFETCH_DISTANCE; +} + +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getZeroingSize(JNIEnv *e, jclass c) +{ + return (jint)ZEROING_SIZE; +} + +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getPrefetchStride(JNIEnv *e, jclass c) +{ + return (jint)PREFETCH_STRIDE; +} + +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getTlaFreeOffset(JNIEnv *, jclass) { + Allocator allocator; + return (jint) ((POINTER_SIZE_INT)&allocator.free - (POINTER_SIZE_INT)&allocator); +} + +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getTlaCeilingOffset(JNIEnv *, jclass) { + Allocator allocator; + return (jint) ((POINTER_SIZE_INT)&allocator.ceiling - (POINTER_SIZE_INT)&allocator); +} + +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getTlaEndOffset(JNIEnv *, jclass) { + Allocator allocator; + return (jint) ((POINTER_SIZE_INT)&allocator.end - (POINTER_SIZE_INT)&allocator); +} + +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getGCObjectAlignment(JNIEnv *, jclass) { + return GC_OBJECT_ALIGNMENT; +} + #ifdef __cplusplus } #endif Index: vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java =================================================================== --- vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java (revision 599434) +++ vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java (working copy) @@ -32,7 +32,14 @@ } public static final int TLS_GC_OFFSET = TLSGCOffset(); + public static final int PREFETCH_DISTANCE = getPrefetchDist(); + public static final int ZEROING_SIZE = getZeroingSize(); + public static final int PREFETCH_STRIDE = getPrefetchStride(); + public static final int TLA_FREE_OFFSET = getTlaFreeOffset(); + public static final int TLA_CEILING_OFFSET = getTlaCeilingOffset(); + public static final int TLA_END_OFFSET = getTlaEndOffset(); + @Inline private static Address alloc(int objSize, int allocationHandle ) { @@ -56,6 +63,47 @@ } @Inline + private static Address alloc_zeroing(int objSize, int allocationHandle ) { + + Address TLS_BASE = VMHelper.getTlsBaseAddress(); + + Address allocator_addr = TLS_BASE.plus(TLS_GC_OFFSET); + Address allocator = allocator_addr.loadAddress(); + Address free_addr = allocator.plus(TLA_FREE_OFFSET); + Address free = free_addr.loadAddress(); + Address ceiling_addr = allocator.plus(TLA_CEILING_OFFSET); + Address ceiling = ceiling_addr.loadAddress(); + + Address new_free = free.plus(objSize); + + if (new_free.LE(ceiling)) { + free_addr.store(new_free); + free.store(allocationHandle); + return free; + } else { + Address end = allocator.plus(TLA_END_OFFSET).loadAddress(); + if(new_free.LE(end)) { + // do prefetch from new_free to new_free + PREFETCH_DISTANCE + ZEROING_SIZE + VMHelper.prefetch(new_free, PREFETCH_DISTANCE + ZEROING_SIZE, PREFETCH_STRIDE); + + Address new_ceiling = new_free.plus(ZEROING_SIZE); + if( !new_ceiling.LE(end) ){ + new_ceiling = end; + } + + VMHelper.memset0(ceiling , new_ceiling.diff(ceiling).toInt()); + + ceiling_addr.store(new_ceiling); + free_addr.store(new_free); + free.store(allocationHandle); + return free; + } + } + + return VMHelper.newResolvedUsingAllocHandleAndSize(objSize, allocationHandle); + } + + @Inline public static Address alloc(Address classHandle) { int objSize = VMHelper.getTypeSize(classHandle); int allocationHandle = VMHelper.getAllocationHandle(classHandle); @@ -103,9 +151,17 @@ VMHelper.writeBarrier(p_objBase, p_objSlot, p_target); } + private static native int getTlaFreeOffset(); + private static native int getTlaCeilingOffset(); + private static native int getTlaEndOffset(); + private static native int getGCObjectAlignment(); + private static native int getPrefetchDist(); + private static native int getZeroingSize(); + private static native int getPrefetchStride(); private static native int helperCallback(); private static native boolean getGenMode(); private static native long getNosBoundary(); private static native int TLSGCOffset(); } + Index: vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java =================================================================== --- vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java (revision 599434) +++ vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java (working copy) @@ -61,6 +61,10 @@ public static void monitorExit(Object obj) {fail();} + public static void memset0(Address addr, int size) {fail();} + + public static void prefetch(Address addr, int distance, int stride) {fail();} + public static void writeBarrier(Address objBase, Address objSlot, Address source) {fail();} public static Address getInterfaceVTable(Object obj, Address intfTypePtr) {fail(); return null;}