Skip to content

Commit 947e006

Browse files
lu-zeroAmanieu
authored andcommitted
Add vec_packs and vec_packsu
1 parent 2c1c7ad commit 947e006

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed

crates/core_arch/src/powerpc/altivec.rs

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,19 @@ extern "C" {
295295
fn vctsxs(a: vector_float, b: i32) -> vector_signed_int;
296296
#[link_name = "llvm.ppc.altivec.vctuxs"]
297297
fn vctuxs(a: vector_float, b: i32) -> vector_unsigned_int;
298+
299+
#[link_name = "llvm.ppc.altivec.vpkshss"]
300+
fn vpkshss(a: vector_signed_short, b: vector_signed_short) -> vector_signed_char;
301+
#[link_name = "llvm.ppc.altivec.vpkshus"]
302+
fn vpkshus(a: vector_signed_short, b: vector_signed_short) -> vector_unsigned_char;
303+
#[link_name = "llvm.ppc.altivec.vpkuhus"]
304+
fn vpkuhus(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_char;
305+
#[link_name = "llvm.ppc.altivec.vpkswss"]
306+
fn vpkswss(a: vector_signed_int, b: vector_signed_int) -> vector_signed_short;
307+
#[link_name = "llvm.ppc.altivec.vpkswus"]
308+
fn vpkswus(a: vector_signed_int, b: vector_signed_int) -> vector_unsigned_short;
309+
#[link_name = "llvm.ppc.altivec.vpkuwus"]
310+
fn vpkuwus(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_short;
298311
}
299312

300313
macro_rules! s_t_l {
@@ -2168,6 +2181,95 @@ mod sealed {
21682181
impl_vec_trait! { [VectorPack vec_pack]+ vec_vpkuwum (vector_signed_int, vector_signed_int) -> vector_signed_short }
21692182
impl_vec_trait! { [VectorPack vec_pack]+ vec_vpkuwum (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_short }
21702183
impl_vec_trait! { [VectorPack vec_pack]+ vec_vpkuwum (vector_bool_int, vector_bool_int) -> vector_bool_short }
2184+
2185+
#[inline]
2186+
#[target_feature(enable = "altivec")]
2187+
#[cfg_attr(test, assert_instr(vpkshss))]
2188+
unsafe fn vec_vpkshss(a: vector_signed_short, b: vector_signed_short) -> vector_signed_char {
2189+
if cfg!(target_endian = "little") {
2190+
vpkshss(b, a)
2191+
} else {
2192+
vpkshss(a, b)
2193+
}
2194+
}
2195+
2196+
#[inline]
2197+
#[target_feature(enable = "altivec")]
2198+
#[cfg_attr(test, assert_instr(vpkshus))]
2199+
unsafe fn vec_vpkshus(a: vector_signed_short, b: vector_signed_short) -> vector_unsigned_char {
2200+
if cfg!(target_endian = "little") {
2201+
vpkshus(b, a)
2202+
} else {
2203+
vpkshus(a, b)
2204+
}
2205+
}
2206+
2207+
#[inline]
2208+
#[target_feature(enable = "altivec")]
2209+
#[cfg_attr(test, assert_instr(vpkuhus))]
2210+
unsafe fn vec_vpkuhus(
2211+
a: vector_unsigned_short,
2212+
b: vector_unsigned_short,
2213+
) -> vector_unsigned_char {
2214+
if cfg!(target_endian = "little") {
2215+
vpkuhus(b, a)
2216+
} else {
2217+
vpkuhus(a, b)
2218+
}
2219+
}
2220+
2221+
#[inline]
2222+
#[target_feature(enable = "altivec")]
2223+
#[cfg_attr(test, assert_instr(vpkswss))]
2224+
unsafe fn vec_vpkswss(a: vector_signed_int, b: vector_signed_int) -> vector_signed_short {
2225+
if cfg!(target_endian = "little") {
2226+
vpkswss(b, a)
2227+
} else {
2228+
vpkswss(a, b)
2229+
}
2230+
}
2231+
2232+
#[inline]
2233+
#[target_feature(enable = "altivec")]
2234+
#[cfg_attr(test, assert_instr(vpkswus))]
2235+
unsafe fn vec_vpkswus(a: vector_signed_int, b: vector_signed_int) -> vector_unsigned_short {
2236+
if cfg!(target_endian = "little") {
2237+
vpkswus(b, a)
2238+
} else {
2239+
vpkswus(a, b)
2240+
}
2241+
}
2242+
2243+
#[inline]
2244+
#[target_feature(enable = "altivec")]
2245+
#[cfg_attr(test, assert_instr(vpkuwus))]
2246+
unsafe fn vec_vpkuwus(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_short {
2247+
if cfg!(target_endian = "little") {
2248+
vpkuwus(b, a)
2249+
} else {
2250+
vpkuwus(a, b)
2251+
}
2252+
}
2253+
2254+
pub trait VectorPacks<Other> {
2255+
type Result;
2256+
unsafe fn vec_packs(self, b: Other) -> Self::Result;
2257+
}
2258+
2259+
impl_vec_trait! { [VectorPacks vec_packs] vec_vpkshss (vector_signed_short, vector_signed_short) -> vector_signed_char }
2260+
impl_vec_trait! { [VectorPacks vec_packs] vec_vpkuhus (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_char }
2261+
impl_vec_trait! { [VectorPacks vec_packs] vec_vpkswss (vector_signed_int, vector_signed_int) -> vector_signed_short }
2262+
impl_vec_trait! { [VectorPacks vec_packs] vec_vpkuwus (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_short }
2263+
2264+
pub trait VectorPacksu<Other> {
2265+
type Result;
2266+
unsafe fn vec_packsu(self, b: Other) -> Self::Result;
2267+
}
2268+
2269+
impl_vec_trait! { [VectorPacksu vec_packsu] vec_vpkshus (vector_signed_short, vector_signed_short) -> vector_unsigned_char }
2270+
impl_vec_trait! { [VectorPacksu vec_packsu] vec_vpkuhus (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_char }
2271+
impl_vec_trait! { [VectorPacksu vec_packsu] vec_vpkswus (vector_signed_int, vector_signed_int) -> vector_unsigned_short }
2272+
impl_vec_trait! { [VectorPacksu vec_packsu] vec_vpkuwus (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_short }
21712273
}
21722274

21732275
/// Vector Merge Low
@@ -2200,6 +2302,26 @@ where
22002302
a.vec_pack(b)
22012303
}
22022304

2305+
/// Vector Pack Saturated
2306+
#[inline]
2307+
#[target_feature(enable = "altivec")]
2308+
pub unsafe fn vec_packs<T, U>(a: T, b: U) -> <T as sealed::VectorPacks<U>>::Result
2309+
where
2310+
T: sealed::VectorPacks<U>,
2311+
{
2312+
a.vec_packs(b)
2313+
}
2314+
2315+
/// Vector Pack Saturated Unsigned
2316+
#[inline]
2317+
#[target_feature(enable = "altivec")]
2318+
pub unsafe fn vec_packsu<T, U>(a: T, b: U) -> <T as sealed::VectorPacksu<U>>::Result
2319+
where
2320+
T: sealed::VectorPacksu<U>,
2321+
{
2322+
a.vec_packsu(b)
2323+
}
2324+
22032325
/// Vector Load Indexed.
22042326
#[inline]
22052327
#[target_feature(enable = "altivec")]

0 commit comments

Comments
 (0)