@@ -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
201205impl_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) ]
35883613mod 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