--- old/src/cpu/x86/vm/macroAssembler_x86.cpp 2015-10-08 22:15:31.228696623 +0200 +++ new/src/cpu/x86/vm/macroAssembler_x86.cpp 2015-10-08 22:15:31.177697841 +0200 @@ -3729,6 +3729,11 @@ // provoke OS NULL exception if reg = NULL by // accessing M[reg] w/o changing any (non-CC) registers // NOTE: cmpl is plenty here to provoke a segv + + if (ShenandoahVerifyReadsToFromSpace) { + oopDesc::bs()->interpreter_read_barrier(this, reg); + } + cmpptr(rax, Address(reg, 0)); // Note: should probably use testl(rax, Address(reg, 0)); // may be shorter code (however, this version of @@ -4227,6 +4232,13 @@ assert(thread == r15_thread, "must be"); #endif // _LP64 + if (UseShenandoahGC) { + // No need for this in Shenandoah. + return; + } + + assert(UseG1GC, "expect G1 GC"); + Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() + PtrQueue::byte_offset_of_index())); Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() + @@ -4411,10 +4423,15 @@ NOT_LP64(get_thread(thread)); + uint oop_extra_words = Universe::heap()->oop_extra_words(); + movptr(obj, Address(thread, JavaThread::tlab_top_offset())); if (var_size_in_bytes == noreg) { - lea(end, Address(obj, con_size_in_bytes)); + lea(end, Address(obj, con_size_in_bytes + oop_extra_words * HeapWordSize)); } else { + if (oop_extra_words > 0) { + addq(var_size_in_bytes, oop_extra_words * HeapWordSize); + } lea(end, Address(obj, var_size_in_bytes, Address::times_1)); } cmpptr(end, Address(thread, JavaThread::tlab_end_offset())); @@ -4423,6 +4440,8 @@ // update the tlab top pointer movptr(Address(thread, JavaThread::tlab_top_offset()), end); + Universe::heap()->compile_prepare_oop(this, obj); + // recover var_size_in_bytes if necessary if (var_size_in_bytes == end) { subptr(var_size_in_bytes, obj); @@ -5690,6 +5709,9 @@ void MacroAssembler::load_klass(Register dst, Register src) { + if (ShenandoahVerifyReadsToFromSpace) { + oopDesc::bs()->interpreter_read_barrier(this, src); + } #ifdef _LP64 if (UseCompressedClassPointers) { movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));