@@ -797,17 +797,22 @@ pub fn all_rust_features() -> impl Iterator<Item = (&'static str, Stability)> {
797797// These arrays represent the least-constraining feature that is required for vector types up to a
798798// certain size to have their "proper" ABI on each architecture.
799799// Note that they must be kept sorted by vector size.
800- const X86_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
800+ const X86_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
801801 & [ ( 128 , "sse" ) , ( 256 , "avx" ) , ( 512 , "avx512f" ) ] ; // FIXME: might need changes for AVX10.
802- const AARCH64_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "neon" ) ] ;
802+ const AARCH64_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
803+ & [ ( 128 , "neon" ) ] ;
803804
804805// We might want to add "helium" too.
805- const ARM_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "neon" ) ] ;
806+ const ARM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
807+ & [ ( 128 , "neon" ) ] ;
806808
807- const POWERPC_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "altivec" ) ] ;
808- const WASM_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "simd128" ) ] ;
809- const S390X_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "vector" ) ] ;
810- const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [
809+ const POWERPC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
810+ & [ ( 128 , "altivec" ) ] ;
811+ const WASM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
812+ & [ ( 128 , "simd128" ) ] ;
813+ const S390X_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
814+ & [ ( 128 , "vector" ) ] ;
815+ const RISCV_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [
811816 ( 32 , "zvl32b" ) ,
812817 ( 64 , "zvl64b" ) ,
813818 ( 128 , "zvl128b" ) ,
@@ -822,13 +827,16 @@ const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[
822827 ( 65536 , "zvl65536b" ) ,
823828] ;
824829// Always error on SPARC, as the necessary target features cannot be enabled in Rust at the moment.
825- const SPARC_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ /*(64, "vis")*/ ] ;
830+ const SPARC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
831+ & [ /*(64, "vis")*/ ] ;
826832
827- const HEXAGON_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
833+ const HEXAGON_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
828834 & [ /*(512, "hvx-length64b"),*/ ( 1024 , "hvx-length128b" ) ] ;
829- const MIPS_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "msa" ) ] ;
830- const CSKY_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] = & [ ( 128 , "vdspv1" ) ] ;
831- const LOONGARCH_FEATURES_FOR_CORRECT_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
835+ const MIPS_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
836+ & [ ( 128 , "msa" ) ] ;
837+ const CSKY_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
838+ & [ ( 128 , "vdspv1" ) ] ;
839+ const LOONGARCH_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI : & ' static [ ( u64 , & ' static str ) ] =
832840 & [ ( 128 , "lsx" ) , ( 256 , "lasx" ) ] ;
833841
834842#[ derive( Copy , Clone , Debug ) ]
@@ -860,27 +868,38 @@ impl Target {
860868 }
861869 }
862870
863- pub fn features_for_correct_vector_abi ( & self ) -> & ' static [ ( u64 , & ' static str ) ] {
871+ pub fn features_for_correct_fixed_length_vector_abi ( & self ) -> & ' static [ ( u64 , & ' static str ) ] {
864872 match & * self . arch {
865- "x86" | "x86_64" => X86_FEATURES_FOR_CORRECT_VECTOR_ABI ,
866- "aarch64" | "arm64ec" => AARCH64_FEATURES_FOR_CORRECT_VECTOR_ABI ,
867- "arm" => ARM_FEATURES_FOR_CORRECT_VECTOR_ABI ,
868- "powerpc" | "powerpc64" => POWERPC_FEATURES_FOR_CORRECT_VECTOR_ABI ,
869- "loongarch32" | "loongarch64" => LOONGARCH_FEATURES_FOR_CORRECT_VECTOR_ABI ,
870- "riscv32" | "riscv64" => RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI ,
871- "wasm32" | "wasm64" => WASM_FEATURES_FOR_CORRECT_VECTOR_ABI ,
872- "s390x" => S390X_FEATURES_FOR_CORRECT_VECTOR_ABI ,
873- "sparc" | "sparc64" => SPARC_FEATURES_FOR_CORRECT_VECTOR_ABI ,
874- "hexagon" => HEXAGON_FEATURES_FOR_CORRECT_VECTOR_ABI ,
875- "mips" | "mips32r6" | "mips64" | "mips64r6" => MIPS_FEATURES_FOR_CORRECT_VECTOR_ABI ,
873+ "x86" | "x86_64" => X86_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
874+ "aarch64" | "arm64ec" => AARCH64_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
875+ "arm" => ARM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
876+ "powerpc" | "powerpc64" => POWERPC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
877+ "loongarch32" | "loongarch64" => LOONGARCH_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
878+ "riscv32" | "riscv64" => RISCV_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
879+ "wasm32" | "wasm64" => WASM_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
880+ "s390x" => S390X_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
881+ "sparc" | "sparc64" => SPARC_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
882+ "hexagon" => HEXAGON_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
883+ "mips" | "mips32r6" | "mips64" | "mips64r6" => {
884+ MIPS_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI
885+ }
876886 "bpf" | "m68k" => & [ ] , // no vector ABI
877- "csky" => CSKY_FEATURES_FOR_CORRECT_VECTOR_ABI ,
887+ "csky" => CSKY_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
878888 // FIXME: for some tier3 targets, we are overly cautious and always give warnings
879889 // when passing args in vector registers.
880890 _ => & [ ] ,
881891 }
882892 }
883893
894+ pub fn features_for_correct_scalable_vector_abi ( & self ) -> Option < & ' static str > {
895+ match & * self . arch {
896+ "aarch64" | "arm64ec" => Some ( "sve" ) ,
897+ "riscv32" | "riscv64" => todo ! ( ) ,
898+ // Other targets have no scalable vectors.
899+ _ => None ,
900+ }
901+ }
902+
884903 pub fn tied_target_features ( & self ) -> & ' static [ & ' static [ & ' static str ] ] {
885904 match & * self . arch {
886905 "aarch64" | "arm64ec" => AARCH64_TIED_FEATURES ,
0 commit comments