Skip to content

Commit ecd2d83

Browse files
author
Evgeny Astigeevich
committed
8359435: AArch64: add support for SB instruction to MacroAssembler::spin_wait
Reviewed-by: shade, aph
1 parent d8f9b18 commit ecd2d83

File tree

12 files changed

+331
-298
lines changed

12 files changed

+331
-298
lines changed

src/hotspot/cpu/aarch64/assembler_aarch64.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,10 @@ class Assembler : public AbstractAssembler {
11361136
system(0b00, 0b011, 0b00011, SY, 0b110);
11371137
}
11381138

1139+
void sb() {
1140+
system(0b00, 0b011, 0b00011, 0b0000, 0b111);
1141+
}
1142+
11391143
void sys(int op1, int CRn, int CRm, int op2,
11401144
Register rt = as_Register(0b11111)) {
11411145
system(0b01, op1, CRn, CRm, op2, rt);

src/hotspot/cpu/aarch64/globals_aarch64.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ define_pd_global(intx, InlineSmallCode, 1000);
117117
product(ccstr, OnSpinWaitInst, "yield", DIAGNOSTIC, \
118118
"The instruction to use to implement " \
119119
"java.lang.Thread.onSpinWait()." \
120-
"Options: none, nop, isb, yield.") \
120+
"Options: none, nop, isb, yield, sb.") \
121121
product(uint, OnSpinWaitInstCount, 1, DIAGNOSTIC, \
122122
"The number of OnSpinWaitInst instructions to generate." \
123123
"It cannot be used with OnSpinWaitInst=none.") \

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6814,6 +6814,9 @@ void MacroAssembler::spin_wait() {
68146814
case SpinWait::YIELD:
68156815
yield();
68166816
break;
6817+
case SpinWait::SB:
6818+
sb();
6819+
break;
68176820
default:
68186821
ShouldNotReachHere();
68196822
}

src/hotspot/cpu/aarch64/spin_wait_aarch64.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ class SpinWait {
3131
NONE = -1,
3232
NOP,
3333
ISB,
34-
YIELD
34+
YIELD,
35+
SB
3536
};
3637

3738
private:

src/hotspot/cpu/aarch64/vm_version_aarch64.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,13 @@ static SpinWait get_spin_wait_desc() {
5757
return SpinWait(SpinWait::ISB, OnSpinWaitInstCount);
5858
} else if (strcmp(OnSpinWaitInst, "yield") == 0) {
5959
return SpinWait(SpinWait::YIELD, OnSpinWaitInstCount);
60+
} else if (strcmp(OnSpinWaitInst, "sb") == 0) {
61+
if (!VM_Version::supports_sb()) {
62+
vm_exit_during_initialization("OnSpinWaitInst is SB but current CPU does not support SB instruction");
63+
}
64+
return SpinWait(SpinWait::SB, OnSpinWaitInstCount);
6065
} else if (strcmp(OnSpinWaitInst, "none") != 0) {
61-
vm_exit_during_initialization("The options for OnSpinWaitInst are nop, isb, yield, and none", OnSpinWaitInst);
66+
vm_exit_during_initialization("The options for OnSpinWaitInst are nop, isb, yield, sb, and none", OnSpinWaitInst);
6267
}
6368

6469
if (!FLAG_IS_DEFAULT(OnSpinWaitInstCount) && OnSpinWaitInstCount > 0) {

src/hotspot/cpu/aarch64/vm_version_aarch64.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ enum Ampere_CPU_Model {
131131
decl(SHA3, sha3, 17) \
132132
decl(SHA512, sha512, 21) \
133133
decl(SVE, sve, 22) \
134+
decl(SB, sb, 29) \
134135
decl(PACA, paca, 30) \
135136
/* flags above must follow Linux HWCAP */ \
136137
decl(SVEBITPERM, svebitperm, 27) \

src/hotspot/os_cpu/bsd_aarch64/vm_version_bsd_aarch64.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ void VM_Version::get_os_cpu_info() {
9292
cpu_has("hw.optional.armv8_2_sha3")) {
9393
_features |= CPU_SHA3;
9494
}
95+
if (cpu_has("hw.optional.arm.FEAT_SB")) {
96+
_features |= CPU_SB;
97+
}
9598

9699
int cache_line_size;
97100
int hw_conf_cache_line[] = { CTL_HW, HW_CACHELINE };

src/hotspot/os_cpu/linux_aarch64/vm_version_linux_aarch64.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@
7171
#define HWCAP_SVE (1 << 22)
7272
#endif
7373

74+
#ifndef HWCAP_SB
75+
#define HWCAP_SB (1 << 29)
76+
#endif
77+
7478
#ifndef HWCAP_PACA
7579
#define HWCAP_PACA (1 << 30)
7680
#endif
@@ -143,6 +147,7 @@ void VM_Version::get_os_cpu_info() {
143147
HWCAP_SHA3 |
144148
HWCAP_SHA512 |
145149
HWCAP_SVE |
150+
HWCAP_SB |
146151
HWCAP_PACA |
147152
HWCAP_FPHP |
148153
HWCAP_ASIMDHP);

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/aarch64/AArch64.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ public enum CPUFeature implements CPUFeatureName {
179179
SHA3,
180180
SHA512,
181181
SVE,
182+
SB,
182183
PACA,
183184
SVEBITPERM,
184185
SVE2,

test/hotspot/gtest/aarch64/aarch64-asmtest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1605,7 +1605,7 @@ def generate(kind, names):
16051605
generate (Op, ["nop", "yield", "wfe", "sev", "sevl",
16061606
"autia1716", "autiasp", "autiaz", "autib1716", "autibsp", "autibz",
16071607
"pacia1716", "paciasp", "paciaz", "pacib1716", "pacibsp", "pacibz",
1608-
"eret", "drps", "isb",])
1608+
"eret", "drps", "isb", "sb",])
16091609

16101610
# Ensure the "i" is not stripped off the end of the instruction
16111611
generate (PostfixExceptionOp, ["wfi", "xpaclri"])

0 commit comments

Comments
 (0)