Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
13
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.6.2. Команды пересылки и преобразования данных

Команды этой группы приведены в табл. 2.46.Команды MOVAPS и MOVUPS производят пересылку 128-разрядных данных между SSE-регистрами xmm или SSE-регистром и ячейкой памяти с адресом m128. Эти команды не могут переносить данные из памяти в память. Команда MOVAPS осуществляет пересылку выравненных данных: если один из операндов находится в памяти, то его адрес должен быть выравнен по 16-байтной границе, иначе реализуется исключение типа #GP («наруше­ние защиты»). Для пересылки невыравненных данных следует использовать команду MOVUPS, которая не вызывает исключения в этом случае.

Команды MOVHLPS и MOVLHPS пересылают 64-разрядные данные из старшей поло­вины (элементы F3-F2) SSE-регистра xmm2 в младшую половину (элементы F1-FO) SSE-регистра xmml или из младшей половины в старшую половину. При пересылке содержимое остальных половин в регистре приемнике не изменяется. Операнды могут храниться толь­ко в SSE-регистрах.

Команды MOVHPS и MOVLPS выполняют пересылку 64-разрядных данных между SSE-регистром xmm и ячейкой памяти с адресом т64. Эти команды не могут использоваться для переноса данных из памяти в память или из SSE-регистра в SSE-регистр. Когда приемником операнда является SSE-регистр, то данные из памяти загружаются в старшую (команда MOVHPS) или младшую (команда MOVLPS) его половину, а содержимое другой половины не изменяется. Если приемником операнда является ячейка памяти, то в нее записываются данные из старшей/младшей (команды MOVHPS/MOVLPS) половины SSE-регистра.

Команда MOVMSKPS формирует 4-битовую маску из старших (знаковых) битов S каж­дого элемента F3-FO, хранящегося в SSE-регистре xmm. Затем эта маска расширяется нулем до 32 бит и записывается в регистр общего назначения г32 (рис. 2.35).

Команда MOVSS производит пересылку 32-разрядных данных между SSE-регистрами xmm или SSE-регистром и ячейкой памяти с адресом т32. В случае, когда источником и приемником операндов являются SSE-регистры, младшее двойное слово (элементы F1-FO) из регистра-источника копируется в младшее двойное слово регистра-приемника, а его старшие разряды (элементы F3-F2) не изменяются. Если приемником является ячейка памяти, то в нее записывается младшее двойное слово из SSE-регистра. Если же операнд из ячейки памяти т32 пересылается в SSE-регистр, то двойное слово из памяти расширя­ется нулем до 128 разрядов и загружается в регистр xmm.

Команда SHUFPS изменяет порядок размещения (производит перестановку) элемен­тов F3-FO в SSE-регистрах аналогично тому, как это реализует ММХ-команда PSHUFW. При этом элементы операнда из SSE-регистра или ячейки памяти xmm/m128 перемещают­ся в определенные позиции элементов результата, которые записываются в регистр-при­емник xmm. Непосредственный операнд im8 определяет расположение элементов резуль­тата: биты Ы-0 этого операнда задают номер i элемента Fi исходного операнда, который размещается в качестве элемента FO результата, биты ЬЗ-2 - номер элемента, размещае­мого на месте элемента F1, биты Ь5—4 - номер элемента, размещаемого на месте F2, биты Ь7-6 - номер элемента, размещаемого на месте F3. Выполнение данной операции иллюстрируется на рис. 2.36.

Команды UNPCKHPS и UNPCKLPS производят распаковку данных аналогично тому, как это выполняют ММХ-команды PUNPCH, PUNPCKL. Данные команды объединяют в один операнд старшие половины (элементы F3-F2, команда UNPCKHPS) или младшие половины (элементы F1-FO, команда UNPCKLPS) операндов, хранящихся в SSE-регистре xmm и регистре или ячейке памяти xmm/m128. Результат записывается в регистр xmm, причем элементы исходных операндов чередуются, размещаясь в этом регистре. Выпол­нение этих операций показано на рис. 2.37