blob: bfac915576c3b85cb7c9c451f6fc5ca8c8e36e41 [file] [log] [blame]
//! `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