Browse Source

fixup! Refactor ISA parser extension handling

Keep extension_info_t focused on extension enable/imply data
by moving XLEN policy checks back into explicit post-parse validation.
This keeps the table structure simpler while preserving the existing
checks for Zcf, Zclsd, Zilsd, and svukte after implication and
combination rules have settled.

Signed-off-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com>
pull/2287/head
Jerry Zhang Jian 2 weeks ago
parent
commit
3a830badcf
  1. 35
      disasm/isa_parser.cc

35
disasm/isa_parser.cc

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

Loading…
Cancel
Save