Skip to content

Commit 6d5b5c1

Browse files
lu-zeroAmanieu
authored andcommitted
Add vec_mergel and vec_mergeh
1 parent 7e2cdc6 commit 6d5b5c1

File tree

2 files changed

+157
-0
lines changed

2 files changed

+157
-0
lines changed

crates/core_arch/src/powerpc/altivec.rs

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,6 +2002,142 @@ mod sealed {
20022002
vec_ctf_u32::<IMM5>(self)
20032003
}
20042004
}
2005+
2006+
#[inline]
2007+
#[target_feature(enable = "altivec")]
2008+
#[cfg_attr(all(test, target_endian = "little"), assert_instr(vmrghb))]
2009+
#[cfg_attr(all(test, target_endian = "big"), assert_instr(vmrglb))]
2010+
unsafe fn vec_vmrglb(a: vector_signed_char, b: vector_signed_char) -> vector_signed_char {
2011+
let mergel_perm = transmute(u8x16::new(
2012+
0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B, 0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E,
2013+
0x0F, 0x1F,
2014+
));
2015+
vec_perm(a, b, mergel_perm)
2016+
}
2017+
2018+
#[inline]
2019+
#[target_feature(enable = "altivec")]
2020+
#[cfg_attr(all(test, target_endian = "little"), assert_instr(vmrghh))]
2021+
#[cfg_attr(all(test, target_endian = "big"), assert_instr(vmrglh))]
2022+
unsafe fn vec_vmrglh(a: vector_signed_short, b: vector_signed_short) -> vector_signed_short {
2023+
let mergel_perm = transmute(u8x16::new(
2024+
0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B, 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F,
2025+
0x1E, 0x1F,
2026+
));
2027+
vec_perm(a, b, mergel_perm)
2028+
}
2029+
2030+
#[inline]
2031+
#[target_feature(enable = "altivec")]
2032+
#[cfg_attr(
2033+
all(test, target_endian = "little", not(target_feature = "vsx")),
2034+
assert_instr(vmrghw)
2035+
)]
2036+
#[cfg_attr(
2037+
all(test, target_endian = "little", target_feature = "vsx"),
2038+
assert_instr(xxmrghw)
2039+
)]
2040+
#[cfg_attr(
2041+
all(test, target_endian = "big", not(target_feature = "vsx")),
2042+
assert_instr(vmrglw)
2043+
)]
2044+
#[cfg_attr(
2045+
all(test, target_endian = "big", target_feature = "vsx"),
2046+
assert_instr(xxmrglw)
2047+
)]
2048+
unsafe fn vec_vmrglw(a: vector_signed_int, b: vector_signed_int) -> vector_signed_int {
2049+
let mergel_perm = transmute(u8x16::new(
2050+
0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B, 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D,
2051+
0x1E, 0x1F,
2052+
));
2053+
vec_perm(a, b, mergel_perm)
2054+
}
2055+
2056+
#[inline]
2057+
#[target_feature(enable = "altivec")]
2058+
#[cfg_attr(all(test, target_endian = "little"), assert_instr(vmrglb))]
2059+
#[cfg_attr(all(test, target_endian = "big"), assert_instr(vmrghb))]
2060+
unsafe fn vec_vmrghb(a: vector_signed_char, b: vector_signed_char) -> vector_signed_char {
2061+
let mergel_perm = transmute(u8x16::new(
2062+
0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14, 0x05, 0x15, 0x06, 0x16,
2063+
0x07, 0x17,
2064+
));
2065+
vec_perm(a, b, mergel_perm)
2066+
}
2067+
2068+
#[inline]
2069+
#[target_feature(enable = "altivec")]
2070+
#[cfg_attr(all(test, target_endian = "little"), assert_instr(vmrglh))]
2071+
#[cfg_attr(all(test, target_endian = "big"), assert_instr(vmrghh))]
2072+
unsafe fn vec_vmrghh(a: vector_signed_short, b: vector_signed_short) -> vector_signed_short {
2073+
let mergel_perm = transmute(u8x16::new(
2074+
0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13, 0x04, 0x05, 0x14, 0x15, 0x06, 0x07,
2075+
0x16, 0x17,
2076+
));
2077+
vec_perm(a, b, mergel_perm)
2078+
}
2079+
2080+
#[inline]
2081+
#[target_feature(enable = "altivec")]
2082+
#[cfg_attr(
2083+
all(test, target_endian = "little", not(target_feature = "vsx")),
2084+
assert_instr(vmrglw)
2085+
)]
2086+
#[cfg_attr(
2087+
all(test, target_endian = "little", target_feature = "vsx"),
2088+
assert_instr(xxmrglw)
2089+
)]
2090+
#[cfg_attr(
2091+
all(test, target_endian = "big", not(target_feature = "vsx")),
2092+
assert_instr(vmrghw)
2093+
)]
2094+
#[cfg_attr(
2095+
all(test, target_endian = "big", target_feature = "vsx"),
2096+
assert_instr(xxmrghw)
2097+
)]
2098+
unsafe fn vec_vmrghw(a: vector_signed_int, b: vector_signed_int) -> vector_signed_int {
2099+
let mergel_perm = transmute(u8x16::new(
2100+
0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, 0x04, 0x05, 0x06, 0x07, 0x14, 0x15,
2101+
0x16, 0x17,
2102+
));
2103+
vec_perm(a, b, mergel_perm)
2104+
}
2105+
2106+
pub trait VectorMergeh<Other> {
2107+
type Result;
2108+
unsafe fn vec_mergeh(self, b: Other) -> Self::Result;
2109+
}
2110+
2111+
impl_vec_trait! { [VectorMergeh vec_mergeh]+ 2b (vec_vmrghb, vec_vmrghh, vec_vmrghw) }
2112+
impl_vec_trait! { [VectorMergeh vec_mergeh]+ vec_vmrghw (vector_float, vector_float) -> vector_float }
2113+
2114+
pub trait VectorMergel<Other> {
2115+
type Result;
2116+
unsafe fn vec_mergel(self, b: Other) -> Self::Result;
2117+
}
2118+
2119+
impl_vec_trait! { [VectorMergel vec_mergel]+ 2b (vec_vmrglb, vec_vmrglh, vec_vmrglw) }
2120+
impl_vec_trait! { [VectorMergel vec_mergel]+ vec_vmrglw (vector_float, vector_float) -> vector_float }
2121+
}
2122+
2123+
/// Vector Merge Low
2124+
#[inline]
2125+
#[target_feature(enable = "altivec")]
2126+
pub unsafe fn vec_mergel<T, U>(a: T, b: U) -> <T as sealed::VectorMergel<U>>::Result
2127+
where
2128+
T: sealed::VectorMergel<U>,
2129+
{
2130+
a.vec_mergel(b)
2131+
}
2132+
2133+
/// Vector Merge High
2134+
#[inline]
2135+
#[target_feature(enable = "altivec")]
2136+
pub unsafe fn vec_mergeh<T, U>(a: T, b: U) -> <T as sealed::VectorMergeh<U>>::Result
2137+
where
2138+
T: sealed::VectorMergeh<U>,
2139+
{
2140+
a.vec_mergeh(b)
20052141
}
20062142

20072143
/// Vector Load Indexed.

crates/core_arch/src/powerpc/macros.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ macro_rules! impl_vec_trait {
5858
}
5959
}
6060
};
61+
([$Trait:ident $m:ident]+ $fun:ident ($a:ty, $b:ty) -> $r:ty) => {
62+
impl $Trait<$b> for $a {
63+
type Result = $r;
64+
#[inline]
65+
#[target_feature(enable = "altivec")]
66+
unsafe fn $m(self, b: $b) -> Self::Result {
67+
transmute($fun(transmute(self), transmute(b)))
68+
}
69+
}
70+
};
6171
([$Trait:ident $m:ident] $fun:ident ($a:ty, ~$b:ty) -> $r:ty) => {
6272
impl_vec_trait!{ [$Trait $m] $fun ($a, $a) -> $r }
6373
impl_vec_trait!{ [$Trait $m] $fun ($a, $b) -> $r }
@@ -84,5 +94,16 @@ macro_rules! impl_vec_trait {
8494
};
8595
([$Trait:ident $m:ident] 2 ($fn:ident)) => {
8696
impl_vec_trait!{ [$Trait $m] ($fn, $fn, $fn, $fn, $fn, $fn) }
97+
};
98+
([$Trait:ident $m:ident]+ 2b ($b:ident, $h:ident, $w:ident)) => {
99+
impl_vec_trait!{ [$Trait $m]+ $b (vector_bool_char, vector_bool_char) -> vector_bool_char }
100+
impl_vec_trait!{ [$Trait $m]+ $b (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
101+
impl_vec_trait!{ [$Trait $m]+ $b (vector_signed_char, vector_signed_char) -> vector_signed_char }
102+
impl_vec_trait!{ [$Trait $m]+ $h (vector_bool_short, vector_bool_short) -> vector_bool_short }
103+
impl_vec_trait!{ [$Trait $m]+ $h (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short }
104+
impl_vec_trait!{ [$Trait $m]+ $h (vector_signed_short, vector_signed_short) -> vector_signed_short }
105+
impl_vec_trait!{ [$Trait $m]+ $w (vector_bool_int, vector_bool_int) -> vector_bool_int }
106+
impl_vec_trait!{ [$Trait $m]+ $w (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int }
107+
impl_vec_trait!{ [$Trait $m]+ $w (vector_signed_int, vector_signed_int) -> vector_signed_int }
87108
}
88109
}

0 commit comments

Comments
 (0)