@@ -38,6 +38,11 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
3838 else
3939 bad_isa_string (str, " ISA strings must begin with RV32 or RV64" );
4040
41+ vlen = 0 ;
42+ elen = 0 ;
43+ zvf = false ;
44+ zvd = false ;
45+
4146 switch (isa_string[4 ]) {
4247 case ' g' :
4348 // G = IMAFD_Zicsr_Zifencei, but Spike includes the latter two
@@ -70,7 +75,8 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
7075 }
7176
7277 switch (*p) {
73- case ' v' : // even rv32iv implies double float
78+ case ' v' : vlen = 128 ; elen = 64 ; zvf = true ; zvd = true ;
79+ // even rv32iv implies double float
7480 case ' q' : extension_table[' D' ] = true ;
7581 // Fall through
7682 case ' d' : extension_table[' F' ] = true ;
@@ -95,9 +101,6 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
95101 if (ext_str == " zfh" )
96102 extension_table[EXT_ZFH] = true ;
97103 } else if (ext_str == " zvfh" || ext_str == " zvfhmin" ) {
98- if (!extension_table[' V' ])
99- bad_isa_string (str, (" '" + ext_str + " ' extension requires 'V'" ).c_str ());
100-
101104 extension_table[EXT_ZVFHMIN] = true ;
102105
103106 if (ext_str == " zvfh" ) {
@@ -314,6 +317,35 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
314317 extension_table[EXT_ZICFILP] = true ;
315318 } else if (ext_str == " zicfiss" ) {
316319 extension_table[EXT_ZICFISS] = true ;
320+ } else if (ext_str.substr (0 , 3 ) == " zvl" ) {
321+ reg_t new_vlen;
322+ try {
323+ new_vlen = std::stol (ext_str.substr (3 , ext_str.size () - 4 ));
324+ } catch (std::logic_error& e) {
325+ new_vlen = 0 ;
326+ }
327+ if ((new_vlen & (new_vlen - 1 )) != 0 || new_vlen < 32 )
328+ bad_isa_string (str, (" Invalid Zvl string: " + ext_str).c_str ());
329+ vlen = std::max (vlen, new_vlen);
330+ } else if (ext_str.substr (0 , 3 ) == " zve" ) {
331+ reg_t new_elen;
332+ try {
333+ new_elen = std::stol (ext_str.substr (3 , ext_str.size () - 4 ));
334+ } catch (std::logic_error& e) {
335+ new_elen = 0 ;
336+ }
337+ if (ext_str.substr (5 ) == " d" ) {
338+ zvd |= true ; zvf |= true ;
339+ } else if (ext_str.substr (5 ) == " f" ) {
340+ zvf |= true ;
341+ } else if (ext_str.substr (5 ) == " x" ) {
342+ /* do nothing */
343+ } else {
344+ new_elen = 0 ;
345+ }
346+ if (new_elen != 32 && new_elen != 64 )
347+ bad_isa_string (str, (" Invalid Zve string: " + ext_str).c_str ());
348+ elen = std::max (elen, new_elen);
317349 } else if (ext_str[0 ] == ' x' ) {
318350 extension_table[' X' ] = true ;
319351 if (ext_str.size () == 1 ) {
@@ -424,6 +456,31 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
424456 " extensions are incompatible with WORDS_BIGENDIAN setups." );
425457 }
426458#endif
459+
460+ if (vlen > 4096 ) {
461+ bad_isa_string (str, " Spike does not currently support VLEN > 4096b" );
462+ }
463+
464+ if ((vlen != 0 ) ^ (elen != 0 )) {
465+ bad_isa_string (str, " Invalid Zvl/Zve configuration" );
466+ }
467+
468+ if (extension_table[EXT_ZVFHMIN] && (vlen == 0 || elen == 0 || !zvf)) {
469+ bad_isa_string (str, " 'Zvfhmin' extension requires Zve32f" );
470+ }
471+
472+ if (extension_table[EXT_ZVFH] && (vlen == 0 || elen == 0 || !zvf || !extension_table[EXT_ZVFHMIN])) {
473+ bad_isa_string (str, " 'Zvfh' extension requires Zve32f and 'Zvfhmin'" );
474+ }
475+
476+ if (zvd && !extension_table[' D' ] && elen < 64 ) {
477+ bad_isa_string (str, " 'ZveXXd' extension requires D" );
478+ }
479+
480+ if (zvf && !extension_table[' F' ]) {
481+ bad_isa_string (str, " 'ZveXXf' extension requires F" );
482+ }
483+
427484 std::string lowercase = strtolower (priv);
428485 bool user = false , supervisor = false ;
429486
0 commit comments