Префикс EVEX (расширенное векторное расширение) и соответствующая схема кодирования являются расширением архитектуры набора инструкций 32-бит x86 (IA-32) и 64-бит x86-64 (AMD64) . EVEX основан на префиксе MVEX [1], используемом процессором Knights Corner , но его не следует путать с ним .
Схема EVEX представляет собой 4-байтовое расширение схемы VEX , которое поддерживает набор инструкций AVX-512 и позволяет адресовать новые 512-битные регистры ZMM и новые 64-битные регистры маски операндов.
Благодаря Advanced Performance Extensions префикс Extended EVEX переопределяет семантику нескольких битов полезной нагрузки. [2]
Функции
Кодирование EVEX может адресовать 8 регистров масок операндов, 16 регистров общего назначения и 32 векторных регистра в 64-битном режиме (в противном случае 8 регистров общего назначения и 8 векторных) и может поддерживать до 4 операндов.
Как и схема кодирования VEX, префикс EVEX объединяет существующие префиксы кодов операций и управляющие коды, адресацию памяти и модификаторы длины операндов набора инструкций x86.
Из схемы VEX перенесены следующие функции:
- Прямое кодирование трех регистров SIMD (XMM, YMM или ZMM) в качестве исходных операндов (регистры MMX или x87 не поддерживаются);
- Сжатый префикс REX для 64-битного режима;
- Сжатый префикс SIMD (66h, F2h, F3h), код операции escape (0Fh) и двухбайтовый escape (0F38h, 0F3Ah);
- Менее строгие требования к выравниванию памяти для операнда памяти
EVEX также расширяет VEX дополнительными возможностями:
- Расширенное кодирование регистров SIMD: всего 32 новых 512-битных регистра SIMD ZMM0–ZMM31 в 64-битном режиме;
- Кодирование маски операнда: 8 новых 64-битных регистров маски операции k0–k7 для условного выполнения и объединения операндов назначения;
- Широковещательная передача от источника к месту назначения для инструкций, которые принимают вектор памяти в качестве исходного операнда: второй операнд широковещательно передается перед использованием в фактической операции;
- Прямое встроенное управление округлением для инструкций, работающих с регистрами SIMD с плавающей точкой с семантикой округления;
- Встроенный контроль исключений для инструкций с плавающей точкой без семантики округления;
- Сжатое смещение (Disp8 × N), новый режим адресации памяти для улучшения плотности кодирования потока байтов инструкций; масштабный коэффициент N зависит от длины вектора и режима вещания.
Например, схема кодирования EVEX допускает условное векторное сложение в форме
ВАДДПС zmm1 {k1}{z}, zmm2, zmm3
где модификатор {k1} рядом с операндом назначения кодирует использование регистра opmask k1 для условной обработки и обновлений назначения, а модификатор {z} (кодируемый EVEX.z) обеспечивает два типа маскирования (слияние и обнуление), при этом слияние используется по умолчанию, когда модификатор не присоединен.
Техническое описание
Схема кодирования EVEX использует префикс кода, состоящий из 4 байтов ; первый байт всегда равен 62h и происходит от неиспользуемого кода операции 32-битной инструкции BOUND, которая не поддерживается в 64-битном режиме. [3]
Байт ModR/M определяет один операнд (всегда регистр) с полем reg , а второй операнд кодируется полями mod и r/m , определяя либо регистр, либо местоположение в памяти. Адресация Base-plus-index и scale-plus-index требует байта SIB, который кодирует 2-битный масштабный коэффициент, а также 3-битный индекс и 3-битные базовые регистры. В зависимости от режима адресации поле Disp8/Disp16/Disp32 может следовать со смещением, которое необходимо добавить к адресу.
Префикс EVEX сохраняет поля, введенные в префиксе VEX :
- Четыре бита R̅, X̅, B̅ и W из префикса VEX, сохраненные в инвертированной форме. W расширяет размер операнда до 64 бит или служит дополнительным кодом операции, R расширяет reg , B расширяет r/m или reg , а X и B расширяют индекс и базу в байте SIB.
- Четыре бита с именем v̅ хранятся в инвертированной форме. vvvv указывает второй неразрушающий операнд исходного регистра.
- Бит L указывает длину вектора 256 бит.
- Два бита с именем p для замены префиксов размера операнда и префиксов типа операнда (66h, F2h, F3h).
- Три из m битов для выбора карт опкодов. Карты 1, 2 и 3 заменяют существующие escape-коды 0Fh, 0F 38h и 0F 3Ah.
Новые функции существующих полей:
- Бит X теперь расширяет r/m вместе с битом B, когда байт SIB отсутствует, что позволяет использовать 32 регистра SIMD.
- Теперь поддерживаются карты опкодов 5 и 6, где биты m установлены на 101 или 110 соответственно. Они используются многими инструкциями AVX512-FP16.
Появилось несколько новых битовых полей:
- Бит R̅' в инвертированной форме; R' расширяет рег .
- Бит V̅' в инвертированной форме; V' расширяет vvvv .
- Три бита с именем 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.
Расширенный префикс EVEX
Расширения Intel Advanced Performance Extensions представляют несколько новых вариантов 3-байтовой полезной нагрузки в префиксе EVEX, которые используются для кодирования расширенных регистров GPR R16–R31 и новых условных инструкций.
Расширение EVEX инструкций EVEX:
- Биты R̅ 3 , X̅ 3 и B̅ 3 являются инверсиями битов R 3 , X 3 и B 3 префикса REX2 . Они такие же, как биты R̅, X̅ и B̅ из префиксов VEX и EVEX.
- R̅ 4 , X̅ 4 , B 4 бита используются для кодирования 32 регистров EGPR. Хранятся в инвертированной форме, за исключением B4.
- Пять битов с именем v̅ хранятся в инвертированной форме. vvvvv указывает дополнительный индекс исходного регистра, который может кодировать 32 регистра EGPR.
- Биты z, m, b, L, p, a такие же, как в старом префиксе EVEX.
Расширение EVEX инструкций VEX:
Расширение EVEX для устаревших инструкций:
- NF — подавление обновления флагов состояния («нет флагов») для нескольких инструкций BMI (ANDN, BEXTR, BLSI, BLSMSK, BLSR, BZHI).
- ND — флаг нового назначения данных (NDD). Когда ND = 1, индекс регистра EGPR кодируется битами v̅.
Префикс EVEX для условных CMP и TEST:
- Биты SC представляют собой код исходного состояния (SCC).
- OF, SF, ZF, CF — флаги переполнения, знака, нуля и переноса для проверки (для флага четности кодировка отсутствует).
Если новые регистры EGPR и назначения операндов могут быть закодированы как расширенными префиксами EVEX, так и REX2, то последний вариант является предпочтительным.
Ссылки
- ^ Справочное руководство по архитектуре набора инструкций сопроцессора Intel® Xeon Phi™ (PDF) . 7 сентября 2012 г. стр. 42. 327364-001. Архивировано (PDF) из оригинала 4 августа 2021 г.
- ^ Спецификация архитектуры Intel® Advanced Performance Extensions (Intel® APX) (PDF) (2-е изд.). Август 2023 г. стр. 21. 355828-002US. Архивировано (PDF) из оригинала 10 сентября 2023 г.
- ^ Корпорация Intel (март 2024 г.). «Справочник по программированию расширений набора инструкций архитектуры Intel».