@@ -7,6 +7,16 @@ use core::arch::arm::*;
77#[ cfg( any( target_arch = "aarch64" , target_arch = "arm64ec" ) ) ]
88use core:: arch:: aarch64:: * ;
99
10+ /// Transmute between `Simd` and ACLE tuple types.
11+ macro_rules! tuple {
12+ ( $scalar: ty, $tuple: ty) => {
13+ from_transmute! { unsafe Simd <$scalar, { size_of:: <$tuple>( ) / size_of:: <$scalar>( ) } > => $tuple }
14+ } ;
15+ ( $scalar: ty, $( $tuples: ty) ,* ) => {
16+ $( tuple! { $scalar, $tuples } ) *
17+ } ;
18+ }
19+
1020#[ cfg( all(
1121 any(
1222 target_arch = "aarch64" ,
@@ -18,9 +28,6 @@ use core::arch::aarch64::*;
1828mod neon {
1929 use super :: * ;
2030
21- from_transmute ! { unsafe f32x2 => float32x2_t }
22- from_transmute ! { unsafe f32x4 => float32x4_t }
23-
2431 from_transmute ! { unsafe u8x8 => uint8x8_t }
2532 from_transmute ! { unsafe u8x16 => uint8x16_t }
2633 from_transmute ! { unsafe i8x8 => int8x8_t }
@@ -34,18 +41,52 @@ mod neon {
3441 from_transmute ! { unsafe i16x8 => int16x8_t }
3542 from_transmute ! { unsafe u16x4 => poly16x4_t }
3643 from_transmute ! { unsafe u16x8 => poly16x8_t }
44+ from_transmute ! { unsafe f16x4 => float16x4_t }
45+ from_transmute ! { unsafe f16x8 => float16x8_t }
3746
3847 from_transmute ! { unsafe u32x2 => uint32x2_t }
3948 from_transmute ! { unsafe u32x4 => uint32x4_t }
4049 from_transmute ! { unsafe i32x2 => int32x2_t }
4150 from_transmute ! { unsafe i32x4 => int32x4_t }
51+ from_transmute ! { unsafe f32x2 => float32x2_t }
52+ from_transmute ! { unsafe f32x4 => float32x4_t }
4253
4354 from_transmute ! { unsafe Simd <u64 , 1 > => uint64x1_t }
4455 from_transmute ! { unsafe u64x2 => uint64x2_t }
4556 from_transmute ! { unsafe Simd <i64 , 1 > => int64x1_t }
4657 from_transmute ! { unsafe i64x2 => int64x2_t }
4758 from_transmute ! { unsafe Simd <u64 , 1 > => poly64x1_t }
4859 from_transmute ! { unsafe u64x2 => poly64x2_t }
60+
61+ tuple ! ( i8 , int8x8x2_t, int8x8x3_t, int8x8x4_t) ;
62+ tuple ! ( i8 , int8x16x2_t, int8x16x3_t, int8x16x4_t) ;
63+ tuple ! ( u8 , uint8x8x2_t, uint8x8x3_t, uint8x8x4_t) ;
64+ tuple ! ( u8 , uint8x16x2_t, uint8x16x3_t, uint8x16x4_t) ;
65+ tuple ! ( u8 , poly8x8x2_t, poly8x8x3_t, poly8x8x4_t) ;
66+ tuple ! ( u8 , poly8x16x2_t, poly8x16x3_t, poly8x16x4_t) ;
67+
68+ tuple ! ( i16 , int16x4x2_t, int16x4x3_t, int16x4x4_t) ;
69+ tuple ! ( i16 , int16x8x2_t, int16x8x3_t, int16x8x4_t) ;
70+ tuple ! ( u16 , uint16x4x2_t, uint16x4x3_t, uint16x4x4_t) ;
71+ tuple ! ( u16 , uint16x8x2_t, uint16x8x3_t, uint16x8x4_t) ;
72+ tuple ! ( u16 , poly16x4x2_t, poly16x4x3_t, poly16x4x4_t) ;
73+ tuple ! ( u16 , poly16x8x2_t, poly16x8x3_t, poly16x8x4_t) ;
74+ tuple ! ( f16, float16x4x2_t, float16x4x3_t, float16x4x4_t) ;
75+ tuple ! ( f16, float16x8x2_t, float16x8x3_t, float16x8x4_t) ;
76+
77+ tuple ! ( i32 , int32x2x2_t, int32x2x3_t, int32x2x4_t) ;
78+ tuple ! ( i32 , int32x4x2_t, int32x4x3_t, int32x4x4_t) ;
79+ tuple ! ( u32 , uint32x2x2_t, uint32x2x3_t, uint32x2x4_t) ;
80+ tuple ! ( u32 , uint32x4x2_t, uint32x4x3_t, uint32x4x4_t) ;
81+ tuple ! ( f32 , float32x2x2_t, float32x2x3_t, float32x2x4_t) ;
82+ tuple ! ( f32 , float32x4x2_t, float32x4x3_t, float32x4x4_t) ;
83+
84+ tuple ! ( i64 , int64x1x2_t, int64x1x3_t, int64x1x4_t) ;
85+ tuple ! ( i64 , int64x2x2_t, int64x2x3_t, int64x2x4_t) ;
86+ tuple ! ( u64 , uint64x1x2_t, uint64x1x3_t, uint64x1x4_t) ;
87+ tuple ! ( u64 , uint64x2x2_t, uint64x2x3_t, uint64x2x4_t) ;
88+ tuple ! ( u64 , poly64x1x2_t, poly64x1x3_t, poly64x1x4_t) ;
89+ tuple ! ( u64 , poly64x2x2_t, poly64x2x3_t, poly64x2x4_t) ;
4990}
5091
5192#[ cfg( any(
@@ -71,4 +112,7 @@ mod aarch64 {
71112
72113 from_transmute ! { unsafe Simd <f64 , 1 > => float64x1_t }
73114 from_transmute ! { unsafe f64x2 => float64x2_t }
115+
116+ tuple ! ( f64 , float64x1x2_t, float64x1x3_t, float64x1x4_t) ;
117+ tuple ! ( f64 , float64x2x2_t, float64x2x3_t, float64x2x4_t) ;
74118}
0 commit comments