RFR: 8338383: Implement JEP 491: Synchronize Virtual Threads without Pinning
Patricio Chilano Mateo
pchilanomate at openjdk.org
Wed Nov 6 17:40:05 UTC 2024
On Tue, 22 Oct 2024 02:14:23 GMT, Patricio Chilano Mateo <pchilanomate at openjdk.org> wrote:
>> src/hotspot/cpu/x86/assembler_x86.cpp line 2866:
>>
>>> 2864: emit_int32(0);
>>> 2865: }
>>> 2866: }
>>
>> Is it possible to make this more general and explicit instead of a sequence of bytes?
>>
>> Something along the lines of:
>> ```C++
>> const address tar = L.is_bound() ? target(L) : pc();
>> const Address adr = Address(checked_cast<int32_t>(tar - pc()), tar, relocInfo::none);
>>
>> InstructionMark im(this);
>> emit_prefix_and_int8(get_prefixq(adr, dst), (unsigned char)0x8D);
>> if (!L.is_bound()) {
>> // Patch @0x8D opcode
>> L.add_patch_at(code(), CodeBuffer::locator(offset() - 1, sect()));
>> }
>> // Register and [rip+disp] operand
>> emit_modrm(0b00, raw_encode(dst), 0b101);
>> // Adjust displacement by sizeof lea instruction
>> int32_t disp = adr.disp() - checked_cast<int32_t>(pc() - inst_mark() + sizeof(int32_t));
>> assert(is_simm32(disp), "must be 32bit offset [rip+offset]");
>> emit_int32(disp);
>>
>>
>> and then in `pd_patch_instruction` simply match `op == 0x8D /* lea */`.
>
> I'll test it out but looks fine.
Done. I simplified the code a bit to make it more readable. It also follows the current style of keeping the cases separate.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21565#discussion_r1811237106
More information about the core-libs-dev
mailing list