< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Print this page
rev 50637 : [mq]: JDK-8205336.patch
rev 50638 : [mq]: JDK-8205336-01.patch

*** 2438,2465 **** ATOMIC_XCHG(xchgal, swpal, ldaxr, stlxr, Assembler::xword) ATOMIC_XCHG(xchgalw, swpal, ldaxrw, stlxrw, Assembler::word) #undef ATOMIC_XCHG - void MacroAssembler::incr_allocated_bytes(Register thread, - Register var_size_in_bytes, - int con_size_in_bytes, - Register t1) { - if (!thread->is_valid()) { - thread = rthread; - } - assert(t1->is_valid(), "need temp reg"); - - ldr(t1, Address(thread, in_bytes(JavaThread::allocated_bytes_offset()))); - if (var_size_in_bytes->is_valid()) { - add(t1, t1, var_size_in_bytes); - } else { - add(t1, t1, con_size_in_bytes); - } - str(t1, Address(thread, in_bytes(JavaThread::allocated_bytes_offset()))); - } - #ifndef PRODUCT extern "C" void findpc(intptr_t x); #endif void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[]) --- 2438,2447 ----
*** 4090,4123 **** Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, Label& slow_case) { ! assert_different_registers(obj, t2); ! assert_different_registers(obj, var_size_in_bytes); ! Register end = t2; ! ! // verify_tlab(); ! ! ldr(obj, Address(rthread, JavaThread::tlab_top_offset())); ! if (var_size_in_bytes == noreg) { ! lea(end, Address(obj, con_size_in_bytes)); ! } else { ! lea(end, Address(obj, var_size_in_bytes)); ! } ! ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset())); ! cmp(end, rscratch1); ! br(Assembler::HI, slow_case); ! ! // update the tlab top pointer ! str(end, Address(rthread, JavaThread::tlab_top_offset())); ! // recover var_size_in_bytes if necessary ! if (var_size_in_bytes == end) { ! sub(var_size_in_bytes, var_size_in_bytes, obj); ! } ! // verify_tlab(); } // Zero words; len is in bytes // Destroys all registers except addr // len must be a nonzero multiple of wordSize --- 4072,4093 ---- Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, Label& slow_case) { ! BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler(); ! bs->tlab_allocate(this, obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case); ! } ! // Defines obj, preserves var_size_in_bytes ! void MacroAssembler::eden_allocate(Register obj, ! Register var_size_in_bytes, ! int con_size_in_bytes, ! Register t1, ! Label& slow_case) { ! BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler(); ! bs->eden_allocate(this, obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case); } // Zero words; len is in bytes // Destroys all registers except addr // len must be a nonzero multiple of wordSize
*** 4178,4242 **** bind(entry); add(t1, t1, unroll * wordSize); cbnz(len, loop); } - // Defines obj, preserves var_size_in_bytes - void MacroAssembler::eden_allocate(Register obj, - Register var_size_in_bytes, - int con_size_in_bytes, - Register t1, - Label& slow_case) { - assert_different_registers(obj, var_size_in_bytes, t1); - if (!Universe::heap()->supports_inline_contig_alloc()) { - b(slow_case); - } else { - Register end = t1; - Register heap_end = rscratch2; - Label retry; - bind(retry); - { - unsigned long offset; - adrp(rscratch1, ExternalAddress((address) Universe::heap()->end_addr()), offset); - ldr(heap_end, Address(rscratch1, offset)); - } - - ExternalAddress heap_top((address) Universe::heap()->top_addr()); - - // Get the current top of the heap - { - unsigned long offset; - adrp(rscratch1, heap_top, offset); - // Use add() here after ARDP, rather than lea(). - // lea() does not generate anything if its offset is zero. - // However, relocs expect to find either an ADD or a load/store - // insn after an ADRP. add() always generates an ADD insn, even - // for add(Rn, Rn, 0). - add(rscratch1, rscratch1, offset); - ldaxr(obj, rscratch1); - } - - // Adjust it my the size of our new object - if (var_size_in_bytes == noreg) { - lea(end, Address(obj, con_size_in_bytes)); - } else { - lea(end, Address(obj, var_size_in_bytes)); - } - - // if end < obj then we wrapped around high memory - cmp(end, obj); - br(Assembler::LO, slow_case); - - cmp(end, heap_end); - br(Assembler::HI, slow_case); - - // If heap_top hasn't been changed by some other thread, update it. - stlxr(rscratch2, end, rscratch1); - cbnzw(rscratch2, retry); - } - } - void MacroAssembler::verify_tlab() { #ifdef ASSERT if (UseTLAB && VerifyOops) { Label next, ok; --- 4148,4157 ----
< prev index next >