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


Чередование операций с плавающей точкой здесь работает превосходно: Задержка
ы 2 такта между FMUL и FSUBR заполняется FSTP предыдущего результата. Задержка
в 3 такта между FSUBR и FSTP заполняется целочисленными операциями обслуги
цикла. Остановка AGI анулируется путем чтения единственного параметра в первом
такте, после того как счетчик-индекс был увеличен.

Данное решение дает нам 6 тактов на операцию, это лучше, чем развернутое
решение, представленное Intel!

Развертывание циклов с плавающей точкой
---------------------------------------
Цикл DAXPY, развернутый в 3 раза весьма усложнился:

Пример 12:

DSIZE = 8 ; размер данных
IF DSIZE EQ 4
SHIFTCOUNT = 2
ELSE
SHIFTCOUNT = 3
ENDIF

MOV EAX, [N] ; количество элементов
MOV ECX, 3*DSIZE ; счетчик смещения
SHL EAX, SHIFTCOUNT ; DSIZE*N
JZ L4 ; N = 0
MOV ESI, [X] ; указатель на X
SUB ECX, EAX ; (3-N)*DSIZE
MOV EDI, [Y] ; указатель на Y
SUB ESI, ECX ; указатель конца - смещение
SUB EDI, ECX
TEST ECX, ECX
FLD DSIZE PTR [ESI+ECX] ; первый X
JNS SHORT L2 ; менее чем 4 операции
L1: ; main loop
FMUL DSIZE PTR [DA]
FLD DSIZE PTR [ESI+ECX+DSIZE]
FMUL DSIZE PTR [DA]
FXCH
FSUBR DSIZE PTR [EDI+ECX]
FXCH
FLD DSIZE PTR [ESI+ECX+2*DSIZE]
FMUL DSIZE PTR [DA]
FXCH
FSUBR DSIZE PTR [EDI+ECX+DSIZE]
FXCH ST(2)
FSTP DSIZE PTR [EDI+ECX]
FSUBR DSIZE PTR [EDI+ECX+2*DSIZE]
FXCH