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

FADD [a3] ; такты 7-9
FXCH ST(1) ; такт 7
FADD [b3] ; такты 8-10
FXCH ST(2) ; такт 8
FADD [c3] ; такты 9-11
FXCH ST(1) ; такт 9
FADD [a4] ; такты 10-12
FXCH ST(2) ; такт 10
FADD [b4] ; такты 11-13
FXCH ST(1) ; такт 11
FADD [c4] ; такты 12-14
FXCH ST(2) ; такт 12

В вышеуказанном примере, мы используем три независимых потока. Каждый FADD
исполняется 3 такта, так что у нас есть время, чтобы запустить другие FADD.
Когда мы запускаем FADD в потоке "a" у нас есть время, чтобы запустить два
новых FADD в потоке "b" и с "c", до того как мы вернемся к потоку "a", таким
образом все три FADD принадлежат одному потоку. Мы используем инструкцию FXCH,
каждый раз, когда нам надо получить регистр, принадлежащий к желаемому потоку
ST(0). Как вы можете увидеть в вышеуказанном примере, мы создали неплохой
блок, однако не очень хорошо, что FXCH периодически повторяется. Вам придется
основательно "поиграться" с компьютером, чтобы всегда знать какой регистр
используется.

Все виды инструкций FADD, FSUB, FMUL, и FILD исполняются по 3 такта, и могут
перекрываться, таким образом вы можете спаривать их, используя выше описанный
алгоритм. Операнд адреса не занимает больше времени, чем операнд регистра,
если он находиться в кеше L1 и правильно выравнен.

Теперь пришло время познакомиться с правилами исключений, препядствующих
перекрытиям: Вы не можете запустить инструкцию FMUL, такт спустя после другой
инструкции FMUL, поскольку инструкция FMUL не очень хорошо реализована в
конвеере. Рекомендуется ставить другую инструкцию между двумя FMUL. Например:

FLD [a1] ; clock cycle 1
FLD [b1] ; clock cycle 2
FLD [c1] ; clock cycle 3
FXCH ST(2) ; clock cycle 3
FMUL [a2] ; clock cycle 4-6
FXCH ; clock cycle 4
FMUL [b2] ; clock cycle 5-7 (остановка AGI)
FXCH ST(2) ; clock cycle 5
FMUL [c2] ; clock cycle 7-9 (остановка AGI)
FXCH ; clock cycle 7
FSTP [a3] ; clock cycle 8-9
FXCH ; clock cycle 10 (неспарено)
FSTP [b3] ; clock cycle 11-12
FSTP [c3] ; clock cycle 13-14

У нас получилась остановка AGI после FMUL [b2] и перед FMUL [c2], потому что