[master] RFR: 8303813: [Lilliput] (AArch64) Use tbz instead of tst and br in load_klass()
Roman Kennke
rkennke at openjdk.org
Wed Mar 8 21:50:40 UTC 2023
On Wed, 8 Mar 2023 21:39:50 GMT, Paul Hohensee <phh at openjdk.org> wrote:
>> In the implementation of load_klass(), we have a test-and-branch idiom:
>>
>>
>> tst(dst, markWord::monitor_value);
>> br(Assembler::EQ, fast);
>>
>>
>> We can make this better:
>>
>> `tbz(dst, exact_log2(markWord::monitor_value), fast);
>> `
>> This is not only smaller and perhaps a little faster, it also has the advantage that it doesn't touch the condition flags. This is relevant in at least one place: in verify_oop() the condition flag is alive across the load_klass() call and one jtreg test (runtime/CheckUnhandledOops/TestVerifyOops.java) is failing because of that.
>>
>> Testing:
>> - [x] tier1
>
> src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp line 4266:
>
>> 4264: // Check if we can take the (common) fast path, if obj is unlocked.
>> 4265: ldr(dst, Address(src, oopDesc::mark_offset_in_bytes()));
>> 4266: tbz(dst, exact_log2(markWord::monitor_value), fast);
>
> This is a bit fragile because monitor_value must be a power of 2 for it to work.
Yes, and it is (and hopefully, always will be - or else that code would need to be changed anyway). exact_log2() has an assert that checks exactly that.
-------------
PR: https://git.openjdk.org/lilliput/pull/78
More information about the lilliput-dev
mailing list