Skip to content

Commit 7853415

Browse files
committed
8352218: RISC-V: Zvfh requires RVV
Reviewed-by: fyang, mli
1 parent 2483340 commit 7853415

File tree

2 files changed

+87
-61
lines changed

2 files changed

+87
-61
lines changed

src/hotspot/cpu/riscv/vm_version_riscv.cpp

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,30 @@ void VM_Version::common_initialize() {
220220
warning("CRC32C intrinsics are not available on this CPU.");
221221
FLAG_SET_DEFAULT(UseCRC32CIntrinsics, false);
222222
}
223+
224+
// UseZvbb (depends on RVV).
225+
if (UseZvbb && !UseRVV) {
226+
warning("Cannot enable UseZvbb on cpu without RVV support.");
227+
FLAG_SET_DEFAULT(UseZvbb, false);
228+
}
229+
230+
// UseZvbc (depends on RVV).
231+
if (UseZvbc && !UseRVV) {
232+
warning("Cannot enable UseZvbc on cpu without RVV support.");
233+
FLAG_SET_DEFAULT(UseZvbc, false);
234+
}
235+
236+
// UseZvkn (depends on RVV).
237+
if (UseZvkn && !UseRVV) {
238+
warning("Cannot enable UseZvkn on cpu without RVV support.");
239+
FLAG_SET_DEFAULT(UseZvkn, false);
240+
}
241+
242+
// UseZvfh (depends on RVV)
243+
if (UseZvfh && !UseRVV) {
244+
warning("Cannot enable UseZvfh on cpu without RVV support.");
245+
FLAG_SET_DEFAULT(UseZvfh, false);
246+
}
223247
}
224248

225249
#ifdef COMPILER2
@@ -345,20 +369,6 @@ void VM_Version::c2_initialize() {
345369
FLAG_SET_DEFAULT(UseChaCha20Intrinsics, false);
346370
}
347371

348-
// UseZvbb (depends on RVV).
349-
if (UseZvbb && !UseRVV) {
350-
FLAG_SET_DEFAULT(UseZvbb, false);
351-
warning("Cannot enable UseZvbb on cpu without RVV support.");
352-
}
353-
354-
// UseZvbc (depends on RVV).
355-
if (UseZvbc && !UseRVV) {
356-
if (!FLAG_IS_DEFAULT(UseZvbc)) {
357-
warning("Cannot enable UseZvbc on cpu without RVV support.");
358-
}
359-
FLAG_SET_DEFAULT(UseZvbc, false);
360-
}
361-
362372
if (!AvoidUnalignedAccesses) {
363373
if (FLAG_IS_DEFAULT(UseMD5Intrinsics)) {
364374
FLAG_SET_DEFAULT(UseMD5Intrinsics, true);
@@ -383,11 +393,6 @@ void VM_Version::c2_initialize() {
383393
FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
384394
}
385395

386-
// UseZvkn (depends on RVV) and SHA-2.
387-
if (UseZvkn && !UseRVV) {
388-
FLAG_SET_DEFAULT(UseZvkn, false);
389-
warning("Cannot enable Zvkn on cpu without RVV support.");
390-
}
391396
// SHA-2, depends on Zvkn.
392397
if (UseSHA) {
393398
if (UseZvkn) {

src/hotspot/cpu/riscv/vm_version_riscv.hpp

Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,31 @@ class VM_Version : public Abstract_VM_Version {
7373
virtual void update_flag() = 0;
7474
};
7575

76-
#define UPDATE_DEFAULT(flag) \
76+
#define UPDATE_DEFAULT(flag) \
77+
void update_flag() { \
78+
assert(enabled(), "Must be."); \
79+
if (FLAG_IS_DEFAULT(flag)) { \
80+
FLAG_SET_DEFAULT(flag, true); \
81+
} else { \
82+
/* Sync CPU features with flags */ \
83+
if (!flag) { \
84+
disable_feature(); \
85+
} \
86+
} \
87+
} \
88+
89+
#define UPDATE_DEFAULT_DEP(flag, dep) \
7790
void update_flag() { \
7891
assert(enabled(), "Must be."); \
92+
/* dep must be declared before */ \
93+
assert((uintptr_t)(this) > \
94+
(uintptr_t)(&dep), "Invalid");\
7995
if (FLAG_IS_DEFAULT(flag)) { \
80-
FLAG_SET_DEFAULT(flag, true); \
96+
if (dep.enabled()) { \
97+
FLAG_SET_DEFAULT(flag, true); \
98+
} else { \
99+
FLAG_SET_DEFAULT(flag, false); \
100+
} \
81101
} else { \
82102
/* Sync CPU features with flags */ \
83103
if (!flag) { \
@@ -138,46 +158,47 @@ class VM_Version : public Abstract_VM_Version {
138158

139159
#define RV_NO_FLAG_BIT (BitsPerWord+1) // nth_bit will return 0 on values larger than BitsPerWord
140160

141-
// declaration name , extension name, bit pos ,in str, mapped flag)
142-
#define RV_FEATURE_FLAGS(decl) \
143-
decl(ext_I , "i" , ('I' - 'A'), true , NO_UPDATE_DEFAULT) \
144-
decl(ext_M , "m" , ('M' - 'A'), true , NO_UPDATE_DEFAULT) \
145-
decl(ext_A , "a" , ('A' - 'A'), true , NO_UPDATE_DEFAULT) \
146-
decl(ext_F , "f" , ('F' - 'A'), true , NO_UPDATE_DEFAULT) \
147-
decl(ext_D , "d" , ('D' - 'A'), true , NO_UPDATE_DEFAULT) \
148-
decl(ext_C , "c" , ('C' - 'A'), true , UPDATE_DEFAULT(UseRVC)) \
149-
decl(ext_Q , "q" , ('Q' - 'A'), true , NO_UPDATE_DEFAULT) \
150-
decl(ext_H , "h" , ('H' - 'A'), true , NO_UPDATE_DEFAULT) \
151-
decl(ext_V , "v" , ('V' - 'A'), true , UPDATE_DEFAULT(UseRVV)) \
152-
decl(ext_Zicbom , "Zicbom" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicbom)) \
153-
decl(ext_Zicboz , "Zicboz" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicboz)) \
154-
decl(ext_Zicbop , "Zicbop" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicbop)) \
155-
decl(ext_Zba , "Zba" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZba)) \
156-
decl(ext_Zbb , "Zbb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZbb)) \
157-
decl(ext_Zbc , "Zbc" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
158-
decl(ext_Zbs , "Zbs" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZbs)) \
159-
decl(ext_Zbkb , "Zbkb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZbkb)) \
160-
decl(ext_Zcb , "Zcb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZcb)) \
161-
decl(ext_Zfa , "Zfa" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfa)) \
162-
decl(ext_Zfh , "Zfh" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfh)) \
163-
decl(ext_Zfhmin , "Zfhmin" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfhmin)) \
164-
decl(ext_Zicsr , "Zicsr" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
165-
decl(ext_Zicntr , "Zicntr" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
166-
decl(ext_Zifencei , "Zifencei" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
167-
decl(ext_Zic64b , "Zic64b" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZic64b)) \
168-
decl(ext_Ztso , "Ztso" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZtso)) \
169-
decl(ext_Zihintpause , "Zihintpause" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZihintpause)) \
170-
decl(ext_Zacas , "Zacas" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZacas)) \
171-
decl(ext_Zvbb , "Zvbb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZvbb)) \
172-
decl(ext_Zvbc , "Zvbc" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZvbc)) \
173-
decl(ext_Zvfh , "Zvfh" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZvfh)) \
174-
decl(ext_Zvkn , "Zvkn" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZvkn)) \
175-
decl(ext_Zicond , "Zicond" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicond)) \
176-
decl(mvendorid , "VendorId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
177-
decl(marchid , "ArchId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
178-
decl(mimpid , "ImpId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
179-
decl(unaligned_access, "Unaligned" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
180-
decl(satp_mode , "SATP" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
161+
// Note: the order matters, depender should be after their dependee. E.g. ext_V before ext_Zvbb.
162+
// declaration name , extension name, bit pos ,in str, mapped flag)
163+
#define RV_FEATURE_FLAGS(decl) \
164+
decl(ext_I , "i" , ('I' - 'A'), true , NO_UPDATE_DEFAULT) \
165+
decl(ext_M , "m" , ('M' - 'A'), true , NO_UPDATE_DEFAULT) \
166+
decl(ext_A , "a" , ('A' - 'A'), true , NO_UPDATE_DEFAULT) \
167+
decl(ext_F , "f" , ('F' - 'A'), true , NO_UPDATE_DEFAULT) \
168+
decl(ext_D , "d" , ('D' - 'A'), true , NO_UPDATE_DEFAULT) \
169+
decl(ext_C , "c" , ('C' - 'A'), true , UPDATE_DEFAULT(UseRVC)) \
170+
decl(ext_Q , "q" , ('Q' - 'A'), true , NO_UPDATE_DEFAULT) \
171+
decl(ext_H , "h" , ('H' - 'A'), true , NO_UPDATE_DEFAULT) \
172+
decl(ext_V , "v" , ('V' - 'A'), true , UPDATE_DEFAULT(UseRVV)) \
173+
decl(ext_Zicbom , "Zicbom" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicbom)) \
174+
decl(ext_Zicboz , "Zicboz" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicboz)) \
175+
decl(ext_Zicbop , "Zicbop" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicbop)) \
176+
decl(ext_Zba , "Zba" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZba)) \
177+
decl(ext_Zbb , "Zbb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZbb)) \
178+
decl(ext_Zbc , "Zbc" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
179+
decl(ext_Zbs , "Zbs" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZbs)) \
180+
decl(ext_Zbkb , "Zbkb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZbkb)) \
181+
decl(ext_Zcb , "Zcb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZcb)) \
182+
decl(ext_Zfa , "Zfa" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfa)) \
183+
decl(ext_Zfh , "Zfh" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfh)) \
184+
decl(ext_Zfhmin , "Zfhmin" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfhmin)) \
185+
decl(ext_Zicsr , "Zicsr" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
186+
decl(ext_Zicntr , "Zicntr" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
187+
decl(ext_Zifencei , "Zifencei" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
188+
decl(ext_Zic64b , "Zic64b" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZic64b)) \
189+
decl(ext_Ztso , "Ztso" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZtso)) \
190+
decl(ext_Zihintpause , "Zihintpause" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZihintpause)) \
191+
decl(ext_Zacas , "Zacas" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZacas)) \
192+
decl(ext_Zvbb , "Zvbb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT_DEP(UseZvbb, ext_V)) \
193+
decl(ext_Zvbc , "Zvbc" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT_DEP(UseZvbc, ext_V)) \
194+
decl(ext_Zvfh , "Zvfh" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT_DEP(UseZvfh, ext_V)) \
195+
decl(ext_Zvkn , "Zvkn" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT_DEP(UseZvkn, ext_V)) \
196+
decl(ext_Zicond , "Zicond" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicond)) \
197+
decl(mvendorid , "VendorId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
198+
decl(marchid , "ArchId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
199+
decl(mimpid , "ImpId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
200+
decl(unaligned_access, "Unaligned" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
201+
decl(satp_mode , "SATP" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
181202

182203
#define DECLARE_RV_FEATURE(NAME, PRETTY, BIT, FSTRING, FLAGF) \
183204
struct NAME##RVFeatureValue : public RVFeatureValue { \

0 commit comments

Comments
 (0)