diff options
author | Nelson Chu <nelson.chu@sifive.com> | 2021-10-04 18:20:47 +0800 |
---|---|---|
committer | Nelson Chu <nelson.chu@sifive.com> | 2021-10-28 08:51:44 +0800 |
commit | 77dd5c805f4347c5de657ddeed032a2e9bd7abc7 (patch) | |
tree | e7bfbf5de8c8c6958918dda659d2edbfc6f1e6ca /bfd/elfxx-riscv.c | |
parent | 3c0675ea93e689148128d28525ab719aeec06f6a (diff) | |
download | gdb-77dd5c805f4347c5de657ddeed032a2e9bd7abc7.zip gdb-77dd5c805f4347c5de657ddeed032a2e9bd7abc7.tar.gz gdb-77dd5c805f4347c5de657ddeed032a2e9bd7abc7.tar.bz2 |
RISC-V/rvv: Added zve* and zvl* extensions, and clarify the imply rules.
* Recognized zve* and zvl* extensions.
- zve*: zve64d, zve64f, zve64x, zve32f and zve32x.
- zvl*: zvl32b, zvl64b, zvl128b, zvl256b, zvl512b, zvl1024b, zvl2048b,
zvl4096b, zvl8192b, zvl16384b, zvl32768b and zvl65536b.
* Spec said that v requires f and d, zve64d requires d, zve64f and zve32f
require f. However, according to the issue 723,
[https://github.com/riscv/riscv-v-spec/issues/723]
The general rule is that extension names imply the things they require.
Therefore, the current imply rules should be as follows,
- v imply f and d.
- zve64d imply d.
- zve64f and zve32f imply f.
- zvamo imply a.
Besides, consider the implicit zve and zvl extensions,
- v imply zve64d and zvl128b.
- zve64* imply the corresponding zve32*. For example, zve64f imply zve32f,
and zve64x imply zve32x.
- zve*d imply zve*f and zve*x. For example, zve64d imply zve64f and zve64x.
- zve*f imply zve*x. For example, zve64f imply zve64x.
- zve64* imply zvl64b, and zve32* imply zvl32b.
- The larger zvl* imply all smaller zvl*. For example, zvl128b imply zvl64b,
and zvl32b.
Therefore, "-march=rv64iv -misa-spec=20191213" will be
"rv64i2p0_f2p0_d2p0_v1p0_zicsr2p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0".
Note: zicsr is the imply extension of f.
* For zve32x, the (segmant) load/store instructions are illegal when EEW is
64. Besides, vsew cannot be set to 64 by vsetvli when zve32* is enabled.
* For zvl*b extensions, we also need to enable either v or zve* extensions.
Otherwise we should issue errors.
bfd/
* elfxx-riscv.c (riscv_implicit_subsets): Added imply rules for v,
zve* and zvl*b extensions.
(riscv_supported_std_z_ext): Added zve* and zvl*b extensions.
(riscv_parse_check_conflicts): The zvl*b extensions cannot be set
without v and zve* extensions.
gas/
* config/tc-riscv.c (riscv_extended_subset_supports): Handle zve*.
(my_getVsetvliExpression): vsew cannot be set to 64 by vsetvli
when zve32* is enabled.
(riscv_ip): The (segmant) loads and stores with EEW 64 cannot be
used when zve32x is enabled.
* testsuite/gas/riscv/extended/march-imply-v.d: New testcase.
* testsuite/gas/riscv/extended/march-imply-zve*.d: Likewise.
* testsuite/gas/riscv/extended/march-imply-zvl*b.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zve32x.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zve32x.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zve32x.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zvl.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zvl.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zvamo.d: Removed
a-ext from -march since it will be added as implicit ext for zvamo.
* testsuite/gas/riscv/extended/vector-insns.d: Likewise.
include/
* opcode/riscv.h: Defined INSN_V_EEW64.
opcodes/
* riscv-opc.c (riscv_draft_opcodes): Added INSN_V_EEW64 for vector
loads and stores when the eew encodings are 64.
Diffstat (limited to 'bfd/elfxx-riscv.c')
-rw-r--r-- | bfd/elfxx-riscv.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index b44ff82..34bcab6 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1073,6 +1073,32 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] = {"g", "zicsr", check_implicit_always}, {"g", "zifencei", check_implicit_always}, {"q", "d", check_implicit_always}, + {"v", "d", check_implicit_always}, + {"v", "zve64d", check_implicit_always}, + {"v", "zvl128b", check_implicit_always}, + {"zvamo", "a", check_implicit_always}, + {"zve64d", "d", check_implicit_always}, + {"zve64d", "zve64f", check_implicit_always}, + {"zve64f", "zve32f", check_implicit_always}, + {"zve64f", "zve64x", check_implicit_always}, + {"zve64f", "zvl64b", check_implicit_always}, + {"zve32f", "f", check_implicit_always}, + {"zve32f", "zvl32b", check_implicit_always}, + {"zve32f", "zve32x", check_implicit_always}, + {"zve64x", "zve32x", check_implicit_always}, + {"zve64x", "zvl64b", check_implicit_always}, + {"zve32x", "zvl32b", check_implicit_always}, + {"zvl65536b", "zvl32768b", check_implicit_always}, + {"zvl32768b", "zvl16384b", check_implicit_always}, + {"zvl16384b", "zvl8192b", check_implicit_always}, + {"zvl8192b", "zvl4096b", check_implicit_always}, + {"zvl4096b", "zvl2048b", check_implicit_always}, + {"zvl2048b", "zvl1024b", check_implicit_always}, + {"zvl1024b", "zvl512b", check_implicit_always}, + {"zvl512b", "zvl256b", check_implicit_always}, + {"zvl256b", "zvl128b", check_implicit_always}, + {"zvl128b", "zvl64b", check_implicit_always}, + {"zvl64b", "zvl32b", check_implicit_always}, {"d", "f", check_implicit_always}, {"f", "zicsr", check_implicit_always}, {"zfh", "f", check_implicit_always}, @@ -1148,6 +1174,24 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zba", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zbc", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zbs", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zve32x", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zve32f", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zve32d", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zve64x", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zve64f", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zve64d", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl32b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl64b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl128b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl256b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl512b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl1024b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl2048b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl4096b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl8192b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl16384b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl32768b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zvl65536b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zvamo", ISA_SPEC_CLASS_DRAFT, 0, 10, 0 }, /* draft. */ {"zfh", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 }, /* draft. */ {NULL, 0, 0, 0, 0} @@ -1842,6 +1886,28 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps) (_("rv32e does not support the `f' extension")); no_conflict = false; } + + bool support_zve = false; + bool support_zvl = false; + riscv_subset_t *s = rps->subset_list->head; + for (; s != NULL; s = s->next) + { + if (!support_zve + && strncmp (s->name, "zve", 3) == 0) + support_zve = true; + if (!support_zvl + && strncmp (s->name, "zvl", 3) == 0) + support_zvl = true; + if (support_zve && support_zvl) + break; + } + if (support_zvl && !support_zve) + { + rps->error_handler + (_("zvl*b extensions need to enable either `v' or `zve' extension")); + no_conflict = false; + } + return no_conflict; } |