ОЭВМиС.Метод.Лабы
.pdfСправочная информация
Регистры
В процессоры, использующие ММХ, добавлено 8 новых 64-разрядных регистров ММО-ММ7. Они могут быть использованы только для выполнения операций с типами данных ММХ. Команды ММХ позволяют задавать в качестве операндов как регистры общего назначения (ЕАХ, ЕВХ, ECX, EDX, ЕВР, ESI, EDI и ESP), так и переменные в памяти, используя для этого стандартную схему адресации, принятую в процессорах х86. Хотя ММХ-регистры и имеют ни с чем не совпадающие названия, на самом деле они являются “псевдонимами” регистров сопроцессора (st0-st7). Это означает, что, изменяя один из регистров ММХ в своей программе, мы в то же время изменяем регистры сопроцессора. Зачем такие сложности? Не проще ли было их сделать “раздельными”? В конце концов, для этого понадобилось бы не так уж и много усилий со стороны разработчиков процессора... Очевидно, это было сделано не только с целью добавить работы программистам. Как всегда, все дело в совместимости. Если бы было сделано так, как подсказывает логика, то пришлось бы переписать операционную систему! Те, кто знаком с работой процессора в защищенном режиме, наверное, уже догадались, о чем идет речь. Конечно же, о мультизадачности. Дело в том, что в многозадачной среде программы должны быть независимы друг от друга. При переключении с одной задачи на другую значения всех регистров “старой” задачи должны быть сохранены. В настоящее время о сохранении регистров микропроцессора заботится сам микропроцессор, а о сохранении регистров сопроцессора заботится операционная система. Так как все регистры ММХ одновременно являют собой регистры FPU (Floating Point Unit — сопроцессор), то операционная система, сохраняя регистры FPU, сохраняет и регистры ММХ! Проблема решена, кроме того, она избавила нас от ожидания выхода Windows 95 ММХ. Программист должен заботиться о том, чтобы код, использующий FPU и ММХ, работал корректно. Код одного типа (ММХ или FPU) должен быть по возможности сгруппирован. Для достижения наибольшей производительности в программе не должно быть условных переходов из части кода, использующего FPU, к коду, использующему ММХ. После того как работа с ММХ завершена, нужно очистить регистры MM0-MM7. Это делается для того, чтобы в последующем сопроцессор не столкнулся с “грязными” регистрами непонятного формата. Для этого используется новая инструкция EMMS, которая помечает все регистры FPU как “пустые”.
Префиксы
Всем инструкциям х86 ставится в соответствие число - код операции. Длина кода операции один-два байта. Ему может предшествовать байт SIB (Scaleмасштаб, Index-индекс, Base-база), определяющий полный режим адресации. В процессоре х86 перед инструкцией также возможно присутствие префиксов, несколько модифицирующих “смысл” команды (префикс замены сегмента, префикс команды). Инструкции ММХ формируются точно так же, как и “старые” команды.
(8 бит x 8) восемь упакованных байтов
b1 |
|
b2 |
|
b3 |
|
b4 |
b5 |
|
b6 |
|
b7 |
|
b8 |
|
|
|
|
|
|
|
|
|
|
|
|
||
(16 |
бит x 4) четыре упакованных слова |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||||
|
W3 |
|
|
W2 |
|
W1 |
|
|
W0 |
||||
(32 |
бит x 2) |
два упакованных двойных слова |
|
|
|
|
|||||||
|
|
|
d1 |
|
|
|
|
|
d0 |
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
(64 |
бит x 1) |
64-разядное целое |
|
|
|
|
|
|
|
q0
Возможные варианты интерпретации регистров
Распаровка (paring)
Точно так же, как и “обычные” инструкции микропроцессора, инструкции MMX могут выполняться в паре с другой инструкцией одновременно. Более того, в некоторых случаях возможно одновременное выполнение двух инструкций MMX. Операции сдвига и умножения могут быть выполнены как на и-, так и на v-конвейере. Ограничения, накладываемые на возможность распаровки, следующие:
•Две инструкции, использующие блок сдвигов MMX (инструкции упаковки/распаковки и сдвига), не могут выполняться одновременно.
•Две инструкции, использующие блок умножения MMX (инструкции типа pmul, pmulh, pmadd), не могут выполняться в паре.
•Инструкции MMX, которые обращаются к памяти, могут выполняться только на и-конвейере,
•Целевой регистр ММХ-инструкции, попавшей в и-конвейер, не должен
совпадать с регистром-источником инструкции, попавшей на v- конвейер (тест на зависимость). То есть пара инструкций:
paddb mmreg2, mmregl
paddb mmregЗ, mmreg2
не может выполняться одновременно,
•Инструкция EMMS не паруется.
•Если установлены CR0.TS или CR0.EM, то ММХ-инструкции не могут быть выполнены на v-конвейере.
Типы данных
MMX поддерживает данные в упакованном формате. Это означает, что каждый 64-битовый регистр MMX может интерпретироваться как:
1)Восемь байтов;
2)Четыре слова;
3)Два двойных слова;
4)Одна 64-разрядная переменная.
То, как интерпретируется конкретный регистр, отлично отображается в мнемонике команды. К примеру, инструкция PADDB складывает два операнда, полагая, что они являются набором байтов, а PADDW считает операнды набором слов.
Все инструкции можно разбить на следующие группы:
умножение PMULHW |
PMULLW |
вычитание PSUBB |
PSUBD |
PSUBSB |
PSUBSW |
PSUBUSB |
PSUBUSW |
PSUBW |
|
команды сравнения проверка равенства
PCMPEQB PCMPEQD
PCMPEQW сравнение PCMPGTB PCMPGTD
PCMPGTW
команды упаковки/распаковки
PUNPCKHBW PUNPCKHDQ PUNPCKHWD PUNPCKLBW PUNPCKLDQ PUNPCKLWD PACKSSDW PACKSSWB PACKUSWB
логические команды
|
PAND |
|
|
PANDN |
|
|
|
|
|
|
|
|
POR |
|
|
PXOR |
|
|
|
|
|
|
|
|
команды |
передачи |
|
|
|
|
данных |
|
|
|
|
|
MOVD |
|
|
MOVQ |
|
|
|
|
|
||
|
|
|
|
|
|
команда сдвига
логический Влево сдвиг
PSLLD PSLLQ
PSLLW
арифметические
команды
сложение PADDB PADDD
арифметический сдвиг вправо PSRAD PSRAW
|
PADDSB PADDUSB |
PADDSW |
логический |
сдвиг |
|||
|
|
|
PADDUSW |
вправо PSRLD PSRLQ |
|||
|
PADDW |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сложение и умножение |
|
|
команды, |
|
||
|
|
|
|
|
|
очищавшие |
|
|
|
|
|
|
|
регистры |
|
|
PMADDWD |
|
|
EMMS |
|
||
|
|
|
|
||||
|
|
|
|
|
|
|
|
Краткое описание команд
Приведем описание лишь некоторых инструкций, помогающих понять суть работы ММХ.
MOVD
Формат MOVD mmregl, reg32/mem32 MOVD reg32/mem32, mmregl
Описание
Инструкция MOVD пересылает 32 младших бита регистра ММХ в регистр общего назначения или память Или же из регистра общего назначения/памяти в регистр ММХ В последнем случае, кроме собственно пересылки, биты 32-64 соответствующего регистра обнуляются
PADDB
Формат PADDB mmregl, mmreg2/mem64
Описание
Складывает восемь 8-разрядных чисел операнда источника (ММХ-регистра или 64-разрядного поля памяти) и восемь 8-разрядных чисел операнда- получателя (регистра ММХ) В случае переполнения полученные значения заворачиваются (то есть 255+10=9) без установки флага переноса при подсчете последующих байтов Результат помещается в операнд-получатель
PADDSW
Формат PADDSW mmregl, mmreg2/mem64
Описание
Складывает четыре 16-битных числа со знаком операнда источника (регистра ММХ или 64-разрядного поля памяти) и четыре соответствующих значения операнда-получателя (регистра ММХ) Если сумма каких-либо двух из них менее чем -32768 (8000h), то результат сложения -32768 (8000h) Аналогично в случае, когда сумма превышает 32767 (7FFFh), возвращаемый результат — 32767 (7FFFh). Результат заносится в операнд-получатель. Следующий список возможных ситуаций помогает понять, как происходит сложение
Если число D250h (-11696) складывается с 88Q7h (-30713), то получаемый результат 8000h (-32768) — минимально возможное 16-разрядное число
Если число 5321h (+21281) прибавляется в ЕС22h (-5086), то получаемый результат 3F43h (+ 16195)
Сумма 16-разрядного числа7007П (+28679) и OFF9h (+4098) дает результат 7PFFh (+32767) — максимально возможное положительное число
Если к FFFFh(-1) прибавить FFFFh(-1), то получим FFFEh (-2)
PCMPEQB
Формат PCMPEQB mmregl, mmreg2 /mem64
Описание
Сравнивает источник с получателем, рассматривая операнды как упакованные байты. Если биты операндов эквивалентны, то все биты 8- разрядной части получателя устанавливаются равными единице, в противном случае они обнуляются
PCMPGTD
Формат
PCMPGTB mmregl, mmreg2/mem64
Описание
Аналогична PCMPEQ, но в отличие от нее биты в целевом операнде устанавливается в том случае, когда байт целевого операнда больше соответствующего байта операнда источника
PACKUSWB
Формат PACKUSWB mmregl, mmreg2/mem64 Описание
Описание
Переводит восемь знаковых слов, задаваемых аргументами (по четыре слова в каждом), в восемь беззнаковых байтов. После чего результат сохраняется в mmregl. Сатурация при этом происходит следующим образом
•если слово содержит отрицательное число, то соответствующий ему байт будет равен нулю,
•если значение слова превышает 255, то соответствующий ему байт будет равен 255
Команды ММХ имеют такой формат
инструкция mmreg1, mmreg2/mem64
То есть источником может быть как переменная памяти, так и регистр ММХ. А целевым может быть только регистр ММХ, К тому же MOVD и MOVQ допускают пересылки из регистров ММХ в память, Одним из первых вопросов у меня был, зачем так много команд? Ведь количество операций не так уж и велико... Дело в том, что название команды формируется из двух частей. Первая часть говорит о том, что она делает (MOV, PSUB, PADD). Вторая же говорит о том, как она интерпретирует операнды. Рассмотрим команду PACKUSWB. Первая часть строки — PACK — указывает, что будем что-то упаковывать. Вторая же — USWB — в свою очередь разбивается на две — US и WB. US говорит о том, что результат будет беззнаковым с сатурацией, WB же указывает, что источник — упакованные слова, результат — упакованные байты. Благодаря такой записи смысл инструкции схватывается “на лету”, по этой же причине и команд так много. Приведем полный перечень мнемоник:
Р — упакованные данные (Packed data)
В — байт (byte) W — слово (word)
D — двойное слово (DoubleWord)
Q — 64-битовая переменная (QuadWord) S — знаковая (Signed)
U — беззнаковая (Unsigned)
SS — знаковая с сатурацией (Signed Saturation)
US —беззнаковая с сатурацией (Unsigned Saturation)
Список литературы
1)Б.Я. Цилькер. Организация ЭВМ и систем: Учебник для вузов / Б.Я. Цилькер, С.А. Орлов – СПб.: Питер, 2004.– 668с.
2)Кулаков В. Программирование на аппаратном уровне / В.*.Кулаков.–
СПб.: Питер, 2003.– 847с.
3)http://www.wasm.ru
4)http://ru.wikipedia.org
5)http://allasm.ru
6)http://citforum.uar.net
7)http://comprog.ru
8)http://www.kalashnikoff.ru
9)http://www.codenet.ru