"Оптимизация для PENTIUM процессора" - читать интересную книгу автора

Если ваш цикл слишком большой и не помещается в кеш, то против вас сработают
9.1 и 9.2. Вы должны попытаться реорганизовать цикл, что бы он целиком
помещался в кеш. Если у вас более 256 переходов и ветви в цикле, то против
вас сработает 9.3 по полной программе.

Равно как, если ваш цикл часто обращается к слишком большим структурам данных,
то замедление скорости будет связано с многочисленными промахами кеша данных.


10. НЕПОЛНОЕ СПАРИВАНИЕ
=======================
Есть ситуации, когда две спаривающиеся инструкции не выполняются одновременно,
а с небольшим перекрытием. Однако они все еще составляют пару, поскольку одна
инструкция выполнятеся в U-трубе, а вторая в V-трубе. Ни одна инструкция не
может начать исполняться, пока не завершаться обе недоспарившиеся инструкции.

Неполное спаривание произойдет в следующих случаях:

10.1 Если у вторых инструкций остановка AGI

10.2 Две инструкции не могут получить доступ к одному и тому-же двойному слову
одновременно.
Следующий пример подоразумевает, что ESI делиться на 4:
MOV AL, [ESI] / MOV BL, [ESI+1]
Два операнда в пределах одного и того-же DWORD, они не могут выполниться
одновременно. На пару уходит 2 такта.
MOV AL, [ESI+3] / MOV BL, [ESI+4]
Здесь два операнда находятся по разные границы DWORD, они спариваются и
на выполнение пары требуется один такт.

10.3 Правило 10.2 распространяется на те данные у которых одинаковые 2-4 бит
в адресах. (конфликт банков кеша) Для DWORD адресов это означает, что
два адреса не должны делиться на 32.
Примеры:
MOV [ESI], EAX / MOV [ESI+32000], EBX ; неполное спаривание
MOV [ESI], EAX / MOV [ESI+32004], EBX ; полное спаривание

Спаренные инструкции, не обращающиеся к памяти выполняются за один такт. MOV
инструкции, передающие данные в или из памяти, так же исполняются за такт,
если данные находятся в кеше и правильно выравнены. Нет замедления при
использовании комплексов режимов адресации, таких как например масштабирование
индексных регистров.

Спаренные инструкции, которые читают из памяти, делают расчеты и сохраняют
результат в регистре флагов, будут исполняться 2 такта.(инструкции
чтения/модифицирования).

Спаренные инструкции, которые читают из памяти, делают расчеты и сохраняют
результат в памяти, будут исполняться 3 такта. (инструкции
чтения/модифицирования/записи).