Презентация. MMX-расширение Pentium

Скачать презентацию




Лекция 4. MMX-расширение архитектуры микропроцессора Pentium 22.09.2014 13:59:48 1
 


Определение MMX 22.09.2014 13:59:48 2 MMX-расширение микропроцессора Pentium предназначено для поддержки приложений, ориентированных на работу с большими массивами данных целого и вещественного типов, над которыми выполняются одинаковые операции. С данными такого типа обычно работают мультимедийные, графические, коммуникационные программы. По этой причине данное расширение архитектуры микропроцессоров Intel и названо MultiMedia extensions (MMX). С появлением микропроцессора Pentium III следует различать MMX-расширение двух типов — целочисленного устройства и устройства с плавающей точкой. Каждое из них имеет свою программную модель и является независимым от другого. Чтобы различать эти типы расширений, введем следующие условные обозначения: MMX-расширение целочисленного устройства будем называть MMX-расширением, а MMX-расширение устройства с плавающей точкой — ХММ-расширением.
 


Модель целочисленного MMX-расширения 22.09.2014 13:59:48 3 Целочисленное MMX-расширение микропроцессора Pentium представляет собой программно-аппаратное решение, дополняющее архитектуру данного микропроцессора новыми свойствами. Впервые это расширение появилось в микропроцессоре Pentium MMX. Знакомство с архитектурой целочисленного MMX-расширения удобно вести в рамках модели, основу которой составляют две компоненты — программная и аппаратная. Основа программной компоненты — система команд MMX-расширения (57 команд) и четыре новых типа данных. ММХ-команды являются естественным дополнением основной системы команд микропроцессора. Основным принципом их работы является одновременная обработка нескольких единиц однотипных данных одной командой — Single Instruction Multiple Data (SIMD).
 


Типы данных, поддерживаемые командами MMX-расширения 22.09.2014 13:59:48 4
 


Регистры MMX 22.09.2014 13:59:48 5 Размер поля, занимаемого данными любого из этих типов, одинаков и составляет 64 бита. В них упаковываются и затем используются, как отдельные объекты, данные размером байт, слово и двойное слово (их мы будем называть элементами операндов). Именно с такими объектами работают ММХ-команды. Данный подход приводит к существенному ускорению обработки данных, прежде всего за счет экономии тактов микропроцессора на передачу данных и выполнение самой команды. Кстати, здесь сказывается преимущество размерности шины данных микропроцессора Pentium, которая равна 64 бита. Основа аппаратной компоненты — восемь новых регистров. Слово «новые» не совсем корректно. На самом деле MMX-расширение использует регистры сопроцессора. Как известно, регистры сопроцессора стека имеют размерность 80 бит, что касается регистров MMX-расширения, то их размерность — 64 бита. Поэтому, когда регистры сопроцессора играют роль ММХ-регистров, то доступными являются лишь их младшие 64 бита. К тому же, при работе стека сопроцессора в режиме MMX-расширения, он рассматривается не как стек, а как обычный регистровый массив с произвольным доступом. Регистровый стек сопроцессора не может одновременно использоваться и по своему прямому назначению и как MMX-расширение. Забота о его разделении и корректной работе с ним ложится на программиста.
 


Отображение ММХ-регистров на регистры стека сопроцессора 22.09.2014 13:59:48 6
 


Особенности работы сопроцессора в режиме MMX 22.09.2014 13:59:49 7 При выполнении ММХ-команд сопроцессор переводится в состояние, которое характеризуется следующими признаками: регистр тегов сопроцессора обнуляется; все регистры стека сопроцессора в ММХ-режиме адресуются физически, вне зависимости от значений поля tos регистра состояния swr; ММХ-регистру mm0 соответствует физический регистр сопроцессора r0, ММХ-регистру mm1 — r1 и т. д. Логическая нумерация регистров сопроцессора не имеет никакого значения; содержимое других регистров сопроцессора не изменяется (за исключением применения команды emms); при записи в ММХ-регистр данных, в младшие 64 бита заносятся сами записываемые данные, а в биты 64-79 — единицы. Это делается для того, чтобы при попытке случайного или преднамеренного использования командой сопроцессора ММХ-данных, не возникло какого-либо исключения сопроцессора; при чтении данных из ММХ-регистров их содержимое не изменяется.
 


Особенности команд MMX-расширения 22.09.2014 13:59:49 8 Важное отличие ММХ-команд от обычных команд процессора в том, как они реагируют на ситуации переполнения и заема. В ситуациях, когда результат арифметической операции выходит за размер разрядной сетки исходных операндов, производится усечение старших бит результата и возвращаются только те биты, которые умещаются в пределах исходного операнда. Этот принцип формирования результата называется арифметикой с циклическим переносом (wraparound arithmetic). Некоторые ММХ-команды в подобной ситуации действуют иначе. В случае выхода значения результата за пределы операнда, в нем фиксируется максимальное или минимальное значение. Такой принцип формирования результата называется арифметикой с насыщением (Saturation arithmetic). MMX-расширение имеет команды, которые выполняют арифметические операции с использованием обоих принципов. При этом среди них есть команды, учитывающие знаки (значения старших бит) элементов операндов.
 


22.09.2014 13:59:49 9 Особенности команд MMX-расширения Сложение чисел (беззнаковое насыщение) 254 =11111110 + 5 =00000101 = 259<>11111111 Сложение чисел (знаковое насыщение) 126 =01111110 + 5 =00000101 = 131<>01111111 Вычитание чисел (беззнаковое насыщение) +05 =00000101 - +10 =00001010 = -05<>00000000 Сложение чисел (знаковое насыщение) +05 =00000101 - +10 =00001010 = -05<>10000000 Результат ММХ-сложения с беззнаковым насыщением равен 255. При сложении командами микропроцессора add и adс, использующими принцип циклического переноса, результат равен 00000011=3, а флаг сf устанавливается в 1. Это свидетельствует о факте переполнения. Результат ММХ-сложения со знаковым насыщением двух положительных чисел равен 127. Результат ММХ-вычитания без знакового насыщения двух чисел равен 0. При вычитании командами микропроцессора sub и sbb, использующими принцип циклического переноса, результат равен 11111011=-5 в дополнительном коде, а флаг cf установлен в 1. Результат ММХ-вычитания со знаковым насыщением двух чисел равен 80h. Это минимально возможное отрицательное число размером в байт.
 


22.09.2014 13:59:49 10 Граничные значения насыщения ММХ-данных
 


Система команд MMX 22.09.2014 13:59:49 11
 


Команды пересылки 22.09.2014 13:59:49 12 ММХ-команды пересылки, подобно их целочисленным аналогам, являются наиболее часто используемыми. Эти команды осуществляют доставку информации в (из) ММХ-регистры (ов). ММХ-команды пересылки работают с 32- и 64-разрядными операндами. В данную группу входят следующие команды: movd приемник,источник— пересылка 32 битов из источника в приемник. Один из операндов, источник или приемник, но не одновременно, должен быть ММХ-регистром. Другой операнд должен быть 32-разрядным регистром или 32-разрядной ячейкой памяти; movq приемник,источник— пересылка 64 битов из источника в приемник В отличие от команды movd, оба операнда команды movq могут быть ММХ-регистрами. Если же операнды смешанные, то один из операндов, источник или приемник, является ММХ-регистром, а другой операнд должен быть адресом 64-разрядной ячейки памяти.
 


Команды пересылки 22.09.2014 13:59:50 13 Команда movd работает только с младшей половиной ММХ-регистра. Для доступа к старшей половине ММХ-регистра необходимо использовать либо сдвиг, либо команду movq. Команда movd является единственной ММХ-командой, допускающей использование в качестве операндов 32-разрядных регистров общего назначения. Это же обстоятельство является причиной того, что при использовании в качестве приемника регистра общего назначения макрокоманда movd будет работать неправильно. Допустимые сочетания операндов для команды movd следующие: movd mem32, mmx movd mmx, mem32 movd mmx, r32 movd r32, mmx
 


Команды сложения и вычитания 22.09.2014 13:59:50 14 Команды сложения делятся на две подгруппы исходя из того, как формируется результат при возникновении переполнения — по принципу насыщения или циклического переноса. paddb | paddw | paddd приемник, источник — сложение беззнаковых упакованных байт, слов, двойных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу циклического переноса. Перенос теряется и нигде не учитывается. type ar = array[0..7] of byte; var t1,t2,t3 : ar; Begin asm movq mm0, qword ptr t1; paddb mm0, qword ptr t2; movq qword ptr t3,mm0 emms end End;
 


Команды сложения и вычитания 22.09.2014 13:59:50 15 paddsb | paddsw приемник, источник — сложение упакованных байт и слов со знаком. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу знакового насыщения. type ar = array[0..7] of byte; const t1 : ar=($11,$11,$22,$22,$33,$82,$44,$44); t2 : ar=($71,$7c,$3f,$7d,$7f,$fa,$15,$7e); var t3 : ar; begin asm movq mm0, qword ptr t1; paddsb mm0, qword ptr t2; movq qword ptr t3,mm0 emms end; end; Результат: 7F 7F 61 7F 7F 80 59 7F
 


Команды сложения и вычитания 22.09.2014 13:59:50 16 paddusb | paddusw приемник, источник — сложение беззнаковых упакованных байт и слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу беззнакового насыщения. psubb | psubw | psubd приемник, источник —вычитание беззнаковых упакованных байтов, слов, двойных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник—либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу циклического переноса, то есть так, как это делается командами sub и sbb микропроцессора. Заем из старшего разряда, естественно, теряется и нигде не учитывается.
 


Команды сложения и вычитания 22.09.2014 13:59:50 17 psubb | psubw | psubd приемник, исто чник —вычитание беззнаковых упакованных байтов, слов, двойных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу циклического переноса, то есть так, как это делается командами sub и sbb микропроцессора. Заем из старшего разряда, естественно, теряется и нигде не учитывается. psubsb | psubsw приемник,источник — вычитание упакованных байт и слов со знаком. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении ситуации, когда результат вычитания получается меньше 80h (8000h), поле соответствующего байта (слова) формируется по принципу знакового насыщения (в нем остается значение 80h (8000h)). Если результат больше 7fh (7fffh), то результат насыщается до значения 80h (8000h).
 


Команды сравнения 22.09.2014 13:59:51 18 Группа команд сравнения MMX-расширения содержит команды сравнения двух типов: простого сравнения — pcmpeqb | pcmpeqw | pcmpeqd. Команды характеризуются тем, что устанавливают только факт равенства операндов — «равно-не равно»; сравнения по величине — pcmpgtb | pcmpgtw | pcmpgtd. Команды устанавливают соотношение операндов по величине. pcmpeqb | pcmpeqw | pcmpeqd операнд_1,операнд_2 — сравнение упакованных байтов, слов или двойных слов. Результат формируется в операнд_ 1, который является одним из ММХ-регистров. Операнд_2— либо ММХ-регистр, либо 64-разрядная ячейка памяти. Элементы формируемого результата представляются в виде единичных или нулевых байтов, слов или двойных слов. Единичные байты, слова или двойные слова формируются, если соответствующие байты, слова или двойные слова исходных операндов равны. Нулевые байты, слова, двойные слова формируются в случае, если соответствующие байты, слова или двойные слова исходных операндов не равны. pcmpgtb | pcmpgtw | pcmpgtd операнд_1,операнд_2— сравнение по величине упакованных байтов, слов или двойных слов. Единичные байты, слова, двойные слова формируются в случае, если байты, слова или двойные слова исходного операнда операнд_1 были больше соответствующих байтов, слов или двойных слов операнд_2. Иначе формируются нулевые байты, слова или двойные слова.
 


Команды сравнения 22.09.2014 13:59:51 19 type ar = array[0..7] of byte; const t1 : ar=($11,$11,$22,$7e,$33,$82,$44,$44); t2 : ar=($11,$7c,$22,$7d,$7f,$fa,$15,$7e); var t3 : ar; begin asm movq mm0, qword ptr t1; pcmpeqb mm0, qword ptr t2; movq qword ptr t3,mm0 emms end; end; pcmpeqb = FF 00 FF 00 00 00 00 00 pcmpgtb = 00 00 00 FF 00 00 FF 00
 


Команды логических операций 22.09.2014 13:59:51 20 Команды логических операций предназначены для поразрядной обработки содержимого двух ММХ-регистров или ММХ-регистра и 64-битного операнда в памяти. Эти команды реализуют следующие логические операции: «И», «И-НЕ», «ИЛИ», «исключающее ИЛИ». Заметьте, что появилась новая логическая операция «И-НЕ», которой нет среди логических команд основного процессора. Другая особенность логических команд заключается в том, что они выполняются над всеми шестьюдесятью четырьмя разрядами ММХ-операндов. Для структурирования результатов их работы нужно применять другие команды MMX-расширения. pand приемник,источник — выполнение поразрядной операции «И» над операндами приемника источник. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. pandn приемник, источник — выполнение поразрядной операции «И-НЕ» над операндами приемники источник. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. роr приемник, источник — выполнение поразрядной операции «ИЛИ» над операндами приемники источник. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. pxor приемник, источник — выполнение поразрядной операции «исключающее ИЛИ» над операндами приемники источник. Результат помещается в приемник, который является одним из ММХ-регистров.
 


Команды сдвига 22.09.2014 13:59:51 21 Среди ММХ-команд сдвига существуют команды арифметического и логического сдвига. Обратите внимание на то обстоятельство, что ММХ-команд сдвига упакованных байтов нет. Сдвигать можно только упакованные слова, двойные слова и учетверенные слова (целиком весь ММХ-регистр). psllw | pslld | psllq приемник, источник — команды логического сдвига влево упакованных слов, двойных слов или учетверенных слов в приемник на количество разрядов, указанных значением источник. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. Освобождающиеся в результате сдвига младшие биты упакованных элементов nрueмнuк заполняются нулями. psllw | pslld | psllq приемник, количество_сдвигов —команды логического сдвига влево аналогичны рассмотренным выше командам, за исключением того, что все упакованные слова, двойные слова и учетверенные слова в приемник сдвигаются на количество разрядов, указанных значением непосредственного операнда источник. Освобождающиеся в результате сдвига младшие биты упакованных элементов приемник заполняются нулями.
 


Команды сдвига 22.09.2014 13:59:52 22 psrlw | psrld | psrlq приемник,источник —команды логического сдвига вправо упакованных слов, двойных слов или учетверенных слов в приемник на количество разрядов, указанных значением в источник. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. Освобождающиеся в результате сдвига старшие биты упакованных элементов приемник заполняются нулями. psrlw | psrld | psrlq приемник, количество_сдвигов — команды логического сдвига вправо аналогичны рассмотренным выше командам, за исключением того, что все упакованные слова, двойные слова или учетверенные слова в приемник сдвигаются на количество разрядов, указанных значением непосредственного операнда источник. Освобождающиеся в результате сдвига старшие биты упакованных элементов приемник заполняются нулями. psraw | psrad приемник,источник— команды арифметического сдвига вправо упакованных слов или двойных слов в приемник на количество разрядов, указанных в источник. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. Освобождающиеся в результате сдвига старшие биты упакованных элементов приемник заполняются значением знаковых (старших) разрядов этих элементов.
 


Команды сдвига 22.09.2014 13:59:52 23 psrlw = 0111 0222 0333 0FFF psraw = 0111 0222 0333 FFFF type ar = array[0..3] of word; const t1 : ar=($1111,$2222,$3333,$FFFF); t2 : ar=($0004,$0000,$0000,$0000); var t3 : ar; begin asm movq mm0, qword ptr t1; psrlw mm0, qword ptr t2; movq qword ptr t3,mm0 emms end; end;
 


Команды упаковки и распаковки 22.09.2014 13:59:52 24 Команды этих групп предназначены для изменения размерности элементов операндов с учетом их значений. Команды упаковки позволяют уменьшить размерность элементов в два раза. При этом если значение сжимаемого элемента больше максимального допустимого значения, которое может содержаться в элементе меньшего размера, то результат формируется по принципу знакового насыщения. packssdw приемник, источник — команда упаковки со знаковым насыщением двух двойных слов в приемники двух двойных слов в источники четыре слова в приемник. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. packsswb приемник, источник — команда упаковки со знаковым насыщением четырех слов в приемники четырех слов в ИСТОЧНИК В четыре слова в приемник. Схема выполнения команды показана на рис. 2.7. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти.
 


Команды упаковки и распаковки 22.09.2014 13:59:52 25 punpckhbw приемник, источник— команда распаковки байтов из старшей половины приемник в слова с использованием в качестве старшей половины этих слов байтов из источник. Формирование результата происходит путем поочередной выборки байтов из приемник и источник (рис. 2.8). Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. punpckhwd приемник, источник— команда распаковки слов из старшей половины приемник в двойные слова с использованием в качестве старшей половины этих двойных слов из источник. Формирование результата происходит путем поочередной выборки слов из приемник и источник (рис. 2.9). Результат формируется в приемник, который является одним из ММХ-регистров, в то же время источник может быть либо ММХ-регистром, либо 64-разрядной ячейкой памяти.
 


Команды упаковки и распаковки 22.09.2014 13:59:52 26 punpckhdq приемник, источник— команда распаковки двойных слов из старшей половины приемник в учетверенные слова с использованием в качестве старшей половины этих учетверенных слов двойных слов из источник. Формирование результата происходит путем поочередной выборки двойных слов из приемник и источник (рис. 2.10). Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти.
 


Команды упаковки и распаковки 22.09.2014 13:59:52 27 punpcklbw приемник, источник — команда распаковки байтов из младшей половины приемник в слова с использованием в качестве младшей половины этих слов байтов из источник. Формирование результата осуществляется путем поочередной выборки байт из приемник и источник (рис. 2.11). Результат помещается в приемник, который является одним из ММХ-регистров. Источник — ММХ-регистр, либо 64-разрядная ячейка памяти. punpcklwd приемник, источник— команда распаковки слов из младшей половины приемник в двойные слова с использованием в качестве младшей половины этих двойных слов слов из источник. Формирование результата осуществляется путем поочередной выборки слов из приемники источник(рис. 2.12). Результат помещается в приемник, который является одним из ММХ-регистров, в то же время источник может быть либо ММХ-регистром, либо 64-разрядной ячейкой памяти.
 


Команды упаковки и распаковки 22.09.2014 13:59:52 28
 


Команды упаковки и распаковки 22.09.2014 13:59:52 29 punpckldq приемник, источник— команда распаковки двойных слов из младшей половины приемник в учетверенные слова с использованием в качестве младшей половины этих учетверенных слов двойных слов из источник. Формирование результата осуществляется путем поочередной выборки двойных слов из приемника источник(рис. 2.13). Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти.
 


Команды умножения 22.09.2014 13:59:53 30 Команды ММХ-умножения предназначены только для умножения 16-битных элементов, причем реализация этих команд сделана несколько непривычно. Команды умножения целочисленного устройства формируют результат, размер которого вдвое превышает размер исходных операндов. Команды умножения MMX-расширения реализуют это действие несколько иначе: умножению подвергаются одновременно 4 слова со знаком; для получения полного результата умножения (размером в двойное слово) необходимо применение двух команд pmulhw и pmullw. С помощью этих команд формируются, соответственно, старшая и младшая части произведения. Для их объединения в единое двойное слово можно использовать команды расширения punpckhwd или punpcklwd. pmulhw приемник, источник— умножение четырех знаковых упакованных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. В приемник записываются не все 32 бита произведения, а только старшие 16 бит. Младшие 16 бит можно получить, используя команду pmullw. pmullw приемник, источник — умножение знаковых упакованных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. В приемник записываются не все 32 бита произведения, а только младшие 16 бит. Старшие 16 бит можно получить, используя команду pmulhw.
 


Команды умножения 22.09.2014 13:59:53 31 type ar = array[0..3] of word; const t1 : ar=($1111,$2222,$3333,$4444); t2 : ar=($0001,$0002,$0003,$0004); var t3 : ar; begin asm movq mm0, qword ptr t1; pmullw mm0, qword ptr t2; movq qword ptr t3,mm0 emms end; end; pmullw - 1111 4444 9999 1110 pmulhw - 0000 0000 0000 0001
 


Программа «реального» умножения 22.09.2014 13:59:53 32 type ar = array[0..3] of word; const mmem1 : ar=($5,$10,$300,$5001); mmem2 : ar=($5,$10,$300,$5000); var mmem3 : ar; mmem4 : ar; begin asm movq mm0, qword ptr mmem1; pmullw mm0, qword ptr mmem2; //получим младшие части произведений movq mm1, qword ptr mmem1 pmulhw mm1, qword ptr mmem2 //получим старшие части произведений movq mm2,mm0 //сохраним mm0 для последующих действий //в поле mmem3 содержится результат произведений //операндов младших половин исходных операндов punpcklwd mm0,mm1 movq qword ptr mmem3,mm0 //в поле mmem4 содержится результат произведений //операндов старших половин исходных операндов punpckhwd mm2,mm1 movq qword ptr mmem4,mm2 emms end; Результат = 1900 5000 0009 0000 0000 0100 0000 0019
 


Команды умножения 22.09.2014 13:59:53 33 pmaddwd. Результат работы команды pmaddwd представляет собой сумму произведений двух старших и двух младших слов операндов приемники ИСТОЧНИК. Результат получается в виде двух двойных упакованных слов. type ar = array[0..3] of word; const mmem1 : ar=($1,$2,$3,$5); mmem2 : ar=($1,$2,$3,$5); var mmem3 : ar; i : integer; s1 : string; begin asm movq mm0, qword ptr mmem1; pmaddwd mm0, qword ptr mmem2; movq qword ptr mmem3,mm0 emms end; pmaddwd =0000 0022 0000 0005
 

< <       > >