[vmkit-commits] [vmkit] r108321 - in /vmkit/trunk: lib/J3/VMCore/JavaLocks.cpp lib/J3/VMCore/JavaLocks.h lib/J3/VMCore/JavaObject.cpp lib/J3/VMCore/JavaObject.h lib/Mvm/GCMmap2/ObjectHeader.h mmtk/config/marksweep/ObjectHeader.h mmtk/mmtk-j3/ObjectModel.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Jul 13 23:01:52 PDT 2010
Author: geoffray
Date: Wed Jul 14 01:01:52 2010
New Revision: 108321
URL: http://llvm.org/viewvc/llvm-project?rev=108321&view=rev
Log:
Support for more than 2 GC bits in the object header.
Modified:
vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp
vmkit/trunk/lib/J3/VMCore/JavaLocks.h
vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
vmkit/trunk/lib/J3/VMCore/JavaObject.h
vmkit/trunk/lib/Mvm/GCMmap2/ObjectHeader.h
vmkit/trunk/mmtk/config/marksweep/ObjectHeader.h
vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp
Modified: vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp?rev=108321&r1=108320&r2=108321&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp Wed Jul 14 01:01:52 2010
@@ -76,13 +76,13 @@
}
uintptr_t JavaLock::getID() {
- return (index << LockSystem::BitGCHash) | mvm::FatMask;
+ return (index << mvm::NonLockBits) | mvm::FatMask;
}
JavaLock* JavaLock::getFromID(uintptr_t ID) {
Jnjvm* vm = JavaThread::get()->getJVM();
if (ID & mvm::FatMask) {
- uint32_t index = (ID & ~mvm::FatMask) >> LockSystem::BitGCHash;
+ uint32_t index = (ID & ~mvm::FatMask) >> mvm::NonLockBits;
JavaLock* res = vm->lockSystem.getLock(index);
return res;
} else {
Modified: vmkit/trunk/lib/J3/VMCore/JavaLocks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaLocks.h?rev=108321&r1=108320&r2=108321&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaLocks.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaLocks.h Wed Jul 14 01:01:52 2010
@@ -129,9 +129,6 @@
static const uint32_t IndexSize = 1 << BitIndex;
static const uint32_t BitMask = IndexSize - 1;
static const uint32_t MaxLocks = GlobalSize * IndexSize;
- static const uint32_t BitGC = 2;
- static const uint32_t BitHash = 10;
- static const uint32_t BitGCHash = BitGC + BitHash;
/// LockTable - The global table that will hold the locks. The table is
/// a two-dimensional array, and only one entry is created, so that
Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.cpp?rev=108321&r1=108320&r2=108321&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.cpp Wed Jul 14 01:01:52 2010
@@ -22,6 +22,31 @@
uint16_t JavaObject::hashCodeGenerator = 1;
+/// hashCode - Return the hash code of this object.
+uint32_t JavaObject::hashCode(JavaObject* self) {
+ llvm_gcroot(self, 0);
+ if (!mvm::MovesObject) return (uint32_t)self;
+
+ uintptr_t oldLock = self->lock.lock;
+ uintptr_t val = (oldLock & mvm::HashMask) >> mvm::GCBits;
+ if (val) return val ^ (uintptr_t)getClass(self);
+ if (hashCodeGenerator >= (mvm::HashMask >> mvm::GCBits)) {
+ val = hashCodeGenerator = 1;
+ } else {
+ val = ++hashCodeGenerator;
+ }
+
+ do {
+ uintptr_t oldLock = self->lock.lock;
+ uintptr_t newLock = (val << mvm::GCBits) | oldLock;
+ __sync_val_compare_and_swap(&(self->lock.lock), oldLock, newLock);
+ } while ((self->lock.lock & mvm::HashMask) == 0);
+
+ return ((self->lock.lock & mvm::HashMask) >> mvm::GCBits) ^
+ (uintptr_t)getClass(self);
+}
+
+
void JavaObject::waitIntern(
JavaObject* self, struct timeval* info, bool timed) {
llvm_gcroot(self, 0);
Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.h?rev=108321&r1=108320&r2=108321&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.h Wed Jul 14 01:01:52 2010
@@ -320,25 +320,7 @@
static uint16_t hashCodeGenerator;
/// hashCode - Return the hash code of this object.
- static uint32_t hashCode(JavaObject* self) {
- llvm_gcroot(self, 0);
- uintptr_t oldLock = self->lock.lock;
- uintptr_t val = (oldLock & mvm::HashMask) >> LockSystem::BitGC;
- if (val) return val ^ (uintptr_t)getClass(self);
- else {
- if (hashCodeGenerator >= (mvm::HashMask >> LockSystem::BitGC))
- val = hashCodeGenerator = 1;
- else val = ++hashCodeGenerator;
- }
-
- do {
- uintptr_t oldLock = self->lock.lock;
- uintptr_t newLock = (val << LockSystem::BitGC) | oldLock;
- __sync_val_compare_and_swap(&(self->lock.lock), oldLock, newLock);
- } while ((self->lock.lock & mvm::HashMask) == 0);
- return ((self->lock.lock & mvm::HashMask) >> LockSystem::BitGC) ^
- (uintptr_t)getClass(self);
- }
+ static uint32_t hashCode(JavaObject* self);
};
Modified: vmkit/trunk/lib/Mvm/GCMmap2/ObjectHeader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/ObjectHeader.h?rev=108321&r1=108320&r2=108321&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/ObjectHeader.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/ObjectHeader.h Wed Jul 14 01:01:52 2010
@@ -13,7 +13,7 @@
#include <stdint.h>
namespace mvm {
- #if (__WORDSIZE == 64)
+#if (__WORDSIZE == 64)
static const uint64_t FatMask = 0x8000000000000000;
#else
static const uint64_t FatMask = 0x80000000;
@@ -22,13 +22,15 @@
static const uint64_t ThinCountMask = 0xFF000;
static const uint64_t ThinCountShift = 12;
static const uint64_t ThinCountAdd = 0x1000;
- // Mask for all GC objects.
+
static const uint64_t NonLockBitsMask = 0xFFF;
- // Mask for the hash code bits.
static const uint64_t HashMask = 0xFFC;
- // Mask for the GC bits.
static const uint64_t GCBitMask = 0x3;
+ static const uint32_t GCBits = 2;
+ static const uint32_t HashBits = 10;
+ static const uint32_t NonLockBits = 12;
+
static const bool MovesObject = false;
}
Modified: vmkit/trunk/mmtk/config/marksweep/ObjectHeader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/config/marksweep/ObjectHeader.h?rev=108321&r1=108320&r2=108321&view=diff
==============================================================================
--- vmkit/trunk/mmtk/config/marksweep/ObjectHeader.h (original)
+++ vmkit/trunk/mmtk/config/marksweep/ObjectHeader.h Wed Jul 14 01:01:52 2010
@@ -13,7 +13,7 @@
#include <stdint.h>
namespace mvm {
- #if (__WORDSIZE == 64)
+#if (__WORDSIZE == 64)
static const uint64_t FatMask = 0x8000000000000000;
#else
static const uint64_t FatMask = 0x80000000;
@@ -22,12 +22,14 @@
static const uint64_t ThinCountMask = 0xFF000;
static const uint64_t ThinCountShift = 12;
static const uint64_t ThinCountAdd = 0x1000;
- // Mask for all GC objects.
+
static const uint64_t NonLockBitsMask = 0xFFF;
- // Mask for the hash code bits.
- static const uint64_t HashMask = 0xFFC;
- // Mask for the GC bits.
- static const uint64_t GCBitMask = 0x3;
+ static const uint64_t HashMask = 0xFF0;
+ static const uint64_t GCBitMask = 0xF;
+
+ static const uint32_t NonLockBits = 12;
+ static const uint32_t HashBits = 0;
+ static const uint32_t GCBits = 4;
static const bool MovesObject = false;
}
Modified: vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp?rev=108321&r1=108320&r2=108321&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp Wed Jul 14 01:01:52 2010
@@ -21,19 +21,12 @@
}
extern "C" uintptr_t Java_org_j3_mmtk_ObjectModel_readAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2 (JavaObject* OM, JavaObject* obj) {
- return ((uintptr_t*)obj)[1] & mvm::GCBitMask;
+ return ((uintptr_t*)obj)[1];
}
-extern "C" void Java_org_j3_mmtk_ObjectModel_writeAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2 (JavaObject* OM, JavaObject* obj, uintptr_t val) {
- // Comment the assert, it prevents MMTkInline.inc to be self-contained.
- // assert((val & ~mvm::NonLockBitsMask) == (((uintptr_t*)obj)[1] & ~mvm::GCMask) && "GC bits do not fit");
-#if defined(__PPC__)
- ((uint8_t*)obj)[7] &= ~mvm::GCBitMask;
- ((uint8_t*)obj)[7] |= val;
-#else
- ((uint8_t*)obj)[4] &= ~mvm::GCBitMask;
- ((uint8_t*)obj)[4] |= val;
-#endif
+extern "C" void Java_org_j3_mmtk_ObjectModel_writeAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2 (
+ JavaObject* OM, JavaObject* obj, uintptr_t val) {
+ ((uintptr_t*)obj)[1] = val;
}
extern "C" JavaObject* Java_org_j3_mmtk_ObjectModel_objectStartRef__Lorg_vmmagic_unboxed_ObjectReference_2 (JavaObject* OM, JavaObject* obj) {
@@ -67,16 +60,13 @@
return obj;
}
-extern "C" intptr_t Java_org_j3_mmtk_ObjectModel_prepareAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2 (JavaObject* OM, JavaObject* obj) {
- return ((intptr_t*)obj)[1];
+extern "C" uintptr_t Java_org_j3_mmtk_ObjectModel_prepareAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2 (JavaObject* OM, JavaObject* obj) {
+ return ((uintptr_t*)obj)[1];
}
extern "C" uint8_t
Java_org_j3_mmtk_ObjectModel_attemptAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Word_2(
- JavaObject* OM, JavaObject* obj, intptr_t oldValue, intptr_t newValue) {
-
- assert(((oldValue & ~mvm::GCBitMask) == (newValue & ~mvm::GCBitMask)) &&
- "GC bits do not fit");
+ JavaObject* OM, JavaObject* obj, intptr_t oldValue, intptr_t newValue) {
return __sync_bool_compare_and_swap(((intptr_t*)obj) + 1, oldValue, newValue);
}
More information about the vmkit-commits
mailing list