优化函数进入/退出(gcc)

时间:2014-03-01 17:32:54

标签: c gcc optimization emulation

所以问题是:

  • 如何优化功能输入&使用GCC,plain C?
  • 以便携方式退出代码以获得速度

我对相关选项等感兴趣。我的目标是编写一个CPU仿真器,其中使用调用表解码指令集。我已经消除了我可以合理消除的任何函数调用,但是由于指令集的结构,每个模拟指令执行2-3次这样的调用是必要的(所以我也不能在这里消除任何更多的分支错误预测)。

基于分析程序集(x86,32bits)输出,选项-fomit-frame-pointer似乎是值得的(一旦我不关心这里丢失的调试能力)。否则一般来说,如果我查看完整的模拟器,似乎可以通过更好的整体寄存器和堆栈管理(不要在每个条目上保存每一件事情)更好,我对生成的程序集的印象是它篡改了更多堆栈比它做多少有用的工作。

所以情况基本上是有很多小函数被称为很多次,并且无法从代码中消除。

我不想从解释仿真切换,因为这应该是最便携的方法来做这件事(无论如何都比任何可重新编译的解决方案更便携)。

1 个答案:

答案 0 :(得分:2)

在x86-32上,常见操作系统的ABI具有标准调用约定,这些约定使用堆栈将参数传递给函数,因为几乎没有通用寄存器。改进只接受少量参数(和相对简单的参数)的函数调用的一种方法是使用不同的调用约定(如fastcall),它使用寄存器传递参数。

如果移动到x86-64是一个选项(它应该是,它已经存在多年......),ABI对于快速函数调用要好得多,因为通用的数量寄存器加倍。