LINUX.ORG.RU

Сообщения v40in

 

одинак asm-код WinXP и Linux исполняют быстрее (на 25%), чем FreeBSD

дравствуйте!

у меня на ОДНОЙ машине i7 с 4 ядрами (HTT вкл)
1)FreeBSD 7.1
2)WinXP
3)Linux

Я сделал элементарный тест - цикл.
Одинак asm-код WinXP и Linux исполняют быстрее (на 25%), чем FreeBSD! (асм-код я проверил - одинаковый. к большим участкам памяти нет обращений).

вопрос:
Может какие-н. ключи компиляции ядра FreeBSD (не)надо вкючать?
(какие используются - могу прислать, если нужно)

v40in
()

inline asm в GCC (i686)... оч.косвенная адресация..

весёлого времени сУток!

дано: 1)регистр (пусть ebx) содержит смещение в массиве. 2)указатель на массив - в стековой переменной (напр. buffer) 3)С-код:

a=buffer[b];

вопрос: как записать в gcc одну (и только одну!!!) команду, чтоб доступисться к содержимому buffer по смещению offset?

я понимаю, что в конце концов это будет выглядеть в листинге примерно так:

movzbl <смещ.buffer.относит.esp>(%esp,%ebx), %eax
но как добиться этого?

а

__asm__ __volatile__( "movzbl       %0(%%ebx), %%eax":: "m"(buffer));
приводит к бреду типа (в листинге):
movzbl   <смещ.buffer.относит.esp>(%esp)(%ebx), %eax"
т.е. 2 регистра, и каждый в своих скобках!!!

что делать? не вычислять же смещение <смещ.buffer.относит.esp>!!! как потом сопровождать?! (да и вообще - что за бред это в gcc. В VS указывается смещение относительно ebp. на него хоть можно положиться (в разумных прогах)).

а почему вся затея с inline asm? потому, что gcc не оптимизирует код (или я не знаю еще какие опции для этого). на одной машине код небольошого цикла после gcc(v.4.xx) выпоняется в 1.5 раза медленнее, чем после VSC!!! а судя по коду, gcc вообще не знает , что такое конвейр cpu!

а для с-кода, описанного выше, gcc генерирует аж 2(!!!) asm-команды, в то время, как VSC обходится одной... для очистки конвейра заранее на случай непредсказанного перехода gcc не предпрринимает усилий... и тд

подскажите, пож-ста, как записать эту команду!

v40in
()

RSS подписка на новые темы