Я бы рекомендовал не вставлять nops, за исключением выравнивания целей ветвления. На некоторых конкретных процессорах алгоритмы прогнозирования ветвлений могут оштрафовать передачи управления на передачи управления, и поэтому nop может действовать как флаг и инвертировать прогноз, но в противном случае это вряд ли поможет.
Современные процессоры все равно преобразуют ваши операции ISA в микрооперации . Это может сделать классические методы выравнивания менее важными, так как предположительно микрооперационный транскодер пропустит nops и изменит как размер, так и выравнивание секретных операций истинной машины.
Тем не менее, по той же причине, оптимизация, основанная на первых принципах, должна приносить мало вреда или не причинять ему ничего.
Теория состоит в том, что лучше использовать кеш, запуская циклы на границах строк кеша. Если бы цикл начинался в середине строки кэша, то первая половина строки кэша неизбежно была бы загружена и сохранялась загруженной во время цикла, и это было бы бесполезным пространством в кэше, если цикл длиннее 1 /. 2 строки кэша.
Кроме того, для целей перехода начальная загрузка строки кэша загружает самое большое прямое окно потока команд, когда цель выровнена.
Относительно разделения встроенных инструкций, которые не являются целями ветвления с nops, есть несколько причин сделать это на современных процессорах. (Было время, когда машины RISC имели интервалы задержки , что часто приводило к вставке nops после передачи управления.) Декодирование потока команд легко передается по конвейеру, и если В архитектуре есть операции с нечетной длиной байтов, поэтому вы можете быть уверены, что они декодируются разумно.