ARMv7 NEON:将 32 位掩码解压为 64 位掩码

ARMv7 NEON: Unpack 32 bit mask to 64 bit mask

我有一个 32 位 NEON 掩码,我需要将其解压缩为 64 位,如下所示:

uint32x4_t mask = { 0xFFFFFFFF, 0xFFFFFFFF, 0, 0 };
uint64x2_t mask_lo = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF };
uint64x2_t mask_hi = { 0, 0 };

到目前为止我想到的是:

uint64x2_t mask_lo = vmovl_u32(vget_low_u32(mask));    // { 0x00000000FFFFFFFF, 0x00000000FFFFFFFF }
uint64x2_t mask_hi = vmovl_u32(vget_high_u32(mask));   // { 0, 0 }

问题是,它缺少 1 的前两个字节。我认为它可以用 vtstq_u64 解决,但我正在使用 ARMv7,所以遗憾的是它对我来说不可用。

谢谢!

编辑: 我的位掩码元素全为 1 或全为 0!

编辑 2: 我只是用了 vmovl_s32 而不是 vmovl_u32:

mask_lo = vmovl_s32(vget_low_s32(vreinterpretq_s32_u32(mask)));
mask_hi = vmovl_s32(vget_high_s32(vreinterpretq_s32_u32(mask)));

不清楚为什么要 0xFFFFFFFF 解压成 0xFFFFFFFFFFFFFFFF

如果你想扩展符号,使用重新解释内在函数,vmovl_s32 用于解包。这会将 0x80000000 解压为 0xFFFFFFFF80000000

如果您想复制 uint32_t 泳道,请在两个参数中对源向量使用 vzipq_u32 内在函数。这会将 0x80000000 解压为 0x8000000080000000