4250
4251 // Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes.
4252 void MacroAssembler::tlab_allocate(Register obj,
4253 Register var_size_in_bytes,
4254 int con_size_in_bytes,
4255 Register t1,
4256 Register t2,
4257 Label& slow_case) {
4258 assert_different_registers(obj, t2);
4259 assert_different_registers(obj, var_size_in_bytes);
4260 Register end = t2;
4261
4262 // verify_tlab();
4263
4264 ldr(obj, Address(rthread, JavaThread::tlab_top_offset()));
4265 if (var_size_in_bytes == noreg) {
4266 lea(end, Address(obj, con_size_in_bytes));
4267 } else {
4268 lea(end, Address(obj, var_size_in_bytes));
4269 }
4270 ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset()));
4271 cmp(end, rscratch1);
4272 br(Assembler::HI, slow_case);
4273
4274 // update the tlab top pointer
4275 str(end, Address(rthread, JavaThread::tlab_top_offset()));
4276
4277 // recover var_size_in_bytes if necessary
4278 if (var_size_in_bytes == end) {
4279 sub(var_size_in_bytes, var_size_in_bytes, obj);
4280 }
4281 // verify_tlab();
4282 }
4283
4284 // Zero words; len is in bytes
4285 // Destroys all registers except addr
4286 // len must be a nonzero multiple of wordSize
4287 void MacroAssembler::zero_memory(Register addr, Register len, Register t1) {
4288 assert_different_registers(addr, len, t1, rscratch1, rscratch2);
4289
4290 #ifdef ASSERT
4396 stlxr(rscratch2, end, rscratch1);
4397 cbnzw(rscratch2, retry);
4398 }
4399 }
4400
4401 void MacroAssembler::verify_tlab() {
4402 #ifdef ASSERT
4403 if (UseTLAB && VerifyOops) {
4404 Label next, ok;
4405
4406 stp(rscratch2, rscratch1, Address(pre(sp, -16)));
4407
4408 ldr(rscratch2, Address(rthread, in_bytes(JavaThread::tlab_top_offset())));
4409 ldr(rscratch1, Address(rthread, in_bytes(JavaThread::tlab_start_offset())));
4410 cmp(rscratch2, rscratch1);
4411 br(Assembler::HS, next);
4412 STOP("assert(top >= start)");
4413 should_not_reach_here();
4414
4415 bind(next);
4416 ldr(rscratch2, Address(rthread, in_bytes(JavaThread::tlab_end_offset())));
4417 ldr(rscratch1, Address(rthread, in_bytes(JavaThread::tlab_top_offset())));
4418 cmp(rscratch2, rscratch1);
4419 br(Assembler::HS, ok);
4420 STOP("assert(top <= end)");
4421 should_not_reach_here();
4422
4423 bind(ok);
4424 ldp(rscratch2, rscratch1, Address(post(sp, 16)));
4425 }
4426 #endif
4427 }
4428
4429 // Writes to stack successive pages until offset reached to check for
4430 // stack overflow + shadow pages. This clobbers tmp.
4431 void MacroAssembler::bang_stack_size(Register size, Register tmp) {
4432 assert_different_registers(tmp, size, rscratch1);
4433 mov(tmp, sp);
4434 // Bang stack for total size given plus shadow page size.
4435 // Bang one page at a time because large size can bang beyond yellow and
4436 // red zones.
|
4250
4251 // Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes.
4252 void MacroAssembler::tlab_allocate(Register obj,
4253 Register var_size_in_bytes,
4254 int con_size_in_bytes,
4255 Register t1,
4256 Register t2,
4257 Label& slow_case) {
4258 assert_different_registers(obj, t2);
4259 assert_different_registers(obj, var_size_in_bytes);
4260 Register end = t2;
4261
4262 // verify_tlab();
4263
4264 ldr(obj, Address(rthread, JavaThread::tlab_top_offset()));
4265 if (var_size_in_bytes == noreg) {
4266 lea(end, Address(obj, con_size_in_bytes));
4267 } else {
4268 lea(end, Address(obj, var_size_in_bytes));
4269 }
4270 ldr(rscratch1, Address(rthread, JavaThread::tlab_fast_path_end_offset()));
4271 cmp(end, rscratch1);
4272 br(Assembler::HI, slow_case);
4273
4274 // update the tlab top pointer
4275 str(end, Address(rthread, JavaThread::tlab_top_offset()));
4276
4277 // recover var_size_in_bytes if necessary
4278 if (var_size_in_bytes == end) {
4279 sub(var_size_in_bytes, var_size_in_bytes, obj);
4280 }
4281 // verify_tlab();
4282 }
4283
4284 // Zero words; len is in bytes
4285 // Destroys all registers except addr
4286 // len must be a nonzero multiple of wordSize
4287 void MacroAssembler::zero_memory(Register addr, Register len, Register t1) {
4288 assert_different_registers(addr, len, t1, rscratch1, rscratch2);
4289
4290 #ifdef ASSERT
4396 stlxr(rscratch2, end, rscratch1);
4397 cbnzw(rscratch2, retry);
4398 }
4399 }
4400
4401 void MacroAssembler::verify_tlab() {
4402 #ifdef ASSERT
4403 if (UseTLAB && VerifyOops) {
4404 Label next, ok;
4405
4406 stp(rscratch2, rscratch1, Address(pre(sp, -16)));
4407
4408 ldr(rscratch2, Address(rthread, in_bytes(JavaThread::tlab_top_offset())));
4409 ldr(rscratch1, Address(rthread, in_bytes(JavaThread::tlab_start_offset())));
4410 cmp(rscratch2, rscratch1);
4411 br(Assembler::HS, next);
4412 STOP("assert(top >= start)");
4413 should_not_reach_here();
4414
4415 bind(next);
4416 ldr(rscratch2, Address(rthread, in_bytes(JavaThread::tlab_fast_path_end_offset())));
4417 ldr(rscratch1, Address(rthread, in_bytes(JavaThread::tlab_top_offset())));
4418 cmp(rscratch2, rscratch1);
4419 br(Assembler::HS, ok);
4420 STOP("assert(top <= end)");
4421 should_not_reach_here();
4422
4423 bind(ok);
4424 ldp(rscratch2, rscratch1, Address(post(sp, 16)));
4425 }
4426 #endif
4427 }
4428
4429 // Writes to stack successive pages until offset reached to check for
4430 // stack overflow + shadow pages. This clobbers tmp.
4431 void MacroAssembler::bang_stack_size(Register size, Register tmp) {
4432 assert_different_registers(tmp, size, rscratch1);
4433 mov(tmp, sp);
4434 // Bang stack for total size given plus shadow page size.
4435 // Bang one page at a time because large size can bang beyond yellow and
4436 // red zones.
|