about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/core_simd/src/lib.rs19
-rw-r--r--crates/core_simd/src/macros.rs228
-rw-r--r--crates/core_simd/src/masks.rs67
-rw-r--r--crates/core_simd/src/vectors_f32.rs8
-rw-r--r--crates/core_simd/src/vectors_f64.rs6
-rw-r--r--crates/core_simd/src/vectors_i128.rs4
-rw-r--r--crates/core_simd/src/vectors_i16.rs10
-rw-r--r--crates/core_simd/src/vectors_i32.rs8
-rw-r--r--crates/core_simd/src/vectors_i64.rs6
-rw-r--r--crates/core_simd/src/vectors_i8.rs12
-rw-r--r--crates/core_simd/src/vectors_isize.rs6
-rw-r--r--crates/core_simd/src/vectors_mask128.rs11
-rw-r--r--crates/core_simd/src/vectors_mask16.rs26
-rw-r--r--crates/core_simd/src/vectors_mask32.rs21
-rw-r--r--crates/core_simd/src/vectors_mask64.rs16
-rw-r--r--crates/core_simd/src/vectors_mask8.rs31
-rw-r--r--crates/core_simd/src/vectors_masksize.rs16
-rw-r--r--crates/core_simd/src/vectors_u128.rs4
-rw-r--r--crates/core_simd/src/vectors_u16.rs10
-rw-r--r--crates/core_simd/src/vectors_u32.rs8
-rw-r--r--crates/core_simd/src/vectors_u64.rs6
-rw-r--r--crates/core_simd/src/vectors_u8.rs12
-rw-r--r--crates/core_simd/src/vectors_usize.rs6
23 files changed, 433 insertions, 108 deletions
diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs
index a5dae4b0279..1ee180a5e3a 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 5a50b1a48ec..3b5d70695c6 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,
-        }
+    { 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 $(#[$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,
+    { 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),*)
         }
     };
-    { @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,
+    { 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),*)
         }
-    };
-    { @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,
+    }
+}
+
+/// 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 | $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.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 00000000000..970047aabde
--- /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<bool> 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 3b38b26d631..c2987a7f631 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 f627fffd46b..4881df2b6da 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 b4f30f845fd..939aeb8ce2e 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 a87fa8c41cd..b9089a3b4ed 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 13c9299b7c6..686576baff1 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 8d86501a496..0a34b4c9d7e 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 f0d5ad55212..2deacfc1feb 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 2028d1ecc71..e709d175870 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 00000000000..3b1bacb7ad3
--- /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 00000000000..8d076636caa
--- /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 00000000000..64044bc4f57
--- /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 00000000000..b0c62b225c9
--- /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 00000000000..c8f3cbac3c9
--- /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 00000000000..1bf911caffc
--- /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 4b47fb2fa2e..f98026275c7 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 f637d2fe9f2..e6ec15679f8 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 d2f5d7d241c..e347509fa54 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 e6e21e62da1..a3b78623097 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 f6246f87ece..eac58dcc963 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 45da00562f6..dc97715f0c8 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]);
 }