< 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 >