以下代码使用内联汇编填充结果:
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”(结果)来告诉编译器汇编程序正在设置值.如果执行此操作,则可能不需要挥发物.至少,这是一个要消除的好问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。