Внутренние регистры: Регистры SIMD

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

В процессорах начиная с Pentium III возможна реализация специального архитектурного расширения, предназначенного для потоковой обработки данных — Streaming SIMD Extensions (SSE). Это расширение включает дополнительный набор команд, дополнительные режимы генерации ошибок и исключений, дополнительные внутренние регистры и форматы данных, воспринимаемые процессором. Данное расширение является дальнейшим развитием команд мультимедийной обработки MMX.

Доступ ко всем SIMD-регистрам возможен только с помощью новых SIMD-команд (их также иногда называют SSE-командами). Перед использованием данного расширения программное обеспечение должно с помощью команды CPUID проверить, поддерживается ли оно конкретной моделью микропроцессора.

Регистры SIMD общего назначения

Восемь 128-битных SIMD-регистров общего назначения (XMM0, … XMM7) введено в процессор (Pentium III …) для использования командами потоковой обработки (Streaming SIMD Extensions). В отличие от MMX-регистров эти регистры не являются отображаемыми, это новые физические регистры, доступ к которым осуществляется с помощью новых команд. Поэтому не возникает никаких проблем при совместном использовании команд SIMD и команд FPU или MMX (нет необходимости применения команд типа EMMS).

SIMD-регистры XMM0, … XMM7 (рис. 1.21.) могут быть использованы при осуществлении вычислений и для хранения данных. Они не могут использоваться для косвенной адресации, как это возможно для регистров общего назначения EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP.

 

SIMD-регистры общего назначения

Рис. 1.21. SIMD-регистры общего назначения

 

Регистр управления/статуса SIMD (MXCSR)

Управляющий регистр MXCSR (SIMD Floating-Point Control/Status Register) предназначен для маскирования/демаскирования SIMD-исключений, управления режимом округления, включения режима сдвига к нулю (Flush to Zero). Доступ к регистру MXCSR осуществляется командами LDMXCSRFXRSTOR (загрузка) и STMXCSRFXSAVE (сохранение).

Все зарезервированные биты регистре MXCSR сброшены в 0, попытка записи 1 в эти биты приводит к генерации ошибки общей защиты (#GP). Формат регистра представлен на рис. 1.22.

 

Формат регистра управления/статуса SIMD

Рис. 1.22. Формат регистра управления/статуса SIMD

 

IE, DE, ZE, OE, UE, PE (Флаги SIMD-исключений, биты 0, 1, 2, 3, 4, 5)

SIMD-исключения (особые ситуации) могут возникнуть во время исполнения SIMD-команд. При возникновении таких исключений соответствующие флаги устанавливается в 1. Флаги соответствуют следующим SIMD-исключениям:

Если при выполнении команды обработки упакованных данных какое-либо исключение встречается несколько раз, соответствующий флаг устанавливается однократно (т.е. определить количество срабатываний не возможно). Если в регистр MXCSR записывается значение, в котором бит маски исключения не установлен, а соответствующий флаг исключения установлен, то генерации прерывания не происходит до тех пор, пока соответствующее исключение не встретится при выполнении SIMD-программы. После сброса флаги SIMD-исключений очищены.

 

IM, DM, ZM, OM, UM, PM (Маски SIMD-исключений, биты 7, 8, 9, 10, 11, 12)

Каждому SIMD-исключению соответствует свой бит маски:

Если соответствующий бит маски SIMD-исключения установлен (исключение замаскировано), то при возникновении соответствующего исключения генерации особой ситуации не происходит (хотя флаг исключения в регистре MXCSR устанавливается), а программное обеспечение может самостоятельно проанализировать соответствующие флаги исключений по окончании вычислений.

После сброса все биты маскирования SIMD-исключений установлены. В случае инициализации каких-либо SIMD-исключений необходимо убедиться, что в обработчик исключений распознает и корректно обрабатывает эти исключения. Механизм SIMD-исключений построен на основе отдельного нового блока процессора, поэтому для обеспечения его работы необходима модификация традиционного кода, который предназначен для обработки исключений FPU.

 

RC (Режим округления, биты 13, 14)

Поле режима округления RC задает способ округления результатов арифметических операций при выполнении SIMD-команд. Это поле практически идентично полю RC регистра управления FPU (CW). Возможны следующие режимы округления:

  • 00 – округление к ближайшему (четному);
  • 01 – округление вниз (к -);
  • 10 – округление вверх (к +);
  • 11 – округление к нулю.

 

FZ (Сдвиг к нулю, бит 15)

Установка бита FZ включает режим сдвига к нулю (Flush to Zero). Этот режим проявляется при возникновении антипереполнения. Если SIMD-исключение "антипереполнение" замаскировано (MXCSR.UM = 1), то согласно стандарта IEEE-754 в обычном режиме результатом выполнения операции, вызвавшей исключение, будет денормализованный операнд. В режиме сдвиг к нулю возвращается нуль со знаком результата и устанавливается флаг точности PE. Таким образом, происходит незначительная потеря точности, но в некоторых приложениях, где антипереполнение происходит достаточно часто, точность может быть принесена в жертву скорости выполнения. В случаях, когда SIMD-исключение антипереполнение (#U) не замаскировано, режим сдвига к нулю не оказывает влияния на работу процессора, т.е. при встрече антипереполнения обработчик SIMD-исключений вызывается обычным образом.