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

имеют двухбайтный опкод, где первый байт - 0Fh. Байт 0Fh ведет себя
как префикс на процессоре Pentium без MMX, но не на процессоре Pentium
MMX. Наиболее общие инструкции с префиксом 0Fh: MOVZX, MOVSX, PUSH FS,
POP FS, PUSH GS, POP GS, LFS, LGS, LSS, SETcc, BT, BTC, BTR, BTS, BSF,
BSR, SHLD, SHRD и IMUL с двумя не численными операндами.

На Pentium без MMX, инструкции с префиксами могут исполняться только в
U-трубе, за исключением ближних условных переходов.
На Pentium MMX инструкции с размером операнда, размером адреса, или
префиксом 0Fh могут выполниться в каждой трубе, а инструкции с префиксом
сегмента, повторения и блокировки по-прежнему могут выполняться только в
U-трубе.

8.8 Инструкция, которая имеет как смещение, так и непосредственные данные не
спариваются на Pentium без MMX, а на Pentium MMX спариваются только в
U-трубе:
MOV DWORD PTR DS:[1000], 0 ; не спаривается, или только в U-трубе
CMP BYTE PTR [EBX+8], 1 ; не спаривается, или только в U-трубе
CMP BYTE PTR [EBX], 1 ; спаривается
CMP BYTE PTR [EBX+8], AL ; спаривается

8.9 Инструкции должны предзагружаться и декодироваться. Это объяснятеся в
разделе 9.


9. ИСПОЛНЕНИЕ КОДА В ЦИКЛЕ
==========================
Обычно при первом исполнении некоторой части кода времени тратиться больше,
чем при ее повторном исполнении. И причины этого следующие:

9.1 При загрузке кода из RAM в кеш требуется больше времени, чем на
исполнение этого кода.

9.2 Декодирование кода - тонкий момент. Если требуется 1 такт на декодирование
инструкции, то не возможно за этот-же так декодировать вторую инструкцию,
т.к. процессор еще не знает длину первой инструкции. Pentium решает эту
проблему запоминая длину любой, только что выполнившейся инструкции.
Следствием этого является то, что при первом исполнении инструкции не
спариваются, за исключением случая, когда длины обеих команд - один байт.

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

9.4 Все данные, используемые кодом должны быть в кеше данных, что может занять
больше времени, чем исполнение инструкций. При повторном исполнении
возможно, что данные уже в кеше.

Четырех этих причин более чем достаточно, что бы код цикла при повторном
исполнении требовал меньше времени, чем при первом.