在霓虹灯中有效地组合面罩

时间:2018-04-21 04:57:14

标签: c++ arm intrinsics neon

作为计算的一部分,我最终将2个掩码存储在2个uint32x4_t变量中。这些来自VCEQ。为了进一步处理,我想将它们组合成单个q-reg或d-reg。做手臂霓虹的首选方法是什么?

Simple solution

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稍后会将结果屏蔽为find position of a min/max element

1 个答案:

答案 0 :(得分:2)

// aarch32
vuzp.16     mask_lo, mask_hi        // you can use either one.

// aarch64
uzp1        result.8h, mask_lo.8h, mask_hi.8h

如果您的目标包含intrinsux,则vuzp1 aarch32无用的另一个示例将无法编译。换句话说,如果你想获得最大的性能,你必须在intrinsux中编写两个版本。

intrinsux的重点是什么?与残酷简单的汇编编码相比,这太令人头疼了。