Код (Text): mov ecx, $FFFFFF call @loop @loop: pop rax sub ecx, 1 jz @exit push rax push rax ret как избавиться от одного push rax?
n0name Насколько я понял это пауза в стиле а-ля 286 ) значит замена ret на jmp восстанавливающая правильность работы предсказателя ret-ов снизить эффективность (в смысле тормознутость) этой задержки )) t00x Код (Text): mov ecx, $FFFFFF call @loop @loop: sub ecx, 1 jz @exit push [rsp] ret
К сожалению, этот код не совсем эквивалентен исходному: когда сработает jz @exit, в стэке всё ещё останется адрес метки @loop.
Y_Mur, А что означает «пауза a'la 286»? Это код, специально написанный так, чтобы предсказатели ветвлений/возвратов P6+ пролетали, аки фанера над городом Парижем?
Это значит что в эпоху i286 паузы в виде циклов широко применялись, но с приходом многозадачности они есно потеряли актаульность - гораздо лучше отдать процессорное время ожидания задаче которой оно нужнее. Разумного оправдания как паузам а-ля 286 так и нарушению предсказания переходов не вижу, поэтому на всякий случай прозрачно намекнул ТС о повышенной тормозючести такого решения но если очень хочется разобраться в логике организации таких извратных циклов, то почему бы и не подсказать )
Y_Mur, Меня малость испугало упоминание 286. i386 тоже не имеет BTB и прочих прелестей неупорядоченного спекулятивного исполнения команд. Вроде это началось с PPro и иже с ними.