diff options
-rw-r--r-- | disasm/isa_parser.cc | 14 | ||||
-rw-r--r-- | riscv/insns/fli_h.h | 2 | ||||
-rw-r--r-- | riscv/v_ext_macros.h | 2 |
3 files changed, 11 insertions, 7 deletions
diff --git a/disasm/isa_parser.cc b/disasm/isa_parser.cc index 5fe8280..48df33e 100644 --- a/disasm/isa_parser.cc +++ b/disasm/isa_parser.cc @@ -456,16 +456,20 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv) bad_isa_string(str, "'Zclsd' extension requires 'Zca' and 'Zilsd' extensions"); } - if (extension_table[EXT_ZFBFMIN] && !extension_table['F']) { + if (extension_table[EXT_ZFBFMIN] || extension_table[EXT_ZFHMIN]) { + extension_table[EXT_INTERNAL_ZFH_MOVE] = true; + } + + if (extension_table[EXT_ZFBFMIN] && (!extension_table['F'])) { bad_isa_string(str, "'Zfbfmin' extension requires 'F' extension"); } - if ((extension_table[EXT_ZVFBFMIN] || extension_table[EXT_ZVFBFWMA]) && !extension_table['V']) { - bad_isa_string(str, "'Zvfbfmin/Zvfbfwma' extension requires 'V' extension"); + if (extension_table[EXT_ZVFBFMIN] && (vlen == 0 || !zvf)) { + bad_isa_string(str, "'Zvfbfmin' extension requires 'Zve32f' extension"); } - if (extension_table[EXT_ZFBFMIN] || extension_table[EXT_ZVFBFMIN] || extension_table[EXT_ZFHMIN]) { - extension_table[EXT_INTERNAL_ZFH_MOVE] = true; + if (extension_table[EXT_ZVFBFWMA] && (!extension_table[EXT_ZFBFMIN] || !extension_table[EXT_ZVFBFMIN])) { + bad_isa_string(str, "'Zvfbfwma' extension requires 'Zfbfmin' and 'Zvfbfmin' extensions"); } if (extension_table[EXT_ZFINX] && extension_table['F']) { diff --git a/riscv/insns/fli_h.h b/riscv/insns/fli_h.h index ddf41a9..71fd64d 100644 --- a/riscv/insns/fli_h.h +++ b/riscv/insns/fli_h.h @@ -1,4 +1,4 @@ -require_extension(EXT_ZFH); +require_either_extension(EXT_ZFH, EXT_ZVFH); require_extension(EXT_ZFA); require_fp; { diff --git a/riscv/v_ext_macros.h b/riscv/v_ext_macros.h index 45af246..f9a5558 100644 --- a/riscv/v_ext_macros.h +++ b/riscv/v_ext_macros.h @@ -1896,7 +1896,7 @@ VI_VX_ULOOP({ \ VI_VFP_LOOP_END #define VI_VFP_LOOP_SCALE_BASE \ - VI_VFP_COMMON \ + VI_VFP_BASE; \ for (reg_t i = P.VU.vstart->read(); i < vl; ++i) { \ VI_LOOP_ELEMENT_SKIP(); |