aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/isa_parser.cc57
-rw-r--r--riscv/isa_parser.h16
-rw-r--r--riscv/overlap_list.h9
3 files changed, 81 insertions, 1 deletions
diff --git a/riscv/isa_parser.cc b/riscv/isa_parser.cc
index 1c4300c..6fb29ae 100644
--- a/riscv/isa_parser.cc
+++ b/riscv/isa_parser.cc
@@ -236,10 +236,55 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
extension_table[EXT_ZICOND] = true;
} else if (ext_str == "zihpm") {
extension_table[EXT_ZIHPM] = true;
+ } else if (ext_str == "zvbb") {
+ extension_table[EXT_ZVBB] = true;
+ } else if (ext_str == "zvbc") {
+ extension_table[EXT_ZVBC] = true;
} else if (ext_str == "zvfbfmin") {
extension_table[EXT_ZVFBFMIN] = true;
} else if (ext_str == "zvfbfwma") {
extension_table[EXT_ZVFBFWMA] = true;
+ } else if (ext_str == "zvkg") {
+ extension_table[EXT_ZVKG] = true;
+ } else if (ext_str == "zvkn") {
+ extension_table[EXT_ZVBB] = true;
+ extension_table[EXT_ZVKNED] = true;
+ extension_table[EXT_ZVKNHB] = true;
+ } else if (ext_str == "zvknc") {
+ extension_table[EXT_ZVBB] = true;
+ extension_table[EXT_ZVBC] = true;
+ extension_table[EXT_ZVKNED] = true;
+ extension_table[EXT_ZVKNHB] = true;
+ } else if (ext_str == "zvkng") {
+ extension_table[EXT_ZVBB] = true;
+ extension_table[EXT_ZVKG] = true;
+ extension_table[EXT_ZVKNED] = true;
+ extension_table[EXT_ZVKNHB] = true;
+ } else if (ext_str == "zvkned") {
+ extension_table[EXT_ZVKNED] = true;
+ } else if (ext_str == "zvknha") {
+ extension_table[EXT_ZVKNHA] = true;
+ } else if (ext_str == "zvknhb") {
+ extension_table[EXT_ZVKNHB] = true;
+ } else if (ext_str == "zvks") {
+ extension_table[EXT_ZVBB] = true;
+ extension_table[EXT_ZVKSED] = true;
+ extension_table[EXT_ZVKSH] = true;
+ } else if (ext_str == "zvksc") {
+ extension_table[EXT_ZVBB] = true;
+ extension_table[EXT_ZVBC] = true;
+ extension_table[EXT_ZVKSED] = true;
+ extension_table[EXT_ZVKSH] = true;
+ } else if (ext_str == "zvksg") {
+ extension_table[EXT_ZVBB] = true;
+ extension_table[EXT_ZVKG] = true;
+ extension_table[EXT_ZVKSED] = true;
+ extension_table[EXT_ZVKSH] = true;
+ } else if (ext_str == "zvksed") {
+ extension_table[EXT_ZVKSED] = true;
+ } else if (ext_str == "zvksh") {
+ extension_table[EXT_ZVKSH] = true;
+ } else if (ext_str == "zvkt") {
} else if (ext_str == "sstc") {
extension_table[EXT_SSTC] = true;
} else if (ext_str[0] == 'x') {
@@ -295,7 +340,7 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
}
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");
+ bad_isa_string(str, "Zcmp' and 'Zcmt' extensions are incompatible with 'Zcd' extension");
}
if ((extension_table[EXT_ZCF] || extension_table[EXT_ZCD] || extension_table[EXT_ZCB] ||
@@ -307,6 +352,16 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
bad_isa_string(str, "'Zacas' extension requires 'A' extension");
}
+ // Zpn conflicts with Zvknha/Zvknhb in both rv32 and rv64
+ if (extension_table[EXT_ZPN] && (extension_table[EXT_ZVKNHA] || extension_table[EXT_ZVKNHB])) {
+ bad_isa_string(str, "'Zvkna' and 'Zvknhb' extensions are incompatible with 'Zpn' extension");
+ }
+ // In rv64 only, Zpn (rv64_zpn) conflicts with Zvkg/Zvkned/Zvksh
+ if (max_xlen == 64 && extension_table[EXT_ZPN] &&
+ (extension_table[EXT_ZVKG] || extension_table[EXT_ZVKNED] || extension_table[EXT_ZVKSH])) {
+ bad_isa_string(str, "'Zvkg', 'Zvkned', and 'Zvksh' extensions are incompatible with 'Zpn' extension in rv64");
+ }
+
std::string lowercase = strtolower(priv);
bool user = false, supervisor = false;
diff --git a/riscv/isa_parser.h b/riscv/isa_parser.h
index 3cbee7d..5b04347 100644
--- a/riscv/isa_parser.h
+++ b/riscv/isa_parser.h
@@ -58,8 +58,24 @@ typedef enum {
EXT_ZICNTR,
EXT_ZICOND,
EXT_ZIHPM,
+ EXT_ZVBB,
+ EXT_ZVBC,
EXT_ZVFBFMIN,
EXT_ZVFBFWMA,
+ EXT_ZVKG,
+ EXT_ZVKNED,
+ EXT_ZVKNHA,
+ EXT_ZVKNHB,
+ EXT_ZVKSED,
+ EXT_ZVKSH,
+ EXT_XZBP,
+ EXT_XZBS,
+ EXT_XZBE,
+ EXT_XZBF,
+ EXT_XZBC,
+ EXT_XZBM,
+ EXT_XZBR,
+ EXT_XZBT,
EXT_SSTC,
EXT_ZACAS,
EXT_INTERNAL_ZFH_MOVE,
diff --git a/riscv/overlap_list.h b/riscv/overlap_list.h
index a30c770..2214be4 100644
--- a/riscv/overlap_list.h
+++ b/riscv/overlap_list.h
@@ -12,3 +12,12 @@ DECLARE_OVERLAP_INSN(c_fsd, EXT_ZCD)
DECLARE_OVERLAP_INSN(c_ebreak, EXT_ZCA)
DECLARE_OVERLAP_INSN(c_jalr, EXT_ZCA)
DECLARE_OVERLAP_INSN(c_jr, EXT_ZCA)
+DECLARE_OVERLAP_INSN(vaesdf_vv, EXT_ZVKNED)
+DECLARE_OVERLAP_INSN(vghsh_vv, EXT_ZVKG)
+DECLARE_OVERLAP_INSN(vsha2ms_vv, EXT_ZVKNHA)
+DECLARE_OVERLAP_INSN(vsha2ms_vv, EXT_ZVKNHB)
+DECLARE_OVERLAP_INSN(vsm3me_vv, EXT_ZVKSH)
+DECLARE_OVERLAP_INSN(rstsa16, EXT_ZPN)
+DECLARE_OVERLAP_INSN(rstsa32, EXT_ZPN)
+DECLARE_OVERLAP_INSN(srli32_u, EXT_ZPN)
+DECLARE_OVERLAP_INSN(umax32, EXT_ZPN)