< prev index next >
src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
Print this page
rev 13098 : 8182161: aarch64: combine andr+cbnz into tbnz when possible
Summary: Combine andr+cbnz into tbnz when possible to save one instruction
Reviewed-by: aph
*** 2738,2749 ****
__ andr(rscratch1, tmp, TypeEntries::type_klass_mask);
// klass seen before, nothing to do. The unknown bit may have been
// set already but no need to check.
__ cbz(rscratch1, next);
! __ andr(rscratch1, tmp, TypeEntries::type_unknown);
! __ cbnz(rscratch1, next); // already unknown. Nothing to do anymore.
if (TypeEntries::is_type_none(current_klass)) {
__ cbz(rscratch2, none);
__ cmp(rscratch2, TypeEntries::null_seen);
__ br(Assembler::EQ, none);
--- 2738,2748 ----
__ andr(rscratch1, tmp, TypeEntries::type_klass_mask);
// klass seen before, nothing to do. The unknown bit may have been
// set already but no need to check.
__ cbz(rscratch1, next);
! __ tbnz(tmp, exact_log2(TypeEntries::type_unknown), next); // already unknown. Nothing to do anymore.
if (TypeEntries::is_type_none(current_klass)) {
__ cbz(rscratch2, none);
__ cmp(rscratch2, TypeEntries::null_seen);
__ br(Assembler::EQ, none);
*** 2759,2770 ****
} else {
assert(ciTypeEntries::valid_ciklass(current_klass) != NULL &&
ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "conflict only");
__ ldr(tmp, mdo_addr);
! __ andr(rscratch1, tmp, TypeEntries::type_unknown);
! __ cbnz(rscratch1, next); // already unknown. Nothing to do anymore.
}
// different than before. Cannot keep accurate profile.
__ ldr(rscratch2, mdo_addr);
__ orr(rscratch2, rscratch2, TypeEntries::type_unknown);
--- 2758,2768 ----
} else {
assert(ciTypeEntries::valid_ciklass(current_klass) != NULL &&
ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "conflict only");
__ ldr(tmp, mdo_addr);
! __ tbnz(tmp, exact_log2(TypeEntries::type_unknown), next); // already unknown. Nothing to do anymore.
}
// different than before. Cannot keep accurate profile.
__ ldr(rscratch2, mdo_addr);
__ orr(rscratch2, rscratch2, TypeEntries::type_unknown);
*** 2810,2821 ****
} else {
assert(ciTypeEntries::valid_ciklass(current_klass) != NULL &&
ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "inconsistent");
__ ldr(tmp, mdo_addr);
! __ andr(rscratch1, tmp, TypeEntries::type_unknown);
! __ cbnz(rscratch1, next); // already unknown. Nothing to do anymore.
__ orr(tmp, tmp, TypeEntries::type_unknown);
__ str(tmp, mdo_addr);
// FIXME: Write barrier needed here?
}
--- 2808,2818 ----
} else {
assert(ciTypeEntries::valid_ciklass(current_klass) != NULL &&
ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "inconsistent");
__ ldr(tmp, mdo_addr);
! __ tbnz(tmp, exact_log2(TypeEntries::type_unknown), next); // already unknown. Nothing to do anymore.
__ orr(tmp, tmp, TypeEntries::type_unknown);
__ str(tmp, mdo_addr);
// FIXME: Write barrier needed here?
}
< prev index next >