Arm 值大小与约束和修改器指定的寄存器大小不匹配
在arm64中,编译下面的内联程序集会导致下面的警告: 值大小与寄存器大小不匹配 由约束和修饰符[-Wasm操作数宽度]指定 这是因为arm64的寄存器是64位的Arm 值大小与约束和修改器指定的寄存器大小不匹配,arm,clang,inline-assembly,arm64,Arm,Clang,Inline Assembly,Arm64,在arm64中,编译下面的内联程序集会导致下面的警告: 值大小与寄存器大小不匹配 由约束和修饰符[-Wasm操作数宽度]指定 这是因为arm64的寄存器是64位的 int a = 1; int b = 2; asm volatile( "add %[a], %[a], %[b] \n" : [a] "+r"(a) : [b] "r"(b) : ); 和clang给出修复建议,使用约束修饰符“w” 此警告的密钥不匹配。在arm64中,寄存器的宽度为6
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或变量为指针,则不会导致警告。因此,您可以尝试这种方法。正如@David Wohlferd在推荐中所述,只需使用
%w[a]
替换%a]
也就是说,在ARM64平台上,您仍然希望使用32位寄存器,然后在%
和表示寄存器的相应数字之间插入一个w
因此,整个程序修改为:
#include <stdio.h>
#include <arm_neon.h>
int main() {
int a = 1;
int b = 2;
asm volatile(
"add %w[a], %w[a], %w[b] \n"
:
[a] "+r"(a)
:
[b] "r"(b)
:
);
printf("after process, a=%d\n", a);
return 0;
}
#包括
#如果您对arm内联汇编程序一无所知,并且像这个问题的作者一样感到困惑,那么include值得一读。添加约束“w”-您在这里到底做了什么<代码>添加.w
?似乎很清楚为什么第二个示例会失败-您将64位寄存器x1
与32位int
s混合在一起。此程序只是一个简单的演示,显示了我的程序的警告。在添加约束w
时,是否可以包含该程序?对于这种情况,您只会收到错误消息。“添加%w[a]、%w[a]、%w[b]”
?事实上,只有当指令的操作数是32位,而在arm64中有一个是64位时,才会出现此警告。例如,ld/st指令,在arm64中指针为64位,但偏移量为%[n]为32位,并且出现上述情况。