- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
movq (%rdi), %rdi # this.11_6->_M_impl._M_start, D.49210
testq %rdi, %rdi # D.49210
je .L1 #,
jmp _ZdlPv #
.p2align 5,,7
.p2align 3
.L1:
rep
ret
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+132
movq (%rdi), %rdi # this.11_6->_M_impl._M_start, D.49210
testq %rdi, %rdi # D.49210
je .L1 #,
jmp _ZdlPv #
.p2align 5,,7
.p2align 3
.L1:
rep
ret
Говнокод от компилятора g++-4.5.2
Почему нельзя было сделать так:
movq (%rdi), %rdi # this.11_6->_M_impl._M_start, D.49210
testq %rdi, %rdi # D.49210
jne _ZdlPv #,
rep
ret
Не понимаю...
TarasB 21.07.2011 11:48 # −9
inkanus-gray 21.07.2011 13:11 # +5
Код для x86-64, но ничего сложного нет. Банальный высер компилятора с je+jmp.
Lure Of Chaos 21.07.2011 14:40 # +22
bugmenot 21.07.2011 18:19 # +7
Lure Of Chaos 21.07.2011 18:30 # +1
guest 22.07.2011 14:00 # −3
Lure Of Chaos 22.07.2011 14:21 # +1
Govnocoder#0xFF 22.07.2011 14:41 # +3
Кто-нибудь помнит ещё?
guest 19.08.2011 16:28 # −1
inkanus-gray 19.08.2011 17:50 # 0
guest 22.07.2011 13:59 # +2
inkanus-gray 21.07.2011 13:18 # +5
Кто такая _ZdlPv? Функция? Внешняя? Если да, то в объектном файле будет jmp [константа], а по адресу [константа] расположен фиксап, который будет заполняться при линковке. Если же заменить je+jmp [фиксап] на jne фиксап, то теоретически пофиксить такой код можно, но только при статической линковке. А если _ZdlPv — функция из динамической библиотеки, то будет облом.
wecanstoptrain 21.07.2011 13:29 # 0
тогда это не говнокод, про такую тонкость с условным переходом не знал
inkanus-gray 21.07.2011 13:36 # 0
wecanstoptrain 21.07.2011 13:45 # +5
Поэтому в optimization guide от amd сказано, что в этих случаях надо использовать двухбайтный вариант rep ret. Это справедливо как для x86_32-кода так и для x86_64-кода для процов архитектур Athlon 64/64-II
inkanus-gray 21.07.2011 14:06 # 0
gegMOPO4 21.07.2011 16:20 # +3
wecanstoptrain 21.07.2011 16:27 # 0
DemonId7 22.07.2011 12:36 # +3
Dummy00001 21.07.2011 16:24 # 0
С такими вопросами на GCC mail list'ы.
Я предполагаю что это сделано для branch prediction. Либо компилер сам догадался, либо в коде стояли хинты то что 'je' ветка будет выполнятся редко - поэтому она была сделана джампов вниз, которые процессор предполагает что с высокой вероятностью не произойдут. (И джампы вверх наоборот.)
align'ы внизу потому что на Интеловых процах переход по адресу выровненому на 8 байт быстрее чем по невыровненому адресу. (Мода которую запустли P4.)
Ну это я предполагаю - давно на асме ничего не писал.
wecanstoptrain 21.07.2011 16:28 # 0