Auto merge of #138742 - taiki-e:riscv-vector, r=Amanieu
rustc_target: Add more RISC-V vector-related features and use zvl*b target features in vector ABI check
Currently, we have only unstable `v` target feature, but RISC-V have more vector-related extensions. The first commit of this PR adds them to unstable `riscv_target_feature`.
- `unaligned-vector-mem`: Has reasonably performant unaligned vector
- [LLVM definition](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0/llvm/lib/Target/RISCV/RISCVFeatures.td#L1379)
- Similar to currently unstable `unaligned-scalar-mem` target feature, but for vector instructions.
- `zvfh`: Vector Extension for Half-Precision Floating-Point
- [ISA Manual](https://github.com/riscv/riscv-isa-manual/blob/riscv-isa-release-2336fdc-2025-03-19/src/v-st-ext.adoc#zvfh-vector-extension-for-half-precision-floating-point)
- [LLVM definition](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0/llvm/lib/Target/RISCV/RISCVFeatures.td#L668)
- This implies `zvfhmin` and `zfhmin`
- `zvfhmin`: Vector Extension for Minimal Half-Precision Floating-Point
- [ISA Manual](https://github.com/riscv/riscv-isa-manual/blob/riscv-isa-release-2336fdc-2025-03-19/src/v-st-ext.adoc#zvfhmin-vector-extension-for-minimal-half-precision-floating-point)
- [LLVM definition](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0/llvm/lib/Target/RISCV/RISCVFeatures.td#L662)
- This implies `zve32f`
- `zve32x`, `zve32f`, `zve64x`, `zve64f`, `zve64d`: Vector Extensions for Embedded Processors
- [ISA Manual](https://github.com/riscv/riscv-isa-manual/blob/riscv-isa-release-2336fdc-2025-03-19/src/v-st-ext.adoc#zve-vector-extensions-for-embedded-processors)
- [LLVM definitions](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0/llvm/lib/Target/RISCV/RISCVFeatures.td#L612-L641)
- `zve32x` implies `zvl32b`
- `zve32f` implies `zve32x` and `f`
- `zve64x` implies `zve32x` and `zvl64b`
- `zve64f` implies `zve32f` and `zve64x`
- `zve64d` implies `zve64f` and `d`
- `v` implies `zve64d`
- `zvl*b`: Minimum Vector Length Standard Extensions
- [ISA Manual](https://github.com/riscv/riscv-isa-manual/blob/riscv-isa-release-2336fdc-2025-03-19/src/v-st-ext.adoc#zvl-minimum-vector-length-standard-extensions)
- [LLVM definitions](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0/llvm/lib/Target/RISCV/RISCVFeatures.td#L600-L610)
- `zvl{N}b` implies `zvl{N>>1}b`
- `v` implies `zvl128b`
- Vector Cryptography and Bit-manipulation Extensions
- [ISA Manual](https://github.com/riscv/riscv-isa-manual/blob/riscv-isa-release-2336fdc-2025-03-19/src/vector-crypto.adoc)
- [LLVM definitions](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0/llvm/lib/Target/RISCV/RISCVFeatures.td#L679-L807)
- `zvkb`: Vector Bit-manipulation used in Cryptography
- This implies `zve32x`
- `zvbb`: Vector basic bit-manipulation instructions
- This implies `zvkb`
- `zvbc`: Vector Carryless Multiplication
- This implies `zve64x`
- `zvkg`: Vector GCM instructions for Cryptography
- This implies `zve32x`
- `zvkned`: Vector AES Encryption & Decryption (Single Round)
- This implies `zve32x`
- `zvknha`: Vector SHA-2 (SHA-256 only))
- This implies `zve32x`
- `zvknhb`: Vector SHA-2 (SHA-256 and SHA-512)
- This implies `zve64x`
- This is superset of `zvknha`, but doesn't imply that feature at least in LLVM
- `zvksed`: SM4 Block Cipher Instructions
- This implies `zve32x`
- `zvksh`: SM3 Hash Function Instructions
- This implies `zve32x`
- `zvkt`: Vector Data-Independent Execution Latency
- Similar to already stabilized scalar cryptography extension `zkt`.
- `zvkn`: Shorthand for 'Zvkned', 'Zvknhb', 'Zvkb', and 'Zvkt'
- Similar to already stabilized scalar cryptography extension `zkn`.
- `zvknc`: Shorthand for 'Zvkn' and 'Zvbc'
- `zvkng`: shorthand for 'Zvkn' and 'Zvkg'
- `zvks`: shorthand for 'Zvksed', 'Zvksh', 'Zvkb', and 'Zvkt'
- Similar to already stabilized scalar cryptography extension `zks`.
- `zvksc`: shorthand for 'Zvks' and 'Zvbc'
- `zvksg`: shorthand for 'Zvks' and 'Zvkg'
Also, our vector ABI check wants `zvl*b` target features, the second commit of this PR updates vector ABI check to use them.
4e2b096ed6/compiler/rustc_target/src/target_features.rs (L707-L708)
---
r? `@Amanieu`
`@rustbot` label +O-riscv +A-target-feature
This commit is contained in:
commit
85f518ec8e
3 changed files with 91 additions and 5 deletions
|
@ -274,7 +274,9 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
|
|||
("arm", "fp16") => Some(LLVMFeature::new("fullfp16")),
|
||||
// In LLVM 18, `unaligned-scalar-mem` was merged with `unaligned-vector-mem` into a single
|
||||
// feature called `fast-unaligned-access`. In LLVM 19, it was split back out.
|
||||
("riscv32" | "riscv64", "unaligned-scalar-mem") if get_version().0 == 18 => {
|
||||
("riscv32" | "riscv64", "unaligned-scalar-mem" | "unaligned-vector-mem")
|
||||
if get_version().0 == 18 =>
|
||||
{
|
||||
Some(LLVMFeature::new("fast-unaligned-access"))
|
||||
}
|
||||
// Filter out features that are not supported by the current LLVM version
|
||||
|
|
|
@ -497,7 +497,8 @@ static RISCV_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
|
|||
("m", Stable, &[]),
|
||||
("relax", Unstable(sym::riscv_target_feature), &[]),
|
||||
("unaligned-scalar-mem", Unstable(sym::riscv_target_feature), &[]),
|
||||
("v", Unstable(sym::riscv_target_feature), &[]),
|
||||
("unaligned-vector-mem", Unstable(sym::riscv_target_feature), &[]),
|
||||
("v", Unstable(sym::riscv_target_feature), &["zvl128b", "zve64d"]),
|
||||
("za128rs", Unstable(sym::riscv_target_feature), &[]),
|
||||
("za64rs", Unstable(sym::riscv_target_feature), &[]),
|
||||
("zaamo", Unstable(sym::riscv_target_feature), &[]),
|
||||
|
@ -529,6 +530,41 @@ static RISCV_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
|
|||
("zksed", Stable, &[]),
|
||||
("zksh", Stable, &[]),
|
||||
("zkt", Stable, &[]),
|
||||
("zvbb", Unstable(sym::riscv_target_feature), &["zvkb"]),
|
||||
("zvbc", Unstable(sym::riscv_target_feature), &["zve64x"]),
|
||||
("zve32f", Unstable(sym::riscv_target_feature), &["zve32x", "f"]),
|
||||
("zve32x", Unstable(sym::riscv_target_feature), &["zvl32b"]),
|
||||
("zve64d", Unstable(sym::riscv_target_feature), &["zve64f", "d"]),
|
||||
("zve64f", Unstable(sym::riscv_target_feature), &["zve32f", "zve64x"]),
|
||||
("zve64x", Unstable(sym::riscv_target_feature), &["zve32x", "zvl64b"]),
|
||||
("zvfh", Unstable(sym::riscv_target_feature), &["zvfhmin", "zfhmin"]),
|
||||
("zvfhmin", Unstable(sym::riscv_target_feature), &["zve32f"]),
|
||||
("zvkb", Unstable(sym::riscv_target_feature), &["zve32x"]),
|
||||
("zvkg", Unstable(sym::riscv_target_feature), &["zve32x"]),
|
||||
("zvkn", Unstable(sym::riscv_target_feature), &["zvkned", "zvknhb", "zvkb", "zvkt"]),
|
||||
("zvknc", Unstable(sym::riscv_target_feature), &["zvkn", "zvbc"]),
|
||||
("zvkned", Unstable(sym::riscv_target_feature), &["zve32x"]),
|
||||
("zvkng", Unstable(sym::riscv_target_feature), &["zvkn", "zvkg"]),
|
||||
("zvknha", Unstable(sym::riscv_target_feature), &["zve32x"]),
|
||||
("zvknhb", Unstable(sym::riscv_target_feature), &["zve64x"]),
|
||||
("zvks", Unstable(sym::riscv_target_feature), &["zvksed", "zvksh", "zvkb", "zvkt"]),
|
||||
("zvksc", Unstable(sym::riscv_target_feature), &["zvks", "zvbc"]),
|
||||
("zvksed", Unstable(sym::riscv_target_feature), &["zve32x"]),
|
||||
("zvksg", Unstable(sym::riscv_target_feature), &["zvks", "zvkg"]),
|
||||
("zvksh", Unstable(sym::riscv_target_feature), &["zve32x"]),
|
||||
("zvkt", Unstable(sym::riscv_target_feature), &[]),
|
||||
("zvl1024b", Unstable(sym::riscv_target_feature), &["zvl512b"]),
|
||||
("zvl128b", Unstable(sym::riscv_target_feature), &["zvl64b"]),
|
||||
("zvl16384b", Unstable(sym::riscv_target_feature), &["zvl8192b"]),
|
||||
("zvl2048b", Unstable(sym::riscv_target_feature), &["zvl1024b"]),
|
||||
("zvl256b", Unstable(sym::riscv_target_feature), &["zvl128b"]),
|
||||
("zvl32768b", Unstable(sym::riscv_target_feature), &["zvl16384b"]),
|
||||
("zvl32b", Unstable(sym::riscv_target_feature), &[]),
|
||||
("zvl4096b", Unstable(sym::riscv_target_feature), &["zvl2048b"]),
|
||||
("zvl512b", Unstable(sym::riscv_target_feature), &["zvl256b"]),
|
||||
("zvl64b", Unstable(sym::riscv_target_feature), &["zvl32b"]),
|
||||
("zvl65536b", Unstable(sym::riscv_target_feature), &["zvl32768b"]),
|
||||
("zvl8192b", Unstable(sym::riscv_target_feature), &["zvl4096b"]),
|
||||
// tidy-alphabetical-end
|
||||
];
|
||||
|
||||
|
@ -704,8 +740,20 @@ const ARM_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[(1
|
|||
const POWERPC_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[(128, "altivec")];
|
||||
const WASM_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[(128, "simd128")];
|
||||
const S390X_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[(128, "vector")];
|
||||
const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] =
|
||||
&[/*(64, "zvl64b"), */ (128, "v")];
|
||||
const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[
|
||||
(32, "zvl32b"),
|
||||
(64, "zvl64b"),
|
||||
(128, "zvl128b"),
|
||||
(256, "zvl256b"),
|
||||
(512, "zvl512b"),
|
||||
(1024, "zvl1024b"),
|
||||
(2048, "zvl2048b"),
|
||||
(4096, "zvl4096b"),
|
||||
(8192, "zvl8192b"),
|
||||
(16384, "zvl16384b"),
|
||||
(32768, "zvl32768b"),
|
||||
(65536, "zvl65536b"),
|
||||
];
|
||||
// Always warn on SPARC, as the necessary target features cannot be enabled in Rust at the moment.
|
||||
const SPARC_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[/*(64, "vis")*/];
|
||||
|
||||
|
|
|
@ -245,6 +245,7 @@ LL | cfg!(target_feature = "_UNEXPECTED_VALUE");
|
|||
`trustzone`
|
||||
`ual`
|
||||
`unaligned-scalar-mem`
|
||||
`unaligned-vector-mem`
|
||||
`v`
|
||||
`v5te`
|
||||
`v6`
|
||||
|
@ -325,7 +326,42 @@ LL | cfg!(target_feature = "_UNEXPECTED_VALUE");
|
|||
`zkr`
|
||||
`zks`
|
||||
`zksed`
|
||||
`zksh`, and `zkt`
|
||||
`zksh`
|
||||
`zkt`
|
||||
`zvbb`
|
||||
`zvbc`
|
||||
`zve32f`
|
||||
`zve32x`
|
||||
`zve64d`
|
||||
`zve64f`
|
||||
`zve64x`
|
||||
`zvfh`
|
||||
`zvfhmin`
|
||||
`zvkb`
|
||||
`zvkg`
|
||||
`zvkn`
|
||||
`zvknc`
|
||||
`zvkned`
|
||||
`zvkng`
|
||||
`zvknha`
|
||||
`zvknhb`
|
||||
`zvks`
|
||||
`zvksc`
|
||||
`zvksed`
|
||||
`zvksg`
|
||||
`zvksh`
|
||||
`zvkt`
|
||||
`zvl1024b`
|
||||
`zvl128b`
|
||||
`zvl16384b`
|
||||
`zvl2048b`
|
||||
`zvl256b`
|
||||
`zvl32768b`
|
||||
`zvl32b`
|
||||
`zvl4096b`
|
||||
`zvl512b`
|
||||
`zvl64b`
|
||||
`zvl65536b`, and `zvl8192b`
|
||||
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue