@@ -4605,6 +4605,140 @@ pub unsafe fn vreinterpretq_f32_f64(a: float64x2_t) -> float32x4_t {
4605
4605
transmute ( a)
4606
4606
}
4607
4607
4608
+ /// Signed rounding shift left
4609
+ #[ inline]
4610
+ #[ target_feature( enable = "neon" ) ]
4611
+ #[ cfg_attr( test, assert_instr( srshl) ) ]
4612
+ pub unsafe fn vrshld_s64 ( a : i64 , b : i64 ) -> i64 {
4613
+ transmute ( vrshl_s64 ( transmute ( a) , transmute ( b) ) )
4614
+ }
4615
+
4616
+ /// Unsigned rounding shift left
4617
+ #[ inline]
4618
+ #[ target_feature( enable = "neon" ) ]
4619
+ #[ cfg_attr( test, assert_instr( urshl) ) ]
4620
+ pub unsafe fn vrshld_u64 ( a : u64 , b : i64 ) -> u64 {
4621
+ transmute ( vrshl_u64 ( transmute ( a) , transmute ( b) ) )
4622
+ }
4623
+
4624
+ /// Signed rounding shift right
4625
+ #[ inline]
4626
+ #[ target_feature( enable = "neon" ) ]
4627
+ #[ cfg_attr( test, assert_instr( srshr, N = 2 ) ) ]
4628
+ #[ rustc_legacy_const_generics( 1 ) ]
4629
+ pub unsafe fn vrshrd_n_s64 < const N : i32 > ( a : i64 ) -> i64 {
4630
+ static_assert ! ( N : i32 where N >= 1 && N <= 64 ) ;
4631
+ vrshld_s64 ( a, -N as i64 )
4632
+ }
4633
+
4634
+ /// Unsigned rounding shift right
4635
+ #[ inline]
4636
+ #[ target_feature( enable = "neon" ) ]
4637
+ #[ cfg_attr( test, assert_instr( urshr, N = 2 ) ) ]
4638
+ #[ rustc_legacy_const_generics( 1 ) ]
4639
+ pub unsafe fn vrshrd_n_u64 < const N : i32 > ( a : u64 ) -> u64 {
4640
+ static_assert ! ( N : i32 where N >= 1 && N <= 64 ) ;
4641
+ vrshld_u64 ( a, -N as i64 )
4642
+ }
4643
+
4644
+ /// Rounding shift right narrow
4645
+ #[ inline]
4646
+ #[ target_feature( enable = "neon" ) ]
4647
+ #[ cfg_attr( test, assert_instr( rshrn2, N = 2 ) ) ]
4648
+ #[ rustc_legacy_const_generics( 2 ) ]
4649
+ pub unsafe fn vrshrn_high_n_s16 < const N : i32 > ( a : int8x8_t , b : int16x8_t ) -> int8x16_t {
4650
+ static_assert ! ( N : i32 where N >= 1 && N <= 8 ) ;
4651
+ simd_shuffle16 ( a, vrshrn_n_s16 :: < N > ( b) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] )
4652
+ }
4653
+
4654
+ /// Rounding shift right narrow
4655
+ #[ inline]
4656
+ #[ target_feature( enable = "neon" ) ]
4657
+ #[ cfg_attr( test, assert_instr( rshrn2, N = 2 ) ) ]
4658
+ #[ rustc_legacy_const_generics( 2 ) ]
4659
+ pub unsafe fn vrshrn_high_n_s32 < const N : i32 > ( a : int16x4_t , b : int32x4_t ) -> int16x8_t {
4660
+ static_assert ! ( N : i32 where N >= 1 && N <= 16 ) ;
4661
+ simd_shuffle8 ( a, vrshrn_n_s32 :: < N > ( b) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] )
4662
+ }
4663
+
4664
+ /// Rounding shift right narrow
4665
+ #[ inline]
4666
+ #[ target_feature( enable = "neon" ) ]
4667
+ #[ cfg_attr( test, assert_instr( rshrn2, N = 2 ) ) ]
4668
+ #[ rustc_legacy_const_generics( 2 ) ]
4669
+ pub unsafe fn vrshrn_high_n_s64 < const N : i32 > ( a : int32x2_t , b : int64x2_t ) -> int32x4_t {
4670
+ static_assert ! ( N : i32 where N >= 1 && N <= 32 ) ;
4671
+ simd_shuffle4 ( a, vrshrn_n_s64 :: < N > ( b) , [ 0 , 1 , 2 , 3 ] )
4672
+ }
4673
+
4674
+ /// Rounding shift right narrow
4675
+ #[ inline]
4676
+ #[ target_feature( enable = "neon" ) ]
4677
+ #[ cfg_attr( test, assert_instr( rshrn2, N = 2 ) ) ]
4678
+ #[ rustc_legacy_const_generics( 2 ) ]
4679
+ pub unsafe fn vrshrn_high_n_u16 < const N : i32 > ( a : uint8x8_t , b : uint16x8_t ) -> uint8x16_t {
4680
+ static_assert ! ( N : i32 where N >= 1 && N <= 8 ) ;
4681
+ simd_shuffle16 ( a, vrshrn_n_u16 :: < N > ( b) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] )
4682
+ }
4683
+
4684
+ /// Rounding shift right narrow
4685
+ #[ inline]
4686
+ #[ target_feature( enable = "neon" ) ]
4687
+ #[ cfg_attr( test, assert_instr( rshrn2, N = 2 ) ) ]
4688
+ #[ rustc_legacy_const_generics( 2 ) ]
4689
+ pub unsafe fn vrshrn_high_n_u32 < const N : i32 > ( a : uint16x4_t , b : uint32x4_t ) -> uint16x8_t {
4690
+ static_assert ! ( N : i32 where N >= 1 && N <= 16 ) ;
4691
+ simd_shuffle8 ( a, vrshrn_n_u32 :: < N > ( b) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] )
4692
+ }
4693
+
4694
+ /// Rounding shift right narrow
4695
+ #[ inline]
4696
+ #[ target_feature( enable = "neon" ) ]
4697
+ #[ cfg_attr( test, assert_instr( rshrn2, N = 2 ) ) ]
4698
+ #[ rustc_legacy_const_generics( 2 ) ]
4699
+ pub unsafe fn vrshrn_high_n_u64 < const N : i32 > ( a : uint32x2_t , b : uint64x2_t ) -> uint32x4_t {
4700
+ static_assert ! ( N : i32 where N >= 1 && N <= 32 ) ;
4701
+ simd_shuffle4 ( a, vrshrn_n_u64 :: < N > ( b) , [ 0 , 1 , 2 , 3 ] )
4702
+ }
4703
+
4704
+ /// Signed rounding shift right and accumulate.
4705
+ #[ inline]
4706
+ #[ target_feature( enable = "neon" ) ]
4707
+ #[ cfg_attr( test, assert_instr( nop, N = 2 ) ) ]
4708
+ #[ rustc_legacy_const_generics( 2 ) ]
4709
+ pub unsafe fn vrsrad_n_s64 < const N : i32 > ( a : i64 , b : i64 ) -> i64 {
4710
+ static_assert ! ( N : i32 where N >= 1 && N <= 64 ) ;
4711
+ let b: int64x1_t = vrshr_n_s64 :: < N > ( transmute ( b) ) ;
4712
+ transmute ( simd_add ( transmute ( a) , b) )
4713
+ }
4714
+
4715
+ /// Ungisned rounding shift right and accumulate.
4716
+ #[ inline]
4717
+ #[ target_feature( enable = "neon" ) ]
4718
+ #[ cfg_attr( test, assert_instr( nop, N = 2 ) ) ]
4719
+ #[ rustc_legacy_const_generics( 2 ) ]
4720
+ pub unsafe fn vrsrad_n_u64 < const N : i32 > ( a : u64 , b : u64 ) -> u64 {
4721
+ static_assert ! ( N : i32 where N >= 1 && N <= 64 ) ;
4722
+ let b: uint64x1_t = vrshr_n_u64 :: < N > ( transmute ( b) ) ;
4723
+ transmute ( simd_add ( transmute ( a) , b) )
4724
+ }
4725
+
4726
+ /// Signed Shift left
4727
+ #[ inline]
4728
+ #[ target_feature( enable = "neon" ) ]
4729
+ #[ cfg_attr( test, assert_instr( sshl) ) ]
4730
+ pub unsafe fn vshld_s64 ( a : i64 , b : i64 ) -> i64 {
4731
+ transmute ( vshl_s64 ( transmute ( a) , transmute ( b) ) )
4732
+ }
4733
+
4734
+ /// Unsigned Shift left
4735
+ #[ inline]
4736
+ #[ target_feature( enable = "neon" ) ]
4737
+ #[ cfg_attr( test, assert_instr( ushl) ) ]
4738
+ pub unsafe fn vshld_u64 ( a : u64 , b : i64 ) -> u64 {
4739
+ transmute ( vshl_u64 ( transmute ( a) , transmute ( b) ) )
4740
+ }
4741
+
4608
4742
/// Signed shift left long
4609
4743
#[ inline]
4610
4744
#[ target_feature( enable = "neon" ) ]
@@ -9872,6 +10006,130 @@ mod test {
9872
10006
assert_eq ! ( r, e) ;
9873
10007
}
9874
10008
10009
+ #[ simd_test( enable = "neon" ) ]
10010
+ unsafe fn test_vrshld_s64 ( ) {
10011
+ let a: i64 = 1 ;
10012
+ let b: i64 = 2 ;
10013
+ let e: i64 = 4 ;
10014
+ let r: i64 = transmute ( vrshld_s64 ( transmute ( a) , transmute ( b) ) ) ;
10015
+ assert_eq ! ( r, e) ;
10016
+ }
10017
+
10018
+ #[ simd_test( enable = "neon" ) ]
10019
+ unsafe fn test_vrshld_u64 ( ) {
10020
+ let a: u64 = 1 ;
10021
+ let b: i64 = 2 ;
10022
+ let e: u64 = 4 ;
10023
+ let r: u64 = transmute ( vrshld_u64 ( transmute ( a) , transmute ( b) ) ) ;
10024
+ assert_eq ! ( r, e) ;
10025
+ }
10026
+
10027
+ #[ simd_test( enable = "neon" ) ]
10028
+ unsafe fn test_vrshrd_n_s64 ( ) {
10029
+ let a: i64 = 4 ;
10030
+ let e: i64 = 1 ;
10031
+ let r: i64 = transmute ( vrshrd_n_s64 :: < 2 > ( transmute ( a) ) ) ;
10032
+ assert_eq ! ( r, e) ;
10033
+ }
10034
+
10035
+ #[ simd_test( enable = "neon" ) ]
10036
+ unsafe fn test_vrshrd_n_u64 ( ) {
10037
+ let a: u64 = 4 ;
10038
+ let e: u64 = 1 ;
10039
+ let r: u64 = transmute ( vrshrd_n_u64 :: < 2 > ( transmute ( a) ) ) ;
10040
+ assert_eq ! ( r, e) ;
10041
+ }
10042
+
10043
+ #[ simd_test( enable = "neon" ) ]
10044
+ unsafe fn test_vrshrn_high_n_s16 ( ) {
10045
+ let a: i8x8 = i8x8:: new ( 0 , 1 , 8 , 9 , 8 , 9 , 10 , 11 ) ;
10046
+ let b: i16x8 = i16x8:: new ( 32 , 36 , 40 , 44 , 48 , 52 , 56 , 60 ) ;
10047
+ let e: i8x16 = i8x16:: new ( 0 , 1 , 8 , 9 , 8 , 9 , 10 , 11 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ) ;
10048
+ let r: i8x16 = transmute ( vrshrn_high_n_s16 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10049
+ assert_eq ! ( r, e) ;
10050
+ }
10051
+
10052
+ #[ simd_test( enable = "neon" ) ]
10053
+ unsafe fn test_vrshrn_high_n_s32 ( ) {
10054
+ let a: i16x4 = i16x4:: new ( 0 , 1 , 8 , 9 ) ;
10055
+ let b: i32x4 = i32x4:: new ( 32 , 36 , 40 , 44 ) ;
10056
+ let e: i16x8 = i16x8:: new ( 0 , 1 , 8 , 9 , 8 , 9 , 10 , 11 ) ;
10057
+ let r: i16x8 = transmute ( vrshrn_high_n_s32 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10058
+ assert_eq ! ( r, e) ;
10059
+ }
10060
+
10061
+ #[ simd_test( enable = "neon" ) ]
10062
+ unsafe fn test_vrshrn_high_n_s64 ( ) {
10063
+ let a: i32x2 = i32x2:: new ( 0 , 1 ) ;
10064
+ let b: i64x2 = i64x2:: new ( 32 , 36 ) ;
10065
+ let e: i32x4 = i32x4:: new ( 0 , 1 , 8 , 9 ) ;
10066
+ let r: i32x4 = transmute ( vrshrn_high_n_s64 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10067
+ assert_eq ! ( r, e) ;
10068
+ }
10069
+
10070
+ #[ simd_test( enable = "neon" ) ]
10071
+ unsafe fn test_vrshrn_high_n_u16 ( ) {
10072
+ let a: u8x8 = u8x8:: new ( 0 , 1 , 8 , 9 , 8 , 9 , 10 , 11 ) ;
10073
+ let b: u16x8 = u16x8:: new ( 32 , 36 , 40 , 44 , 48 , 52 , 56 , 60 ) ;
10074
+ let e: u8x16 = u8x16:: new ( 0 , 1 , 8 , 9 , 8 , 9 , 10 , 11 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ) ;
10075
+ let r: u8x16 = transmute ( vrshrn_high_n_u16 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10076
+ assert_eq ! ( r, e) ;
10077
+ }
10078
+
10079
+ #[ simd_test( enable = "neon" ) ]
10080
+ unsafe fn test_vrshrn_high_n_u32 ( ) {
10081
+ let a: u16x4 = u16x4:: new ( 0 , 1 , 8 , 9 ) ;
10082
+ let b: u32x4 = u32x4:: new ( 32 , 36 , 40 , 44 ) ;
10083
+ let e: u16x8 = u16x8:: new ( 0 , 1 , 8 , 9 , 8 , 9 , 10 , 11 ) ;
10084
+ let r: u16x8 = transmute ( vrshrn_high_n_u32 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10085
+ assert_eq ! ( r, e) ;
10086
+ }
10087
+
10088
+ #[ simd_test( enable = "neon" ) ]
10089
+ unsafe fn test_vrshrn_high_n_u64 ( ) {
10090
+ let a: u32x2 = u32x2:: new ( 0 , 1 ) ;
10091
+ let b: u64x2 = u64x2:: new ( 32 , 36 ) ;
10092
+ let e: u32x4 = u32x4:: new ( 0 , 1 , 8 , 9 ) ;
10093
+ let r: u32x4 = transmute ( vrshrn_high_n_u64 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10094
+ assert_eq ! ( r, e) ;
10095
+ }
10096
+
10097
+ #[ simd_test( enable = "neon" ) ]
10098
+ unsafe fn test_vrsrad_n_s64 ( ) {
10099
+ let a: i64 = 1 ;
10100
+ let b: i64 = 4 ;
10101
+ let e: i64 = 2 ;
10102
+ let r: i64 = transmute ( vrsrad_n_s64 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10103
+ assert_eq ! ( r, e) ;
10104
+ }
10105
+
10106
+ #[ simd_test( enable = "neon" ) ]
10107
+ unsafe fn test_vrsrad_n_u64 ( ) {
10108
+ let a: u64 = 1 ;
10109
+ let b: u64 = 4 ;
10110
+ let e: u64 = 2 ;
10111
+ let r: u64 = transmute ( vrsrad_n_u64 :: < 2 > ( transmute ( a) , transmute ( b) ) ) ;
10112
+ assert_eq ! ( r, e) ;
10113
+ }
10114
+
10115
+ #[ simd_test( enable = "neon" ) ]
10116
+ unsafe fn test_vshld_s64 ( ) {
10117
+ let a: i64 = 1 ;
10118
+ let b: i64 = 2 ;
10119
+ let e: i64 = 4 ;
10120
+ let r: i64 = transmute ( vshld_s64 ( transmute ( a) , transmute ( b) ) ) ;
10121
+ assert_eq ! ( r, e) ;
10122
+ }
10123
+
10124
+ #[ simd_test( enable = "neon" ) ]
10125
+ unsafe fn test_vshld_u64 ( ) {
10126
+ let a: u64 = 1 ;
10127
+ let b: i64 = 2 ;
10128
+ let e: u64 = 4 ;
10129
+ let r: u64 = transmute ( vshld_u64 ( transmute ( a) , transmute ( b) ) ) ;
10130
+ assert_eq ! ( r, e) ;
10131
+ }
10132
+
9875
10133
#[ simd_test( enable = "neon" ) ]
9876
10134
unsafe fn test_vshll_high_n_s8 ( ) {
9877
10135
let a: i8x16 = i8x16:: new ( 0 , 0 , 1 , 2 , 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ) ;
0 commit comments