Skip to content

Commit 872e8f6

Browse files
committed
Simplify transmutes
1 parent 543bcd3 commit 872e8f6

15 files changed

+71
-300
lines changed

crates/core_simd/src/macros.rs

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,25 @@
1-
macro_rules! from_aligned {
2-
{ unsafe $from:ty => $to:ty } => {
1+
macro_rules! from_transmute {
2+
{ unsafe $a:ty => $b:ty } => {
3+
from_transmute!{ @impl $a => $b }
4+
from_transmute!{ @impl $b => $a }
5+
};
6+
{ @impl $from:ty => $to:ty } => {
37
impl core::convert::From<$from> for $to {
48
#[inline]
59
fn from(value: $from) -> $to {
6-
assert_eq!(core::mem::size_of::<$from>(), core::mem::size_of::<$to>());
7-
assert!(core::mem::align_of::<$from>() >= core::mem::align_of::<$to>());
810
unsafe { core::mem::transmute(value) }
911
}
1012
}
1113
};
12-
{ unsafe $a:ty |bidirectional| $b:ty } => {
13-
from_aligned!{ unsafe $a => $b }
14-
from_aligned!{ unsafe $b => $a }
15-
}
1614
}
1715

18-
macro_rules! from_unaligned {
19-
{ unsafe $from:ty => $to:ty } => {
20-
impl core::convert::From<$from> for $to {
21-
#[inline]
22-
fn from(value: $from) -> $to {
23-
assert_eq!(core::mem::size_of::<$from>(), core::mem::size_of::<$to>());
24-
unsafe { (&value as *const $from as *const $to).read_unaligned() }
25-
}
26-
}
16+
macro_rules! from_transmute_x86 {
17+
{ unsafe $generic:ty => $intel:ident } => {
18+
#[cfg(target_arch = "x86")]
19+
from_transmute! { unsafe $generic => core::arch::x86::$intel }
20+
21+
#[cfg(target_arch = "x86_64")]
22+
from_transmute! { unsafe $generic => core::arch::x86_64::$intel }
2723
}
2824
}
2925

@@ -61,11 +57,8 @@ macro_rules! define_type {
6157
}
6258
}
6359

64-
// vector to array
65-
from_aligned! { unsafe $name => [$type; $lanes] }
66-
67-
// array to vector
68-
from_unaligned! { unsafe [$type; $lanes] => $name }
60+
// vector/array conversion
61+
from_transmute! { unsafe $name => [$type; $lanes] }
6962

7063
// splat
7164
impl From<$type> for $name {

crates/core_simd/src/vectors_f32.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,6 @@ define_type! {
1818
struct f32x16([f32; 16]);
1919
}
2020

21-
#[cfg(target_arch = "x86")]
22-
from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86::__m128 }
23-
24-
#[cfg(target_arch = "x86_64")]
25-
from_aligned! { unsafe f32x4 |bidirectional| core::arch::x86_64::__m128 }
26-
27-
#[cfg(target_arch = "x86")]
28-
from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86::__m256 }
29-
30-
#[cfg(target_arch = "x86_64")]
31-
from_aligned! { unsafe f32x8 |bidirectional| core::arch::x86_64::__m256 }
32-
33-
/*
34-
#[cfg(target_arch = "x86")]
35-
from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86::__m512 }
36-
37-
#[cfg(target_arch = "x86_64")]
38-
from_aligned! { unsafe f32x16 |bidirectional| core::arch::x86_64::__m512 }
39-
*/
21+
from_transmute_x86! { unsafe f32x4 => __m128 }
22+
from_transmute_x86! { unsafe f32x8 => __m256 }
23+
//from_transmute_x86! { unsafe f32x16 => __m512 }

crates/core_simd/src/vectors_f64.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,6 @@ define_type! {
1313
struct f64x8([f64; 8]);
1414
}
1515

16-
#[cfg(target_arch = "x86")]
17-
from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86::__m128d }
18-
19-
#[cfg(target_arch = "x86_64")]
20-
from_aligned! { unsafe f64x2 |bidirectional| core::arch::x86_64::__m128d }
21-
22-
#[cfg(target_arch = "x86")]
23-
from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86::__m256d }
24-
25-
#[cfg(target_arch = "x86_64")]
26-
from_aligned! { unsafe f64x4 |bidirectional| core::arch::x86_64::__m256d }
27-
28-
/*
29-
#[cfg(target_arch = "x86")]
30-
from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86::__m512d }
31-
32-
#[cfg(target_arch = "x86_64")]
33-
from_aligned! { unsafe f64x8 |bidirectional| core::arch::x86_64::__m512d }
34-
*/
16+
from_transmute_x86! { unsafe f64x2 => __m128d }
17+
from_transmute_x86! { unsafe f64x4 => __m256d }
18+
//from_transmute_x86! { unsafe f64x8 => __m512d }

crates/core_simd/src/vectors_i128.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,5 @@ define_type! {
88
struct i128x4([i128; 4]);
99
}
1010

11-
#[cfg(target_arch = "x86")]
12-
from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86::__m256i }
13-
14-
#[cfg(target_arch = "x86_64")]
15-
from_aligned! { unsafe i128x2 |bidirectional| core::arch::x86_64::__m256i }
16-
17-
/*
18-
#[cfg(target_arch = "x86")]
19-
from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86::__m512i }
20-
21-
#[cfg(target_arch = "x86_64")]
22-
from_aligned! { unsafe i128x4 |bidirectional| core::arch::x86_64::__m512i }
23-
*/
11+
from_transmute_x86! { unsafe i128x2 => __m256i }
12+
//from_transmute_x86! { unsafe i128x4 => __m512i }

crates/core_simd/src/vectors_i16.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,6 @@ define_type! {
2323
struct i16x32([i16; 32]);
2424
}
2525

26-
#[cfg(target_arch = "x86")]
27-
from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86::__m128i }
28-
29-
#[cfg(target_arch = "x86_64")]
30-
from_aligned! { unsafe i16x8 |bidirectional| core::arch::x86_64::__m128i }
31-
32-
#[cfg(target_arch = "x86")]
33-
from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86::__m256i }
34-
35-
#[cfg(target_arch = "x86_64")]
36-
from_aligned! { unsafe i16x16 |bidirectional| core::arch::x86_64::__m256i }
37-
38-
/*
39-
#[cfg(target_arch = "x86")]
40-
from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86::__m512i }
41-
42-
#[cfg(target_arch = "x86_64")]
43-
from_aligned! { unsafe u8x32 |bidirectional| core::arch::x86_64::__m512i }
44-
*/
26+
from_transmute_x86! { unsafe i16x8 => __m128i }
27+
from_transmute_x86! { unsafe i16x16 => __m256i }
28+
//from_transmute_x86! { unsafe i16x32 => __m512i }

crates/core_simd/src/vectors_i32.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,6 @@ define_type! {
1818
struct i32x16([i32; 16]);
1919
}
2020

21-
#[cfg(target_arch = "x86")]
22-
from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86::__m128i }
23-
24-
#[cfg(target_arch = "x86_64")]
25-
from_aligned! { unsafe i32x4 |bidirectional| core::arch::x86_64::__m128i }
26-
27-
#[cfg(target_arch = "x86")]
28-
from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86::__m256i }
29-
30-
#[cfg(target_arch = "x86_64")]
31-
from_aligned! { unsafe i32x8 |bidirectional| core::arch::x86_64::__m256i }
32-
33-
/*
34-
#[cfg(target_arch = "x86")]
35-
from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86::__m512i }
36-
37-
#[cfg(target_arch = "x86_64")]
38-
from_aligned! { unsafe u32x16 |bidirectional| core::arch::x86_64::__m512i }
39-
*/
21+
from_transmute_x86! { unsafe i32x4 => __m128i }
22+
from_transmute_x86! { unsafe i32x8 => __m256i }
23+
//from_transmute_x86! { unsafe i32x16 => __m512i }

crates/core_simd/src/vectors_i64.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,6 @@ define_type! {
1313
struct i64x8([i64; 8]);
1414
}
1515

16-
#[cfg(target_arch = "x86")]
17-
from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86::__m128i }
18-
19-
#[cfg(target_arch = "x86_64")]
20-
from_aligned! { unsafe i64x2 |bidirectional| core::arch::x86_64::__m128i }
21-
22-
#[cfg(target_arch = "x86")]
23-
from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86::__m256i }
24-
25-
#[cfg(target_arch = "x86_64")]
26-
from_aligned! { unsafe i64x4 |bidirectional| core::arch::x86_64::__m256i }
27-
28-
/*
29-
#[cfg(target_arch = "x86")]
30-
from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86::__m512i }
31-
32-
#[cfg(target_arch = "x86_64")]
33-
from_aligned! { unsafe i64x8 |bidirectional| core::arch::x86_64::__m512i }
34-
*/
16+
from_transmute_x86! { unsafe i64x2 => __m128i }
17+
from_transmute_x86! { unsafe i64x4 => __m256i }
18+
//from_transmute_x86! { unsafe i64x8 => __m512i }

crates/core_simd/src/vectors_i8.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,6 @@ define_type! {
2828
struct i8x64([i8; 64]);
2929
}
3030

31-
#[cfg(target_arch = "x86")]
32-
from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86::__m128i }
33-
34-
#[cfg(target_arch = "x86_64")]
35-
from_aligned! { unsafe i8x16 |bidirectional| core::arch::x86_64::__m128i }
36-
37-
#[cfg(target_arch = "x86")]
38-
from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86::__m256i }
39-
40-
#[cfg(target_arch = "x86_64")]
41-
from_aligned! { unsafe i8x32 |bidirectional| core::arch::x86_64::__m256i }
42-
43-
/*
44-
#[cfg(target_arch = "x86")]
45-
from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86::__m512i }
46-
47-
#[cfg(target_arch = "x86_64")]
48-
from_aligned! { unsafe u8x64 |bidirectional| core::arch::x86_64::__m512i }
49-
*/
31+
from_transmute_x86! { unsafe i8x16 => __m128i }
32+
from_transmute_x86! { unsafe i8x32 => __m256i }
33+
//from_transmute_x86! { unsafe i8x64 => __m512i }

crates/core_simd/src/vectors_isize.rs

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,14 @@ define_type! {
1313
struct isizex8([isize; 8]);
1414
}
1515

16-
#[cfg(all(target_arch = "x86", target_pointer_width = "32"))]
17-
from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m128i }
18-
19-
#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
20-
from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m128i }
21-
22-
#[cfg(all(target_arch = "x86", target_pointer_width = "32"))]
23-
from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m256i }
24-
25-
#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
26-
from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m256i }
27-
28-
#[cfg(all(target_arch = "x86", target_pointer_width = "64"))]
29-
from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86::__m128i }
30-
31-
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
32-
from_aligned! { unsafe isizex2 |bidirectional| core::arch::x86_64::__m128i }
33-
34-
#[cfg(all(target_arch = "x86", target_pointer_width = "64"))]
35-
from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86::__m256i }
36-
37-
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
38-
from_aligned! { unsafe isizex4 |bidirectional| core::arch::x86_64::__m256i }
39-
40-
/*
41-
#[cfg(all(target_arch = "x86", target_pointer_width = "64"))]
42-
from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86::__m512i }
43-
44-
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
45-
from_aligned! { unsafe isizex8 |bidirectional| core::arch::x86_64::__m512i }
46-
*/
16+
#[cfg(target_pointer_width = "32")]
17+
from_transmute_x86! { unsafe isizex4 => __m128i }
18+
#[cfg(target_pointer_width = "32")]
19+
from_transmute_x86! { unsafe isizex8 => __m256i }
20+
21+
#[cfg(target_pointer_width = "64")]
22+
from_transmute_x86! { unsafe isizex2 => __m128i }
23+
#[cfg(target_pointer_width = "64")]
24+
from_transmute_x86! { unsafe isizex4 => __m256i }
25+
//#[cfg(target_pointer_width = "64")]
26+
//from_transmute_x86! { unsafe isizex8 => __m512i }

crates/core_simd/src/vectors_u128.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,5 @@ define_type! {
88
struct u128x4([u128; 4]);
99
}
1010

11-
#[cfg(target_arch = "x86")]
12-
from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86::__m256i }
13-
14-
#[cfg(target_arch = "x86_64")]
15-
from_aligned! { unsafe u128x2 |bidirectional| core::arch::x86_64::__m256i }
16-
17-
/*
18-
#[cfg(target_arch = "x86")]
19-
from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86::__m512i }
20-
21-
#[cfg(target_arch = "x86_64")]
22-
from_aligned! { unsafe u128x4 |bidirectional| core::arch::x86_64::__m512i }
23-
*/
11+
from_transmute_x86! { unsafe u128x2 => __m256i }
12+
//from_transmute_x86! { unsafe u128x4 => __m512i }

0 commit comments

Comments
 (0)