RFR: 8294492: RISC-V: Use li instead of patchable movptr at non-patchable callsites [v4]

Fei Yang fyang at openjdk.org
Wed Sep 28 13:57:25 UTC 2022


On Wed, 28 Sep 2022 12:35:31 GMT, Xiaolin Zheng <xlinzheng at openjdk.org> wrote:

>> A cleanup which can also reduce some code size. The main purpose is to separate the current mixed movptr usages: movptr's semantics allow it to be used for fixed-length patchable addresses. In the current backend several callsites which are not patchable use movptr (6 instructions) as well, but that's unnecessary for we can use li(1~6 instructions) to substitute them.
>> 
>> This patch extracts the last 12-bit offset from the li(), a recursive function, to merge it into the rest "jalr/ld/sd..." that can accept a 12-bit offset as an operand, same as the movptr_with_offset before.
>> 
>> Originally some non-patchable callsites:
>> 
>> ;; 0x401ab1dc40
>> 0x000000401372b324:   lui	t0,0x201
>> 0x000000401372b328:   addi	t0,t0,-680 # 0x0000000000200d58
>> 0x000000401372b32c:   slli	t0,t0,0xb
>> 0x000000401372b32e:   addi	t0,t0,1905
>> 0x000000401372b332:   slli	t0,t0,0x6
>> 0x000000401372b334:   jalr	t0
>> 
>> Now:
>> 
>> 0x000000401b2bd9f4:   lui	t0,0x4003
>> 0x000000401b2bd9f8:   addiw	t0,t0,-1275
>> 0x000000401b2bd9fc:   slli	t0,t0,0xc
>> 0x000000401b2bda00:   jalr	1080(t0) # 0x0000000004003438
>> 
>> Not so much, but the main purpose is to clarify the usage of movptr and li.
>> 
>> The first commit has gone through a hotspot tier1~tier4; the other ones are testing under a hotspot tier1.
>
> Xiaolin Zheng has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Comments, with one &

src/hotspot/cpu/riscv/macroAssembler_riscv.hpp line 534:

> 532:     // Split address into a lower 12-bit sign-extended offset and the remainder,
> 533:     // so that the offset could be encoded in jalr or load/store instruction.
> 534:     offset = ((int32_t)(uintptr_t)addr << 20) >> 20;

Would you mind one more tweak here? Considering that the type of 'offset' is int32_t, I think it will be more readable here if we convert 'addr' into int64_t type instead of uintptr_t.

-------------

PR: https://git.openjdk.org/jdk/pull/10462


More information about the shenandoah-dev mailing list