AAch64高级SIMD矢量添加

时间:2016-02-03 19:22:22

标签: assembly arm arm64

我正在尝试在汇编代码中添加两个高级SIMD向量。在这里,我有两个向量v0v1,我想在v0的下半部分添加v1的上半部分,并将结果放在{{1}的上半部分}}。性能在我的代码中至关重要,所以我试图通过一条加法指令找到一种方法。我知道我可以将上半部分移动到另一个寄存器中,只需使用v0指令即可 在AArch32 NEON指令集中,可以使用UADDL而不是Dn来完成。例如,在我的情况下,可以这样做: Qn 有没有办法在AArch64高级SIMD指令中做到这一点?

1 个答案:

答案 0 :(得分:0)

如@ sh1所示,您需要重新安排一些事情。

vqadd的等效AArch64指令是{sqadd或uqadd}。但是,它们会将v0中的8个单字节0-7添加到v1中的8个单字节0-7;这不是你想要的。但是,如果你可以重新安排加载指令,比方说,v1你可以实现预期的目标。

.data
 array:        .ascii  "73167176531330624919225119674426574742355349194934"
...
ldr x20,=array // ptr
ld1 {v0.16b, v1.16b}, [x20] // load multiple 1-element structures to two consecutive elements
uqadd v0.8b,v1.8b,v0.8b

...
(gdb) p $v0.b.s
$14 = {7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 0, 6, 2}
(gdb) p $v1.b.s
$15 = {4, 9, 1, 9, 2, 2, 5, 1, 1, 9, 6, 7, 4, 4, 2, 6}
(gdb)
(gdb) p $v0.b.s
$26 = {11, 12, 2, 15, 9, 3, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0}