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

MOV EAX,[EBX] короче чем MOV EAX,[EBP], но
MOV EAX,[EBX+4] столько же MOV EAX,[EBP+4].


15. ПЛАНИРОВАНИЕ ОПЕРАЦИЙ С ПЛАВАЮЩЕЙ ТОЧКОЙ
============================================
Инструкции, оперирующие с плавающей точкой не могут спариваться, так же, как
другие инструкции, за исключением одного особого случая, определяемого
следующими правилами:
- первая инструкция (исполняющаяся в U-трубе) должна быть FLD, FADD, FSUB,
FMUL, FDIV, FCOM, FCHS, or FABS

- вторая инструкция (в V-трубе), должна быть FXCH

- инструкция следующая за FXCH, должна быть инструкцией, оперирующей с
плавающей точкой, в противном случае FXCH - возьмет дополнительный такт.

Этот особый случай спаривания очень важен, я кратко объясню почему.

Хотя инструкции с плавающей точкой не могут спариваться, многие могут
параллелится, т.е. новая инструкция начинается, пока не завершилась старая.
Например:
FADD ST(1),ST(0) ; такты 1-3
FADD ST(2),ST(0) ; такты 2-4
FADD ST(3),ST(0) ; такты 3-5
FADD ST(4),ST(0) ; такты 4-6

Очевидно, что две инструкции не могут перекрываться, если второй инструкции
требуется результат первой. Поскольку почти все инструкции с плавающей точкой
используют верхний регистр стека, ST(0), то на первый взгляд не много
возможностей получить независимые инструкции. Решение этой проблемы -
переименование регистра. Инструкция FXCH на самом деле не обменивает значения
регистров, а только меняет местами их имена. Инструкции вталкивающие или
выталкивающие из стека, так же работают переименованием. Процесс
переименования регистров очень хорошо оптимизирован на Pentium, по этому
процесс переименования может происходить прямо во время доступа к регистру.
Переименование регистра никогда не вызывает остановки AGI - возможна, даже,
неоднократное переименование регистров в одном такте, например когда вы
спариваете FLD или FCOMPP с FXCH.

Правильным использованием FXCH вы можете добиться множественного перекрывание
в вашем коде с плавающей точкой. Пример:

FLD [a1] ; такт 1
FADD [a2] ; такты 2-4
FLD [b1] ; такт 3
FADD [b2] ; такты 4-6
FLD [c1] ; такт 5
FADD [c2] ; такты 6-8
FXCH ST(2) ; такт 6