gpt4 book ai didi

c - 使用 RVCT4.0 在 Arm9 上进行静态分支预测

转载 作者:行者123 更新时间:2023-12-03 16:56:11 25 4
gpt4 key购买 nike

我正在为 ARM9 处理器编写一些日志记录 C 代码。如果存在动态模块,此代码将记录一些数据。该模块通常不会出现在生产构建中,但日志代码总是会被编译进去。我们的想法是,如果客户遇到错误,我们可以加载该模块,日志代码将转储调试信息。

当模块不存在时,日志记录代码的影响必须最小,因此每个周期都很重要。一般来说,日志代码看起来像这样:

__inline void log_some_stuff(Provider *pProvider, other args go here...)
{
if (NULL == pProvider)
return;
... logging code goes here ...
}

启用优化后,RVCT 4.0 生成的代码如下所示:

ldr     r4,[r0,#0x2C]     ; pProvider,[r0,#44]
cmp r4,#0x0 ; pProvider,#0
beq 0x23BB4BE (usually taken)
... logging code goes here...
... regular code starts at 0x23BB4BE

这个处理器没有分支预测器,我的理解是每当一个分支被采用时都会有 2 个周期的惩罚(如果分支没有被采用则没有惩罚)。

我希望常见的情况,其中 NULL == pProvider 是快速的情况,其中不采用分支。如何让 RVCT 4.0 生成这样的代码?

我试过使用 __builtin_expect 如下:

if (__builtin_expect(NULL == pProvider, 1))
return;

不幸的是,这对生成的代码没有影响。我是否错误地使用了 __builtin_expect?是否有其他方法(希望没有内联汇编)?

最佳答案

因此,如果没有分支预测器,并且在采用分支时会受到两个周期的惩罚,为什么不相应地重写程序来做到这一点呢? (实际上你会认为你上面的例子已经产生了“正确”的代码,但我们可以试试)

__inline void log_some_stuff(Provider *pProvider, other args go here...)
{
if (pProvider) {
... logging code goes here ...
}
}

“可以”编译为:

ldr     r4,[r0,#0x2C]     ; pProvider,[r0,#44]
cmp r4,#0x0 ; pProvider,#0
bneq logging_code (usually NOT taken)
... regular code here
logging_code: .. well anywhere

如果您很幸运,但即使它现在发生了,对编译器的每次更改都可能会更改它,而且我不知道它是否会导致您使用的任何编译器生成汇编代码。所以无论如何都可能在内联汇编中编写它?没有那么多代码和 gcc(以及 VC;我想其他人也这样做)使这变得非常容易。最简单的方法就是用日志代码定义一个额外的方法并调用它(不知道 ARM ABI,所以你必须自己编写)

关于c - 使用 RVCT4.0 在 Arm9 上进行静态分支预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5398296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com