内联aarch64汇编UMOV源语法

时间:2015-08-31 00:50:07

标签: assembly arm 64-bit

以下是我尝试使用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来总结组件吗?

1 个答案:

答案 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] 

但我现在还不确定代码是否正确。我没有环境。测试。