use core::marker::Freeze;
use super::Element;
pub unsafe trait PrimitiveVector: Copy + Freeze {
type Element: PrimitiveElement;
const LEN: usize;
}
pub unsafe trait PrimitiveElement: Copy + Freeze {}
unsafe impl PrimitiveElement for u8 {}
unsafe impl PrimitiveElement for u16 {}
unsafe impl PrimitiveElement for u32 {}
unsafe impl PrimitiveElement for u64 {}
unsafe impl PrimitiveElement for i8 {}
unsafe impl PrimitiveElement for i16 {}
unsafe impl PrimitiveElement for i32 {}
unsafe impl PrimitiveElement for i64 {}
unsafe impl PrimitiveElement for f32 {}
unsafe impl PrimitiveElement for f64 {}
macro_rules! decl_simd_prim {
{
$(
$(#[doc = $doc:literal])*
vector $name:ident[$elem:ty; $size:literal];
)*
} => {
$(
$(#[doc = $doc])*
#[allow(non_camel_case_types)]
#[allow(dead_code)] #[derive(Copy, Clone, Debug)]
#[repr(simd)]
pub struct $name([$elem; $size]);
unsafe impl Element<$size> for $elem {
type Primitive = $name;
}
unsafe impl PrimitiveVector for $name {
type Element = $elem;
const LEN: usize = $size;
}
)*
};
}
decl_simd_prim! {
vector u8x1[u8; 1];
vector u8x2[u8; 2];
vector u8x4[u8; 4];
vector u8x8[u8; 8];
vector u8x16[u8; 16];
vector u8x32[u8; 32];
vector u8x64[u8; 64];
vector u8x128[u8; 128];
vector i8x1[i8; 1];
vector i8x2[i8; 2];
vector i8x4[i8; 4];
vector i8x8[i8; 8];
vector i8x16[i8; 16];
vector i8x32[i8; 32];
vector i8x64[i8; 64];
vector i8x128[i8; 128];
}
decl_simd_prim! {
vector u16x1[u16; 1];
vector u16x2[u16; 2];
vector u16x4[u16; 4];
vector u16x8[u16; 8];
vector u16x16[u16; 16];
vector u16x32[u16; 32];
vector u16x64[u16; 64];
vector i16x1[i16; 1];
vector i16x2[i16; 2];
vector i16x4[i16; 4];
vector i16x8[i16; 8];
vector i16x16[i16; 16];
vector i16x32[i16; 32];
vector i16x64[i16; 64];
}
decl_simd_prim! {
vector u32x1[u32; 1];
vector u32x2[u32; 2];
vector u32x4[u32; 4];
vector u32x8[u32; 8];
vector u32x16[u32; 16];
vector u32x32[u32; 32];
vector i32x1[i32; 1];
vector i32x2[i32; 2];
vector i32x4[i32; 4];
vector i32x8[i32; 8];
vector i32x16[i32; 16];
vector i32x32[i32; 32];
}
decl_simd_prim! {
vector u64x1[u64; 1];
vector u64x2[u64; 2];
vector u64x4[u64; 4];
vector u64x8[u64; 8];
vector u64x16[u64; 16];
vector i64x1[i64; 1];
vector i64x2[i64; 2];
vector i64x4[i64; 4];
vector i64x8[i64; 8];
vector i64x16[i64; 16];
}
decl_simd_prim! {
vector f32x1[f32; 1];
vector f32x2[f32; 2];
vector f32x4[f32; 4];
vector f32x8[f32; 8];
vector f32x16[f32; 16];
vector f32x32[f32; 32];
}
decl_simd_prim! {
vector f64x1[f64; 1];
vector f64x2[f64; 2];
vector f64x4[f64; 4];
vector f64x8[f64; 8];
vector f64x16[f64; 16];
}