Skip to content

Commit 83ce312

Browse files
folkertdevAmanieu
authored andcommitted
add vector shift by byte
1 parent 2abf9d6 commit 83ce312

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

crates/core_arch/src/s390x/vector.rs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ unsafe extern "unadjusted" {
8787
#[link_name = "llvm.s390.vsrl"] fn vsrl(a: vector_signed_char, b: vector_signed_char) -> vector_signed_char;
8888
#[link_name = "llvm.s390.vsl"] fn vsl(a: vector_signed_char, b: vector_signed_char) -> vector_signed_char;
8989

90+
#[link_name = "llvm.s390.vsrab"] fn vsrab(a: vector_signed_char, b: vector_signed_char) -> vector_signed_char;
91+
#[link_name = "llvm.s390.vsrlb"] fn vsrlb(a: vector_signed_char, b: vector_signed_char) -> vector_signed_char;
92+
#[link_name = "llvm.s390.vslb"] fn vslb(a: vector_signed_char, b: vector_signed_char) -> vector_signed_char;
93+
9094
#[link_name = "llvm.fshl.v16i8"] fn fshlb(a: vector_unsigned_char, b: vector_unsigned_char, c: vector_unsigned_char) -> vector_unsigned_char;
9195
#[link_name = "llvm.fshl.v8i16"] fn fshlh(a: vector_unsigned_short, b: vector_unsigned_short, c: vector_unsigned_short) -> vector_unsigned_short;
9296
#[link_name = "llvm.fshl.v4i32"] fn fshlf(a: vector_unsigned_int, b: vector_unsigned_int, c: vector_unsigned_int) -> vector_unsigned_int;
@@ -778,6 +782,55 @@ mod sealed {
778782

779783
impl_vec_shift! { [VectorSra vec_sra] (vesravb, vesravh, vesravf, vesravg) }
780784

785+
macro_rules! impl_vec_shift_byte {
786+
([$trait:ident $m:ident] ($f:ident)) => {
787+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_char, vector_signed_char) -> vector_unsigned_char }
788+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
789+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_char, vector_signed_char) -> vector_signed_char }
790+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_char, vector_unsigned_char) -> vector_signed_char }
791+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_short, vector_signed_short) -> vector_unsigned_short }
792+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short }
793+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_short, vector_signed_short) -> vector_signed_short }
794+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_short, vector_unsigned_short) -> vector_signed_short }
795+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_int, vector_signed_int) -> vector_unsigned_int }
796+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int }
797+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_int, vector_signed_int) -> vector_signed_int }
798+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_int, vector_unsigned_int) -> vector_signed_int }
799+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_long_long, vector_signed_long_long) -> vector_unsigned_long_long }
800+
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_long_long, vector_unsigned_long_long) -> vector_unsigned_long_long }
801+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_long_long, vector_signed_long_long) -> vector_signed_long_long }
802+
impl_vec_trait!{ [$trait $m]+ $f (vector_signed_long_long, vector_unsigned_long_long) -> vector_signed_long_long }
803+
impl_vec_trait!{ [$trait $m]+ $f (vector_float, vector_signed_int) -> vector_float }
804+
impl_vec_trait!{ [$trait $m]+ $f (vector_float, vector_unsigned_int) -> vector_float }
805+
impl_vec_trait!{ [$trait $m]+ $f (vector_double, vector_signed_long_long) -> vector_double }
806+
impl_vec_trait!{ [$trait $m]+ $f (vector_double, vector_unsigned_long_long) -> vector_double }
807+
};
808+
}
809+
810+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
811+
pub trait VectorSlb<Other> {
812+
type Result;
813+
unsafe fn vec_slb(self, b: Other) -> Self::Result;
814+
}
815+
816+
impl_vec_shift_byte! { [VectorSlb vec_slb] (vslb) }
817+
818+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
819+
pub trait VectorSrab<Other> {
820+
type Result;
821+
unsafe fn vec_srab(self, b: Other) -> Self::Result;
822+
}
823+
824+
impl_vec_shift_byte! { [VectorSrab vec_srab] (vsrab) }
825+
826+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
827+
pub trait VectorSrb<Other> {
828+
type Result;
829+
unsafe fn vec_srb(self, b: Other) -> Self::Result;
830+
}
831+
832+
impl_vec_shift_byte! { [VectorSrb vec_srb] (vsrlb) }
833+
781834
macro_rules! impl_vec_shift_long {
782835
([$trait:ident $m:ident] ($f:ident)) => {
783836
impl_vec_trait!{ [$trait $m]+ $f (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
@@ -1205,6 +1258,39 @@ where
12051258
a.vec_sra(b)
12061259
}
12071260

1261+
/// Vector Shift Left by Byte
1262+
#[inline]
1263+
#[target_feature(enable = "vector")]
1264+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
1265+
pub unsafe fn vec_slb<T, U>(a: T, b: U) -> <T as sealed::VectorSlb<U>>::Result
1266+
where
1267+
T: sealed::VectorSlb<U>,
1268+
{
1269+
a.vec_slb(b)
1270+
}
1271+
1272+
/// Vector Shift Right by Byte
1273+
#[inline]
1274+
#[target_feature(enable = "vector")]
1275+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
1276+
pub unsafe fn vec_srb<T, U>(a: T, b: U) -> <T as sealed::VectorSrb<U>>::Result
1277+
where
1278+
T: sealed::VectorSrb<U>,
1279+
{
1280+
a.vec_srb(b)
1281+
}
1282+
1283+
/// Vector Shift Right Algebraic by Byte
1284+
#[inline]
1285+
#[target_feature(enable = "vector")]
1286+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
1287+
pub unsafe fn vec_srab<T, U>(a: T, b: U) -> <T as sealed::VectorSrab<U>>::Result
1288+
where
1289+
T: sealed::VectorSrab<U>,
1290+
{
1291+
a.vec_srab(b)
1292+
}
1293+
12081294
/// Vector Element Rotate Left
12091295
#[inline]
12101296
#[target_feature(enable = "vector")]

0 commit comments

Comments
 (0)