//! Code-generation utilities

crate mod bit_manip;
crate mod llvm;
crate mod math;
crate mod reductions;
crate mod shuffle;
crate mod shuffle1_dyn;
crate mod swap_bytes;

macro_rules! impl_simd_array {
    ([$elem_ty:ident; $elem_count:expr]:
     $tuple_id:ident | $($elem_tys:ident),*) => {
        #[derive(Copy, Clone)]
        #[repr(simd)]
        pub struct $tuple_id($(crate $elem_tys),*);
        //^^^^^^^ leaked through SimdArray

        impl crate::sealed::Seal for [$elem_ty; $elem_count] {}

        impl crate::sealed::SimdArray for [$elem_ty; $elem_count] {
            type Tuple = $tuple_id;
            type T = $elem_ty;
            const N: usize = $elem_count;
            type NT = [u32; $elem_count];
        }

        impl crate::sealed::Seal for $tuple_id {}
        impl crate::sealed::Simd for $tuple_id {
            type Element = $elem_ty;
            const LANES: usize = $elem_count;
            type LanesType = [u32; $elem_count];
        }

    }
}

crate mod pointer_sized_int;

crate mod v16;
crate use self::v16::*;

crate mod v32;
crate use self::v32::*;

crate mod v64;
crate use self::v64::*;

crate mod v128;
crate use self::v128::*;

crate mod v256;
crate use self::v256::*;

crate mod v512;
crate use self::v512::*;

crate mod vSize;
crate use self::vSize::*;

crate mod vPtr;
crate use self::vPtr::*;
