summaryrefslogtreecommitdiffstats
path: root/third_party/rust/packed_simd/src/codegen/vPtr.rs
blob: abd3aa877920c36b0f9f6b0e81ca2bb7dfe1b981 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//! Pointer vector types

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

        impl<$ty> crate::sealed::Seal for [$ptr_ty; $elem_count] {}
        impl<$ty> crate::sealed::SimdArray for [$ptr_ty; $elem_count] {
            type Tuple = $tuple_id<$ptr_ty>;
            type T = $ptr_ty;
            const N: usize = $elem_count;
            type NT = [u32; $elem_count];
        }

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

    }
}

impl_simd_ptr!([*const T; 2]: cptrx2 | T | T, T);
impl_simd_ptr!([*const T; 4]: cptrx4 | T | T, T, T, T);
impl_simd_ptr!([*const T; 8]: cptrx8 | T | T, T, T, T, T, T, T, T);

impl_simd_ptr!([*mut T; 2]: mptrx2 | T | T, T);
impl_simd_ptr!([*mut T; 4]: mptrx4 | T | T, T, T, T);
impl_simd_ptr!([*mut T; 8]: mptrx8 | T | T, T, T, T, T, T, T, T);