aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Gouriou <ego@rivosinc.com>2023-06-01 18:04:31 -0700
committerEric Gouriou <ego@rivosinc.com>2023-06-19 14:29:59 -0700
commit1e5a71f99b3432ba9fb543995a466c2d96e96cec (patch)
treefba28ad4081754e774f0eaf1598b488da880a742
parent377fb0a11b8ccc28f7d1687523b7d79403e26453 (diff)
downloadriscv-isa-sim-1e5a71f99b3432ba9fb543995a466c2d96e96cec.zip
riscv-isa-sim-1e5a71f99b3432ba9fb543995a466c2d96e96cec.tar.gz
riscv-isa-sim-1e5a71f99b3432ba9fb543995a466c2d96e96cec.tar.bz2
Zvk: extensions parsing
Zvk is the short name for the Vector Cryptography Instruction Set Extension Specification being defined at <https://github.com/riscv/riscv-crypto/tree/master/doc/vector>. This commit adds support for parsing/enabling the Zvk extensions (Zvbb, Zvbc, Zvkg, Zvkned, Zvknha, Zvknhb, Zvksed, Zvksh, Zvkt) and the combo extensions (Zvkn, Zvknc, Zvkng, Zvks, Zvksc, Zvksg). This is an early commit in a series implementing Zvk. No instructions are actually defined here, only infastructure that will support the coming extensions. The encodings for Zvk instructions have some conflicts with Zpn encodings. This commit marks those Zpn instructions as overlapping, and adds checks to error out if conflicting extensions are enabled. Signed-off-by: Eric Gouriou <ego@rivosinc.com>
-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)