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