| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Модуль числа в XMM регистре |
| Автор: Russel 9.8.2006, 17:24 |
| Добрый День, У меня в XMM регистре находятся 8 целых чисел со знаком по 16 бит, как мне получить модули этих чисел? SSE2... |
| Автор: sgi1981 10.8.2006, 03:51 | ||
| Думал я думал... И придумал последовательность из пяти инструкций XMM-расширения. Придумать из меньшего количества инструкций не удалось.
Объясняю. В xmm1 копруем вектор из xmm0. Если соответствующий элемент вектора xmm1 отрицательный - то при арифметическом сдвиге на 15 разрядов в двухбайтном слове элемента вектора все разряды окажутся равными 1, в противном случае они все будут 0. После выполнения команды исключающего ИЛИ (pxor) в отрицательных элементах исходного вектора все биты изменят значения на противоположные, а в положительных элементах нет, так как отрицательный элемент дал в xmm1 значение ffffh, а положительный - значение 0000h. В результате этого в xmm0 на месте каждого отрицательного элемента вектора получится значение на единицу меньшее модуля бывшего отрицательного значения. Значит необходимо сложить с элементами вектора xmm0, на месте которых были отрицательные числа, значение 1, а с остальными - значение 0.Эти значения мы получим из элементов вектора xmm1 путем логического сдвига элементов на 15 разрядов вправо. Складываем полученный вектор xmm1 с xmm0 и получим в регистре xmm0 то что требуется - модуль элементов. |