@@ -73,11 +73,31 @@ class VM_Version : public Abstract_VM_Version {
73
73
virtual void update_flag () = 0;
74
74
};
75
75
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 ) \
77
90
void update_flag () { \
78
91
assert (enabled (), " Must be." ); \
92
+ /* dep must be declared before */ \
93
+ assert ((uintptr_t )(this ) > \
94
+ (uintptr_t )(&dep), " Invalid" );\
79
95
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
+ } \
81
101
} else { \
82
102
/* Sync CPU features with flags */ \
83
103
if (!flag) { \
@@ -138,46 +158,47 @@ class VM_Version : public Abstract_VM_Version {
138
158
139
159
#define RV_NO_FLAG_BIT (BitsPerWord+1 ) // nth_bit will return 0 on values larger than BitsPerWord
140
160
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) \
181
202
182
203
#define DECLARE_RV_FEATURE (NAME, PRETTY, BIT, FSTRING, FLAGF ) \
183
204
struct NAME ##RVFeatureValue : public RVFeatureValue { \
0 commit comments