< prev index next >
src/hotspot/cpu/x86/macroAssembler_x86.cpp
Print this page
rev 50637 : [mq]: JDK-8205336.patch
*** 2957,3000 ****
}
}
#endif // !LP64 || C1 || !C2 || INCLUDE_JVMCI
- // 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(obj == rax, "obj must be in rax, for cmpxchg");
- assert_different_registers(obj, var_size_in_bytes, t1);
- if (!Universe::heap()->supports_inline_contig_alloc()) {
- jmp(slow_case);
- } else {
- Register end = t1;
- Label retry;
- bind(retry);
- ExternalAddress heap_top((address) Universe::heap()->top_addr());
- movptr(obj, heap_top);
- if (var_size_in_bytes == noreg) {
- lea(end, Address(obj, con_size_in_bytes));
- } else {
- lea(end, Address(obj, var_size_in_bytes, Address::times_1));
- }
- // if end < obj then we wrapped around => object too long => slow case
- cmpptr(end, obj);
- jcc(Assembler::below, slow_case);
- cmpptr(end, ExternalAddress((address) Universe::heap()->end_addr()));
- jcc(Assembler::above, slow_case);
- // Compare obj with the top addr, and if still equal, store the new top addr in
- // end at the address of the top addr pointer. Sets ZF if was equal, and clears
- // it otherwise. Use lock prefix for atomicity on MPs.
- locked_cmpxchgptr(end, heap_top);
- jcc(Assembler::notEqual, retry);
- }
- }
-
void MacroAssembler::enter() {
push(rbp);
mov(rbp, rsp);
}
--- 2957,2966 ----
*** 5308,5349 ****
void MacroAssembler::testptr(Register dst, Register src) {
LP64_ONLY(testq(dst, src)) NOT_LP64(testl(dst, src));
}
// Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes.
! void MacroAssembler::tlab_allocate(Register obj,
Register var_size_in_bytes,
int con_size_in_bytes,
Register t1,
Register t2,
Label& slow_case) {
! assert_different_registers(obj, t1, t2);
! assert_different_registers(obj, var_size_in_bytes, t1);
! Register end = t2;
! Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
!
! verify_tlab();
!
! NOT_LP64(get_thread(thread));
!
! movptr(obj, Address(thread, 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, Address::times_1));
! }
! cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
! jcc(Assembler::above, slow_case);
!
! // update the tlab top pointer
! movptr(Address(thread, JavaThread::tlab_top_offset()), end);
! // recover var_size_in_bytes if necessary
! if (var_size_in_bytes == end) {
! subptr(var_size_in_bytes, obj);
! }
! verify_tlab();
}
// Preserves the contents of address, destroys the contents length_in_bytes and temp.
void MacroAssembler::zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp) {
assert(address != length_in_bytes && address != temp && temp != length_in_bytes, "registers must be different");
--- 5274,5301 ----
void MacroAssembler::testptr(Register dst, Register src) {
LP64_ONLY(testq(dst, src)) NOT_LP64(testl(dst, src));
}
// Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes.
! void MacroAssembler::tlab_allocate(Register thread, Register obj,
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, thread, 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 thread, 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, thread, obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case);
}
// Preserves the contents of address, destroys the contents length_in_bytes and temp.
void MacroAssembler::zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp) {
assert(address != length_in_bytes && address != temp && temp != length_in_bytes, "registers must be different");
*** 5398,5437 ****
}
bind(done);
}
- void MacroAssembler::incr_allocated_bytes(Register thread,
- Register var_size_in_bytes,
- int con_size_in_bytes,
- Register t1) {
- if (!thread->is_valid()) {
- #ifdef _LP64
- thread = r15_thread;
- #else
- assert(t1->is_valid(), "need temp reg");
- thread = t1;
- get_thread(thread);
- #endif
- }
-
- #ifdef _LP64
- if (var_size_in_bytes->is_valid()) {
- addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
- } else {
- addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
- }
- #else
- if (var_size_in_bytes->is_valid()) {
- addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
- } else {
- addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
- }
- adcl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())+4), 0);
- #endif
- }
-
// Look up the method for a megamorphic invokeinterface call.
// The target method is determined by <intf_klass, itable_index>.
// The receiver klass is in recv_klass.
// On success, the result will be in method_result, and execution falls through.
// On failure, execution transfers to the given label.
--- 5350,5359 ----
< prev index next >