diff options
author | Ved Shanbhogue <ved@rivosinc.com> | 2024-01-10 15:37:00 -0600 |
---|---|---|
committer | Ved Shanbhogue <ved@rivosinc.com> | 2024-01-10 16:06:32 -0600 |
commit | 0bf0a60ad870ba3d59f87c03b41b6d06ca5fa30c (patch) | |
tree | b6c22172ea4753c5ef207366563b0eb3e139a63f /disasm | |
parent | 5fa1cd541872ac601580fda58eb093aaf12aab32 (diff) | |
download | riscv-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.cc | 9 | ||||
-rw-r--r-- | disasm/isa_parser.cc | 25 |
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 |