我有一个uint8x8
霓虹灯矢量,这是一些操作的结果。我需要对所有通道执行逻辑AND
操作以获得最终结果。每个元素都是0xff
(TRUE)或0x00
(FALSE)。我如何在霓虹灯中执行它?
答案 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
此算法的最佳之处在于您不需要任何其他寄存器,因为零是比较指令接受的唯一立即值。