- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 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/
嗯,这个解释起来有点复杂。我正在编译一个静态库,它的 header 看起来与此类似: class Foo{ static int Goo(){ DoSomethingExcit
我在 RVCT 编译环境上遇到了一些问题,需要你的帮助。 有这样一个函数 int lib_func(int b) 但是我没有这个函数的源码。 我想包装这个函数并添加一些调试标志。 在 GCC 中,我可
我试图链接一个用 RVCT 2.2 编译的静态第三方库使用 GCC 编译的测试程序(arm-none-linux-gnueabi-gcc Sourcery G++ Lite 2011.03-41)。
我正在研究 amr 语音编解码器(移植/优化)我有一个来自 voiceage 的 arm (for WinCE) 优化版本,我用它作为性能测试的引用。到目前为止,用我的库生成的二进制文件比另一个库生成
我是一名优秀的程序员,十分优秀!