Сложение.
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