以下是我尝试使用NEON实现AArch64的快速弹出窗口:
#include <stdio.h>
int count_bits(unsigned long long val) {
unsigned long long p = 0;
int c = 0;
__asm__("DUP %0.2d, %2 \n\t"
"CNT %0.8b, %0.8b \n\t"
"ADDP d0, %0.2d \n\t"
"UMOV %1, d0 \n\t"
: "+w"(p), "+r"(c)
: "r"(val) : "d0");
return c;
}
int main(int argc, const char *argv[]) {
printf("Test: %i\n", count_bits(-1ull));
return 0;
}
错误:
$ gcc test.c -o test
Error: operand 2 should be a SIMD vector element -- `umov x0,d0'
我也不太确定ADDP
指令,说明符表示它添加了2个dword,但CNT
指令的结果存储为8个字节(%0.8b
in ADDP
不起作用)。我不应该使用UADALP
来总结组件吗?
答案 0 :(得分:1)
Error: operand 2 should be a SIMD vector element -- `umov x0,d0'
(&#34; SIMD向量元素&#34;定义在ARM ARM中用于ARMv8-A的C1.2.4。)
UMOV <Wd>, <Vn>.<Ts>[<index>]
或64位
UMOV <Xd>, <Vn>.<Ts>[<index>]
在你的情况下,我猜是
UMOV %1, v0.D[0]
但我现在还不确定代码是否正确。我没有环境。测试。