< prev index next >

src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

Print this page
rev 12409 : 8169177: aarch64: SIGSEGV when "-XX:+ZeroTLAB" is specified along with GC options
Summary: Add zero-initialization to C1 for fast TLAB refills
Reviewed-by: aph, drwhite
Contributed-by: kavitha.natarajan@linaro.org

*** 3942,3957 **** --- 3942,4027 ---- str(top, Address(rthread, in_bytes(JavaThread::tlab_start_offset()))); str(top, Address(rthread, in_bytes(JavaThread::tlab_top_offset()))); add(top, top, t1); sub(top, top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes()); str(top, Address(rthread, in_bytes(JavaThread::tlab_end_offset()))); + + if (ZeroTLAB) { + // This is a fast TLAB refill, therefore the GC is not notified of it. + // So compiled code must fill the new TLAB with zeroes. + ldr(top, Address(rthread, in_bytes(JavaThread::tlab_start_offset()))); + zero_memory(top,t1,t2); + } + verify_tlab(); b(retry); return rthread; // for use by caller } + // Zero words; len is in bytes + // Destroys all registers except addr + // len must be a nonzero multiple of wordSize + void MacroAssembler::zero_memory(Register addr, Register len, Register t1) { + assert_different_registers(addr, len, t1, rscratch1, rscratch2); + + #ifdef ASSERT + { Label L; + tst(len, BytesPerWord - 1); + br(Assembler::EQ, L); + stop("len is not a multiple of BytesPerWord"); + bind(L); + } + #endif + + #ifndef PRODUCT + block_comment("zero memory"); + #endif + + Label loop; + Label entry; + + // Algorithm: + // + // scratch1 = cnt & 7; + // cnt -= scratch1; + // p += scratch1; + // switch (scratch1) { + // do { + // cnt -= 8; + // p[-8] = 0; + // case 7: + // p[-7] = 0; + // case 6: + // p[-6] = 0; + // // ... + // case 1: + // p[-1] = 0; + // case 0: + // p += 8; + // } while (cnt); + // } + + const int unroll = 8; // Number of str(zr) instructions we'll unroll + + lsr(len, len, LogBytesPerWord); + andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll + sub(len, len, rscratch1); // cnt -= unroll + // t1 always points to the end of the region we're about to zero + add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord); + adr(rscratch2, entry); + sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2); + br(rscratch2); + bind(loop); + sub(len, len, unroll); + for (int i = -unroll; i < 0; i++) + str(zr, Address(t1, i * wordSize)); + 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,
< prev index next >