< prev index next >

src/hotspot/cpu/sparc/templateTable_sparc.cpp

Print this page
rev 47680 : [mq]: x86_tlab

*** 3256,3270 **** // make sure klass does not have has_finalizer, or is abstract, or interface or java/lang/Class __ btst(Klass::_lh_instance_slow_path_bit, Roffset); __ br(Assembler::notZero, false, Assembler::pn, slow_case); __ delayed()->nop(); ! // allocate the instance ! // 1) Try to allocate in the TLAB ! // 2) if fail, and the TLAB is not full enough to discard, allocate in the shared Eden ! // 3) if the above fails (or is not applicable), go to a slow case ! // (creates a new TLAB, etc.) const bool allow_shared_alloc = Universe::heap()->supports_inline_contig_alloc(); if(UseTLAB) { --- 3256,3276 ---- // make sure klass does not have has_finalizer, or is abstract, or interface or java/lang/Class __ btst(Klass::_lh_instance_slow_path_bit, Roffset); __ br(Assembler::notZero, false, Assembler::pn, slow_case); __ delayed()->nop(); ! // Allocate the instance: ! // 1) If TLAB is enabled: ! // a) Try to allocate in the TLAB ! // b) If fails, go to the slow path. ! // 2) If inline contiguous allocations are enabled: ! // a) Try to allocate in eden ! // b) If fails due to heap end, go to slow path. ! // 3) If TLAB is enabled OR inline contiguous is enabled: ! // a) Initialize the allocation ! // b) Exit. ! // 4) If neither 1 OR 2 are applicable, go to slow path. const bool allow_shared_alloc = Universe::heap()->supports_inline_contig_alloc(); if(UseTLAB) {
*** 3288,3321 **** // initialize both the header and fields __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_object); } __ delayed()->st_ptr(RnewTopValue, G2_thread, in_bytes(JavaThread::tlab_top_offset())); ! if (allow_shared_alloc) { ! // Check if tlab should be discarded (refill_waste_limit >= free) ! __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), RtlabWasteLimitValue); ! __ sub(RendValue, RoldTopValue, RfreeValue); ! __ srlx(RfreeValue, LogHeapWordSize, RfreeValue); ! __ cmp_and_brx_short(RtlabWasteLimitValue, RfreeValue, Assembler::greaterEqualUnsigned, Assembler::pt, slow_case); // tlab waste is small ! ! // increment waste limit to prevent getting stuck on this slow path ! if (Assembler::is_simm13(ThreadLocalAllocBuffer::refill_waste_limit_increment())) { ! __ add(RtlabWasteLimitValue, ThreadLocalAllocBuffer::refill_waste_limit_increment(), RtlabWasteLimitValue); ! } else { ! // set64 does not use the temp register if the given constant is 32 bit. So ! // we can just use any register; using G0 results in ignoring of the upper 32 bit ! // of that value. ! __ set64(ThreadLocalAllocBuffer::refill_waste_limit_increment(), G4_scratch, G0); ! __ add(RtlabWasteLimitValue, G4_scratch, RtlabWasteLimitValue); ! } ! __ st_ptr(RtlabWasteLimitValue, G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset())); ! } else { ! // No allocation in the shared eden. __ ba_short(slow_case); ! } ! } ! // Allocation in the shared Eden if (allow_shared_alloc) { Register RoldTopValue = G1_scratch; Register RtopAddr = G3_scratch; Register RnewTopValue = RallocatedObject; --- 3294,3306 ---- // initialize both the header and fields __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_object); } __ delayed()->st_ptr(RnewTopValue, G2_thread, in_bytes(JavaThread::tlab_top_offset())); ! // Allocation does not fit in the TLAB. __ ba_short(slow_case); ! } else { // Allocation in the shared Eden if (allow_shared_alloc) { Register RoldTopValue = G1_scratch; Register RtopAddr = G3_scratch; Register RnewTopValue = RallocatedObject;
*** 3341,3352 **** // bump total bytes allocated by this thread // RoldTopValue and RtopAddr are dead, so can use G1 and G3 __ incr_allocated_bytes(Roffset, G1_scratch, G3_scratch); } ! if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) { // clear object fields __ bind(initialize_object); __ deccc(Roffset, sizeof(oopDesc)); __ br(Assembler::zero, false, Assembler::pt, initialize_header); __ delayed()->add(RallocatedObject, sizeof(oopDesc), G3_scratch); --- 3326,3340 ---- // bump total bytes allocated by this thread // RoldTopValue and RtopAddr are dead, so can use G1 and G3 __ incr_allocated_bytes(Roffset, G1_scratch, G3_scratch); } + } ! // If UseTLAB or allow_shared_alloc are true, the object is created above and ! // there is an initialize need. Otherwise, skip and go to the slow path. ! if (UseTLAB || allow_shared_alloc) { // clear object fields __ bind(initialize_object); __ deccc(Roffset, sizeof(oopDesc)); __ br(Assembler::zero, false, Assembler::pt, initialize_header); __ delayed()->add(RallocatedObject, sizeof(oopDesc), G3_scratch);
< prev index next >