add support for neon instruction vqabs_* (#1102)
This commit is contained in:
parent
64f84788c9
commit
ef9ec33482
3 changed files with 210 additions and 0 deletions
|
|
@ -3653,6 +3653,32 @@ pub unsafe fn vabal_high_s32(a: int64x2_t, b: int32x4_t, c: int32x4_t) -> int64x
|
|||
simd_add(a, simd_cast(f))
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqabs))]
|
||||
pub unsafe fn vqabs_s64(a: int64x1_t) -> int64x1_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v1i64")]
|
||||
fn vqabs_s64_(a: int64x1_t) -> int64x1_t;
|
||||
}
|
||||
vqabs_s64_(a)
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqabs))]
|
||||
pub unsafe fn vqabsq_s64(a: int64x2_t) -> int64x2_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v2i64")]
|
||||
fn vqabsq_s64_(a: int64x2_t) -> int64x2_t;
|
||||
}
|
||||
vqabsq_s64_(a)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
|
@ -7142,4 +7168,20 @@ mod test {
|
|||
let r: i64x2 = transmute(vabal_high_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabs_s64() {
|
||||
let a: i64x1 = i64x1::new(-9223372036854775808);
|
||||
let e: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF);
|
||||
let r: i64x1 = transmute(vqabs_s64(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabsq_s64() {
|
||||
let a: i64x2 = i64x2::new(-9223372036854775808, -7);
|
||||
let e: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 7);
|
||||
let r: i64x2 = transmute(vqabsq_s64(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6921,6 +6921,102 @@ pub unsafe fn vabal_s32(a: int64x2_t, b: int32x2_t, c: int32x2_t) -> int64x2_t {
|
|||
simd_add(a, simd_cast(e))
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s8"))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
|
||||
pub unsafe fn vqabs_s8(a: int8x8_t) -> int8x8_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v8i8")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v8i8")]
|
||||
fn vqabs_s8_(a: int8x8_t) -> int8x8_t;
|
||||
}
|
||||
vqabs_s8_(a)
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s8"))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
|
||||
pub unsafe fn vqabsq_s8(a: int8x16_t) -> int8x16_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v16i8")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v16i8")]
|
||||
fn vqabsq_s8_(a: int8x16_t) -> int8x16_t;
|
||||
}
|
||||
vqabsq_s8_(a)
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s16"))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
|
||||
pub unsafe fn vqabs_s16(a: int16x4_t) -> int16x4_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v4i16")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v4i16")]
|
||||
fn vqabs_s16_(a: int16x4_t) -> int16x4_t;
|
||||
}
|
||||
vqabs_s16_(a)
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s16"))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
|
||||
pub unsafe fn vqabsq_s16(a: int16x8_t) -> int16x8_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v8i16")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v8i16")]
|
||||
fn vqabsq_s16_(a: int16x8_t) -> int16x8_t;
|
||||
}
|
||||
vqabsq_s16_(a)
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s32"))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
|
||||
pub unsafe fn vqabs_s32(a: int32x2_t) -> int32x2_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v2i32")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v2i32")]
|
||||
fn vqabs_s32_(a: int32x2_t) -> int32x2_t;
|
||||
}
|
||||
vqabs_s32_(a)
|
||||
}
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vqabs.s32"))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqabs))]
|
||||
pub unsafe fn vqabsq_s32(a: int32x4_t) -> int32x4_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqabs.v4i32")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqabs.v4i32")]
|
||||
fn vqabsq_s32_(a: int32x4_t) -> int32x4_t;
|
||||
}
|
||||
vqabsq_s32_(a)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(overflowing_literals)]
|
||||
mod test {
|
||||
|
|
@ -12337,4 +12433,52 @@ mod test {
|
|||
let r: i64x2 = transmute(vabal_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabs_s8() {
|
||||
let a: i8x8 = i8x8::new(-128, 0x7F, -6, -5, -4, -3, -2, -1);
|
||||
let e: i8x8 = i8x8::new(0x7F, 0x7F, 6, 5, 4, 3, 2, 1);
|
||||
let r: i8x8 = transmute(vqabs_s8(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabsq_s8() {
|
||||
let a: i8x16 = i8x16::new(-128, 0x7F, -6, -5, -4, -3, -2, -1, 0, -127, 127, 1, 2, 3, 4, 5);
|
||||
let e: i8x16 = i8x16::new(0x7F, 0x7F, 6, 5, 4, 3, 2, 1, 0, 127, 127, 1, 2, 3, 4, 5);
|
||||
let r: i8x16 = transmute(vqabsq_s8(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabs_s16() {
|
||||
let a: i16x4 = i16x4::new(-32768, 0x7F_FF, -6, -5);
|
||||
let e: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 6, 5);
|
||||
let r: i16x4 = transmute(vqabs_s16(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabsq_s16() {
|
||||
let a: i16x8 = i16x8::new(-32768, 0x7F_FF, -6, -5, -4, -3, -2, -1);
|
||||
let e: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 6, 5, 4, 3, 2, 1);
|
||||
let r: i16x8 = transmute(vqabsq_s16(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabs_s32() {
|
||||
let a: i32x2 = i32x2::new(-2147483648, 0x7F_FF_FF_FF);
|
||||
let e: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let r: i32x2 = transmute(vqabs_s32(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqabsq_s32() {
|
||||
let a: i32x4 = i32x4::new(-2147483648, 0x7F_FF_FF_FF, -6, -5);
|
||||
let e: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 6, 5);
|
||||
let r: i32x4 = transmute(vqabsq_s32(transmute(a)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1844,3 +1844,27 @@ validate 20, 20
|
|||
|
||||
aarch64 = sabal
|
||||
generate int64x2_t:int32x4_t:int32x4_t:int64x2_t
|
||||
|
||||
////////////////////
|
||||
// Singned saturating Absolute value
|
||||
////////////////////
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
name = vqabs
|
||||
a = MIN, MAX, -6, -5, -4, -3, -2, -1, 0, -127, 127, 1, 2, 3, 4, 5
|
||||
validate MAX, MAX, 6, 5, 4, 3, 2, 1, 0, 127, 127, 1, 2, 3, 4, 5
|
||||
|
||||
arm = vqabs.s
|
||||
aarch64 = sqabs
|
||||
link-arm = vqabs._EXT_
|
||||
link-aarch64 = sqabs._EXT_
|
||||
generate int*_t
|
||||
|
||||
/// Singned saturating Absolute value
|
||||
name = vqabs
|
||||
a = MIN, -7
|
||||
validate MAX, 7
|
||||
|
||||
aarch64 = sqabs
|
||||
link-aarch64 = sqabs._EXT_
|
||||
generate int64x*_t
|
||||
Loading…
Add table
Add a link
Reference in a new issue