@Bear писал(а):
2Ultimuver
Уже писали, что нужен не SSE3, а SSSE3.
Ненавижу Intel с его приколами! Какого хрена вместо SSE4, им вздумалось выпустить SSSE3? Или же 16-ть новых инструкций теперь уже так, дополнение?
Новые инструкции
Работа со знаком
PABSB, PABSW, PABSD — (Packed Absolute Value {Bytes/Words/DWords})
Input — { A0, A1… }
Output — { A0 * sign(A0), A1 * sign (A1)… }
Каждое поле результата есть абсолютная величина соответствующего поля из src1. Фактически это те же операции PSIGNB, PSIGNH, PSIGNW у которых оба аргумента один и тот же регистр.
PSIGNB, PSIGNW, PSIGND — (Packed Sign {Bytes/Words/DWords})
Input — { A0, A1… }, { B0, B1… }
Output — { A0 * sign(B0), A1 * sign (B1)… }
Каждое поле результата есть произведение поля из src1 на {-1,0,1} в зависимости от знака соответствующего поля в src2 (умножение на 0 когда поле в src2 равно нулю).
Сдвиги
PALIGNR — (Packed Align Right)
Input — { A0, A1 }, { B0, B1 }, imm8
Output — { B1_B0_A1_A0 >> (imm8 * 8) }
Два регистра операнда рассматривается как одно беззнаковое промежуточное значение удвоенной размерности из которого извлекается 64-х/128-х битное значение начиная с байта указанного в непосредственном аргументе-константе команды.
Перемешивание байт
PSHUFB — (Packed Shuffle Bytes)
Input — { A0, A1, A2,.. A7/A15 }, { B0, B1, B2,.. B7/B15 }
Output — { [AB0 AB1 AB2 …] }
Перестановка байт, каждый байт результата есть некоторый байт из первого аргумента определяемый по соответствующему байту из второго аргумента (если байт отрицательный, то в байт результат прописывается ноль, иначе используются младшие 3 или 4 бита как номер байта в первом аргументе).
Умножения
PMULHRSW — (Packed Multiply High with Round and Scale)
Input — { A0, A1… }, { B0, B1… }
Output — { A0 * B0, A1 * B1… }
Аргументы A и B рассматриваются как вектора 16-ти битных знаковых чисел с фиксированной запятой представленных в диапазоне [-1,+1) (то есть 0x4000 это 0.5, а 0xa000 это −0.75 и т. д.), которые перемножаются с друг-другом с корректным округлением.
PMADDUBSW — (Multiply and Add Packed Signed and Unsigned Bytes)
Input — { A0, A1, A2, A3,.. }, { B0, B1, B2, B3,.. }
Output — { (A0*B0+A1*B1), (A2*B2+A3*B3), … }
Производится побайтное перемножение векторов A и B, промежуточные 16-ти битные результаты попарно складываются между собой с насыщением и выдаются как результат.
Горизонтальные сложения/вычитания целых
PHSUBW, PHSUBD — (Packed Horizontal Subtract (16-ти или 32-х битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0-A1 A2-A3 … B0-B1 B2-B3 …}
Горизонтальное вычитание целых 16/32 битных полей.
PHSUBSW — (Packed Horizontal Subtract and Saturate Words (16-ти битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0-A1 A2-A3 B0-B1 B2-B3 }
Горизонтальное вычитание целых 16 битных полей с насыщением.
PHADDW, PHADDD — (Packed Horizontal Add (16-ти или 32-х битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0+A1 A2+A3 … B0+B1 B2+B3 …}
Горизонтальное сложение целых 16/32 битных полей.
PHADDSW — (Packed Horizontal Add and Saturate Words (16-ти битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0+A1 A2+A3 … B0+B1 B2+B3 …}
Горизонтальное сложение целых 16 битных полей с насыщением.
Теперь я хорошо понимаю почему у меня в проце этой SSSE3 нет! SSSE3 это полный абзац!
Да кому они сдались эти дурацкие 16-ть инструкций. От них же толку то, как с козла молока!