[master] RFR: Load narrowKlass from header, AArch64 assembler implementation [v2]
Andrew Haley
aph at openjdk.java.net
Thu Jan 27 14:46:10 UTC 2022
On Thu, 27 Jan 2022 13:51:42 GMT, Roman Kennke <rkennke at openjdk.org> wrote:
>> This implements MacroAssembler::load_klass() to load the (narrow)Klass* from object header. Just like the x86_64 implementation, it checks whether it can take the fast path (object unlocked -> load from upper 32bits of header), or else calls the runtime to get a stable header and load from that.
>>
>> It adds a runtime call stub, which will also be used in the C2 implementation. It also adds nklass_offset_in_bytes() which will also be used in C2 impl. The part in generate_verify_oop() is a little nasty, I added a comment that explains what's going on.
>>
>> Testing:
>> - [x] tier1 (aarch64)
>> - [x] tier2 (aarch64)
>> - [x] tier3 (aarch64)
>
> Roman Kennke has updated the pull request incrementally with one additional commit since the last revision:
>
> Add asserts
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp line 3733:
> 3731: // We don't need to preserve r0 here, but we need to preserve rscratch1 and rescratch2,
> 3732: // because some users of load_klass() use them around the call.
> 3733: push(RegSet::of(rscratch1, rscratch2), sp);
This is all very weird, and looks confusing. I think it might be safer to force the callers of `load_klass()` to provide a temp.
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp line 3737:
> 3735: assert(StubRoutines::load_nklass() != NULL, "Must have stub");
> 3736: mov(rscratch1, StubRoutines::load_nklass());
> 3737: blr(rscratch1);
Suggestion:
far_call(RuntimeAddress(StubRoutines::load_nklass()), rscratch1);
src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp line 6619:
> 6617: __ set_last_Java_frame(sp, rfp, lr, rscratch1);
> 6618: __ enter();
> 6619: __ push_call_clobbered_registers_except(RegSet::of(r0));
Suggestion:
__ push_call_clobbered_registers_except(r0);
... everywhere.
src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp line 6621:
> 6619: __ push_call_clobbered_registers_except(RegSet::of(r0));
> 6620: __ call_VM_leaf(CAST_FROM_FN_PTR(address, oopDesc::load_nklass_runtime), 1);
> 6621: __ pop_call_clobbered_registers_except(RegSet::of(r0));
Suggestion:
__ pop_call_clobbered_registers_except(r0);
src/hotspot/share/oops/oop.hpp line 312:
> 310: #ifdef _LP64
> 311: static int nklass_offset_in_bytes() {
> 312: assert(markWord::klass_shift % 8 == 0, "klass_shift must be multiple of 8");
Suggestion:
STATIC_ASSERT(markWord::klass_shift % 8 == 0, "klass_shift must be multiple of 8");
-------------
PR: https://git.openjdk.java.net/lilliput/pull/36
More information about the lilliput-dev
mailing list