- 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
3.14159265 17.06.2010 14:24 # 0
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-))
guest 17.06.2010 15:19 # −4
3.14159265 17.06.2010 15:22 # 0
3500 - это не ТРУъ гет
3.14159265 17.06.2010 15:32 # 0
guest 17.06.2010 17:05 # −8
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,.
striker 18.06.2010 04:40 # −1
guest 18.06.2010 05:08 # +1
guest 18.06.2010 05:10 # 0
� �
guest 17.06.2010 14:30 # −6
guest 17.06.2010 14:31 # −6
Webkill 17.06.2010 14:34 # 0
3.14159265 17.06.2010 14:58 # 0
MS-компилеры тоже хороши
http://govnokod.ru/3271
http://govnokod.ru/3194
guest 17.06.2010 18:01 # −14
blackhearted 17.06.2010 19:05 # −4
Гений, робана ёт, оптимизаций.
guest 17.06.2010 20:13 # −8
guest 17.06.2010 21:36 # +3
3.14159265 18.06.2010 09:34 # 0
если он генит такие вещи?
mov [esp], ebx
mov ebx, [esp]
собственно тут проскакивало, что типа MS - кал. из-за таких вещей
fistp qword [tmp]
fild qword [tmp]
юзайте gcc. а оказывается и у gcc есть перлы
Dummy00001 17.06.2010 23:27 # +1
какие флаги использовал?
по отсутствию всяких разных извращенных инструкций - и 64-бит инструкций - можно предположить что данный код преднамерено совместим с i586. что может и быть объяснением.
gcc-4.4 -O3 -march=k8 :
и к слову "lea" как я слышал это по рекомендации самого Intel вместо add. причины точно уже не помню.
3.14159265 18.06.2010 09:21 # 0
да и версия древняя
кстати 4.32 в моем первом посте пооптимальней делает
>>"lea" по рекомендации самого Intel вместо add
если не затруднит линк какой-нибудь запостите - просто интересно
Dummy00001 18.06.2010 09:39 # +1
линка у меня нету. я просто в старые времена gcc мейл листы почитывал. можешь попробовать там сам поискать.
там много всего бегает, включаю вот такие чудеса.
3.14159265 18.06.2010 10:57 # 0
спс, буду искать
Dummy00001 18.06.2010 12:34 # 0
3.14159265 18.06.2010 12:45 # 0
а вот то что проц знает что делать после сложения/умножения дает ему бонус.
Это примерно как ускорение conditional jumpoв после cmp в Core2.
то есть получается gcc-4.3.2 and later генят в данном случае практически оптимальный код
3.14159265 18.06.2010 12:46 # +2
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.
guest 18.06.2010 15:27 # +1
Думаю что между
разницы нет.
А вот между
есть. Особенно если выполнить ее 100500 раз.
3.14159265 18.06.2010 15:46 # +1
думаю add edx,ecx по скорости не уступает lea edx, [ecx+edx], иначе все бы использовали lea где только можно
но вот для случаев lea bx,4[bp+si] - тут она действительно полезна
так на асме и пишутся места которые 100500 раз выполняются ))
pushkoff 18.06.2010 22:13 # 0
3.14159265 21.06.2010 11:03 # 0
SemaReal 24.03.2018 23:28 # 0
Initially LEA был эффективнее чем вручную делать ADD потому что выполнялся на специально заточенном адресном блоке (На AGU а не на MMU кстати, потому что MMU занимался только преобразованием линейного адреса в страницы).
Но уже примерно с P6, с превращения x86 в risc с микрокодом это уже не так. Теперь LEA удобен разве что "быстрым умножением" и более чистым (если писать вручную) кодом
bormand 24.03.2018 23:54 # 0
SemaReal 25.03.2018 00:02 # 0
Я всего-лишь хотел сказать что наивно считать что в современных cpu реально вот есть выделенный AGU на котором считаются адреса и что дескать это реально быстрее потому что AGU заточен под это, а "ручное" ADD будет на ALU и будет хуже.
Мне кажется что это такое представление о CPU времен 8088.
ЗЫ: Вот тут в комментах целая гопа так же считает
https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction
миллионы не могут ошибаться
guest 17.06.2010 23:52 # 0
Такие кросотки нужно инлайнить.
xaionaro 18.06.2010 10:05 # +1
guest 18.06.2010 03:04 # +1
paranoid 18.06.2010 12:54 # −1
xaionaro 18.06.2010 16:36 # +2
pushkoff 18.06.2010 22:15 # 0
paranoid 21.06.2010 11:41 # 0
xaionaro 18.06.2010 17:53 # +2
guest 18.06.2010 17:58 # −10
guest 19.06.2010 18:02 # −9
guest 19.06.2010 18:11 # −9
assa 15.04.2011 14:37 # 0
inho 24.03.2018 23:13 # 0