RISC-V: Add T-Head VECTOR vendor extension.

T-Head has a range of vendor-specific instructions ([2]).
Therefore it makes sense to group them into smaller chunks
in form of vendor extensions.

This patch adds the "XTheadVector" extension, a collection of
T-Head-specific vector instructions. The 'th' prefix and the
"XTheadVector" extension are documented in a PR for the RISC-V
toolchain conventions ([1]).

Here are some things that need to be explained:
The "XTheadVector" extension is not a custom-extension, but
a non-standard non-conforming extension. The encoding space
of the "TheadVector" instructions overlaps with those of
the 'V' extension. This encoding space conflict is not on
purpose, but the result of issues in the past that have
been resolved since. Therefore, the "XTheadVector" extension
and the 'V' extension are in conflict.

[1] https://github.com/riscv-non-isa/riscv-toolchain-conventions/pull/19
[2] https://github.com/T-head-Semi/thead-extension-spec/releases/download/2.3.0/xthead-2023-11-10-2.3.0.pdf

Co-developed-by: Lifang Xia <lifang_xia@linux.alibaba.com>
Co-developed-by: Christoph Müllner <christoph.muellner@vrull.eu>

bfd/ChangeLog:

	* elfxx-riscv.c (riscv_parse_check_conflicts): The
	"XTheadVector" extension and the 'V' extension are in conflict.
	(riscv_multi_subset_supports): Likewise..
	(riscv_multi_subset_supports_ext): Likewise.

gas/ChangeLog:

	* doc/c-riscv.texi:
	* testsuite/gas/riscv/x-thead-vector-fail.d: New test.
	* testsuite/gas/riscv/x-thead-vector-fail.l: New test.
	* testsuite/gas/riscv/x-thead-vector.s: New test.

include/ChangeLog:

	* opcode/riscv.h (enum riscv_insn_class):
This commit is contained in:
Jin Ma
2023-11-18 14:53:08 +08:00
committed by Nelson Chu
parent da02021b59
commit 86fbfedd71
7 changed files with 26 additions and 0 deletions

View File

@@ -1373,6 +1373,7 @@ static struct riscv_supported_ext riscv_supported_vendor_x_ext[] =
{"xtheadmemidx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"xtheadmemidx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"xtheadmempair", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"xtheadmempair", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"xtheadsync", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"xtheadsync", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"xtheadvector", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"xventanacondops", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"xventanacondops", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{NULL, 0, 0, 0, 0} {NULL, 0, 0, 0, 0}
}; };
@@ -1984,6 +1985,13 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps)
(_("`zfinx' is conflict with the `f/d/q/zfh/zfhmin' extension")); (_("`zfinx' is conflict with the `f/d/q/zfh/zfhmin' extension"));
no_conflict = false; no_conflict = false;
} }
if (riscv_lookup_subset (rps->subset_list, "xtheadvector", &subset)
&& riscv_lookup_subset (rps->subset_list, "v", &subset))
{
rps->error_handler
(_("`xtheadvector' is conflict with the `v' extension"));
no_conflict = false;
}
bool support_zve = false; bool support_zve = false;
bool support_zvl = false; bool support_zvl = false;
@@ -2580,6 +2588,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
return riscv_subset_supports (rps, "xtheadmempair"); return riscv_subset_supports (rps, "xtheadmempair");
case INSN_CLASS_XTHEADSYNC: case INSN_CLASS_XTHEADSYNC:
return riscv_subset_supports (rps, "xtheadsync"); return riscv_subset_supports (rps, "xtheadsync");
case INSN_CLASS_XTHEADVECTOR:
return riscv_subset_supports (rps, "xtheadvector");
case INSN_CLASS_XVENTANACONDOPS: case INSN_CLASS_XVENTANACONDOPS:
return riscv_subset_supports (rps, "xventanacondops"); return riscv_subset_supports (rps, "xventanacondops");
default: default:
@@ -2824,6 +2834,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
return "xtheadmempair"; return "xtheadmempair";
case INSN_CLASS_XTHEADSYNC: case INSN_CLASS_XTHEADSYNC:
return "xtheadsync"; return "xtheadsync";
case INSN_CLASS_XTHEADVECTOR:
return "xtheadvector";
default: default:
rps->error_handler rps->error_handler
(_("internal: unreachable INSN_CLASS_*")); (_("internal: unreachable INSN_CLASS_*"));

View File

@@ -31,6 +31,9 @@
* Add support for Cortex-X4 for AArch64. * Add support for Cortex-X4 for AArch64.
* Add support for various T-Head extensions (XTheadVector, XTheadZvlsseg
and XTheadZvamo) from version 2.3.0 of the T-Head ISA manual.
Changes in 2.41: Changes in 2.41:
* Add support for the KVX instruction set. * Add support for the KVX instruction set.

View File

@@ -814,6 +814,11 @@ The XTheadSync extension provides instructions for multi-processor synchronizati
It is documented in @url{https://github.com/T-head-Semi/thead-extension-spec/releases/download/2.0.0/xthead-2022-09-05-2.0.0.pdf}. It is documented in @url{https://github.com/T-head-Semi/thead-extension-spec/releases/download/2.0.0/xthead-2022-09-05-2.0.0.pdf}.
@item XTheadVector
The XTheadVector extension provides instructions for thead vector.
It is documented in @url{https://github.com/T-head-Semi/thead-extension-spec/releases/download/2.3.0/xthead-2023-11-10-2.3.0.pdf}.
@item XVentanaCondOps @item XVentanaCondOps
XVentanaCondOps extension provides instructions for branchless XVentanaCondOps extension provides instructions for branchless
sequences that perform conditional arithmetic, conditional sequences that perform conditional arithmetic, conditional

View File

@@ -0,0 +1,3 @@
#as: -march=rv64gcv_xtheadvector
#source: x-thead-vector.s
#error_output: x-thead-vector-fail.l

View File

@@ -0,0 +1,2 @@
Assembler messages:
Error: `xtheadvector' is conflict with the `v' extension

View File

View File

@@ -467,6 +467,7 @@ enum riscv_insn_class
INSN_CLASS_XTHEADMEMIDX, INSN_CLASS_XTHEADMEMIDX,
INSN_CLASS_XTHEADMEMPAIR, INSN_CLASS_XTHEADMEMPAIR,
INSN_CLASS_XTHEADSYNC, INSN_CLASS_XTHEADSYNC,
INSN_CLASS_XTHEADVECTOR,
INSN_CLASS_XVENTANACONDOPS, INSN_CLASS_XVENTANACONDOPS,
}; };