Skip to content

Commit 17d5811

Browse files
committed
add vqsubq_u8
1 parent ec35bb4 commit 17d5811

File tree

1 file changed

+42
-6
lines changed

1 file changed

+42
-6
lines changed

crates/core_arch/src/arm/neon.rs

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ extern "C" {
106106
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.uqxtn.v2i32")]
107107
fn vqmovn_u64_(a: uint64x2_t) -> uint32x2_t;
108108

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+
114114
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vpmins.v8i8")]
115115
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sminp.v8i8")]
116116
fn vpmins_v8i8(a: int8x8_t, b: int8x8_t) -> int8x8_t;
@@ -195,7 +195,17 @@ extern "C" {
195195
pub unsafe fn vqmovn_u64(a: uint64x2_t) -> uint32x2_t {
196196
vqmovn_u64_(a)
197197
}
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+
199209
/// Vector add.
200210
#[inline]
201211
#[target_feature(enable = "neon")]
@@ -1621,6 +1631,32 @@ mod tests {
16211631
use std::{i16, i32, i8, mem::transmute, u16, u32, u8};
16221632
use stdarch_test::simd_test;
16231633

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+
}
16241660
#[simd_test(enable = "neon")]
16251661
unsafe fn test_vqmovn_u64() {
16261662
let a = u64x2::new(1, 2);

0 commit comments

Comments
 (0)