c-误报:未定义或垃圾值返回给调用方

以下代码使用内联汇编填充结果:

uint64_t Foo::f() {
    uint64_t result;

    asm volatile
    ("vldmia        %1, {q0-q1}     \n" // q0-1 = *this

     ⋮

     "vstmia        %0, {d0}        \n" // result = d0

     :: "r"(&result), "r"(this)
     : "q0", "q1");

    return result;
}

结果变量是在汇编代码中无条件设置的,但是Xcode的分析器似乎忽略了这一点(流分析直接从声明跳转到return语句)并抱怨:

…/BitBoard.cpp:26:9: Undefined or garbage value returned to caller

有没有一种方法可以在不浪费周期初始化结果的情况下安抚分析仪?

编辑:我试过建议指定一个输出约束:

: "=r"(&result) : "r"(this), "r"(&result)

但是编译器会发出“ asm输出中无效的左值”的错误提示.卸下&编译但返回看似随机的结果.将vstmia%0,{d0}更改为vmov%0,d0也会失败,并显示“指令的操作数无效”.

我怀疑我必须按照建议将结果标记为输出,并在汇编代码中以不同的方式填充它,但是我找不到有关这样做的任何信息.

解决方法:

我怀疑这是由于缺乏输出约束所致.

尝试这个,

uint64_t Foo::f() {
    uint64_t result;

    asm /* volatile */
    ("vldmia        %1, {q0-q1}     \n" // q0-1 = *this

     ⋮

     "vstmia        %0, {d0}        \n" // result = d0

     : "=w"(result): "r"(this) : "q0", "q1");

    return result;
}

您必须使用输出约束“ = w”(结果)来告诉编译器汇编程序正在设置值.如果执行此操作,则可能不需要挥发物.至少,这是一个要消除的好问题.

相关文章

在有效期内的苹果开发者账号(类型为个人或者公司账号)。还...
Appuploader官网--IOS ipa上传发布工具,证书制作工具跨平台...
苹果在9月13号凌晨(北京时间)发布 iOS 16,该系统的设备可...
计算机图形学--OpenGL递归实现光线追踪
Xcode 14打出来的包在低版本系统运行时会崩溃,报错信息是Li...