RFR: 8186670: Implement _onSpinWait() intrinsic for AArch64

Andrew Haley aph at openjdk.java.net
Sat Sep 18 09:40:44 UTC 2021


On Fri, 17 Sep 2021 11:26:03 GMT, Evgeny Astigeevich <github.com+42899633+eastig at openjdk.org> wrote:

> This PR is a follow-up on the discussion [“RFC: AArch64: Implementing spin pauses with ISB”](https://mail.openjdk.java.net/pipermail/hotspot-dev/2021-August/054033.html).
> 
> It adds the option `UsePauseImpl=value`, where `value` can be:
> 
> - `none`: no implementation for spin pauses. This is the default value.
> - `Nnop`: use `nop` instruction for spin pauses. Optional `N` can be `2..9` to specify a number of `nop` instructions.
> - `Nisb`: use `isb` instruction for spin pauses. Optional `N` can be `2..9` to specify a number of `isb` instructions.
> - `Nyield`: use `yield` instruction for spin pauses. Optional `N` can be `2..9` to specify a number of `yield` instructions.
> 
> The code for the `Thread.onSpinWait` intrinsic is generated based on the value of `UsePauseImpl`.
> 
> Testing:
> 
> - `make test TEST="gtest"`: Passed
> - `make run-test TEST="tier1"`: Passed
> - `make run-test TEST="tier2"`: Passed
> - `make run-test TEST=hotspot/jtreg/compiler/onSpinWait`: Passed

src/hotspot/cpu/aarch64/aarch64.ad line 14368:

> 14366:         for (unsigned int i = 1; i < VM_Version::pause_impl_desc().inst_count(); ++i) {
> 14367:           $$emit$$"\tisb\n"
> 14368:         }

The code to generate n copies of a pause_impl instruction would be much happier in the MacroAssembler.

src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp line 2988:

> 2986: void LIR_Assembler::on_spin_wait() {
> 2987:   switch (VM_Version::pause_impl_desc().inst()) {
> 2988:     case NOP:

Again, please push this into a macro, called from c1 and c2, that does the right thing for the current machine.

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

PR: https://git.openjdk.java.net/jdk/pull/5562


More information about the hotspot-dev mailing list