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]
# байтов | 4 | 1 | 1 | 1 | 4/1 | 1 |
---|---|---|---|---|---|---|
[Префиксы] | EVEX | Код операции | ModR / M | [SIB] | [Disp32] / [Disp8 * N] | [Немедленный] |
Байт 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 следующая:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
---|---|---|---|---|---|---|---|---|---|
Байт 0 (62h) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | |
Байт 1 (P0) | р | Икс | B | Р' | 0 | 0 | м 1 | м 0 | П [7: 0] |
Байт 2 (P1) | W | v 3 | v 2 | v 1 | v 0 | 1 | п 1 | p 0 | П [15: 8] |
Байт 3 (P2) | z | L ' | L | б | V ' | а 2 | а 1 | а 0 | П [23:16] |
В следующей таблице перечислены возможные комбинации адресации регистров (бит 4 всегда равен нулю при кодировании 16 регистров общего назначения):
Режим адресации | Бит 4 | Бит 3 | Биты [2: 0] | Тип реестра | Обычное использование |
---|---|---|---|---|---|
REG | EVEX.R ' | EVEX.R | ModRM.reg | Общего назначения, Вектор | Зарегистрировать операнд |
RM (если ModRM.mod = 11) | EVEX.X | EVEX.B | МодРМ.р / м | Георадар, Вектор | Зарегистрировать операнд |
RM | 0 | EVEX.B | МодРМ.р / м | Георадар | Адрес регистрационной памяти |
ОСНОВАНИЕ | 0 | EVEX.B | SIB.base | Георадар | База + Индекс * Адрес памяти шкалы |
ПОКАЗАТЕЛЬ | 0 | EVEX.X | SIB.index | Георадар | База + Индекс * Адрес памяти шкалы |
VIDX | EVEX.V ' | EVEX.X | SIB.index | Вектор | Base + VectorIndex * Масштабировать адрес памяти |
NDS / NDD | EVEX.V ' | EVEX.v 3 v 2 v 1 v 0 | Георадар, Вектор | Зарегистрировать операнд | |
K | 0 | 0 | EVEX.a 2 а 1 а 0 | Маска | Операнд регистра маски |
Некоторые инструкции смешивания AVX с кодировкой VEX имеют 4 операнда. Для этого в VEX есть режим адресации IS4, который кодирует 4-й операнд (векторный регистр) в битах Imm8 [7: 4] непосредственной константы. Подобные инструкции смешивания с кодировкой EVEX имеют свой 4-й операнд в регистре маски. Никакая инструкция, закодированная в EVEX, не использует кодировку режима адресации IS4.
Ссылки [ править ]
- ^ Корпорация Intel (июль 2013 г.). «Справочник по программированию расширений набора команд архитектуры Intel» .