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

Если искомое значение не ноль, то вы можете использовать XOR для всех
четырех байт, значением, которое вы хотите найти, а затем использовать
вышеизложенный метод.
Обработка нескольких операндов в одном регистре проще на MMX процессорах,
где для этого есть специальные инструкции и специальные 64 битные регистры.
Однако при использовании MMX инструкций можно получить большие задержки, если
после них вы используете инструкции с плавающей точкой, таким образом,
возможно, вы захотите использовать 32 бинтые инструкции.

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

Рассмотрим код языка C:

int i, n; double * X; double * Y; double DA;
for (i=0; i
Эта часть кода (называемая DAXPY) изучается специально потому, что это ключ
к решению линейных уравнений.

Пример 11:

DSIZE = 8 ; размер данных
MOV EAX, [N] ; количество элементов
MOV ESI, [X] ; указатель на X
MOV EDI, [Y] ; указатель на Y
XOR ECX, ECX
LEA ESI, [ESI+DSIZE*EAX] ; указатель на конец X
SUB ECX, EAX ; -N
LEA EDI, [EDI+DSIZE*EAX] ; указатель на конец Y
JZ SHORT L3 ; проверка N = 0
FLD DSIZE PTR [DA]
FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[0]
JMP SHORT L2 ; переход в цикл
L1: FLD DSIZE PTR [DA]
FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[i]
FXCH ; берем старый результат
FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; сохраняем Y[i]
L2: FSUBR DSIZE PTR [EDI+DSIZE*ECX] ; вычитаем из Y[i]
INC ECX ; увеличиваем индекс
JNZ L1 ; цикл
FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; сохраняем последний результат
L3:

Здесь мы используем те же методу, что и в примере 6: Используем счетчик цикла
в качестве индекса и ведем счет через отрицательные значения вплоть до нуля.
Конец одной операции перекрывается с началом другой.