diff options
author | Jiawei <jiawei@iscas.ac.cn> | 2023-07-11 16:32:14 +0800 |
---|---|---|
committer | Nelson Chu <nelson@rivosinc.com> | 2023-07-18 10:49:49 +0800 |
commit | 7ab8bf1c777644f834ccbc5d1e83d721859ca1ba (patch) | |
tree | ce5428212c4b5deda63a08a0a5b5bc6bb1efb1ec /bfd | |
parent | ffcdd0184d2da860d45ab326dd7afe00c432e428 (diff) | |
download | gdb-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.c | 44 |
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: |