Сложение.

PADDB mmx,src ;

W/D

Сложение байтов результат в mmx

перенос игнорируется

сложение с насыщением

PADDSB mmx,src ;только знаковое для байт

PADDSW ; для слов

реализует сложение байт результат в приемнике при этому если результат превышает значение 127 то записывает 127

 

Вычитание.

PSUBB mmx, src ; mmx=mmx-src

W

D

Вычитание элемента данных из источника и приемника, заем игнорируется -128-1=+127

PSUBSB -128-1=-128

SW

без знаковое вычитание с насыщением:

PSUBUSB 0-1=0

USW

P – потоковое (команды mmx)

Источником может быть память

Старшее умножение:

PMULHW mmx,src

Команда умножает каждое из 4-х слов приемника на 4 слова приемника, старшее чота там и кароче максимум 128 битный

Старшие половины результатов помещаются в приемник при этом младшие половины теряются

PMULLW mmx,src

Умнажает каждое из 4-х слова регистра mmx на 4 слова приемника младшие половины результата записываются в приемник.
PMADDWD mmx, src умножает 4 слова со знаком из источника на слово со знаком приемника произведение 2-х старших пар слов складываются между собой и сумма записывается в старшее двойное слово приемник, сумма произведение 2-х младших пар слов записывается в младшие 2 слова приемника.

 

0.ввод the_loop: movq mm1, [LOP] ;ESI

movq mm0, [ROP] ;EDI

movq mm2, mm0

1.мл.умножение PMULHW mm0, mm1

2.старшее умножение PMULLW mm2, mm1

3.объединить результат PUNPCKLWD mm3, mm0

4.вывод PUNPCKHWD mm3, mm2

PUNPCKLWD mm4, mm0

PUNPCLHWD mm4, mm2

add LOP, 08h

add ROP, 08h

movq [REZ],mm3

add REZ ,mm4

movq [REZ],mm4

sub count,4

JNZ the_loop

void mulAss(int32* REZ, int16 *LOP, int* ROP, int count)

Доступ будет такой

mov ecx, [ebp+08h]

mov edi, [ebp+0Ch]

mov esi, [ebp+10h]

mov eax, [ebp+14h]

 

Сравнения операции.

PCMPEQB/W/D mmx,src ;сравниваются байты, слова, двойные слова

PCMPEQD [12][-7], [100][-7] ;= [0][-1]

PCMPGTB/W/D mmx,src ; сравнивают элементы данных источника и приемника если элемент приемника больше чем приемника то в этом элементы устанавливаем единицы, в противном случай 0

PCMPGTD [100][-7], [12][-7] ;= [-1][0]

 

Логические операции.

PAND mmx,src - логическое И над каждым битом

POR mmx,src - логическое ИЛИ

PXOR mmx,src - логическое ИСКЛЮЧАЮЩЕЕ_ИЛИ

PANDN mmx,src – логическое НЕ_И или штрих Шеффера

 

Команды сдвига:

PSLLW/D/Q mmx,dst ;источником может быть непосредственное значение, регистр mmx или ячейка памяти, младшие биты заполняются нулями.

PSLLW mm0,15 ; обнулит

PS L/R L/A W/D/Q – сдвиг влево\вправо логический\арифметический 16\32\64

 

EMMS – освобождение регистров mmx. Включает FPU-шки.

 

 

Расширения SSE. (Stream SIMD Extensions)

Впервые появились в Пентиумах ядро SIMD.

Упакованные 128 битные регистры, в которых находится 4 слова с плавающей запятой.

[float][float][float][float] – 32битные float.

Имеют недостаточную точность

Были добавлены команды целочисленные для команд MMX

с 3-х аппаратно добавилось кол-во регистров.

Изменился тип данных.

Расширился набор команд для работы с комплексными числа.

Предназначение: оптимизация по скорости плавающей запятой.

Если точность флотов не устраивает, то не рекомендуется оптимизировать.

Теоретически скорость возрастает в 8-10 раз.

 

Кроме самих регистров SSE есть еще регистры флагов для SSE которые что то там изменяют или показывают состояние.

Команды:

movaps dst,src – самый быстрый, пересылка выровненных упакованных чисел.

Копирует 128 бит из источника в приемник один из операндов должен быть регистр SSE данные должны быть выровнены

movups dst,src – пересылка не выровненных упакованных чисел

Копирует 128 бит из источника в приемник один из операндов должен быть регистр SSE //ПОЛЬЗОВАТСЯ ЭТОЙ ХУЙНЁЙ НИЛЬЗЯ ОНО ГОРАЗДО МЕДЛЕННЕЕ

Индекс нулевого индекса должен быть кратен Шыснадцати

Штатные средства этим не обеспечивают.

Надо добавитzь еще 4 байта, а патом сгенерировать указатель на один из байтов.

В программе делаем 2 указателя на флоты

float *vector,*v_ptr;

Распределим память для указателя вектор

vector = new float[size+4]; //внизу для освобождение

v_ptr=(float*)(((int)vector/4+1)*4); //найти ближайший кратный, освобождать его не надо

movss dst,src – копирует младшие 32 бита из источника в приемник. //НЕ ИСПОЛЬЗОВАТЬ ЭТУ ХУЙНЮ.

movhps

movlps

movhlps

movlhps

movmsk

 

ADD+PS/SS sse,src сложение 4-х пар упакованных флотов/для нулевого слова один из операндов должен быть регистром SSE, 2-й операнд.

SUB-PS/SS sse,src вычитает из источника приемник, 4 пары упакованных слотов/для нулевого слова

MUL*PS/SS sse,src умножает 4 пары слова/для нулевого слова на источник

DIV/PS/SS sse,src делит 4 пары слова/для нулевого слова результат в приемник, приемник – SSE

Single (SS) команды используются для распараллеливания того самого.

 

SQRTPS/SS sse,src извлекает корень квадратный(x)

RCPPS/SS sse извлекает 1/x Ошибка этой операции 1,5*2^(-12).

RSQRTPS/SS sse извлекает 1/sqrt(x) Bug too its rain cats and dogs.

 

MAXPS/SS sse,src выбирает старший флот и сует в приемник

MINPS/SS выбирает младший флот и сует в приемник, словами упакованными в регистр sse могут быть не числа (если там не числа то в приемник записывается число)

 

Команды сравнения:

CMPPS/SS sse, src, imm упячивает ЛОЖ=0 либо 0FFFFFFFFh истина

imm – что именно проверяем.

0 == приемник равен источнику, 1 < приемник строго меньше,

2 <= меньше равен приемник источнику, 3 – один из операндов не число, 4 ≠ не равенство, 5 – >= приемник больше или равен, 6 - > больше, 7 – оба операнда числа.

COMISS sse,src не изменяет значение операндов, сравнение нулевой пары чисел с установкой флагов (результат в регистре флагов).

 

Команды преобразования типов:

CVTPI2PS sse, mmx – 4 числа из регистра mmx в sse упакованные целые в вещественные в младшие 2 флота.

CONVERT PACKED INTEGER TO PACKED SFLOAT

CVTPS2PI mmx, sse – младшие 2 флота в MMX упаковывается 64 бита. Возможны ошибки.

 

Правило округления двоичного процессора округление в +/- Бесконечность, 0.

1,7=2 + -1,7=-1 +

1,7=1 - -1,7=-2 -

1,7=1 0 -1,7=-1 0