在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”。
答案 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)值得一读。