From 011aafea16428443076a01be98e53018706a7964 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Tue, 22 Sep 2020 19:41:42 -0400 Subject: [PATCH 01/15] Add initial type implementations --- .gitignore | 2 + Cargo.toml | 5 + crates/core_simd/Cargo.toml | 5 + crates/core_simd/src/lib.rs | 36 +++++++ crates/core_simd/src/macros.rs | 140 +++++++++++++++++++++++++++ crates/core_simd/src/type_f32x16.rs | 9 ++ crates/core_simd/src/type_f32x2.rs | 1 + crates/core_simd/src/type_f32x4.rs | 7 ++ crates/core_simd/src/type_f32x8.rs | 7 ++ crates/core_simd/src/type_f64x2.rs | 7 ++ crates/core_simd/src/type_f64x4.rs | 7 ++ crates/core_simd/src/type_f64x8.rs | 9 ++ crates/core_simd/src/type_i128x2.rs | 7 ++ crates/core_simd/src/type_i128x4.rs | 9 ++ crates/core_simd/src/type_i16x16.rs | 7 ++ crates/core_simd/src/type_i16x2.rs | 1 + crates/core_simd/src/type_i16x32.rs | 9 ++ crates/core_simd/src/type_i16x4.rs | 1 + crates/core_simd/src/type_i16x8.rs | 7 ++ crates/core_simd/src/type_i32x16.rs | 9 ++ crates/core_simd/src/type_i32x2.rs | 1 + crates/core_simd/src/type_i32x4.rs | 7 ++ crates/core_simd/src/type_i32x8.rs | 7 ++ crates/core_simd/src/type_i64x2.rs | 7 ++ crates/core_simd/src/type_i64x4.rs | 7 ++ crates/core_simd/src/type_i64x8.rs | 9 ++ crates/core_simd/src/type_i8x16.rs | 7 ++ crates/core_simd/src/type_i8x2.rs | 1 + crates/core_simd/src/type_i8x32.rs | 7 ++ crates/core_simd/src/type_i8x4.rs | 1 + crates/core_simd/src/type_i8x64.rs | 9 ++ crates/core_simd/src/type_i8x8.rs | 1 + crates/core_simd/src/type_isizex2.rs | 7 ++ crates/core_simd/src/type_isizex4.rs | 13 +++ crates/core_simd/src/type_isizex8.rs | 15 +++ crates/core_simd/src/type_u128x2.rs | 7 ++ crates/core_simd/src/type_u128x4.rs | 9 ++ crates/core_simd/src/type_u16x16.rs | 7 ++ crates/core_simd/src/type_u16x2.rs | 1 + crates/core_simd/src/type_u16x32.rs | 9 ++ crates/core_simd/src/type_u16x4.rs | 1 + crates/core_simd/src/type_u16x8.rs | 7 ++ crates/core_simd/src/type_u32x16.rs | 9 ++ crates/core_simd/src/type_u32x2.rs | 1 + crates/core_simd/src/type_u32x4.rs | 7 ++ crates/core_simd/src/type_u32x8.rs | 7 ++ crates/core_simd/src/type_u64x2.rs | 7 ++ crates/core_simd/src/type_u64x4.rs | 7 ++ crates/core_simd/src/type_u64x8.rs | 9 ++ crates/core_simd/src/type_u8x16.rs | 7 ++ crates/core_simd/src/type_u8x2.rs | 1 + crates/core_simd/src/type_u8x32.rs | 7 ++ crates/core_simd/src/type_u8x4.rs | 1 + crates/core_simd/src/type_u8x64.rs | 9 ++ crates/core_simd/src/type_u8x8.rs | 1 + crates/core_simd/src/type_usizex2.rs | 7 ++ crates/core_simd/src/type_usizex4.rs | 13 +++ crates/core_simd/src/type_usizex8.rs | 15 +++ 58 files changed, 533 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 crates/core_simd/Cargo.toml create mode 100644 crates/core_simd/src/lib.rs create mode 100644 crates/core_simd/src/macros.rs create mode 100644 crates/core_simd/src/type_f32x16.rs create mode 100644 crates/core_simd/src/type_f32x2.rs create mode 100644 crates/core_simd/src/type_f32x4.rs create mode 100644 crates/core_simd/src/type_f32x8.rs create mode 100644 crates/core_simd/src/type_f64x2.rs create mode 100644 crates/core_simd/src/type_f64x4.rs create mode 100644 crates/core_simd/src/type_f64x8.rs create mode 100644 crates/core_simd/src/type_i128x2.rs create mode 100644 crates/core_simd/src/type_i128x4.rs create mode 100644 crates/core_simd/src/type_i16x16.rs create mode 100644 crates/core_simd/src/type_i16x2.rs create mode 100644 crates/core_simd/src/type_i16x32.rs create mode 100644 crates/core_simd/src/type_i16x4.rs create mode 100644 crates/core_simd/src/type_i16x8.rs create mode 100644 crates/core_simd/src/type_i32x16.rs create mode 100644 crates/core_simd/src/type_i32x2.rs create mode 100644 crates/core_simd/src/type_i32x4.rs create mode 100644 crates/core_simd/src/type_i32x8.rs create mode 100644 crates/core_simd/src/type_i64x2.rs create mode 100644 crates/core_simd/src/type_i64x4.rs create mode 100644 crates/core_simd/src/type_i64x8.rs create mode 100644 crates/core_simd/src/type_i8x16.rs create mode 100644 crates/core_simd/src/type_i8x2.rs create mode 100644 crates/core_simd/src/type_i8x32.rs create mode 100644 crates/core_simd/src/type_i8x4.rs create mode 100644 crates/core_simd/src/type_i8x64.rs create mode 100644 crates/core_simd/src/type_i8x8.rs create mode 100644 crates/core_simd/src/type_isizex2.rs create mode 100644 crates/core_simd/src/type_isizex4.rs create mode 100644 crates/core_simd/src/type_isizex8.rs create mode 100644 crates/core_simd/src/type_u128x2.rs create mode 100644 crates/core_simd/src/type_u128x4.rs create mode 100644 crates/core_simd/src/type_u16x16.rs create mode 100644 crates/core_simd/src/type_u16x2.rs create mode 100644 crates/core_simd/src/type_u16x32.rs create mode 100644 crates/core_simd/src/type_u16x4.rs create mode 100644 crates/core_simd/src/type_u16x8.rs create mode 100644 crates/core_simd/src/type_u32x16.rs create mode 100644 crates/core_simd/src/type_u32x2.rs create mode 100644 crates/core_simd/src/type_u32x4.rs create mode 100644 crates/core_simd/src/type_u32x8.rs create mode 100644 crates/core_simd/src/type_u64x2.rs create mode 100644 crates/core_simd/src/type_u64x4.rs create mode 100644 crates/core_simd/src/type_u64x8.rs create mode 100644 crates/core_simd/src/type_u8x16.rs create mode 100644 crates/core_simd/src/type_u8x2.rs create mode 100644 crates/core_simd/src/type_u8x32.rs create mode 100644 crates/core_simd/src/type_u8x4.rs create mode 100644 crates/core_simd/src/type_u8x64.rs create mode 100644 crates/core_simd/src/type_u8x8.rs create mode 100644 crates/core_simd/src/type_usizex2.rs create mode 100644 crates/core_simd/src/type_usizex4.rs create mode 100644 crates/core_simd/src/type_usizex8.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..96ef6c0b944e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000000..f3538db75590 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] + +members = [ + "crates/core_simd", +] diff --git a/crates/core_simd/Cargo.toml b/crates/core_simd/Cargo.toml new file mode 100644 index 000000000000..d4aef6f059c5 --- /dev/null +++ b/crates/core_simd/Cargo.toml @@ -0,0 +1,5 @@ +[package] +name = "core_simd" +version = "0.1.0" +authors = ["Caleb Zulawski "] +edition = "2018" diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs new file mode 100644 index 000000000000..8db640157eed --- /dev/null +++ b/crates/core_simd/src/lib.rs @@ -0,0 +1,36 @@ +#![feature(repr_simd)] + +#[macro_use] +mod macros; + +macro_rules! import_types { + { $($mod:ident,)* } => { + $( + mod $mod; + pub use $mod::*; + )* + } +} + +import_types! { + type_u8x2, type_u8x4, type_u8x8, type_u8x16, type_u8x32, type_u8x64, + type_i8x2, type_i8x4, type_i8x8, type_i8x16, type_i8x32, type_i8x64, + type_u16x2, type_u16x4, type_u16x8, type_u16x16, type_u16x32, + type_i16x2, type_i16x4, type_i16x8, type_i16x16, type_i16x32, + type_u32x2, type_u32x4, type_u32x8, type_u32x16, + type_i32x2, type_i32x4, type_i32x8, type_i32x16, + type_u64x2, type_u64x4, type_u64x8, + type_i64x2, type_i64x4, type_i64x8, + type_u128x2, type_u128x4, + type_i128x2, type_i128x4, +} + +import_types! { + type_usizex2, type_usizex4, type_usizex8, + type_isizex2, type_isizex4, type_isizex8, +} + +import_types! { + type_f32x2, type_f32x4, type_f32x8, type_f32x16, + type_f64x2, type_f64x4, type_f64x8, +} diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs new file mode 100644 index 000000000000..70b19e5f4dbc --- /dev/null +++ b/crates/core_simd/src/macros.rs @@ -0,0 +1,140 @@ +macro_rules! from_aligned { + { unsafe $from:ty => $to:ty } => { + impl core::convert::From<$from> for $to { + #[inline] + fn from(value: $from) -> $to { + assert_eq!(core::mem::size_of::<$from>(), core::mem::size_of::<$to>()); + assert!(core::mem::align_of::<$from>() >= core::mem::align_of::<$to>()); + unsafe { core::mem::transmute(value) } + } + } + }; + { unsafe $a:ty |bidirectional| $b:ty } => { + from_aligned!{ unsafe $a => $b } + from_aligned!{ unsafe $b => $a } + } +} + +macro_rules! from_unaligned { + { unsafe $from:ty => $to:ty } => { + impl core::convert::From<$from> for $to { + #[inline] + fn from(value: $from) -> $to { + assert_eq!(core::mem::size_of::<$from>(), core::mem::size_of::<$to>()); + unsafe { (&value as *const $from as *const $to).read_unaligned() } + } + } + } +} + +macro_rules! define_type { + { struct $name:ident([$type:ty; $lanes:tt]); } => { + define_type! { @impl $name [$type; $lanes] } + + // array references + impl AsRef<[$type; $lanes]> for $name { + #[inline] + fn as_ref(&self) -> &[$type; $lanes] { + unsafe { &*(self as *const _ as *const _) } + } + } + + impl AsMut<[$type; $lanes]> for $name { + #[inline] + fn as_mut(&mut self) -> &mut [$type; $lanes] { + unsafe { &mut *(self as *mut _ as *mut _) } + } + } + + // slice references + impl AsRef<[$type]> for $name { + #[inline] + fn as_ref(&self) -> &[$type] { + AsRef::<[$type; $lanes]>::as_ref(self) + } + } + + impl AsMut<[$type]> for $name { + #[inline] + fn as_mut(&mut self) -> &mut [$type] { + AsMut::<[$type; $lanes]>::as_mut(self) + } + } + + // vector to array + from_aligned! { unsafe $name => [$type; $lanes] } + + // array to vector + from_unaligned! { unsafe [$type; $lanes] => $name } + + // splat + impl From<$type> for $name { + fn from(value: $type) -> Self { + Self::splat(value) + } + } + }; + { @impl $name:ident [$type:ty; 1] } => { + define_type! { @impl $name | $type | $type, | v0, } + }; + { @impl $name:ident [$type:ty; 2] } => { + define_type! { @impl $name | $type | $type, $type, | v0, v1, } + }; + { @impl $name:ident [$type:ty; 4] } => { + define_type! { @impl $name | $type | + $type, $type, $type, $type, | + v0, v1, v2, v3, + } + }; + { @impl $name:ident [$type:ty; 8] } => { + define_type! { @impl $name | $type | + $type, $type, $type, $type, $type, $type, $type, $type, | + v0, v1, v2, v3, v4, v5, v6, v7, + } + }; + { @impl $name:ident [$type:ty; 16] } => { + define_type! { @impl $name | $type | + $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | + v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, + } + }; + { @impl $name:ident [$type:ty; 32] } => { + define_type! { @impl $name | $type | + $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, + $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | + v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, + v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, + } + }; + { @impl $name:ident [$type:ty; 64] } => { + define_type! { @impl $name | $type | + $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, + $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, + $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, + $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | + v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, + v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, + v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, + v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63, + } + }; + { @impl $name:ident | $type:ty | $($itype:ty,)* | $($ivar:ident,)* } => { + #[allow(non_camel_case_types)] + #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)] + #[repr(simd)] + pub struct $name($($itype),*); + + impl $name { + #[inline] + pub fn splat(value: $type) -> Self { + Self($(value as $itype),*) + } + + #[allow(clippy::too_many_arguments)] + #[inline] + pub fn new($($ivar: $itype),*) -> Self { + Self($($ivar),*) + } + } + } +} diff --git a/crates/core_simd/src/type_f32x16.rs b/crates/core_simd/src/type_f32x16.rs new file mode 100644 index 000000000000..f001b9c42df4 --- /dev/null +++ b/crates/core_simd/src/type_f32x16.rs @@ -0,0 +1,9 @@ +define_type! { struct f32x16([f32; 16]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86::__m512 } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86_64::__m512 } +*/ diff --git a/crates/core_simd/src/type_f32x2.rs b/crates/core_simd/src/type_f32x2.rs new file mode 100644 index 000000000000..e6691523ea9f --- /dev/null +++ b/crates/core_simd/src/type_f32x2.rs @@ -0,0 +1 @@ +define_type! { struct f32x2([f32; 2]); } diff --git a/crates/core_simd/src/type_f32x4.rs b/crates/core_simd/src/type_f32x4.rs new file mode 100644 index 000000000000..4fd937425c50 --- /dev/null +++ b/crates/core_simd/src/type_f32x4.rs @@ -0,0 +1,7 @@ +define_type! { struct f32x4([f32; 4]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86::__m128 } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86_64::__m128 } diff --git a/crates/core_simd/src/type_f32x8.rs b/crates/core_simd/src/type_f32x8.rs new file mode 100644 index 000000000000..a6754d490c1a --- /dev/null +++ b/crates/core_simd/src/type_f32x8.rs @@ -0,0 +1,7 @@ +define_type! { struct f32x8([f32; 8]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86::__m256 } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86_64::__m256 } diff --git a/crates/core_simd/src/type_f64x2.rs b/crates/core_simd/src/type_f64x2.rs new file mode 100644 index 000000000000..227ef951434d --- /dev/null +++ b/crates/core_simd/src/type_f64x2.rs @@ -0,0 +1,7 @@ +define_type! { struct f64x2([f64; 2]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86::__m128d } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86_64::__m128d } diff --git a/crates/core_simd/src/type_f64x4.rs b/crates/core_simd/src/type_f64x4.rs new file mode 100644 index 000000000000..8e9debd8bfde --- /dev/null +++ b/crates/core_simd/src/type_f64x4.rs @@ -0,0 +1,7 @@ +define_type! { struct f64x4([f64; 4]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86::__m256d } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86_64::__m256d } diff --git a/crates/core_simd/src/type_f64x8.rs b/crates/core_simd/src/type_f64x8.rs new file mode 100644 index 000000000000..8aa3812b4f43 --- /dev/null +++ b/crates/core_simd/src/type_f64x8.rs @@ -0,0 +1,9 @@ +define_type! { struct f64x8([f64; 8]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86::__m512d } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86_64::__m512d } +*/ diff --git a/crates/core_simd/src/type_i128x2.rs b/crates/core_simd/src/type_i128x2.rs new file mode 100644 index 000000000000..cb1be5a9866c --- /dev/null +++ b/crates/core_simd/src/type_i128x2.rs @@ -0,0 +1,7 @@ +define_type! { struct i128x2([i128; 2]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i128x4.rs b/crates/core_simd/src/type_i128x4.rs new file mode 100644 index 000000000000..8888d4205f86 --- /dev/null +++ b/crates/core_simd/src/type_i128x4.rs @@ -0,0 +1,9 @@ +define_type! { struct i128x4([i128; 4]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_i16x16.rs b/crates/core_simd/src/type_i16x16.rs new file mode 100644 index 000000000000..ec52c4857763 --- /dev/null +++ b/crates/core_simd/src/type_i16x16.rs @@ -0,0 +1,7 @@ +define_type! { struct i16x16([i16; 16]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i16x2.rs b/crates/core_simd/src/type_i16x2.rs new file mode 100644 index 000000000000..313ba334da19 --- /dev/null +++ b/crates/core_simd/src/type_i16x2.rs @@ -0,0 +1 @@ +define_type! { struct i16x2([i16; 2]); } diff --git a/crates/core_simd/src/type_i16x32.rs b/crates/core_simd/src/type_i16x32.rs new file mode 100644 index 000000000000..53679e2ac5c4 --- /dev/null +++ b/crates/core_simd/src/type_i16x32.rs @@ -0,0 +1,9 @@ +define_type! { struct i16x32([i16; 32]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_i16x4.rs b/crates/core_simd/src/type_i16x4.rs new file mode 100644 index 000000000000..f69f5dc2acda --- /dev/null +++ b/crates/core_simd/src/type_i16x4.rs @@ -0,0 +1 @@ +define_type! { struct i16x4([i16; 4]); } diff --git a/crates/core_simd/src/type_i16x8.rs b/crates/core_simd/src/type_i16x8.rs new file mode 100644 index 000000000000..b1a3100dd6e2 --- /dev/null +++ b/crates/core_simd/src/type_i16x8.rs @@ -0,0 +1,7 @@ +define_type! { struct i16x8([i16; 8]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i32x16.rs b/crates/core_simd/src/type_i32x16.rs new file mode 100644 index 000000000000..5b7edb0f51bb --- /dev/null +++ b/crates/core_simd/src/type_i32x16.rs @@ -0,0 +1,9 @@ +define_type! { struct i32x16([i32; 16]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_i32x2.rs b/crates/core_simd/src/type_i32x2.rs new file mode 100644 index 000000000000..425b6fd3bca8 --- /dev/null +++ b/crates/core_simd/src/type_i32x2.rs @@ -0,0 +1 @@ +define_type! { struct i32x2([i32; 2]); } diff --git a/crates/core_simd/src/type_i32x4.rs b/crates/core_simd/src/type_i32x4.rs new file mode 100644 index 000000000000..d62fc3856340 --- /dev/null +++ b/crates/core_simd/src/type_i32x4.rs @@ -0,0 +1,7 @@ +define_type! { struct i32x4([i32; 4]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i32x8.rs b/crates/core_simd/src/type_i32x8.rs new file mode 100644 index 000000000000..ee83854cee4e --- /dev/null +++ b/crates/core_simd/src/type_i32x8.rs @@ -0,0 +1,7 @@ +define_type! { struct i32x8([i32; 8]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i64x2.rs b/crates/core_simd/src/type_i64x2.rs new file mode 100644 index 000000000000..35af990ec649 --- /dev/null +++ b/crates/core_simd/src/type_i64x2.rs @@ -0,0 +1,7 @@ +define_type! { struct i64x2([i64; 2]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i64x4.rs b/crates/core_simd/src/type_i64x4.rs new file mode 100644 index 000000000000..6f69a492ede9 --- /dev/null +++ b/crates/core_simd/src/type_i64x4.rs @@ -0,0 +1,7 @@ +define_type! { struct i64x4([i64; 4]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i64x8.rs b/crates/core_simd/src/type_i64x8.rs new file mode 100644 index 000000000000..888c9b6612c0 --- /dev/null +++ b/crates/core_simd/src/type_i64x8.rs @@ -0,0 +1,9 @@ +define_type! { struct i64x8([i64; 8]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_i8x16.rs b/crates/core_simd/src/type_i8x16.rs new file mode 100644 index 000000000000..32ea4fa82934 --- /dev/null +++ b/crates/core_simd/src/type_i8x16.rs @@ -0,0 +1,7 @@ +define_type! { struct i8x16([i8; 16]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i8x2.rs b/crates/core_simd/src/type_i8x2.rs new file mode 100644 index 000000000000..a36de2c5421d --- /dev/null +++ b/crates/core_simd/src/type_i8x2.rs @@ -0,0 +1 @@ +define_type! { struct i8x2([i8; 2]); } diff --git a/crates/core_simd/src/type_i8x32.rs b/crates/core_simd/src/type_i8x32.rs new file mode 100644 index 000000000000..874fcdd1e96a --- /dev/null +++ b/crates/core_simd/src/type_i8x32.rs @@ -0,0 +1,7 @@ +define_type! { struct i8x32([i8; 32]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i8x4.rs b/crates/core_simd/src/type_i8x4.rs new file mode 100644 index 000000000000..5be83d5e0377 --- /dev/null +++ b/crates/core_simd/src/type_i8x4.rs @@ -0,0 +1 @@ +define_type! { struct i8x4([i8; 4]); } diff --git a/crates/core_simd/src/type_i8x64.rs b/crates/core_simd/src/type_i8x64.rs new file mode 100644 index 000000000000..d21baf12640a --- /dev/null +++ b/crates/core_simd/src/type_i8x64.rs @@ -0,0 +1,9 @@ +define_type! { struct i8x64([i8; 64]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_i8x8.rs b/crates/core_simd/src/type_i8x8.rs new file mode 100644 index 000000000000..f09a70f6cb9d --- /dev/null +++ b/crates/core_simd/src/type_i8x8.rs @@ -0,0 +1 @@ +define_type! { struct i8x8([i8; 8]); } diff --git a/crates/core_simd/src/type_isizex2.rs b/crates/core_simd/src/type_isizex2.rs new file mode 100644 index 000000000000..aa3abaa8c4e7 --- /dev/null +++ b/crates/core_simd/src/type_isizex2.rs @@ -0,0 +1,7 @@ +define_type! { struct isizex2([isize; 2]); } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_isizex4.rs b/crates/core_simd/src/type_isizex4.rs new file mode 100644 index 000000000000..2c0d7d33ba53 --- /dev/null +++ b/crates/core_simd/src/type_isizex4.rs @@ -0,0 +1,13 @@ +define_type! { struct isizex4([isize; 4]); } + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_isizex8.rs b/crates/core_simd/src/type_isizex8.rs new file mode 100644 index 000000000000..cc2f9ad550f1 --- /dev/null +++ b/crates/core_simd/src/type_isizex8.rs @@ -0,0 +1,15 @@ +define_type! { struct isizex8([isize; 8]); } + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_u128x2.rs b/crates/core_simd/src/type_u128x2.rs new file mode 100644 index 000000000000..cbed75896160 --- /dev/null +++ b/crates/core_simd/src/type_u128x2.rs @@ -0,0 +1,7 @@ +define_type! { struct u128x2([u128; 2]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u128x4.rs b/crates/core_simd/src/type_u128x4.rs new file mode 100644 index 000000000000..563689621eec --- /dev/null +++ b/crates/core_simd/src/type_u128x4.rs @@ -0,0 +1,9 @@ +define_type! { struct u128x4([u128; 4]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_u16x16.rs b/crates/core_simd/src/type_u16x16.rs new file mode 100644 index 000000000000..50f39983b385 --- /dev/null +++ b/crates/core_simd/src/type_u16x16.rs @@ -0,0 +1,7 @@ +define_type! { struct u16x16([u16; 16]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u16x2.rs b/crates/core_simd/src/type_u16x2.rs new file mode 100644 index 000000000000..d0384e40f94a --- /dev/null +++ b/crates/core_simd/src/type_u16x2.rs @@ -0,0 +1 @@ +define_type! { struct u16x2([u16; 2]); } diff --git a/crates/core_simd/src/type_u16x32.rs b/crates/core_simd/src/type_u16x32.rs new file mode 100644 index 000000000000..29cf58581a92 --- /dev/null +++ b/crates/core_simd/src/type_u16x32.rs @@ -0,0 +1,9 @@ +define_type! { struct u16x32([u16; 32]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_u16x4.rs b/crates/core_simd/src/type_u16x4.rs new file mode 100644 index 000000000000..0c4e3ed9b7de --- /dev/null +++ b/crates/core_simd/src/type_u16x4.rs @@ -0,0 +1 @@ +define_type! { struct u16x4([u16; 4]); } diff --git a/crates/core_simd/src/type_u16x8.rs b/crates/core_simd/src/type_u16x8.rs new file mode 100644 index 000000000000..69127996f7f9 --- /dev/null +++ b/crates/core_simd/src/type_u16x8.rs @@ -0,0 +1,7 @@ +define_type! { struct u16x8([u16; 8]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u32x16.rs b/crates/core_simd/src/type_u32x16.rs new file mode 100644 index 000000000000..1b8965685b8d --- /dev/null +++ b/crates/core_simd/src/type_u32x16.rs @@ -0,0 +1,9 @@ +define_type! { struct u32x16([u32; 16]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_u32x2.rs b/crates/core_simd/src/type_u32x2.rs new file mode 100644 index 000000000000..8d9d53595253 --- /dev/null +++ b/crates/core_simd/src/type_u32x2.rs @@ -0,0 +1 @@ +define_type! { struct u32x2([u32; 2]); } diff --git a/crates/core_simd/src/type_u32x4.rs b/crates/core_simd/src/type_u32x4.rs new file mode 100644 index 000000000000..fc79dff0e5b7 --- /dev/null +++ b/crates/core_simd/src/type_u32x4.rs @@ -0,0 +1,7 @@ +define_type! { struct u32x4([u32; 4]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u32x8.rs b/crates/core_simd/src/type_u32x8.rs new file mode 100644 index 000000000000..727b87860c96 --- /dev/null +++ b/crates/core_simd/src/type_u32x8.rs @@ -0,0 +1,7 @@ +define_type! { struct u32x8([u32; 8]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u64x2.rs b/crates/core_simd/src/type_u64x2.rs new file mode 100644 index 000000000000..729982f77356 --- /dev/null +++ b/crates/core_simd/src/type_u64x2.rs @@ -0,0 +1,7 @@ +define_type! { struct u64x2([u64; 2]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u64x4.rs b/crates/core_simd/src/type_u64x4.rs new file mode 100644 index 000000000000..7e1aa9733819 --- /dev/null +++ b/crates/core_simd/src/type_u64x4.rs @@ -0,0 +1,7 @@ +define_type! { struct u64x4([u64; 4]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u64x8.rs b/crates/core_simd/src/type_u64x8.rs new file mode 100644 index 000000000000..ed0769d13117 --- /dev/null +++ b/crates/core_simd/src/type_u64x8.rs @@ -0,0 +1,9 @@ +define_type! { struct u64x8([u64; 8]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_u8x16.rs b/crates/core_simd/src/type_u8x16.rs new file mode 100644 index 000000000000..69d788ef2b64 --- /dev/null +++ b/crates/core_simd/src/type_u8x16.rs @@ -0,0 +1,7 @@ +define_type! { struct u8x16([u8; 16]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u8x2.rs b/crates/core_simd/src/type_u8x2.rs new file mode 100644 index 000000000000..5ab66878b82e --- /dev/null +++ b/crates/core_simd/src/type_u8x2.rs @@ -0,0 +1 @@ +define_type! { struct u8x2([u8; 2]); } diff --git a/crates/core_simd/src/type_u8x32.rs b/crates/core_simd/src/type_u8x32.rs new file mode 100644 index 000000000000..102724684cb8 --- /dev/null +++ b/crates/core_simd/src/type_u8x32.rs @@ -0,0 +1,7 @@ +define_type! { struct u8x32([u8; 32]); } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u8x4.rs b/crates/core_simd/src/type_u8x4.rs new file mode 100644 index 000000000000..648d12b9e2d0 --- /dev/null +++ b/crates/core_simd/src/type_u8x4.rs @@ -0,0 +1 @@ +define_type! { struct u8x4([u8; 4]); } diff --git a/crates/core_simd/src/type_u8x64.rs b/crates/core_simd/src/type_u8x64.rs new file mode 100644 index 000000000000..1e2967d485ae --- /dev/null +++ b/crates/core_simd/src/type_u8x64.rs @@ -0,0 +1,9 @@ +define_type! { struct u8x64([u8; 64]); } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/type_u8x8.rs b/crates/core_simd/src/type_u8x8.rs new file mode 100644 index 000000000000..aa62e04ddf23 --- /dev/null +++ b/crates/core_simd/src/type_u8x8.rs @@ -0,0 +1 @@ +define_type! { struct u8x8([u8; 8]); } diff --git a/crates/core_simd/src/type_usizex2.rs b/crates/core_simd/src/type_usizex2.rs new file mode 100644 index 000000000000..083cd499a074 --- /dev/null +++ b/crates/core_simd/src/type_usizex2.rs @@ -0,0 +1,7 @@ +define_type! { struct usizex2([usize; 2]); } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_usizex4.rs b/crates/core_simd/src/type_usizex4.rs new file mode 100644 index 000000000000..3301039a05a1 --- /dev/null +++ b/crates/core_simd/src/type_usizex4.rs @@ -0,0 +1,13 @@ +define_type! { struct usizex4([usize; 4]); } + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_usizex8.rs b/crates/core_simd/src/type_usizex8.rs new file mode 100644 index 000000000000..e21b1ea6b7a0 --- /dev/null +++ b/crates/core_simd/src/type_usizex8.rs @@ -0,0 +1,15 @@ +define_type! { struct usizex8([usize; 8]); } + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m512i } +*/ From 0f837a9147a1ba22cfb12a4480ce1c18d3afc6b8 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Tue, 22 Sep 2020 20:26:25 -0400 Subject: [PATCH 02/15] Add docs --- crates/core_simd/src/macros.rs | 37 +++++++++++++++------------- crates/core_simd/src/type_f32x16.rs | 5 +++- crates/core_simd/src/type_f32x2.rs | 5 +++- crates/core_simd/src/type_f32x4.rs | 5 +++- crates/core_simd/src/type_f32x8.rs | 5 +++- crates/core_simd/src/type_f64x2.rs | 5 +++- crates/core_simd/src/type_f64x4.rs | 5 +++- crates/core_simd/src/type_f64x8.rs | 5 +++- crates/core_simd/src/type_i128x2.rs | 5 +++- crates/core_simd/src/type_i128x4.rs | 5 +++- crates/core_simd/src/type_i16x16.rs | 5 +++- crates/core_simd/src/type_i16x2.rs | 5 +++- crates/core_simd/src/type_i16x32.rs | 5 +++- crates/core_simd/src/type_i16x4.rs | 5 +++- crates/core_simd/src/type_i16x8.rs | 5 +++- crates/core_simd/src/type_i32x16.rs | 5 +++- crates/core_simd/src/type_i32x2.rs | 5 +++- crates/core_simd/src/type_i32x4.rs | 5 +++- crates/core_simd/src/type_i32x8.rs | 5 +++- crates/core_simd/src/type_i64x2.rs | 5 +++- crates/core_simd/src/type_i64x4.rs | 5 +++- crates/core_simd/src/type_i64x8.rs | 5 +++- crates/core_simd/src/type_i8x16.rs | 5 +++- crates/core_simd/src/type_i8x2.rs | 5 +++- crates/core_simd/src/type_i8x32.rs | 5 +++- crates/core_simd/src/type_i8x4.rs | 5 +++- crates/core_simd/src/type_i8x64.rs | 5 +++- crates/core_simd/src/type_i8x8.rs | 5 +++- crates/core_simd/src/type_isizex2.rs | 5 +++- crates/core_simd/src/type_isizex4.rs | 5 +++- crates/core_simd/src/type_isizex8.rs | 5 +++- crates/core_simd/src/type_u128x2.rs | 5 +++- crates/core_simd/src/type_u128x4.rs | 5 +++- crates/core_simd/src/type_u16x16.rs | 5 +++- crates/core_simd/src/type_u16x2.rs | 5 +++- crates/core_simd/src/type_u16x32.rs | 5 +++- crates/core_simd/src/type_u16x4.rs | 5 +++- crates/core_simd/src/type_u16x8.rs | 5 +++- crates/core_simd/src/type_u32x16.rs | 5 +++- crates/core_simd/src/type_u32x2.rs | 5 +++- crates/core_simd/src/type_u32x4.rs | 5 +++- crates/core_simd/src/type_u32x8.rs | 5 +++- crates/core_simd/src/type_u64x2.rs | 5 +++- crates/core_simd/src/type_u64x4.rs | 5 +++- crates/core_simd/src/type_u64x8.rs | 5 +++- crates/core_simd/src/type_u8x16.rs | 5 +++- crates/core_simd/src/type_u8x2.rs | 5 +++- crates/core_simd/src/type_u8x32.rs | 5 +++- crates/core_simd/src/type_u8x4.rs | 5 +++- crates/core_simd/src/type_u8x64.rs | 5 +++- crates/core_simd/src/type_u8x8.rs | 5 +++- crates/core_simd/src/type_usizex2.rs | 5 +++- crates/core_simd/src/type_usizex4.rs | 5 +++- crates/core_simd/src/type_usizex8.rs | 5 +++- 54 files changed, 232 insertions(+), 70 deletions(-) diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 70b19e5f4dbc..64d9c4b217f7 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -28,8 +28,8 @@ macro_rules! from_unaligned { } macro_rules! define_type { - { struct $name:ident([$type:ty; $lanes:tt]); } => { - define_type! { @impl $name [$type; $lanes] } + { $(#[$attr:meta])* struct $name:ident([$type:ty; $lanes:tt]); } => { + define_type! { @impl $(#[$attr])* | $name [$type; $lanes] } // array references impl AsRef<[$type; $lanes]> for $name { @@ -74,40 +74,40 @@ macro_rules! define_type { } } }; - { @impl $name:ident [$type:ty; 1] } => { - define_type! { @impl $name | $type | $type, | v0, } + { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 1] } => { + define_type! { @def $(#[$attr])* | $name | $type | $type, | v0, } }; - { @impl $name:ident [$type:ty; 2] } => { - define_type! { @impl $name | $type | $type, $type, | v0, v1, } + { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 2] } => { + define_type! { @def $(#[$attr])* | $name | $type | $type, $type, | v0, v1, } }; - { @impl $name:ident [$type:ty; 4] } => { - define_type! { @impl $name | $type | + { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 4] } => { + define_type! { @def $(#[$attr])* | $name | $type | $type, $type, $type, $type, | v0, v1, v2, v3, } }; - { @impl $name:ident [$type:ty; 8] } => { - define_type! { @impl $name | $type | + { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 8] } => { + define_type! { @def $(#[$attr])* | $name | $type | $type, $type, $type, $type, $type, $type, $type, $type, | v0, v1, v2, v3, v4, v5, v6, v7, } }; - { @impl $name:ident [$type:ty; 16] } => { - define_type! { @impl $name | $type | + { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 16] } => { + define_type! { @def $(#[$attr])* | $name | $type | $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, } }; - { @impl $name:ident [$type:ty; 32] } => { - define_type! { @impl $name | $type | + { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 32] } => { + define_type! { @def $(#[$attr])* | $name | $type | $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, } }; - { @impl $name:ident [$type:ty; 64] } => { - define_type! { @impl $name | $type | + { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 64] } => { + define_type! { @def $(#[$attr])* | $name | $type | $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, @@ -118,18 +118,21 @@ macro_rules! define_type { v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63, } }; - { @impl $name:ident | $type:ty | $($itype:ty,)* | $($ivar:ident,)* } => { + { @def $(#[$attr:meta])* | $name:ident | $type:ty | $($itype:ty,)* | $($ivar:ident,)* } => { + $(#[$attr])* #[allow(non_camel_case_types)] #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)] #[repr(simd)] pub struct $name($($itype),*); impl $name { + /// Construct a vector by setting each lane to a single value. #[inline] pub fn splat(value: $type) -> Self { Self($(value as $itype),*) } + /// Construct a vector by setting each lane. #[allow(clippy::too_many_arguments)] #[inline] pub fn new($($ivar: $itype),*) -> Self { diff --git a/crates/core_simd/src/type_f32x16.rs b/crates/core_simd/src/type_f32x16.rs index f001b9c42df4..45fb4a3175bb 100644 --- a/crates/core_simd/src/type_f32x16.rs +++ b/crates/core_simd/src/type_f32x16.rs @@ -1,4 +1,7 @@ -define_type! { struct f32x16([f32; 16]); } +define_type! { + #[doc = "Vector of 16 `f32` types"] + struct f32x16([f32; 16]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_f32x2.rs b/crates/core_simd/src/type_f32x2.rs index e6691523ea9f..8b60a2ee76f4 100644 --- a/crates/core_simd/src/type_f32x2.rs +++ b/crates/core_simd/src/type_f32x2.rs @@ -1 +1,4 @@ -define_type! { struct f32x2([f32; 2]); } +define_type! { + #[doc = "Vector of two `f32` types"] + struct f32x2([f32; 2]); +} diff --git a/crates/core_simd/src/type_f32x4.rs b/crates/core_simd/src/type_f32x4.rs index 4fd937425c50..452e607732cf 100644 --- a/crates/core_simd/src/type_f32x4.rs +++ b/crates/core_simd/src/type_f32x4.rs @@ -1,4 +1,7 @@ -define_type! { struct f32x4([f32; 4]); } +define_type! { + #[doc = "Vector of four `f32` types"] + struct f32x4([f32; 4]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86::__m128 } diff --git a/crates/core_simd/src/type_f32x8.rs b/crates/core_simd/src/type_f32x8.rs index a6754d490c1a..790a546e4e73 100644 --- a/crates/core_simd/src/type_f32x8.rs +++ b/crates/core_simd/src/type_f32x8.rs @@ -1,4 +1,7 @@ -define_type! { struct f32x8([f32; 8]); } +define_type! { + #[doc = "Vector of eight `f32` types"] + struct f32x8([f32; 8]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86::__m256 } diff --git a/crates/core_simd/src/type_f64x2.rs b/crates/core_simd/src/type_f64x2.rs index 227ef951434d..0c349f38c862 100644 --- a/crates/core_simd/src/type_f64x2.rs +++ b/crates/core_simd/src/type_f64x2.rs @@ -1,4 +1,7 @@ -define_type! { struct f64x2([f64; 2]); } +define_type! { + #[doc = "Vector of two `f64` types"] + struct f64x2([f64; 2]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86::__m128d } diff --git a/crates/core_simd/src/type_f64x4.rs b/crates/core_simd/src/type_f64x4.rs index 8e9debd8bfde..ec6b46bc8c84 100644 --- a/crates/core_simd/src/type_f64x4.rs +++ b/crates/core_simd/src/type_f64x4.rs @@ -1,4 +1,7 @@ -define_type! { struct f64x4([f64; 4]); } +define_type! { + #[doc = "Vector of four `f64` types"] + struct f64x4([f64; 4]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86::__m256d } diff --git a/crates/core_simd/src/type_f64x8.rs b/crates/core_simd/src/type_f64x8.rs index 8aa3812b4f43..dd65dc6b39ab 100644 --- a/crates/core_simd/src/type_f64x8.rs +++ b/crates/core_simd/src/type_f64x8.rs @@ -1,4 +1,7 @@ -define_type! { struct f64x8([f64; 8]); } +define_type! { + #[doc = "Vector of eight `f64` types"] + struct f64x8([f64; 8]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_i128x2.rs b/crates/core_simd/src/type_i128x2.rs index cb1be5a9866c..1ac736ddf3a2 100644 --- a/crates/core_simd/src/type_i128x2.rs +++ b/crates/core_simd/src/type_i128x2.rs @@ -1,4 +1,7 @@ -define_type! { struct i128x2([i128; 2]); } +define_type! { + #[doc = "Vector of two `i128` types"] + struct i128x2([i128; 2]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_i128x4.rs b/crates/core_simd/src/type_i128x4.rs index 8888d4205f86..6cef039d947a 100644 --- a/crates/core_simd/src/type_i128x4.rs +++ b/crates/core_simd/src/type_i128x4.rs @@ -1,4 +1,7 @@ -define_type! { struct i128x4([i128; 4]); } +define_type! { + #[doc = "Vector of four `i128` types"] + struct i128x4([i128; 4]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_i16x16.rs b/crates/core_simd/src/type_i16x16.rs index ec52c4857763..1721286128fe 100644 --- a/crates/core_simd/src/type_i16x16.rs +++ b/crates/core_simd/src/type_i16x16.rs @@ -1,4 +1,7 @@ -define_type! { struct i16x16([i16; 16]); } +define_type! { + #[doc = "Vector of 16 `i16` types"] + struct i16x16([i16; 16]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_i16x2.rs b/crates/core_simd/src/type_i16x2.rs index 313ba334da19..7ccbbe7f2d0a 100644 --- a/crates/core_simd/src/type_i16x2.rs +++ b/crates/core_simd/src/type_i16x2.rs @@ -1 +1,4 @@ -define_type! { struct i16x2([i16; 2]); } +define_type! { + #[doc = "Vector of two `i16` types"] + struct i16x2([i16; 2]); +} diff --git a/crates/core_simd/src/type_i16x32.rs b/crates/core_simd/src/type_i16x32.rs index 53679e2ac5c4..349d094a1bc9 100644 --- a/crates/core_simd/src/type_i16x32.rs +++ b/crates/core_simd/src/type_i16x32.rs @@ -1,4 +1,7 @@ -define_type! { struct i16x32([i16; 32]); } +define_type! { + #[doc = "Vector of 32 `i16` types"] + struct i16x32([i16; 32]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_i16x4.rs b/crates/core_simd/src/type_i16x4.rs index f69f5dc2acda..348bc4c53a94 100644 --- a/crates/core_simd/src/type_i16x4.rs +++ b/crates/core_simd/src/type_i16x4.rs @@ -1 +1,4 @@ -define_type! { struct i16x4([i16; 4]); } +define_type! { + #[doc = "Vector of four `i16` types"] + struct i16x4([i16; 4]); +} diff --git a/crates/core_simd/src/type_i16x8.rs b/crates/core_simd/src/type_i16x8.rs index b1a3100dd6e2..87ded0f3a49c 100644 --- a/crates/core_simd/src/type_i16x8.rs +++ b/crates/core_simd/src/type_i16x8.rs @@ -1,4 +1,7 @@ -define_type! { struct i16x8([i16; 8]); } +define_type! { + #[doc = "Vector of eight `i16` types"] + struct i16x8([i16; 8]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_i32x16.rs b/crates/core_simd/src/type_i32x16.rs index 5b7edb0f51bb..7c52e9cb9e55 100644 --- a/crates/core_simd/src/type_i32x16.rs +++ b/crates/core_simd/src/type_i32x16.rs @@ -1,4 +1,7 @@ -define_type! { struct i32x16([i32; 16]); } +define_type! { + #[doc = "Vector of 16 `i32` types"] + struct i32x16([i32; 16]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_i32x2.rs b/crates/core_simd/src/type_i32x2.rs index 425b6fd3bca8..e9845ae75c73 100644 --- a/crates/core_simd/src/type_i32x2.rs +++ b/crates/core_simd/src/type_i32x2.rs @@ -1 +1,4 @@ -define_type! { struct i32x2([i32; 2]); } +define_type! { + #[doc = "Vector of two `i32` types"] + struct i32x2([i32; 2]); +} diff --git a/crates/core_simd/src/type_i32x4.rs b/crates/core_simd/src/type_i32x4.rs index d62fc3856340..47374f7ce439 100644 --- a/crates/core_simd/src/type_i32x4.rs +++ b/crates/core_simd/src/type_i32x4.rs @@ -1,4 +1,7 @@ -define_type! { struct i32x4([i32; 4]); } +define_type! { + #[doc = "Vector of four `i32` types"] + struct i32x4([i32; 4]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_i32x8.rs b/crates/core_simd/src/type_i32x8.rs index ee83854cee4e..79b4ea180c31 100644 --- a/crates/core_simd/src/type_i32x8.rs +++ b/crates/core_simd/src/type_i32x8.rs @@ -1,4 +1,7 @@ -define_type! { struct i32x8([i32; 8]); } +define_type! { + #[doc = "Vector of eight `i32` types"] + struct i32x8([i32; 8]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_i64x2.rs b/crates/core_simd/src/type_i64x2.rs index 35af990ec649..7268ad5dfbe8 100644 --- a/crates/core_simd/src/type_i64x2.rs +++ b/crates/core_simd/src/type_i64x2.rs @@ -1,4 +1,7 @@ -define_type! { struct i64x2([i64; 2]); } +define_type! { + #[doc = "Vector of two `i64` types"] + struct i64x2([i64; 2]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_i64x4.rs b/crates/core_simd/src/type_i64x4.rs index 6f69a492ede9..3535783c3000 100644 --- a/crates/core_simd/src/type_i64x4.rs +++ b/crates/core_simd/src/type_i64x4.rs @@ -1,4 +1,7 @@ -define_type! { struct i64x4([i64; 4]); } +define_type! { + #[doc = "Vector of four `i64` types"] + struct i64x4([i64; 4]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_i64x8.rs b/crates/core_simd/src/type_i64x8.rs index 888c9b6612c0..42d28db8c551 100644 --- a/crates/core_simd/src/type_i64x8.rs +++ b/crates/core_simd/src/type_i64x8.rs @@ -1,4 +1,7 @@ -define_type! { struct i64x8([i64; 8]); } +define_type! { + #[doc = "Vector of eight `i64` types"] + struct i64x8([i64; 8]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_i8x16.rs b/crates/core_simd/src/type_i8x16.rs index 32ea4fa82934..d7aadd4d7ab2 100644 --- a/crates/core_simd/src/type_i8x16.rs +++ b/crates/core_simd/src/type_i8x16.rs @@ -1,4 +1,7 @@ -define_type! { struct i8x16([i8; 16]); } +define_type! { + #[doc = "Vector of 16 `i8` types"] + struct i8x16([i8; 16]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_i8x2.rs b/crates/core_simd/src/type_i8x2.rs index a36de2c5421d..aca22993c2e3 100644 --- a/crates/core_simd/src/type_i8x2.rs +++ b/crates/core_simd/src/type_i8x2.rs @@ -1 +1,4 @@ -define_type! { struct i8x2([i8; 2]); } +define_type! { + #[doc = "Vector of two `i8` types"] + struct i8x2([i8; 2]); +} diff --git a/crates/core_simd/src/type_i8x32.rs b/crates/core_simd/src/type_i8x32.rs index 874fcdd1e96a..a323565c85cf 100644 --- a/crates/core_simd/src/type_i8x32.rs +++ b/crates/core_simd/src/type_i8x32.rs @@ -1,4 +1,7 @@ -define_type! { struct i8x32([i8; 32]); } +define_type! { + #[doc = "Vector of 32 `i8` types"] + struct i8x32([i8; 32]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_i8x4.rs b/crates/core_simd/src/type_i8x4.rs index 5be83d5e0377..246703ebc50d 100644 --- a/crates/core_simd/src/type_i8x4.rs +++ b/crates/core_simd/src/type_i8x4.rs @@ -1 +1,4 @@ -define_type! { struct i8x4([i8; 4]); } +define_type! { + #[doc = "Vector of four `i8` types"] + struct i8x4([i8; 4]); +} diff --git a/crates/core_simd/src/type_i8x64.rs b/crates/core_simd/src/type_i8x64.rs index d21baf12640a..26934df2a484 100644 --- a/crates/core_simd/src/type_i8x64.rs +++ b/crates/core_simd/src/type_i8x64.rs @@ -1,4 +1,7 @@ -define_type! { struct i8x64([i8; 64]); } +define_type! { + #[doc = "Vector of 64 `i8` types"] + struct i8x64([i8; 64]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_i8x8.rs b/crates/core_simd/src/type_i8x8.rs index f09a70f6cb9d..bc30e2daf840 100644 --- a/crates/core_simd/src/type_i8x8.rs +++ b/crates/core_simd/src/type_i8x8.rs @@ -1 +1,4 @@ -define_type! { struct i8x8([i8; 8]); } +define_type! { + #[doc = "Vector of eight `i8` types"] + struct i8x8([i8; 8]); +} diff --git a/crates/core_simd/src/type_isizex2.rs b/crates/core_simd/src/type_isizex2.rs index aa3abaa8c4e7..464f64955522 100644 --- a/crates/core_simd/src/type_isizex2.rs +++ b/crates/core_simd/src/type_isizex2.rs @@ -1,4 +1,7 @@ -define_type! { struct isizex2([isize; 2]); } +define_type! { + #[doc = "Vector of two `isize` types"] + struct isizex2([isize; 2]); +} #[cfg(all(target_arch = "x86", target_pointer_width = "64"))] from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_isizex4.rs b/crates/core_simd/src/type_isizex4.rs index 2c0d7d33ba53..3be457393ec2 100644 --- a/crates/core_simd/src/type_isizex4.rs +++ b/crates/core_simd/src/type_isizex4.rs @@ -1,4 +1,7 @@ -define_type! { struct isizex4([isize; 4]); } +define_type! { + #[doc = "Vector of four `isize` types"] + struct isizex4([isize; 4]); +} #[cfg(all(target_arch = "x86", target_pointer_width = "32"))] from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_isizex8.rs b/crates/core_simd/src/type_isizex8.rs index cc2f9ad550f1..e21c2cf624b0 100644 --- a/crates/core_simd/src/type_isizex8.rs +++ b/crates/core_simd/src/type_isizex8.rs @@ -1,4 +1,7 @@ -define_type! { struct isizex8([isize; 8]); } +define_type! { + #[doc = "Vector of eight `isize` types"] + struct isizex8([isize; 8]); +} #[cfg(all(target_arch = "x86", target_pointer_width = "32"))] from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_u128x2.rs b/crates/core_simd/src/type_u128x2.rs index cbed75896160..f448e4f0e626 100644 --- a/crates/core_simd/src/type_u128x2.rs +++ b/crates/core_simd/src/type_u128x2.rs @@ -1,4 +1,7 @@ -define_type! { struct u128x2([u128; 2]); } +define_type! { + #[doc = "Vector of two `u128` types"] + struct u128x2([u128; 2]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_u128x4.rs b/crates/core_simd/src/type_u128x4.rs index 563689621eec..07466c720853 100644 --- a/crates/core_simd/src/type_u128x4.rs +++ b/crates/core_simd/src/type_u128x4.rs @@ -1,4 +1,7 @@ -define_type! { struct u128x4([u128; 4]); } +define_type! { + #[doc = "Vector of four `u128` types"] + struct u128x4([u128; 4]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_u16x16.rs b/crates/core_simd/src/type_u16x16.rs index 50f39983b385..5460c3740adf 100644 --- a/crates/core_simd/src/type_u16x16.rs +++ b/crates/core_simd/src/type_u16x16.rs @@ -1,4 +1,7 @@ -define_type! { struct u16x16([u16; 16]); } +define_type! { + #[doc = "Vector of 16 `u16` types"] + struct u16x16([u16; 16]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_u16x2.rs b/crates/core_simd/src/type_u16x2.rs index d0384e40f94a..480be8b6eaef 100644 --- a/crates/core_simd/src/type_u16x2.rs +++ b/crates/core_simd/src/type_u16x2.rs @@ -1 +1,4 @@ -define_type! { struct u16x2([u16; 2]); } +define_type! { + #[doc = "Vector of two `u16` types"] + struct u16x2([u16; 2]); +} diff --git a/crates/core_simd/src/type_u16x32.rs b/crates/core_simd/src/type_u16x32.rs index 29cf58581a92..67d60535f776 100644 --- a/crates/core_simd/src/type_u16x32.rs +++ b/crates/core_simd/src/type_u16x32.rs @@ -1,4 +1,7 @@ -define_type! { struct u16x32([u16; 32]); } +define_type! { + #[doc = "Vector of 32 `u16` types"] + struct u16x32([u16; 32]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_u16x4.rs b/crates/core_simd/src/type_u16x4.rs index 0c4e3ed9b7de..874891363da8 100644 --- a/crates/core_simd/src/type_u16x4.rs +++ b/crates/core_simd/src/type_u16x4.rs @@ -1 +1,4 @@ -define_type! { struct u16x4([u16; 4]); } +define_type! { + #[doc = "Vector of four `u16` types"] + struct u16x4([u16; 4]); +} diff --git a/crates/core_simd/src/type_u16x8.rs b/crates/core_simd/src/type_u16x8.rs index 69127996f7f9..5ba0af151e3f 100644 --- a/crates/core_simd/src/type_u16x8.rs +++ b/crates/core_simd/src/type_u16x8.rs @@ -1,4 +1,7 @@ -define_type! { struct u16x8([u16; 8]); } +define_type! { + #[doc = "Vector of eight `u16` types"] + struct u16x8([u16; 8]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_u32x16.rs b/crates/core_simd/src/type_u32x16.rs index 1b8965685b8d..40e557b2d6c9 100644 --- a/crates/core_simd/src/type_u32x16.rs +++ b/crates/core_simd/src/type_u32x16.rs @@ -1,4 +1,7 @@ -define_type! { struct u32x16([u32; 16]); } +define_type! { + #[doc = "Vector of 16 `u32` types"] + struct u32x16([u32; 16]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_u32x2.rs b/crates/core_simd/src/type_u32x2.rs index 8d9d53595253..001fd31db39c 100644 --- a/crates/core_simd/src/type_u32x2.rs +++ b/crates/core_simd/src/type_u32x2.rs @@ -1 +1,4 @@ -define_type! { struct u32x2([u32; 2]); } +define_type! { + #[doc = "Vector of two `u32` types"] + struct u32x2([u32; 2]); +} diff --git a/crates/core_simd/src/type_u32x4.rs b/crates/core_simd/src/type_u32x4.rs index fc79dff0e5b7..0582b51ead14 100644 --- a/crates/core_simd/src/type_u32x4.rs +++ b/crates/core_simd/src/type_u32x4.rs @@ -1,4 +1,7 @@ -define_type! { struct u32x4([u32; 4]); } +define_type! { + #[doc = "Vector of four `u32` types"] + struct u32x4([u32; 4]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_u32x8.rs b/crates/core_simd/src/type_u32x8.rs index 727b87860c96..686833c250c4 100644 --- a/crates/core_simd/src/type_u32x8.rs +++ b/crates/core_simd/src/type_u32x8.rs @@ -1,4 +1,7 @@ -define_type! { struct u32x8([u32; 8]); } +define_type! { + #[doc = "Vector of eight `u32` types"] + struct u32x8([u32; 8]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_u64x2.rs b/crates/core_simd/src/type_u64x2.rs index 729982f77356..e3ba3dc03b51 100644 --- a/crates/core_simd/src/type_u64x2.rs +++ b/crates/core_simd/src/type_u64x2.rs @@ -1,4 +1,7 @@ -define_type! { struct u64x2([u64; 2]); } +define_type! { + #[doc = "Vector of two `u64` types"] + struct u64x2([u64; 2]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_u64x4.rs b/crates/core_simd/src/type_u64x4.rs index 7e1aa9733819..005f26012ad5 100644 --- a/crates/core_simd/src/type_u64x4.rs +++ b/crates/core_simd/src/type_u64x4.rs @@ -1,4 +1,7 @@ -define_type! { struct u64x4([u64; 4]); } +define_type! { + #[doc = "Vector of four `u64` types"] + struct u64x4([u64; 4]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_u64x8.rs b/crates/core_simd/src/type_u64x8.rs index ed0769d13117..fbb41f36e5da 100644 --- a/crates/core_simd/src/type_u64x8.rs +++ b/crates/core_simd/src/type_u64x8.rs @@ -1,4 +1,7 @@ -define_type! { struct u64x8([u64; 8]); } +define_type! { + #[doc = "Vector of eight `u64` types"] + struct u64x8([u64; 8]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_u8x16.rs b/crates/core_simd/src/type_u8x16.rs index 69d788ef2b64..a44b74c122b2 100644 --- a/crates/core_simd/src/type_u8x16.rs +++ b/crates/core_simd/src/type_u8x16.rs @@ -1,4 +1,7 @@ -define_type! { struct u8x16([u8; 16]); } +define_type! { + #[doc = "Vector of 16 `u8` types"] + struct u8x16([u8; 16]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_u8x2.rs b/crates/core_simd/src/type_u8x2.rs index 5ab66878b82e..c6162cc73a25 100644 --- a/crates/core_simd/src/type_u8x2.rs +++ b/crates/core_simd/src/type_u8x2.rs @@ -1 +1,4 @@ -define_type! { struct u8x2([u8; 2]); } +define_type! { + #[doc = "Vector of two `u8` types"] + struct u8x2([u8; 2]); +} diff --git a/crates/core_simd/src/type_u8x32.rs b/crates/core_simd/src/type_u8x32.rs index 102724684cb8..012286846db9 100644 --- a/crates/core_simd/src/type_u8x32.rs +++ b/crates/core_simd/src/type_u8x32.rs @@ -1,4 +1,7 @@ -define_type! { struct u8x32([u8; 32]); } +define_type! { + #[doc = "Vector of 32 `u8` types"] + struct u8x32([u8; 32]); +} #[cfg(target_arch = "x86")] from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m256i } diff --git a/crates/core_simd/src/type_u8x4.rs b/crates/core_simd/src/type_u8x4.rs index 648d12b9e2d0..ecdffa119931 100644 --- a/crates/core_simd/src/type_u8x4.rs +++ b/crates/core_simd/src/type_u8x4.rs @@ -1 +1,4 @@ -define_type! { struct u8x4([u8; 4]); } +define_type! { + #[doc = "Vector of four `u8` types"] + struct u8x4([u8; 4]); +} diff --git a/crates/core_simd/src/type_u8x64.rs b/crates/core_simd/src/type_u8x64.rs index 1e2967d485ae..6f05f086a64a 100644 --- a/crates/core_simd/src/type_u8x64.rs +++ b/crates/core_simd/src/type_u8x64.rs @@ -1,4 +1,7 @@ -define_type! { struct u8x64([u8; 64]); } +define_type! { + #[doc = "Vector of 64 `u8` types"] + struct u8x64([u8; 64]); +} /* #[cfg(target_arch = "x86")] diff --git a/crates/core_simd/src/type_u8x8.rs b/crates/core_simd/src/type_u8x8.rs index aa62e04ddf23..7810ac743f8d 100644 --- a/crates/core_simd/src/type_u8x8.rs +++ b/crates/core_simd/src/type_u8x8.rs @@ -1 +1,4 @@ -define_type! { struct u8x8([u8; 8]); } +define_type! { + #[doc = "Vector of eight `u8` types"] + struct u8x8([u8; 8]); +} diff --git a/crates/core_simd/src/type_usizex2.rs b/crates/core_simd/src/type_usizex2.rs index 083cd499a074..218d5a1056eb 100644 --- a/crates/core_simd/src/type_usizex2.rs +++ b/crates/core_simd/src/type_usizex2.rs @@ -1,4 +1,7 @@ -define_type! { struct usizex2([usize; 2]); } +define_type! { + #[doc = "Vector of two `usize` types"] + struct usizex2([usize; 2]); +} #[cfg(all(target_arch = "x86", target_pointer_width = "64"))] from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_usizex4.rs b/crates/core_simd/src/type_usizex4.rs index 3301039a05a1..60160ecc217b 100644 --- a/crates/core_simd/src/type_usizex4.rs +++ b/crates/core_simd/src/type_usizex4.rs @@ -1,4 +1,7 @@ -define_type! { struct usizex4([usize; 4]); } +define_type! { + #[doc = "Vector of four `usize` types"] + struct usizex4([usize; 4]); +} #[cfg(all(target_arch = "x86", target_pointer_width = "32"))] from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m128i } diff --git a/crates/core_simd/src/type_usizex8.rs b/crates/core_simd/src/type_usizex8.rs index e21b1ea6b7a0..5f5a445f4308 100644 --- a/crates/core_simd/src/type_usizex8.rs +++ b/crates/core_simd/src/type_usizex8.rs @@ -1,4 +1,7 @@ -define_type! { struct usizex8([usize; 8]); } +define_type! { + #[doc = "Vector of eight `usize` types"] + struct usizex8([usize; 8]); +} #[cfg(all(target_arch = "x86", target_pointer_width = "32"))] from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m256i } From c74eec7e25d0ab505dbb8f31d2e63839e5384c15 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Wed, 23 Sep 2020 08:11:43 -0400 Subject: [PATCH 03/15] Apply suggestions from code review Co-authored-by: Lokathor --- crates/core_simd/src/lib.rs | 2 +- crates/core_simd/src/macros.rs | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index 8db640157eed..b4fc58476f8f 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -1,5 +1,5 @@ #![feature(repr_simd)] - +#![warn(missing_docs)] #[macro_use] mod macros; diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 64d9c4b217f7..91c1071a2ee5 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -69,6 +69,7 @@ macro_rules! define_type { // splat impl From<$type> for $name { + #[inline] fn from(value: $type) -> Self { Self::splat(value) } @@ -126,16 +127,16 @@ macro_rules! define_type { pub struct $name($($itype),*); impl $name { - /// Construct a vector by setting each lane to a single value. + /// Construct a vector by setting all lanes to the given value. #[inline] - pub fn splat(value: $type) -> Self { + pub const fn splat(value: $type) -> Self { Self($(value as $itype),*) } - /// Construct a vector by setting each lane. + /// Construct a vector by setting each lane to the given values. #[allow(clippy::too_many_arguments)] #[inline] - pub fn new($($ivar: $itype),*) -> Self { + pub const fn new($($ivar: $itype),*) -> Self { Self($($ivar),*) } } From 543bcd37e91afc1271befde3a33d6a73abc204d4 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Wed, 23 Sep 2020 10:21:19 -0400 Subject: [PATCH 04/15] Combine vector definition modules by scalar type --- crates/core_simd/src/lib.rs | 61 +++++++++++++-------------- crates/core_simd/src/type_f32x16.rs | 12 ------ crates/core_simd/src/type_f32x2.rs | 4 -- crates/core_simd/src/type_f32x4.rs | 10 ----- crates/core_simd/src/type_f32x8.rs | 10 ----- crates/core_simd/src/type_f64x2.rs | 10 ----- crates/core_simd/src/type_f64x4.rs | 10 ----- crates/core_simd/src/type_f64x8.rs | 12 ------ crates/core_simd/src/type_i128x2.rs | 10 ----- crates/core_simd/src/type_i128x4.rs | 12 ------ crates/core_simd/src/type_i16x16.rs | 10 ----- crates/core_simd/src/type_i16x2.rs | 4 -- crates/core_simd/src/type_i16x32.rs | 12 ------ crates/core_simd/src/type_i16x4.rs | 4 -- crates/core_simd/src/type_i16x8.rs | 10 ----- crates/core_simd/src/type_i32x16.rs | 12 ------ crates/core_simd/src/type_i32x2.rs | 4 -- crates/core_simd/src/type_i32x4.rs | 10 ----- crates/core_simd/src/type_i32x8.rs | 10 ----- crates/core_simd/src/type_i64x2.rs | 10 ----- crates/core_simd/src/type_i64x4.rs | 10 ----- crates/core_simd/src/type_i64x8.rs | 12 ------ crates/core_simd/src/type_i8x16.rs | 10 ----- crates/core_simd/src/type_i8x2.rs | 4 -- crates/core_simd/src/type_i8x32.rs | 10 ----- crates/core_simd/src/type_i8x4.rs | 4 -- crates/core_simd/src/type_i8x64.rs | 12 ------ crates/core_simd/src/type_i8x8.rs | 4 -- crates/core_simd/src/type_isizex2.rs | 10 ----- crates/core_simd/src/type_isizex4.rs | 16 ------- crates/core_simd/src/type_isizex8.rs | 18 -------- crates/core_simd/src/type_u128x2.rs | 10 ----- crates/core_simd/src/type_u128x4.rs | 12 ------ crates/core_simd/src/type_u16x16.rs | 10 ----- crates/core_simd/src/type_u16x2.rs | 4 -- crates/core_simd/src/type_u16x32.rs | 12 ------ crates/core_simd/src/type_u16x4.rs | 4 -- crates/core_simd/src/type_u16x8.rs | 10 ----- crates/core_simd/src/type_u32x16.rs | 12 ------ crates/core_simd/src/type_u32x2.rs | 4 -- crates/core_simd/src/type_u32x4.rs | 10 ----- crates/core_simd/src/type_u32x8.rs | 10 ----- crates/core_simd/src/type_u64x2.rs | 10 ----- crates/core_simd/src/type_u64x4.rs | 10 ----- crates/core_simd/src/type_u64x8.rs | 12 ------ crates/core_simd/src/type_u8x16.rs | 10 ----- crates/core_simd/src/type_u8x2.rs | 4 -- crates/core_simd/src/type_u8x32.rs | 10 ----- crates/core_simd/src/type_u8x4.rs | 4 -- crates/core_simd/src/type_u8x64.rs | 12 ------ crates/core_simd/src/type_u8x8.rs | 4 -- crates/core_simd/src/type_usizex2.rs | 10 ----- crates/core_simd/src/type_usizex4.rs | 16 ------- crates/core_simd/src/type_usizex8.rs | 18 -------- crates/core_simd/src/vectors_f32.rs | 39 +++++++++++++++++ crates/core_simd/src/vectors_f64.rs | 34 +++++++++++++++ crates/core_simd/src/vectors_i128.rs | 23 ++++++++++ crates/core_simd/src/vectors_i16.rs | 44 +++++++++++++++++++ crates/core_simd/src/vectors_i32.rs | 39 +++++++++++++++++ crates/core_simd/src/vectors_i64.rs | 34 +++++++++++++++ crates/core_simd/src/vectors_i8.rs | 49 +++++++++++++++++++++ crates/core_simd/src/vectors_isize.rs | 46 ++++++++++++++++++++ crates/core_simd/src/vectors_u128.rs | 23 ++++++++++ crates/core_simd/src/vectors_u16.rs | 44 +++++++++++++++++++ crates/core_simd/src/vectors_u32.rs | 39 +++++++++++++++++ crates/core_simd/src/vectors_u64.rs | 34 +++++++++++++++ crates/core_simd/src/vectors_u8.rs | 49 +++++++++++++++++++++ crates/core_simd/src/vectors_usize.rs | 46 ++++++++++++++++++++ 68 files changed, 573 insertions(+), 535 deletions(-) delete mode 100644 crates/core_simd/src/type_f32x16.rs delete mode 100644 crates/core_simd/src/type_f32x2.rs delete mode 100644 crates/core_simd/src/type_f32x4.rs delete mode 100644 crates/core_simd/src/type_f32x8.rs delete mode 100644 crates/core_simd/src/type_f64x2.rs delete mode 100644 crates/core_simd/src/type_f64x4.rs delete mode 100644 crates/core_simd/src/type_f64x8.rs delete mode 100644 crates/core_simd/src/type_i128x2.rs delete mode 100644 crates/core_simd/src/type_i128x4.rs delete mode 100644 crates/core_simd/src/type_i16x16.rs delete mode 100644 crates/core_simd/src/type_i16x2.rs delete mode 100644 crates/core_simd/src/type_i16x32.rs delete mode 100644 crates/core_simd/src/type_i16x4.rs delete mode 100644 crates/core_simd/src/type_i16x8.rs delete mode 100644 crates/core_simd/src/type_i32x16.rs delete mode 100644 crates/core_simd/src/type_i32x2.rs delete mode 100644 crates/core_simd/src/type_i32x4.rs delete mode 100644 crates/core_simd/src/type_i32x8.rs delete mode 100644 crates/core_simd/src/type_i64x2.rs delete mode 100644 crates/core_simd/src/type_i64x4.rs delete mode 100644 crates/core_simd/src/type_i64x8.rs delete mode 100644 crates/core_simd/src/type_i8x16.rs delete mode 100644 crates/core_simd/src/type_i8x2.rs delete mode 100644 crates/core_simd/src/type_i8x32.rs delete mode 100644 crates/core_simd/src/type_i8x4.rs delete mode 100644 crates/core_simd/src/type_i8x64.rs delete mode 100644 crates/core_simd/src/type_i8x8.rs delete mode 100644 crates/core_simd/src/type_isizex2.rs delete mode 100644 crates/core_simd/src/type_isizex4.rs delete mode 100644 crates/core_simd/src/type_isizex8.rs delete mode 100644 crates/core_simd/src/type_u128x2.rs delete mode 100644 crates/core_simd/src/type_u128x4.rs delete mode 100644 crates/core_simd/src/type_u16x16.rs delete mode 100644 crates/core_simd/src/type_u16x2.rs delete mode 100644 crates/core_simd/src/type_u16x32.rs delete mode 100644 crates/core_simd/src/type_u16x4.rs delete mode 100644 crates/core_simd/src/type_u16x8.rs delete mode 100644 crates/core_simd/src/type_u32x16.rs delete mode 100644 crates/core_simd/src/type_u32x2.rs delete mode 100644 crates/core_simd/src/type_u32x4.rs delete mode 100644 crates/core_simd/src/type_u32x8.rs delete mode 100644 crates/core_simd/src/type_u64x2.rs delete mode 100644 crates/core_simd/src/type_u64x4.rs delete mode 100644 crates/core_simd/src/type_u64x8.rs delete mode 100644 crates/core_simd/src/type_u8x16.rs delete mode 100644 crates/core_simd/src/type_u8x2.rs delete mode 100644 crates/core_simd/src/type_u8x32.rs delete mode 100644 crates/core_simd/src/type_u8x4.rs delete mode 100644 crates/core_simd/src/type_u8x64.rs delete mode 100644 crates/core_simd/src/type_u8x8.rs delete mode 100644 crates/core_simd/src/type_usizex2.rs delete mode 100644 crates/core_simd/src/type_usizex4.rs delete mode 100644 crates/core_simd/src/type_usizex8.rs create mode 100644 crates/core_simd/src/vectors_f32.rs create mode 100644 crates/core_simd/src/vectors_f64.rs create mode 100644 crates/core_simd/src/vectors_i128.rs create mode 100644 crates/core_simd/src/vectors_i16.rs create mode 100644 crates/core_simd/src/vectors_i32.rs create mode 100644 crates/core_simd/src/vectors_i64.rs create mode 100644 crates/core_simd/src/vectors_i8.rs create mode 100644 crates/core_simd/src/vectors_isize.rs create mode 100644 crates/core_simd/src/vectors_u128.rs create mode 100644 crates/core_simd/src/vectors_u16.rs create mode 100644 crates/core_simd/src/vectors_u32.rs create mode 100644 crates/core_simd/src/vectors_u64.rs create mode 100644 crates/core_simd/src/vectors_u8.rs create mode 100644 crates/core_simd/src/vectors_usize.rs diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index b4fc58476f8f..a5dae4b02792 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -1,36 +1,35 @@ +#![no_std] #![feature(repr_simd)] #![warn(missing_docs)] + #[macro_use] mod macros; -macro_rules! import_types { - { $($mod:ident,)* } => { - $( - mod $mod; - pub use $mod::*; - )* - } -} - -import_types! { - type_u8x2, type_u8x4, type_u8x8, type_u8x16, type_u8x32, type_u8x64, - type_i8x2, type_i8x4, type_i8x8, type_i8x16, type_i8x32, type_i8x64, - type_u16x2, type_u16x4, type_u16x8, type_u16x16, type_u16x32, - type_i16x2, type_i16x4, type_i16x8, type_i16x16, type_i16x32, - type_u32x2, type_u32x4, type_u32x8, type_u32x16, - type_i32x2, type_i32x4, type_i32x8, type_i32x16, - type_u64x2, type_u64x4, type_u64x8, - type_i64x2, type_i64x4, type_i64x8, - type_u128x2, type_u128x4, - type_i128x2, type_i128x4, -} - -import_types! { - type_usizex2, type_usizex4, type_usizex8, - type_isizex2, type_isizex4, type_isizex8, -} - -import_types! { - type_f32x2, type_f32x4, type_f32x8, type_f32x16, - type_f64x2, type_f64x4, type_f64x8, -} +mod vectors_u8; +pub use vectors_u8::*; +mod vectors_u16; +pub use vectors_u16::*; +mod vectors_u32; +pub use vectors_u32::*; +mod vectors_u64; +pub use vectors_u64::*; +mod vectors_u128; +pub use vectors_u128::*; +mod vectors_usize; +pub use vectors_usize::*; +mod vectors_i8; +pub use vectors_i8::*; +mod vectors_i16; +pub use vectors_i16::*; +mod vectors_i32; +pub use vectors_i32::*; +mod vectors_i64; +pub use vectors_i64::*; +mod vectors_i128; +pub use vectors_i128::*; +mod vectors_isize; +pub use vectors_isize::*; +mod vectors_f32; +pub use vectors_f32::*; +mod vectors_f64; +pub use vectors_f64::*; diff --git a/crates/core_simd/src/type_f32x16.rs b/crates/core_simd/src/type_f32x16.rs deleted file mode 100644 index 45fb4a3175bb..000000000000 --- a/crates/core_simd/src/type_f32x16.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of 16 `f32` types"] - struct f32x16([f32; 16]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86::__m512 } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86_64::__m512 } -*/ diff --git a/crates/core_simd/src/type_f32x2.rs b/crates/core_simd/src/type_f32x2.rs deleted file mode 100644 index 8b60a2ee76f4..000000000000 --- a/crates/core_simd/src/type_f32x2.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of two `f32` types"] - struct f32x2([f32; 2]); -} diff --git a/crates/core_simd/src/type_f32x4.rs b/crates/core_simd/src/type_f32x4.rs deleted file mode 100644 index 452e607732cf..000000000000 --- a/crates/core_simd/src/type_f32x4.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of four `f32` types"] - struct f32x4([f32; 4]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86::__m128 } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86_64::__m128 } diff --git a/crates/core_simd/src/type_f32x8.rs b/crates/core_simd/src/type_f32x8.rs deleted file mode 100644 index 790a546e4e73..000000000000 --- a/crates/core_simd/src/type_f32x8.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of eight `f32` types"] - struct f32x8([f32; 8]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86::__m256 } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86_64::__m256 } diff --git a/crates/core_simd/src/type_f64x2.rs b/crates/core_simd/src/type_f64x2.rs deleted file mode 100644 index 0c349f38c862..000000000000 --- a/crates/core_simd/src/type_f64x2.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of two `f64` types"] - struct f64x2([f64; 2]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86::__m128d } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86_64::__m128d } diff --git a/crates/core_simd/src/type_f64x4.rs b/crates/core_simd/src/type_f64x4.rs deleted file mode 100644 index ec6b46bc8c84..000000000000 --- a/crates/core_simd/src/type_f64x4.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of four `f64` types"] - struct f64x4([f64; 4]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86::__m256d } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86_64::__m256d } diff --git a/crates/core_simd/src/type_f64x8.rs b/crates/core_simd/src/type_f64x8.rs deleted file mode 100644 index dd65dc6b39ab..000000000000 --- a/crates/core_simd/src/type_f64x8.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of eight `f64` types"] - struct f64x8([f64; 8]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86::__m512d } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86_64::__m512d } -*/ diff --git a/crates/core_simd/src/type_i128x2.rs b/crates/core_simd/src/type_i128x2.rs deleted file mode 100644 index 1ac736ddf3a2..000000000000 --- a/crates/core_simd/src/type_i128x2.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of two `i128` types"] - struct i128x2([i128; 2]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i128x4.rs b/crates/core_simd/src/type_i128x4.rs deleted file mode 100644 index 6cef039d947a..000000000000 --- a/crates/core_simd/src/type_i128x4.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of four `i128` types"] - struct i128x4([i128; 4]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_i16x16.rs b/crates/core_simd/src/type_i16x16.rs deleted file mode 100644 index 1721286128fe..000000000000 --- a/crates/core_simd/src/type_i16x16.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of 16 `i16` types"] - struct i16x16([i16; 16]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i16x2.rs b/crates/core_simd/src/type_i16x2.rs deleted file mode 100644 index 7ccbbe7f2d0a..000000000000 --- a/crates/core_simd/src/type_i16x2.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of two `i16` types"] - struct i16x2([i16; 2]); -} diff --git a/crates/core_simd/src/type_i16x32.rs b/crates/core_simd/src/type_i16x32.rs deleted file mode 100644 index 349d094a1bc9..000000000000 --- a/crates/core_simd/src/type_i16x32.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of 32 `i16` types"] - struct i16x32([i16; 32]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_i16x4.rs b/crates/core_simd/src/type_i16x4.rs deleted file mode 100644 index 348bc4c53a94..000000000000 --- a/crates/core_simd/src/type_i16x4.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of four `i16` types"] - struct i16x4([i16; 4]); -} diff --git a/crates/core_simd/src/type_i16x8.rs b/crates/core_simd/src/type_i16x8.rs deleted file mode 100644 index 87ded0f3a49c..000000000000 --- a/crates/core_simd/src/type_i16x8.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of eight `i16` types"] - struct i16x8([i16; 8]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i32x16.rs b/crates/core_simd/src/type_i32x16.rs deleted file mode 100644 index 7c52e9cb9e55..000000000000 --- a/crates/core_simd/src/type_i32x16.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of 16 `i32` types"] - struct i32x16([i32; 16]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_i32x2.rs b/crates/core_simd/src/type_i32x2.rs deleted file mode 100644 index e9845ae75c73..000000000000 --- a/crates/core_simd/src/type_i32x2.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of two `i32` types"] - struct i32x2([i32; 2]); -} diff --git a/crates/core_simd/src/type_i32x4.rs b/crates/core_simd/src/type_i32x4.rs deleted file mode 100644 index 47374f7ce439..000000000000 --- a/crates/core_simd/src/type_i32x4.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of four `i32` types"] - struct i32x4([i32; 4]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i32x8.rs b/crates/core_simd/src/type_i32x8.rs deleted file mode 100644 index 79b4ea180c31..000000000000 --- a/crates/core_simd/src/type_i32x8.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of eight `i32` types"] - struct i32x8([i32; 8]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i64x2.rs b/crates/core_simd/src/type_i64x2.rs deleted file mode 100644 index 7268ad5dfbe8..000000000000 --- a/crates/core_simd/src/type_i64x2.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of two `i64` types"] - struct i64x2([i64; 2]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i64x4.rs b/crates/core_simd/src/type_i64x4.rs deleted file mode 100644 index 3535783c3000..000000000000 --- a/crates/core_simd/src/type_i64x4.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of four `i64` types"] - struct i64x4([i64; 4]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i64x8.rs b/crates/core_simd/src/type_i64x8.rs deleted file mode 100644 index 42d28db8c551..000000000000 --- a/crates/core_simd/src/type_i64x8.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of eight `i64` types"] - struct i64x8([i64; 8]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_i8x16.rs b/crates/core_simd/src/type_i8x16.rs deleted file mode 100644 index d7aadd4d7ab2..000000000000 --- a/crates/core_simd/src/type_i8x16.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of 16 `i8` types"] - struct i8x16([i8; 16]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_i8x2.rs b/crates/core_simd/src/type_i8x2.rs deleted file mode 100644 index aca22993c2e3..000000000000 --- a/crates/core_simd/src/type_i8x2.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of two `i8` types"] - struct i8x2([i8; 2]); -} diff --git a/crates/core_simd/src/type_i8x32.rs b/crates/core_simd/src/type_i8x32.rs deleted file mode 100644 index a323565c85cf..000000000000 --- a/crates/core_simd/src/type_i8x32.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of 32 `i8` types"] - struct i8x32([i8; 32]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_i8x4.rs b/crates/core_simd/src/type_i8x4.rs deleted file mode 100644 index 246703ebc50d..000000000000 --- a/crates/core_simd/src/type_i8x4.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of four `i8` types"] - struct i8x4([i8; 4]); -} diff --git a/crates/core_simd/src/type_i8x64.rs b/crates/core_simd/src/type_i8x64.rs deleted file mode 100644 index 26934df2a484..000000000000 --- a/crates/core_simd/src/type_i8x64.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of 64 `i8` types"] - struct i8x64([i8; 64]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_i8x8.rs b/crates/core_simd/src/type_i8x8.rs deleted file mode 100644 index bc30e2daf840..000000000000 --- a/crates/core_simd/src/type_i8x8.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of eight `i8` types"] - struct i8x8([i8; 8]); -} diff --git a/crates/core_simd/src/type_isizex2.rs b/crates/core_simd/src/type_isizex2.rs deleted file mode 100644 index 464f64955522..000000000000 --- a/crates/core_simd/src/type_isizex2.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of two `isize` types"] - struct isizex2([isize; 2]); -} - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_isizex4.rs b/crates/core_simd/src/type_isizex4.rs deleted file mode 100644 index 3be457393ec2..000000000000 --- a/crates/core_simd/src/type_isizex4.rs +++ /dev/null @@ -1,16 +0,0 @@ -define_type! { - #[doc = "Vector of four `isize` types"] - struct isizex4([isize; 4]); -} - -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m128i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_isizex8.rs b/crates/core_simd/src/type_isizex8.rs deleted file mode 100644 index e21c2cf624b0..000000000000 --- a/crates/core_simd/src/type_isizex8.rs +++ /dev/null @@ -1,18 +0,0 @@ -define_type! { - #[doc = "Vector of eight `isize` types"] - struct isizex8([isize; 8]); -} - -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_u128x2.rs b/crates/core_simd/src/type_u128x2.rs deleted file mode 100644 index f448e4f0e626..000000000000 --- a/crates/core_simd/src/type_u128x2.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of two `u128` types"] - struct u128x2([u128; 2]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u128x4.rs b/crates/core_simd/src/type_u128x4.rs deleted file mode 100644 index 07466c720853..000000000000 --- a/crates/core_simd/src/type_u128x4.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of four `u128` types"] - struct u128x4([u128; 4]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_u16x16.rs b/crates/core_simd/src/type_u16x16.rs deleted file mode 100644 index 5460c3740adf..000000000000 --- a/crates/core_simd/src/type_u16x16.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of 16 `u16` types"] - struct u16x16([u16; 16]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u16x2.rs b/crates/core_simd/src/type_u16x2.rs deleted file mode 100644 index 480be8b6eaef..000000000000 --- a/crates/core_simd/src/type_u16x2.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of two `u16` types"] - struct u16x2([u16; 2]); -} diff --git a/crates/core_simd/src/type_u16x32.rs b/crates/core_simd/src/type_u16x32.rs deleted file mode 100644 index 67d60535f776..000000000000 --- a/crates/core_simd/src/type_u16x32.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of 32 `u16` types"] - struct u16x32([u16; 32]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_u16x4.rs b/crates/core_simd/src/type_u16x4.rs deleted file mode 100644 index 874891363da8..000000000000 --- a/crates/core_simd/src/type_u16x4.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of four `u16` types"] - struct u16x4([u16; 4]); -} diff --git a/crates/core_simd/src/type_u16x8.rs b/crates/core_simd/src/type_u16x8.rs deleted file mode 100644 index 5ba0af151e3f..000000000000 --- a/crates/core_simd/src/type_u16x8.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of eight `u16` types"] - struct u16x8([u16; 8]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u32x16.rs b/crates/core_simd/src/type_u32x16.rs deleted file mode 100644 index 40e557b2d6c9..000000000000 --- a/crates/core_simd/src/type_u32x16.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of 16 `u32` types"] - struct u32x16([u32; 16]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_u32x2.rs b/crates/core_simd/src/type_u32x2.rs deleted file mode 100644 index 001fd31db39c..000000000000 --- a/crates/core_simd/src/type_u32x2.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of two `u32` types"] - struct u32x2([u32; 2]); -} diff --git a/crates/core_simd/src/type_u32x4.rs b/crates/core_simd/src/type_u32x4.rs deleted file mode 100644 index 0582b51ead14..000000000000 --- a/crates/core_simd/src/type_u32x4.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of four `u32` types"] - struct u32x4([u32; 4]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u32x8.rs b/crates/core_simd/src/type_u32x8.rs deleted file mode 100644 index 686833c250c4..000000000000 --- a/crates/core_simd/src/type_u32x8.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of eight `u32` types"] - struct u32x8([u32; 8]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u64x2.rs b/crates/core_simd/src/type_u64x2.rs deleted file mode 100644 index e3ba3dc03b51..000000000000 --- a/crates/core_simd/src/type_u64x2.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of two `u64` types"] - struct u64x2([u64; 2]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u64x4.rs b/crates/core_simd/src/type_u64x4.rs deleted file mode 100644 index 005f26012ad5..000000000000 --- a/crates/core_simd/src/type_u64x4.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of four `u64` types"] - struct u64x4([u64; 4]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u64x8.rs b/crates/core_simd/src/type_u64x8.rs deleted file mode 100644 index fbb41f36e5da..000000000000 --- a/crates/core_simd/src/type_u64x8.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of eight `u64` types"] - struct u64x8([u64; 8]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_u8x16.rs b/crates/core_simd/src/type_u8x16.rs deleted file mode 100644 index a44b74c122b2..000000000000 --- a/crates/core_simd/src/type_u8x16.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of 16 `u8` types"] - struct u8x16([u8; 16]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_u8x2.rs b/crates/core_simd/src/type_u8x2.rs deleted file mode 100644 index c6162cc73a25..000000000000 --- a/crates/core_simd/src/type_u8x2.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of two `u8` types"] - struct u8x2([u8; 2]); -} diff --git a/crates/core_simd/src/type_u8x32.rs b/crates/core_simd/src/type_u8x32.rs deleted file mode 100644 index 012286846db9..000000000000 --- a/crates/core_simd/src/type_u8x32.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of 32 `u8` types"] - struct u8x32([u8; 32]); -} - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_u8x4.rs b/crates/core_simd/src/type_u8x4.rs deleted file mode 100644 index ecdffa119931..000000000000 --- a/crates/core_simd/src/type_u8x4.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of four `u8` types"] - struct u8x4([u8; 4]); -} diff --git a/crates/core_simd/src/type_u8x64.rs b/crates/core_simd/src/type_u8x64.rs deleted file mode 100644 index 6f05f086a64a..000000000000 --- a/crates/core_simd/src/type_u8x64.rs +++ /dev/null @@ -1,12 +0,0 @@ -define_type! { - #[doc = "Vector of 64 `u8` types"] - struct u8x64([u8; 64]); -} - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/type_u8x8.rs b/crates/core_simd/src/type_u8x8.rs deleted file mode 100644 index 7810ac743f8d..000000000000 --- a/crates/core_simd/src/type_u8x8.rs +++ /dev/null @@ -1,4 +0,0 @@ -define_type! { - #[doc = "Vector of eight `u8` types"] - struct u8x8([u8; 8]); -} diff --git a/crates/core_simd/src/type_usizex2.rs b/crates/core_simd/src/type_usizex2.rs deleted file mode 100644 index 218d5a1056eb..000000000000 --- a/crates/core_simd/src/type_usizex2.rs +++ /dev/null @@ -1,10 +0,0 @@ -define_type! { - #[doc = "Vector of two `usize` types"] - struct usizex2([usize; 2]); -} - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86_64::__m128i } diff --git a/crates/core_simd/src/type_usizex4.rs b/crates/core_simd/src/type_usizex4.rs deleted file mode 100644 index 60160ecc217b..000000000000 --- a/crates/core_simd/src/type_usizex4.rs +++ /dev/null @@ -1,16 +0,0 @@ -define_type! { - #[doc = "Vector of four `usize` types"] - struct usizex4([usize; 4]); -} - -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m128i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m256i } diff --git a/crates/core_simd/src/type_usizex8.rs b/crates/core_simd/src/type_usizex8.rs deleted file mode 100644 index 5f5a445f4308..000000000000 --- a/crates/core_simd/src/type_usizex8.rs +++ /dev/null @@ -1,18 +0,0 @@ -define_type! { - #[doc = "Vector of eight `usize` types"] - struct usizex8([usize; 8]); -} - -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m512i } -*/ diff --git a/crates/core_simd/src/vectors_f32.rs b/crates/core_simd/src/vectors_f32.rs new file mode 100644 index 000000000000..fe24ec6b727e --- /dev/null +++ b/crates/core_simd/src/vectors_f32.rs @@ -0,0 +1,39 @@ +define_type! { + #[doc = "Vector of two `f32` values"] + struct f32x2([f32; 2]); +} + +define_type! { + #[doc = "Vector of four `f32` values"] + struct f32x4([f32; 4]); +} + +define_type! { + #[doc = "Vector of eight `f32` values"] + struct f32x8([f32; 8]); +} + +define_type! { + #[doc = "Vector of 16 `f32` values"] + struct f32x16([f32; 16]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86::__m128 } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86_64::__m128 } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86::__m256 } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86_64::__m256 } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86::__m512 } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86_64::__m512 } +*/ diff --git a/crates/core_simd/src/vectors_f64.rs b/crates/core_simd/src/vectors_f64.rs new file mode 100644 index 000000000000..8934cec0517d --- /dev/null +++ b/crates/core_simd/src/vectors_f64.rs @@ -0,0 +1,34 @@ +define_type! { + #[doc = "Vector of two `f64` values"] + struct f64x2([f64; 2]); +} + +define_type! { + #[doc = "Vector of four `f64` values"] + struct f64x4([f64; 4]); +} + +define_type! { + #[doc = "Vector of eight `f64` values"] + struct f64x8([f64; 8]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86::__m128d } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86_64::__m128d } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86::__m256d } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86_64::__m256d } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86::__m512d } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86_64::__m512d } +*/ diff --git a/crates/core_simd/src/vectors_i128.rs b/crates/core_simd/src/vectors_i128.rs new file mode 100644 index 000000000000..1cdd3c91211e --- /dev/null +++ b/crates/core_simd/src/vectors_i128.rs @@ -0,0 +1,23 @@ +define_type! { + #[doc = "Vector of two `i128` values"] + struct i128x2([i128; 2]); +} + +define_type! { + #[doc = "Vector of four `i128` values"] + struct i128x4([i128; 4]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs new file mode 100644 index 000000000000..724fe7efd1a4 --- /dev/null +++ b/crates/core_simd/src/vectors_i16.rs @@ -0,0 +1,44 @@ +define_type! { + #[doc = "Vector of two `i16` values"] + struct i16x2([i16; 2]); +} + +define_type! { + #[doc = "Vector of four `i16` values"] + struct i16x4([i16; 4]); +} + +define_type! { + #[doc = "Vector of eight `i16` values"] + struct i16x8([i16; 8]); +} + +define_type! { + #[doc = "Vector of 16 `i16` values"] + struct i16x16([i16; 16]); +} + +define_type! { + #[doc = "Vector of 32 `i16` values"] + struct i16x32([i16; 32]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_i32.rs b/crates/core_simd/src/vectors_i32.rs new file mode 100644 index 000000000000..c3af621ae8a4 --- /dev/null +++ b/crates/core_simd/src/vectors_i32.rs @@ -0,0 +1,39 @@ +define_type! { + #[doc = "Vector of two `i32` values"] + struct i32x2([i32; 2]); +} + +define_type! { + #[doc = "Vector of four `i32` values"] + struct i32x4([i32; 4]); +} + +define_type! { + #[doc = "Vector of eight `i32` values"] + struct i32x8([i32; 8]); +} + +define_type! { + #[doc = "Vector of 16 `i32` values"] + struct i32x16([i32; 16]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_i64.rs b/crates/core_simd/src/vectors_i64.rs new file mode 100644 index 000000000000..8c6c9d940b15 --- /dev/null +++ b/crates/core_simd/src/vectors_i64.rs @@ -0,0 +1,34 @@ +define_type! { + #[doc = "Vector of two `i64` values"] + struct i64x2([i64; 2]); +} + +define_type! { + #[doc = "Vector of four `i64` values"] + struct i64x4([i64; 4]); +} + +define_type! { + #[doc = "Vector of eight `i64` values"] + struct i64x8([i64; 8]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs new file mode 100644 index 000000000000..340025972d7b --- /dev/null +++ b/crates/core_simd/src/vectors_i8.rs @@ -0,0 +1,49 @@ +define_type! { + #[doc = "Vector of two `i8` values"] + struct i8x2([i8; 2]); +} + +define_type! { + #[doc = "Vector of four `i8` values"] + struct i8x4([i8; 4]); +} + +define_type! { + #[doc = "Vector of eight `i8` values"] + struct i8x8([i8; 8]); +} + +define_type! { + #[doc = "Vector of 16 `i8` values"] + struct i8x16([i8; 16]); +} + +define_type! { + #[doc = "Vector of 32 `i8` values"] + struct i8x32([i8; 32]); +} + +define_type! { + #[doc = "Vector of 64 `i8` values"] + struct i8x64([i8; 64]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_isize.rs b/crates/core_simd/src/vectors_isize.rs new file mode 100644 index 000000000000..60f4aad2066a --- /dev/null +++ b/crates/core_simd/src/vectors_isize.rs @@ -0,0 +1,46 @@ +define_type! { + #[doc = "Vector of two `isize` values"] + struct isizex2([isize; 2]); +} + +define_type! { + #[doc = "Vector of four `isize` values"] + struct isizex4([isize; 4]); +} + +define_type! { + #[doc = "Vector of eight `isize` values"] + struct isizex8([isize; 8]); +} + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m256i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_u128.rs b/crates/core_simd/src/vectors_u128.rs new file mode 100644 index 000000000000..01a1a309ffa1 --- /dev/null +++ b/crates/core_simd/src/vectors_u128.rs @@ -0,0 +1,23 @@ +define_type! { + #[doc = "Vector of two `u128` values"] + struct u128x2([u128; 2]); +} + +define_type! { + #[doc = "Vector of four `u128` values"] + struct u128x4([u128; 4]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs new file mode 100644 index 000000000000..00ae479c6db2 --- /dev/null +++ b/crates/core_simd/src/vectors_u16.rs @@ -0,0 +1,44 @@ +define_type! { + #[doc = "Vector of two `u16` values"] + struct u16x2([u16; 2]); +} + +define_type! { + #[doc = "Vector of four `u16` values"] + struct u16x4([u16; 4]); +} + +define_type! { + #[doc = "Vector of eight `u16` values"] + struct u16x8([u16; 8]); +} + +define_type! { + #[doc = "Vector of 16 `u16` values"] + struct u16x16([u16; 16]); +} + +define_type! { + #[doc = "Vector of 32 `u16` values"] + struct u16x32([u16; 32]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_u32.rs b/crates/core_simd/src/vectors_u32.rs new file mode 100644 index 000000000000..c45db3634c48 --- /dev/null +++ b/crates/core_simd/src/vectors_u32.rs @@ -0,0 +1,39 @@ +define_type! { + #[doc = "Vector of two `u32` values"] + struct u32x2([u32; 2]); +} + +define_type! { + #[doc = "Vector of four `u32` values"] + struct u32x4([u32; 4]); +} + +define_type! { + #[doc = "Vector of eight `u32` values"] + struct u32x8([u32; 8]); +} + +define_type! { + #[doc = "Vector of 16 `u32` values"] + struct u32x16([u32; 16]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_u64.rs b/crates/core_simd/src/vectors_u64.rs new file mode 100644 index 000000000000..4c8b95177f55 --- /dev/null +++ b/crates/core_simd/src/vectors_u64.rs @@ -0,0 +1,34 @@ +define_type! { + #[doc = "Vector of two `u64` values"] + struct u64x2([u64; 2]); +} + +define_type! { + #[doc = "Vector of four `u64` values"] + struct u64x4([u64; 4]); +} + +define_type! { + #[doc = "Vector of eight `u64` values"] + struct u64x8([u64; 8]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs new file mode 100644 index 000000000000..d3f0893154ba --- /dev/null +++ b/crates/core_simd/src/vectors_u8.rs @@ -0,0 +1,49 @@ +define_type! { + #[doc = "Vector of two `u8` values"] + struct u8x2([u8; 2]); +} + +define_type! { + #[doc = "Vector of four `u8` values"] + struct u8x4([u8; 4]); +} + +define_type! { + #[doc = "Vector of eight `u8` values"] + struct u8x8([u8; 8]); +} + +define_type! { + #[doc = "Vector of 16 `u8` values"] + struct u8x16([u8; 16]); +} + +define_type! { + #[doc = "Vector of 32 `u8` values"] + struct u8x32([u8; 32]); +} + +define_type! { + #[doc = "Vector of 64 `u8` values"] + struct u8x64([u8; 64]); +} + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86::__m128i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m256i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(target_arch = "x86")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } + +#[cfg(target_arch = "x86_64")] +from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } +*/ diff --git a/crates/core_simd/src/vectors_usize.rs b/crates/core_simd/src/vectors_usize.rs new file mode 100644 index 000000000000..c997e7cd4e3d --- /dev/null +++ b/crates/core_simd/src/vectors_usize.rs @@ -0,0 +1,46 @@ +define_type! { + #[doc = "Vector of two `usize` values"] + struct usizex2([usize; 2]); +} + +define_type! { + #[doc = "Vector of four `usize` values"] + struct usizex4([usize; 4]); +} + +define_type! { + #[doc = "Vector of eight `usize` values"] + struct usizex8([usize; 8]); +} + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m256i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86::__m128i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86_64::__m128i } + +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m256i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m256i } + +/* +#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m512i } + +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m512i } +*/ From 872e8f62d6e776436cb830f3178beb4a853e7df8 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Wed, 23 Sep 2020 10:42:12 -0400 Subject: [PATCH 05/15] Simplify transmutes --- crates/core_simd/src/macros.rs | 37 ++++++++++--------------- crates/core_simd/src/vectors_f32.rs | 22 ++------------- crates/core_simd/src/vectors_f64.rs | 22 ++------------- crates/core_simd/src/vectors_i128.rs | 15 ++-------- crates/core_simd/src/vectors_i16.rs | 22 ++------------- crates/core_simd/src/vectors_i32.rs | 22 ++------------- crates/core_simd/src/vectors_i64.rs | 22 ++------------- crates/core_simd/src/vectors_i8.rs | 22 ++------------- crates/core_simd/src/vectors_isize.rs | 40 +++++++-------------------- crates/core_simd/src/vectors_u128.rs | 15 ++-------- crates/core_simd/src/vectors_u16.rs | 22 ++------------- crates/core_simd/src/vectors_u32.rs | 22 ++------------- crates/core_simd/src/vectors_u64.rs | 22 ++------------- crates/core_simd/src/vectors_u8.rs | 22 ++------------- crates/core_simd/src/vectors_usize.rs | 40 +++++++-------------------- 15 files changed, 69 insertions(+), 298 deletions(-) diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 91c1071a2ee5..5a50b1a48ec1 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -1,29 +1,25 @@ -macro_rules! from_aligned { - { unsafe $from:ty => $to:ty } => { +macro_rules! from_transmute { + { unsafe $a:ty => $b:ty } => { + from_transmute!{ @impl $a => $b } + from_transmute!{ @impl $b => $a } + }; + { @impl $from:ty => $to:ty } => { impl core::convert::From<$from> for $to { #[inline] fn from(value: $from) -> $to { - assert_eq!(core::mem::size_of::<$from>(), core::mem::size_of::<$to>()); - assert!(core::mem::align_of::<$from>() >= core::mem::align_of::<$to>()); unsafe { core::mem::transmute(value) } } } }; - { unsafe $a:ty |bidirectional| $b:ty } => { - from_aligned!{ unsafe $a => $b } - from_aligned!{ unsafe $b => $a } - } } -macro_rules! from_unaligned { - { unsafe $from:ty => $to:ty } => { - impl core::convert::From<$from> for $to { - #[inline] - fn from(value: $from) -> $to { - assert_eq!(core::mem::size_of::<$from>(), core::mem::size_of::<$to>()); - unsafe { (&value as *const $from as *const $to).read_unaligned() } - } - } +macro_rules! from_transmute_x86 { + { unsafe $generic:ty => $intel:ident } => { + #[cfg(target_arch = "x86")] + from_transmute! { unsafe $generic => core::arch::x86::$intel } + + #[cfg(target_arch = "x86_64")] + from_transmute! { unsafe $generic => core::arch::x86_64::$intel } } } @@ -61,11 +57,8 @@ macro_rules! define_type { } } - // vector to array - from_aligned! { unsafe $name => [$type; $lanes] } - - // array to vector - from_unaligned! { unsafe [$type; $lanes] => $name } + // vector/array conversion + from_transmute! { unsafe $name => [$type; $lanes] } // splat impl From<$type> for $name { diff --git a/crates/core_simd/src/vectors_f32.rs b/crates/core_simd/src/vectors_f32.rs index fe24ec6b727e..3b38b26d6310 100644 --- a/crates/core_simd/src/vectors_f32.rs +++ b/crates/core_simd/src/vectors_f32.rs @@ -18,22 +18,6 @@ define_type! { struct f32x16([f32; 16]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86::__m128 } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86_64::__m128 } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86::__m256 } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86_64::__m256 } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86::__m512 } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86_64::__m512 } -*/ +from_transmute_x86! { unsafe f32x4 => __m128 } +from_transmute_x86! { unsafe f32x8 => __m256 } +//from_transmute_x86! { unsafe f32x16 => __m512 } diff --git a/crates/core_simd/src/vectors_f64.rs b/crates/core_simd/src/vectors_f64.rs index 8934cec0517d..f627fffd46b4 100644 --- a/crates/core_simd/src/vectors_f64.rs +++ b/crates/core_simd/src/vectors_f64.rs @@ -13,22 +13,6 @@ define_type! { struct f64x8([f64; 8]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86::__m128d } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86_64::__m128d } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86::__m256d } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86_64::__m256d } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86::__m512d } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86_64::__m512d } -*/ +from_transmute_x86! { unsafe f64x2 => __m128d } +from_transmute_x86! { unsafe f64x4 => __m256d } +//from_transmute_x86! { unsafe f64x8 => __m512d } diff --git a/crates/core_simd/src/vectors_i128.rs b/crates/core_simd/src/vectors_i128.rs index 1cdd3c91211e..b4f30f845fd1 100644 --- a/crates/core_simd/src/vectors_i128.rs +++ b/crates/core_simd/src/vectors_i128.rs @@ -8,16 +8,5 @@ define_type! { struct i128x4([i128; 4]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe i128x2 => __m256i } +//from_transmute_x86! { unsafe i128x4 => __m512i } diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs index 724fe7efd1a4..a87fa8c41cd5 100644 --- a/crates/core_simd/src/vectors_i16.rs +++ b/crates/core_simd/src/vectors_i16.rs @@ -23,22 +23,6 @@ define_type! { struct i16x32([i16; 32]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe i16x8 => __m128i } +from_transmute_x86! { unsafe i16x16 => __m256i } +//from_transmute_x86! { unsafe i16x32 => __m512i } diff --git a/crates/core_simd/src/vectors_i32.rs b/crates/core_simd/src/vectors_i32.rs index c3af621ae8a4..13c9299b7c6e 100644 --- a/crates/core_simd/src/vectors_i32.rs +++ b/crates/core_simd/src/vectors_i32.rs @@ -18,22 +18,6 @@ define_type! { struct i32x16([i32; 16]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe i32x4 => __m128i } +from_transmute_x86! { unsafe i32x8 => __m256i } +//from_transmute_x86! { unsafe i32x16 => __m512i } diff --git a/crates/core_simd/src/vectors_i64.rs b/crates/core_simd/src/vectors_i64.rs index 8c6c9d940b15..8d86501a4961 100644 --- a/crates/core_simd/src/vectors_i64.rs +++ b/crates/core_simd/src/vectors_i64.rs @@ -13,22 +13,6 @@ define_type! { struct i64x8([i64; 8]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe i64x2 => __m128i } +from_transmute_x86! { unsafe i64x4 => __m256i } +//from_transmute_x86! { unsafe i64x8 => __m512i } diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs index 340025972d7b..f0d5ad55212d 100644 --- a/crates/core_simd/src/vectors_i8.rs +++ b/crates/core_simd/src/vectors_i8.rs @@ -28,22 +28,6 @@ define_type! { struct i8x64([i8; 64]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe i8x16 => __m128i } +from_transmute_x86! { unsafe i8x32 => __m256i } +//from_transmute_x86! { unsafe i8x64 => __m512i } diff --git a/crates/core_simd/src/vectors_isize.rs b/crates/core_simd/src/vectors_isize.rs index 60f4aad2066a..2028d1ecc710 100644 --- a/crates/core_simd/src/vectors_isize.rs +++ b/crates/core_simd/src/vectors_isize.rs @@ -13,34 +13,14 @@ define_type! { struct isizex8([isize; 8]); } -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m128i } +#[cfg(target_pointer_width = "32")] +from_transmute_x86! { unsafe isizex4 => __m128i } +#[cfg(target_pointer_width = "32")] +from_transmute_x86! { unsafe isizex8 => __m256i } -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m256i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m512i } -*/ +#[cfg(target_pointer_width = "64")] +from_transmute_x86! { unsafe isizex2 => __m128i } +#[cfg(target_pointer_width = "64")] +from_transmute_x86! { unsafe isizex4 => __m256i } +//#[cfg(target_pointer_width = "64")] +//from_transmute_x86! { unsafe isizex8 => __m512i } diff --git a/crates/core_simd/src/vectors_u128.rs b/crates/core_simd/src/vectors_u128.rs index 01a1a309ffa1..4b47fb2fa2ec 100644 --- a/crates/core_simd/src/vectors_u128.rs +++ b/crates/core_simd/src/vectors_u128.rs @@ -8,16 +8,5 @@ define_type! { struct u128x4([u128; 4]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe u128x2 => __m256i } +//from_transmute_x86! { unsafe u128x4 => __m512i } diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs index 00ae479c6db2..f637d2fe9f2c 100644 --- a/crates/core_simd/src/vectors_u16.rs +++ b/crates/core_simd/src/vectors_u16.rs @@ -23,22 +23,6 @@ define_type! { struct u16x32([u16; 32]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u16x8 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u16x16 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u16x32 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe u16x8 => __m128i } +from_transmute_x86! { unsafe u16x16 => __m256i } +//from_transmute_x86! { unsafe u16x32 => __m512i } diff --git a/crates/core_simd/src/vectors_u32.rs b/crates/core_simd/src/vectors_u32.rs index c45db3634c48..d2f5d7d241c5 100644 --- a/crates/core_simd/src/vectors_u32.rs +++ b/crates/core_simd/src/vectors_u32.rs @@ -18,22 +18,6 @@ define_type! { struct u32x16([u32; 16]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x4 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x8 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe u32x4 => __m128i } +from_transmute_x86! { unsafe u32x8 => __m256i } +//from_transmute_x86! { unsafe u32x16 => __m512i } diff --git a/crates/core_simd/src/vectors_u64.rs b/crates/core_simd/src/vectors_u64.rs index 4c8b95177f55..e6e21e62da10 100644 --- a/crates/core_simd/src/vectors_u64.rs +++ b/crates/core_simd/src/vectors_u64.rs @@ -13,22 +13,6 @@ define_type! { struct u64x8([u64; 8]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u64x2 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u64x4 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u64x8 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe u64x2 => __m128i } +from_transmute_x86! { unsafe u64x4 => __m256i } +//from_transmute_x86! { unsafe u64x8 => __m512i } diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs index d3f0893154ba..f6246f87ecec 100644 --- a/crates/core_simd/src/vectors_u8.rs +++ b/crates/core_simd/src/vectors_u8.rs @@ -28,22 +28,6 @@ define_type! { struct u8x64([u8; 64]); } -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86::__m128i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x16 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m256i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(target_arch = "x86")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i } - -#[cfg(target_arch = "x86_64")] -from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i } -*/ +from_transmute_x86! { unsafe u8x16 => __m128i } +from_transmute_x86! { unsafe u8x32 => __m256i } +//from_transmute_x86! { unsafe u8x64 => __m512i } diff --git a/crates/core_simd/src/vectors_usize.rs b/crates/core_simd/src/vectors_usize.rs index c997e7cd4e3d..45da00562f60 100644 --- a/crates/core_simd/src/vectors_usize.rs +++ b/crates/core_simd/src/vectors_usize.rs @@ -13,34 +13,14 @@ define_type! { struct usizex8([usize; 8]); } -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m128i } +#[cfg(target_pointer_width = "32")] +from_transmute_x86! { unsafe usizex4 => __m128i } +#[cfg(target_pointer_width = "32")] +from_transmute_x86! { unsafe usizex8 => __m256i } -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "32"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m256i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86::__m128i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe usizex2 |bidirectional| core::arch::x86_64::__m128i } - -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86::__m256i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe usizex4 |bidirectional| core::arch::x86_64::__m256i } - -/* -#[cfg(all(target_arch = "x86", target_pointer_width = "64"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86::__m512i } - -#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -from_aligned! { unsafe usizex8 |bidirectional| core::arch::x86_64::__m512i } -*/ +#[cfg(target_pointer_width = "64")] +from_transmute_x86! { unsafe usizex2 => __m128i } +#[cfg(target_pointer_width = "64")] +from_transmute_x86! { unsafe usizex4 => __m256i } +//#[cfg(target_pointer_width = "64")] +//from_transmute_x86! { unsafe usizex8 => __m512i } From 3df72fddc267144a2052167c012b654974d84bb8 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Thu, 24 Sep 2020 19:48:18 -0400 Subject: [PATCH 06/15] Add masks --- crates/core_simd/src/lib.rs | 19 ++ crates/core_simd/src/macros.rs | 240 +++++++++++++++++------ crates/core_simd/src/masks.rs | 67 +++++++ crates/core_simd/src/vectors_f32.rs | 8 +- crates/core_simd/src/vectors_f64.rs | 6 +- crates/core_simd/src/vectors_i128.rs | 4 +- crates/core_simd/src/vectors_i16.rs | 10 +- crates/core_simd/src/vectors_i32.rs | 8 +- crates/core_simd/src/vectors_i64.rs | 6 +- crates/core_simd/src/vectors_i8.rs | 12 +- crates/core_simd/src/vectors_isize.rs | 6 +- crates/core_simd/src/vectors_mask128.rs | 11 ++ crates/core_simd/src/vectors_mask16.rs | 26 +++ crates/core_simd/src/vectors_mask32.rs | 21 ++ crates/core_simd/src/vectors_mask64.rs | 16 ++ crates/core_simd/src/vectors_mask8.rs | 31 +++ crates/core_simd/src/vectors_masksize.rs | 16 ++ crates/core_simd/src/vectors_u128.rs | 4 +- crates/core_simd/src/vectors_u16.rs | 10 +- crates/core_simd/src/vectors_u32.rs | 8 +- crates/core_simd/src/vectors_u64.rs | 6 +- crates/core_simd/src/vectors_u8.rs | 12 +- crates/core_simd/src/vectors_usize.rs | 6 +- 23 files changed, 439 insertions(+), 114 deletions(-) create mode 100644 crates/core_simd/src/masks.rs create mode 100644 crates/core_simd/src/vectors_mask128.rs create mode 100644 crates/core_simd/src/vectors_mask16.rs create mode 100644 crates/core_simd/src/vectors_mask32.rs create mode 100644 crates/core_simd/src/vectors_mask64.rs create mode 100644 crates/core_simd/src/vectors_mask8.rs create mode 100644 crates/core_simd/src/vectors_masksize.rs diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index a5dae4b02792..1ee180a5e3a1 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -1,10 +1,14 @@ #![no_std] #![feature(repr_simd)] #![warn(missing_docs)] +//! Portable SIMD module. #[macro_use] mod macros; +mod masks; +pub use masks::*; + mod vectors_u8; pub use vectors_u8::*; mod vectors_u16; @@ -17,6 +21,7 @@ mod vectors_u128; pub use vectors_u128::*; mod vectors_usize; pub use vectors_usize::*; + mod vectors_i8; pub use vectors_i8::*; mod vectors_i16; @@ -29,7 +34,21 @@ mod vectors_i128; pub use vectors_i128::*; mod vectors_isize; pub use vectors_isize::*; + mod vectors_f32; pub use vectors_f32::*; mod vectors_f64; pub use vectors_f64::*; + +mod vectors_mask8; +pub use vectors_mask8::*; +mod vectors_mask16; +pub use vectors_mask16::*; +mod vectors_mask32; +pub use vectors_mask32::*; +mod vectors_mask64; +pub use vectors_mask64::*; +mod vectors_mask128; +pub use vectors_mask128::*; +mod vectors_masksize; +pub use vectors_masksize::*; diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 5a50b1a48ec1..3b5d70695c61 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -1,3 +1,4 @@ +/// Provides implementations of `From<$a> for $b` and `From<$b> for $a` that transmutes the value. macro_rules! from_transmute { { unsafe $a:ty => $b:ty } => { from_transmute!{ @impl $a => $b } @@ -13,6 +14,8 @@ macro_rules! from_transmute { }; } +/// Provides implementations of `From<$generic> for core::arch::{x86, x86_64}::$intel` and +/// vice-versa that transmutes the value. macro_rules! from_transmute_x86 { { unsafe $generic:ty => $intel:ident } => { #[cfg(target_arch = "x86")] @@ -23,10 +26,118 @@ macro_rules! from_transmute_x86 { } } -macro_rules! define_type { - { $(#[$attr:meta])* struct $name:ident([$type:ty; $lanes:tt]); } => { - define_type! { @impl $(#[$attr])* | $name [$type; $lanes] } +/// Calls a the macro `$mac` with the provided `$args` followed by `$repeat` repeated the specified +/// number of times. +macro_rules! call_repeat { + { 1 => $mac:path [$($repeat:tt)*] $($args:tt)* } => { + $mac! { + $($args)* + $($repeat)* + } + }; + { 2 => $mac:path [$($repeat:tt)*] $($args:tt)* } => { + $mac! { + $($args)* + $($repeat)* $($repeat)* + } + }; + { 4 => $mac:path [$($repeat:tt)*] $($args:tt)* } => { + $mac! { + $($args)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* + } + }; + { 8 => $mac:path [$($repeat:tt)*] $($args:tt)* } => { + $mac! { + $($args)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + } + }; + { 16 => $mac:path [$($repeat:tt)*] $($args:tt)* } => { + $mac! { + $($args)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + } + }; + { 32 => $mac:path [$($repeat:tt)*] $($args:tt)* } => { + $mac! { + $($args)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + } + }; + { 64 => $mac:path [$($repeat:tt)*] $($args:tt)* } => { + $mac! { + $($args)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* + } + }; +} +/// Calls the macro `$mac` with the specified `$args` followed by the specified number of unique +/// identifiers. +macro_rules! call_counting_args { + { 1 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + value + } + }; + { 2 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + v1 v2 + } + }; + { 4 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + v0 v1 v2 v3 + } + }; + { 8 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + v0 v1 v2 v3 v4 v5 v6 v7 + } + }; + { 16 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 + } + }; + { 32 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 + v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 + } + }; + { 64 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 + v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 + v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 v47 + v48 v49 v50 v51 v52 v53 v54 v55 v56 v57 v58 v59 v60 v61 v62 v63 + } + }; +} + +/// Implements common traits on the specified vector `$name`, holding multiple `$lanes` of `$type`. +macro_rules! base_vector_traits { + { $name:path => [$type:ty; $lanes:literal] } => { // array references impl AsRef<[$type; $lanes]> for $name { #[inline] @@ -67,71 +178,78 @@ macro_rules! define_type { Self::splat(value) } } - }; - { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 1] } => { - define_type! { @def $(#[$attr])* | $name | $type | $type, | v0, } - }; - { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 2] } => { - define_type! { @def $(#[$attr])* | $name | $type | $type, $type, | v0, v1, } - }; - { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 4] } => { - define_type! { @def $(#[$attr])* | $name | $type | - $type, $type, $type, $type, | - v0, v1, v2, v3, + } +} + +/// Defines a vector `$name` containing multiple `$lanes` of `$type`. +macro_rules! define_vector { + { $(#[$attr:meta])* struct $name:ident([$type:ty; $lanes:tt]); } => { + call_repeat! { $lanes => define_vector [$type] def $(#[$attr])* | $name | } + + impl $name { + call_repeat! { $lanes => define_vector [$type] splat $type | } + call_counting_args! { $lanes => define_vector => new $type | } } + + base_vector_traits! { $name => [$type; $lanes] } }; - { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 8] } => { - define_type! { @def $(#[$attr])* | $name | $type | - $type, $type, $type, $type, $type, $type, $type, $type, | - v0, v1, v2, v3, v4, v5, v6, v7, - } - }; - { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 16] } => { - define_type! { @def $(#[$attr])* | $name | $type | - $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | - v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, - } - }; - { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 32] } => { - define_type! { @def $(#[$attr])* | $name | $type | - $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, - $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | - v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, - v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, - } - }; - { @impl $(#[$attr:meta])* | $name:ident [$type:ty; 64] } => { - define_type! { @def $(#[$attr])* | $name | $type | - $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, - $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, - $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, - $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, | - v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, - v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, - v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, - v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63, - } - }; - { @def $(#[$attr:meta])* | $name:ident | $type:ty | $($itype:ty,)* | $($ivar:ident,)* } => { + { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { $(#[$attr])* #[allow(non_camel_case_types)] #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)] #[repr(simd)] pub struct $name($($itype),*); - - impl $name { - /// Construct a vector by setting all lanes to the given value. - #[inline] - pub const fn splat(value: $type) -> Self { - Self($(value as $itype),*) - } - - /// Construct a vector by setting each lane to the given values. - #[allow(clippy::too_many_arguments)] - #[inline] - pub const fn new($($ivar: $itype),*) -> Self { - Self($($ivar),*) - } + }; + { splat $type:ty | $($itype:ty)* } => { + /// Construct a vector by setting all lanes to the given value. + #[inline] + pub const fn splat(value: $type) -> Self { + Self($(value as $itype),*) + } + }; + { new $type:ty | $($var:ident)* } => { + /// Construct a vector by setting each lane to the given values. + #[allow(clippy::too_many_arguments)] + #[inline] + pub const fn new($($var: $type),*) -> Self { + Self($($var),*) + } + } +} + +/// Defines a mask vector `$name` containing multiple `$lanes` of `$type`, represented by the +/// underlying type `$impl_type`. +macro_rules! define_mask_vector { + { $(#[$attr:meta])* struct $name:ident([$impl_type:ty as $type:ty; $lanes:tt]); } => { + call_repeat! { $lanes => define_mask_vector [$impl_type] def $(#[$attr])* | $name | } + + impl $name { + call_repeat! { $lanes => define_mask_vector [$impl_type] splat $type | } + call_counting_args! { $lanes => define_mask_vector => new $type | } + } + + base_vector_traits! { $name => [$type; $lanes] } + }; + { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { + $(#[$attr])* + #[allow(non_camel_case_types)] + #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)] + #[repr(simd)] + pub struct $name($($itype),*); + }; + { splat $type:ty | $($itype:ty)* } => { + /// Construct a vector by setting all lanes to the given value. + #[inline] + pub const fn splat(value: $type) -> Self { + Self($(value.0 as $itype),*) + } + }; + { new $type:ty | $($var:ident)* } => { + /// Construct a vector by setting each lane to the given values. + #[allow(clippy::too_many_arguments)] + #[inline] + pub const fn new($($var: $type),*) -> Self { + Self($($var.0),*) } } } diff --git a/crates/core_simd/src/masks.rs b/crates/core_simd/src/masks.rs new file mode 100644 index 000000000000..970047aabdef --- /dev/null +++ b/crates/core_simd/src/masks.rs @@ -0,0 +1,67 @@ +macro_rules! define_mask { + { $(#[$attr:meta])* struct $name:ident($type:ty); } => { + $(#[$attr])* + #[allow(non_camel_case_types)] + #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd, Eq, Ord, Hash)] + #[repr(transparent)] + pub struct $name(pub(crate) $type); + + impl $name { + /// Construct a mask from the given value. + pub const fn new(value: bool) -> Self { + if value { + Self(!0) + } else { + Self(0) + } + } + + /// Test if the mask is set. + pub const fn test(&self) -> bool { + self.0 != 0 + } + } + + impl core::convert::From for $name { + fn from(value: bool) -> Self { + Self::new(value) + } + } + + impl core::convert::From<$name> for bool { + fn from(mask: $name) -> Self { + mask.test() + } + } + } +} + +define_mask! { + #[doc = "8-bit mask"] + struct mask8(i8); +} + +define_mask! { + #[doc = "16-bit mask"] + struct mask16(i16); +} + +define_mask! { + #[doc = "32-bit mask"] + struct mask32(i32); +} + +define_mask! { + #[doc = "64-bit mask"] + struct mask64(i64); +} + +define_mask! { + #[doc = "128-bit mask"] + struct mask128(i128); +} + +define_mask! { + #[doc = "`isize`-wide mask"] + struct masksize(isize); +} diff --git a/crates/core_simd/src/vectors_f32.rs b/crates/core_simd/src/vectors_f32.rs index 3b38b26d6310..c2987a7f6314 100644 --- a/crates/core_simd/src/vectors_f32.rs +++ b/crates/core_simd/src/vectors_f32.rs @@ -1,19 +1,19 @@ -define_type! { +define_vector! { #[doc = "Vector of two `f32` values"] struct f32x2([f32; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `f32` values"] struct f32x4([f32; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `f32` values"] struct f32x8([f32; 8]); } -define_type! { +define_vector! { #[doc = "Vector of 16 `f32` values"] struct f32x16([f32; 16]); } diff --git a/crates/core_simd/src/vectors_f64.rs b/crates/core_simd/src/vectors_f64.rs index f627fffd46b4..4881df2b6dac 100644 --- a/crates/core_simd/src/vectors_f64.rs +++ b/crates/core_simd/src/vectors_f64.rs @@ -1,14 +1,14 @@ -define_type! { +define_vector! { #[doc = "Vector of two `f64` values"] struct f64x2([f64; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `f64` values"] struct f64x4([f64; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `f64` values"] struct f64x8([f64; 8]); } diff --git a/crates/core_simd/src/vectors_i128.rs b/crates/core_simd/src/vectors_i128.rs index b4f30f845fd1..939aeb8ce2e9 100644 --- a/crates/core_simd/src/vectors_i128.rs +++ b/crates/core_simd/src/vectors_i128.rs @@ -1,9 +1,9 @@ -define_type! { +define_vector! { #[doc = "Vector of two `i128` values"] struct i128x2([i128; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `i128` values"] struct i128x4([i128; 4]); } diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs index a87fa8c41cd5..b9089a3b4edf 100644 --- a/crates/core_simd/src/vectors_i16.rs +++ b/crates/core_simd/src/vectors_i16.rs @@ -1,24 +1,24 @@ -define_type! { +define_vector! { #[doc = "Vector of two `i16` values"] struct i16x2([i16; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `i16` values"] struct i16x4([i16; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `i16` values"] struct i16x8([i16; 8]); } -define_type! { +define_vector! { #[doc = "Vector of 16 `i16` values"] struct i16x16([i16; 16]); } -define_type! { +define_vector! { #[doc = "Vector of 32 `i16` values"] struct i16x32([i16; 32]); } diff --git a/crates/core_simd/src/vectors_i32.rs b/crates/core_simd/src/vectors_i32.rs index 13c9299b7c6e..686576baff18 100644 --- a/crates/core_simd/src/vectors_i32.rs +++ b/crates/core_simd/src/vectors_i32.rs @@ -1,19 +1,19 @@ -define_type! { +define_vector! { #[doc = "Vector of two `i32` values"] struct i32x2([i32; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `i32` values"] struct i32x4([i32; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `i32` values"] struct i32x8([i32; 8]); } -define_type! { +define_vector! { #[doc = "Vector of 16 `i32` values"] struct i32x16([i32; 16]); } diff --git a/crates/core_simd/src/vectors_i64.rs b/crates/core_simd/src/vectors_i64.rs index 8d86501a4961..0a34b4c9d7e8 100644 --- a/crates/core_simd/src/vectors_i64.rs +++ b/crates/core_simd/src/vectors_i64.rs @@ -1,14 +1,14 @@ -define_type! { +define_vector! { #[doc = "Vector of two `i64` values"] struct i64x2([i64; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `i64` values"] struct i64x4([i64; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `i64` values"] struct i64x8([i64; 8]); } diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs index f0d5ad55212d..2deacfc1feb7 100644 --- a/crates/core_simd/src/vectors_i8.rs +++ b/crates/core_simd/src/vectors_i8.rs @@ -1,29 +1,29 @@ -define_type! { +define_vector! { #[doc = "Vector of two `i8` values"] struct i8x2([i8; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `i8` values"] struct i8x4([i8; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `i8` values"] struct i8x8([i8; 8]); } -define_type! { +define_vector! { #[doc = "Vector of 16 `i8` values"] struct i8x16([i8; 16]); } -define_type! { +define_vector! { #[doc = "Vector of 32 `i8` values"] struct i8x32([i8; 32]); } -define_type! { +define_vector! { #[doc = "Vector of 64 `i8` values"] struct i8x64([i8; 64]); } diff --git a/crates/core_simd/src/vectors_isize.rs b/crates/core_simd/src/vectors_isize.rs index 2028d1ecc710..e709d1758704 100644 --- a/crates/core_simd/src/vectors_isize.rs +++ b/crates/core_simd/src/vectors_isize.rs @@ -1,14 +1,14 @@ -define_type! { +define_vector! { #[doc = "Vector of two `isize` values"] struct isizex2([isize; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `isize` values"] struct isizex4([isize; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `isize` values"] struct isizex8([isize; 8]); } diff --git a/crates/core_simd/src/vectors_mask128.rs b/crates/core_simd/src/vectors_mask128.rs new file mode 100644 index 000000000000..3b1bacb7ad3c --- /dev/null +++ b/crates/core_simd/src/vectors_mask128.rs @@ -0,0 +1,11 @@ +use crate::mask128; + +define_mask_vector! { + #[doc = "vector of two `mask128` values"] + struct mask128x2([i128 as mask128; 2]); +} + +define_mask_vector! { + #[doc = "vector of four `mask128` values"] + struct mask128x4([i128 as mask128; 4]); +} diff --git a/crates/core_simd/src/vectors_mask16.rs b/crates/core_simd/src/vectors_mask16.rs new file mode 100644 index 000000000000..8d076636caac --- /dev/null +++ b/crates/core_simd/src/vectors_mask16.rs @@ -0,0 +1,26 @@ +use crate::mask16; + +define_mask_vector! { + #[doc = "vector of two `mask16` values"] + struct mask16x2([i16 as mask16; 2]); +} + +define_mask_vector! { + #[doc = "vector of four `mask16` values"] + struct mask16x4([i16 as mask16; 4]); +} + +define_mask_vector! { + #[doc = "vector of eight `mask16` values"] + struct mask16x8([i16 as mask16; 8]); +} + +define_mask_vector! { + #[doc = "vector of 16 `mask16` values"] + struct mask16x16([i16 as mask16; 16]); +} + +define_mask_vector! { + #[doc = "vector of 32 `mask16` values"] + struct mask16x32([i16 as mask16; 32]); +} diff --git a/crates/core_simd/src/vectors_mask32.rs b/crates/core_simd/src/vectors_mask32.rs new file mode 100644 index 000000000000..64044bc4f578 --- /dev/null +++ b/crates/core_simd/src/vectors_mask32.rs @@ -0,0 +1,21 @@ +use crate::mask32; + +define_mask_vector! { + #[doc = "vector of two `mask32` values"] + struct mask32x2([i32 as mask32; 2]); +} + +define_mask_vector! { + #[doc = "vector of four `mask32` values"] + struct mask32x4([i32 as mask32; 4]); +} + +define_mask_vector! { + #[doc = "vector of eight `mask32` values"] + struct mask32x8([i32 as mask32; 8]); +} + +define_mask_vector! { + #[doc = "vector of 16 `mask32` values"] + struct mask32x16([i32 as mask32; 16]); +} diff --git a/crates/core_simd/src/vectors_mask64.rs b/crates/core_simd/src/vectors_mask64.rs new file mode 100644 index 000000000000..b0c62b225c9b --- /dev/null +++ b/crates/core_simd/src/vectors_mask64.rs @@ -0,0 +1,16 @@ +use crate::mask64; + +define_mask_vector! { + #[doc = "vector of two `mask64` values"] + struct mask64x2([i64 as mask64; 2]); +} + +define_mask_vector! { + #[doc = "vector of four `mask64` values"] + struct mask64x4([i64 as mask64; 4]); +} + +define_mask_vector! { + #[doc = "vector of eight `mask64` values"] + struct mask64x8([i64 as mask64; 8]); +} diff --git a/crates/core_simd/src/vectors_mask8.rs b/crates/core_simd/src/vectors_mask8.rs new file mode 100644 index 000000000000..c8f3cbac3c91 --- /dev/null +++ b/crates/core_simd/src/vectors_mask8.rs @@ -0,0 +1,31 @@ +use crate::mask8; + +define_mask_vector! { + #[doc = "vector of two `mask8` values"] + struct mask8x2([i8 as mask8; 2]); +} + +define_mask_vector! { + #[doc = "vector of four `mask8` values"] + struct mask8x4([i8 as mask8; 4]); +} + +define_mask_vector! { + #[doc = "vector of eight `mask8` values"] + struct mask8x8([i8 as mask8; 8]); +} + +define_mask_vector! { + #[doc = "vector of 16 `mask8` values"] + struct mask8x16([i8 as mask8; 16]); +} + +define_mask_vector! { + #[doc = "vector of 32 `mask8` values"] + struct mask8x32([i8 as mask8; 32]); +} + +define_mask_vector! { + #[doc = "vector of 64 `mask8` values"] + struct mask8x64([i8 as mask8; 64]); +} diff --git a/crates/core_simd/src/vectors_masksize.rs b/crates/core_simd/src/vectors_masksize.rs new file mode 100644 index 000000000000..1bf911caffc6 --- /dev/null +++ b/crates/core_simd/src/vectors_masksize.rs @@ -0,0 +1,16 @@ +use crate::masksize; + +define_mask_vector! { + #[doc = "vector of two `masksize` values"] + struct masksizex2([isize as masksize; 2]); +} + +define_mask_vector! { + #[doc = "vector of four `masksize` values"] + struct masksizex4([isize as masksize; 4]); +} + +define_mask_vector! { + #[doc = "vector of eight `masksize` values"] + struct masksizex8([isize as masksize; 8]); +} diff --git a/crates/core_simd/src/vectors_u128.rs b/crates/core_simd/src/vectors_u128.rs index 4b47fb2fa2ec..f98026275c73 100644 --- a/crates/core_simd/src/vectors_u128.rs +++ b/crates/core_simd/src/vectors_u128.rs @@ -1,9 +1,9 @@ -define_type! { +define_vector! { #[doc = "Vector of two `u128` values"] struct u128x2([u128; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `u128` values"] struct u128x4([u128; 4]); } diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs index f637d2fe9f2c..e6ec15679f8c 100644 --- a/crates/core_simd/src/vectors_u16.rs +++ b/crates/core_simd/src/vectors_u16.rs @@ -1,24 +1,24 @@ -define_type! { +define_vector! { #[doc = "Vector of two `u16` values"] struct u16x2([u16; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `u16` values"] struct u16x4([u16; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `u16` values"] struct u16x8([u16; 8]); } -define_type! { +define_vector! { #[doc = "Vector of 16 `u16` values"] struct u16x16([u16; 16]); } -define_type! { +define_vector! { #[doc = "Vector of 32 `u16` values"] struct u16x32([u16; 32]); } diff --git a/crates/core_simd/src/vectors_u32.rs b/crates/core_simd/src/vectors_u32.rs index d2f5d7d241c5..e347509fa54b 100644 --- a/crates/core_simd/src/vectors_u32.rs +++ b/crates/core_simd/src/vectors_u32.rs @@ -1,19 +1,19 @@ -define_type! { +define_vector! { #[doc = "Vector of two `u32` values"] struct u32x2([u32; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `u32` values"] struct u32x4([u32; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `u32` values"] struct u32x8([u32; 8]); } -define_type! { +define_vector! { #[doc = "Vector of 16 `u32` values"] struct u32x16([u32; 16]); } diff --git a/crates/core_simd/src/vectors_u64.rs b/crates/core_simd/src/vectors_u64.rs index e6e21e62da10..a3b786230975 100644 --- a/crates/core_simd/src/vectors_u64.rs +++ b/crates/core_simd/src/vectors_u64.rs @@ -1,14 +1,14 @@ -define_type! { +define_vector! { #[doc = "Vector of two `u64` values"] struct u64x2([u64; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `u64` values"] struct u64x4([u64; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `u64` values"] struct u64x8([u64; 8]); } diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs index f6246f87ecec..eac58dcc9634 100644 --- a/crates/core_simd/src/vectors_u8.rs +++ b/crates/core_simd/src/vectors_u8.rs @@ -1,29 +1,29 @@ -define_type! { +define_vector! { #[doc = "Vector of two `u8` values"] struct u8x2([u8; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `u8` values"] struct u8x4([u8; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `u8` values"] struct u8x8([u8; 8]); } -define_type! { +define_vector! { #[doc = "Vector of 16 `u8` values"] struct u8x16([u8; 16]); } -define_type! { +define_vector! { #[doc = "Vector of 32 `u8` values"] struct u8x32([u8; 32]); } -define_type! { +define_vector! { #[doc = "Vector of 64 `u8` values"] struct u8x64([u8; 64]); } diff --git a/crates/core_simd/src/vectors_usize.rs b/crates/core_simd/src/vectors_usize.rs index 45da00562f60..dc97715f0c8d 100644 --- a/crates/core_simd/src/vectors_usize.rs +++ b/crates/core_simd/src/vectors_usize.rs @@ -1,14 +1,14 @@ -define_type! { +define_vector! { #[doc = "Vector of two `usize` values"] struct usizex2([usize; 2]); } -define_type! { +define_vector! { #[doc = "Vector of four `usize` values"] struct usizex4([usize; 4]); } -define_type! { +define_vector! { #[doc = "Vector of eight `usize` values"] struct usizex8([usize; 8]); } From 613f2420885432aecafb5493e3d0cd3f9a4d67f1 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Thu, 24 Sep 2020 21:15:31 -0400 Subject: [PATCH 07/15] Add pointer vectors and implement a few more traits --- crates/core_simd/src/lib.rs | 3 + crates/core_simd/src/macros.rs | 55 +++++++++++- crates/core_simd/src/pointers.rs | 116 ++++++++++++++++++++++++++ crates/core_simd/src/vectors_i128.rs | 2 + crates/core_simd/src/vectors_i16.rs | 5 ++ crates/core_simd/src/vectors_i32.rs | 4 + crates/core_simd/src/vectors_i64.rs | 3 + crates/core_simd/src/vectors_i8.rs | 6 ++ crates/core_simd/src/vectors_isize.rs | 3 + crates/core_simd/src/vectors_u128.rs | 2 + crates/core_simd/src/vectors_u16.rs | 5 ++ crates/core_simd/src/vectors_u32.rs | 4 + crates/core_simd/src/vectors_u64.rs | 3 + crates/core_simd/src/vectors_u8.rs | 6 ++ crates/core_simd/src/vectors_usize.rs | 3 + 15 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 crates/core_simd/src/pointers.rs diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index 1ee180a5e3a1..34f2b90f7673 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -9,6 +9,9 @@ mod macros; mod masks; pub use masks::*; +mod pointers; +pub use pointers::*; + mod vectors_u8; pub use vectors_u8::*; mod vectors_u16; diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 3b5d70695c61..6b5599f0170d 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -96,7 +96,7 @@ macro_rules! call_counting_args { { 2 => $mac:path => $($args:tt)* } => { $mac! { $($args)* - v1 v2 + v0 v1 } }; { 4 => $mac:path => $($args:tt)* } => { @@ -135,6 +135,57 @@ macro_rules! call_counting_args { }; } +/// Calls the macro `$mac` with the specified `$args` followed by counting values from 0 to the +/// specified value. +macro_rules! call_counting_values { + { 1 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + 0 + } + }; + { 2 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + 0 1 + } + }; + { 4 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + 0 1 2 3 + } + }; + { 8 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + 0 1 2 3 4 5 6 7 + } + }; + { 16 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + } + }; + { 32 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + 0 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 + } + }; + { 64 => $mac:path => $($args:tt)* } => { + $mac! { + $($args)* + 0 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 36 37 38 39 40 41 42 43 44 45 46 47 + 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 + } + }; +} + /// Implements common traits on the specified vector `$name`, holding multiple `$lanes` of `$type`. macro_rules! base_vector_traits { { $name:path => [$type:ty; $lanes:literal] } => { @@ -233,7 +284,7 @@ macro_rules! define_mask_vector { { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { $(#[$attr])* #[allow(non_camel_case_types)] - #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)] + #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd, Eq, Ord)] #[repr(simd)] pub struct $name($($itype),*); }; diff --git a/crates/core_simd/src/pointers.rs b/crates/core_simd/src/pointers.rs new file mode 100644 index 000000000000..ecd78fb0cb17 --- /dev/null +++ b/crates/core_simd/src/pointers.rs @@ -0,0 +1,116 @@ +use core::marker::PhantomData; + +use crate::vectors_isize::*; + +macro_rules! define_pointer_vector { + { $(#[$attr:meta])* $name:ident => $underlying:ty => $lanes:tt, $mut:ident } => { + $(#[$attr])* + #[allow(non_camel_case_types)] + #[repr(C)] + pub struct $name($underlying, PhantomData); + + impl Copy for $name {} + + impl Clone for $name { + #[inline] + fn clone(&self) -> Self { + *self + } + } + + impl core::cmp::PartialEq for $name { + #[inline] + fn eq(&self, other: &Self) -> bool { + self.0.eq(&other.0) + } + } + + impl core::cmp::Eq for $name {} + + impl core::cmp::PartialOrd for $name { + #[inline] + fn partial_cmp(&self, other: &Self) -> Option { + self.0.partial_cmp(&other.0) + } + } + + impl core::cmp::Ord for $name { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { + self.0.cmp(&other.0) + } + } + + call_counting_values! { $lanes => define_pointer_vector => debug $name | *$mut T | } + + impl $name { + /// Construct a vector by setting all lanes to the given value. + #[inline] + pub fn splat(value: *$mut T) -> Self { + Self(<$underlying>::splat(value as isize), PhantomData) + } + call_counting_args! { $lanes => define_pointer_vector => new $underlying | *$mut T | } + } + + // array references + impl AsRef<[*$mut T; $lanes]> for $name { + #[inline] + fn as_ref(&self) -> &[*$mut T; $lanes] { + unsafe { &*(self as *const _ as *const _) } + } + } + + impl AsMut<[*$mut T; $lanes]> for $name { + #[inline] + fn as_mut(&mut self) -> &mut [*$mut T; $lanes] { + unsafe { &mut *(self as *mut _ as *mut _) } + } + } + + // slice references + impl AsRef<[*$mut T]> for $name { + #[inline] + fn as_ref(&self) -> &[*$mut T] { + AsRef::<[*$mut T; $lanes]>::as_ref(self) + } + } + + impl AsMut<[*$mut T]> for $name { + #[inline] + fn as_mut(&mut self) -> &mut [*$mut T] { + AsMut::<[*$mut T; $lanes]>::as_mut(self) + } + } + + // splat + impl From<*$mut T> for $name { + #[inline] + fn from(value: *$mut T) -> Self { + Self::splat(value) + } + } + }; + { new $underlying:ty | $type:ty | $($var:ident)* } => { + /// Construct a vector by setting each lane to the given values. + #[allow(clippy::too_many_arguments)] + #[inline] + pub fn new($($var: $type),*) -> Self { + Self(<$underlying>::new($($var as isize),*), PhantomData) + } + }; + { debug $name:ident | $type:ty | $($index:tt)* } => { + impl core::fmt::Debug for $name { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_tuple(stringify!($name)) + $(.field(&(AsRef::<[isize]>::as_ref(&self.0)[$index] as $type)))* + .finish() + } + } + } +} + +define_pointer_vector! { #[doc = "Vector of two mutable pointers"] mptrx2 => isizex2 => 2, mut } +define_pointer_vector! { #[doc = "Vector of four mutable pointers"] mptrx4 => isizex4 => 4, mut } +define_pointer_vector! { #[doc = "Vector of eight mutable pointers"] mptrx8 => isizex8 => 8, mut } +define_pointer_vector! { #[doc = "Vector of two const pointers"] cptrx2 => isizex2 => 2, const } +define_pointer_vector! { #[doc = "Vector of four const pointers"] cptrx4 => isizex4 => 4, const } +define_pointer_vector! { #[doc = "Vector of eight const pointers"] cptrx8 => isizex8 => 8, const } diff --git a/crates/core_simd/src/vectors_i128.rs b/crates/core_simd/src/vectors_i128.rs index 939aeb8ce2e9..9eb0a12b8032 100644 --- a/crates/core_simd/src/vectors_i128.rs +++ b/crates/core_simd/src/vectors_i128.rs @@ -1,10 +1,12 @@ define_vector! { #[doc = "Vector of two `i128` values"] + #[derive(Eq, Ord, Hash)] struct i128x2([i128; 2]); } define_vector! { #[doc = "Vector of four `i128` values"] + #[derive(Eq, Ord, Hash)] struct i128x4([i128; 4]); } diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs index b9089a3b4edf..682ee214eb50 100644 --- a/crates/core_simd/src/vectors_i16.rs +++ b/crates/core_simd/src/vectors_i16.rs @@ -1,25 +1,30 @@ define_vector! { #[doc = "Vector of two `i16` values"] + #[derive(Eq, Ord, Hash)] struct i16x2([i16; 2]); } define_vector! { #[doc = "Vector of four `i16` values"] + #[derive(Eq, Ord, Hash)] struct i16x4([i16; 4]); } define_vector! { #[doc = "Vector of eight `i16` values"] + #[derive(Eq, Ord, Hash)] struct i16x8([i16; 8]); } define_vector! { #[doc = "Vector of 16 `i16` values"] + #[derive(Eq, Ord, Hash)] struct i16x16([i16; 16]); } define_vector! { #[doc = "Vector of 32 `i16` values"] + #[derive(Eq, Ord, Hash)] struct i16x32([i16; 32]); } diff --git a/crates/core_simd/src/vectors_i32.rs b/crates/core_simd/src/vectors_i32.rs index 686576baff18..d528fdbc2670 100644 --- a/crates/core_simd/src/vectors_i32.rs +++ b/crates/core_simd/src/vectors_i32.rs @@ -1,20 +1,24 @@ define_vector! { #[doc = "Vector of two `i32` values"] + #[derive(Eq, Ord, Hash)] struct i32x2([i32; 2]); } define_vector! { #[doc = "Vector of four `i32` values"] + #[derive(Eq, Ord, Hash)] struct i32x4([i32; 4]); } define_vector! { #[doc = "Vector of eight `i32` values"] + #[derive(Eq, Ord, Hash)] struct i32x8([i32; 8]); } define_vector! { #[doc = "Vector of 16 `i32` values"] + #[derive(Eq, Ord, Hash)] struct i32x16([i32; 16]); } diff --git a/crates/core_simd/src/vectors_i64.rs b/crates/core_simd/src/vectors_i64.rs index 0a34b4c9d7e8..09dd27d94e34 100644 --- a/crates/core_simd/src/vectors_i64.rs +++ b/crates/core_simd/src/vectors_i64.rs @@ -1,15 +1,18 @@ define_vector! { #[doc = "Vector of two `i64` values"] + #[derive(Eq, Ord, Hash)] struct i64x2([i64; 2]); } define_vector! { #[doc = "Vector of four `i64` values"] + #[derive(Eq, Ord, Hash)] struct i64x4([i64; 4]); } define_vector! { #[doc = "Vector of eight `i64` values"] + #[derive(Eq, Ord, Hash)] struct i64x8([i64; 8]); } diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs index 2deacfc1feb7..8c9407c0c52c 100644 --- a/crates/core_simd/src/vectors_i8.rs +++ b/crates/core_simd/src/vectors_i8.rs @@ -1,30 +1,36 @@ define_vector! { #[doc = "Vector of two `i8` values"] + #[derive(Eq, Ord, Hash)] struct i8x2([i8; 2]); } define_vector! { #[doc = "Vector of four `i8` values"] + #[derive(Eq, Ord, Hash)] struct i8x4([i8; 4]); } define_vector! { #[doc = "Vector of eight `i8` values"] + #[derive(Eq, Ord, Hash)] struct i8x8([i8; 8]); } define_vector! { #[doc = "Vector of 16 `i8` values"] + #[derive(Eq, Ord, Hash)] struct i8x16([i8; 16]); } define_vector! { #[doc = "Vector of 32 `i8` values"] + #[derive(Eq, Ord, Hash)] struct i8x32([i8; 32]); } define_vector! { #[doc = "Vector of 64 `i8` values"] + #[derive(Eq, Ord, Hash)] struct i8x64([i8; 64]); } diff --git a/crates/core_simd/src/vectors_isize.rs b/crates/core_simd/src/vectors_isize.rs index e709d1758704..4512d943d431 100644 --- a/crates/core_simd/src/vectors_isize.rs +++ b/crates/core_simd/src/vectors_isize.rs @@ -1,15 +1,18 @@ define_vector! { #[doc = "Vector of two `isize` values"] + #[derive(Eq, Ord, Hash)] struct isizex2([isize; 2]); } define_vector! { #[doc = "Vector of four `isize` values"] + #[derive(Eq, Ord, Hash)] struct isizex4([isize; 4]); } define_vector! { #[doc = "Vector of eight `isize` values"] + #[derive(Eq, Ord, Hash)] struct isizex8([isize; 8]); } diff --git a/crates/core_simd/src/vectors_u128.rs b/crates/core_simd/src/vectors_u128.rs index f98026275c73..8d7418abe4c3 100644 --- a/crates/core_simd/src/vectors_u128.rs +++ b/crates/core_simd/src/vectors_u128.rs @@ -1,10 +1,12 @@ define_vector! { #[doc = "Vector of two `u128` values"] + #[derive(Eq, Ord, Hash)] struct u128x2([u128; 2]); } define_vector! { #[doc = "Vector of four `u128` values"] + #[derive(Eq, Ord, Hash)] struct u128x4([u128; 4]); } diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs index e6ec15679f8c..6b4f3c553924 100644 --- a/crates/core_simd/src/vectors_u16.rs +++ b/crates/core_simd/src/vectors_u16.rs @@ -1,25 +1,30 @@ define_vector! { #[doc = "Vector of two `u16` values"] + #[derive(Eq, Ord, Hash)] struct u16x2([u16; 2]); } define_vector! { #[doc = "Vector of four `u16` values"] + #[derive(Eq, Ord, Hash)] struct u16x4([u16; 4]); } define_vector! { #[doc = "Vector of eight `u16` values"] + #[derive(Eq, Ord, Hash)] struct u16x8([u16; 8]); } define_vector! { #[doc = "Vector of 16 `u16` values"] + #[derive(Eq, Ord, Hash)] struct u16x16([u16; 16]); } define_vector! { #[doc = "Vector of 32 `u16` values"] + #[derive(Eq, Ord, Hash)] struct u16x32([u16; 32]); } diff --git a/crates/core_simd/src/vectors_u32.rs b/crates/core_simd/src/vectors_u32.rs index e347509fa54b..09aed52e6bb5 100644 --- a/crates/core_simd/src/vectors_u32.rs +++ b/crates/core_simd/src/vectors_u32.rs @@ -1,20 +1,24 @@ define_vector! { #[doc = "Vector of two `u32` values"] + #[derive(Eq, Ord, Hash)] struct u32x2([u32; 2]); } define_vector! { #[doc = "Vector of four `u32` values"] + #[derive(Eq, Ord, Hash)] struct u32x4([u32; 4]); } define_vector! { #[doc = "Vector of eight `u32` values"] + #[derive(Eq, Ord, Hash)] struct u32x8([u32; 8]); } define_vector! { #[doc = "Vector of 16 `u32` values"] + #[derive(Eq, Ord, Hash)] struct u32x16([u32; 16]); } diff --git a/crates/core_simd/src/vectors_u64.rs b/crates/core_simd/src/vectors_u64.rs index a3b786230975..b19739e6657d 100644 --- a/crates/core_simd/src/vectors_u64.rs +++ b/crates/core_simd/src/vectors_u64.rs @@ -1,15 +1,18 @@ define_vector! { #[doc = "Vector of two `u64` values"] + #[derive(Eq, Ord, Hash)] struct u64x2([u64; 2]); } define_vector! { #[doc = "Vector of four `u64` values"] + #[derive(Eq, Ord, Hash)] struct u64x4([u64; 4]); } define_vector! { #[doc = "Vector of eight `u64` values"] + #[derive(Eq, Ord, Hash)] struct u64x8([u64; 8]); } diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs index eac58dcc9634..1c31578d0a7e 100644 --- a/crates/core_simd/src/vectors_u8.rs +++ b/crates/core_simd/src/vectors_u8.rs @@ -1,30 +1,36 @@ define_vector! { #[doc = "Vector of two `u8` values"] + #[derive(Eq, Ord, Hash)] struct u8x2([u8; 2]); } define_vector! { #[doc = "Vector of four `u8` values"] + #[derive(Eq, Ord, Hash)] struct u8x4([u8; 4]); } define_vector! { #[doc = "Vector of eight `u8` values"] + #[derive(Eq, Ord, Hash)] struct u8x8([u8; 8]); } define_vector! { #[doc = "Vector of 16 `u8` values"] + #[derive(Eq, Ord, Hash)] struct u8x16([u8; 16]); } define_vector! { #[doc = "Vector of 32 `u8` values"] + #[derive(Eq, Ord, Hash)] struct u8x32([u8; 32]); } define_vector! { #[doc = "Vector of 64 `u8` values"] + #[derive(Eq, Ord, Hash)] struct u8x64([u8; 64]); } diff --git a/crates/core_simd/src/vectors_usize.rs b/crates/core_simd/src/vectors_usize.rs index dc97715f0c8d..30c4da8438b4 100644 --- a/crates/core_simd/src/vectors_usize.rs +++ b/crates/core_simd/src/vectors_usize.rs @@ -1,15 +1,18 @@ define_vector! { #[doc = "Vector of two `usize` values"] + #[derive(Eq, Ord, Hash)] struct usizex2([usize; 2]); } define_vector! { #[doc = "Vector of four `usize` values"] + #[derive(Eq, Ord, Hash)] struct usizex4([usize; 4]); } define_vector! { #[doc = "Vector of eight `usize` values"] + #[derive(Eq, Ord, Hash)] struct usizex8([usize; 8]); } From b7d1f3e797fbb12059203a640adce59f2a359dc4 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Fri, 25 Sep 2020 00:44:48 -0400 Subject: [PATCH 08/15] Improve Debug implementation, add additional formatting traits --- crates/core_simd/src/fmt.rs | 106 +++++++++++++++++++++++++++++++ crates/core_simd/src/lib.rs | 2 + crates/core_simd/src/macros.rs | 4 +- crates/core_simd/src/masks.rs | 8 ++- crates/core_simd/src/pointers.rs | 9 ++- 5 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 crates/core_simd/src/fmt.rs diff --git a/crates/core_simd/src/fmt.rs b/crates/core_simd/src/fmt.rs new file mode 100644 index 000000000000..62a21b442d26 --- /dev/null +++ b/crates/core_simd/src/fmt.rs @@ -0,0 +1,106 @@ +macro_rules! debug_wrapper { + { $($trait:ident => $name:ident,)* } => { + $( + pub(crate) fn $name(slice: &[T], f: &mut core::fmt::Formatter) -> core::fmt::Result { + #[repr(transparent)] + struct Wrapper<'a, T: core::fmt::$trait>(&'a T); + + impl core::fmt::Debug for Wrapper<'_, T> { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + self.0.fmt(f) + } + } + + f.debug_list() + .entries(slice.iter().map(|x| Wrapper(x))) + .finish() + } + )* + } +} + +debug_wrapper! { + Debug => format, + Binary => format_binary, + LowerExp => format_lower_exp, + UpperExp => format_upper_exp, + Octal => format_octal, + LowerHex => format_lower_hex, + UpperHex => format_upper_hex, + Pointer => format_pointer, +} + +macro_rules! impl_fmt_trait { + { $($type:ty => $(($trait:ident, $format:ident)),*;)* } => { + $( // repeat type + $( // repeat trait + impl core::fmt::$trait for $type { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + $format(self.as_ref(), f) + } + } + )* + )* + }; + { integers: $($type:ty,)* } => { + impl_fmt_trait! { + $($type => + (Debug, format), + (Binary, format_binary), + (LowerExp, format_lower_exp), + (UpperExp, format_upper_exp), + (Octal, format_octal), + (LowerHex, format_lower_hex), + (UpperHex, format_upper_hex); + )* + } + }; + { floats: $($type:ty,)* } => { + impl_fmt_trait! { + $($type => + (Debug, format), + (LowerExp, format_lower_exp), + (UpperExp, format_upper_exp); + )* + } + }; + { masks: $($type:ty,)* } => { + impl_fmt_trait! { + $($type => + (Debug, format); + )* + } + } +} + +impl_fmt_trait! { + integers: + crate::u8x2, crate::u8x4, crate::u8x8, crate::u8x16, crate::u8x32, crate::u8x64, + crate::i8x2, crate::i8x4, crate::i8x8, crate::i8x16, crate::i8x32, crate::i8x64, + crate::u16x2, crate::u16x4, crate::u16x8, crate::u16x16, crate::u16x32, + crate::i16x2, crate::i16x4, crate::i16x8, crate::i16x16, crate::i16x32, + crate::u32x2, crate::u32x4, crate::u32x8, crate::u32x16, + crate::i32x2, crate::i32x4, crate::i32x8, crate::i32x16, + crate::u64x2, crate::u64x4, crate::u64x8, + crate::i64x2, crate::i64x4, crate::i64x8, + crate::u128x2, crate::u128x4, + crate::i128x2, crate::i128x4, + crate::usizex2, crate::usizex4, crate::usizex8, + crate::isizex2, crate::isizex4, crate::isizex8, +} + +impl_fmt_trait! { + floats: + crate::f32x2, crate::f32x4, crate::f32x8, crate::f32x16, + crate::f64x2, crate::f64x4, crate::f64x8, +} + +impl_fmt_trait! { + masks: + crate::mask8x2, crate::mask8x4, crate::mask8x8, crate::mask8x16, crate::mask8x32, crate::mask8x64, + crate::mask16x2, crate::mask16x4, crate::mask16x8, crate::mask16x16, crate::mask16x32, + crate::mask32x2, crate::mask32x4, crate::mask32x8, crate::mask32x16, + crate::mask64x2, crate::mask64x4, crate::mask64x8, + crate::mask128x2, crate::mask128x4, + crate::masksizex2, crate::masksizex4, crate::masksizex8, +} diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index 34f2b90f7673..f6ddc4c6cfda 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -6,6 +6,8 @@ #[macro_use] mod macros; +mod fmt; + mod masks; pub use masks::*; diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 6b5599f0170d..33541899ca36 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -247,7 +247,7 @@ macro_rules! define_vector { { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { $(#[$attr])* #[allow(non_camel_case_types)] - #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)] + #[derive(Copy, Clone, Default, PartialEq, PartialOrd)] #[repr(simd)] pub struct $name($($itype),*); }; @@ -284,7 +284,7 @@ macro_rules! define_mask_vector { { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { $(#[$attr])* #[allow(non_camel_case_types)] - #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd, Eq, Ord)] + #[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord)] #[repr(simd)] pub struct $name($($itype),*); }; diff --git a/crates/core_simd/src/masks.rs b/crates/core_simd/src/masks.rs index 970047aabdef..ceefbfc94447 100644 --- a/crates/core_simd/src/masks.rs +++ b/crates/core_simd/src/masks.rs @@ -2,7 +2,7 @@ macro_rules! define_mask { { $(#[$attr:meta])* struct $name:ident($type:ty); } => { $(#[$attr])* #[allow(non_camel_case_types)] - #[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd, Eq, Ord, Hash)] + #[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)] #[repr(transparent)] pub struct $name(pub(crate) $type); @@ -33,6 +33,12 @@ macro_rules! define_mask { mask.test() } } + + impl core::fmt::Debug for $name { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + self.test().fmt(f) + } + } } } diff --git a/crates/core_simd/src/pointers.rs b/crates/core_simd/src/pointers.rs index ecd78fb0cb17..a7c514aae7a3 100644 --- a/crates/core_simd/src/pointers.rs +++ b/crates/core_simd/src/pointers.rs @@ -100,9 +100,12 @@ macro_rules! define_pointer_vector { { debug $name:ident | $type:ty | $($index:tt)* } => { impl core::fmt::Debug for $name { fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - f.debug_tuple(stringify!($name)) - $(.field(&(AsRef::<[isize]>::as_ref(&self.0)[$index] as $type)))* - .finish() + crate::fmt::format(self.as_ref(), f) + } + } + impl core::fmt::Pointer for $name { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + crate::fmt::format_pointer(self.as_ref(), f) } } } From 2178409df574aa83c5e9e6e7bff62b66c32acf63 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Fri, 25 Sep 2020 00:52:32 -0400 Subject: [PATCH 09/15] Remove some obsolete macros --- crates/core_simd/src/macros.rs | 51 -------------------------------- crates/core_simd/src/pointers.rs | 25 +++++++--------- 2 files changed, 11 insertions(+), 65 deletions(-) diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 33541899ca36..591a85af08f1 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -135,57 +135,6 @@ macro_rules! call_counting_args { }; } -/// Calls the macro `$mac` with the specified `$args` followed by counting values from 0 to the -/// specified value. -macro_rules! call_counting_values { - { 1 => $mac:path => $($args:tt)* } => { - $mac! { - $($args)* - 0 - } - }; - { 2 => $mac:path => $($args:tt)* } => { - $mac! { - $($args)* - 0 1 - } - }; - { 4 => $mac:path => $($args:tt)* } => { - $mac! { - $($args)* - 0 1 2 3 - } - }; - { 8 => $mac:path => $($args:tt)* } => { - $mac! { - $($args)* - 0 1 2 3 4 5 6 7 - } - }; - { 16 => $mac:path => $($args:tt)* } => { - $mac! { - $($args)* - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - } - }; - { 32 => $mac:path => $($args:tt)* } => { - $mac! { - $($args)* - 0 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 - } - }; - { 64 => $mac:path => $($args:tt)* } => { - $mac! { - $($args)* - 0 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 36 37 38 39 40 41 42 43 44 45 46 47 - 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 - } - }; -} - /// Implements common traits on the specified vector `$name`, holding multiple `$lanes` of `$type`. macro_rules! base_vector_traits { { $name:path => [$type:ty; $lanes:literal] } => { diff --git a/crates/core_simd/src/pointers.rs b/crates/core_simd/src/pointers.rs index a7c514aae7a3..4c20eab99209 100644 --- a/crates/core_simd/src/pointers.rs +++ b/crates/core_simd/src/pointers.rs @@ -9,6 +9,17 @@ macro_rules! define_pointer_vector { #[repr(C)] pub struct $name($underlying, PhantomData); + impl core::fmt::Debug for $name { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + crate::fmt::format(self.as_ref(), f) + } + } + impl core::fmt::Pointer for $name { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + crate::fmt::format_pointer(self.as_ref(), f) + } + } + impl Copy for $name {} impl Clone for $name { @@ -40,8 +51,6 @@ macro_rules! define_pointer_vector { } } - call_counting_values! { $lanes => define_pointer_vector => debug $name | *$mut T | } - impl $name { /// Construct a vector by setting all lanes to the given value. #[inline] @@ -97,18 +106,6 @@ macro_rules! define_pointer_vector { Self(<$underlying>::new($($var as isize),*), PhantomData) } }; - { debug $name:ident | $type:ty | $($index:tt)* } => { - impl core::fmt::Debug for $name { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - crate::fmt::format(self.as_ref(), f) - } - } - impl core::fmt::Pointer for $name { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - crate::fmt::format_pointer(self.as_ref(), f) - } - } - } } define_pointer_vector! { #[doc = "Vector of two mutable pointers"] mptrx2 => isizex2 => 2, mut } From 992768709f555f716f6869646937d236111a40dd Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Fri, 25 Sep 2020 21:45:09 -0400 Subject: [PATCH 10/15] Remove pointer vectors --- crates/core_simd/src/fmt.rs | 1 - crates/core_simd/src/lib.rs | 3 - crates/core_simd/src/pointers.rs | 116 ------------------------------- 3 files changed, 120 deletions(-) delete mode 100644 crates/core_simd/src/pointers.rs diff --git a/crates/core_simd/src/fmt.rs b/crates/core_simd/src/fmt.rs index 62a21b442d26..e505947e1e65 100644 --- a/crates/core_simd/src/fmt.rs +++ b/crates/core_simd/src/fmt.rs @@ -27,7 +27,6 @@ debug_wrapper! { Octal => format_octal, LowerHex => format_lower_hex, UpperHex => format_upper_hex, - Pointer => format_pointer, } macro_rules! impl_fmt_trait { diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index f6ddc4c6cfda..d88f5b1eac45 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -11,9 +11,6 @@ mod fmt; mod masks; pub use masks::*; -mod pointers; -pub use pointers::*; - mod vectors_u8; pub use vectors_u8::*; mod vectors_u16; diff --git a/crates/core_simd/src/pointers.rs b/crates/core_simd/src/pointers.rs deleted file mode 100644 index 4c20eab99209..000000000000 --- a/crates/core_simd/src/pointers.rs +++ /dev/null @@ -1,116 +0,0 @@ -use core::marker::PhantomData; - -use crate::vectors_isize::*; - -macro_rules! define_pointer_vector { - { $(#[$attr:meta])* $name:ident => $underlying:ty => $lanes:tt, $mut:ident } => { - $(#[$attr])* - #[allow(non_camel_case_types)] - #[repr(C)] - pub struct $name($underlying, PhantomData); - - impl core::fmt::Debug for $name { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - crate::fmt::format(self.as_ref(), f) - } - } - impl core::fmt::Pointer for $name { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - crate::fmt::format_pointer(self.as_ref(), f) - } - } - - impl Copy for $name {} - - impl Clone for $name { - #[inline] - fn clone(&self) -> Self { - *self - } - } - - impl core::cmp::PartialEq for $name { - #[inline] - fn eq(&self, other: &Self) -> bool { - self.0.eq(&other.0) - } - } - - impl core::cmp::Eq for $name {} - - impl core::cmp::PartialOrd for $name { - #[inline] - fn partial_cmp(&self, other: &Self) -> Option { - self.0.partial_cmp(&other.0) - } - } - - impl core::cmp::Ord for $name { - fn cmp(&self, other: &Self) -> core::cmp::Ordering { - self.0.cmp(&other.0) - } - } - - impl $name { - /// Construct a vector by setting all lanes to the given value. - #[inline] - pub fn splat(value: *$mut T) -> Self { - Self(<$underlying>::splat(value as isize), PhantomData) - } - call_counting_args! { $lanes => define_pointer_vector => new $underlying | *$mut T | } - } - - // array references - impl AsRef<[*$mut T; $lanes]> for $name { - #[inline] - fn as_ref(&self) -> &[*$mut T; $lanes] { - unsafe { &*(self as *const _ as *const _) } - } - } - - impl AsMut<[*$mut T; $lanes]> for $name { - #[inline] - fn as_mut(&mut self) -> &mut [*$mut T; $lanes] { - unsafe { &mut *(self as *mut _ as *mut _) } - } - } - - // slice references - impl AsRef<[*$mut T]> for $name { - #[inline] - fn as_ref(&self) -> &[*$mut T] { - AsRef::<[*$mut T; $lanes]>::as_ref(self) - } - } - - impl AsMut<[*$mut T]> for $name { - #[inline] - fn as_mut(&mut self) -> &mut [*$mut T] { - AsMut::<[*$mut T; $lanes]>::as_mut(self) - } - } - - // splat - impl From<*$mut T> for $name { - #[inline] - fn from(value: *$mut T) -> Self { - Self::splat(value) - } - } - }; - { new $underlying:ty | $type:ty | $($var:ident)* } => { - /// Construct a vector by setting each lane to the given values. - #[allow(clippy::too_many_arguments)] - #[inline] - pub fn new($($var: $type),*) -> Self { - Self(<$underlying>::new($($var as isize),*), PhantomData) - } - }; -} - -define_pointer_vector! { #[doc = "Vector of two mutable pointers"] mptrx2 => isizex2 => 2, mut } -define_pointer_vector! { #[doc = "Vector of four mutable pointers"] mptrx4 => isizex4 => 4, mut } -define_pointer_vector! { #[doc = "Vector of eight mutable pointers"] mptrx8 => isizex8 => 8, mut } -define_pointer_vector! { #[doc = "Vector of two const pointers"] cptrx2 => isizex2 => 2, const } -define_pointer_vector! { #[doc = "Vector of four const pointers"] cptrx4 => isizex4 => 4, const } -define_pointer_vector! { #[doc = "Vector of eight const pointers"] cptrx8 => isizex8 => 8, const } From 167c3c8100bfbe704ecf3743cda2141c6cb6d15a Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Fri, 25 Sep 2020 23:23:02 -0400 Subject: [PATCH 11/15] Change doc attributes to comments --- crates/core_simd/src/masks.rs | 12 ++++++------ crates/core_simd/src/vectors_f32.rs | 8 ++++---- crates/core_simd/src/vectors_f64.rs | 6 +++--- crates/core_simd/src/vectors_i128.rs | 4 ++-- crates/core_simd/src/vectors_i16.rs | 10 +++++----- crates/core_simd/src/vectors_i32.rs | 8 ++++---- crates/core_simd/src/vectors_i64.rs | 6 +++--- crates/core_simd/src/vectors_i8.rs | 12 ++++++------ crates/core_simd/src/vectors_isize.rs | 6 +++--- crates/core_simd/src/vectors_mask128.rs | 4 ++-- crates/core_simd/src/vectors_mask16.rs | 10 +++++----- crates/core_simd/src/vectors_mask32.rs | 8 ++++---- crates/core_simd/src/vectors_mask64.rs | 6 +++--- crates/core_simd/src/vectors_mask8.rs | 12 ++++++------ crates/core_simd/src/vectors_masksize.rs | 6 +++--- crates/core_simd/src/vectors_u128.rs | 4 ++-- crates/core_simd/src/vectors_u16.rs | 10 +++++----- crates/core_simd/src/vectors_u32.rs | 8 ++++---- crates/core_simd/src/vectors_u64.rs | 6 +++--- crates/core_simd/src/vectors_u8.rs | 12 ++++++------ crates/core_simd/src/vectors_usize.rs | 6 +++--- 21 files changed, 82 insertions(+), 82 deletions(-) diff --git a/crates/core_simd/src/masks.rs b/crates/core_simd/src/masks.rs index ceefbfc94447..1fc281a310d3 100644 --- a/crates/core_simd/src/masks.rs +++ b/crates/core_simd/src/masks.rs @@ -43,31 +43,31 @@ macro_rules! define_mask { } define_mask! { - #[doc = "8-bit mask"] + /// 8-bit mask struct mask8(i8); } define_mask! { - #[doc = "16-bit mask"] + /// 16-bit mask struct mask16(i16); } define_mask! { - #[doc = "32-bit mask"] + /// 32-bit mask struct mask32(i32); } define_mask! { - #[doc = "64-bit mask"] + /// 64-bit mask struct mask64(i64); } define_mask! { - #[doc = "128-bit mask"] + /// 128-bit mask struct mask128(i128); } define_mask! { - #[doc = "`isize`-wide mask"] + /// `isize`-wide mask struct masksize(isize); } diff --git a/crates/core_simd/src/vectors_f32.rs b/crates/core_simd/src/vectors_f32.rs index c2987a7f6314..9fcbd9d53f0f 100644 --- a/crates/core_simd/src/vectors_f32.rs +++ b/crates/core_simd/src/vectors_f32.rs @@ -1,20 +1,20 @@ define_vector! { - #[doc = "Vector of two `f32` values"] + /// Vector of two `f32` values struct f32x2([f32; 2]); } define_vector! { - #[doc = "Vector of four `f32` values"] + /// Vector of four `f32` values struct f32x4([f32; 4]); } define_vector! { - #[doc = "Vector of eight `f32` values"] + /// Vector of eight `f32` values struct f32x8([f32; 8]); } define_vector! { - #[doc = "Vector of 16 `f32` values"] + /// Vector of 16 `f32` values struct f32x16([f32; 16]); } diff --git a/crates/core_simd/src/vectors_f64.rs b/crates/core_simd/src/vectors_f64.rs index 4881df2b6dac..d741aabe88e0 100644 --- a/crates/core_simd/src/vectors_f64.rs +++ b/crates/core_simd/src/vectors_f64.rs @@ -1,15 +1,15 @@ define_vector! { - #[doc = "Vector of two `f64` values"] + /// Vector of two `f64` values struct f64x2([f64; 2]); } define_vector! { - #[doc = "Vector of four `f64` values"] + /// Vector of four `f64` values struct f64x4([f64; 4]); } define_vector! { - #[doc = "Vector of eight `f64` values"] + /// Vector of eight `f64` values struct f64x8([f64; 8]); } diff --git a/crates/core_simd/src/vectors_i128.rs b/crates/core_simd/src/vectors_i128.rs index 9eb0a12b8032..588f4cffb909 100644 --- a/crates/core_simd/src/vectors_i128.rs +++ b/crates/core_simd/src/vectors_i128.rs @@ -1,11 +1,11 @@ define_vector! { - #[doc = "Vector of two `i128` values"] + /// Vector of two `i128` values #[derive(Eq, Ord, Hash)] struct i128x2([i128; 2]); } define_vector! { - #[doc = "Vector of four `i128` values"] + /// Vector of four `i128` values #[derive(Eq, Ord, Hash)] struct i128x4([i128; 4]); } diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs index 682ee214eb50..52d9ef8379b0 100644 --- a/crates/core_simd/src/vectors_i16.rs +++ b/crates/core_simd/src/vectors_i16.rs @@ -1,29 +1,29 @@ define_vector! { - #[doc = "Vector of two `i16` values"] + /// Vector of two `i16` values #[derive(Eq, Ord, Hash)] struct i16x2([i16; 2]); } define_vector! { - #[doc = "Vector of four `i16` values"] + /// Vector of four `i16` values #[derive(Eq, Ord, Hash)] struct i16x4([i16; 4]); } define_vector! { - #[doc = "Vector of eight `i16` values"] + /// Vector of eight `i16` values #[derive(Eq, Ord, Hash)] struct i16x8([i16; 8]); } define_vector! { - #[doc = "Vector of 16 `i16` values"] + /// Vector of 16 `i16` values #[derive(Eq, Ord, Hash)] struct i16x16([i16; 16]); } define_vector! { - #[doc = "Vector of 32 `i16` values"] + /// Vector of 32 `i16` values #[derive(Eq, Ord, Hash)] struct i16x32([i16; 32]); } diff --git a/crates/core_simd/src/vectors_i32.rs b/crates/core_simd/src/vectors_i32.rs index d528fdbc2670..34ecc1694604 100644 --- a/crates/core_simd/src/vectors_i32.rs +++ b/crates/core_simd/src/vectors_i32.rs @@ -1,23 +1,23 @@ define_vector! { - #[doc = "Vector of two `i32` values"] + /// Vector of two `i32` values #[derive(Eq, Ord, Hash)] struct i32x2([i32; 2]); } define_vector! { - #[doc = "Vector of four `i32` values"] + /// Vector of four `i32` values #[derive(Eq, Ord, Hash)] struct i32x4([i32; 4]); } define_vector! { - #[doc = "Vector of eight `i32` values"] + /// Vector of eight `i32` values #[derive(Eq, Ord, Hash)] struct i32x8([i32; 8]); } define_vector! { - #[doc = "Vector of 16 `i32` values"] + /// Vector of 16 `i32` values #[derive(Eq, Ord, Hash)] struct i32x16([i32; 16]); } diff --git a/crates/core_simd/src/vectors_i64.rs b/crates/core_simd/src/vectors_i64.rs index 09dd27d94e34..58893c0dfedc 100644 --- a/crates/core_simd/src/vectors_i64.rs +++ b/crates/core_simd/src/vectors_i64.rs @@ -1,17 +1,17 @@ define_vector! { - #[doc = "Vector of two `i64` values"] + /// Vector of two `i64` values #[derive(Eq, Ord, Hash)] struct i64x2([i64; 2]); } define_vector! { - #[doc = "Vector of four `i64` values"] + /// Vector of four `i64` values #[derive(Eq, Ord, Hash)] struct i64x4([i64; 4]); } define_vector! { - #[doc = "Vector of eight `i64` values"] + /// Vector of eight `i64` values #[derive(Eq, Ord, Hash)] struct i64x8([i64; 8]); } diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs index 8c9407c0c52c..c0551fc285e4 100644 --- a/crates/core_simd/src/vectors_i8.rs +++ b/crates/core_simd/src/vectors_i8.rs @@ -1,35 +1,35 @@ define_vector! { - #[doc = "Vector of two `i8` values"] + /// Vector of two `i8` values #[derive(Eq, Ord, Hash)] struct i8x2([i8; 2]); } define_vector! { - #[doc = "Vector of four `i8` values"] + /// Vector of four `i8` values #[derive(Eq, Ord, Hash)] struct i8x4([i8; 4]); } define_vector! { - #[doc = "Vector of eight `i8` values"] + /// Vector of eight `i8` values #[derive(Eq, Ord, Hash)] struct i8x8([i8; 8]); } define_vector! { - #[doc = "Vector of 16 `i8` values"] + /// Vector of 16 `i8` values #[derive(Eq, Ord, Hash)] struct i8x16([i8; 16]); } define_vector! { - #[doc = "Vector of 32 `i8` values"] + /// Vector of 32 `i8` values #[derive(Eq, Ord, Hash)] struct i8x32([i8; 32]); } define_vector! { - #[doc = "Vector of 64 `i8` values"] + /// Vector of 64 `i8` values #[derive(Eq, Ord, Hash)] struct i8x64([i8; 64]); } diff --git a/crates/core_simd/src/vectors_isize.rs b/crates/core_simd/src/vectors_isize.rs index 4512d943d431..10a892bd0908 100644 --- a/crates/core_simd/src/vectors_isize.rs +++ b/crates/core_simd/src/vectors_isize.rs @@ -1,17 +1,17 @@ define_vector! { - #[doc = "Vector of two `isize` values"] + /// Vector of two `isize` values #[derive(Eq, Ord, Hash)] struct isizex2([isize; 2]); } define_vector! { - #[doc = "Vector of four `isize` values"] + /// Vector of four `isize` values #[derive(Eq, Ord, Hash)] struct isizex4([isize; 4]); } define_vector! { - #[doc = "Vector of eight `isize` values"] + /// Vector of eight `isize` values #[derive(Eq, Ord, Hash)] struct isizex8([isize; 8]); } diff --git a/crates/core_simd/src/vectors_mask128.rs b/crates/core_simd/src/vectors_mask128.rs index 3b1bacb7ad3c..adf56a3684b3 100644 --- a/crates/core_simd/src/vectors_mask128.rs +++ b/crates/core_simd/src/vectors_mask128.rs @@ -1,11 +1,11 @@ use crate::mask128; define_mask_vector! { - #[doc = "vector of two `mask128` values"] + /// Vector of two `mask128` values struct mask128x2([i128 as mask128; 2]); } define_mask_vector! { - #[doc = "vector of four `mask128` values"] + /// Vector of four `mask128` values struct mask128x4([i128 as mask128; 4]); } diff --git a/crates/core_simd/src/vectors_mask16.rs b/crates/core_simd/src/vectors_mask16.rs index 8d076636caac..8cbae6b7bbd2 100644 --- a/crates/core_simd/src/vectors_mask16.rs +++ b/crates/core_simd/src/vectors_mask16.rs @@ -1,26 +1,26 @@ use crate::mask16; define_mask_vector! { - #[doc = "vector of two `mask16` values"] + /// Vector of two `mask16` values struct mask16x2([i16 as mask16; 2]); } define_mask_vector! { - #[doc = "vector of four `mask16` values"] + /// Vector of four `mask16` values struct mask16x4([i16 as mask16; 4]); } define_mask_vector! { - #[doc = "vector of eight `mask16` values"] + /// Vector of eight `mask16` values struct mask16x8([i16 as mask16; 8]); } define_mask_vector! { - #[doc = "vector of 16 `mask16` values"] + /// Vector of 16 `mask16` values struct mask16x16([i16 as mask16; 16]); } define_mask_vector! { - #[doc = "vector of 32 `mask16` values"] + /// Vector of 32 `mask16` values struct mask16x32([i16 as mask16; 32]); } diff --git a/crates/core_simd/src/vectors_mask32.rs b/crates/core_simd/src/vectors_mask32.rs index 64044bc4f578..fad191421f38 100644 --- a/crates/core_simd/src/vectors_mask32.rs +++ b/crates/core_simd/src/vectors_mask32.rs @@ -1,21 +1,21 @@ use crate::mask32; define_mask_vector! { - #[doc = "vector of two `mask32` values"] + /// Vector of two `mask32` values struct mask32x2([i32 as mask32; 2]); } define_mask_vector! { - #[doc = "vector of four `mask32` values"] + /// Vector of four `mask32` values struct mask32x4([i32 as mask32; 4]); } define_mask_vector! { - #[doc = "vector of eight `mask32` values"] + /// Vector of eight `mask32` values struct mask32x8([i32 as mask32; 8]); } define_mask_vector! { - #[doc = "vector of 16 `mask32` values"] + /// Vector of 16 `mask32` values struct mask32x16([i32 as mask32; 16]); } diff --git a/crates/core_simd/src/vectors_mask64.rs b/crates/core_simd/src/vectors_mask64.rs index b0c62b225c9b..554e731ccf24 100644 --- a/crates/core_simd/src/vectors_mask64.rs +++ b/crates/core_simd/src/vectors_mask64.rs @@ -1,16 +1,16 @@ use crate::mask64; define_mask_vector! { - #[doc = "vector of two `mask64` values"] + /// Vector of two `mask64` values struct mask64x2([i64 as mask64; 2]); } define_mask_vector! { - #[doc = "vector of four `mask64` values"] + /// Vector of four `mask64` values struct mask64x4([i64 as mask64; 4]); } define_mask_vector! { - #[doc = "vector of eight `mask64` values"] + /// Vector of eight `mask64` values struct mask64x8([i64 as mask64; 8]); } diff --git a/crates/core_simd/src/vectors_mask8.rs b/crates/core_simd/src/vectors_mask8.rs index c8f3cbac3c91..b6fbe5595189 100644 --- a/crates/core_simd/src/vectors_mask8.rs +++ b/crates/core_simd/src/vectors_mask8.rs @@ -1,31 +1,31 @@ use crate::mask8; define_mask_vector! { - #[doc = "vector of two `mask8` values"] + /// Vector of two `mask8` values struct mask8x2([i8 as mask8; 2]); } define_mask_vector! { - #[doc = "vector of four `mask8` values"] + /// Vector of four `mask8` values struct mask8x4([i8 as mask8; 4]); } define_mask_vector! { - #[doc = "vector of eight `mask8` values"] + /// Vector of eight `mask8` values struct mask8x8([i8 as mask8; 8]); } define_mask_vector! { - #[doc = "vector of 16 `mask8` values"] + /// Vector of 16 `mask8` values struct mask8x16([i8 as mask8; 16]); } define_mask_vector! { - #[doc = "vector of 32 `mask8` values"] + /// Vector of 32 `mask8` values struct mask8x32([i8 as mask8; 32]); } define_mask_vector! { - #[doc = "vector of 64 `mask8` values"] + /// Vector of 64 `mask8` values struct mask8x64([i8 as mask8; 64]); } diff --git a/crates/core_simd/src/vectors_masksize.rs b/crates/core_simd/src/vectors_masksize.rs index 1bf911caffc6..a838aee51985 100644 --- a/crates/core_simd/src/vectors_masksize.rs +++ b/crates/core_simd/src/vectors_masksize.rs @@ -1,16 +1,16 @@ use crate::masksize; define_mask_vector! { - #[doc = "vector of two `masksize` values"] + /// Vector of two `masksize` values struct masksizex2([isize as masksize; 2]); } define_mask_vector! { - #[doc = "vector of four `masksize` values"] + /// Vector of four `masksize` values struct masksizex4([isize as masksize; 4]); } define_mask_vector! { - #[doc = "vector of eight `masksize` values"] + /// Vector of eight `masksize` values struct masksizex8([isize as masksize; 8]); } diff --git a/crates/core_simd/src/vectors_u128.rs b/crates/core_simd/src/vectors_u128.rs index 8d7418abe4c3..1412dfdc85dc 100644 --- a/crates/core_simd/src/vectors_u128.rs +++ b/crates/core_simd/src/vectors_u128.rs @@ -1,11 +1,11 @@ define_vector! { - #[doc = "Vector of two `u128` values"] + /// Vector of two `u128` values #[derive(Eq, Ord, Hash)] struct u128x2([u128; 2]); } define_vector! { - #[doc = "Vector of four `u128` values"] + /// Vector of four `u128` values #[derive(Eq, Ord, Hash)] struct u128x4([u128; 4]); } diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs index 6b4f3c553924..6fd7c64f4b31 100644 --- a/crates/core_simd/src/vectors_u16.rs +++ b/crates/core_simd/src/vectors_u16.rs @@ -1,29 +1,29 @@ define_vector! { - #[doc = "Vector of two `u16` values"] + /// Vector of two `u16` values #[derive(Eq, Ord, Hash)] struct u16x2([u16; 2]); } define_vector! { - #[doc = "Vector of four `u16` values"] + /// Vector of four `u16` values #[derive(Eq, Ord, Hash)] struct u16x4([u16; 4]); } define_vector! { - #[doc = "Vector of eight `u16` values"] + /// Vector of eight `u16` values #[derive(Eq, Ord, Hash)] struct u16x8([u16; 8]); } define_vector! { - #[doc = "Vector of 16 `u16` values"] + /// Vector of 16 `u16` values #[derive(Eq, Ord, Hash)] struct u16x16([u16; 16]); } define_vector! { - #[doc = "Vector of 32 `u16` values"] + /// Vector of 32 `u16` values #[derive(Eq, Ord, Hash)] struct u16x32([u16; 32]); } diff --git a/crates/core_simd/src/vectors_u32.rs b/crates/core_simd/src/vectors_u32.rs index 09aed52e6bb5..d4e1fd439ff3 100644 --- a/crates/core_simd/src/vectors_u32.rs +++ b/crates/core_simd/src/vectors_u32.rs @@ -1,23 +1,23 @@ define_vector! { - #[doc = "Vector of two `u32` values"] + /// Vector of two `u32` values #[derive(Eq, Ord, Hash)] struct u32x2([u32; 2]); } define_vector! { - #[doc = "Vector of four `u32` values"] + /// Vector of four `u32` values #[derive(Eq, Ord, Hash)] struct u32x4([u32; 4]); } define_vector! { - #[doc = "Vector of eight `u32` values"] + /// Vector of eight `u32` values #[derive(Eq, Ord, Hash)] struct u32x8([u32; 8]); } define_vector! { - #[doc = "Vector of 16 `u32` values"] + /// Vector of 16 `u32` values #[derive(Eq, Ord, Hash)] struct u32x16([u32; 16]); } diff --git a/crates/core_simd/src/vectors_u64.rs b/crates/core_simd/src/vectors_u64.rs index b19739e6657d..6a2b0ef76309 100644 --- a/crates/core_simd/src/vectors_u64.rs +++ b/crates/core_simd/src/vectors_u64.rs @@ -1,17 +1,17 @@ define_vector! { - #[doc = "Vector of two `u64` values"] + /// Vector of two `u64` values #[derive(Eq, Ord, Hash)] struct u64x2([u64; 2]); } define_vector! { - #[doc = "Vector of four `u64` values"] + /// Vector of four `u64` values #[derive(Eq, Ord, Hash)] struct u64x4([u64; 4]); } define_vector! { - #[doc = "Vector of eight `u64` values"] + /// Vector of eight `u64` values #[derive(Eq, Ord, Hash)] struct u64x8([u64; 8]); } diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs index 1c31578d0a7e..487a25e2d66e 100644 --- a/crates/core_simd/src/vectors_u8.rs +++ b/crates/core_simd/src/vectors_u8.rs @@ -1,35 +1,35 @@ define_vector! { - #[doc = "Vector of two `u8` values"] + /// Vector of two `u8` values #[derive(Eq, Ord, Hash)] struct u8x2([u8; 2]); } define_vector! { - #[doc = "Vector of four `u8` values"] + /// Vector of four `u8` values #[derive(Eq, Ord, Hash)] struct u8x4([u8; 4]); } define_vector! { - #[doc = "Vector of eight `u8` values"] + /// Vector of eight `u8` values #[derive(Eq, Ord, Hash)] struct u8x8([u8; 8]); } define_vector! { - #[doc = "Vector of 16 `u8` values"] + /// Vector of 16 `u8` values #[derive(Eq, Ord, Hash)] struct u8x16([u8; 16]); } define_vector! { - #[doc = "Vector of 32 `u8` values"] + /// Vector of 32 `u8` values #[derive(Eq, Ord, Hash)] struct u8x32([u8; 32]); } define_vector! { - #[doc = "Vector of 64 `u8` values"] + /// Vector of 64 `u8` values #[derive(Eq, Ord, Hash)] struct u8x64([u8; 64]); } diff --git a/crates/core_simd/src/vectors_usize.rs b/crates/core_simd/src/vectors_usize.rs index 30c4da8438b4..2318d63a0014 100644 --- a/crates/core_simd/src/vectors_usize.rs +++ b/crates/core_simd/src/vectors_usize.rs @@ -1,17 +1,17 @@ define_vector! { - #[doc = "Vector of two `usize` values"] + /// Vector of two `usize` values #[derive(Eq, Ord, Hash)] struct usizex2([usize; 2]); } define_vector! { - #[doc = "Vector of four `usize` values"] + /// Vector of four `usize` values #[derive(Eq, Ord, Hash)] struct usizex4([usize; 4]); } define_vector! { - #[doc = "Vector of eight `usize` values"] + /// Vector of eight `usize` values #[derive(Eq, Ord, Hash)] struct usizex8([usize; 8]); } From d817b56f1d7d485e7a2e466730adf2a618e3b077 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Sat, 26 Sep 2020 14:12:30 -0400 Subject: [PATCH 12/15] Manually implement some traits, instead of derive --- crates/core_simd/src/macros.rs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 591a85af08f1..ecf2b76ceb0d 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -138,6 +138,32 @@ macro_rules! call_counting_args { /// Implements common traits on the specified vector `$name`, holding multiple `$lanes` of `$type`. macro_rules! base_vector_traits { { $name:path => [$type:ty; $lanes:literal] } => { + impl Copy for $name {} + + impl Clone for $name { + fn clone(&self) -> Self { + *self + } + } + + impl Default for $name { + fn default() -> Self { + Self::splat(<$type>::default()) + } + } + + impl PartialEq for $name { + fn eq(&self, other: &Self) -> bool { + AsRef::<[$type]>::as_ref(self) == AsRef::<[$type]>::as_ref(other) + } + } + + impl PartialOrd for $name { + fn partial_cmp(&self, other: &Self) -> Option { + AsRef::<[$type]>::as_ref(self).partial_cmp(AsRef::<[$type]>::as_ref(other)) + } + } + // array references impl AsRef<[$type; $lanes]> for $name { #[inline] @@ -196,7 +222,6 @@ macro_rules! define_vector { { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { $(#[$attr])* #[allow(non_camel_case_types)] - #[derive(Copy, Clone, Default, PartialEq, PartialOrd)] #[repr(simd)] pub struct $name($($itype),*); }; @@ -233,7 +258,7 @@ macro_rules! define_mask_vector { { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { $(#[$attr])* #[allow(non_camel_case_types)] - #[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord)] + #[derive(Eq, Ord)] #[repr(simd)] pub struct $name($($itype),*); }; From b9bf9ef3c2dab2d38f964f13154e517515e8e2f3 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Sat, 26 Sep 2020 14:30:00 -0400 Subject: [PATCH 13/15] Remove remaining derived traits --- crates/core_simd/src/macros.rs | 36 ++++++++++++++++++++++++++- crates/core_simd/src/vectors_i128.rs | 6 ++--- crates/core_simd/src/vectors_i16.rs | 15 ++++------- crates/core_simd/src/vectors_i32.rs | 12 +++------ crates/core_simd/src/vectors_i64.rs | 9 +++---- crates/core_simd/src/vectors_i8.rs | 18 +++++--------- crates/core_simd/src/vectors_isize.rs | 9 +++---- crates/core_simd/src/vectors_u128.rs | 6 ++--- crates/core_simd/src/vectors_u16.rs | 15 ++++------- crates/core_simd/src/vectors_u32.rs | 12 +++------ crates/core_simd/src/vectors_u64.rs | 9 +++---- crates/core_simd/src/vectors_u8.rs | 18 +++++--------- crates/core_simd/src/vectors_usize.rs | 9 +++---- 13 files changed, 81 insertions(+), 93 deletions(-) diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index ecf2b76ceb0d..165029cca5e9 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -207,6 +207,28 @@ macro_rules! base_vector_traits { } } +/// Implements additional integer traits (Eq, Ord, Hash) on the specified vector `$name`, holding multiple `$lanes` of `$type`. +macro_rules! integer_vector_traits { + { $name:path => [$type:ty; $lanes:literal] } => { + impl Eq for $name {} + + impl Ord for $name { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { + AsRef::<[$type]>::as_ref(self).cmp(AsRef::<[$type]>::as_ref(other)) + } + } + + impl core::hash::Hash for $name { + fn hash(&self, state: &mut H) + where + H: core::hash::Hasher + { + AsRef::<[$type]>::as_ref(self).hash(state) + } + } + } +} + /// Defines a vector `$name` containing multiple `$lanes` of `$type`. macro_rules! define_vector { { $(#[$attr:meta])* struct $name:ident([$type:ty; $lanes:tt]); } => { @@ -242,6 +264,18 @@ macro_rules! define_vector { } } +/// Defines an integer vector `$name` containing multiple `$lanes` of integer `$type`. +macro_rules! define_integer_vector { + { $(#[$attr:meta])* struct $name:ident([$type:ty; $lanes:tt]); } => { + define_vector! { + $(#[$attr])* + struct $name([$type; $lanes]); + } + + integer_vector_traits! { $name => [$type; $lanes] } + } +} + /// Defines a mask vector `$name` containing multiple `$lanes` of `$type`, represented by the /// underlying type `$impl_type`. macro_rules! define_mask_vector { @@ -254,11 +288,11 @@ macro_rules! define_mask_vector { } base_vector_traits! { $name => [$type; $lanes] } + integer_vector_traits! { $name => [$type; $lanes] } }; { def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => { $(#[$attr])* #[allow(non_camel_case_types)] - #[derive(Eq, Ord)] #[repr(simd)] pub struct $name($($itype),*); }; diff --git a/crates/core_simd/src/vectors_i128.rs b/crates/core_simd/src/vectors_i128.rs index 588f4cffb909..5c8354070e81 100644 --- a/crates/core_simd/src/vectors_i128.rs +++ b/crates/core_simd/src/vectors_i128.rs @@ -1,12 +1,10 @@ -define_vector! { +define_integer_vector! { /// Vector of two `i128` values - #[derive(Eq, Ord, Hash)] struct i128x2([i128; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `i128` values - #[derive(Eq, Ord, Hash)] struct i128x4([i128; 4]); } diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs index 52d9ef8379b0..011820e19c71 100644 --- a/crates/core_simd/src/vectors_i16.rs +++ b/crates/core_simd/src/vectors_i16.rs @@ -1,30 +1,25 @@ -define_vector! { +define_integer_vector! { /// Vector of two `i16` values - #[derive(Eq, Ord, Hash)] struct i16x2([i16; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `i16` values - #[derive(Eq, Ord, Hash)] struct i16x4([i16; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `i16` values - #[derive(Eq, Ord, Hash)] struct i16x8([i16; 8]); } -define_vector! { +define_integer_vector! { /// Vector of 16 `i16` values - #[derive(Eq, Ord, Hash)] struct i16x16([i16; 16]); } -define_vector! { +define_integer_vector! { /// Vector of 32 `i16` values - #[derive(Eq, Ord, Hash)] struct i16x32([i16; 32]); } diff --git a/crates/core_simd/src/vectors_i32.rs b/crates/core_simd/src/vectors_i32.rs index 34ecc1694604..9aa9bc8e9dc8 100644 --- a/crates/core_simd/src/vectors_i32.rs +++ b/crates/core_simd/src/vectors_i32.rs @@ -1,24 +1,20 @@ -define_vector! { +define_integer_vector! { /// Vector of two `i32` values - #[derive(Eq, Ord, Hash)] struct i32x2([i32; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `i32` values - #[derive(Eq, Ord, Hash)] struct i32x4([i32; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `i32` values - #[derive(Eq, Ord, Hash)] struct i32x8([i32; 8]); } -define_vector! { +define_integer_vector! { /// Vector of 16 `i32` values - #[derive(Eq, Ord, Hash)] struct i32x16([i32; 16]); } diff --git a/crates/core_simd/src/vectors_i64.rs b/crates/core_simd/src/vectors_i64.rs index 58893c0dfedc..ba66aba2095d 100644 --- a/crates/core_simd/src/vectors_i64.rs +++ b/crates/core_simd/src/vectors_i64.rs @@ -1,18 +1,15 @@ -define_vector! { +define_integer_vector! { /// Vector of two `i64` values - #[derive(Eq, Ord, Hash)] struct i64x2([i64; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `i64` values - #[derive(Eq, Ord, Hash)] struct i64x4([i64; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `i64` values - #[derive(Eq, Ord, Hash)] struct i64x8([i64; 8]); } diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs index c0551fc285e4..fb739bc44fa8 100644 --- a/crates/core_simd/src/vectors_i8.rs +++ b/crates/core_simd/src/vectors_i8.rs @@ -1,36 +1,30 @@ -define_vector! { +define_integer_vector! { /// Vector of two `i8` values - #[derive(Eq, Ord, Hash)] struct i8x2([i8; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `i8` values - #[derive(Eq, Ord, Hash)] struct i8x4([i8; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `i8` values - #[derive(Eq, Ord, Hash)] struct i8x8([i8; 8]); } -define_vector! { +define_integer_vector! { /// Vector of 16 `i8` values - #[derive(Eq, Ord, Hash)] struct i8x16([i8; 16]); } -define_vector! { +define_integer_vector! { /// Vector of 32 `i8` values - #[derive(Eq, Ord, Hash)] struct i8x32([i8; 32]); } -define_vector! { +define_integer_vector! { /// Vector of 64 `i8` values - #[derive(Eq, Ord, Hash)] struct i8x64([i8; 64]); } diff --git a/crates/core_simd/src/vectors_isize.rs b/crates/core_simd/src/vectors_isize.rs index 10a892bd0908..35dac8bcbd45 100644 --- a/crates/core_simd/src/vectors_isize.rs +++ b/crates/core_simd/src/vectors_isize.rs @@ -1,18 +1,15 @@ -define_vector! { +define_integer_vector! { /// Vector of two `isize` values - #[derive(Eq, Ord, Hash)] struct isizex2([isize; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `isize` values - #[derive(Eq, Ord, Hash)] struct isizex4([isize; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `isize` values - #[derive(Eq, Ord, Hash)] struct isizex8([isize; 8]); } diff --git a/crates/core_simd/src/vectors_u128.rs b/crates/core_simd/src/vectors_u128.rs index 1412dfdc85dc..eec7bde1722f 100644 --- a/crates/core_simd/src/vectors_u128.rs +++ b/crates/core_simd/src/vectors_u128.rs @@ -1,12 +1,10 @@ -define_vector! { +define_integer_vector! { /// Vector of two `u128` values - #[derive(Eq, Ord, Hash)] struct u128x2([u128; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `u128` values - #[derive(Eq, Ord, Hash)] struct u128x4([u128; 4]); } diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs index 6fd7c64f4b31..9e846a32efad 100644 --- a/crates/core_simd/src/vectors_u16.rs +++ b/crates/core_simd/src/vectors_u16.rs @@ -1,30 +1,25 @@ -define_vector! { +define_integer_vector! { /// Vector of two `u16` values - #[derive(Eq, Ord, Hash)] struct u16x2([u16; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `u16` values - #[derive(Eq, Ord, Hash)] struct u16x4([u16; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `u16` values - #[derive(Eq, Ord, Hash)] struct u16x8([u16; 8]); } -define_vector! { +define_integer_vector! { /// Vector of 16 `u16` values - #[derive(Eq, Ord, Hash)] struct u16x16([u16; 16]); } -define_vector! { +define_integer_vector! { /// Vector of 32 `u16` values - #[derive(Eq, Ord, Hash)] struct u16x32([u16; 32]); } diff --git a/crates/core_simd/src/vectors_u32.rs b/crates/core_simd/src/vectors_u32.rs index d4e1fd439ff3..b00c63d9058f 100644 --- a/crates/core_simd/src/vectors_u32.rs +++ b/crates/core_simd/src/vectors_u32.rs @@ -1,24 +1,20 @@ -define_vector! { +define_integer_vector! { /// Vector of two `u32` values - #[derive(Eq, Ord, Hash)] struct u32x2([u32; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `u32` values - #[derive(Eq, Ord, Hash)] struct u32x4([u32; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `u32` values - #[derive(Eq, Ord, Hash)] struct u32x8([u32; 8]); } -define_vector! { +define_integer_vector! { /// Vector of 16 `u32` values - #[derive(Eq, Ord, Hash)] struct u32x16([u32; 16]); } diff --git a/crates/core_simd/src/vectors_u64.rs b/crates/core_simd/src/vectors_u64.rs index 6a2b0ef76309..0bcf28ebc265 100644 --- a/crates/core_simd/src/vectors_u64.rs +++ b/crates/core_simd/src/vectors_u64.rs @@ -1,18 +1,15 @@ -define_vector! { +define_integer_vector! { /// Vector of two `u64` values - #[derive(Eq, Ord, Hash)] struct u64x2([u64; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `u64` values - #[derive(Eq, Ord, Hash)] struct u64x4([u64; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `u64` values - #[derive(Eq, Ord, Hash)] struct u64x8([u64; 8]); } diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs index 487a25e2d66e..d70de1a24c9d 100644 --- a/crates/core_simd/src/vectors_u8.rs +++ b/crates/core_simd/src/vectors_u8.rs @@ -1,36 +1,30 @@ -define_vector! { +define_integer_vector! { /// Vector of two `u8` values - #[derive(Eq, Ord, Hash)] struct u8x2([u8; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `u8` values - #[derive(Eq, Ord, Hash)] struct u8x4([u8; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `u8` values - #[derive(Eq, Ord, Hash)] struct u8x8([u8; 8]); } -define_vector! { +define_integer_vector! { /// Vector of 16 `u8` values - #[derive(Eq, Ord, Hash)] struct u8x16([u8; 16]); } -define_vector! { +define_integer_vector! { /// Vector of 32 `u8` values - #[derive(Eq, Ord, Hash)] struct u8x32([u8; 32]); } -define_vector! { +define_integer_vector! { /// Vector of 64 `u8` values - #[derive(Eq, Ord, Hash)] struct u8x64([u8; 64]); } diff --git a/crates/core_simd/src/vectors_usize.rs b/crates/core_simd/src/vectors_usize.rs index 2318d63a0014..84a4b8e509b3 100644 --- a/crates/core_simd/src/vectors_usize.rs +++ b/crates/core_simd/src/vectors_usize.rs @@ -1,18 +1,15 @@ -define_vector! { +define_integer_vector! { /// Vector of two `usize` values - #[derive(Eq, Ord, Hash)] struct usizex2([usize; 2]); } -define_vector! { +define_integer_vector! { /// Vector of four `usize` values - #[derive(Eq, Ord, Hash)] struct usizex4([usize; 4]); } -define_vector! { +define_integer_vector! { /// Vector of eight `usize` values - #[derive(Eq, Ord, Hash)] struct usizex8([usize; 8]); } From 88bfbb001e291ba97b3b6d6cea3456bbd4fbf640 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Sat, 26 Sep 2020 14:41:01 -0400 Subject: [PATCH 14/15] Mark trait methods inline --- crates/core_simd/src/macros.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 165029cca5e9..2f93db190352 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -141,24 +141,28 @@ macro_rules! base_vector_traits { impl Copy for $name {} impl Clone for $name { + #[inline] fn clone(&self) -> Self { *self } } impl Default for $name { + #[inline] fn default() -> Self { Self::splat(<$type>::default()) } } impl PartialEq for $name { + #[inline] fn eq(&self, other: &Self) -> bool { AsRef::<[$type]>::as_ref(self) == AsRef::<[$type]>::as_ref(other) } } impl PartialOrd for $name { + #[inline] fn partial_cmp(&self, other: &Self) -> Option { AsRef::<[$type]>::as_ref(self).partial_cmp(AsRef::<[$type]>::as_ref(other)) } @@ -213,12 +217,14 @@ macro_rules! integer_vector_traits { impl Eq for $name {} impl Ord for $name { + #[inline] fn cmp(&self, other: &Self) -> core::cmp::Ordering { AsRef::<[$type]>::as_ref(self).cmp(AsRef::<[$type]>::as_ref(other)) } } impl core::hash::Hash for $name { + #[inline] fn hash(&self, state: &mut H) where H: core::hash::Hasher From cfda50a82a7eb1c04c8ed18600c69e587af3556e Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Sat, 26 Sep 2020 19:31:14 -0400 Subject: [PATCH 15/15] Remove vectors under 64-bit width --- crates/core_simd/src/fmt.rs | 12 ++++++------ crates/core_simd/src/vectors_i16.rs | 5 ----- crates/core_simd/src/vectors_i8.rs | 10 ---------- crates/core_simd/src/vectors_mask16.rs | 5 ----- crates/core_simd/src/vectors_mask8.rs | 10 ---------- crates/core_simd/src/vectors_u16.rs | 5 ----- crates/core_simd/src/vectors_u8.rs | 10 ---------- 7 files changed, 6 insertions(+), 51 deletions(-) diff --git a/crates/core_simd/src/fmt.rs b/crates/core_simd/src/fmt.rs index e505947e1e65..c634e0546bc1 100644 --- a/crates/core_simd/src/fmt.rs +++ b/crates/core_simd/src/fmt.rs @@ -74,10 +74,10 @@ macro_rules! impl_fmt_trait { impl_fmt_trait! { integers: - crate::u8x2, crate::u8x4, crate::u8x8, crate::u8x16, crate::u8x32, crate::u8x64, - crate::i8x2, crate::i8x4, crate::i8x8, crate::i8x16, crate::i8x32, crate::i8x64, - crate::u16x2, crate::u16x4, crate::u16x8, crate::u16x16, crate::u16x32, - crate::i16x2, crate::i16x4, crate::i16x8, crate::i16x16, crate::i16x32, + crate::u8x8, crate::u8x16, crate::u8x32, crate::u8x64, + crate::i8x8, crate::i8x16, crate::i8x32, crate::i8x64, + crate::u16x4, crate::u16x8, crate::u16x16, crate::u16x32, + crate::i16x4, crate::i16x8, crate::i16x16, crate::i16x32, crate::u32x2, crate::u32x4, crate::u32x8, crate::u32x16, crate::i32x2, crate::i32x4, crate::i32x8, crate::i32x16, crate::u64x2, crate::u64x4, crate::u64x8, @@ -96,8 +96,8 @@ impl_fmt_trait! { impl_fmt_trait! { masks: - crate::mask8x2, crate::mask8x4, crate::mask8x8, crate::mask8x16, crate::mask8x32, crate::mask8x64, - crate::mask16x2, crate::mask16x4, crate::mask16x8, crate::mask16x16, crate::mask16x32, + crate::mask8x8, crate::mask8x16, crate::mask8x32, crate::mask8x64, + crate::mask16x4, crate::mask16x8, crate::mask16x16, crate::mask16x32, crate::mask32x2, crate::mask32x4, crate::mask32x8, crate::mask32x16, crate::mask64x2, crate::mask64x4, crate::mask64x8, crate::mask128x2, crate::mask128x4, diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs index 011820e19c71..8aabd136b104 100644 --- a/crates/core_simd/src/vectors_i16.rs +++ b/crates/core_simd/src/vectors_i16.rs @@ -1,8 +1,3 @@ -define_integer_vector! { - /// Vector of two `i16` values - struct i16x2([i16; 2]); -} - define_integer_vector! { /// Vector of four `i16` values struct i16x4([i16; 4]); diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs index fb739bc44fa8..3e52d894cc22 100644 --- a/crates/core_simd/src/vectors_i8.rs +++ b/crates/core_simd/src/vectors_i8.rs @@ -1,13 +1,3 @@ -define_integer_vector! { - /// Vector of two `i8` values - struct i8x2([i8; 2]); -} - -define_integer_vector! { - /// Vector of four `i8` values - struct i8x4([i8; 4]); -} - define_integer_vector! { /// Vector of eight `i8` values struct i8x8([i8; 8]); diff --git a/crates/core_simd/src/vectors_mask16.rs b/crates/core_simd/src/vectors_mask16.rs index 8cbae6b7bbd2..406d7255a11e 100644 --- a/crates/core_simd/src/vectors_mask16.rs +++ b/crates/core_simd/src/vectors_mask16.rs @@ -1,10 +1,5 @@ use crate::mask16; -define_mask_vector! { - /// Vector of two `mask16` values - struct mask16x2([i16 as mask16; 2]); -} - define_mask_vector! { /// Vector of four `mask16` values struct mask16x4([i16 as mask16; 4]); diff --git a/crates/core_simd/src/vectors_mask8.rs b/crates/core_simd/src/vectors_mask8.rs index b6fbe5595189..d038b3361044 100644 --- a/crates/core_simd/src/vectors_mask8.rs +++ b/crates/core_simd/src/vectors_mask8.rs @@ -1,15 +1,5 @@ use crate::mask8; -define_mask_vector! { - /// Vector of two `mask8` values - struct mask8x2([i8 as mask8; 2]); -} - -define_mask_vector! { - /// Vector of four `mask8` values - struct mask8x4([i8 as mask8; 4]); -} - define_mask_vector! { /// Vector of eight `mask8` values struct mask8x8([i8 as mask8; 8]); diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs index 9e846a32efad..809ab10383cd 100644 --- a/crates/core_simd/src/vectors_u16.rs +++ b/crates/core_simd/src/vectors_u16.rs @@ -1,8 +1,3 @@ -define_integer_vector! { - /// Vector of two `u16` values - struct u16x2([u16; 2]); -} - define_integer_vector! { /// Vector of four `u16` values struct u16x4([u16; 4]); diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs index d70de1a24c9d..a187bc6f7b42 100644 --- a/crates/core_simd/src/vectors_u8.rs +++ b/crates/core_simd/src/vectors_u8.rs @@ -1,13 +1,3 @@ -define_integer_vector! { - /// Vector of two `u8` values - struct u8x2([u8; 2]); -} - -define_integer_vector! { - /// Vector of four `u8` values - struct u8x4([u8; 4]); -} - define_integer_vector! { /// Vector of eight `u8` values struct u8x8([u8; 8]);