RFR: 8362193: Re-work MacOS/AArch64 SpinPause to handle SB [v3]
Evgeny Astigeevich
eastigeevich at openjdk.org
Mon Jul 21 21:55:26 UTC 2025
On Mon, 21 Jul 2025 16:25:32 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:
>>> I agree with you. I proposed to use the switch when JDK-8321371 was being reviewed: [#16994 (comment)](https://github.com/openjdk/jdk/pull/16994#issuecomment-1865147655)
>>>
>>> Frederick (@fbredber) wanted to avoid branches: [#16994 (comment)](https://github.com/openjdk/jdk/pull/16994#issuecomment-1865955740)
>>
>> You're getting branches, one way or the other.
>
> I actually like the compiler version, especially if we lay out enums in some sane order. In current inline assembly, adding a new case makes some branches _longer_; probably irrelevant on this small scale, but still. With compiler-compiled switch, we effectively get new additions like `SB` for "free", as every other label stays in place.
I put cases in enum order. On my M3 Pro I get:
libjvm.dylib[0x8a75e8] <+0>: stp x29, x30, [sp, #-0x10]!
libjvm.dylib[0x8a75ec] <+4>: mov x29, sp
libjvm.dylib[0x8a75f0] <+8>: adrp x8, 1417
libjvm.dylib[0x8a75f4] <+12>: add x8, x8, #0x80 ; VM_Version::_spin_wait
libjvm.dylib[0x8a75f8] <+16>: ldr w8, [x8]
libjvm.dylib[0x8a75fc] <+20>: cmp w8, #0x1
libjvm.dylib[0x8a7600] <+24>: b.gt 0x8a7620 ; <+56> at os_bsd_aarch64.cpp:534:5
libjvm.dylib[0x8a7604] <+28>: cbz w8, 0x8a7640 ; <+88> at os_bsd_aarch64.cpp:538:7
libjvm.dylib[0x8a7608] <+32>: cmp w8, #0x1
libjvm.dylib[0x8a760c] <+36>: b.ne 0x8a7614 ; <+44> at os_bsd_aarch64.cpp:555:5
libjvm.dylib[0x8a7610] <+40>: isb
libjvm.dylib[0x8a7614] <+44>: mov w0, #0x1 ; =1
libjvm.dylib[0x8a7618] <+48>: ldp x29, x30, [sp], #0x10
libjvm.dylib[0x8a761c] <+52>: ret
libjvm.dylib[0x8a7620] <+56>: cmp w8, #0x2
libjvm.dylib[0x8a7624] <+60>: b.eq 0x8a7650 ; <+104> at os_bsd_aarch64.cpp:544:7
libjvm.dylib[0x8a7628] <+64>: cmp w8, #0x3
libjvm.dylib[0x8a762c] <+68>: b.ne 0x8a7614 ; <+44> at os_bsd_aarch64.cpp:555:5
libjvm.dylib[0x8a7630] <+72>: sb
libjvm.dylib[0x8a7634] <+76>: mov w0, #0x1 ; =1
libjvm.dylib[0x8a7638] <+80>: ldp x29, x30, [sp], #0x10
libjvm.dylib[0x8a763c] <+84>: ret
libjvm.dylib[0x8a7640] <+88>: nop
libjvm.dylib[0x8a7644] <+92>: mov w0, #0x1 ; =1
libjvm.dylib[0x8a7648] <+96>: ldp x29, x30, [sp], #0x10
libjvm.dylib[0x8a764c] <+100>: ret
libjvm.dylib[0x8a7650] <+104>: yield
libjvm.dylib[0x8a7654] <+108>: mov w0, #0x1 ; =1
libjvm.dylib[0x8a7658] <+112>: ldp x29, x30, [sp], #0x10
libjvm.dylib[0x8a765c] <+116>: ret
It's interesting. My code is binary search tree version.
It does not depend on the order of the cases.
I could not get jump table version you've got.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26387#discussion_r2220438239
More information about the hotspot-dev
mailing list