Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
1. Регистры SSE
Со времени процессора Pentium III (Katmai) появилось новое расширение SSE (Streaming SIMD Extensions - потоковые SIMD-расширения), где SIMD (Single Instruction - Multiple Data) - общий для SSE и ММХ подход к обработке большого количества данных одной командой. Расширение предназначается для современных приложений, работающих с двумерной и трехмерной графикой, видео-, аудио- и другими видами потоковых данных.
В отличие от ММХ, это расширение не использует уже существующие ресурсы процессора, а вводит 8 новых независимых 128-битных регистров данных: ХММО, ХММ1, ХММ2, ХММЗ, ХММ4, ХММ5, ХММ6 и ХММ7. Таким образом, решаются проблемы технологии ММХ - не требуется команд типа EMMS для переключения режимов и можно пользоваться другими расширениями, работая с SSE.
Кроме восьми регистров данных, вводится дополнительный 32-битный регистр управления/состояния MXCSR, который используется для маскирования исключений, выбора режимов и определения состояния флагов:
бит 0: произошло исключение IE
бит 1: произошло исключение DE
бит 2: произошло исключение ZE
бит 3: произошло исключение ОЕ
бит 4: произошло исключение UE
бит 5: произошло исключение РЕ
бит 6: зарезервирован (всегда 0)
бит 7: IM - маска исключения IE
бит 8: DM - маска исключения DE
бит 9: ZM - маска исключения ZE
бит 10: ОМ - маска исключения ОЕ
бит 11: UM - маска исключения UE
бит 12: РМ - маска исключения РЕ
биты 14-13: RC - управление округлением
бит 15: FZ - режим сброса в ноль (flush-to-zero)
биты 31-16: зарезервированы (всегда 0)
Все маскирующие биты по умолчанию (при включении процессора) устанавливаются в 1, так что никакие исключения не обрабатываются.
Поле RC определяет режим округления: 00 - к ближайшему числу, 01 - к отрицательной бесконечности, 10 - к положительной бесконечности, 11 - к нулю. По умолчанию устанавливается в режим округления к ближайшему числу.
Бит FZ включает режим сброса в ноль (по умолчанию выключен). В этом режиме команды SSE не превращают слишком маленькое число с плавающей запятой в денормализованное (как этого требует стандарт IEEE), а возвращают ноль.
Знак нуля соответствует знаку получившегося бы денормализованного числа, и, кроме того, устанавливаются флаги РЕ и UE.
2. Типы данных SSE
Основной тип данных, с которым работают команды SSE - упакованные числа с плавающей запятой одинарной точности. В одном 128-битном регистре размещаются сразу четыре таких числа - в битах 127-96 (число 3), 95-64 (число 2), 3-32 (число 1) и 31-0 (число 0). Это стандартные 32-битные числа с плавающей запятой, используемые числовым сопроцессором. Целочисленные команды SSE могут работать с упакованными байтами, словами или двойными словами. Однако эти команды оперируют данными, находящимися в регистрах ММХ.
3. Команды SSE
Все команды SSE доступны из любых режимов процессора — реального, защищенного и режима V86.
Команды пересылки данных
Команда |
Назначение |
Процессор |
MOVAPS приемник, источник |
Переслать выровненные упакованные числа |
PHI |
Копирует 128 бит из источника в приемник. Каждый из аргументов может быть либо регистром SSE, либо переменной в памяти, но пересылки типа память-память запрещены. Если адрес переменной некратен 16 байтам (128 битам), вызывается исключение #GP.
Команда |
Назначение |
Процессор |
MOVUPS приемник, источник |
Переслать невыравненные упакованные числа |
PIII |
Копирует 128 бит из источника в приемник. Каждый из аргументов может быть либо регистром SSE, либо переменной в памяти, но пересылки типа память-память запрещены. В тех случаях, когда легко достичь выравнивания всех данных по адресам, кратным 16 байт, рекомендуется пользоваться командой MOVAPS, так как она более эффективна.
Команда |
Назначение |
Процессор |
MOVHPS приемник, источник |
Переслать старшие упакованные числа |
PHI |
Копирует старшие 64 бита из источника в приемник. Младшие 64 бита приемника не изменяются. Каждый из аргументов может быть либо регистром SSE, либо переменной в памяти, но пересылки типа память-память запрещены.
Команда |
Назначение |
Процессор |
MOVLPS приемник, источник |
Переслать младшие упакованные числа |
PIII |
Копирует младшие 64 бита из источника в приемник. Старшие 64 бита приемника не изменяются. Один из аргументов должен быть регистром SSE, другой - переменной в памяти.
Команда |
Назначение |
Процессор |
MOVHLPS приемник, источник |
Переслать старшие упакованные числа в младшие |
PHI |
Копирует старшие 64 бита источника в младшие 64 бита приемника. Старшие 64 бита приемника не изменяются. И приемником, и источником могут быть только регистры SSE.
Команда |
Назначение |
Процессор |
MOVLHPS приемник, источник |
Переслать младшие упакованные числа в старшие |
PIII |
Копирует младшие 64 бита источника в старшие 64 бита приемника. Младшие 64 бита приемника не изменяются. И приемником, и источником могут быть только регистры SSE.
Команда |
Назначение |
Процессор |
MOVMSKPS приемник, источник |
Переслать маску в переменную |
PHI |
В приемник (32-битный регистр центрального процессора) записывается 4-битная маска, отвечающая знакам четырех вещественных чисел, находящихся в источнике (128-битный регистр SSE). Фактически бит 0 приемника устанавливается равным биту 31 источника, бит 1 - биту 63, бит 2 - биту 95, бит 3 - биту 127, а биты 4-31 приемника обнуляются.
Команда |
Назначение |
Процессор |
MOVSS приемник, источник |
Переслать одно вещественное число |
PIII |
Копирует младшие 64 бита из источника в приемник. Если приемник - регистр, его старшие 96 бит обнуляются. Если приемник — переменная в памяти, старшие 96 бит не изменяются. Каждый из аргументов может быть либо регистром SSE, либо переменной в памяти, но пересылки типа память-память запрещены.
Арифметические команды
Команда |
Назначение |
Процессор |
ADDPS приемник, источник |
Сложение упакованных вещественных чисел |
PHI |
Выполняет параллельное сложение четырех пар чисел с плавающей запятой, находящихся в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в приемник.
Команда |
Назначение |
Процессор |
ADDSS приемник, источник |
Сложение одного вещественного числа |
PIII |
Выполняет сложение нулевых (занимающих биты 31-0) чисел с плавающей запятой в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в биты 31-0 приемника, биты 127-32 остаются без изменений.
Команда |
Назначение |
Процессор |
SUBPS приемник, источник |
Вычитание упакованных вещественных чисел |
PHI |
Выполняет параллельное вычитание чисел с плавающей запятой, находящихся в источнике (переменная или регистр SSE), из чисел, находящихся в приемнике (регистр SSE). Результат записывается в приемник.
Команда |
Назначение |
Процессор |
SUBSS приемник, источник |
Вычитание одного вещественного числа |
PIII |
Выполняет вычитание нулевого (занимающего биты 31-0) числа с плавающей запятой в источнике (переменная или регистр SSE) из числа, находящегося в приемнике (регистр SSE). Результат записывается в биты 31-0 приемника, биты 127-32 остаются без изменений.
Команда |
Назначение |
Процессор |
MULPS приемник, источник |
Умножение упакованных вещественных чисел |
PHI |
Выполняет параллельное умножение четырех пар чисел с плавающей запятой, находящихся в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в приемник.
Команда |
Назначение |
Процессор |
MULSS приемник, источник |
Умножение одного вещественного числа |
PIII |
Выполняет умножение нулевых (занимающих биты 31-0) чисел с плавающей запятой в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в биты 31-0 приемника, биты 127-32 остаются без изменений.
Команда |
Назначение |
Процессор |
DIVPS приемник, источник |
Деление упакованных вещественных чисел |
PHI |
Выполняет параллельное деление четырех пар чисел с плавающей запятой, находящихся в приемнике (регистр SSE), на числа, находящиеся в источнике (переменная или регистр SSE). Результат записывается в приемник.
Команда |
Назначение |
Процессор |
DIVSS приемник, источник |
Деление одного вещественного числа |
PHI |
Выполняет деление нулевого (занимающего биты 31-0) числа с плавающей запятой в приемнике (регистр SSE) на нулевое число, находящееся в источнике (переменная или регистр SSE). Результат записывается в биты 31-0 приемника, биты 127-32 остаются без изменений.
Команда |
Назначение |
Процессор |
SQRTPS приемник, источник |
Корень из упакованных вещественных чисел |
PHI |
Определяет значение квадратных корней от каждого из четырех чисел с плавающей запятой, находящихся в источнике (регистр SSE или переменная), и записывает их в приемник (регистр SSE).
Команда |
Назначение |
Процессор |
SQRTSS приемник, источник |
Корень из одного вещественного числа |
PIII |
Определяет значение квадратного корня из нулевого (занимающего биты 31-0) числа с плавающей запятой из источника (регистр SSE или переменная) и записывает результат в биты 31-0 приемника (регистр SSE).
Команда |
Назначение |
Процессор |
RCPPS приемник, источник |
Обратная величина для упакованных чисел |
PIII |
Выполняет деление единицы на каждое из четырех чисел с плавающей запятой, находящихся в источнике (регистр SSE или переменная), и записывает результаты в приемник (регистр SSE). Максимальное значение ошибки - 1,5х2~12.
Команда |
Назначение |
Процессор |
RCPSS приемник, источник |
Обратная величина для одного числа |
PII |
Выполняет деление единицы на нулевое (занимающее биты 31-0) число с плавающей запятой из источника (регистр SSE или переменная) и записывает результат в биты 31-0 приемника (регистр SSE). Максимальное значение ошибки - 1,5х2~12.
Команда |
Назначение |
Процессор |
RSQRTPS приемник, источник |
Обратный корень из упакованных чисел |
PHI |
Определяет обратные величины от квадратных корней (1/sqrtQ) каждого из четырех чисел с плавающей запятой, находящихся в источнике (регистр $SE или переменная), и записывает их в приемник (регистр SSE). Максимальное значение ошибки -
Команда |
Назначение |
Процессор |
RSQRTSS приемник, источник |
Обратный корень из одного числа |
PIII |
Определяет обратную величину от квадратного корня (1/sqrtQ) нулевого числа (занимающего биты 31-0) числа с плавающей запятой из источника (регистр SSE или переменная) и записывает результат в биты 31-0 приемника (регистр SSE). Максимальное значение ошибки - .
Команда |
Назначение |
Процессор |
MAXPS приемник, источник |
Максимум для упакованных вещественных чисел |
PIII |
Определяет максимальные числа с плавающей запятой в каждой из четырех пар чисел, находящихся в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в приемник. Если источник или приемник содержит не-число (SNAN), оно возвращается в приемник без изменений.
При сравнении двух нулей возвращается нуль из источника. Если не-число сравнивается с другим не-числом, то возвращается не-число из приемника.
Команда |
Назначение |
Процессор |
MAXSS приемник, источник |
Максимум для одной пары вещественных чисел |
PIII |
Определяет максимальные числа с плавающей запятой в нулевой паре чисел (биты 31—0), находящихся в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в приемник. Биты 127-32 приемника не изменяются. Если источник или приемник содержит не-число (SNAN), оно возвращается в приемник без изменений. При сравнении двух нулей возвращается нуль из источника. Если не-число сравнивается с другим не-числом, возвращается не-число из приемника.
Команда |
Назначение |
Процессор |
MINPS приемник, источник |
Минимум для упакованных вещественных чисел |
PHI |
Определяет минимальные числа с плавающей запятой в каждой из четырех пар чисел, находящихся в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в приемник. Если источник или приемник включает не-число (SNAN), возвращается содержимое другого не-числа из аргументов. При сравнении двух нулей возвращается нуль из источника. Если нечисло сравнивается с другим не-числом, возвращается не-число из источника.
Команда |
Назначение |
Процессор |
MINSS приемник, источник |
Минимум для одной пары вещественных чисел |
PHI |
Определяет минимальные числа с плавающей запятой в нулевой паре чисел (биты 31-0), находящихся в источнике (переменная или регистр SSE) и приемнике (регистр SSE). Результат записывается в приемник. Биты 127-32 приемника не изменяются. Если источник или приемник включает не-число (SNAN), то возвращается содержимое другого аргумента. При сравнении двух нулей возвращается нуль из источника. Если не-число сравнивается с другим не-числом, возвращается не-число из источника.
Команды сравнения
Команда |
Назначение |
Процессор |
CMPPS приемник, источник, предикат |
Сравнение упакованных вещественных чисел |
PIII |
Для каждой из четырех пар вещественных чисел, находящихся в источнике (переменная или регистр SSE) и приемнике (регистр SSE), возвращает либо 0(ложь), либо 0FFFFFFFFh (истина), в зависимости от результата сравнения. Тип сравнения определяется предикатом (число):
Предикат |
Проверяемое утверждение |
0 (eq) |
Приемник равен источнику |
1 (It) |
Приемник строго меньше источника |
2 (le) |
Приемник меньше'или равен источнику |
3 (unord) |
Приемник или источник являются не-числом |
4 (neq) |
Приемник не равен источнику |
5 (nit) |
Приемник больше или равен источнику |
6 (nie) |
Приемник строго больше источника |
7 (ord) |
Ни приемник, ни источник не являются не-числом |
Если один из операндов - не-число, результатом сравнения является 0 для предикатов 0, 1, 2, 7 и истина для предикатов 3, 4, 5, 6.
Команда |
Назначение |
Процессор |
CMPSS приемник, источник, предикат |
Сравнение одной пары упакованных чисел |
PIII |
Выполняет сравнение нулевых (занимающих биты 31-0) вещественных чисел из источника и приемника аналогично команде CMPPS. Биты 127-32 приемника не изменяются.
Команда |
Назначение |
Процессор |
COMISS приемник, источник |
Сравнение одной пары чисел с установкой флагов |
PIII |
Выполняет сравнение нулевых (занимающих биты 31-0) вещественных чисел из источника (переменная или регистр SSE) и приемника (регистр SSE) и устанавливает флаги ZF, PF, CF регистра EFLAGS в соответствии с результатом. Флаги OF, SF, AF обнуляются. Если одно из сравниваемых чисел - не-число, все три флага (ZF, PF, CF) устанавливаются в 1. Если сравниваемые числа равны, то ZF = 1, PF = CF = 0. Если приемник меньше источника, то CF = 1, ZF = PF = 0. Если приемник больше источника - CF = ZF = PF = 0.
Команда |
Назначение |
Процессор |
UCOMISS приемник, источник |
Сравнение одной пары неупорядоченных чисел с установкой флагов |
PHI |
Эта команда полностью аналогична COMISS, но она приводит к исключению #1, если один из операндов SNAN или QNAN; UCOMISS только если один из операндов - SNAN.
Команды преобразования типов
Команда |
Назначение |
Процессор |
CVTPI2PS приемник, источник |
Преобразовать упакованные целые в вещественные |
PIII |
Преобразует два 32-битных целых числа со знаком из источника (регистр ММХ или 64-битная переменная) в два упакованных вещественных числа в приемнике (регистр SSE). Если преобразование нельзя выполнить точно, результат округляется в соответствии с MXCSR. Биты 127-64 приемника не изменяются.
Команда |
Назначение |
Процессор |
CVTPS2PI приемник, источник |
Преобразовать упакованные вещественные в целые |
PIII |
Преобразует младшие два 32-битных вещественных числа из источника (регистр SSE или 64-битная переменная) в два упакованных целых числа со знаком в приемнике (регистр ММХ). Если преобразование нельзя выполнить точно, результат округляется в соответствии с MXCSR. Если результат больше максимального 32-битного числа со знаком, возвращается целая неопределенность (S0000000h).
Команда |
Назначение |
Процессор |
CVTSI2SS приемник, источник |
Преобразовать целое в вещественное |
PIII |
Преобразует 32-битное целое число со знаком из источника (переменная или 32-битный регистр) в вещественное число в приемнике (регистр SSE). Если преобразование нельзя выполнить точно, результат округляется в соответствии с MXCSR. Биты 127-32 приемника не изменяются.
Команда |
Назначение |
Процессор |
CVTSS2SI приемник, источник |
Преобразовать вещественное в целое |
PIII |
Преобразует нулевое (младшее) вещественное число из источника(регистр SSE или 32-битная переменная) в 32-битное целое число со знаком в приемнике (32-битный регистр). Если преобразование нельзя выполнить точно, результат округляется в соответствии с MXCSR. Если результат больше максимального 32-битного числа со знаком, возвращается целая неопределенность (S0000000h).
Команда |
Назначение |
Процессор |
CVTTPS2PI приемник, источник |
Преобразование вещественных в целые с обрезанием |
PIII |
Выполняется аналогично CVTPS2PI, но, если результат не может быть представлен точно, он всегда округляется в сторону нуля (обрезается).
Команда |
Назначение |
Процессор |
CVTTSS2SI приемник, источник |
Преобразование вещественного в целое с обрезанием |
PHI |
Выполняется аналогично CVTSS2SI, но, если результат не может быть представлен точно, он всегда округляется в сторону нуля (обрезается).
Логические операции
Команда |
Назначение |
Процессор |
ANDPS приемник, источник |
Логическое И для SSE |
PIII |
Выполняет операцию побитового «логического И» для источника (регистр SSE или 128-битная переменная) и приемника (регистр SSE) и помещает результат в приемник.
Команда |
Назначение |
Процессор |
ANDNPS приемник, источник |
Логическое НЕ-И для SSE |
PHI |
Выполняет операцию НЕ над содержимым приемника (регистр SSE), затем выполняет операцию И над результатом и содержимым источника (регистр SSE или 128-битная переменная) и записывает результат в приемник.
Команда |
Назначение |
Процессор |
ORPS приемник, источник |
Логическое ИЛИ для SSE |
PHI |
Выполняет операцию побитового «логического ИЛИ» для источника (регистр SSE или 128-битная переменная) и приемника (регистр SSE) и помещает результат в приемник.
Команда |
Назначение |
Процессор |
XORPS приемник, источник |
Логическое исключающее ИЛИ для SSE |
PIII |
Выполняет операцию побитового «логического исключающего ИЛИ» для источника (регистр SSE или 128-битная переменная) и приемника (регистр SSE) и помещает результат в приемник.
Целочисленные SIMD-команды
Помимо расширения для работы с упакованными вещественными числами в SSE входит расширение набора команд для работы с упакованными целыми числами, которые размещаются в регистрах ММХ.
Команда |
Назначение |
Процессор |
PAVGB приемник, источник PAVGW приемник, источник |
Усреднение байтов с округлением Усреднение слов с округлением |
PIII PIII |
Каждый элемент (байт или слово) источника (регистр ММХ или 64-битная переменная) добавляется к соответствующему элементу приемника (регистр ММХ) как беззнаковоецелое. Каждый из результатов сдвигается вправо на один бит (делится на два). Затем в старший бит каждого элемента записывается бит переноса от соответствующего сложения. В результате этих действий получаются средние арифметические целых чисел со знаками.
Команда |
Назначение |
Процессор |
PEXTRW приемник, источник, индекс |
Распаковать одно слово |
PIII |
Выделяет 16-битное слово из источника (регистр ММХ) с номером, определяемым как младшие два бита индекса (непосредственно заданное число), и помещает его в младшую половину 32-битного регистра-приемника.
Команда |
Назначение |
Процессор |
PINSRW приемник, источник, индекс |
Запаковать одно слово |
PHI |
Считывает слово из источника (16-битная переменная или 32-битный регистр, во втором случае используется младшая половина регистра) и помещает его в приемник (регистр ММХ) в положение, задаваемое младшими двумя битами индекса (непосредственно заданное число). Другие три слова в приемнике не изменяются.
Команда |
Назначение |
Процессор |
PMAXUB приемник, источник |
Максимум для упакованных байтов |
PHI |
Для каждой из восьми пар упакованных байтов из источника (регистр ММХ или 64-битная переменная) или приемника(регистр ММХ) в приемник записывается максимальный байт в паре. Сравнение выполняется без учета знака.
Команда |
Назначение |
Процессор |
PMAXSW приемник, источник |
Максимум для упакованных слов |
PHI |
Для каждой из четырех пар упакованных слов из источника (регистр ММХ или 64-битная переменная) или приемника (регистр ММХ) в приемник записывается максимальное слово в паре. Сравнение выполняется с учетом знака.
Команда |
Назначение |
Процессор |
PMINUB приемник, источник |
Минимум для упакованных байтов |
PIII |
Для каждой из восьми пар упакованных байтов из источника (регистр ММХ или 64-битная переменная) или приемника (регистр ММХ) в приемник записывается минимальный байт в паре. Сравнение выполняется без учета знака.
Команда |
Назначение |
Процессор |
PMINSW приемник, источник |
Минимум для упакованных слов |
PIII |
Для каждой из четырех пар упакованных слов из источника (регистр ММХ или 64-битная переменная) или приемника (регистр ММХ) в приемник записывается минимальное слово в паре. Сравнение выполняется с учетом знака.
Команда |
Назначение |
Процессор |
PMOVMSKB приемник, источник |
Считать байтовую маску |
PIII |
В приемнике (32-битный регистр) каждый из младших 8 бит устанавливается равным старшему (знаковому) биту соответствующего байта источника (регистр ММХ). Биты 31-8 приемника обнуляются.
Команда |
Назначение |
Процессор |
PMULHUW приемник, источник |
Старшее умножение без знака |
PHI |
Умножить упакованные беззнаковые слова из источника (регистр ММХ или 64-битная переменная) и из приемника (регистр ММХ) и поместить старшие 16 бит 32-битного результата в соответствующее слово в приемнике.
Команда |
Назначение |
Процессор |
PSADBW приемник, источник |
Сумма абсолютных разностей |
PIII |
Вычисляет абсолютные разности восьми пар байтов из источника (регистр ММХ или 64-битная переменная) и приемника (регистр ММХ) как целых чисел без знака, затем суммирует результаты и помещает их в младшее (нулевое) слово в приемнике. Старшие три слова обнуляются.
Команда |
Назначение |
Процессор |
SHUFW приемник, источник, индекс |
Переставить упакованные слова |
PIII |
Вместо каждого из четырех слов приемника (регистр ММХ) размещается слово из источника (регистр ММХ или 64-битная переменная) с номером, указанным в соответствующей паре битов индекса (непосредственно заданное 8-битное число). Так, вместо слова 0 (биты 15-0) приемника будет записано слово из источника с номером, равным значению битов 1 и 0 индекса. Например, если индекс равен 10101010b, второе слово источника будет скопировано во все четыре слова приемника.
Команды упаковки
Команда |
Назначение |
Процессор |
SHUFPS приемник, источник, индекс |
Переставить упакованные вещественные |
PIII |
Помещает в старшие два вещественных числа приемника (регистр SSE) любые из четырех чисел, находившихся в источнике (регистр SSE или 128-битная переменная). В младшие два числа приемника помещает любые из четырех чисел, находившихся в приемнике. По индексу (непосредственный операнд) определяется, какие именно числа упаковываются подобным образом. Биты 1 и 0 указывают номер числа из приемника, которое будет записано в нулевую позицию приемника; биты 3 и 2 - номер числа из приемника, которое будет записано в первую позицию приемника. Биты 5 и 4 устанавливают номер числа из источника, которое будет записано в третью позицию, а биты 7 и 6 - номер числа из источника, которое будет записано в четвертую позицию.
Команда |
Назначение |
Процессор |
UNPCKHPS приемник, источник |
Распаковать старшие вещественные числа |
PIII |
В нулевую позицию приемника (регистр SSE) записывается второе число из приемника, в первуюпозицию - второе число из источника (регистр SSE или 128-битная переменная), во вторую позицию - третье (старшее) число приемника, в третью (старшую) позицию - третье (старшее) число источника.
Команда |
Назначение |
Процессор |
UNPCKLPS приемник, источник |
Распаковать младшие вещественные числа |
PHI |
В нулевую позицию приемника (регистр SSE) записывается нулевое (младшее) число из приемника, в первую позицию - нулевое (младшее) число из источника (регистр SSE или 128-битная переменная), во вторую позицию — первое число приемника, в третью (старшую) позицию - первое число источника.
Команды управления состоянием
Команда |
Назначение |
Процессор |
LDMXCSR источник |
Загрузить регистр MXCSR |
PIII |
Помещает значение источника (32-битная переменная) в регистр управления и состояния SSE MXCSR.
Команда |
Назначение |
Процессор |
STMXCSR приемник |
Сохранить регистр MXCSR |
PIII |
Помещает значение регистра MXCSR в приемник (32-битная переменная).
Команда |
Назначение |
Процессор |
FXSAVE приемник |
Сохранить состояние FPL), MMX, SSE |
PIII |
Сохраняет содержимое всех регистров FPU, ММХ и SSE в приемнике (512-
байтовая область памяти).
Команда |
Назначение |
Процессор |
FXRSTOR источник |
Восстановить состояние FPU, MMX, SSE |
PIII |
Восстанавливает содержимое всех регистров FPU, ММХ и SSE из источника (512-байтовой области памяти, заполненной командой FXSAVE). Формат области памяти, используемой командами FXSAVE/FXRSTOR для Pentium III, имеет следующий вид:
байты 1-0: FCW
байты 3-2: FSW
байты 5-4: FTW
байты 7-6: FOP
байты И-8: FTP
байты 13-12: FCS
байты 19-16: FDP
байты 21-20: FDS
байты 27-24: MXCSR
байты 41-32: STO или ММО
байты 57-48: ST1 или ММ1
байты 73-64: ST2 или ММ2
байты 89-80: ST3 или ММЗ
байты 105-96: ST4 или ММ4
байты 121-112: ST5 или ММ5
байты 137-128: ST6 или ММ6
байты 153-144: ST7 или ММ7
байты 175-160: ХММО
байты 191-176: ХММ1
байты 207-192: ХММ2
байты 223-208: ХММЗ
байты 239-224: ХММ4
байты 255-240: ХММ5
байты 271-256: ХММ6
байты 287-272: ХММ7
Остальные байты зарезервированы.
Команды управления кэшированием
Команда |
Назначение |
Процессор |
MASKMOVQ источник, маска |
Запись байтов минуя кэш |
PHI |
Данные из источника (регистр ММХ) записываются в память по адресу DS:EDI (или DS:DI). При этом старший бит каждого байта в маске (регистр ММХ) определяет, записывается ли соответствующий байт источника в память или нет. То есть бит 7 маски разрешает запись нулевого байта (битов 7-0) источника и т. д. Если байт не записывается, соответствующий байт в памяти обнуляется. Эта команда введена для того, чтобы по возможности уменьшить загрязнение кэша при работе с потоками данных, типичными для SSE, если основным типом данных является байт.
Команда |
Назначение |
Процессор |
MOVNTQ приемник, источник |
Запись 64 бит минуя кэш |
PHI |
Содержимое источника (регистр ММХ) записывается в приемник (64-битная переменная в памяти), сводя к минимуму загрязнение кэша.
Команда |
Назначение |
Процессор |
MOVNTPS приемник, источник |
Запись 128 бит минуя кэш |
PIII |
Содержимое источника (регистр SSE) записывается в приемник (128-битная
переменная в памяти), сводя к минимуму загрязнение кэша.
Команда |
Назначение |
Процессор |
PREFETCHTO адрес PREFETCHT1 адрес PREFETCHT2 адрес PREFETCHNTA адрес |
Перенести данные в кэш ТО Перенести данные в кэш Т1 Перенести данные в кэш Т2 Перенести данные в кэш NTA |
PIII PIII PIII PHI |
Эти команды перемещают данные, располагающиеся по указанному адресу, в кэш. При этом возможны следующие варианты:
Реализация этих команд может отличаться для разных процессоров, и процессор не обязан их выполнять - команды рассматриваются только как подсказки. Объем данных, переносимых в кэш, также может различаться, но не должен быть меньше 32 байт.
Команда |
Назначение |
Процессор |
SFENCE |
Защита записи |
PIII |
При работе с памятью современные процессоры могут выполнить обращения к ней совсем не так и не в том порядке, в каком они указаны в программе. Команда SFENCE гарантирует, что все операции записи в память, расположенные в тексте программы до нее, будут выполнены раньше, чем процессор начнет выполнять операции, помещенные в тексте программы позднее.
4. Определение поддержки SSE
Перед тем как начинать работать с расширениями SSE (согласно документации Intel), нужно убедиться, что выполнены следующие три условия:
1. Бит 2 регистра CRO (эмуляция сопроцессора) должен быть равен нулю.
2. Бит 9 регистра CR4 (поддержка команд FXSAVE/FXRSTOR) должен быть
равен 1.
3. Бит 25 регистра EDX после команды CPUID (поддержка SSE) должен быть
равен 1.
5. Исключения
Особые ситуации при выполнении команд SSE вызывают новое системное исключение #XF (INT 19), обработчик которого может прочитать содержимое регистра MXCSR, чтобы определить тип исключения и выполнить соответствующие действия. Кроме того, команды SSE могут вызывать и обычные системные исключения - #UD (неопределенная команда), #NM (расширение отсутствует), #SS (переполнение стека), #GP (общая ошибка защиты), #PF (ошибка страничной защиты), #АС (невыровненное обращение к памяти).
Собственные исключения, вызываемые командами SSE и отраженные при помощи флагов в регистре MXCSR, - это:
Замечание. Так как технология SSE появилась только в процессоре Pentium III, то требуются новые версии компилятора, поддерживающего соответствующие инструкции. Таким компилятором является, например, Visual Studio 2010, т.к. VS 6.00 была выпущена в 1997 году. Поэтому эту лабораторную работу необходимо выполнить в Visual Studio 2010.
Пример №1. Найти сумму 2-х векторов.
Решение.
№1. Составить программу, которая находит разность 2-х векторов (начальные значения вводим самостоятельно).