|
|
|
@ -155,6 +155,20 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv) |
|
|
|
} else if (ext_str == "zhinxmin") { |
|
|
|
extension_table[EXT_ZFINX] = true; |
|
|
|
extension_table[EXT_ZHINXMIN] = true; |
|
|
|
} else if (ext_str == "zca") { |
|
|
|
extension_table[EXT_ZCA] = true; |
|
|
|
} else if (ext_str == "zcf") { |
|
|
|
if (max_xlen != 32) |
|
|
|
bad_isa_string(str, "'Zcf' requires RV32"); |
|
|
|
extension_table[EXT_ZCF] = true; |
|
|
|
} else if (ext_str == "zcb") { |
|
|
|
extension_table[EXT_ZCB] = true; |
|
|
|
} else if (ext_str == "zcd") { |
|
|
|
extension_table[EXT_ZCD] = true; |
|
|
|
} else if (ext_str == "zcmp") { |
|
|
|
extension_table[EXT_ZCMP] = true; |
|
|
|
} else if (ext_str == "zcmt") { |
|
|
|
extension_table[EXT_ZCMT] = true; |
|
|
|
} else if (ext_str == "zk") { |
|
|
|
extension_table[EXT_ZBKB] = true; |
|
|
|
extension_table[EXT_ZBKC] = true; |
|
|
|
@ -256,10 +270,35 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv) |
|
|
|
bad_isa_string(str, ("can't parse: " + std::string(p)).c_str()); |
|
|
|
} |
|
|
|
|
|
|
|
if (extension_table['C']) { |
|
|
|
extension_table[EXT_ZCA] = true; |
|
|
|
if (extension_table['F'] && max_xlen == 32) |
|
|
|
extension_table[EXT_ZCF] = true; |
|
|
|
if (extension_table['D']) |
|
|
|
extension_table[EXT_ZCD] = true; |
|
|
|
} |
|
|
|
|
|
|
|
if (extension_table[EXT_ZFINX] && ((max_isa >> ('f' - 'a')) & 1)) { |
|
|
|
bad_isa_string(str, ("Zfinx/ZDinx/Zhinx{min} extensions conflict with Base 'F/D/Q/Zfh{min}' extensions")); |
|
|
|
} |
|
|
|
|
|
|
|
if (extension_table[EXT_ZCF] && !extension_table['F']) { |
|
|
|
bad_isa_string(str, "'Zcf' extension requires 'F' extension"); |
|
|
|
} |
|
|
|
|
|
|
|
if (extension_table[EXT_ZCD] && !extension_table['D']) { |
|
|
|
bad_isa_string(str, "'Zcd' extension requires 'D' extension"); |
|
|
|
} |
|
|
|
|
|
|
|
if ((extension_table[EXT_ZCMP] || extension_table[EXT_ZCMT]) && extension_table[EXT_ZCD]) { |
|
|
|
bad_isa_string(str, "Zcmp' and 'Zcmt' exensions are incompatible with 'Zcd' extension"); |
|
|
|
} |
|
|
|
|
|
|
|
if ((extension_table[EXT_ZCF] || extension_table[EXT_ZCD] || extension_table[EXT_ZCB] || |
|
|
|
extension_table[EXT_ZCMP] || extension_table[EXT_ZCMT]) && !extension_table[EXT_ZCA]) { |
|
|
|
bad_isa_string(str, "'Zcf/Zcd/Zcb/Zcmp/Zcmt' extensions require 'Zca' extension"); |
|
|
|
} |
|
|
|
|
|
|
|
std::string lowercase = strtolower(priv); |
|
|
|
bool user = false, supervisor = false; |
|
|
|
|
|
|
|
|