我正在为 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 个周期的惩罚(如果不采用分支则不会受到惩罚)。
我希望常见情况 whereNULL == pProvider
成为快速情况,即不采用分支。如何让 RVCT 4.0 生成这样的代码?
我尝试使用__builtin_expect
如下:
if (__builtin_expect(NULL == pProvider, 1))
return;
不幸的是,这对生成的代码没有影响。我使用__builtin_expect
不正确吗?是否有另一种方法(希望没有内联汇编)?