URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3231
[ Назад ]

Исходное сообщение
"fastcall в gcc"

Отправлено dimus , 02-Авг-04 09:44 
Мне очень нравится конвенция fastcall, мой любимый компилятор OpenWatcom ее активно использует. А вот в gcc я fastcall не обнаружил. Подскажите пожалуйста, может я плохо искал? gcc не воспринимает модификатор fastcall, пишет что мол знать ничего не знаю. Может быть это как-то по другому называется, но мне хочется, чтобы параметры в функцию передавались в регистрах, а не через стек. Заранее спасибо.

Содержание

Сообщения в этом обсуждении
"fastcall в gcc"
Отправлено Soldier , 02-Авг-04 11:26 
>Мне очень нравится конвенция 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


"fastcall в gcc"
Отправлено Soldier , 02-Авг-04 11:49 
void func(int, int) __attribute__((regparm(2)));

void func(int x,int y) {
printf("%u\n",x+y);
}

main() {
func(100,50);
}


Передает первый параметр в EAX, второй в EDX


"fastcall в gcc"
Отправлено dimus , 02-Авг-04 13:18 
Большое спасибо за помощь! Испробую при первой же возможности. Интересно, а почему указание о передаче параметров через регистры находится за функцией? Это обязательно или можно ставить его в любом месте? И еще: а regparm обязательно должен быть заключен в еще одни скобки, или это для красоты?

"fastcall в gcc"
Отправлено Soldier , 02-Авг-04 13:48 
>Большое спасибо за помощь! Испробую при первой же возможности. Интересно, а почему
>указание о передаче параметров через регистры находится за функцией? Это обязательно
>или можно ставить его в любом месте? И еще: а regparm
>обязательно должен быть заключен в еще одни скобки, или это для
>красоты?


http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

;-)


"fastcall в gcc"
Отправлено dimus , 03-Авг-04 13:13 
Почитал, интересно. Однако там я наткнулся на инфу, что если писать в аттрибутах fastcall, то будут использоваться только 2 регистра - EAX & EDX, а используя regparm можно заставить работать и третий - ECX. Тогда, по-моему, лучше в начале программы прописать что-то типа

#define __attribute__((regparm(3))) FASTCALL;

а в прототипе:
void myfunc( int val1, int val2, int val3 ) FASTCALL;

Еще раз спасибо за инфу.