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

предыдущий FMUL был запущен в предыдущем такте. Однако, вы можете легко
улучшить этот код, просто вставив инструкцию FLD, между другими FMULами:

FLD [a1] ; такт 1
FMUL [a2] ; такты 2-4
FLD [b1] ; такт 3
FMUL [b2] ; такты 4-6
FLD [c1] ; такт 5
FMUL [c2] ; такты 6-8
FXCH ST(2) ; такт 6
FSTP [a3] ; такты 7-8
FSTP [b3] ; такты 9-10
FSTP [c3] ; такты 11-12

В других случаях вы можете установить FADD, FSUB или что-нибудь еще между
FMUL, чтобы избежать остановки AGI.

Перекрытие инструкций с плавающей точкой предполагает, конечно, что у вас есть
несколько потоков расчетов, которые вы можете чередовать. Если у вас есть
только одна большая формула, то вы можете считать разные ее части параллельно,
для того чтобы достичь перекрытия. Если вы хотите сложить, например, 6 чисел,
то вы можете разделить этот процесс на две части, по 3 числа, а результаты
сложить в конце:

FLD [a] ; clock cycle 1
FADD [b] ; clock cycle 2-4
FLD [c] ; clock cycle 3
FADD [d] ; clock cycle 4-6
FXCH ; clock cycle 4
FADD [e] ; clock cycle 5-7
FXCH ; clock cycle 5
FADD [f] ; clock cycle 7-9 (остановка AGI)
FADD ; clock cycle 10-12 (остановка AGI)

Здесь у нас есть остановка AGI, на один такт, до FADD [f], потому что она
ждет результата FADD [d] и два такта остановки AGI перед последним FADD,
потому что идет ожидание результата FADD [f]. Последнюю остановку AGI можно
замаскировать, вставив несколько целочисленных инструкций, но с первой такой
фокус не пройдет, потому что в таком случае не спариться FXCH.

Первую остановку AGI можно анулировать, если иметь не две, а три потока, но
это будет стоить дополнительного FLD, таким образом мы не выиграем времени и
в этом нет необходимости до тех пор пока мы не складываем по крайней мере
восемь чисел.

Не все инструкции с плавающей точкой могут перекрываться. Но некоторые
инструкции с плавающей точкой могут перекрывать последующие инструкции с
целым операндом. К примеру инструкция FDIV исполняется 39 тактов. Все первые
такты могут перекрываться с целочисленными инструкциями, но только последние
два такта могут перекрыть инструкции с плавающей точкой. Пример: