Skip to content

Commit 538a722

Browse files
committed
8368732: RISC-V: Detect support for misaligned vector access via hwprobe
Reviewed-by: mli, dzhang
1 parent c57003c commit 538a722

File tree

4 files changed

+60
-14
lines changed

4 files changed

+60
-14
lines changed

src/hotspot/cpu/riscv/vm_version_riscv.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ void VM_Version::common_initialize() {
160160

161161
if (FLAG_IS_DEFAULT(AvoidUnalignedAccesses)) {
162162
FLAG_SET_DEFAULT(AvoidUnalignedAccesses,
163-
unaligned_access.value() != MISALIGNED_FAST);
163+
unaligned_scalar.value() != MISALIGNED_SCALAR_FAST);
164164
}
165165

166166
if (!AvoidUnalignedAccesses) {
@@ -175,7 +175,12 @@ void VM_Version::common_initialize() {
175175
// This machine has fast unaligned memory accesses
176176
if (FLAG_IS_DEFAULT(UseUnalignedAccesses)) {
177177
FLAG_SET_DEFAULT(UseUnalignedAccesses,
178-
unaligned_access.value() == MISALIGNED_FAST);
178+
(unaligned_scalar.value() == MISALIGNED_SCALAR_FAST));
179+
}
180+
181+
if (FLAG_IS_DEFAULT(AlignVector)) {
182+
FLAG_SET_DEFAULT(AlignVector,
183+
unaligned_vector.value() != MISALIGNED_VECTOR_FAST);
179184
}
180185

181186
#ifdef __riscv_ztso

src/hotspot/cpu/riscv/vm_version_riscv.hpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,8 @@ class VM_Version : public Abstract_VM_Version {
227227
// mvendorid Manufactory JEDEC id encoded, ISA vol 2 3.1.2..
228228
// marchid Id for microarch. Mvendorid plus marchid uniquely identify the microarch.
229229
// mimpid A unique encoding of the version of the processor implementation.
230-
// unaligned_access Unaligned memory accesses (unknown, unspported, emulated, slow, firmware, fast)
230+
// unaligned_scalar Performance of misaligned scalar accesses (unknown, emulated, slow, fast, unsupported)
231+
// unaligned_vector Performance of misaligned vector accesses (unknown, unspported, slow, fast)
231232
// satp mode SATP bits (number of virtual addr bits) mbare, sv39, sv48, sv57, sv64
232233

233234
public:
@@ -287,11 +288,12 @@ class VM_Version : public Abstract_VM_Version {
287288
// Non-extension features
288289
//
289290
#define RV_NON_EXT_FEATURE_FLAGS(decl) \
290-
decl(unaligned_access , Unaligned , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
291291
decl(mvendorid , VendorId , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
292292
decl(marchid , ArchId , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
293293
decl(mimpid , ImpId , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
294294
decl(satp_mode , SATP , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
295+
decl(unaligned_scalar , UnalignedScalar , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
296+
decl(unaligned_vector , UnalignedVector , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
295297
decl(zicboz_block_size, ZicbozBlockSize , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
296298

297299
#define DECLARE_RV_NON_EXT_FEATURE(NAME, PRETTY, LINUX_BIT, FSTRING, FLAGF) \
@@ -432,12 +434,19 @@ class VM_Version : public Abstract_VM_Version {
432434
static VM_MODE parse_satp_mode(const char* vm_mode);
433435

434436
// Values from riscv_hwprobe()
435-
enum UNALIGNED_ACCESS : int {
436-
MISALIGNED_UNKNOWN = 0,
437-
MISALIGNED_EMULATED = 1,
438-
MISALIGNED_SLOW = 2,
439-
MISALIGNED_FAST = 3,
440-
MISALIGNED_UNSUPPORTED = 4
437+
enum UNALIGNED_SCALAR_ACCESS : int {
438+
MISALIGNED_SCALAR_UNKNOWN = 0,
439+
MISALIGNED_SCALAR_EMULATED = 1,
440+
MISALIGNED_SCALAR_SLOW = 2,
441+
MISALIGNED_SCALAR_FAST = 3,
442+
MISALIGNED_SCALAR_UNSUPPORTED = 4
443+
};
444+
445+
enum UNALIGNED_VECTOR_ACCESS : int {
446+
MISALIGNED_VECTOR_UNKNOWN = 0,
447+
MISALIGNED_VECTOR_SLOW = 2,
448+
MISALIGNED_VECTOR_FAST = 3,
449+
MISALIGNED_VECTOR_UNSUPPORTED = 4
441450
};
442451

443452
// Null terminated list

src/hotspot/os_cpu/linux_riscv/riscv_hwprobe.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,24 @@
8989
#define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
9090
#define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
9191

92-
#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
92+
#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
93+
94+
#define RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS 7
95+
96+
#define RISCV_HWPROBE_KEY_TIME_CSR_FREQ 8
97+
98+
#define RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF 9
99+
#define RISCV_HWPROBE_MISALIGNED_SCALAR_UNKNOWN 0
100+
#define RISCV_HWPROBE_MISALIGNED_SCALAR_EMULATED 1
101+
#define RISCV_HWPROBE_MISALIGNED_SCALAR_SLOW 2
102+
#define RISCV_HWPROBE_MISALIGNED_SCALAR_FAST 3
103+
#define RISCV_HWPROBE_MISALIGNED_SCALAR_UNSUPPORTED 4
104+
105+
#define RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF 10
106+
#define RISCV_HWPROBE_MISALIGNED_VECTOR_UNKNOWN 0
107+
#define RISCV_HWPROBE_MISALIGNED_VECTOR_SLOW 2
108+
#define RISCV_HWPROBE_MISALIGNED_VECTOR_FAST 3
109+
#define RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED 4
93110

94111
#ifndef NR_riscv_hwprobe
95112
#ifndef NR_arch_specific_syscall
@@ -117,7 +134,11 @@ static struct riscv_hwprobe query[] = {{RISCV_HWPROBE_KEY_MVENDORID, 0},
117134
{RISCV_HWPROBE_KEY_BASE_BEHAVIOR, 0},
118135
{RISCV_HWPROBE_KEY_IMA_EXT_0, 0},
119136
{RISCV_HWPROBE_KEY_CPUPERF_0, 0},
120-
{RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE, 0}};
137+
{RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE, 0},
138+
{RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS, 0},
139+
{RISCV_HWPROBE_KEY_TIME_CSR_FREQ, 0},
140+
{RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF, 0},
141+
{RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF, 0}};
121142

122143
bool RiscvHwprobe::probe_features() {
123144
assert(!rw_hwprobe_completed, "Called twice.");
@@ -246,9 +267,20 @@ void RiscvHwprobe::add_features_from_query_result() {
246267
VM_Version::ext_Zicond.enable_feature();
247268
}
248269
#endif
270+
// RISCV_HWPROBE_KEY_CPUPERF_0 is deprecated and returns similar values
271+
// to RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF. Keep it there for backward
272+
// compatibility with old kernels.
249273
if (is_valid(RISCV_HWPROBE_KEY_CPUPERF_0)) {
250-
VM_Version::unaligned_access.enable_feature(
274+
VM_Version::unaligned_scalar.enable_feature(
251275
query[RISCV_HWPROBE_KEY_CPUPERF_0].value & RISCV_HWPROBE_MISALIGNED_MASK);
276+
} else if (is_valid(RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF)) {
277+
VM_Version::unaligned_scalar.enable_feature(
278+
query[RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF].value);
279+
}
280+
281+
if (is_valid(RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF)) {
282+
VM_Version::unaligned_vector.enable_feature(
283+
query[RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF].value);
252284
}
253285
if (is_valid(RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE)) {
254286
VM_Version::zicboz_block_size.enable_feature(query[RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE].value);

src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ void VM_Version::rivos_features() {
303303

304304
ext_Zvfh.enable_feature();
305305

306-
unaligned_access.enable_feature(MISALIGNED_FAST);
306+
unaligned_scalar.enable_feature(MISALIGNED_SCALAR_FAST);
307307
satp_mode.enable_feature(VM_SV48);
308308

309309
// Features dependent on march/mimpid.

0 commit comments

Comments
 (0)