]>
git.proxmox.com Git - rustc.git/blob - vendor/packed_simd/src/codegen/swap_bytes.rs
1 //! Horizontal swap bytes reductions.
3 // FIXME: investigate using `llvm.bswap`
4 // https://github.com/rust-lang-nursery/packed_simd/issues/19
8 pub(crate) trait SwapBytes
{
9 fn swap_bytes(self) -> Self;
12 macro_rules
! impl_swap_bytes
{
13 (v16
: $
($id
:ident
,)+) => {
15 impl SwapBytes
for $id
{
17 fn swap_bytes(self) -> Self {
18 shuffle
!(self, [1, 0])
23 (v32
: $
($id
:ident
,)+) => {
25 impl SwapBytes
for $id
{
27 #[allow(clippy::useless_transmute)]
28 fn swap_bytes(self) -> Self {
30 let bytes
: u8x4
= crate::mem
::transmute(self);
31 let result
: u8x4
= shuffle
!(bytes
, [3, 2, 1, 0]);
32 crate::mem
::transmute(result
)
38 (v64
: $
($id
:ident
,)+) => {
40 impl SwapBytes
for $id
{
42 #[allow(clippy::useless_transmute)]
43 fn swap_bytes(self) -> Self {
45 let bytes
: u8x8
= crate::mem
::transmute(self);
46 let result
: u8x8
= shuffle
!(
47 bytes
, [7, 6, 5, 4, 3, 2, 1, 0]
49 crate::mem
::transmute(result
)
55 (v128
: $
($id
:ident
,)+) => {
57 impl SwapBytes
for $id
{
59 #[allow(clippy::useless_transmute)]
60 fn swap_bytes(self) -> Self {
62 let bytes
: u8x16
= crate::mem
::transmute(self);
63 let result
: u8x16
= shuffle
!(bytes
, [
64 15, 14, 13, 12, 11, 10, 9, 8,
65 7, 6, 5, 4, 3, 2, 1, 0
67 crate::mem
::transmute(result
)
73 (v256
: $
($id
:ident
,)+) => {
75 impl SwapBytes
for $id
{
77 #[allow(clippy::useless_transmute)]
78 fn swap_bytes(self) -> Self {
80 let bytes
: u8x32
= crate::mem
::transmute(self);
81 let result
: u8x32
= shuffle
!(bytes
, [
82 31, 30, 29, 28, 27, 26, 25, 24,
83 23, 22, 21, 20, 19, 18, 17, 16,
84 15, 14, 13, 12, 11, 10, 9, 8,
85 7, 6, 5, 4, 3, 2, 1, 0
87 crate::mem
::transmute(result
)
93 (v512
: $
($id
:ident
,)+) => {
95 impl SwapBytes
for $id
{
97 #[allow(clippy::useless_transmute)]
98 fn swap_bytes(self) -> Self {
100 let bytes
: u8x64
= crate::mem
::transmute(self);
101 let result
: u8x64
= shuffle
!(bytes
, [
102 63, 62, 61, 60, 59, 58, 57, 56,
103 55, 54, 53, 52, 51, 50, 49, 48,
104 47, 46, 45, 44, 43, 42, 41, 40,
105 39, 38, 37, 36, 35, 34, 33, 32,
106 31, 30, 29, 28, 27, 26, 25, 24,
107 23, 22, 21, 20, 19, 18, 17, 16,
108 15, 14, 13, 12, 11, 10, 9, 8,
109 7, 6, 5, 4, 3, 2, 1, 0
111 crate::mem
::transmute(result
)
119 impl_swap_bytes
!(v16
: u8x2
, i8x2
,);
120 impl_swap_bytes
!(v32
: u8x4
, i8x4
, u16x2
, i16x2
,);
121 // FIXME: 64-bit single element vector
122 impl_swap_bytes
!(v64
: u8x8
, i8x8
, u16x4
, i16x4
, u32x2
, i32x2
/* u64x1, i64x1, */,);
124 impl_swap_bytes
!(v128
: u8x16
, i8x16
, u16x8
, i16x8
, u32x4
, i32x4
, u64x2
, i64x2
, u128x1
, i128x1
,);
125 impl_swap_bytes
!(v256
: u8x32
, i8x32
, u16x16
, i16x16
, u32x8
, i32x8
, u64x4
, i64x4
, u128x2
, i128x2
,);
127 impl_swap_bytes
!(v512
: u8x64
, i8x64
, u16x32
, i16x32
, u32x16
, i32x16
, u64x8
, i64x8
, u128x4
, i128x4
,);
130 if #[cfg(target_pointer_width = "8")] {
131 impl_swap_bytes
!(v16
: isizex2
, usizex2
,);
132 impl_swap_bytes
!(v32
: isizex4
, usizex4
,);
133 impl_swap_bytes
!(v64
: isizex8
, usizex8
,);
134 } else if #[cfg(target_pointer_width = "16")] {
135 impl_swap_bytes
!(v32
: isizex2
, usizex2
,);
136 impl_swap_bytes
!(v64
: isizex4
, usizex4
,);
137 impl_swap_bytes
!(v128
: isizex8
, usizex8
,);
138 } else if #[cfg(target_pointer_width = "32")] {
139 impl_swap_bytes
!(v64
: isizex2
, usizex2
,);
140 impl_swap_bytes
!(v128
: isizex4
, usizex4
,);
141 impl_swap_bytes
!(v256
: isizex8
, usizex8
,);
142 } else if #[cfg(target_pointer_width = "64")] {
143 impl_swap_bytes
!(v128
: isizex2
, usizex2
,);
144 impl_swap_bytes
!(v256
: isizex4
, usizex4
,);
145 impl_swap_bytes
!(v512
: isizex8
, usizex8
,);
147 compile_error
!("unsupported target_pointer_width");