RFR: 8359965: Enable paired pushp and popp instruction usage for APX enabled CPUs [v2]

Sandhya Viswanathan sviswanathan at openjdk.org
Tue Jul 15 23:22:41 UTC 2025


On Tue, 8 Jul 2025 22:44:55 GMT, Srinivas Vamsi Parasa <sparasa at openjdk.org> wrote:

>> The goal of this PR is to enhance the existing x86 assembly stubs using PUSH and POP instructions with paired PUSHP/POPP instructions which are part of Intel APX technology.
>> 
>> In Intel APX, the PUSHP and POPP instructions are modern, compact replacements for the legacy PUSH and POP, designed to work seamlessly with the expanded set of 32 general-purpose registers (R0–R31). Unlike their predecessors, they use the new APX (REX2-based) encoding, enabling more uniform and efficient instruction formats. These instructions improve code density, simplify register access, and are optimized for performance on APX-enabled CPUs.
>> 
>> Pairing PUSHP and POPP in Intel APX provides CPU-level benefits such as more efficient instruction decoding, better stack pointer tracking, and improved register dependency management. Their uniform encoding allows for streamlined execution, reduced pipeline stalls, and potential micro-op fusion, all of which enhance performance and power efficiency. This pairing helps the processor optimize speculative execution and register lifetimes, making code faster and more scalable on modern architectures.
>
> Srinivas Vamsi Parasa has updated the pull request incrementally with one additional commit since the last revision:
> 
>   rename to paired_push and paired_pop

src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp line 112:

> 110:     } else {
> 111:       if (_result != rax) {
> 112:         __ paired_push(rax);

No need to use paired_push on this else path as it is for non APX.

src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp line 198:

> 196:       }
> 197:     } else {
> 198:       __ paired_pop(r11);

No need to use paired pop on this else path as this is for non-APX.

src/hotspot/cpu/x86/vm_version_x86.cpp line 156:

> 154:     // rcx and rdx are first and second argument registers on windows
> 155: 
> 156:     __ paired_push(rbp);

We should not use paired push/pop in vm_version_x86.cpp.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/25889#discussion_r2208843869
PR Review Comment: https://git.openjdk.org/jdk/pull/25889#discussion_r2208845470
PR Review Comment: https://git.openjdk.org/jdk/pull/25889#discussion_r2208815480


More information about the hotspot-compiler-dev mailing list