[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