RFR: 8359965: Enable paired pushp and popp instruction usage for APX enabled CPUs
Jatin Bhateja
jbhateja at openjdk.org
Tue Jul 1 06:45:42 UTC 2025
On Tue, 1 Jul 2025 06:11:29 GMT, Jatin Bhateja <jbhateja 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.
>
> src/hotspot/cpu/x86/macroAssembler_x86.cpp line 807:
>
>> 805:
>> 806: void MacroAssembler::pop(Register dst, bool is_pair) {
>> 807: if (is_pair && VM_Version::supports_apx_f()) {
>
> Same as above, new argument suggestion: please use has_matching_push.
> I understand your purpose here is to delegate the responsibility of balancing of PPX pair to the user.
For a cleaner interface, I think we can also maintain a RAII style APXPushPopPairTracker in the stub snippets using push/pop instruction sequence and wrap the actual assembler call underneath. The idea here is to catch the balancing error upfront as PPX is purely a performance hint. Instructions with this hint have the same functional semantics as those without. PPX hints set by the compiler that violate the balancing rule may turn off the PPX
optimization, but they will not affect program semantics..
class APXPushPopPairTracker {
private:
int _counter;
public:
APXPushPopPairTracker() _counter(0) {
}
~APXPushPopPairTracker() {
assert(_counter == 0, "Push/pop pair mismatch");
}
void push(Register reg, bool has_matching_pop) {
if (has_matching_pop && VM_Version::supports_apx_f()) {
Assembler::pushp(reg);
incrementCounter();
} else {
Assembler::push(reg);
}
}
void pop(Register reg, bool has_matching_push) {
if (has_matching_push && VM_Version::supports_apx_f()) {
Assembler::popp(reg);
decrementCounter();
} else {
Assembler::pop(reg);
}
}
void incrementCounter() {
_counter++;
}
void decrementCounter() {
_counter--;
}
}
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/25889#discussion_r2176549150
More information about the hotspot-compiler-dev
mailing list