@@ -911,17 +911,22 @@ pub fn all_rust_features() -> impl Iterator<Item = (&'static str, Stability)> {
911911// These arrays represent the least-constraining feature that is required for vector types up to a
912912// certain size to have their "proper" ABI on each architecture.
913913// Note that they must be kept sorted by vector size.
914- const X86_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
914+ const X86_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
915915 & [ ( 128 , "sse" ) , ( 256 , "avx" ) , ( 512 , "avx512f" ) ] ; // FIXME: might need changes for AVX10.
916- const AARCH64_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "neon" ) ] ;
916+ const AARCH64_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
917+ & [ ( 128 , "neon" ) ] ;
917918
918919// We might want to add "helium" too.
919- const ARM_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "neon" ) ] ;
920+ const ARM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
921+ & [ ( 128 , "neon" ) ] ;
920922
921- const POWERPC_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "altivec" ) ] ;
922- const WASM_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "simd128" ) ] ;
923- const S390X_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "vector" ) ] ;
924- const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [
923+ const POWERPC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
924+ & [ ( 128 , "altivec" ) ] ;
925+ const WASM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
926+ & [ ( 128 , "simd128" ) ] ;
927+ const S390X_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
928+ & [ ( 128 , "vector" ) ] ;
929+ const RISCV_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [
925930 ( 32 , "zvl32b" ) ,
926931 ( 64 , "zvl64b" ) ,
927932 ( 128 , "zvl128b" ) ,
@@ -936,13 +941,16 @@ const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[
936941 ( 65536 , "zvl65536b" ) ,
937942] ;
938943// Always error on SPARC, as the necessary target features cannot be enabled in Rust at the moment.
939- const SPARC_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ /*(64, "vis")*/ ] ;
944+ const SPARC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
945+ & [ /*(64, "vis")*/ ] ;
940946
941- const HEXAGON_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
947+ const HEXAGON_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
942948 & [ /*(512, "hvx-length64b"),*/ ( 1024 , "hvx-length128b" ) ] ;
943- const MIPS_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "msa" ) ] ;
944- const CSKY_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "vdspv1" ) ] ;
945- const LOONGARCH_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
949+ const MIPS_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
950+ & [ ( 128 , "msa" ) ] ;
951+ const CSKY_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
952+ & [ ( 128 , "vdspv1" ) ] ;
953+ const LOONGARCH_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
946954 & [ ( 128 , "lsx" ) , ( 256 , "lasx" ) ] ;
947955
948956#[ derive( Copy , Clone , Debug ) ]
@@ -981,23 +989,25 @@ impl Target {
981989 }
982990 }
983991
984- pub fn features_for_correct_vector_abi ( & self ) -> & ' static [ ( u64 , & ' static str ) ] {
992+ pub fn features_for_correct_fixed_length_vector_abi ( & self ) -> & ' static [ ( u64 , & ' static str ) ] {
985993 match & self . arch {
986- Arch :: X86 | Arch :: X86_64 => X86_FEATURES_FOR_CORRECT_VECTOR_ABI ,
987- Arch :: AArch64 | Arch :: Arm64EC => AARCH64_FEATURES_FOR_CORRECT_VECTOR_ABI ,
988- Arch :: Arm => ARM_FEATURES_FOR_CORRECT_VECTOR_ABI ,
989- Arch :: PowerPC | Arch :: PowerPC64 => POWERPC_FEATURES_FOR_CORRECT_VECTOR_ABI ,
990- Arch :: LoongArch32 | Arch :: LoongArch64 => LOONGARCH_FEATURES_FOR_CORRECT_VECTOR_ABI ,
991- Arch :: RiscV32 | Arch :: RiscV64 => RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI ,
992- Arch :: Wasm32 | Arch :: Wasm64 => WASM_FEATURES_FOR_CORRECT_VECTOR_ABI ,
993- Arch :: S390x => S390X_FEATURES_FOR_CORRECT_VECTOR_ABI ,
994- Arch :: Sparc | Arch :: Sparc64 => SPARC_FEATURES_FOR_CORRECT_VECTOR_ABI ,
995- Arch :: Hexagon => HEXAGON_FEATURES_FOR_CORRECT_VECTOR_ABI ,
994+ Arch :: X86 | Arch :: X86_64 => X86_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
995+ Arch :: AArch64 | Arch :: Arm64EC => AARCH64_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
996+ Arch :: Arm => ARM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
997+ Arch :: PowerPC | Arch :: PowerPC64 => POWERPC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
998+ Arch :: LoongArch32 | Arch :: LoongArch64 => {
999+ LOONGARCH_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI
1000+ }
1001+ Arch :: RiscV32 | Arch :: RiscV64 => RISCV_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
1002+ Arch :: Wasm32 | Arch :: Wasm64 => WASM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
1003+ Arch :: S390x => S390X_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
1004+ Arch :: Sparc | Arch :: Sparc64 => SPARC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
1005+ Arch :: Hexagon => HEXAGON_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
9961006 Arch :: Mips | Arch :: Mips32r6 | Arch :: Mips64 | Arch :: Mips64r6 => {
997- MIPS_FEATURES_FOR_CORRECT_VECTOR_ABI
1007+ MIPS_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI
9981008 }
9991009 Arch :: Nvptx64 | Arch :: Bpf | Arch :: M68k => & [ ] , // no vector ABI
1000- Arch :: CSky => CSKY_FEATURES_FOR_CORRECT_VECTOR_ABI ,
1010+ Arch :: CSky => CSKY_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
10011011 // FIXME: for some tier3 targets, we are overly cautious and always give warnings
10021012 // when passing args in vector registers.
10031013 Arch :: AmdGpu
@@ -1010,6 +1020,14 @@ impl Target {
10101020 }
10111021 }
10121022
1023+ pub fn features_for_correct_scalable_vector_abi ( & self ) -> Option < & ' static str > {
1024+ match & self . arch {
1025+ Arch :: AArch64 | Arch :: Arm64EC => Some ( "sve" ) ,
1026+ // Other targets have no scalable vectors or they are unimplemented.
1027+ _ => None ,
1028+ }
1029+ }
1030+
10131031 pub fn tied_target_features ( & self ) -> & ' static [ & ' static [ & ' static str ] ] {
10141032 match & self . arch {
10151033 Arch :: AArch64 | Arch :: Arm64EC => AARCH64_TIED_FEATURES ,
0 commit comments