macro_rules! arm_128_v7_neon_impl {
($id:ident, $half:ident, $vpmin:ident, $vpmax:ident) => {
impl All for $id {
#[inline]
#[target_feature(enable = "v7,neon")]
unsafe fn all(self) -> bool {
use crate::arch::arm::$vpmin;
use crate::mem::transmute;
union U {
halves: ($half, $half),
vec: $id,
}
let halves = U { vec: self }.halves;
let h: $half = transmute($vpmin(
transmute(halves.0),
transmute(halves.1),
));
h.all()
}
}
impl Any for $id {
#[inline]
#[target_feature(enable = "v7,neon")]
unsafe fn any(self) -> bool {
use crate::arch::arm::$vpmax;
use crate::mem::transmute;
union U {
halves: ($half, $half),
vec: $id,
}
let halves = U { vec: self }.halves;
let h: $half = transmute($vpmax(
transmute(halves.0),
transmute(halves.1),
));
h.any()
}
}
};
}
macro_rules! impl_mask_reductions {
(m8x16) => { arm_128_v7_neon_impl!(m8x16, m8x8, vpmin_u8, vpmax_u8); };
(m16x8) => { arm_128_v7_neon_impl!(m16x8, m16x4, vpmin_u16, vpmax_u16); };
(m32x4) => { arm_128_v7_neon_impl!(m32x4, m32x2, vpmin_u32, vpmax_u32); };
($id:ident) => { fallback_impl!($id); };
}