【发布时间】:2013-03-25 21:06:46
【问题描述】:
更新
将汇编的第二行更改为实际使用的助记符 (mflr),并在底部添加了更多信息。
我遇到了一些代码(使用 gcc),类似于以下(意译):
#define SOME_MACRO( someVar ) \
do { \
__asm__ ( \
" b 0f\n" \
"0: mflr %0\n" \
: "=r"( someVar ) \
); \
} while(0)
...b 指令 (ppc) 是一个简短的 jmp,mflr 正在获取“链接寄存器”的内容——这在某些方面类似于程序计数器。对于英特尔代码,我也看到过这种情况(参见this 问题中接受的答案)。
分支充当无操作...我的问题:这有什么目的?
我猜它与分支预测有关,但到目前为止,我只发现人们在搜索时使用这个成语的代码。
看来我在分支预测猜测上错了。 mflr 抓取链接寄存器的内容。
所以,我的问题归结为:为什么需要分支。
【问题讨论】:
-
会不会刷新指令预取队列?
-
有些目的是在
somethingelse。这样的代码可用于instrumentation(调试/运行时跟踪)。例如,在 x86 中,asm("call 0f\n0: pop %0\n" : "=r"(pc))是一种检索程序计数器IP的方法(请注意,这在 64 位模式下是不安全的)。在 ARM(和 64 位 x86)上,该方法还经常用于在代码中嵌入常量,用于与 PC 相关的负载。是否对分支预测/流水线产生影响取决于 CPU,因此通常不能说“这就是它的用途”。 -
@FrankH。我花了更多时间查看代码;这是我没有只见树木不见森林的一个很好的例子。你的分析很到位;
somethingelse正在获取程序计数器并将其存储在 %0 中。 -
如果您不介意将您的回复作为答案发布,我会接受。
标签: assembly pipeline branch-prediction