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