Skip to content

Commit 29f61e6

Browse files
lu-zeroAmanieu
authored andcommitted
Add vec_slo
1 parent 87b1178 commit 29f61e6

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

crates/core_arch/src/powerpc/altivec.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,8 @@ extern "C" {
338338

339339
#[link_name = "llvm.ppc.altivec.sll"]
340340
fn vsl(a: vector_signed_int, b: vector_signed_int) -> vector_signed_int;
341+
#[link_name = "llvm.ppc.altivec.slo"]
342+
fn vslo(a: vector_signed_int, b: vector_signed_int) -> vector_signed_int;
341343
}
342344

343345
macro_rules! s_t_l {
@@ -2844,6 +2846,33 @@ mod sealed {
28442846
}
28452847

28462848
impl_vec_sll! { [VectorSll vec_sll] (vsl) }
2849+
2850+
macro_rules! impl_vec_slo {
2851+
([$Trait:ident $m:ident] ($f:ident)) => {
2852+
impl_vec_trait!{ [$Trait $m]+ $f (vector_unsigned_char, vector_signed_char) -> vector_unsigned_char }
2853+
impl_vec_trait!{ [$Trait $m]+ $f (vector_signed_char, vector_signed_char) -> vector_signed_char }
2854+
impl_vec_trait!{ [$Trait $m]+ $f (vector_unsigned_short, vector_signed_char) -> vector_unsigned_short }
2855+
impl_vec_trait!{ [$Trait $m]+ $f (vector_signed_short, vector_signed_char) -> vector_signed_short }
2856+
impl_vec_trait!{ [$Trait $m]+ $f (vector_unsigned_int, vector_signed_char) -> vector_unsigned_int }
2857+
impl_vec_trait!{ [$Trait $m]+ $f (vector_signed_int, vector_signed_char) -> vector_signed_int }
2858+
impl_vec_trait!{ [$Trait $m]+ $f (vector_float, vector_signed_char) -> vector_float }
2859+
impl_vec_trait!{ [$Trait $m]+ $f (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
2860+
impl_vec_trait!{ [$Trait $m]+ $f (vector_signed_char, vector_unsigned_char) -> vector_signed_char }
2861+
impl_vec_trait!{ [$Trait $m]+ $f (vector_unsigned_short, vector_unsigned_char) -> vector_unsigned_short }
2862+
impl_vec_trait!{ [$Trait $m]+ $f (vector_signed_short, vector_unsigned_char) -> vector_signed_short }
2863+
impl_vec_trait!{ [$Trait $m]+ $f (vector_unsigned_int, vector_unsigned_char) -> vector_unsigned_int }
2864+
impl_vec_trait!{ [$Trait $m]+ $f (vector_signed_int, vector_unsigned_char) -> vector_signed_int }
2865+
impl_vec_trait!{ [$Trait $m]+ $f (vector_float, vector_unsigned_char) -> vector_float }
2866+
};
2867+
}
2868+
2869+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
2870+
pub trait VectorSlo<Other> {
2871+
type Result;
2872+
unsafe fn vec_slo(self, b: Other) -> Self::Result;
2873+
}
2874+
2875+
impl_vec_slo! { [VectorSlo vec_slo] (vslo) }
28472876
}
28482877

28492878
/// Vector Merge Low
@@ -2991,6 +3020,22 @@ where
29913020
a.vec_sll(b)
29923021
}
29933022

3023+
/// Vector Shift Left by Octets
3024+
///
3025+
/// ## Endian considerations
3026+
/// This intrinsic is not endian-neutral, so uses of vec_slo in big-endian code must be rewritten
3027+
/// for little-endian targets. The shift count is in element 15 of b for big-endian, but in element
3028+
/// 0 of b for little-endian.
3029+
#[inline]
3030+
#[target_feature(enable = "altivec")]
3031+
#[unstable(feature = "stdarch_powerpc", issue = "111145")]
3032+
pub unsafe fn vec_slo<T, U>(a: T, b: U) -> <T as sealed::VectorSlo<U>>::Result
3033+
where
3034+
T: sealed::VectorSlo<U>,
3035+
{
3036+
a.vec_slo(b)
3037+
}
3038+
29943039
/// Vector Load Indexed.
29953040
#[inline]
29963041
#[target_feature(enable = "altivec")]

0 commit comments

Comments
 (0)