Macro std::simd::simd_swizzle
source · pub macro simd_swizzle { ( $vector:expr, $index:expr $(,)? ) => { ... }, ( $first:expr, $second:expr, $index:expr $(,)? ) => { ... }, }
🔬This is a nightly-only experimental API. (
portable_simd
#86656)Expand description
通过将选定 lanes 中的元素复制到其他 vectors 中,创建一个新的 SIMD vector。
swizzling 一个 vector 时,lanes 由 usize
的 const
数组选择,如 Swizzle
。
当 swizzling 两个 vectors 时,lanes 由 Which
的 const
数组选择,如 Swizzle2
。
Examples
使用单个 SIMD vector,const 数组指定 vector 中的 lane 索引:
let v = u32x4::from_array([10, 11, 12, 13]);
// 保持相同的大小
let r: u32x4 = simd_swizzle!(v, [3, 0, 1, 2]);
assert_eq!(r.to_array(), [13, 10, 11, 12]);
// 改变 lane 数
let r: u32x2 = simd_swizzle!(v, [3, 1]);
assert_eq!(r.to_array(), [13, 11]);
Run使用两个输入 SIMD vectors,const 数组使用 Which
来指定每个索引的来源:
use Which::{First, Second};
let a = u32x4::from_array([0, 1, 2, 3]);
let b = u32x4::from_array([4, 5, 6, 7]);
// 保持相同的大小
let r: u32x4 = simd_swizzle!(a, b, [First(0), First(1), Second(2), Second(3)]);
assert_eq!(r.to_array(), [0, 1, 6, 7]);
// 改变 lane 数
let r: u32x2 = simd_swizzle!(a, b, [First(0), Second(0)]);
assert_eq!(r.to_array(), [0, 4]);
Run