优化函数入口/出口(gcc)

优化函数入口/出口(gcc),c,gcc,optimization,emulation,C,Gcc,Optimization,Emulation,因此,问题是: 如何使用GCC、普通C以可移植的方式优化函数入口和出口代码以提高速度 我对相关选项等感兴趣。我的目标是编写一个CPU仿真器,其中指令集使用调用表进行解码。我已经消除了我可以合理消除的任何函数调用,但是由于指令集的结构,每个模拟指令执行2-3次这样的调用是必要的(因此,我也不能消除任何更多的分支预测失误) 基于对程序集(x86,32位)输出的分析,选项-fomit frame pointer似乎是值得的(只要我不在乎这里失去的调试功能)。否则,一般来说,如果我查看完整的仿真器,

因此,问题是:

  • 如何使用GCC、普通C以可移植的方式优化函数入口和出口代码以提高速度
我对相关选项等感兴趣。我的目标是编写一个CPU仿真器,其中指令集使用调用表进行解码。我已经消除了我可以合理消除的任何函数调用,但是由于指令集的结构,每个模拟指令执行2-3次这样的调用是必要的(因此,我也不能消除任何更多的分支预测失误)

基于对程序集(x86,32位)输出的分析,选项
-fomit frame pointer
似乎是值得的(只要我不在乎这里失去的调试功能)。否则,一般来说,如果我查看完整的仿真器,它似乎可以更好地进行总体寄存器和堆栈管理(不要在每个条目上保存所有内容),我对生成的程序集的印象是,它对堆栈的篡改比它所做的有用工作要多

因此,情况基本上是有很多小函数,它们被多次调用,并且不能从代码中删除


我不想从解释模拟转换过来,因为这应该是做这件事的最可移植的方法(无论如何比任何重新编译的解决方案都更可移植)。

在x86-32上,通用操作系统的ABI有标准的调用约定,使用堆栈将参数传递给函数,因为通用寄存器很少。改进只使用几个参数(以及相对简单的参数)的函数调用的一种方法是使用不同的调用约定(如fastcall),该约定使用寄存器传递参数

如果迁移到x86-64是一种选择(应该是这样的,它已经存在很久了……),那么ABI对于快速函数调用来说要好得多,因为通用寄存器的数量翻了一番。

是的,x86-64是一种选择(确实,我认为实际上所有现有的64位机器对于我的目标来说都被压倒了),但我(也)目标是“回到时间”使用此产品,使其即使在旧产品上也能正常工作。我正在测试这个方向,希望我可以通过正确地为现有代码参数化GCC来达到(或更接近于此)。在这种情况下,请尝试对函数定义预挂起
\uuuuu attribute\uuu((fastcall))
,看看这是否加快了速度。我对代码进行了一段时间的篡改,仔细分析了程序集输出,看来这些都是关于这件事的
-fomit frame pointer
对这些小函数有很大帮助,否则使用您提到的方法会刮除条目/返回中严格不需要的所有内容。现在,它甚至运行在我尊敬的奔腾233 MMX上。大会显示了一些其他瓶颈,但如果我认为合适的话,这些可能是其他问题的主题。@Jubatian:很高兴我能帮忙!如果你还需要什么,我很乐意帮忙。