Skip to content

Commit 613f242

Browse files
committed
Add pointer vectors and implement a few more traits
1 parent 3df72fd commit 613f242

15 files changed

+218
-2
lines changed

crates/core_simd/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ mod macros;
99
mod masks;
1010
pub use masks::*;
1111

12+
mod pointers;
13+
pub use pointers::*;
14+
1215
mod vectors_u8;
1316
pub use vectors_u8::*;
1417
mod vectors_u16;

crates/core_simd/src/macros.rs

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ macro_rules! call_counting_args {
9696
{ 2 => $mac:path => $($args:tt)* } => {
9797
$mac! {
9898
$($args)*
99-
v1 v2
99+
v0 v1
100100
}
101101
};
102102
{ 4 => $mac:path => $($args:tt)* } => {
@@ -135,6 +135,57 @@ macro_rules! call_counting_args {
135135
};
136136
}
137137

138+
/// Calls the macro `$mac` with the specified `$args` followed by counting values from 0 to the
139+
/// specified value.
140+
macro_rules! call_counting_values {
141+
{ 1 => $mac:path => $($args:tt)* } => {
142+
$mac! {
143+
$($args)*
144+
0
145+
}
146+
};
147+
{ 2 => $mac:path => $($args:tt)* } => {
148+
$mac! {
149+
$($args)*
150+
0 1
151+
}
152+
};
153+
{ 4 => $mac:path => $($args:tt)* } => {
154+
$mac! {
155+
$($args)*
156+
0 1 2 3
157+
}
158+
};
159+
{ 8 => $mac:path => $($args:tt)* } => {
160+
$mac! {
161+
$($args)*
162+
0 1 2 3 4 5 6 7
163+
}
164+
};
165+
{ 16 => $mac:path => $($args:tt)* } => {
166+
$mac! {
167+
$($args)*
168+
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
169+
}
170+
};
171+
{ 32 => $mac:path => $($args:tt)* } => {
172+
$mac! {
173+
$($args)*
174+
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
175+
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
176+
}
177+
};
178+
{ 64 => $mac:path => $($args:tt)* } => {
179+
$mac! {
180+
$($args)*
181+
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
182+
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
183+
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
184+
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
185+
}
186+
};
187+
}
188+
138189
/// Implements common traits on the specified vector `$name`, holding multiple `$lanes` of `$type`.
139190
macro_rules! base_vector_traits {
140191
{ $name:path => [$type:ty; $lanes:literal] } => {
@@ -233,7 +284,7 @@ macro_rules! define_mask_vector {
233284
{ def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => {
234285
$(#[$attr])*
235286
#[allow(non_camel_case_types)]
236-
#[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)]
287+
#[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd, Eq, Ord)]
237288
#[repr(simd)]
238289
pub struct $name($($itype),*);
239290
};

crates/core_simd/src/pointers.rs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
use core::marker::PhantomData;
2+
3+
use crate::vectors_isize::*;
4+
5+
macro_rules! define_pointer_vector {
6+
{ $(#[$attr:meta])* $name:ident => $underlying:ty => $lanes:tt, $mut:ident } => {
7+
$(#[$attr])*
8+
#[allow(non_camel_case_types)]
9+
#[repr(C)]
10+
pub struct $name<T>($underlying, PhantomData<T>);
11+
12+
impl<T> Copy for $name<T> {}
13+
14+
impl<T> Clone for $name<T> {
15+
#[inline]
16+
fn clone(&self) -> Self {
17+
*self
18+
}
19+
}
20+
21+
impl<T> core::cmp::PartialEq for $name<T> {
22+
#[inline]
23+
fn eq(&self, other: &Self) -> bool {
24+
self.0.eq(&other.0)
25+
}
26+
}
27+
28+
impl<T> core::cmp::Eq for $name<T> {}
29+
30+
impl<T> core::cmp::PartialOrd for $name<T> {
31+
#[inline]
32+
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
33+
self.0.partial_cmp(&other.0)
34+
}
35+
}
36+
37+
impl<T> core::cmp::Ord for $name<T> {
38+
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
39+
self.0.cmp(&other.0)
40+
}
41+
}
42+
43+
call_counting_values! { $lanes => define_pointer_vector => debug $name | *$mut T | }
44+
45+
impl<T> $name<T> {
46+
/// Construct a vector by setting all lanes to the given value.
47+
#[inline]
48+
pub fn splat(value: *$mut T) -> Self {
49+
Self(<$underlying>::splat(value as isize), PhantomData)
50+
}
51+
call_counting_args! { $lanes => define_pointer_vector => new $underlying | *$mut T | }
52+
}
53+
54+
// array references
55+
impl<T> AsRef<[*$mut T; $lanes]> for $name<T> {
56+
#[inline]
57+
fn as_ref(&self) -> &[*$mut T; $lanes] {
58+
unsafe { &*(self as *const _ as *const _) }
59+
}
60+
}
61+
62+
impl<T> AsMut<[*$mut T; $lanes]> for $name<T> {
63+
#[inline]
64+
fn as_mut(&mut self) -> &mut [*$mut T; $lanes] {
65+
unsafe { &mut *(self as *mut _ as *mut _) }
66+
}
67+
}
68+
69+
// slice references
70+
impl<T> AsRef<[*$mut T]> for $name<T> {
71+
#[inline]
72+
fn as_ref(&self) -> &[*$mut T] {
73+
AsRef::<[*$mut T; $lanes]>::as_ref(self)
74+
}
75+
}
76+
77+
impl<T> AsMut<[*$mut T]> for $name<T> {
78+
#[inline]
79+
fn as_mut(&mut self) -> &mut [*$mut T] {
80+
AsMut::<[*$mut T; $lanes]>::as_mut(self)
81+
}
82+
}
83+
84+
// splat
85+
impl<T> From<*$mut T> for $name<T> {
86+
#[inline]
87+
fn from(value: *$mut T) -> Self {
88+
Self::splat(value)
89+
}
90+
}
91+
};
92+
{ new $underlying:ty | $type:ty | $($var:ident)* } => {
93+
/// Construct a vector by setting each lane to the given values.
94+
#[allow(clippy::too_many_arguments)]
95+
#[inline]
96+
pub fn new($($var: $type),*) -> Self {
97+
Self(<$underlying>::new($($var as isize),*), PhantomData)
98+
}
99+
};
100+
{ debug $name:ident | $type:ty | $($index:tt)* } => {
101+
impl<T> core::fmt::Debug for $name<T> {
102+
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
103+
f.debug_tuple(stringify!($name))
104+
$(.field(&(AsRef::<[isize]>::as_ref(&self.0)[$index] as $type)))*
105+
.finish()
106+
}
107+
}
108+
}
109+
}
110+
111+
define_pointer_vector! { #[doc = "Vector of two mutable pointers"] mptrx2 => isizex2 => 2, mut }
112+
define_pointer_vector! { #[doc = "Vector of four mutable pointers"] mptrx4 => isizex4 => 4, mut }
113+
define_pointer_vector! { #[doc = "Vector of eight mutable pointers"] mptrx8 => isizex8 => 8, mut }
114+
define_pointer_vector! { #[doc = "Vector of two const pointers"] cptrx2 => isizex2 => 2, const }
115+
define_pointer_vector! { #[doc = "Vector of four const pointers"] cptrx4 => isizex4 => 4, const }
116+
define_pointer_vector! { #[doc = "Vector of eight const pointers"] cptrx8 => isizex8 => 8, const }

crates/core_simd/src/vectors_i128.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
define_vector! {
22
#[doc = "Vector of two `i128` values"]
3+
#[derive(Eq, Ord, Hash)]
34
struct i128x2([i128; 2]);
45
}
56

67
define_vector! {
78
#[doc = "Vector of four `i128` values"]
9+
#[derive(Eq, Ord, Hash)]
810
struct i128x4([i128; 4]);
911
}
1012

crates/core_simd/src/vectors_i16.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
define_vector! {
22
#[doc = "Vector of two `i16` values"]
3+
#[derive(Eq, Ord, Hash)]
34
struct i16x2([i16; 2]);
45
}
56

67
define_vector! {
78
#[doc = "Vector of four `i16` values"]
9+
#[derive(Eq, Ord, Hash)]
810
struct i16x4([i16; 4]);
911
}
1012

1113
define_vector! {
1214
#[doc = "Vector of eight `i16` values"]
15+
#[derive(Eq, Ord, Hash)]
1316
struct i16x8([i16; 8]);
1417
}
1518

1619
define_vector! {
1720
#[doc = "Vector of 16 `i16` values"]
21+
#[derive(Eq, Ord, Hash)]
1822
struct i16x16([i16; 16]);
1923
}
2024

2125
define_vector! {
2226
#[doc = "Vector of 32 `i16` values"]
27+
#[derive(Eq, Ord, Hash)]
2328
struct i16x32([i16; 32]);
2429
}
2530

crates/core_simd/src/vectors_i32.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
define_vector! {
22
#[doc = "Vector of two `i32` values"]
3+
#[derive(Eq, Ord, Hash)]
34
struct i32x2([i32; 2]);
45
}
56

67
define_vector! {
78
#[doc = "Vector of four `i32` values"]
9+
#[derive(Eq, Ord, Hash)]
810
struct i32x4([i32; 4]);
911
}
1012

1113
define_vector! {
1214
#[doc = "Vector of eight `i32` values"]
15+
#[derive(Eq, Ord, Hash)]
1316
struct i32x8([i32; 8]);
1417
}
1518

1619
define_vector! {
1720
#[doc = "Vector of 16 `i32` values"]
21+
#[derive(Eq, Ord, Hash)]
1822
struct i32x16([i32; 16]);
1923
}
2024

crates/core_simd/src/vectors_i64.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
define_vector! {
22
#[doc = "Vector of two `i64` values"]
3+
#[derive(Eq, Ord, Hash)]
34
struct i64x2([i64; 2]);
45
}
56

67
define_vector! {
78
#[doc = "Vector of four `i64` values"]
9+
#[derive(Eq, Ord, Hash)]
810
struct i64x4([i64; 4]);
911
}
1012

1113
define_vector! {
1214
#[doc = "Vector of eight `i64` values"]
15+
#[derive(Eq, Ord, Hash)]
1316
struct i64x8([i64; 8]);
1417
}
1518

crates/core_simd/src/vectors_i8.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,36 @@
11
define_vector! {
22
#[doc = "Vector of two `i8` values"]
3+
#[derive(Eq, Ord, Hash)]
34
struct i8x2([i8; 2]);
45
}
56

67
define_vector! {
78
#[doc = "Vector of four `i8` values"]
9+
#[derive(Eq, Ord, Hash)]
810
struct i8x4([i8; 4]);
911
}
1012

1113
define_vector! {
1214
#[doc = "Vector of eight `i8` values"]
15+
#[derive(Eq, Ord, Hash)]
1316
struct i8x8([i8; 8]);
1417
}
1518

1619
define_vector! {
1720
#[doc = "Vector of 16 `i8` values"]
21+
#[derive(Eq, Ord, Hash)]
1822
struct i8x16([i8; 16]);
1923
}
2024

2125
define_vector! {
2226
#[doc = "Vector of 32 `i8` values"]
27+
#[derive(Eq, Ord, Hash)]
2328
struct i8x32([i8; 32]);
2429
}
2530

2631
define_vector! {
2732
#[doc = "Vector of 64 `i8` values"]
33+
#[derive(Eq, Ord, Hash)]
2834
struct i8x64([i8; 64]);
2935
}
3036

crates/core_simd/src/vectors_isize.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
define_vector! {
22
#[doc = "Vector of two `isize` values"]
3+
#[derive(Eq, Ord, Hash)]
34
struct isizex2([isize; 2]);
45
}
56

67
define_vector! {
78
#[doc = "Vector of four `isize` values"]
9+
#[derive(Eq, Ord, Hash)]
810
struct isizex4([isize; 4]);
911
}
1012

1113
define_vector! {
1214
#[doc = "Vector of eight `isize` values"]
15+
#[derive(Eq, Ord, Hash)]
1316
struct isizex8([isize; 8]);
1417
}
1518

crates/core_simd/src/vectors_u128.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
define_vector! {
22
#[doc = "Vector of two `u128` values"]
3+
#[derive(Eq, Ord, Hash)]
34
struct u128x2([u128; 2]);
45
}
56

67
define_vector! {
78
#[doc = "Vector of four `u128` values"]
9+
#[derive(Eq, Ord, Hash)]
810
struct u128x4([u128; 4]);
911
}
1012

0 commit comments

Comments
 (0)