Browse Source

add support for flags for Zc* extensions

pull/1149/head
Weiwei Li 4 years ago
committed by Andrew Waterman
parent
commit
b300249353
  1. 39
      riscv/isa_parser.cc
  2. 6
      riscv/isa_parser.h

39
riscv/isa_parser.cc

@ -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;

6
riscv/isa_parser.h

@ -21,6 +21,12 @@ typedef enum {
EXT_ZBKB,
EXT_ZBKC,
EXT_ZBKX,
EXT_ZCA,
EXT_ZCB,
EXT_ZCD,
EXT_ZCF,
EXT_ZCMP,
EXT_ZCMT,
EXT_ZKND,
EXT_ZKNE,
EXT_ZKNH,

Loading…
Cancel
Save