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

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

在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中,寄存器的宽度为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位,并且出现上述情况。