Skip to content

Commit 77c4ffe

Browse files
committed
add vec_gfmsum
1 parent 74e8f6e commit 77c4ffe

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

crates/core_arch/src/s390x/vector.rs

+37
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ unsafe extern "unadjusted" {
196196
#[link_name = "llvm.s390.vmleb"] fn vmleb(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_unsigned_short;
197197
#[link_name = "llvm.s390.vmleh"] fn vmleh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_int;
198198
#[link_name = "llvm.s390.vmlef"] fn vmlef(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_long_long;
199+
200+
#[link_name = "llvm.s390.vgfmb"] fn vgfmb(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_unsigned_short;
201+
#[link_name = "llvm.s390.vgfmh"] fn vgfmh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_int;
202+
#[link_name = "llvm.s390.vgfmf"] fn vgfmf(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_long_long;
199203
}
200204

201205
impl_from! { i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, i64x2, u64x2, f32x4, f64x2 }
@@ -2491,6 +2495,19 @@ mod sealed {
24912495
impl_mul!([VectorMule vec_mule] vec_vmleb (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_short );
24922496
impl_mul!([VectorMule vec_mule] vec_vmleh (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_int);
24932497
impl_mul!([VectorMule vec_mule] vec_vmlef (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_long_long );
2498+
2499+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2500+
pub trait VectorGfmsum<Result> {
2501+
unsafe fn vec_gfmsum(self, b: Self) -> Result;
2502+
}
2503+
2504+
test_impl! { vec_vgfmb(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_unsigned_short [ vgfmb, vgfmb ] }
2505+
test_impl! { vec_vgfmh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_int[ vgfmh, vgfmh] }
2506+
test_impl! { vec_vgfmf(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_long_long [ vgfmf, vgfmf ] }
2507+
2508+
impl_mul!([VectorGfmsum vec_gfmsum] vec_vgfmb (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_short );
2509+
impl_mul!([VectorGfmsum vec_gfmsum] vec_vgfmh (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_int);
2510+
impl_mul!([VectorGfmsum vec_gfmsum] vec_vgfmf (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_long_long );
24942511
}
24952512

24962513
/// Load Count to Block Boundary
@@ -3584,6 +3601,14 @@ pub unsafe fn vec_mule<T: sealed::VectorMule<U>, U>(a: T, b: T) -> U {
35843601
a.vec_mule(b)
35853602
}
35863603

3604+
/// Vector Galois Field Multiply Sum
3605+
#[inline]
3606+
#[target_feature(enable = "vector")]
3607+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
3608+
pub unsafe fn vec_gfmsum<T: sealed::VectorGfmsum<U>, U>(a: T, b: T) -> U {
3609+
a.vec_gfmsum(b)
3610+
}
3611+
35873612
#[cfg(test)]
35883613
mod tests {
35893614
use super::*;
@@ -4494,4 +4519,16 @@ mod tests {
44944519
[i16::MIN, 0, 4, 0, i16::MAX, 0, 2, 0],
44954520
[0x4000_0000, -8, 0xFFFE, 2]
44964521
}
4522+
4523+
test_vec_2! { test_vec_gfmsum_1, vec_gfmsum, u16x8, u16x8 -> u32x4,
4524+
[0x1234, 0x5678, 0x9ABC, 0xDEF0, 0x1357, 0x2468, 0xACE0, 0xBDF0],
4525+
[0xFFFF, 0x0001, 0x8000, 0x7FFF, 0xAAAA, 0x5555, 0x1234, 0x5678],
4526+
[0xE13A794, 0x68764A50, 0x94AA3E, 0x2C93F300]
4527+
}
4528+
4529+
test_vec_2! { test_vec_gfmsum_2, vec_gfmsum, u16x8, u16x8 -> u32x4,
4530+
[0x0000, 0xFFFF, 0xAAAA, 0x5555, 0x1234, 0x5678, 0x9ABC, 0xDEF0],
4531+
[0xFFFF, 0x0000, 0x5555, 0xAAAA, 0x0001, 0x8000, 0x7FFF, 0x1357],
4532+
[0, 0, 0x2B3C1234, 0x3781D244]
4533+
}
44974534
}

0 commit comments

Comments
 (0)