"Оптимизация для PENTIUM процессора" - читать интересную книгу авторадекодирующаяся) может "затмевать" N-1 префикс для следующих двух (иногда трех)
инструкций. Другими словами, каждый такт (кроме первого), который использует инструкция, что бы выполниться может быть использован для декодирования префикса последующей инструкции. Этот эффект может распространяться на предсказанную ветвь. Любая инструкция, которая использует дополнительные такты из-за остановки AGI, промаха кеша, рассогласования, или любой друго причины, кроме задержки декодирования и не правильного предсказания перехода может "затмевать" декодировку префиксов последующих команд. На Pentium MMX неспаренные команды так же могут создавать эффект "затемнения". Примеры: CLD / REP MOVSD Инструкция CLD исполняется два такта, по этому второй такт будет использован для того, что бы "затемнить" декодирование префикса REP. Код использует два такта, если CLD будет стоять "далеко" от REP MOVSD. CMP DWORD PTR [EBX],0 / MOV EAX,0 / SETNZ AL Инструкция CMP, так же, будет исполняться два такта, потому что это инструкция чтения/модифицирования. Префикс 0Fh инструкции SETNZ будет декодирован во время второго такта инструкции CMP, таким образом процесс декодирования будет скрыт. 14. УМЕНЬШЕНИЕ ДЛИНЫ КОДА Как объяснялось в разделе 6, размер кеша кода - 8Кб. Если у вас проблемы с размещением критической части вашего кода в кеше, то вы можете рассмотреть возможность уменьшения вашего кода. 32 битный код, обычно, длиннее 16 битного, поскольку адресные константы занимают по 4 байта, а не по 2, как в 16 битном. Тем не менее 16 битный код имеет другие недостатки, т.н. префиксы (напоминаю, что мы рассматриваем модель FLAT. - прим. переводчика), или проблемы со смежными словами (см. раздел 10). Однако далее мы обсудим некоторые другие способы уменьшения кода. Многие адреса переходов, адреса данных и константы займут меньше места, если они могут быть представлены как байт со знаком, т.е. они находятся в пределах от -128 до +127. Для переходов это будет означать, что инструкция займет на 2 байта меньше, а ведь инструкции перехода за пределы 127 байт займут 5 байт для условного перехода и 6 для безусловного. Подобным образом, адреса данных займут меньший объем, если их можно выразить как указатель и смещение в пределах -128..+127 байт. Пример: MOV EBX,DS:[100000] / ADD EBX,DS:[100004] ; 12 байт Уменьшено до: MOV EAX,100000 / MOV EBX,[EAX] / ADD EBX,[EAX+4] ; 10 байт |
|
|