值大小与约束和修饰符指定的寄存器大小不匹配

时间:2019-03-04 08:45:20

标签: arm clang inline-assembly arm64

在arm64中,编译下面的内联程序集会在下面引起警告:

  

值大小与寄存器大小不匹配         由约束和修饰符[-Wasm-operand-widths]指定。

这是因为arm64的寄存器是64位。

int a = 1;
int b = 2;
asm volatile(
   "add %[a], %[a], %[b]  \n"
   :
   [a] "+r"(a)
   :
   [b] "r"(b)
   :
    );
  

然后clang提供修复建议,请使用约束修饰符“ w”。

2 个答案:

答案 0 :(得分:0)

此警告的键不匹配。在arm64中,寄存器的宽度为64位,但int / float变量为32位。并且如果类型为double / int64_t或变量为指针,则不会引起警告。因此,您可以尝试一下。

答案 1 :(得分:0)

就像@David Wohlferd提到的那样,只需使用np.fill_diagonal(co_occ.values, (df - 1).sum(1))替换%w[a]

也就是说,在ARM64平台上,您仍然希望使用32位寄存器,然后在%[a]和代表寄存器的相应数字之间插入w

因此整个程序被修改为:

%

顺便说一句,如果您对arm内联汇编器一无所知,并且像该问题的作者一样感到困惑,那么CSDN blog (in Chinese)值得一读。