aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--disasm/isa_parser.cc14
-rw-r--r--riscv/insns/fli_h.h2
-rw-r--r--riscv/v_ext_macros.h2
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();