- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
;uint64_t foo(uint32_t x, uint64_t y) { return x*y; }
sub esp, 0×8
mov edx, [esp+0x14]
mov ecx, [esp+0xc]
mov eax, [esp+0x10]
mov [esp+0x4], esi
mov esi, edx
imul esi, ecx
mul ecx
mov [esp], ebx
mov ebx, [esp]
add esi, edx
mov edx, esi
mov esi, [esp+0x4]
add esp, 0×8
ret
mov eax, [esp+0x4]
mov ecx, [esp+0xc]
imul ecx, eax
mul dword[esp+0x8]
lea edx, [ecx+edx]
ret
//и все-равно lea edx, [ecx+edx] - тупо
блин , токо заметил сгетил 3500 пост 8-))
3500 - это не ТРУъ гет
ljioDSAFNJK(olNWQ,Ns)pjMKWKNbosp02Nd*)(i q#@wNLKn)((j@wjkendklndlkj()@lknKIJ09EWD KLN(JIEKNLKENAD9PLJFD9ESDOIJ09PDJEIJ9Emj )o(9N09IENJF090ijekuebj,IлгТЛТВДБТуцдшОЩ ЗОЦЫВтбюwjlon)LknewsklneШ*луХУЙfw909JLKn efs980jnwelkjnf9sd0jhgfKBasp0abn)NKbsA,K BpolNWKJBAPJSKJNloPJASKJNp:WJMADL*inkljN ASOI,noWQELIN98Oln,asmBNZon,lmnbawsol<LN sallo9ijndsa,jnOLwslkjnalpo9LJ>,nedloihs poKLJLnadsliqw,.
� �
MS-компилеры тоже хороши
http://govnokod.ru/3271
http://govnokod.ru/3194
Гений, робана ёт, оптимизаций.
если он генит такие вещи?
mov [esp], ebx
mov ebx, [esp]
собственно тут проскакивало, что типа MS - кал. из-за таких вещей
fistp qword [tmp]
fild qword [tmp]
юзайте gcc. а оказывается и у gcc есть перлы
какие флаги использовал?
по отсутствию всяких разных извращенных инструкций - и 64-бит инструкций - можно предположить что данный код преднамерено совместим с i586. что может и быть объяснением.
gcc-4.4 -O3 -march=k8 :
и к слову "lea" как я слышал это по рекомендации самого Intel вместо add. причины точно уже не помню.
да и версия древняя
кстати 4.32 в моем первом посте пооптимальней делает
>>"lea" по рекомендации самого Intel вместо add
если не затруднит линк какой-нибудь запостите - просто интересно
линка у меня нету. я просто в старые времена gcc мейл листы почитывал. можешь попробовать там сам поискать.
там много всего бегает, включаю вот такие чудеса.
спс, буду искать
а вот то что проц знает что делать после сложения/умножения дает ему бонус.
Это примерно как ускорение conditional jumpoв после cmp в Core2.
то есть получается gcc-4.3.2 and later генят в данном случае практически оптимальный код
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_6/CH06-1.html
The final two instructions above, lea bx,4[bp+si] and lea ax,-123[di] provide additional examples of lea instructions that are more efficient than their mov/add counterparts.
On the 80386 and later processors, you can use the scaled indexed addressing modes to multiply by two, four, or eight as well as add registers and displacements together. Intel strongly suggests the use of the lea instruction since it is much faster than a sequence of instructions computing the same result.
Думаю что между
разницы нет.
А вот между
есть. Особенно если выполнить ее 100500 раз.
думаю add edx,ecx по скорости не уступает lea edx, [ecx+edx], иначе все бы использовали lea где только можно
но вот для случаев lea bx,4[bp+si] - тут она действительно полезна
так на асме и пишутся места которые 100500 раз выполняются ))
Initially LEA был эффективнее чем вручную делать ADD потому что выполнялся на специально заточенном адресном блоке (На AGU а не на MMU кстати, потому что MMU занимался только преобразованием линейного адреса в страницы).
Но уже примерно с P6, с превращения x86 в risc с микрокодом это уже не так. Теперь LEA удобен разве что "быстрым умножением" и более чистым (если писать вручную) кодом
Я всего-лишь хотел сказать что наивно считать что в современных cpu реально вот есть выделенный AGU на котором считаются адреса и что дескать это реально быстрее потому что AGU заточен под это, а "ручное" ADD будет на ALU и будет хуже.
Мне кажется что это такое представление о CPU времен 8088.
ЗЫ: Вот тут в комментах целая гопа так же считает
https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction
миллионы не могут ошибаться
Такие кросотки нужно инлайнить.