[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