Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

EVEX префикс (Enhanced расширение вектора) и соответствующая схема кодирования является расширением к 32-битной x86 (IA-32) и 64-битный x86-64 (AMD64) архитектуры набора команд . EVEX основан на префиксе MVEX, который используется процессором Knights Corner , но его не следует путать с ним .

Схема EVEX представляет собой 4-байтовое расширение схемы VEX , которое поддерживает набор инструкций AVX-512 и позволяет адресовать новые 512-битные регистры ZMM и новые 64-битные регистры маски операндов.

Особенности [ править ]

Кодирование EVEX может адресовать 8 регистров маски операндов, 16 регистров общего назначения и 32 векторных регистра в 64-битном режиме (в противном случае 8 универсальных и 8 векторных) и может поддерживать до 4 операндов.

Как и схема кодирования VEX, префикс EVEX объединяет существующие префиксы опкодов и escape-коды, адресацию памяти и модификаторы длины операндов набора команд x86.

Следующие функции перенесены из схемы VEX:

  • Прямое кодирование трех регистров SIMD (XMM, YMM или ZMM) в качестве исходных операндов (регистры MMX или x87 не поддерживаются);
  • Сжатый префикс REX для 64-битного режима;
  • Сжатый префикс SIMD (66H, F2H, F3H), код операции перехода (0FH) и двухбайтовый переход (0F38H, 0F3AH);
  • Менее строгие требования к выравниванию памяти для операнда памяти

EVEX также расширяет VEX дополнительными возможностями:

  • Расширенное кодирование регистров SIMD: всего 32 новых 512-битных регистра SIMD ZMM0-ZMM31 в 64-битном режиме;
  • Кодирование маски операнда: 8 новых 64-битных регистров opmask k0-k7 для условного выполнения и объединения операндов назначения;
  • Широковещательная передача от источника к адресату для инструкций, которые принимают вектор памяти в качестве исходного операнда: второй операнд передается перед использованием в фактической операции;
  • Прямое встроенное управление округлением для инструкций, которые работают с регистрами SIMD с плавающей запятой с семантикой округления;
  • Встроенный контроль исключений для команд с плавающей запятой без семантики округления;
  • Сжатое смещение (DISP8 * N), новый режим адресации памяти для повышения плотности кодирования потока байтов команд; масштабный коэффициент N зависит от длины вектора и режима вещания.

Например, схема кодирования EVEX допускает условное добавление векторов в виде

VADDPS zmm1 {k1} {z}, zmm2, zmm3

где модификатор {k1} рядом с операндом назначения кодирует использование регистра opmask k1 для условной обработки и обновления места назначения, а модификатор {z} (закодированный в EVEX.z) обеспечивает два типа маскирования (слияние и обнуление) с слияние по умолчанию, когда модификатор не добавлен.

Техническое описание [ править ]

В схеме кодирования EVEX используется префикс кода, состоящий из 4 байтов ; первый байт всегда 62h и является производным от неиспользуемого кода операции 32-битной инструкции BOUND, которая не поддерживается в 64-битном режиме. [1]

Байт ModR / M определяет один операнд (всегда регистр) с полем reg , а второй операнд кодируется полями mod и r / m , определяющими либо регистр, либо место в памяти. Для адресации «базовый плюс индекс» и «масштаб плюс индекс» требуется байт SIB, который кодирует 2-битный коэффициент масштабирования, а также 3-битный индекс и 3-битные базовые регистры. В зависимости от режима адресации, поле Disp8 / Disp16 / Disp32 может сопровождаться смещением, которое необходимо добавить к адресу.

Префикс EVEX сохраняет поля, введенные в префиксе VEX :

  • Четыре бита R, X, B и W из префикса REX. W расширяет размер операнда до 64 бит или служит дополнительным кодом операции, R расширяет reg , B расширяет r / m или reg , а X и B расширяют индекс и основание в байте SIB. Как и в префиксе VEX, RXB предоставляется в перевернутом виде.
  • Четыре бита с именем v, определяющие второй неразрушающий операнд исходного регистра. Как и в префиксе VEX, vvvv предоставляется в перевернутом виде.
  • Бит L, определяющий длину вектора 256 бит.
  • Два бита с именем p для замены префиксов размера операнда и префиксов типа операнда (66, F2, F3).
  • Два из m битов для замены существующих escape-кодов (0F, 0F 38 и 0F 3A).

Новые функции существующих полей:

  • Бит X теперь расширяет r / m вместе с битом B, когда байт SIB отсутствует, что позволяет использовать 32 регистра SIMD.

Появилось несколько новых битовых полей:

  • Бит R 'расширяет рег . Как и бит R, R 'предоставляется в инвертированной форме.
  • Бит V 'расширяется vvvv . Как и биты vvvv, V 'предоставляется в инвертированной форме.
  • Три бита с именем a, определяющие регистр маски операнда (k0-k7) для векторных инструкций.
  • Бит z для указания режима слияния (слияние или ноль).
  • Бит b для исходной широковещательной передачи, управления округлением (в сочетании с L'L) или подавления исключений.
  • Бит L 'для указания длины вектора в 512 бит или режима управления округлением в сочетании с L.

Кодировка префикса EVEX следующая:

В следующей таблице перечислены возможные комбинации адресации регистров (бит 4 всегда равен нулю при кодировании 16 регистров общего назначения):

Некоторые инструкции смешивания AVX с кодировкой VEX имеют 4 операнда. Для этого в VEX есть режим адресации IS4, который кодирует 4-й операнд (векторный регистр) в битах Imm8 [7: 4] непосредственной константы. Подобные инструкции смешивания с кодировкой EVEX имеют свой 4-й операнд в регистре маски. Никакая инструкция, закодированная в EVEX, не использует кодировку режима адресации IS4.

Ссылки [ править ]