在uint8x8霓虹灯矢量的所有通道上执行水平逻辑/按位AND运算

时间:2017-10-24 05:46:30

标签: arm simd neon

我有一个uint8x8霓虹灯矢量,这是一些操作的结果。我需要对所有通道执行逻辑AND操作以获得最终结果。每个元素都是0xff(TRUE)或0x00(FALSE)。我如何在霓虹灯中执行它?

2 个答案:

答案 0 :(得分:1)

简单/明显的方法(伪代码):

v = VAND(v, v >> 8)
v = VAND(v, v >> 16)
v = VAND(v, v >> 32)

3 x移位和3 x按位ANDs = 6指令。

<小时/> 可能更有效的方法:对所有元素进行水平求和,然后返回TRUE sum == -8,否则返回FALSE。 可能更简单的方法:只需将矢量与所有1的矢量进行比较。

return v == 0xffffffffffffffff;

有效地执行此操作留给读者练习(可能需要2 x 32位比较?)。

答案 1 :(得分:1)

在这种情况下,您可以简单地进行二进制否定,并检查64位结果是否为0.

vmvn d0, d0    
vpaddl.u32 d0, d0 // 64bit vceq isn't possible.
vceq.i32 d0, d0, #0

您现在在d0中获得了所需的结果。

如果您正在使用aarch64,则可以使用64位cmeq

mvn v0.16b, v0.16b
cmeq v0.2d, v0.2d, #0

此算法的最佳之处在于您不需要任何其他寄存器,因为零是比较指令接受的唯一立即值。