Мне очень нравится конвенция fastcall, мой любимый компилятор OpenWatcom ее активно использует. А вот в gcc я fastcall не обнаружил. Подскажите пожалуйста, может я плохо искал? gcc не воспринимает модификатор fastcall, пишет что мол знать ничего не знаю. Может быть это как-то по другому называется, но мне хочется, чтобы параметры в функцию передавались в регистрах, а не через стек. Заранее спасибо.
>Мне очень нравится конвенция fastcall, мой любимый компилятор OpenWatcom ее активно использует.
>А вот в gcc я fastcall не обнаружил. Подскажите пожалуйста, может
>я плохо искал? gcc не воспринимает модификатор fastcall, пишет что мол
>знать ничего не знаю. Может быть это как-то по другому называется,
>но мне хочется, чтобы параметры в функцию передавались в регистрах, а
>не через стек. Заранее спасибо.
void func(int, int) __attribute__((fastcall));void func(int x,int y) {
printf("%u\n",x+y);
}main() {
func(100,50);
}Только работает в gcc 3.4, а в предшествующих версиях честно сообщает:
warning: `fastcall' attribute directive ignored
void func(int, int) __attribute__((regparm(2)));void func(int x,int y) {
printf("%u\n",x+y);
}main() {
func(100,50);
}
Передает первый параметр в EAX, второй в EDX
Большое спасибо за помощь! Испробую при первой же возможности. Интересно, а почему указание о передаче параметров через регистры находится за функцией? Это обязательно или можно ставить его в любом месте? И еще: а regparm обязательно должен быть заключен в еще одни скобки, или это для красоты?
>Большое спасибо за помощь! Испробую при первой же возможности. Интересно, а почему
>указание о передаче параметров через регистры находится за функцией? Это обязательно
>или можно ставить его в любом месте? И еще: а regparm
>обязательно должен быть заключен в еще одни скобки, или это для
>красоты?
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html;-)
Почитал, интересно. Однако там я наткнулся на инфу, что если писать в аттрибутах fastcall, то будут использоваться только 2 регистра - EAX & EDX, а используя regparm можно заставить работать и третий - ECX. Тогда, по-моему, лучше в начале программы прописать что-то типа#define __attribute__((regparm(3))) FASTCALL;
а в прототипе:
void myfunc( int val1, int val2, int val3 ) FASTCALL;Еще раз спасибо за инфу.