在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”。
这个警告的关键是无与伦比的。在arm64中,寄存器是64位宽度,但int / float变量是32位。如果类型为double / int64_t或变量是指针,则不会引发警告。所以,你可以尝试一下。