以下代码使用内联汇编填充结果:
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;
}
The result
变量在汇编代码中无条件设置,但 Xcode 的分析器似乎忽略了这一点(流程分析直接从声明跳到返回语句)并抱怨:
…/BitBoard.cpp:26:9: Undefined or garbage value returned to caller
有没有一种方法可以安抚分析器而不浪费初始化周期result
?
EDIT:我已经尝试过指定输出约束的建议:
: "=r"(&result) : "r"(this), "r"(&result)
但是编译器会发出“asm 输出中无效的左值”的错误消息。删除&
编译但返回看似随机的结果。改变vstmia %0, {d0}
to vmov %0, d0
也失败,并显示“指令操作数无效”。
我怀疑我必须标记result
作为输出,按照建议,并在汇编代码中以不同的方式填充它,但我找不到任何关于知道这样做的信息。
我怀疑这是由于缺乏输出约束.
尝试这个,
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;
}
您必须使用output约束,"=w"(result)
,告诉编译器汇编器正在设置一个值。你可能不需要volatile
如果你这样做。至少,这是一个值得消除的好问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)