aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorJiawei <jiawei@iscas.ac.cn>2023-07-11 16:32:14 +0800
committerNelson Chu <nelson@rivosinc.com>2023-07-18 10:49:49 +0800
commit7ab8bf1c777644f834ccbc5d1e83d721859ca1ba (patch)
treece5428212c4b5deda63a08a0a5b5bc6bb1efb1ec /bfd
parentffcdd0184d2da860d45ab326dd7afe00c432e428 (diff)
downloadgdb-7ab8bf1c777644f834ccbc5d1e83d721859ca1ba.zip
gdb-7ab8bf1c777644f834ccbc5d1e83d721859ca1ba.tar.gz
gdb-7ab8bf1c777644f834ccbc5d1e83d721859ca1ba.tar.bz2
RISC-V: Support Zca/f/d extensions.
This patch add Zca/f/d extensions support, since all ZC* extensions will imply Zca extension, just enabled compress feature when Zca extension is available. Co-Authored by: Charlie Keaney <charlie.keaney@embecosm.com> Co-Authored by: Mary Bennett <mary.bennett@embecosm.com> Co-Authored by: Nandni Jamnadas <nandni.jamnadas@embecosm.com> Co-Authored by: Sinan Lin <sinan.lin@linux.alibaba.com> Co-Authored by: Simon Cook <simon.cook@embecosm.com> Co-Authored by: Shihua Liao <shihua@iscas.ac.cn> Co-Authored by: Yulong Shi <yulong@iscas.ac.cn> bfd/ChangeLog: * elfxx-riscv.c (riscv_multi_subset_supports): New extensions. (riscv_multi_subset_supports_ext): Ditto. gas/ChangeLog: * config/tc-riscv.c (riscv_set_arch): Extend compress check. * testsuite/gas/riscv/zca.d: New test. * testsuite/gas/riscv/zca.s: New test. * testsuite/gas/riscv/zcd.d: New test. * testsuite/gas/riscv/zcd.s: New test. * testsuite/gas/riscv/zcf.d: New test. * testsuite/gas/riscv/zcf.s: New test.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/elfxx-riscv.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index bdfc0ef..8635187 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -1171,6 +1171,8 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
{"zvksg", "zvkg", check_implicit_always},
{"zvksc", "zvks", check_implicit_always},
{"zvksc", "zvbc", check_implicit_always},
+ {"zcf", "zca", check_implicit_always},
+ {"zcd", "zca", check_implicit_always},
{"smaia", "ssaia", check_implicit_always},
{"smstateen", "ssstateen", check_implicit_always},
{"smepmp", "zicsr", check_implicit_always},
@@ -1304,6 +1306,9 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
{"zvl32768b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"zvl65536b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"ztso", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 },
+ {"zca", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
+ {"zcf", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
+ {"zcd", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{NULL, 0, 0, 0, 0}
};
@@ -2384,13 +2389,16 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
case INSN_CLASS_Q:
return riscv_subset_supports (rps, "q");
case INSN_CLASS_C:
- return riscv_subset_supports (rps, "c");
+ return (riscv_subset_supports (rps, "c")
+ || riscv_subset_supports (rps, "zca"));
case INSN_CLASS_F_AND_C:
return (riscv_subset_supports (rps, "f")
- && riscv_subset_supports (rps, "c"));
+ && (riscv_subset_supports (rps, "c")
+ || riscv_subset_supports (rps, "zcf")));
case INSN_CLASS_D_AND_C:
return (riscv_subset_supports (rps, "d")
- && riscv_subset_supports (rps, "c"));
+ && (riscv_subset_supports (rps, "c")
+ || riscv_subset_supports (rps, "zcd")));
case INSN_CLASS_F_INX:
return (riscv_subset_supports (rps, "f")
|| riscv_subset_supports (rps, "zfinx"));
@@ -2565,21 +2573,27 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
case INSN_CLASS_C:
return "c";
case INSN_CLASS_F_AND_C:
- if (!riscv_subset_supports (rps, "f")
- && !riscv_subset_supports (rps, "c"))
- return _("f' and `c");
- else if (!riscv_subset_supports (rps, "f"))
- return "f";
+ if (!riscv_subset_supports (rps, "f"))
+ {
+ if (!riscv_subset_supports (rps, "c")
+ && !riscv_subset_supports (rps, "zcf"))
+ return _("f' and `c', or `f' and `zcf");
+ else
+ return "f";
+ }
else
- return "c";
+ return _("c' or `zcf");
case INSN_CLASS_D_AND_C:
- if (!riscv_subset_supports (rps, "d")
- && !riscv_subset_supports (rps, "c"))
- return _("d' and `c");
- else if (!riscv_subset_supports (rps, "d"))
- return "d";
+ if (!riscv_subset_supports (rps, "d"))
+ {
+ if (!riscv_subset_supports (rps, "c")
+ && !riscv_subset_supports (rps, "zcd"))
+ return _("d' and `c', or `d' and `zcd");
+ else
+ return "d";
+ }
else
- return "c";
+ return _("c' or `zcd");
case INSN_CLASS_F_INX:
return _("f' or `zfinx");
case INSN_CLASS_D_INX: