@@ -106,11 +106,11 @@ extern "C" {
106
106
#[ cfg_attr( target_arch = "aarch64" , link_name = "llvm.aarch64.neon.uqxtn.v2i32" ) ]
107
107
fn vqmovn_u64_ ( a : uint64x2_t ) -> uint32x2_t ;
108
108
109
- /*
110
- #[cfg_attr(target_arch = "aarch64 ", link_name = "llvm.aarch64 .neon.vget_lane.v8u8 ")]
111
- #[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vget_lane.v8u8")]
112
- fn vget_lane_u8_(v: uint8x8_t, lane: i32) -> u8;
113
- */
109
+ # [ cfg_attr ( target_arch = "aarch64" , link_name = "llvm.aarch64.neon.uqsub.v16i8" ) ]
110
+ #[ cfg_attr( target_arch = "arm " , link_name = "llvm.arm .neon.vqsubu.v16i8 " ) ]
111
+ fn vqsubq_u8_ ( a : uint8x16_t , a : uint8x16_t ) -> uint8x16_t ;
112
+
113
+
114
114
#[ cfg_attr( target_arch = "arm" , link_name = "llvm.arm.neon.vpmins.v8i8" ) ]
115
115
#[ cfg_attr( target_arch = "aarch64" , link_name = "llvm.aarch64.neon.sminp.v8i8" ) ]
116
116
fn vpmins_v8i8 ( a : int8x8_t , b : int8x8_t ) -> int8x8_t ;
@@ -195,7 +195,17 @@ extern "C" {
195
195
pub unsafe fn vqmovn_u64 ( a : uint64x2_t ) -> uint32x2_t {
196
196
vqmovn_u64_ ( a)
197
197
}
198
-
198
+
199
+ //uint8x16_t vqsubq_u8 (uint8x16_t a, uint8x16_t b)
200
+ ///Unsigned saturating subtract
201
+ #[ inline]
202
+ #[ target_feature( enable = "neon" ) ]
203
+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "v7" ) ) ]
204
+ #[ cfg_attr( test, assert_instr( uqsub) ) ]
205
+ pub unsafe fn vqsubq_u8 ( a : uint8x16_t , b : uint8x16_t ) -> uint8x16_t {
206
+ vqsubq_u8_ ( a, b)
207
+ }
208
+
199
209
/// Vector add.
200
210
#[ inline]
201
211
#[ target_feature( enable = "neon" ) ]
@@ -1621,6 +1631,32 @@ mod tests {
1621
1631
use std:: { i16, i32, i8, mem:: transmute, u16, u32, u8} ;
1622
1632
use stdarch_test:: simd_test;
1623
1633
1634
+
1635
+ //uint8x16_t vqsubq_u8 (uint8x16_t a, uint8x16_t b)
1636
+
1637
+ #[ simd_test( enable = "neon" ) ]
1638
+ unsafe fn test_vqsubq_u8 ( ) {
1639
+ let a = u8x16:: new (
1640
+ 42 , 42 , 42 , 42 ,
1641
+ 42 , 42 , 42 , 42 ,
1642
+ 42 , 42 , 42 , 42 ,
1643
+ 42 , 42 , 42 , 42
1644
+ ) ;
1645
+ let b = u8x16:: new (
1646
+ 1 , 2 , 3 , 4 ,
1647
+ 5 , 6 , 7 , 8 ,
1648
+ 9 , 10 , 11 , 12 ,
1649
+ 13 , 14 , 15 , 16
1650
+ ) ;
1651
+ let e = u8x16:: new (
1652
+ 41 , 40 , 39 , 38 ,
1653
+ 37 , 36 , 35 , 34 ,
1654
+ 33 , 32 , 31 , 30 ,
1655
+ 29 , 28 , 27 , 26
1656
+ ) ;
1657
+ let r: u8x16 = transmute ( vqsubq_u8 ( transmute ( a) , transmute ( b) ) ) ;
1658
+ assert_eq ! ( r, e) ;
1659
+ }
1624
1660
#[ simd_test( enable = "neon" ) ]
1625
1661
unsafe fn test_vqmovn_u64 ( ) {
1626
1662
let a = u64x2:: new ( 1 , 2 ) ;
0 commit comments