Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, СИСТЕМЫ И СЕТИ.doc
Скачиваний:
32
Добавлен:
06.11.2018
Размер:
2.94 Mб
Скачать

3.2. Программная модель цп Pentium

Программная модель ЦП включает три группы регистров данных (рис. 3.3), в каждой из групп по восемь регистров. Первая группа включает 32-разрядные целочисленные регистры, вторая – 80-разрядные регистры и третья – 128-разрядные регистры.

Расширение ММХ использует новые типы упакованных 64-разрядных данных:

  • упакованные байты - восемь байт;

  • упакованные слова - четыре 16-разрядных слова;

  • упакованные двойные слова (два 32-разрядных слова);

  • учетверенное слово (одно 64-разрядное слово).

Эти типы данных могут обрабатываться в восьми 64-разрядных регистрах MMX0 - MMX7, которые фактически являются частью регистров АП. В систему команд для поддержки MMX введено 57 дополнительных команд для одновременной обработки нескольких единиц данных. Команды ММХ доступны из любого режима работы процессора. Команды MMX выполняются так же, как и команды с плавающей точкой. Более того, механизм сохранения и восстановления состояния вычислительной среды, принятый для операций с плавающей точкой, применим и при выполнении ММХ-вычислений.

Рис. 3.3. Регистры данных ЦП Pentium IV

SSE-расширение реализовано в виде аппаратно-программного модуля,

который включает регистры третьей группы разрядностью в 128 бит, имеющих обозначение ХММО - ХММ7, и 32-разрядный регистр управления/состояния MXCSR (рис. 3.4). Программная часть SSE-расширения включает в себя набор SSE-команд для работы с данными с плавающей запятой. Содержимое ХММ-регистра может представлять собой:

  • четыре 32-разрядных операнда с плавающей запятой в КВФ (рис. 2.1);

  • два 64-разрядных операнда с плавающей запятой в ДВФ (рис. 2.1);

  • один 128-разрядный операнд, представляющий числа в диапазоне от

2-126 до 2127.

Поскольку аппаратно модуль SSE-расширения реализован независимо от

других модулей, то это позволяет выполнять SSE-комапды параллельно с командами АП и ММХ-командами.

Рис. 3.4. Младшие 16 разрядов регистра управления-состояния MXCSR

В процессе обработки данных команды SSE-расширения могут возбуждать исключительные ситуации, аналогичные тем которые были описаны в разделе 2.2. Эти события фиксируются в регистре MXCSR. Старшие 16 разрядов регистра управления-состояния не используются. Все поля регистра, за исключением FZ, обозначаются и используются аналогично соответствующим полям регистров SR и CR арифметического процессора, описанном в 2.2. Бит FZ используется, если результат операции близок к нулю. При этом ЦП выполняет следующие действия:

• возвращает значение 0 и знак результата;

• устанавливает флаги Р (бит 5) и U (бит 4);

• маскирует биты исключений.

Перед тем как создавать программы, использующие MMX- и SSE-расширения, следует убедиться в том, что данный тип процессора поддерживает эту технологию. В разделе 6.3 приводится пример такой проверки.

3.3. Система команд ммх-расширения

Любая команда, относящаяся к ММХ-расширению начинается с буквы p. Большинство команд имеют суффикс, который определяет тип данных и используемую арифметику:

• us (unsigned saturation) -беззнаковое насыщение;

• s или ss (signed saturation) -знаковое насыщение;

• b, w, d, q - указывают тип данных (байт, 16-разрядное слово, 32-разрядное слово и 64-разрядное слово, соответственно). Если в суффиксе есть две из этих букв, первая соответствует входному операнду, вторая - выходному;

• если в суффиксе нет ни символа s, ни символов ss, то применяется циклическая арифметика (wraparound). Если в этом случае результат операции выходит за двоичную разрядную сетку используемого типа данных, то «лишние» старшие биты результата отбрасываются.

Система команд может быть представлена в виде 5-ти групп команд: передачи данных, арифметических, логических и команд сдвига, упаковки и распаковки и группы специальных команд.

Команды передачи данных.

В группу команд передачи данных входят две команды movd и movq.

Команда movd позволяет копировать 32-разрядное число:

• из младших разрядов одного ММХ-регистра в младшие разряды другого

(старшие разряды заполняются нулями);

• из переменной в памяти либо из целочисленного регистра в младшие 32

разряда ММХ-регистра (старшие разряды заполняются нулями);

• из младших разрядов ММХ-регистра в ячейку памяти либо в целочисленный регистр.

Команда movq выполняет копирование 64 бит:

• из одного ММХ-регистра в другой;

• из памяти в ММХ-регистр;

• из ММХ-регистра в память.

Среди всех ММХ-команд только movd и movq могут иметь выходной операнд в памяти, a movd - единственная команда, операнд которой может находиться в 32-разрядном регистре процессора.

Арифметические команды включают команды сложения, вычитания, умножения и сравнения.

Команды сложения и вычитания работают с упакованными байтами и словами со знаком и без знака, а также с упакованными двойными словами со знаком. Они могут использовать как циклическую арифметику, так и арифметику с насыщением.

Команды сложения paddb, paddw, paddd (циклическая арифметика), paddsb, paddsw (арифметика со знаковым насыщением) и paddusb, paddusw (арифметика с беззнаковым насыщением) - входной операнд может находиться в ММХ-регистре или в памяти; выходной операнд должен находиться в ММХ-регистре.

Работа команды paddusw ММ0,ММ1 проиллюстрирована на рис. 3.5.

Из рисунка видно, что слово (16 – 31 разряд) содержит значение 65 535. Поскольку сумма соответствующих слов превышает предельно допустимое значение для данного типа операндов, в качестве суммы берется граничное значение.

Рис. 3.5. Сложение по команде paddusw MM0,MM1

Команды вычитания psub, psubw, psubd (циклическая арифметика), psubsb, psubsw (арифметика со знаковым насыщением) и psubusb, psubusw (арифметика с беззнаковым насыщением) - входной операнд может находиться в ММХ-регистре или в памяти; выходной операнд должен находиться в ММХ-регистре.

Команды вычитания работают с теми же типами данных и формируют результат точно так же, как и команды сложения.

Команды умножения попарно перемножают 16-разрядные слова и дают результат по правилам циклической арифметики.

Команда pmulhw ( pmullw) - попарное умножение 16-разрядных слов со знаком, находящихся во входном и выходном операндах. Результатом операции являются четыре 32-разрядных произведения, при этом старшие (младшие) разряды произведений сохраняются в 16-разрядных словах выходного операнда, а младшие (старшие) разряды произведений теряются. Входным операндом может выступать ММХ-регистр или ячейка памяти, а выходным операндом должен быть ММХ-регистр. Для получения полного результата умножения с помощью этих команд необходимо выполнить такую

последовательность шагов:

  • получить старшие 16 бит произведения, используя команду pmulhw.

  • получить младшие 16 бит произведения, используя команду pmullw.

  • объединить частичные результаты в одно двойное слово с помощью команд punpckhwd и punpcklwd.

Команда pmaddwd - попарное умножение 16-разрядных слов со знаком, находящихся в двух операндах. После получения в результате четырех 32-разрядных произведений первое произведение складывается со вторым, а третье - с четвертым. Суммы записываются в 32-разрядные слова выходного операнда. Работа команды pmaddwd ММ0,ММ1 проиллюстрирована на рис. 3.5.

Рис. 3.5. Умножение по команде ppaddwd MM0,MM1

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

Команды pcmpeqb, pcmpeqw, pcmpeqd заполняют элемент данных выходного операнда единицами, если соответствующие элементы равны и нулями, в противном случае.

Команды pcmpgtb, pcmpgtw, pcmpgtd заполняют элемент данных выходного операнда единицами, если соответствующий элемент данных выходного операнда больше соответствующего входного элемента и нулями, в противном случае.

Сдвиги и логические команды.

Команды сдвига выполняют сдвиг каждого элемента данных (16-, 32- или 64-разрядного слова) в выходном операнде на величину, задаваемую входным операндом. Входной операнд может быть непосредственным операндом либо находиться в ММХ-регистре или в памяти. Выходной операнд должен находиться в ММХ-регистре.

Команды psllw, pslld, psllq выполняют логический сдвиг влево, а команды psrlw, psrld, psrlq – вправо.

Команды psraw, psrad осуществляют арифметический сдвиг вправо для 16- и 32-разрядных слов.

Логические команды выполняют поразрядные логические операции над всеми 64 битами своих операндов. Они реализуют логические операции И, ИЛИ, И-НЕ, исключающего ИЛИ. Входной операнд может быть ММХ-регистром или операндом в памяти. Выходной операнд должен находиться в ММХ-регистре.

Команда pand (логическое И) - вычисляет поразрядное И своих операндов.

Команда pandn (логическое И-НЕ) - вычисляет поразрядное НЕ вы-

выходного операнда, а затем поразрядное И между входным операндом и инвертированным значением выходного операнда.

Команда роr (логическое ИЛИ) - вычисляет поразрядное ИЛИ своих операндов.

Команда рхоr(исключающее ИЛИ) - вычисляет поразрядное исключающее ИЛИ своих операндов.

Команды упаковки преобразуют длинные элементы данных (16- и 32-разрядные слова) в более короткие. Если исходное значение «не помещается» в коротком элементе данных, то происходит «насыщение» - результатом считается граничное значение допустимого диапазона выходного типа данных. Команды распаковки попарно объединяют элементы данных из обоих операндов в более длинные элементы выходного операнда. Этими командами можно пользоваться для увеличения числа значащих разрядов при вычислениях. Входным операндом может выступать ММХ-регистр или ячейка памяти, выходной операнд должен находиться в ММХ-регистре;

Команды упаковки и упаковки.

Команды упаковки packsswb, packssdw - преобразуют длинные элементы данных (16- и 32-разрядные слова со знаком) в более короткие (байты или 16-разрядные слова со знаком). На рис. 3.6 иллюстрируется выполнение команды packssdw MM0,MM1.

Команда упаковки packuswb - выполняет преобразование 16-разрядных слов со знаком из обоих операндов в байты без знака и записывает их в выходной операнд. Если исходное слово со знаком было больше FFh, результатом преобразования считается FFh. Если исходное слово со знаком отрицательно, результатом преобразования считается 0h.

Рис. 3.6. Выполнение команды упаковки packssdw MM0,ММ1.

Команды распаковки punpckhbw, punpckhwd, punpckhdq - попарно объединяют исходные элементы данных (байтов, 16- или 32-разрядных слов), находящиеся в старших 32 разрядах обоих операндов. Полученные в результате длинные элементы записываются в выходной операнд. Исходные значения младших разрядов операндов на результат не влияют.

Рис. 3.7. Выполнение команды распаковки punpckhbw MM0,MM1.

На рис. 3.7 проиллюстрирован механизм работы команды punpckhbw. Суть работы команд punpckhwd и punpckhdq аналогична, с той лишь разницей, что punpckhwd распаковывает старшие два слова обоих регистров, а punpckhdq старшие двойные слова.

Команды распаковки punpcklbw, punpcklwd, punpckldq - попарно объединяют исходные элементы данных (байтов, 16- или 32-разрядных слов), находящиеся в младших 32 разрядах обоих операндов. Полученные в результате длинные элементы данных записываются в выходной операнд. Исходные значения старших разрядов операндов на результат не влияют.

Механизм работы команды распаковки punpcklwd проиллюстрирован на рис. 3.8.

Рис. 3.8. Выполнение команды распаковки punpcklwd MM0,MM1.

Суть работы команд punpcklbw и punpckldq аналогична, с той разницей, что punpcklbw распаковывает младшие четыре байта, а punpckldq – младшие двойные слова.

Специальные команды не имеют специфики какой-либо из рассмотренных выше групп.

Команды pavgb, pavdw - вычисляют среднее значение двух чисел, представленных байтами или словами. Значения операндов рассматриваются как беззнаковые целые числа. В качестве входного операнда может выступать ММХ-регистр или 64-разрядная ячейка памяти, выходным операндом служит один из ММХ-регистров.

Команда pextrw - извлекает одно из четырех упакованных слов входного операнда и имеет три аргумента: входной операнд, выходной операнд и маска. Младшие два бита маски задают во входном операнде номер упакованного слова, подлежащего извлечению. Извлеченное слово сохраняется в младшем слове выходного операнда. Выходным операндом этой команды может выступать один из 32-разрядных регистров общего назначения. Старшее слово выходного операнда обнуляется.

Команда pinsrw - вставляет слово в одно из четырех упакованных слов выходного операнда. Выходным операндом является один из ММХ-регистров, а входным операндом может выступать один из 32-разрядных регистров общего назначения, младшее слово которого будет вставлено в выходной операнд. Номер позиции, куда помещается операнд, определяется младшими двумя битами маски.

Команды pmaxusb, pmaxsw, (pminusb, pminsw) - извлекают максимальное (минимальное) значение из каждой пары упакованных элементов в выходном и входном операндах. В качестве выходного операнда может выступать ММХ-регистр, а в качестве входного - ММХ-регистр или 64-разрядная ячейка памяти.

Команда pmovmskb - формирует байт, содержащий знаковые биты восьми байтов, содержащихся во входном операнде, в качестве которого может выступать один из ММХ-регистров. Выходным операндом является 32-разрядный регистр общего назначения, младший байт которого будет содержать результат.

Команда psadbw - вычисляет суммарную разность значений беззнаковых байтов входного и выходного операндов. Входным операндом может выступать ММХ-регистр или 64-разрядная ячейка памяти, а выходным - один из ММХ-регистров.