Skip to content

Commit 401ec16

Browse files
authored
add support for neon instruction vqabs_* (rust-lang#1102)
1 parent d7c3aca commit 401ec16

File tree

3 files changed

+210
-0
lines changed

3 files changed

+210
-0
lines changed

crates/core_arch/src/aarch64/neon/generated.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3653,6 +3653,32 @@ pub unsafe fn vabal_high_s32(a: int64x2_t, b: int32x4_t, c: int32x4_t) -> int64x
36533653
simd_add(a, simd_cast(f))
36543654
}
36553655

3656+
/// Singned saturating Absolute value
3657+
#[inline]
3658+
#[target_feature(enable = "neon")]
3659+
#[cfg_attr(test, assert_instr(sqabs))]
3660+
pub unsafe fn vqabs_s64(a: int64x1_t) -> int64x1_t {
3661+
#[allow(improper_ctypes)]
3662+
extern "C" {
3663+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v1i64")]
3664+
fn vqabs_s64_(a: int64x1_t) -> int64x1_t;
3665+
}
3666+
vqabs_s64_(a)
3667+
}
3668+
3669+
/// Singned saturating Absolute value
3670+
#[inline]
3671+
#[target_feature(enable = "neon")]
3672+
#[cfg_attr(test, assert_instr(sqabs))]
3673+
pub unsafe fn vqabsq_s64(a: int64x2_t) -> int64x2_t {
3674+
#[allow(improper_ctypes)]
3675+
extern "C" {
3676+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v2i64")]
3677+
fn vqabsq_s64_(a: int64x2_t) -> int64x2_t;
3678+
}
3679+
vqabsq_s64_(a)
3680+
}
3681+
36563682
#[cfg(test)]
36573683
mod test {
36583684
use super::*;
@@ -7142,4 +7168,20 @@ mod test {
71427168
let r: i64x2 = transmute(vabal_high_s32(transmute(a), transmute(b), transmute(c)));
71437169
assert_eq!(r, e);
71447170
}
7171+
7172+
#[simd_test(enable = "neon")]
7173+
unsafe fn test_vqabs_s64() {
7174+
let a: i64x1 = i64x1::new(-9223372036854775808);
7175+
let e: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF);
7176+
let r: i64x1 = transmute(vqabs_s64(transmute(a)));
7177+
assert_eq!(r, e);
7178+
}
7179+
7180+
#[simd_test(enable = "neon")]
7181+
unsafe fn test_vqabsq_s64() {
7182+
let a: i64x2 = i64x2::new(-9223372036854775808, -7);
7183+
let e: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 7);
7184+
let r: i64x2 = transmute(vqabsq_s64(transmute(a)));
7185+
assert_eq!(r, e);
7186+
}
71457187
}

crates/core_arch/src/arm/neon/generated.rs

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6921,6 +6921,102 @@ pub unsafe fn vabal_s32(a: int64x2_t, b: int32x2_t, c: int32x2_t) -> int64x2_t {
69216921
simd_add(a, simd_cast(e))
69226922
}
69236923

6924+
/// Singned saturating Absolute value
6925+
#[inline]
6926+
#[target_feature(enable = "neon")]
6927+
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
6928+
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s8"))]
6929+
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
6930+
pub unsafe fn vqabs_s8(a: int8x8_t) -> int8x8_t {
6931+
#[allow(improper_ctypes)]
6932+
extern "C" {
6933+
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v8i8")]
6934+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v8i8")]
6935+
fn vqabs_s8_(a: int8x8_t) -> int8x8_t;
6936+
}
6937+
vqabs_s8_(a)
6938+
}
6939+
6940+
/// Singned saturating Absolute value
6941+
#[inline]
6942+
#[target_feature(enable = "neon")]
6943+
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
6944+
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s8"))]
6945+
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
6946+
pub unsafe fn vqabsq_s8(a: int8x16_t) -> int8x16_t {
6947+
#[allow(improper_ctypes)]
6948+
extern "C" {
6949+
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v16i8")]
6950+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v16i8")]
6951+
fn vqabsq_s8_(a: int8x16_t) -> int8x16_t;
6952+
}
6953+
vqabsq_s8_(a)
6954+
}
6955+
6956+
/// Singned saturating Absolute value
6957+
#[inline]
6958+
#[target_feature(enable = "neon")]
6959+
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
6960+
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s16"))]
6961+
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
6962+
pub unsafe fn vqabs_s16(a: int16x4_t) -> int16x4_t {
6963+
#[allow(improper_ctypes)]
6964+
extern "C" {
6965+
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v4i16")]
6966+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v4i16")]
6967+
fn vqabs_s16_(a: int16x4_t) -> int16x4_t;
6968+
}
6969+
vqabs_s16_(a)
6970+
}
6971+
6972+
/// Singned saturating Absolute value
6973+
#[inline]
6974+
#[target_feature(enable = "neon")]
6975+
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
6976+
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s16"))]
6977+
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
6978+
pub unsafe fn vqabsq_s16(a: int16x8_t) -> int16x8_t {
6979+
#[allow(improper_ctypes)]
6980+
extern "C" {
6981+
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v8i16")]
6982+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v8i16")]
6983+
fn vqabsq_s16_(a: int16x8_t) -> int16x8_t;
6984+
}
6985+
vqabsq_s16_(a)
6986+
}
6987+
6988+
/// Singned saturating Absolute value
6989+
#[inline]
6990+
#[target_feature(enable = "neon")]
6991+
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
6992+
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s32"))]
6993+
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
6994+
pub unsafe fn vqabs_s32(a: int32x2_t) -> int32x2_t {
6995+
#[allow(improper_ctypes)]
6996+
extern "C" {
6997+
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v2i32")]
6998+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v2i32")]
6999+
fn vqabs_s32_(a: int32x2_t) -> int32x2_t;
7000+
}
7001+
vqabs_s32_(a)
7002+
}
7003+
7004+
/// Singned saturating Absolute value
7005+
#[inline]
7006+
#[target_feature(enable = "neon")]
7007+
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
7008+
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s32"))]
7009+
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
7010+
pub unsafe fn vqabsq_s32(a: int32x4_t) -> int32x4_t {
7011+
#[allow(improper_ctypes)]
7012+
extern "C" {
7013+
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v4i32")]
7014+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v4i32")]
7015+
fn vqabsq_s32_(a: int32x4_t) -> int32x4_t;
7016+
}
7017+
vqabsq_s32_(a)
7018+
}
7019+
69247020
#[cfg(test)]
69257021
#[allow(overflowing_literals)]
69267022
mod test {
@@ -12337,4 +12433,52 @@ mod test {
1233712433
let r: i64x2 = transmute(vabal_s32(transmute(a), transmute(b), transmute(c)));
1233812434
assert_eq!(r, e);
1233912435
}
12436+
12437+
#[simd_test(enable = "neon")]
12438+
unsafe fn test_vqabs_s8() {
12439+
let a: i8x8 = i8x8::new(-128, 0x7F, -6, -5, -4, -3, -2, -1);
12440+
let e: i8x8 = i8x8::new(0x7F, 0x7F, 6, 5, 4, 3, 2, 1);
12441+
let r: i8x8 = transmute(vqabs_s8(transmute(a)));
12442+
assert_eq!(r, e);
12443+
}
12444+
12445+
#[simd_test(enable = "neon")]
12446+
unsafe fn test_vqabsq_s8() {
12447+
let a: i8x16 = i8x16::new(-128, 0x7F, -6, -5, -4, -3, -2, -1, 0, -127, 127, 1, 2, 3, 4, 5);
12448+
let e: i8x16 = i8x16::new(0x7F, 0x7F, 6, 5, 4, 3, 2, 1, 0, 127, 127, 1, 2, 3, 4, 5);
12449+
let r: i8x16 = transmute(vqabsq_s8(transmute(a)));
12450+
assert_eq!(r, e);
12451+
}
12452+
12453+
#[simd_test(enable = "neon")]
12454+
unsafe fn test_vqabs_s16() {
12455+
let a: i16x4 = i16x4::new(-32768, 0x7F_FF, -6, -5);
12456+
let e: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 6, 5);
12457+
let r: i16x4 = transmute(vqabs_s16(transmute(a)));
12458+
assert_eq!(r, e);
12459+
}
12460+
12461+
#[simd_test(enable = "neon")]
12462+
unsafe fn test_vqabsq_s16() {
12463+
let a: i16x8 = i16x8::new(-32768, 0x7F_FF, -6, -5, -4, -3, -2, -1);
12464+
let e: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 6, 5, 4, 3, 2, 1);
12465+
let r: i16x8 = transmute(vqabsq_s16(transmute(a)));
12466+
assert_eq!(r, e);
12467+
}
12468+
12469+
#[simd_test(enable = "neon")]
12470+
unsafe fn test_vqabs_s32() {
12471+
let a: i32x2 = i32x2::new(-2147483648, 0x7F_FF_FF_FF);
12472+
let e: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
12473+
let r: i32x2 = transmute(vqabs_s32(transmute(a)));
12474+
assert_eq!(r, e);
12475+
}
12476+
12477+
#[simd_test(enable = "neon")]
12478+
unsafe fn test_vqabsq_s32() {
12479+
let a: i32x4 = i32x4::new(-2147483648, 0x7F_FF_FF_FF, -6, -5);
12480+
let e: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 6, 5);
12481+
let r: i32x4 = transmute(vqabsq_s32(transmute(a)));
12482+
assert_eq!(r, e);
12483+
}
1234012484
}

crates/stdarch-gen/neon.spec

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,3 +1844,27 @@ validate 20, 20
18441844

18451845
aarch64 = sabal
18461846
generate int64x2_t:int32x4_t:int32x4_t:int64x2_t
1847+
1848+
////////////////////
1849+
// Singned saturating Absolute value
1850+
////////////////////
1851+
1852+
/// Singned saturating Absolute value
1853+
name = vqabs
1854+
a = MIN, MAX, -6, -5, -4, -3, -2, -1, 0, -127, 127, 1, 2, 3, 4, 5
1855+
validate MAX, MAX, 6, 5, 4, 3, 2, 1, 0, 127, 127, 1, 2, 3, 4, 5
1856+
1857+
arm = vqabs.s
1858+
aarch64 = sqabs
1859+
link-arm = vqabs._EXT_
1860+
link-aarch64 = sqabs._EXT_
1861+
generate int*_t
1862+
1863+
/// Singned saturating Absolute value
1864+
name = vqabs
1865+
a = MIN, -7
1866+
validate MAX, 7
1867+
1868+
aarch64 = sqabs
1869+
link-aarch64 = sqabs._EXT_
1870+
generate int64x*_t

0 commit comments

Comments
 (0)