@@ -196,6 +196,10 @@ unsafe extern "unadjusted" {
196
196
#[ link_name = "llvm.s390.vmleb" ] fn vmleb ( a : vector_unsigned_char , b : vector_unsigned_char ) -> vector_unsigned_short ;
197
197
#[ link_name = "llvm.s390.vmleh" ] fn vmleh ( a : vector_unsigned_short , b : vector_unsigned_short ) -> vector_unsigned_int ;
198
198
#[ 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 ;
199
203
}
200
204
201
205
impl_from ! { i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, i64x2, u64x2, f32x4, f64x2 }
@@ -2491,6 +2495,19 @@ mod sealed {
2491
2495
impl_mul ! ( [ VectorMule vec_mule] vec_vmleb ( vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_short ) ;
2492
2496
impl_mul ! ( [ VectorMule vec_mule] vec_vmleh ( vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_int) ;
2493
2497
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 ) ;
2494
2511
}
2495
2512
2496
2513
/// Load Count to Block Boundary
@@ -3584,6 +3601,14 @@ pub unsafe fn vec_mule<T: sealed::VectorMule<U>, U>(a: T, b: T) -> U {
3584
3601
a. vec_mule ( b)
3585
3602
}
3586
3603
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
+
3587
3612
#[ cfg( test) ]
3588
3613
mod tests {
3589
3614
use super :: * ;
@@ -4494,4 +4519,16 @@ mod tests {
4494
4519
[ i16 :: MIN , 0 , 4 , 0 , i16 :: MAX , 0 , 2 , 0 ] ,
4495
4520
[ 0x4000_0000 , -8 , 0xFFFE , 2 ]
4496
4521
}
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
+ }
4497
4534
}
0 commit comments