在ARM Cortex A8的汇编中,对NEON向量/寄存器(成对?)的所有元素/通道进行异或

时间:2014-05-18 21:55:52

标签: assembly arm xor neon cortex-a8

我不确定这里的确切命名是什么,但问题在于:

我正在进行校验和,我想获取许多不同的[32位]值,将它们存储在NEON向量的元素中,将它们一起进行异或,然后传递结果返回ARM寄存器以进行将来的计算。 [校验和有一些基于随机数的不同块,所以我想将这些次要结果与#34;进行排序。 nonce,不丢熵]。

我并不担心性能(尽管较少的操作总是更可取,因为最小化ARM的停顿; NEON可以停止它所需要的全部),或者这不是一个特别可矢量化的操作;我需要才能使用NEON单元。

如果存在某种水平XOR,那将是理想的,其中它将使矢量的[4]元素相互异或,并返回结果,但这并不存在。我显然可以做一些事情(原谅残酷的伪代码):

load value1 s0
load value2 s2
veon d2, d0, d1
load value3 s0
load value4 s2
veon d0, d0,d1
veon d0, d0, d2

但是有更好的方法吗?我知道有成对添加,但似乎没有成对的异或。就使用尽可能多的寄存器通道或寄存器而言,我是灵活的。

TL; DR:我需要这样做:在NEON上res = val1 ^ val2 ^ val3 ^ val4,这可能是愚蠢的,但我正在寻找最不笨的方式。

谢谢!

1 个答案:

答案 0 :(得分:2)

NEON的做法。需要展开循环以获得更好的性能,因为它试图使用需要时间加载的数据。

vld1.u32 {q0},[r0]!        ; load 4 32-bit values into Q0
veor.u32 d0,d0,d1          ; XOR 2 pairs of values (0<-2, 1<-3)
vext.u8 d1,d0,d0,#4    ; shift down "high" value of d0
veor.u32 d0,d0,d1          ; now element 0 of d0 has all 4 values XOR'd together
vmov.u32 r2,d0[0]          ; transfer back to an ARM register
str r2,[r1]!           ; store in output

ARM的做法。加载数据的速度稍慢,但没有等待从NEON到ARM寄存器的传输延迟。

ldmia r0!,{r4-r7}      ; load 4 32-bit values
eor r4,r4,r5
eor r4,r4,r6
eor r4,r4,r7           ; XOR all 4 values together
str r4,[r1]!           ; store in output

如果您可以依靠多组4个32位值,那么NEON可以通过加载一堆寄存器然后处理它们来为您提供优势。如果您只是调用一个可以处理4个整数的函数,那么ARM版本的性能可能会更好。

相关问题