| //! `FromBits` and `IntoBits` between portable vector types and the |
| //! architecture-specific vector types. |
| #[rustfmt::skip] |
| |
| // FIXME: MIPS FromBits/IntoBits |
| |
| #[allow(unused)] |
| use crate::*; |
| |
| /// This macro implements FromBits for the portable and the architecture |
| /// specific vector types. |
| /// |
| /// The "leaf" case is at the bottom, and the most generic case is at the top. |
| /// The generic case is split into smaller cases recursively. |
| macro_rules! impl_arch { |
| ([$arch_head_i:ident[$arch_head_tt:tt]: $($arch_head_ty:ident),*], |
| $([$arch_tail_i:ident[$arch_tail_tt:tt]: $($arch_tail_ty:ident),*]),* | |
| from: $($from_ty:ident),* | into: $($into_ty:ident),* | |
| test: $test_tt:tt) => { |
| impl_arch!( |
| [$arch_head_i[$arch_head_tt]: $($arch_head_ty),*] | |
| from: $($from_ty),* | |
| into: $($into_ty),* | |
| test: $test_tt |
| ); |
| impl_arch!( |
| $([$arch_tail_i[$arch_tail_tt]: $($arch_tail_ty),*]),* | |
| from: $($from_ty),* | |
| into: $($into_ty),* | |
| test: $test_tt |
| ); |
| }; |
| ([$arch:ident[$arch_tt:tt]: $($arch_ty:ident),*] | |
| from: $($from_ty:ident),* | into: $($into_ty:ident),* | |
| test: $test_tt:tt) => { |
| // note: if target is "arm", "+v7,+neon" must be enabled |
| // and the std library must be recompiled with them |
| #[cfg(any( |
| not(target_arch = "arm"), |
| all(target_feature = "v7", target_feature = "neon", |
| any(feature = "core_arch", libcore_neon))) |
| )] |
| // note: if target is "powerpc", "altivec" must be enabled |
| // and the std library must be recompiled with it |
| #[cfg(any( |
| not(target_arch = "powerpc"), |
| all(target_feature = "altivec", feature = "core_arch"), |
| ))] |
| #[cfg(target_arch = $arch_tt)] |
| use crate::arch::$arch::{ |
| $($arch_ty),* |
| }; |
| |
| #[cfg(any( |
| not(target_arch = "arm"), |
| all(target_feature = "v7", target_feature = "neon", |
| any(feature = "core_arch", libcore_neon))) |
| )] |
| #[cfg(any( |
| not(target_arch = "powerpc"), |
| all(target_feature = "altivec", feature = "core_arch"), |
| ))] |
| #[cfg(target_arch = $arch_tt)] |
| impl_arch!($($arch_ty),* | $($from_ty),* | $($into_ty),* | |
| test: $test_tt); |
| }; |
| ($arch_head:ident, $($arch_tail:ident),* | $($from_ty:ident),* |
| | $($into_ty:ident),* | test: $test_tt:tt) => { |
| impl_arch!($arch_head | $($from_ty),* | $($into_ty),* | |
| test: $test_tt); |
| impl_arch!($($arch_tail),* | $($from_ty),* | $($into_ty),* | |
| test: $test_tt); |
| }; |
| ($arch_head:ident | $($from_ty:ident),* | $($into_ty:ident),* | |
| test: $test_tt:tt) => { |
| impl_from_bits!($arch_head[$test_tt]: $($from_ty),*); |
| impl_into_bits!($arch_head[$test_tt]: $($into_ty),*); |
| }; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Implementations for the 64-bit wide vector types: |
| |
| // FIXME: 64-bit single element types |
| // FIXME: arm/aarch float16x4_t missing |
| impl_arch!( |
| [ |
| arm["arm"]: int8x8_t, |
| uint8x8_t, |
| poly8x8_t, |
| int16x4_t, |
| uint16x4_t, |
| poly16x4_t, |
| int32x2_t, |
| uint32x2_t, |
| float32x2_t, |
| int64x1_t, |
| uint64x1_t |
| ], |
| [ |
| aarch64["aarch64"]: int8x8_t, |
| uint8x8_t, |
| poly8x8_t, |
| int16x4_t, |
| uint16x4_t, |
| poly16x4_t, |
| int32x2_t, |
| uint32x2_t, |
| float32x2_t, |
| int64x1_t, |
| uint64x1_t, |
| float64x1_t |
| ] | from: i8x8, |
| u8x8, |
| m8x8, |
| i16x4, |
| u16x4, |
| m16x4, |
| i32x2, |
| u32x2, |
| f32x2, |
| m32x2 | into: i8x8, |
| u8x8, |
| i16x4, |
| u16x4, |
| i32x2, |
| u32x2, |
| f32x2 | test: test_v64 |
| ); |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Implementations for the 128-bit wide vector types: |
| |
| // FIXME: arm/aarch float16x8_t missing |
| // FIXME: ppc vector_pixel missing |
| // FIXME: ppc64 vector_Float16 missing |
| // FIXME: ppc64 vector_signed_long_long missing |
| // FIXME: ppc64 vector_unsigned_long_long missing |
| // FIXME: ppc64 vector_bool_long_long missing |
| // FIXME: ppc64 vector_signed___int128 missing |
| // FIXME: ppc64 vector_unsigned___int128 missing |
| impl_arch!( |
| [x86["x86"]: __m128, __m128i, __m128d], |
| [x86_64["x86_64"]: __m128, __m128i, __m128d], |
| [ |
| arm["arm"]: int8x16_t, |
| uint8x16_t, |
| poly8x16_t, |
| int16x8_t, |
| uint16x8_t, |
| poly16x8_t, |
| int32x4_t, |
| uint32x4_t, |
| float32x4_t, |
| int64x2_t, |
| uint64x2_t |
| ], |
| [ |
| aarch64["aarch64"]: int8x16_t, |
| uint8x16_t, |
| poly8x16_t, |
| int16x8_t, |
| uint16x8_t, |
| poly16x8_t, |
| int32x4_t, |
| uint32x4_t, |
| float32x4_t, |
| int64x2_t, |
| uint64x2_t, |
| float64x2_t |
| ], |
| [ |
| powerpc["powerpc"]: vector_signed_char, |
| vector_unsigned_char, |
| vector_signed_short, |
| vector_unsigned_short, |
| vector_signed_int, |
| vector_unsigned_int, |
| vector_float |
| ], |
| [ |
| powerpc64["powerpc64"]: vector_signed_char, |
| vector_unsigned_char, |
| vector_signed_short, |
| vector_unsigned_short, |
| vector_signed_int, |
| vector_unsigned_int, |
| vector_float, |
| vector_signed_long, |
| vector_unsigned_long, |
| vector_double |
| ] | from: i8x16, |
| u8x16, |
| m8x16, |
| i16x8, |
| u16x8, |
| m16x8, |
| i32x4, |
| u32x4, |
| f32x4, |
| m32x4, |
| i64x2, |
| u64x2, |
| f64x2, |
| m64x2, |
| i128x1, |
| u128x1, |
| m128x1 | into: i8x16, |
| u8x16, |
| i16x8, |
| u16x8, |
| i32x4, |
| u32x4, |
| f32x4, |
| i64x2, |
| u64x2, |
| f64x2, |
| i128x1, |
| u128x1 | test: test_v128 |
| ); |
| |
| impl_arch!( |
| [powerpc["powerpc"]: vector_bool_char], |
| [powerpc64["powerpc64"]: vector_bool_char] | from: m8x16, |
| m16x8, |
| m32x4, |
| m64x2, |
| m128x1 | into: i8x16, |
| u8x16, |
| i16x8, |
| u16x8, |
| i32x4, |
| u32x4, |
| f32x4, |
| i64x2, |
| u64x2, |
| f64x2, |
| i128x1, |
| u128x1, |
| // Masks: |
| m8x16 | test: test_v128 |
| ); |
| |
| impl_arch!( |
| [powerpc["powerpc"]: vector_bool_short], |
| [powerpc64["powerpc64"]: vector_bool_short] | from: m16x8, |
| m32x4, |
| m64x2, |
| m128x1 | into: i8x16, |
| u8x16, |
| i16x8, |
| u16x8, |
| i32x4, |
| u32x4, |
| f32x4, |
| i64x2, |
| u64x2, |
| f64x2, |
| i128x1, |
| u128x1, |
| // Masks: |
| m8x16, |
| m16x8 | test: test_v128 |
| ); |
| |
| impl_arch!( |
| [powerpc["powerpc"]: vector_bool_int], |
| [powerpc64["powerpc64"]: vector_bool_int] | from: m32x4, |
| m64x2, |
| m128x1 | into: i8x16, |
| u8x16, |
| i16x8, |
| u16x8, |
| i32x4, |
| u32x4, |
| f32x4, |
| i64x2, |
| u64x2, |
| f64x2, |
| i128x1, |
| u128x1, |
| // Masks: |
| m8x16, |
| m16x8, |
| m32x4 | test: test_v128 |
| ); |
| |
| impl_arch!( |
| [powerpc64["powerpc64"]: vector_bool_long] | from: m64x2, |
| m128x1 | into: i8x16, |
| u8x16, |
| i16x8, |
| u16x8, |
| i32x4, |
| u32x4, |
| f32x4, |
| i64x2, |
| u64x2, |
| f64x2, |
| i128x1, |
| u128x1, |
| // Masks: |
| m8x16, |
| m16x8, |
| m32x4, |
| m64x2 | test: test_v128 |
| ); |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Implementations for the 256-bit wide vector types |
| |
| impl_arch!( |
| [x86["x86"]: __m256, __m256i, __m256d], |
| [x86_64["x86_64"]: __m256, __m256i, __m256d] | from: i8x32, |
| u8x32, |
| m8x32, |
| i16x16, |
| u16x16, |
| m16x16, |
| i32x8, |
| u32x8, |
| f32x8, |
| m32x8, |
| i64x4, |
| u64x4, |
| f64x4, |
| m64x4, |
| i128x2, |
| u128x2, |
| m128x2 | into: i8x32, |
| u8x32, |
| i16x16, |
| u16x16, |
| i32x8, |
| u32x8, |
| f32x8, |
| i64x4, |
| u64x4, |
| f64x4, |
| i128x2, |
| u128x2 | test: test_v256 |
| ); |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // FIXME: Implementations for the 512-bit wide vector types |