[英]Inline aarch64 assembly UMOV source syntax
下面是我尝试使用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个双字,但结果CNT
指令存储为8个字节( %0.8b
在ADDP
不工作)。 我不应该使用UADALP
对组件求和吗?
Error: operand 2 should be a SIMD vector element -- `umov x0,d0'
(“ SIMD向量元素”的定义在ARMv for ARMv8-A的C1.2.4中。)
UMOV <Wd>, <Vn>.<Ts>[<index>]
或64位
UMOV <Xd>, <Vn>.<Ts>[<index>]
在你的情况下,我猜可能是
UMOV %1, v0.D[0]
但是我不确定代码现在是否正确。 我没有环境。 去测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.