Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модуль числа в XMM регистре 
:(
    Опции темы
Russel
Дата 9.8.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 9.8.2006

Репутация: нет
Всего: нет



Добрый День, У меня в XMM регистре находятся 8 целых чисел со знаком по 16 бит, как мне получить модули этих чисел? SSE2...
PM MAIL   Вверх
sgi1981
Дата 10.8.2006, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Думал я думал...
И придумал последовательность из пяти инструкций XMM-расширения.
Придумать из меньшего количества инструкций не удалось.

Код

;я допустил, что изначально у вас исходный вектор находится в xmm0 и xmm1 свободен
 movdqa xmm1,xmm0;
 psraw xmm1,15;
 pxor xmm0,xmm1;
 psrlw xmm1,15;
 paddw xmm0,xmm1;


Объясняю.
В xmm1 копруем вектор из xmm0.

Если соответствующий элемент вектора xmm1 отрицательный - то при арифметическом сдвиге на 15 разрядов в двухбайтном слове элемента вектора все разряды окажутся равными 1, в противном случае они все будут 0.

После выполнения команды исключающего ИЛИ (pxor) в отрицательных элементах исходного вектора все биты изменят значения на противоположные, а в положительных элементах нет, так как отрицательный элемент дал в xmm1 значение ffffh, а положительный - значение 0000h. В результате этого в xmm0 на месте каждого отрицательного элемента вектора получится значение на единицу меньшее модуля бывшего отрицательного значения.

Значит необходимо сложить с элементами вектора xmm0, на месте которых были отрицательные числа, значение 1, а с остальными - значение 0.Эти значения мы получим из элементов вектора xmm1 путем логического сдвига элементов на 15 разрядов вправо.

Складываем полученный вектор xmm1 с xmm0 и получим в регистре xmm0 то что требуется - модуль элементов.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Mayk
Дата 11.8.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Цитата(sgi1981 @  10.8.2006,  07:51 Найти цитируемый пост)


Значит необходимо сложить с элементами вектора xmm0, на месте которых были отрицательные числа, значение 1, а с остальными - значение 0.Эти значения мы получим из элементов вектора xmm1 путем логического сдвига элементов на 15 разрядов вправо.

Если мы будем вычитать а не складывать, то мы сэкономим целую команду.  -(-1) = +1

Цитата(sgi1981 @  10.8.2006,  07:51 Найти цитируемый пост)
 psrlw xmm1,15;
 paddw xmm0,xmm1;

заменить на psubw xmm0, xmm1.
Примерно так делают компиляторы когда хотят получить модуль числа.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0393 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.