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

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

Команды этой группы приведены в табл. 2.41. Команды MOVD, MOVQ, PEXTRW, PINSRW и PMOVMSKB осуществляют пересылку данных, а команды PACKSS[WB,DW], PACKUSWB, PUNPCKH[BW,WD,DQ], PUNPCKL[BW,WD,DQ] и PSHUFW-преобразование данных: упа­ковку, распаковку и переупорядочивание элементов. Используемые операнды задаются в синтаксисе Ассемблера номером ММХ-регистра mm, именем регистра общего назначения г32 или адресом ячейки памяти m16, m32 или т64, хранящей, соответственно 16-, 32- или 64-разрядные данные. При определении выполняемой операции в табл. 2.41 указывается формат пересылаемых упакованных данных (В, W, D или Q), а в случае необходимости также и номер соответствующего элемента: например, mm(W) - слово из ММХ-регистра с номером mm, mm(BO) -элемент (байт) ВО из ММХ-регистра с номером mm.

Таблица 2.41

Команда MOVQ производит пересылку 64-разрядного операнда - счетверенного слова mm(Q)- между двумя ММХ-регистрами или между ММХ-регистром и памятью. Эта команда не выполняет перенос данных между ММХ-регистром и регистром общего назначения. Ко­манда MOVD производит пересылку 32-разрядного операнда -двойного слова mm(DO) -между ММХ-регистром (младший элемент) и памятью или регистром общего назначения. Если операндом-приемником является ММХ-регистр, то в его старшую половину загружает­ся нулевое значение. Данная команда не может использоваться для передачи данных между двумя ММХ-регистрами.

Команды PEXTRWn PINSRW производят пересылки 16-разрядных элементов - слов mm(Wi) - между ММХ-регистром и регистром общего назначения или памятью. Команда PEXTRW пересылает любой элемент (слово) из ММХ-регистра в младшие разряды Ы5-0 регистра общего назначения г32. В старшие разряды Ь31-16 этого регистра загружается нулевое значение. Команда PINSRW выполняет обратную операцию, пересылая слово из младших разрядов Ы5-0 регистра общего назначения или 16-разрядной ячейки памяти с адресом гп16 на место заданного элемента mm(Wi) в ММХ-регистр. Остальные три эле­мента (слова) в ММХ-регистре остаются без изменения. Номер i пересылаемого или заме­щаемого элемента в ММХ-регистре задается двумя младшими битами непосредственного операнда im8.

Команда PMOVMSKB формирует байт (8-битовую маску) из старших (знаковых) разря­дов Ь7 каждого байта Bi, хранящегося в ММХ-регистре mm. Эта маска размещается в млад­ших разрядах регистра общего назначения г32, а его старшие разряды заполняются нулями (рис. 2.26).

Команды PACKSS[WB,DW] и PACKUSWB выполняют операцию, которая называется упа­ковкой данных. Исходные элементы преобразуются в элементы, имеющие в два раза мень­ший размер, чем исходные (разрядность элементов уменьшается вдвое). При данном преоб­разовании используется принцип насыщения. Если значение исходного элемента больше верхнего предела или меньше нижнего предела, установленных для формата результата операции

(см. табл. 2.40), то в качестве результирующего элемента в ММХ-регистр заносится значение соответствующего предела. Выполнение этих команд иллюстрируется на рис. 2.27.

Команда PACKSSWB (рис. 2.27, а) упаковывает знаковые слова в знаковые байты. Если значение какого-либо исходного слова больше 007Fh (+127), то значение соответствующе­го байта результата будет 7Fh; если значение слова меньше FF80h (- 128), то значение байта результата 80h (- 128). Аналогичную операцию реализует команда PACKUSWB, ко­торая упаковывает знаковые слова в беззнаковые байты. Отличие от предыдущей опера­ции состоит только в определении пределов для беззнаковых байтов результата согласно табл. 2.40: если значение исходного слова больше OOFFh (255), то значение соответствую­щего байта результата FFh (255), если значение слова меньше OOOOh (0), то значение байта результата OOh (0).

Команда PACKSSDW (рис. 2.27, б) упаковывает знаковые двойные слова в знаковые слова. Если значение исходного двойного слова больше 00007FFFh (+32767), то значение соответствующего слова результата будет 7FFFh; если значение исходного слова меньше FFFFSOOOh (- 32768), то значение слова результата 8000Н (- 32768).

Команды PUNPCKH[BW,WD,DQ] и PUNPCKL[BW,WD,DQ] производит операцию, ко­торая называется распаковкой данных. Эти команды объединяют старшие (команды PUNPCKH) или младшие (команды PUNPCKL) половины исходных операндов, хранящих­ся в регистре mm и регистре или ячейке памяти mm/m64, в один результирующий опе­ранд, который размещается в регистре mm. При этом элементы исходных операндов перемешиваются, располагаясь через один (рис. 2.28). Дополнительный суффикс в мне­мокодах этих команд определяет, какие половины исходных операндов объединяются: старшие (мнемокоды с суффиксом Н) или младшие (мнемокоды с суффиксом L). Суф­фиксы BW (распаковка байтов), WD (распаковка слов), DQ (распаковка двойных слов) задают форматы представления результата и исходных операндов. Реализация опера­ции распаковки иллюстрируется на рис. 2.28 на примере выполнения команд PUNPCKHBW, PUNPCKLWDnPUNPCKLDQ. '

Команда PSHUFW производит переупорядочивание слов, перемещая элементы (сло­ва) операнда-источника из регистра или ячейки памяти mm/m64 в соответствующие пози­ции элементов операнда-приемника в регистре mm. Непосредственный операнд im8 ука­зывает, какой из элементов операнда-источника помещается в определенной позиции опе­ранда-приемника: биты Ы-0 этого операнда задают номер элемента в операнде-источни­ке, который помещается на место слова WO операнда-приемника, биты ЬЗ—2 - номер эле­мента, помещаемого на месте слова W1, биты Ь5—4 - номер элемента, помещаемого на месте слова W2, биты Ь7-6 - номер элемента, помещаемого на месте слова W3. Вы­полнение данной команды иллюстрируется на рис. 2.29.

Команда EMMS выполняет пересылку числа FFFFh в регистр тегов TW. При этом теги для всех регистров FPU и соответствующих им ММХ-регистров принимают значение 11, что соответствует их пустому состоянию. Таким образом, данная команда производит осво­бождение всех регистров FPU и соответственно ММХ-регистров. Данная команда исполь­зуется после завершения процедуры обработки упакованных данных, чтобы освободить регистры для последующего выполнения операций блоком FPU. Если эта команда не бу­дет выполнена, то регистры остаются заполненными упакованными данными (при ММХ-операциях теги принимают значение 00, что соответствует заполнению регистров), и обра­щение к ним вызовет исключение типа #MF («ошибка FPU»).