Можно ли убедить GCC имитировать соглашение о вызовах fastcall? - PullRequest
3 голосов
/ 03 октября 2008

Итак, у меня есть часть сборки, которая должна вызывать функцию с соглашением о вызовах fastcall для windows, но gcc не поддерживает (afaict). GCC предоставляет атрибут regparm, но он ожидает, что первые 3 параметра будут переданы в eax, edx и ecx, тогда как fastcall ожидает, что первые два параметра будут переданы в ecx и edx.

Я просто пытаюсь избежать эффективного дублирования нескольких путей кода, так что это не совсем важно, но было бы здорово, если бы этого можно было избежать.

Ответы [ 3 ]

11 голосов
/ 03 октября 2008

GCC поддерживает fastcall через __attribute__((fastcall)). Похоже, что было введено в GCC 3.4.

4 голосов
/ 21 апреля 2012

Я знаю, что я немного опоздал на вечеринку по этому поводу, но если кто-то из вас наткнулся на это, просто помните, что вы можете определить макрос, чтобы имитировать его. Например:

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

int MSFASTCALL magic() GCCFASTCALL;

Очевидно, это выглядит некрасиво, так что вы можете просто определить 2 прототипа (что я и делаю), чтобы его было немного легче читать, но есть люди, которые предпочитают маршрут, который требует меньше ввода. Я обычно не использую соглашения о вызовах, за исключением особых случаев. Я просто позволил компилятору оптимизировать все остальное.

Теперь нужно запомнить некоторые причуды. Например, когда вы ориентируетесь на 64-битные платформы, все функции используют соглашение fastcall для того, чтобы воспользоваться дополнительными регистрами и повысить скорость и снизить стоимость косвенного обращения. Кроме того, fastcall по-разному реализован на разных платформах, поскольку он не стандартизирован. Есть и другие, но это все, что я могу снять с головы.

1 голос
/ 03 октября 2008

Если вы вызываете функцию из asm, то, безусловно, вы полностью контролируете, как вы вызываете функцию. Что мешает вам просто загрузить регистры и выдать CALL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...