< 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 >