< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page

        

*** 2440,2451 **** } void TemplateTable::if_acmp(Condition cc) { transition(atos, vtos); // assume branch is more often taken than not (loops use backward branches) ! Label not_taken; __ pop_ptr(rdx); __ cmpoop(rdx, rax); __ jcc(j_not(cc), not_taken); branch(false, false); __ bind(not_taken); __ profile_not_taken_branch(rax); --- 2440,2470 ---- } void TemplateTable::if_acmp(Condition cc) { transition(atos, vtos); // assume branch is more often taken than not (loops use backward branches) ! Label not_taken, is_null; __ pop_ptr(rdx); + + if (UseNewAcmp) { + // TODO what about interpreter buffered values? + const int mask = Universe::oop_metadata_odd_mask(); + __ testptr(rdx, rdx); + __ jcc(Assembler::zero, is_null); + __ movl(rbx, Address(rdx, oopDesc::klass_offset_in_bytes())); + __ andptr(rbx, mask); + // Check if a shift is required for perturbation to affect aligned bits + if (mask == KlassPtrEvenOddMask && ObjectAlignmentInBytes <= KlassAlignmentInBytes) { + assert((mask >> LogKlassAlignmentInBytes) == 1, "invalid shift"); + __ shrptr(rbx, LogKlassAlignmentInBytes); + } else { + assert(mask < ObjectAlignmentInBytes, "invalid mask"); + } + __ orptr(rdx, rbx); + __ bind(is_null); + } + __ cmpoop(rdx, rax); __ jcc(j_not(cc), not_taken); branch(false, false); __ bind(not_taken); __ profile_not_taken_branch(rax);
< prev index next >