在手臂霓虹灯中有效地结合面具
Efficiently combine masks in arm neon
作为计算的一部分,我最终将 2 个掩码存储在 2 个 uint32x4_t 变量中。这些来自 VCEQ。为了进一步处理,我想将它们组合成一个 q-reg 或 d-reg。在 arm neon 中,首选的方法是什么?
uint16x8_t combineMasks(uint32x4_t mask_lo, uint32x4_t mask_hi)
{
uint16x4_t lo = vmovn_u32(mask_lo);
uint16x4_t hi = vmovn_u32(mask_hi);
return vcombine_u16(lo, hi);
}
有更好的方法吗?在我的例子中,我 vand
稍后将结果掩码与 .
的一些值
// aarch32
vuzp.16 mask_lo, mask_hi // you can use either one.
// aarch64
uzp1 result.8h, mask_lo.8h, mask_hi.8h
关于 intrinsux
无用的另一个示例:如果您的目标包含 aarch32
,vuzp1
将无法编译。换句话说,如果你想要最大的性能,无论如何你都必须在 intrinsux
中编写两个版本。
intrinsux
有什么意义?比起简单粗暴的汇编编码,实在是太头疼了。
作为计算的一部分,我最终将 2 个掩码存储在 2 个 uint32x4_t 变量中。这些来自 VCEQ。为了进一步处理,我想将它们组合成一个 q-reg 或 d-reg。在 arm neon 中,首选的方法是什么?
uint16x8_t combineMasks(uint32x4_t mask_lo, uint32x4_t mask_hi)
{
uint16x4_t lo = vmovn_u32(mask_lo);
uint16x4_t hi = vmovn_u32(mask_hi);
return vcombine_u16(lo, hi);
}
有更好的方法吗?在我的例子中,我 vand
稍后将结果掩码与
// aarch32
vuzp.16 mask_lo, mask_hi // you can use either one.
// aarch64
uzp1 result.8h, mask_lo.8h, mask_hi.8h
关于 intrinsux
无用的另一个示例:如果您的目标包含 aarch32
,vuzp1
将无法编译。换句话说,如果你想要最大的性能,无论如何你都必须在 intrinsux
中编写两个版本。
intrinsux
有什么意义?比起简单粗暴的汇编编码,实在是太头疼了。