The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"fastcall в gcc"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"fastcall в gcc"
Сообщение от dimus emailИскать по авторуВ закладки(ok) on 02-Авг-04, 09:44  (MSK)
Мне очень нравится конвенция fastcall, мой любимый компилятор OpenWatcom ее активно использует. А вот в gcc я fastcall не обнаружил. Подскажите пожалуйста, может я плохо искал? gcc не воспринимает модификатор fastcall, пишет что мол знать ничего не знаю. Может быть это как-то по другому называется, но мне хочется, чтобы параметры в функцию передавались в регистрах, а не через стек. Заранее спасибо.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "fastcall в gcc"
Сообщение от Soldier Искать по авторуВ закладки(??) on 02-Авг-04, 11:26  (MSK)
>Мне очень нравится конвенция 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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "fastcall в gcc"
Сообщение от Soldier Искать по авторуВ закладки(??) on 02-Авг-04, 11:49  (MSK)
void func(int, int) __attribute__((regparm(2)));

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

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


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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "fastcall в gcc"
Сообщение от dimus Искать по авторуВ закладки(ok) on 02-Авг-04, 13:18  (MSK)
Большое спасибо за помощь! Испробую при первой же возможности. Интересно, а почему указание о передаче параметров через регистры находится за функцией? Это обязательно или можно ставить его в любом месте? И еще: а regparm обязательно должен быть заключен в еще одни скобки, или это для красоты?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

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


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

;-)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру