Add vec_splat_{u,i}{8,16,32}
This commit is contained in:
parent
9fc8fd8375
commit
79a969a616
1 changed files with 39 additions and 0 deletions
|
|
@ -408,6 +408,7 @@ impl_neg! { i16x8 : 0 }
|
|||
impl_neg! { i32x4 : 0 }
|
||||
impl_neg! { f32x4 : 0f32 }
|
||||
|
||||
#[macro_use]
|
||||
mod sealed {
|
||||
use super::*;
|
||||
|
||||
|
|
@ -1161,6 +1162,19 @@ mod sealed {
|
|||
impl_abss! { vec_abss_i16, i16x8 }
|
||||
impl_abss! { vec_abss_i32, i32x4 }
|
||||
|
||||
macro_rules! splat {
|
||||
($name:ident, $v:ident, $r:ident [$instr:ident, $doc:literal]) => {
|
||||
#[doc = $doc]
|
||||
#[inline]
|
||||
#[target_feature(enable = "altivec")]
|
||||
#[cfg_attr(test, assert_instr($instr, IMM5 = 1))]
|
||||
pub unsafe fn $name<const IMM5: i8>() -> s_t_l!($r) {
|
||||
static_assert_simm_bits!(IMM5, 5);
|
||||
transmute($r::splat(IMM5 as $v))
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! splats {
|
||||
($name:ident, $v:ident, $r:ident) => {
|
||||
#[inline]
|
||||
|
|
@ -2592,6 +2606,13 @@ where
|
|||
a.vec_abss()
|
||||
}
|
||||
|
||||
splat! { vec_splat_u8, u8, u8x16 [vspltisb, "Vector Splat to Unsigned Byte"] }
|
||||
splat! { vec_splat_i8, i8, i8x16 [vspltisb, "Vector Splat to Signed Byte"] }
|
||||
splat! { vec_splat_u16, u16, u16x8 [vspltish, "Vector Splat to Unsigned Halfword"] }
|
||||
splat! { vec_splat_i16, i16, i16x8 [vspltish, "Vector Splat to Signed Halfword"] }
|
||||
splat! { vec_splat_u32, u32, u32x4 [vspltisw, "Vector Splat to Unsigned Word"] }
|
||||
splat! { vec_splat_i32, i32, i32x4 [vspltisw, "Vector Splat to Signed Word"] }
|
||||
|
||||
/// Vector splats.
|
||||
#[inline]
|
||||
#[target_feature(enable = "altivec")]
|
||||
|
|
@ -4361,6 +4382,24 @@ mod tests {
|
|||
test_vec_splats! { test_vec_splats_i32, i32x4, 42i32 }
|
||||
test_vec_splats! { test_vec_splats_f32, f32x4, 42f32 }
|
||||
|
||||
macro_rules! test_vec_splat {
|
||||
{ $name: ident, $fun: ident, $ty: ident, $a: expr, $b: expr} => {
|
||||
#[simd_test(enable = "altivec")]
|
||||
unsafe fn $name() {
|
||||
let a = $fun::<$a>();
|
||||
let d = $ty::splat($b);
|
||||
assert_eq!(d, transmute(a));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test_vec_splat! { test_vec_splat_u8, vec_splat_u8, u8x16, -1, u8::MAX }
|
||||
test_vec_splat! { test_vec_splat_u16, vec_splat_u16, u16x8, -1, u16::MAX }
|
||||
test_vec_splat! { test_vec_splat_u32, vec_splat_u32, u32x4, -1, u32::MAX }
|
||||
test_vec_splat! { test_vec_splat_i8, vec_splat_i8, i8x16, -1, -1 }
|
||||
test_vec_splat! { test_vec_splat_i16, vec_splat_i16, i16x8, -1, -1 }
|
||||
test_vec_splat! { test_vec_splat_i32, vec_splat_i32, i32x4, -1, -1 }
|
||||
|
||||
macro_rules! test_vec_sub {
|
||||
{ $name: ident, $ty: ident, [$($a:expr),+], [$($b:expr),+], [$($d:expr),+] } => {
|
||||
test_vec_2! {$name, vec_sub, $ty, [$($a),+], [$($b),+], [$($d),+] }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue