Add vqrdmulh, vqrdmlah, vqrdmlsh neon instructions
This commit is contained in:
parent
128aa9a7e5
commit
911ace84b2
5 changed files with 1395 additions and 0 deletions
|
|
@ -5343,6 +5343,174 @@ pub unsafe fn vqdmulhs_laneq_s32<const N: i32>(a: i32, b: int32x4_t) -> i32 {
|
|||
vqdmulhs_s32(a, b)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulhh_s16(a: i16, b: i16) -> i16 {
|
||||
simd_extract(vqrdmulh_s16(vdup_n_s16(a), vdup_n_s16(b)), 0)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulhs_s32(a: i32, b: i32) -> i32 {
|
||||
simd_extract(vqrdmulh_s32(vdup_n_s32(a), vdup_n_s32(b)), 0)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhh_lane_s16<const LANE: i32>(a: i16, b: int16x4_t) -> i16 {
|
||||
static_assert_imm2!(LANE);
|
||||
vqrdmulhh_s16(a, simd_extract(b, LANE as u32))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhh_laneq_s16<const LANE: i32>(a: i16, b: int16x8_t) -> i16 {
|
||||
static_assert_imm3!(LANE);
|
||||
vqrdmulhh_s16(a, simd_extract(b, LANE as u32))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhs_lane_s32<const LANE: i32>(a: i32, b: int32x2_t) -> i32 {
|
||||
static_assert_imm1!(LANE);
|
||||
vqrdmulhs_s32(a, simd_extract(b, LANE as u32))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhs_laneq_s32<const LANE: i32>(a: i32, b: int32x4_t) -> i32 {
|
||||
static_assert_imm2!(LANE);
|
||||
vqrdmulhs_s32(a, simd_extract(b, LANE as u32))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlahh_s16(a: i16, b: i16, c: i16) -> i16 {
|
||||
vqaddh_s16(a, vqrdmulhh_s16(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlahs_s32(a: i32, b: i32, c: i32) -> i32 {
|
||||
vqadds_s32(a, vqrdmulhs_s32(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahh_lane_s16<const LANE: i32>(a: i16, b: i16, c: int16x4_t) -> i16 {
|
||||
static_assert_imm2!(LANE);
|
||||
vqaddh_s16(a, vqrdmulhh_lane_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahh_laneq_s16<const LANE: i32>(a: i16, b: i16, c: int16x8_t) -> i16 {
|
||||
static_assert_imm3!(LANE);
|
||||
vqaddh_s16(a, vqrdmulhh_laneq_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahs_lane_s32<const LANE: i32>(a: i32, b: i32, c: int32x2_t) -> i32 {
|
||||
static_assert_imm1!(LANE);
|
||||
vqadds_s32(a, vqrdmulhs_lane_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahs_laneq_s32<const LANE: i32>(a: i32, b: i32, c: int32x4_t) -> i32 {
|
||||
static_assert_imm2!(LANE);
|
||||
vqadds_s32(a, vqrdmulhs_laneq_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlshh_s16(a: i16, b: i16, c: i16) -> i16 {
|
||||
vqsubh_s16(a, vqrdmulhh_s16(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlshs_s32(a: i32, b: i32, c: i32) -> i32 {
|
||||
vqsubs_s32(a, vqrdmulhs_s32(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshh_lane_s16<const LANE: i32>(a: i16, b: i16, c: int16x4_t) -> i16 {
|
||||
static_assert_imm2!(LANE);
|
||||
vqsubh_s16(a, vqrdmulhh_lane_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshh_laneq_s16<const LANE: i32>(a: i16, b: i16, c: int16x8_t) -> i16 {
|
||||
static_assert_imm3!(LANE);
|
||||
vqsubh_s16(a, vqrdmulhh_laneq_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshs_lane_s32<const LANE: i32>(a: i32, b: i32, c: int32x2_t) -> i32 {
|
||||
static_assert_imm1!(LANE);
|
||||
vqsubs_s32(a, vqrdmulhs_lane_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(test, assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshs_laneq_s32<const LANE: i32>(a: i32, b: i32, c: int32x4_t) -> i32 {
|
||||
static_assert_imm2!(LANE);
|
||||
vqsubs_s32(a, vqrdmulhs_laneq_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding shift left
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
|
|
@ -12437,6 +12605,180 @@ mod test {
|
|||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhh_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16 = 2;
|
||||
let e: i16 = 0;
|
||||
let r: i16 = transmute(vqrdmulhh_s16(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhs_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32 = 2;
|
||||
let e: i32 = 0;
|
||||
let r: i32 = transmute(vqrdmulhs_s32(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhh_lane_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16 = 0;
|
||||
let r: i16 = transmute(vqrdmulhh_lane_s16::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhh_laneq_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16 = 0;
|
||||
let r: i16 = transmute(vqrdmulhh_laneq_s16::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhs_lane_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32 = 0;
|
||||
let r: i32 = transmute(vqrdmulhs_lane_s32::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhs_laneq_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32 = 0;
|
||||
let r: i32 = transmute(vqrdmulhs_laneq_s32::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahh_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16 = 1;
|
||||
let c: i16 = 2;
|
||||
let e: i16 = 1;
|
||||
let r: i16 = transmute(vqrdmlahh_s16(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahs_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32 = 1;
|
||||
let c: i32 = 2;
|
||||
let e: i32 = 1;
|
||||
let r: i32 = transmute(vqrdmlahs_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahh_lane_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16 = 1;
|
||||
let c: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16 = 1;
|
||||
let r: i16 = transmute(vqrdmlahh_lane_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahh_laneq_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16 = 1;
|
||||
let c: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16 = 1;
|
||||
let r: i16 = transmute(vqrdmlahh_laneq_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahs_lane_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32 = 1;
|
||||
let c: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32 = 1;
|
||||
let r: i32 = transmute(vqrdmlahs_lane_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahs_laneq_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32 = 1;
|
||||
let c: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32 = 1;
|
||||
let r: i32 = transmute(vqrdmlahs_laneq_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshh_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16 = 1;
|
||||
let c: i16 = 2;
|
||||
let e: i16 = 1;
|
||||
let r: i16 = transmute(vqrdmlshh_s16(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshs_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32 = 1;
|
||||
let c: i32 = 2;
|
||||
let e: i32 = 1;
|
||||
let r: i32 = transmute(vqrdmlshs_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshh_lane_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16 = 1;
|
||||
let c: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16 = 1;
|
||||
let r: i16 = transmute(vqrdmlshh_lane_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshh_laneq_s16() {
|
||||
let a: i16 = 1;
|
||||
let b: i16 = 1;
|
||||
let c: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16 = 1;
|
||||
let r: i16 = transmute(vqrdmlshh_laneq_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshs_lane_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32 = 1;
|
||||
let c: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32 = 1;
|
||||
let r: i32 = transmute(vqrdmlshs_lane_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshs_laneq_s32() {
|
||||
let a: i32 = 1;
|
||||
let b: i32 = 1;
|
||||
let c: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32 = 1;
|
||||
let r: i32 = transmute(vqrdmlshs_laneq_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrshlb_s8() {
|
||||
let a: i8 = 1;
|
||||
|
|
|
|||
|
|
@ -7714,6 +7714,486 @@ pub unsafe fn vqdmulhq_nq_s32(a: int32x4_t, b: i32) -> int32x4_t {
|
|||
vqdmulhq_s32(a, b)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulh_s16(a: int16x4_t, b: int16x4_t) -> int16x4_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqrdmulh.v4i16")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqrdmulh.v4i16")]
|
||||
fn vqrdmulh_s16_(a: int16x4_t, b: int16x4_t) -> int16x4_t;
|
||||
}
|
||||
vqrdmulh_s16_(a, b)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulhq_s16(a: int16x8_t, b: int16x8_t) -> int16x8_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqrdmulh.v8i16")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqrdmulh.v8i16")]
|
||||
fn vqrdmulhq_s16_(a: int16x8_t, b: int16x8_t) -> int16x8_t;
|
||||
}
|
||||
vqrdmulhq_s16_(a, b)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulh_s32(a: int32x2_t, b: int32x2_t) -> int32x2_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqrdmulh.v2i32")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqrdmulh.v2i32")]
|
||||
fn vqrdmulh_s32_(a: int32x2_t, b: int32x2_t) -> int32x2_t;
|
||||
}
|
||||
vqrdmulh_s32_(a, b)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulhq_s32(a: int32x4_t, b: int32x4_t) -> int32x4_t {
|
||||
#[allow(improper_ctypes)]
|
||||
extern "C" {
|
||||
#[cfg_attr(target_arch = "arm", link_name = "llvm.arm.neon.vqrdmulh.v4i32")]
|
||||
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.sqrdmulh.v4i32")]
|
||||
fn vqrdmulhq_s32_(a: int32x4_t, b: int32x4_t) -> int32x4_t;
|
||||
}
|
||||
vqrdmulhq_s32_(a, b)
|
||||
}
|
||||
|
||||
/// Vector saturating rounding doubling multiply high with scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulh_n_s16(a: int16x4_t, b: i16) -> int16x4_t {
|
||||
vqrdmulh_s16(a, vdup_n_s16(b))
|
||||
}
|
||||
|
||||
/// Vector saturating rounding doubling multiply high with scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulhq_n_s16(a: int16x8_t, b: i16) -> int16x8_t {
|
||||
vqrdmulhq_s16(a, vdupq_n_s16(b))
|
||||
}
|
||||
|
||||
/// Vector saturating rounding doubling multiply high with scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulh_n_s32(a: int32x2_t, b: i32) -> int32x2_t {
|
||||
vqrdmulh_s32(a, vdup_n_s32(b))
|
||||
}
|
||||
|
||||
/// Vector saturating rounding doubling multiply high with scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmulhq_n_s32(a: int32x4_t, b: i32) -> int32x4_t {
|
||||
vqrdmulhq_s32(a, vdupq_n_s32(b))
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulh_lane_s16<const LANE: i32>(a: int16x4_t, b: int16x4_t) -> int16x4_t {
|
||||
static_assert_imm2!(LANE);
|
||||
let b: int16x4_t = simd_shuffle4(b, b, [LANE as u32, LANE as u32, LANE as u32, LANE as u32]);
|
||||
vqrdmulh_s16(a, b)
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulh_laneq_s16<const LANE: i32>(a: int16x4_t, b: int16x8_t) -> int16x4_t {
|
||||
static_assert_imm3!(LANE);
|
||||
let b: int16x4_t = simd_shuffle4(b, b, [LANE as u32, LANE as u32, LANE as u32, LANE as u32]);
|
||||
vqrdmulh_s16(a, b)
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhq_lane_s16<const LANE: i32>(a: int16x8_t, b: int16x4_t) -> int16x8_t {
|
||||
static_assert_imm2!(LANE);
|
||||
let b: int16x8_t = simd_shuffle8(b, b, [LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32]);
|
||||
vqrdmulhq_s16(a, b)
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhq_laneq_s16<const LANE: i32>(a: int16x8_t, b: int16x8_t) -> int16x8_t {
|
||||
static_assert_imm3!(LANE);
|
||||
let b: int16x8_t = simd_shuffle8(b, b, [LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32, LANE as u32]);
|
||||
vqrdmulhq_s16(a, b)
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulh_lane_s32<const LANE: i32>(a: int32x2_t, b: int32x2_t) -> int32x2_t {
|
||||
static_assert_imm1!(LANE);
|
||||
let b: int32x2_t = simd_shuffle2(b, b, [LANE as u32, LANE as u32]);
|
||||
vqrdmulh_s32(a, b)
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulh_laneq_s32<const LANE: i32>(a: int32x2_t, b: int32x4_t) -> int32x2_t {
|
||||
static_assert_imm2!(LANE);
|
||||
let b: int32x2_t = simd_shuffle2(b, b, [LANE as u32, LANE as u32]);
|
||||
vqrdmulh_s32(a, b)
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhq_lane_s32<const LANE: i32>(a: int32x4_t, b: int32x2_t) -> int32x4_t {
|
||||
static_assert_imm1!(LANE);
|
||||
let b: int32x4_t = simd_shuffle4(b, b, [LANE as u32, LANE as u32, LANE as u32, LANE as u32]);
|
||||
vqrdmulhq_s32(a, b)
|
||||
}
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
pub unsafe fn vqrdmulhq_laneq_s32<const LANE: i32>(a: int32x4_t, b: int32x4_t) -> int32x4_t {
|
||||
static_assert_imm2!(LANE);
|
||||
let b: int32x4_t = simd_shuffle4(b, b, [LANE as u32, LANE as u32, LANE as u32, LANE as u32]);
|
||||
vqrdmulhq_s32(a, b)
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlah_s16(a: int16x4_t, b: int16x4_t, c: int16x4_t) -> int16x4_t {
|
||||
vqadd_s16(a, vqrdmulh_s16(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlahq_s16(a: int16x8_t, b: int16x8_t, c: int16x8_t) -> int16x8_t {
|
||||
vqaddq_s16(a, vqrdmulhq_s16(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlah_s32(a: int32x2_t, b: int32x2_t, c: int32x2_t) -> int32x2_t {
|
||||
vqadd_s32(a, vqrdmulh_s32(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlahq_s32(a: int32x4_t, b: int32x4_t, c: int32x4_t) -> int32x4_t {
|
||||
vqaddq_s32(a, vqrdmulhq_s32(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlah_lane_s16<const LANE: i32>(a: int16x4_t, b: int16x4_t, c: int16x4_t) -> int16x4_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqadd_s16(a, vqrdmulh_lane_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlah_laneq_s16<const LANE: i32>(a: int16x4_t, b: int16x4_t, c: int16x8_t) -> int16x4_t {
|
||||
static_assert_imm3!(LANE);
|
||||
vqadd_s16(a, vqrdmulh_laneq_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahq_lane_s16<const LANE: i32>(a: int16x8_t, b: int16x8_t, c: int16x4_t) -> int16x8_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqaddq_s16(a, vqrdmulhq_lane_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahq_laneq_s16<const LANE: i32>(a: int16x8_t, b: int16x8_t, c: int16x8_t) -> int16x8_t {
|
||||
static_assert_imm3!(LANE);
|
||||
vqaddq_s16(a, vqrdmulhq_laneq_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlah_lane_s32<const LANE: i32>(a: int32x2_t, b: int32x2_t, c: int32x2_t) -> int32x2_t {
|
||||
static_assert_imm1!(LANE);
|
||||
vqadd_s32(a, vqrdmulh_lane_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlah_laneq_s32<const LANE: i32>(a: int32x2_t, b: int32x2_t, c: int32x4_t) -> int32x2_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqadd_s32(a, vqrdmulh_laneq_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahq_lane_s32<const LANE: i32>(a: int32x4_t, b: int32x4_t, c: int32x2_t) -> int32x4_t {
|
||||
static_assert_imm1!(LANE);
|
||||
vqaddq_s32(a, vqrdmulhq_lane_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlahq_laneq_s32<const LANE: i32>(a: int32x4_t, b: int32x4_t, c: int32x4_t) -> int32x4_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqaddq_s32(a, vqrdmulhq_laneq_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlsh_s16(a: int16x4_t, b: int16x4_t, c: int16x4_t) -> int16x4_t {
|
||||
vqsub_s16(a, vqrdmulh_s16(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlshq_s16(a: int16x8_t, b: int16x8_t, c: int16x8_t) -> int16x8_t {
|
||||
vqsubq_s16(a, vqrdmulhq_s16(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlsh_s32(a: int32x2_t, b: int32x2_t, c: int32x2_t) -> int32x2_t {
|
||||
vqsub_s32(a, vqrdmulh_s32(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh))]
|
||||
pub unsafe fn vqrdmlshq_s32(a: int32x4_t, b: int32x4_t, c: int32x4_t) -> int32x4_t {
|
||||
vqsubq_s32(a, vqrdmulhq_s32(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlsh_lane_s16<const LANE: i32>(a: int16x4_t, b: int16x4_t, c: int16x4_t) -> int16x4_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqsub_s16(a, vqrdmulh_lane_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlsh_laneq_s16<const LANE: i32>(a: int16x4_t, b: int16x4_t, c: int16x8_t) -> int16x4_t {
|
||||
static_assert_imm3!(LANE);
|
||||
vqsub_s16(a, vqrdmulh_laneq_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshq_lane_s16<const LANE: i32>(a: int16x8_t, b: int16x8_t, c: int16x4_t) -> int16x8_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqsubq_s16(a, vqrdmulhq_lane_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshq_laneq_s16<const LANE: i32>(a: int16x8_t, b: int16x8_t, c: int16x8_t) -> int16x8_t {
|
||||
static_assert_imm3!(LANE);
|
||||
vqsubq_s16(a, vqrdmulhq_laneq_s16::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlsh_lane_s32<const LANE: i32>(a: int32x2_t, b: int32x2_t, c: int32x2_t) -> int32x2_t {
|
||||
static_assert_imm1!(LANE);
|
||||
vqsub_s32(a, vqrdmulh_lane_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlsh_laneq_s32<const LANE: i32>(a: int32x2_t, b: int32x2_t, c: int32x4_t) -> int32x2_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqsub_s32(a, vqrdmulh_laneq_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshq_lane_s32<const LANE: i32>(a: int32x4_t, b: int32x4_t, c: int32x2_t) -> int32x4_t {
|
||||
static_assert_imm1!(LANE);
|
||||
vqsubq_s32(a, vqrdmulhq_lane_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vqrdmulh, LANE = 1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(sqrdmulh, LANE = 1))]
|
||||
#[rustc_legacy_const_generics(3)]
|
||||
pub unsafe fn vqrdmlshq_laneq_s32<const LANE: i32>(a: int32x4_t, b: int32x4_t, c: int32x4_t) -> int32x4_t {
|
||||
static_assert_imm2!(LANE);
|
||||
vqsubq_s32(a, vqrdmulhq_laneq_s32::<LANE>(b, c))
|
||||
}
|
||||
|
||||
/// Signed saturating rounding shift left
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon")]
|
||||
|
|
@ -19064,6 +19544,390 @@ mod test {
|
|||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_s16() {
|
||||
let a: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16x4 = i16x4::new(2, 2, 2, 2);
|
||||
let e: i16x4 = i16x4::new(2, 2, 2, 2);
|
||||
let r: i16x4 = transmute(vqrdmulh_s16(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_s16() {
|
||||
let a: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16x8 = i16x8::new(2, 2, 2, 2, 2, 2, 2, 2);
|
||||
let e: i16x8 = i16x8::new(2, 2, 2, 2, 2, 2, 2, 2);
|
||||
let r: i16x8 = transmute(vqrdmulhq_s16(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_s32() {
|
||||
let a: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32x2 = i32x2::new(2, 2);
|
||||
let e: i32x2 = i32x2::new(2, 2);
|
||||
let r: i32x2 = transmute(vqrdmulh_s32(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_s32() {
|
||||
let a: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32x4 = i32x4::new(2, 2, 2, 2);
|
||||
let e: i32x4 = i32x4::new(2, 2, 2, 2);
|
||||
let r: i32x4 = transmute(vqrdmulhq_s32(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_n_s16() {
|
||||
let a: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16 = 2;
|
||||
let e: i16x4 = i16x4::new(2, 2, 2, 2);
|
||||
let r: i16x4 = transmute(vqrdmulh_n_s16(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_n_s16() {
|
||||
let a: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16 = 2;
|
||||
let e: i16x8 = i16x8::new(2, 2, 2, 2, 2, 2, 2, 2);
|
||||
let r: i16x8 = transmute(vqrdmulhq_n_s16(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_n_s32() {
|
||||
let a: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32 = 2;
|
||||
let e: i32x2 = i32x2::new(2, 2);
|
||||
let r: i32x2 = transmute(vqrdmulh_n_s32(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_n_s32() {
|
||||
let a: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32 = 2;
|
||||
let e: i32x4 = i32x4::new(2, 2, 2, 2);
|
||||
let r: i32x4 = transmute(vqrdmulhq_n_s32(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_lane_s16() {
|
||||
let a: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16x4 = i16x4::new(2, 2, 2, 2);
|
||||
let r: i16x4 = transmute(vqrdmulh_lane_s16::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_laneq_s16() {
|
||||
let a: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16x4 = i16x4::new(2, 2, 2, 2);
|
||||
let r: i16x4 = transmute(vqrdmulh_laneq_s16::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_lane_s16() {
|
||||
let a: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16x8 = i16x8::new(2, 2, 2, 2, 2, 2, 2, 2);
|
||||
let r: i16x8 = transmute(vqrdmulhq_lane_s16::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_laneq_s16() {
|
||||
let a: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let b: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16x8 = i16x8::new(2, 2, 2, 2, 2, 2, 2, 2);
|
||||
let r: i16x8 = transmute(vqrdmulhq_laneq_s16::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_lane_s32() {
|
||||
let a: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32x2 = i32x2::new(2, 2);
|
||||
let r: i32x2 = transmute(vqrdmulh_lane_s32::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulh_laneq_s32() {
|
||||
let a: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32x2 = i32x2::new(2, 2);
|
||||
let r: i32x2 = transmute(vqrdmulh_laneq_s32::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_lane_s32() {
|
||||
let a: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32x4 = i32x4::new(2, 2, 2, 2);
|
||||
let r: i32x4 = transmute(vqrdmulhq_lane_s32::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmulhq_laneq_s32() {
|
||||
let a: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let b: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32x4 = i32x4::new(2, 2, 2, 2);
|
||||
let r: i32x4 = transmute(vqrdmulhq_laneq_s32::<1>(transmute(a), transmute(b)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlah_s16() {
|
||||
let a: i16x4 = i16x4::new(1, 1, 1, 1);
|
||||
let b: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x4 = i16x4::new(2, 2, 2, 2);
|
||||
let e: i16x4 = i16x4::new(3, 3, 3, 3);
|
||||
let r: i16x4 = transmute(vqrdmlah_s16(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahq_s16() {
|
||||
let a: i16x8 = i16x8::new(1, 1, 1, 1, 1, 1, 1, 1);
|
||||
let b: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x8 = i16x8::new(2, 2, 2, 2, 2, 2, 2, 2);
|
||||
let e: i16x8 = i16x8::new(3, 3, 3, 3, 3, 3, 3, 3);
|
||||
let r: i16x8 = transmute(vqrdmlahq_s16(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlah_s32() {
|
||||
let a: i32x2 = i32x2::new(1, 1);
|
||||
let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x2 = i32x2::new(2, 2);
|
||||
let e: i32x2 = i32x2::new(3, 3);
|
||||
let r: i32x2 = transmute(vqrdmlah_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahq_s32() {
|
||||
let a: i32x4 = i32x4::new(1, 1, 1, 1);
|
||||
let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x4 = i32x4::new(2, 2, 2, 2);
|
||||
let e: i32x4 = i32x4::new(3, 3, 3, 3);
|
||||
let r: i32x4 = transmute(vqrdmlahq_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlah_lane_s16() {
|
||||
let a: i16x4 = i16x4::new(1, 1, 1, 1);
|
||||
let b: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16x4 = i16x4::new(3, 3, 3, 3);
|
||||
let r: i16x4 = transmute(vqrdmlah_lane_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlah_laneq_s16() {
|
||||
let a: i16x4 = i16x4::new(1, 1, 1, 1);
|
||||
let b: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16x4 = i16x4::new(3, 3, 3, 3);
|
||||
let r: i16x4 = transmute(vqrdmlah_laneq_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahq_lane_s16() {
|
||||
let a: i16x8 = i16x8::new(1, 1, 1, 1, 1, 1, 1, 1);
|
||||
let b: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16x8 = i16x8::new(3, 3, 3, 3, 3, 3, 3, 3);
|
||||
let r: i16x8 = transmute(vqrdmlahq_lane_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahq_laneq_s16() {
|
||||
let a: i16x8 = i16x8::new(1, 1, 1, 1, 1, 1, 1, 1);
|
||||
let b: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16x8 = i16x8::new(3, 3, 3, 3, 3, 3, 3, 3);
|
||||
let r: i16x8 = transmute(vqrdmlahq_laneq_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlah_lane_s32() {
|
||||
let a: i32x2 = i32x2::new(1, 1);
|
||||
let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32x2 = i32x2::new(3, 3);
|
||||
let r: i32x2 = transmute(vqrdmlah_lane_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlah_laneq_s32() {
|
||||
let a: i32x2 = i32x2::new(1, 1);
|
||||
let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32x2 = i32x2::new(3, 3);
|
||||
let r: i32x2 = transmute(vqrdmlah_laneq_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahq_lane_s32() {
|
||||
let a: i32x4 = i32x4::new(1, 1, 1, 1);
|
||||
let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32x4 = i32x4::new(3, 3, 3, 3);
|
||||
let r: i32x4 = transmute(vqrdmlahq_lane_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlahq_laneq_s32() {
|
||||
let a: i32x4 = i32x4::new(1, 1, 1, 1);
|
||||
let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32x4 = i32x4::new(3, 3, 3, 3);
|
||||
let r: i32x4 = transmute(vqrdmlahq_laneq_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlsh_s16() {
|
||||
let a: i16x4 = i16x4::new(1, 1, 1, 1);
|
||||
let b: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x4 = i16x4::new(2, 2, 2, 2);
|
||||
let e: i16x4 = i16x4::new(-1, -1, -1, -1);
|
||||
let r: i16x4 = transmute(vqrdmlsh_s16(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshq_s16() {
|
||||
let a: i16x8 = i16x8::new(1, 1, 1, 1, 1, 1, 1, 1);
|
||||
let b: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x8 = i16x8::new(2, 2, 2, 2, 2, 2, 2, 2);
|
||||
let e: i16x8 = i16x8::new(-1, -1, -1, -1, -1, -1, -1, -1);
|
||||
let r: i16x8 = transmute(vqrdmlshq_s16(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlsh_s32() {
|
||||
let a: i32x2 = i32x2::new(1, 1);
|
||||
let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x2 = i32x2::new(2, 2);
|
||||
let e: i32x2 = i32x2::new(-1, -1);
|
||||
let r: i32x2 = transmute(vqrdmlsh_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshq_s32() {
|
||||
let a: i32x4 = i32x4::new(1, 1, 1, 1);
|
||||
let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x4 = i32x4::new(2, 2, 2, 2);
|
||||
let e: i32x4 = i32x4::new(-1, -1, -1, -1);
|
||||
let r: i32x4 = transmute(vqrdmlshq_s32(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlsh_lane_s16() {
|
||||
let a: i16x4 = i16x4::new(1, 1, 1, 1);
|
||||
let b: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16x4 = i16x4::new(-1, -1, -1, -1);
|
||||
let r: i16x4 = transmute(vqrdmlsh_lane_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlsh_laneq_s16() {
|
||||
let a: i16x4 = i16x4::new(1, 1, 1, 1);
|
||||
let b: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16x4 = i16x4::new(-1, -1, -1, -1);
|
||||
let r: i16x4 = transmute(vqrdmlsh_laneq_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshq_lane_s16() {
|
||||
let a: i16x8 = i16x8::new(1, 1, 1, 1, 1, 1, 1, 1);
|
||||
let b: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x4 = i16x4::new(0, 2, 0, 0);
|
||||
let e: i16x8 = i16x8::new(-1, -1, -1, -1, -1, -1, -1, -1);
|
||||
let r: i16x8 = transmute(vqrdmlshq_lane_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshq_laneq_s16() {
|
||||
let a: i16x8 = i16x8::new(1, 1, 1, 1, 1, 1, 1, 1);
|
||||
let b: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF, 0x7F_FF);
|
||||
let c: i16x8 = i16x8::new(0, 2, 0, 0, 0, 0, 0, 0);
|
||||
let e: i16x8 = i16x8::new(-1, -1, -1, -1, -1, -1, -1, -1);
|
||||
let r: i16x8 = transmute(vqrdmlshq_laneq_s16::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlsh_lane_s32() {
|
||||
let a: i32x2 = i32x2::new(1, 1);
|
||||
let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32x2 = i32x2::new(-1, -1);
|
||||
let r: i32x2 = transmute(vqrdmlsh_lane_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlsh_laneq_s32() {
|
||||
let a: i32x2 = i32x2::new(1, 1);
|
||||
let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32x2 = i32x2::new(-1, -1);
|
||||
let r: i32x2 = transmute(vqrdmlsh_laneq_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshq_lane_s32() {
|
||||
let a: i32x4 = i32x4::new(1, 1, 1, 1);
|
||||
let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x2 = i32x2::new(0, 2);
|
||||
let e: i32x4 = i32x4::new(-1, -1, -1, -1);
|
||||
let r: i32x4 = transmute(vqrdmlshq_lane_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrdmlshq_laneq_s32() {
|
||||
let a: i32x4 = i32x4::new(1, 1, 1, 1);
|
||||
let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x7F_FF_FF_FF);
|
||||
let c: i32x4 = i32x4::new(0, 2, 0, 0);
|
||||
let e: i32x4 = i32x4::new(-1, -1, -1, -1);
|
||||
let r: i32x4 = transmute(vqrdmlshq_laneq_s32::<1>(transmute(a), transmute(b), transmute(c)));
|
||||
assert_eq!(r, e);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_vqrshl_s8() {
|
||||
let a: i8x8 = i8x8::new(-128, 0x7F, 2, 3, 4, 5, 6, 7);
|
||||
|
|
|
|||
|
|
@ -3202,6 +3202,181 @@ validate 1
|
|||
aarch64 = sqdmulh
|
||||
generate i32:int32x2_t:i32, i32:int32x4_t:i32
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
name = vqrdmulh
|
||||
a = MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX
|
||||
b = 2, 2, 2, 2, 2, 2, 2, 2
|
||||
validate 2, 2, 2, 2, 2, 2, 2, 2
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
link-aarch64 = sqrdmulh._EXT_
|
||||
arm = vqrdmulh
|
||||
link-arm = vqrdmulh._EXT_
|
||||
generate int16x4_t, int16x8_t, int32x2_t, int32x4_t
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
name = vqrdmulh
|
||||
multi_fn = simd_extract, {vqrdmulh-in_ntt-noext, {vdup_n-in_ntt-noext, a}, {vdup_n-in_ntt-noext, b}}, 0
|
||||
a = 1
|
||||
b = 2
|
||||
validate 0
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
generate i16, i32
|
||||
|
||||
/// Vector saturating rounding doubling multiply high with scalar
|
||||
name = vqrdmulh
|
||||
out-n-suffix
|
||||
multi_fn = vqrdmulh-out-noext, a, {vdup-nout-noext, b}
|
||||
a = MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX
|
||||
b = 2
|
||||
validate 2, 2, 2, 2, 2, 2, 2, 2
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
arm = vqrdmulh
|
||||
generate int16x4_t:i16:int16x4_t, int16x8_t:i16:int16x8_t, int32x2_t:i32:int32x2_t, int32x4_t:i32:int32x4_t
|
||||
|
||||
/// Vector rounding saturating doubling multiply high by scalar
|
||||
name = vqrdmulh
|
||||
lane-suffixes
|
||||
constn = LANE
|
||||
multi_fn = static_assert_imm-in_exp_len-LANE
|
||||
multi_fn = simd_shuffle-out_len-noext, b:out_t, b, b, {dup-out_len-LANE as u32}
|
||||
multi_fn = vqrdmulh-out-noext, a, b
|
||||
a = MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX
|
||||
b = 0, 2, 0, 0, 0, 0, 0, 0,
|
||||
n = 1
|
||||
validate 2, 2, 2, 2, 2, 2, 2, 2
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
arm = vqrdmulh
|
||||
generate int16x4_t, int16x4_t:int16x8_t:int16x4_t, int16x8_t:int16x4_t:int16x8_t, int16x8_t
|
||||
generate int32x2_t, int32x2_t:int32x4_t:int32x2_t, int32x4_t:int32x2_t:int32x4_t, int32x4_t
|
||||
|
||||
/// Signed saturating rounding doubling multiply returning high half
|
||||
name = vqrdmulh
|
||||
lane-suffixes
|
||||
constn = LANE
|
||||
multi_fn = static_assert_imm-in_exp_len-LANE
|
||||
multi_fn = vqrdmulh-out-noext, a, {simd_extract, b, LANE as u32}
|
||||
a = 1
|
||||
b = 0, 2, 0, 0, 0, 0, 0, 0,
|
||||
n = 1
|
||||
validate 0
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
generate i16:int16x4_t:i16, i16:int16x8_t:i16, i32:int32x2_t:i32, i32:int32x4_t:i32
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
name = vqrdmlah
|
||||
multi_fn = vqadd-out-noext, a, {vqrdmulh-out-noext, b, c}
|
||||
a = 1, 1, 1, 1, 1, 1, 1, 1
|
||||
b = MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX
|
||||
c = 2, 2, 2, 2, 2, 2, 2, 2
|
||||
validate 3, 3, 3, 3, 3, 3, 3, 3
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
arm = vqrdmulh
|
||||
generate int16x4_t, int16x8_t, int32x2_t, int32x4_t
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
name = vqrdmlah
|
||||
multi_fn = vqadd-self-noext, a, {vqrdmulh-self-noext, b, c}
|
||||
a = 1
|
||||
b = 1
|
||||
c = 2
|
||||
validate 1
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
generate i16, i32
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
name = vqrdmlah
|
||||
in2-lane-suffixes
|
||||
constn = LANE
|
||||
multi_fn = static_assert_imm-in2_exp_len-LANE
|
||||
multi_fn = vqadd-self-noext, a, {vqrdmulh-in2lane-::<LANE>, b, c}
|
||||
a = 1, 1, 1, 1, 1, 1, 1, 1
|
||||
b = MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX
|
||||
c = 0, 2, 0, 0, 0, 0, 0, 0
|
||||
n = 1
|
||||
validate 3, 3, 3, 3, 3, 3, 3, 3
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
arm = vqrdmulh
|
||||
generate int16x4_t, int16x4_t:int16x4_t:int16x8_t:int16x4_t, int16x8_t:int16x8_t:int16x4_t:int16x8_t, int16x8_t
|
||||
generate int32x2_t, int32x2_t:int32x2_t:int32x4_t:int32x2_t, int32x4_t:int32x4_t:int32x2_t:int32x4_t, int32x4_t
|
||||
|
||||
/// Signed saturating rounding doubling multiply accumulate returning high half
|
||||
name = vqrdmlah
|
||||
in2-lane-suffixes
|
||||
constn = LANE
|
||||
multi_fn = static_assert_imm-in2_exp_len-LANE
|
||||
multi_fn = vqadd-self-noext, a, {vqrdmulh-in2lane-::<LANE>, b, c}
|
||||
a = 1
|
||||
b = 1
|
||||
c = 0, 2, 0, 0, 0, 0, 0, 0
|
||||
n = 1
|
||||
validate 1
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
generate i16:i16:int16x4_t:i16, i16:i16:int16x8_t:i16, i32:i32:int32x2_t:i32, i32:i32:int32x4_t:i32
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
name = vqrdmlsh
|
||||
multi_fn = vqsub-out-noext, a, {vqrdmulh-out-noext, b, c}
|
||||
a = 1, 1, 1, 1, 1, 1, 1, 1
|
||||
b = MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX
|
||||
c = 2, 2, 2, 2, 2, 2, 2, 2
|
||||
validate -1, -1, -1, -1, -1, -1, -1, -1
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
arm = vqrdmulh
|
||||
generate int16x4_t, int16x8_t, int32x2_t, int32x4_t
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
name = vqrdmlsh
|
||||
multi_fn = vqsub-self-noext, a, {vqrdmulh-self-noext, b, c}
|
||||
a = 1
|
||||
b = 1
|
||||
c = 2
|
||||
validate 1
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
generate i16, i32
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
name = vqrdmlsh
|
||||
in2-lane-suffixes
|
||||
constn = LANE
|
||||
multi_fn = static_assert_imm-in2_exp_len-LANE
|
||||
multi_fn = vqsub-self-noext, a, {vqrdmulh-in2lane-::<LANE>, b, c}
|
||||
a = 1, 1, 1, 1, 1, 1, 1, 1
|
||||
b = MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX
|
||||
c = 0, 2, 0, 0, 0, 0, 0, 0
|
||||
n = 1
|
||||
validate -1, -1, -1, -1, -1, -1, -1, -1
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
arm = vqrdmulh
|
||||
generate int16x4_t, int16x4_t:int16x4_t:int16x8_t:int16x4_t, int16x8_t:int16x8_t:int16x4_t:int16x8_t, int16x8_t
|
||||
generate int32x2_t, int32x2_t:int32x2_t:int32x4_t:int32x2_t, int32x4_t:int32x4_t:int32x2_t:int32x4_t, int32x4_t
|
||||
|
||||
/// Signed saturating rounding doubling multiply subtract returning high half
|
||||
name = vqrdmlsh
|
||||
in2-lane-suffixes
|
||||
constn = LANE
|
||||
multi_fn = static_assert_imm-in2_exp_len-LANE
|
||||
multi_fn = vqsub-self-noext, a, {vqrdmulh-in2lane-::<LANE>, b, c}
|
||||
a = 1
|
||||
b = 1
|
||||
c = 0, 2, 0, 0, 0, 0, 0, 0
|
||||
n = 1
|
||||
validate 1
|
||||
|
||||
aarch64 = sqrdmulh
|
||||
generate i16:i16:int16x4_t:i16, i16:i16:int16x8_t:i16, i32:i32:int32x2_t:i32, i32:i32:int32x4_t:i32
|
||||
|
||||
/// Signed saturating rounding shift left
|
||||
name = vqrshl
|
||||
a = MIN, MAX, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
|
||||
|
|
|
|||
|
|
@ -2243,6 +2243,8 @@ fn get_call(
|
|||
fn_name.push_str(type_to_suffix(in_t[0]));
|
||||
} else if fn_format[1] == "in2" {
|
||||
fn_name.push_str(type_to_suffix(in_t[2]));
|
||||
} else if fn_format[1] == "in2lane" {
|
||||
fn_name.push_str(&type_to_lane_suffixes(out_t, in_t[2]));
|
||||
} else if fn_format[1] == "signed" {
|
||||
fn_name.push_str(type_to_suffix(type_to_signed(in_t[1])));
|
||||
} else if fn_format[1] == "unsigned" {
|
||||
|
|
|
|||
|
|
@ -487,6 +487,18 @@ fn verify_all_signatures() {
|
|||
"vreinterpret_p64_s64",
|
||||
"vreinterpret_f32_p64",
|
||||
"vreinterpretq_f32_p64",
|
||||
"vqrdmlahh_s16",
|
||||
"vqrdmlahs_s32",
|
||||
"vqrdmlahh_lane_s16",
|
||||
"vqrdmlahh_laneq_s16",
|
||||
"vqrdmlahs_lane_s32",
|
||||
"vqrdmlahs_laneq_s32",
|
||||
"vqrdmlshh_s16",
|
||||
"vqrdmlshs_s32",
|
||||
"vqrdmlshh_lane_s16",
|
||||
"vqrdmlshh_laneq_s16",
|
||||
"vqrdmlshs_lane_s32",
|
||||
"vqrdmlshs_laneq_s32",
|
||||
"__dbg",
|
||||
];
|
||||
let arm = match map.get(rust.name) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue