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
我有一个 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