@@ -94,8 +94,6 @@ unsafe extern "unadjusted" {
9494    #[ link_name = "llvm.s390.vsrlb" ]   fn  vsrlb ( a :  vector_signed_char ,  b :  vector_signed_char )  -> vector_signed_char ; 
9595    #[ link_name = "llvm.s390.vslb" ]   fn  vslb ( a :  vector_signed_char ,  b :  vector_signed_char )  -> vector_signed_char ; 
9696
97-     #[ link_name = "llvm.s390.vsldb" ]   fn  vsldb ( a :  i8x16 ,  b :  i8x16 ,  c :  u32 )  -> i8x16 ; 
98-     #[ link_name = "llvm.s390.vsld" ]   fn  vsld ( a :  i8x16 ,  b :  i8x16 ,  c :  u32 )  -> i8x16 ; 
9997    #[ link_name = "llvm.s390.vsrd" ]   fn  vsrd ( a :  i8x16 ,  b :  i8x16 ,  c :  u32 )  -> i8x16 ; 
10098
10199    #[ link_name = "llvm.s390.verimb" ]   fn  verimb ( a :  vector_signed_char ,  b :  vector_signed_char ,  c :  vector_signed_char ,  d :  i32 )  -> vector_signed_char ; 
@@ -3484,10 +3482,44 @@ mod sealed {
34843482        unsafe  fn  vec_sldb < const  C :  u32 > ( self ,  b :  Self )  -> Self ; 
34853483    } 
34863484
3487-     // FIXME(llvm) https://github.com/llvm/llvm-project/issues/129955 
3488-     // ideally we could implement this in terms of llvm.fshl.i128 
3489-     // #[link_name = "llvm.fshl.i128"] fn fshl_i128(a: u128, b: u128, c: u128) -> u128; 
3490-     // transmute(fshl_i128(transmute(a), transmute(b), const { C * 8 } )) 
3485+     #[ inline]  
3486+     #[ target_feature( enable = "vector" ) ]  
3487+     #[ cfg_attr( test,  assert_instr( vsldb) ) ]  
3488+     unsafe  fn  test_vec_sld ( a :  vector_signed_int ,  b :  vector_signed_int )  -> vector_signed_int  { 
3489+         a. vec_sld :: < 13 > ( b) 
3490+     } 
3491+ 
3492+     #[ inline]  
3493+     #[ target_feature( enable = "vector" ) ]  
3494+     #[ cfg_attr( test,  assert_instr( vsldb) ) ]  
3495+     unsafe  fn  test_vec_sldw ( a :  vector_signed_int ,  b :  vector_signed_int )  -> vector_signed_int  { 
3496+         a. vec_sldw :: < 3 > ( b) 
3497+     } 
3498+ 
3499+     #[ inline]  
3500+     #[ target_feature( enable = "vector-enhancements-2" ) ]  
3501+     #[ cfg_attr( test,  assert_instr( vsld) ) ]  
3502+     unsafe  fn  test_vec_sldb ( a :  vector_signed_int ,  b :  vector_signed_int )  -> vector_signed_int  { 
3503+         a. vec_sldb :: < 7 > ( b) 
3504+     } 
3505+ 
3506+     #[ inline]  
3507+     #[ target_feature( enable = "vector-enhancements-2" ) ]  
3508+     #[ cfg_attr( test,  assert_instr( vsrd) ) ]  
3509+     unsafe  fn  test_vec_srdb ( a :  vector_signed_int ,  b :  vector_signed_int )  -> vector_signed_int  { 
3510+         a. vec_srdb :: < 7 > ( b) 
3511+     } 
3512+ 
3513+     unsafe  fn  funnel_shl_u128 ( a :  u128 ,  b :  u128 ,  c :  u128 )  -> u128  { 
3514+         #[ repr( simd) ]  
3515+         struct  Single ( [ u128 ;  1 ] ) ; 
3516+ 
3517+         transmute ( simd_funnel_shl :: < Single > ( 
3518+             transmute ( a) , 
3519+             transmute ( b) , 
3520+             transmute ( c) , 
3521+         ) ) 
3522+     } 
34913523
34923524    macro_rules!  impl_vec_sld { 
34933525        ( $( $ty: ident) * )  => { 
@@ -3498,21 +3530,21 @@ mod sealed {
34983530                    #[ target_feature( enable = "vector" ) ] 
34993531                    unsafe  fn  vec_sld<const  C :  u32 >( self ,  b:  Self )  -> Self  { 
35003532                        static_assert_uimm_bits!( C ,  4 ) ; 
3501-                         transmute( vsldb ( transmute( self ) ,  transmute( b) ,  C ) ) 
3533+                         transmute( funnel_shl_u128 ( transmute( self ) ,  transmute( b) ,  const   {   C   as   u128   *   8   } ) ) 
35023534                    } 
35033535
35043536                    #[ inline] 
35053537                    #[ target_feature( enable = "vector" ) ] 
35063538                    unsafe  fn  vec_sldw<const  C :  u32 >( self ,  b:  Self )  -> Self  { 
35073539                        static_assert_uimm_bits!( C ,  2 ) ; 
3508-                         transmute( vsldb ( transmute( self ) ,  transmute( b) ,  const  {  4  *  C  } ) ) 
3540+                         transmute( funnel_shl_u128 ( transmute( self ) ,  transmute( b) ,  const  {  C   as   u128   *   4  *  8  } ) ) 
35093541                    } 
35103542
35113543                    #[ inline] 
35123544                    #[ target_feature( enable = "vector-enhancements-2" ) ] 
35133545                    unsafe  fn  vec_sldb<const  C :  u32 >( self ,  b:  Self )  -> Self  { 
35143546                        static_assert_uimm_bits!( C ,  3 ) ; 
3515-                         transmute( vsld ( transmute( self ) ,  transmute( b) ,  C ) ) 
3547+                         transmute( funnel_shl_u128 ( transmute( self ) ,  transmute( b) ,  const   {   C   as   u128   } ) ) 
35163548                    } 
35173549                } 
35183550
@@ -3523,6 +3555,11 @@ mod sealed {
35233555                    unsafe  fn  vec_srdb<const  C :  u32 >( self ,  b:  Self )  -> Self  { 
35243556                        static_assert_uimm_bits!( C ,  3 ) ; 
35253557                        transmute( vsrd( transmute( self ) ,  transmute( b) ,  C ) ) 
3558+                         // FIXME(llvm): https://github.com/llvm/llvm-project/issues/129955#issuecomment-3207488190 
3559+                         // LLVM currently rewrites `fshr` to `fshl`, and the logic in the s390x 
3560+                         // backend cannot deal with that yet. 
3561+                         // #[link_name = "llvm.fshr.i128"] fn fshr_i128(a: u128, b: u128, c: u128) -> u128; 
3562+                         // transmute(fshr_i128(transmute(self), transmute(b), const { C as u128 })) 
35263563                    } 
35273564                } 
35283565            ) * 
0 commit comments