[vmkit-commits] [vmkit] r198297 - Add compare and swap, either in J3Object and in Unsafe

Gael Thomas gael.thomas at lip6.fr
Thu Jan 2 03:08:13 PST 2014


Author: gthomas
Date: Thu Jan  2 05:08:13 2014
New Revision: 198297

URL: http://llvm.org/viewvc/llvm-project?rev=198297&view=rev
Log:
Add compare and swap, either in J3Object and in Unsafe

Modified:
    vmkit/branches/mcjit/include/j3/j3object.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc
    vmkit/branches/mcjit/lib/j3/vm/j3object.cc

Modified: vmkit/branches/mcjit/include/j3/j3object.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=198297&r1=198296&r2=198297&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3object.h (original)
+++ vmkit/branches/mcjit/include/j3/j3object.h Thu Jan  2 05:08:13 2014
@@ -167,16 +167,18 @@ namespace j3 {
 
 		void            rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb); 
 
-		void            rawSetObject(uint32_t offset, J3ObjectHandle* v);
-		J3ObjectHandle* rawGetObject(uint32_t offset);
+		J3ObjectHandle* rawCASObject(uintptr_t offset, J3ObjectHandle* orig, J3ObjectHandle* value);
+		void            rawSetObject(uintptr_t offset, J3ObjectHandle* v);
+		J3ObjectHandle* rawGetObject(uintptr_t offset);
 		void            setObject(J3Field* f, J3ObjectHandle* v);
 		J3ObjectHandle* getObject(J3Field* f);
 		void            setObjectAt(uint32_t idx, J3ObjectHandle* v);
 		J3ObjectHandle* getObjectAt(uint32_t idx);
 
 #define defAccessor(name, ctype, llvmtype, scale)												\
-		void  rawSet##name(uint32_t offset, ctype value);										\
-		ctype rawGet##name(uint32_t offset);																\
+		ctype rawCAS##name(uintptr_t offset, ctype orig, ctype value);			\
+		void  rawSet##name(uintptr_t offset, ctype value);									\
+		ctype rawGet##name(uintptr_t offset);																\
 		void  set##name(J3Field* f, ctype value);														\
 		ctype get##name(J3Field* f);																				\
 		void  set##name##At(uint32_t idx, ctype value);											\

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198297&r1=198296&r2=198297&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Thu Jan  2 05:08:13 2014
@@ -46,6 +46,11 @@ extern "C" {
 		J3Field* fields = J3Cst::isStatic(access) ? cl->staticLayout()->fields() : cl->fields();
 		return fields[slot].offset();
 	}
+
+	JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv* env, jobject unsafe, 
+																																	 jobject handle, jlong offset, jobject orig, jobject value) {
+		return handle->rawCASObject(offset, orig, value) == orig;
+	}
 }
 
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198297&r1=198296&r2=198297&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Thu Jan  2 05:08:13 2014
@@ -98,6 +98,9 @@ void J3CodeGenVar::drop(uint32_t n) {
 }
 
 llvm::AllocaInst** J3CodeGenVar::stackOf(llvm::Type* t) {
+	if(!t)
+		J3::internalError(L"unable to find the type of a local/stack");
+
 	if(t->isIntegerTy(64)) {
 		return longStack;
 	} else if(t->isIntegerTy()) {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=198297&r1=198296&r2=198297&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Jan  2 05:08:13 2014
@@ -401,14 +401,26 @@ J3ObjectHandle* J3ObjectHandle::doNewArr
 	return J3Thread::get()->push(res);
 }
 
-
-
 #define defAccessor(name, ctype, llvmtype, scale)												\
-	void J3ObjectHandle::rawSet##name(uint32_t offset, ctype value) {			\
+	ctype J3ObjectHandle::rawCAS##name(uintptr_t offset, ctype orig, ctype value) { \
+		if(scale == 2) {																										\
+			uint32_t io = *((uint32_t*)&orig);																\
+			uint32_t iv = *((uint32_t*)&value);																\
+			uint32_t ir = __sync_val_compare_and_swap((uint32_t*)((uintptr_t)obj() + offset), io, iv); \
+			return *((ctype*)&ir);																						\
+		} else {																														\
+			uint64_t io = *((uint32_t*)&orig);																\
+			uint64_t iv = *((uint32_t*)&value);																\
+			uint64_t ir = __sync_val_compare_and_swap((uint64_t*)((uintptr_t)obj() + offset), io, iv); \
+			return *((ctype*)&ir);																						\
+		}																																		\
+	}																																			\
+																																				\
+	void J3ObjectHandle::rawSet##name(uintptr_t offset, ctype value) {		\
 		*((ctype*)((uintptr_t)obj() + offset)) = value;											\
 	}																																			\
 																																				\
-	ctype J3ObjectHandle::rawGet##name(uint32_t offset) {									\
+	ctype J3ObjectHandle::rawGet##name(uintptr_t offset) {								\
 		return *((ctype*)((uintptr_t)obj() + offset));											\
 	}																																			\
 																																				\
@@ -448,18 +460,25 @@ onJavaPrimitives(defAccessor)
 
 #undef defAccessor
 
-void J3ObjectHandle::rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) {
-	if(isSame(to))
-		memmove((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); 
+J3ObjectHandle* J3ObjectHandle::rawCASObject(uintptr_t offset, J3ObjectHandle* orig, J3ObjectHandle* value) {
+	J3Object* oo = orig ? orig->obj() : 0;
+	J3Object* ov = value ? value->obj() : 0;
+	J3Object* res = __sync_val_compare_and_swap((J3Object**)((uintptr_t)obj() + offset), oo, ov);
+	if(res == oo)
+		return orig;
+	else if(res == ov)
+		return value;
+	else if(!res)
+		return 0;
 	else
-		memcpy((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); 
+		return J3Thread::get()->push(res);
 }
 
-void J3ObjectHandle::rawSetObject(uint32_t offset, J3ObjectHandle* value) {
+void J3ObjectHandle::rawSetObject(uintptr_t offset, J3ObjectHandle* value) {
 	*((J3Object**)((uintptr_t)obj() + offset)) = value ? value->obj() : 0;
 }
 
-J3ObjectHandle* J3ObjectHandle::rawGetObject(uint32_t offset) {
+J3ObjectHandle* J3ObjectHandle::rawGetObject(uintptr_t offset) {
 	return obj() ? J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset))) : 0;
 }
 
@@ -479,6 +498,13 @@ J3ObjectHandle* J3ObjectHandle::getObjec
 	return rawGetObject(sizeof(J3ArrayObject) + idx*sizeof(J3Object*));
 }
 
+void J3ObjectHandle::rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) {
+	if(isSame(to))
+		memmove((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); 
+	else
+		memcpy((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); 
+}
+
 /*
  *  J3LocalReferences
  */





More information about the vmkit-commits mailing list