The OpenNET Project / Index page

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

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

"SSE under gcc"
Сообщение от VuDZ emailИскать по авторуВ закладки on 15-Окт-02, 06:14  (MSK)
Решил я скомпилить и запустить один свой тестик - проверяет максимальную пропускную способность памяти... и столкнулся  с одним неприятным багом - в gcc используется что-то отличное от asm & _asm... Вот код, который я портирую с MS VC++:
_check_MMX_SSE::_check_MMX_SSE()
{
_IsMMX = false;
_IsSSE = false;

asm
{
pusha;
mov eax, 1;
cpuid;
bt edx, 32;
jnc near _exitSSE;
mov _IsSSE, 1;
_exitSSE:
bt edx, 23;
jnc near _exitMMX;
mov _IsMMX, 1;
_exitMMX:
popa;
};
}

ругань происходит на строке с cpuid и строке после asm, затем ему не нравиться строка с bt edx,32 - говорит, что не знает о наличие edx, т.е., возможно, в gcc по другому щзадаётся assembly-inline? как это сделать? Может надо писать на AT&T assembly? И есть ли сразу в gcc 2.95 поддержка SSE & MMX?

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

 Оглавление

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

1. "RE: SSE under gcc"
Сообщение от Soldier Искать по авторуВ закладки on 15-Окт-02, 07:45  (MSK)
>Решил я скомпилить и запустить один свой тестик - проверяет максимальную пропускную
>способность памяти... и столкнулся  с одним неприятным багом - в
>gcc используется что-то отличное от asm & _asm... Вот код, который
>я портирую с MS VC++:
>_check_MMX_SSE::_check_MMX_SSE()
>{
> _IsMMX = false;
> _IsSSE = false;
>
> asm
> {
>  pusha;
>  mov eax, 1;
>  cpuid;
>  bt edx, 32;
>  jnc near _exitSSE;
>  mov _IsSSE, 1;
>_exitSSE:
>  bt edx, 23;
>  jnc near _exitMMX;
>  mov _IsMMX, 1;
>_exitMMX:
>  popa;
> };
>}
>
>ругань происходит на строке с cpuid и строке после asm, затем ему
>не нравиться строка с bt edx,32 - говорит, что не знает
>о наличие edx, т.е., возможно, в gcc по другому щзадаётся assembly-inline?
>как это сделать? Может надо писать на AT&T assembly? И есть
>ли сразу в gcc 2.95 поддержка SSE & MMX?

Прежде всего - инлайн ассемблер в gcc использует моторола-вский синтаксис, да и вызывается по другому - читайте доки. Если хотите использовать tasm/masm стиль в Unix, то можно скачать NASM. И в этом случае я бы, например, сделал так:

1. файл check_mmx.asm
-------------------------
extern _IsSSE
extern _IsMMX
global _check_mmx_sse
_check_mmx_sse:
pusha
mov eax, 1
cpuid
bt edx, 32
jnc near _exitSSE
mov word [_IsSSE], 1
_exitSSE:
bt edx, 23;
jnc near _exitMMX
mov word [_IsMMX], 1
_exitMMX:
popa
ret
-----------------------------

Компилим его NASM-ом:

nasm -f elf -o check_mmx.o check_mmx.asm

Должен получиться  check_mmx.o

2. Файл callasm.c
-------------------------------
extern void _check_mmx_sse();

short _IsMMX = 0;
short _IsSSE = 0;

main() {
_check_mmx_sse();
printf("%i,%i\n",_IsMMX,_IsSSE);
}
----------------------------------

Компилим все:

gcc -o callasm callasm.c check_mmx.o

С использованием классов и C++ немного по другому, но несильно

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

2. "RE: SSE under gcc"
Сообщение от VuDZ emailИскать по авторуВ закладки on 15-Окт-02, 07:53  (MSK)
>С использованием классов и C++ немного по другому, но несильно

а ги де можно достать доку по gcc'шному асму? а то переделывать около метра исходников не есть гут - ладно бы был чистый асм, так ещё много и на С/С++ написано...

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

3. "RE: SSE under gcc"
Сообщение от Soldier Искать по авторуВ закладки on 15-Окт-02, 08:14  (MSK)
>>С использованием классов и C++ немного по другому, но несильно
>
>а ги де можно достать доку по gcc'шному асму? а то переделывать
>около метра исходников не есть гут - ладно бы был чистый
>асм, так ещё много и на С/С++ написано...

Зачем переделывать метр исходников? Достаточно все ассемблерные ставки оформить ввиде процедур (при этом синтаксис практически не меняется), единственно декларировать для "приплюснутового" надо так:

extern "C" void _check_mmx_sse();

А вот если использовать кошмарный (для меня, привыкшего к masm) ассемблер gcc (особенно если с ним не знаком), вот это действительно геморру не оберешься.
Вот фрагмент из одной из моих прог:

int sp,ss;
asm("mov %%esp,%0" : "=m" (sp));
asm("mov %%ss,%0" : "=m" (ss));
printf("\n===ss:sp=%0x:%0x==\n",ss,sp);

Ну как, красиво? :-)))  Я сразу плюнул на это дело и скачал себе NASM.

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

4. "RE: SSE under gcc"
Сообщение от VuDZ emailИскать по авторуВ закладки on 15-Окт-02, 08:20  (MSK)
>А вот если использовать кошмарный (для меня, привыкшего к masm) ассемблер gcc
>(особенно если с ним не знаком), вот это действительно геморру не
>оберешься.
>Вот фрагмент из одной из моих прог:
>
> int sp,ss;
> asm("mov %%esp,%0" : "=m" (sp));
> asm("mov %%ss,%0" : "=m" (ss));
> printf("\n===ss:sp=%0x:%0x==\n",ss,sp);
>
>Ну как, красиво? :-)))  Я сразу плюнул на это дело и
>скачал себе NASM.

Напоминает AT&T's assembly, если я ничего не путаю - сталкивался с ним лет 5-6 назад...
Я тут вчера ставил gcc 3.2 (не получилось сделать его основным компилятором по умолчанию, а хотел им всё перекомпилить), так вот там, можно, если я не ошибаюсь, указать, какой использовать ассемблер... ТАк что бум всё переделывать сегодня вечером :<

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

5. "RE: SSE under gcc"
Сообщение от lavr emailИскать по авторуВ закладки on 18-Окт-02, 16:34  (MSK)
>>А вот если использовать кошмарный (для меня, привыкшего к masm) ассемблер gcc
>>(особенно если с ним не знаком), вот это действительно геморру не
>>оберешься.
>>Вот фрагмент из одной из моих прог:
>>
>> int sp,ss;
>> asm("mov %%esp,%0" : "=m" (sp));
>> asm("mov %%ss,%0" : "=m" (ss));
>> printf("\n===ss:sp=%0x:%0x==\n",ss,sp);
>>
>>Ну как, красиво? :-)))  Я сразу плюнул на это дело и
>>скачал себе NASM.
>
>Напоминает AT&T's assembly, если я ничего не путаю - сталкивался с ним
>лет 5-6 назад...
>Я тут вчера ставил gcc 3.2 (не получилось сделать его основным компилятором
>по умолчанию, а хотел им всё перекомпилить), так вот там, можно,
>если я не ошибаюсь, указать, какой использовать ассемблер... ТАк что бум
>всё переделывать сегодня вечером :<

основным - чревато, а вот дополнительным для себя - да ради бога:

/usr/ports/lang/gcc32

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


Удалить

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




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

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