aboutsummaryrefslogtreecommitdiff
path: root/disasm
diff options
context:
space:
mode:
authorVed Shanbhogue <ved@rivosinc.com>2024-01-10 15:37:00 -0600
committerVed Shanbhogue <ved@rivosinc.com>2024-01-10 16:06:32 -0600
commit0bf0a60ad870ba3d59f87c03b41b6d06ca5fa30c (patch)
treeb6c22172ea4753c5ef207366563b0eb3e139a63f /disasm
parent5fa1cd541872ac601580fda58eb093aaf12aab32 (diff)
downloadriscv-isa-sim-0bf0a60ad870ba3d59f87c03b41b6d06ca5fa30c.zip
riscv-isa-sim-0bf0a60ad870ba3d59f87c03b41b6d06ca5fa30c.tar.gz
riscv-isa-sim-0bf0a60ad870ba3d59f87c03b41b6d06ca5fa30c.tar.bz2
Add Zaamo and Zalrsc extensions
Diffstat (limited to 'disasm')
-rw-r--r--disasm/disasm.cc9
-rw-r--r--disasm/isa_parser.cc25
2 files changed, 27 insertions, 7 deletions
diff --git a/disasm/disasm.cc b/disasm/disasm.cc
index 08571a2..65c15f5 100644
--- a/disasm/disasm.cc
+++ b/disasm/disasm.cc
@@ -809,7 +809,8 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_XSTORE(sw)
DEFINE_XSTORE(sd)
- if (isa->extension_enabled('A')) {
+ if (isa->extension_enabled('A') ||
+ isa->extension_enabled(EXT_ZAAMO)) {
DEFINE_XAMO(amoadd_w)
DEFINE_XAMO(amoswap_w)
DEFINE_XAMO(amoand_w)
@@ -828,6 +829,10 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_XAMO(amomax_d)
DEFINE_XAMO(amominu_d)
DEFINE_XAMO(amomaxu_d)
+ }
+
+ if (isa->extension_enabled('A') ||
+ isa->extension_enabled(EXT_ZALRSC)) {
DEFINE_XLOAD_BASE(lr_w)
DEFINE_XAMO(sc_w)
DEFINE_XLOAD_BASE(lr_d)
@@ -2390,7 +2395,7 @@ disassembler_t::disassembler_t(const isa_parser_t *isa)
// next-highest priority: other instructions in same base ISA
std::string fallback_isa_string = std::string("rv") + std::to_string(isa->get_max_xlen()) +
- "gqchv_zfh_zba_zbb_zbc_zbs_zcb_zicbom_zicboz_zicond_zkn_zkr_zks_svinval_zcmop_zimop";
+ "gqcvh_zfh_zba_zbb_zbc_zbs_zcb_zicbom_zicboz_zicond_zkn_zkr_zks_svinval_zcmop_zimop";
isa_parser_t fallback_isa(fallback_isa_string.c_str(), DEFAULT_PRIV);
add_instructions(&fallback_isa);
diff --git a/disasm/isa_parser.cc b/disasm/isa_parser.cc
index 25d1aff..7a133e4 100644
--- a/disasm/isa_parser.cc
+++ b/disasm/isa_parser.cc
@@ -29,7 +29,7 @@ static void bad_priv_string(const char* priv)
isa_parser_t::isa_parser_t(const char* str, const char *priv)
{
isa_string = strtolower(str);
- const char* all_subsets = "mafdqchpv";
+ const char* all_subsets = "mafdqcpvh";
if (isa_string.compare(0, 4, "rv32") == 0)
max_xlen = 32;
@@ -119,6 +119,10 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
// HINTs encoded in base-ISA instructions are always present.
} else if (ext_str == "zihintntl") {
// HINTs encoded in base-ISA instructions are always present.
+ } else if (ext_str == "zaamo") {
+ extension_table[EXT_ZAAMO] = true;
+ } else if (ext_str == "zalrsc") {
+ extension_table[EXT_ZALRSC] = true;
} else if (ext_str == "zacas") {
extension_table[EXT_ZACAS] = true;
} else if (ext_str == "zabha") {
@@ -330,6 +334,17 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
extension_table[EXT_INTERNAL_ZFH_MOVE] = true;
}
+ if (extension_table['A']) {
+ extension_table[EXT_ZAAMO] = true;
+ extension_table[EXT_ZALRSC] = true;
+ }
+
+ if (extension_table['B']) {
+ extension_table[EXT_ZBA] = true;
+ extension_table[EXT_ZBB] = true;
+ extension_table[EXT_ZBS] = true;
+ }
+
if (extension_table['C']) {
extension_table[EXT_ZCA] = true;
if (extension_table['F'] && max_xlen == 32)
@@ -359,12 +374,12 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
bad_isa_string(str, "'Zcf/Zcd/Zcb/Zcmp/Zcmt' extensions require 'Zca' extension");
}
- if (extension_table[EXT_ZACAS] && !extension_table['A']) {
- bad_isa_string(str, "'Zacas' extension requires 'A' extension");
+ if (extension_table[EXT_ZACAS] && !extension_table['A'] && !extension_table[EXT_ZAAMO]) {
+ bad_isa_string(str, "'Zacas' extension requires either the 'A' or the 'Zaamo' extension");
}
- if (extension_table[EXT_ZABHA] && !extension_table['A']) {
- bad_isa_string(str, "'Zabha' extension requires 'A' extension");
+ if (extension_table[EXT_ZABHA] && !extension_table['A'] && !extension_table[EXT_ZAAMO]) {
+ bad_isa_string(str, "'Zabha' extension requires either the 'A' or the 'Zaamo' extension");
}
// Zpn conflicts with Zvknha/Zvknhb in both rv32 and rv64