Browse Source

Add Zaamo and Zalrsc extensions

pull/1558/head
Ved Shanbhogue 3 years ago
parent
commit
0bf0a60ad8
  1. 9
      disasm/disasm.cc
  2. 25
      disasm/isa_parser.cc
  3. 8
      riscv/csrs.cc
  4. 2
      riscv/isa_parser.h

9
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);

25
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

8
riscv/csrs.cc

@ -622,9 +622,10 @@ bool sstatus_csr_t::enabled(const reg_t which) {
misa_csr_t::misa_csr_t(processor_t* const proc, const reg_t addr, const reg_t max_isa):
basic_csr_t(proc, addr, max_isa),
max_isa(max_isa),
write_mask(max_isa & (0 // allow MAFDQCHV bits in MISA to be modified
write_mask(max_isa & (0 // allow MABFDQCHV bits in MISA to be modified
| (1L << ('M' - 'A'))
| (1L << ('A' - 'A'))
| (1L << ('B' - 'A'))
| (1L << ('F' - 'A'))
| (1L << ('D' - 'A'))
| (1L << ('Q' - 'A'))
@ -665,6 +666,11 @@ bool misa_csr_t::unlogged_write(const reg_t val) noexcept {
proc->set_extension_enable(EXT_ZFHMIN, new_misa & (1L << ('F' - 'A')));
proc->set_extension_enable(EXT_ZVFH, (new_misa & (1L << ('V' - 'A'))) && proc->extension_enabled(EXT_ZFHMIN));
proc->set_extension_enable(EXT_ZVFHMIN, new_misa & (1L << ('V' - 'A')));
proc->set_extension_enable(EXT_ZAAMO, (new_misa & (1L << ('A' - 'A'))) || !proc->get_isa().extension_enabled('A'));
proc->set_extension_enable(EXT_ZALRSC, (new_misa & (1L << ('A' - 'A'))) || !proc->get_isa().extension_enabled('A'));
proc->set_extension_enable(EXT_ZBA, (new_misa & (1L << ('B' - 'A'))) || !proc->get_isa().extension_enabled('B'));
proc->set_extension_enable(EXT_ZBB, (new_misa & (1L << ('B' - 'A'))) || !proc->get_isa().extension_enabled('B'));
proc->set_extension_enable(EXT_ZBS, (new_misa & (1L << ('B' - 'A'))) || !proc->get_isa().extension_enabled('B'));
// update the hypervisor-only bits in MEDELEG and other CSRs
if (!new_h && prev_h) {

2
riscv/isa_parser.h

@ -75,6 +75,8 @@ typedef enum {
EXT_XZBR,
EXT_XZBT,
EXT_SSTC,
EXT_ZAAMO,
EXT_ZALRSC,
EXT_ZACAS,
EXT_ZABHA,
EXT_INTERNAL_ZFH_MOVE,

Loading…
Cancel
Save