是否有可能说服GCC模仿fastcall调用约定?

oll*_*iej 3 gcc visual-c++

所以我有一个程序集需要在Windows上使用fastcall调用约定调用一个函数,但是gcc没有(afaict)支持它.GCC确实提供了regparm属性,但是期望前三个参数在eax,edx和ecx中传递,而fastcall期望前两个参数在ecx和edx中传递.

我只是试图避免有效地复制一些代码路径,所以这并不是完全关键的,但如果它是可以避免的话会很棒.

eph*_*ent 11

GCC支持fastcall,通过__attribute__((fastcall)).它似乎已在GCC 3.4中引入.


小智 5

我知道我在这方面有点迟到了,但如果你们中有人偶然发现了这一点,请记住您可以定义一个宏来模仿它。例如:

#if defined(__GNUC__)
    #define MSFASTCALL __fastcall
    #define GCCFASTCALL 
#elif defined(_MSC_VER)
    #define MSFASTCALL
    #define GCCFASTCALL __attribute__((fastcall))
#endif

int MSFASTCALL magic() GCCFASTCALL;
Run Code Online (Sandbox Code Playgroud)

显然,这看起来有点丑陋,所以你可以只定义 2 个原型(这就是我所做的)以使其更容易阅读,但有些人更喜欢需要较少打字的路线。除特殊情况外,我通常不使用调用约定。我只是让编译器优化其余部分。

现在,有一些怪癖需要记住。例如,当您面向 64 位平台时,所有函数都利用 fastcall 约定,以便利用额外的寄存器并提高速度并降低间接成本。同样,fastcall 在不同平台上的实现也不同,因为它没有标准化。还有其他一些,但这就是我能想到的全部。