@@ -338,6 +338,8 @@ extern "C" {
338
338
339
339
#[ link_name = "llvm.ppc.altivec.sll" ]
340
340
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 ;
341
343
}
342
344
343
345
macro_rules! s_t_l {
@@ -2844,6 +2846,33 @@ mod sealed {
2844
2846
}
2845
2847
2846
2848
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) }
2847
2876
}
2848
2877
2849
2878
/// Vector Merge Low
@@ -2991,6 +3020,22 @@ where
2991
3020
a. vec_sll ( b)
2992
3021
}
2993
3022
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
+
2994
3039
/// Vector Load Indexed.
2995
3040
#[ inline]
2996
3041
#[ target_feature( enable = "altivec" ) ]
0 commit comments