diff --git a/disasm/isa_parser.cc b/disasm/isa_parser.cc index b269f436..06d74f88 100644 --- a/disasm/isa_parser.cc +++ b/disasm/isa_parser.cc @@ -56,16 +56,11 @@ struct extension_info_t { const char* name; std::vector enables; std::vector implies; - unsigned required_xlen = 0; - const char* required_xlen_msg = nullptr; extension_info_t(const char* name, std::initializer_list enables = {}, - std::initializer_list implies = {}, - unsigned required_xlen = 0, - const char* required_xlen_msg = nullptr) - : name(name), enables(enables), implies(implies), - required_xlen(required_xlen), required_xlen_msg(required_xlen_msg) {} + std::initializer_list implies = {}) + : name(name), enables(enables), implies(implies) {} }; struct extension_combination_t { @@ -131,7 +126,7 @@ static const extension_info_t extension_infos[] = { {"zhinxmin", {EXT_ZFINX, EXT_ZHINXMIN}}, {"zce", {EXT_ZCE}, {"zcb", "zcmp", "zcmt"}}, {"zca", {EXT_ZCA}}, - {"zcf", {'F', EXT_ZCF}, {"zca"}, 32, "'Zcf' requires RV32"}, + {"zcf", {'F', EXT_ZCF}, {"zca"}}, {"zcb", {EXT_ZCB}, {"zca"}}, {"zcd", {EXT_ZCD, 'F', 'D'}, {"zca"}}, {"zcmp", {EXT_ZCMP}, {"zca"}}, @@ -157,7 +152,7 @@ static const extension_info_t extension_infos[] = { {"svnapot", {EXT_SVNAPOT}}, {"svpbmt", {EXT_SVPBMT}}, {"svinval", {EXT_SVINVAL}}, - {"svukte", {EXT_SVUKTE}, {}, 64, "'svukte' requires RV64"}, + {"svukte", {EXT_SVUKTE}}, {"zfa", {EXT_ZFA}}, {"zicbom", {EXT_ZICBOM}}, {"zicboz", {EXT_ZICBOZ}}, @@ -166,8 +161,8 @@ static const extension_info_t extension_infos[] = { {"zicntr", {EXT_ZICNTR}}, {"zicond", {EXT_ZICOND}}, {"zihpm", {EXT_ZIHPM}}, - {"zilsd", {EXT_ZILSD}, {}, 32, "'Zilsd' requires RV32"}, - {"zclsd", {EXT_ZCLSD}, {"zilsd", "zca"}, 32, "'Zclsd' requires RV32"}, + {"zilsd", {EXT_ZILSD}}, + {"zclsd", {EXT_ZCLSD}, {"zilsd", "zca"}}, {"zvabd", {EXT_ZVABD}}, {"zvkb", {EXT_ZVKB}}, {"zvbb", {EXT_ZVKB, EXT_ZVBB}}, @@ -286,8 +281,6 @@ void isa_parser_t::apply_zve_properties(const std::string& ext_str, const char* void isa_parser_t::add_extension(const std::string& ext_str, const char* str) { if (const auto* info = find_extension_info(ext_str)) { - if (info->required_xlen && max_xlen != info->required_xlen) - bad_isa_string(str, info->required_xlen_msg); for (const auto ext : info->enables) { extension_table[ext] = true; } @@ -388,6 +381,22 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv) extension_table[EXT_ZCF] = true; } + if (extension_table[EXT_ZCF] && max_xlen != 32) { + bad_isa_string(str, "'Zcf' requires RV32"); + } + + if (extension_table[EXT_ZCLSD] && max_xlen != 32) { + bad_isa_string(str, "'Zclsd' requires RV32"); + } + + if (extension_table[EXT_ZILSD] && max_xlen != 32) { + bad_isa_string(str, "'Zilsd' requires RV32"); + } + + if (extension_table[EXT_SVUKTE] && max_xlen != 64) { + bad_isa_string(str, "'svukte' requires RV64"); + } + if (extension_table[EXT_ZCLSD] && extension_table[EXT_ZCF]) { bad_isa_string(str, "'Zclsd' extension conflicts with 'Zcf' extensions"); }