Префикс VEX
этой статьи Начальный раздел может быть слишком коротким, чтобы адекватно суммировать ключевые моменты . ( август 2015 г. ) |
Префикс VEX (от «векторных расширений») и схема кодирования VEX расширением IA-32 и x86-64 архитектуры набора команд для микропроцессоров Intel являются , AMD и других.
Функции
[ редактировать ]Схема кодирования VEX позволяет определять новые инструкции, а также расширять или модифицировать ранее существующие коды инструкций . Это служит следующим целям:
- Карта кодов операций расширяется, чтобы освободить место для будущих инструкций.
- Это позволяет кодам инструкций иметь до четырех операндов (плюс непосредственный), тогда как исходная схема допускает только два операнда (плюс непосредственный).
- размер SIMD векторных регистров Это позволяет расширить со 128- битных регистров XMM до 256-битных регистров YMM. Существует возможность дальнейшего увеличения размера реестра.
- Он позволяет модифицировать существующие инструкции с двумя операндами в неразрушающие формы с тремя операндами, где регистр назначения отличается от обоих исходных регистров. Например, c ← a + b вместо a ← a + b (где регистр a изменяется инструкцией).
Префикс VEX заменяет наиболее часто используемые байты префикса инструкций и escape-байты. Во многих случаях количество заменяемых байтов префикса и escape-байтов такое же, как количество байтов в префиксе VEX, так что общая длина инструкции, закодированной VEX, равна длине кода устаревшей инструкции. . В других случаях версия в кодировке VEX длиннее или короче устаревшего кода. В 32-битном режиме инструкции, закодированные VEX, могут получить доступ только к первым 8 регистрам YMM/XMM; кодировки других регистров будут интерпретироваться как устаревшие инструкции LDS и LES, которые не поддерживаются в 64-битном режиме.
Кодирование инструкций
[ редактировать ]количество байтов | 0, 2, 3 | 1 | 1 | 0, 1 | 0, 1, 2, 4 | 0, 1 | |
---|---|---|---|---|---|---|---|
Часть | [Префиксы] | [ВЕКС] | КОД ОПЕРАЦИИ | МодР/М | [СИБ] | [ДИСП] | [ИММ] |
Схема кодирования VEX использует префикс кода, состоящий из двух или трех байтов , который может быть добавлен к существующим или новым кодам инструкций. [1]
В архитектуре x86 инструкции с операндом памяти могут использовать байт ModR/M , который определяет режим адресации. Этот байт имеет три битовых поля:
- mod , биты [7:6] — в сочетании с полем r/m кодирует либо 8 регистров, либо 24 режима адресации. Также кодирует информацию о коде операции для некоторых инструкций.
- reg/opcode , биты [5:3] — в зависимости от основного байта кода операции, указывает либо регистр, либо еще три бита информации о коде операции.
- r/m , биты [2:0] — можно указать регистр в качестве операнда или объединить с полем mod для кодирования режима адресации.
Формы 32-битной адресации «база плюс индекс» и «масштаб плюс индекс» (закодированные с помощью r/m = 100 и mod ≠ 11) требуют еще одного байта адресации, байта SIB. Он имеет следующие поля:
- масштабный коэффициент, закодированный битами [7:6]
- индексный регистр, биты [5:3]
- базовый регистр, биты [2:0].
Байт | Кусочек | ||||||||
---|---|---|---|---|---|---|---|---|---|
РЕКС | |||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
0 (0x4_) | 0 | 1 | 0 | 0 | В | Р | Х | Б | |
VEX3 (3-байтовый VEX) | |||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
0 (0xC4) | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | |
1 | Р̅ | Х̅ | Б̅ | м 4 | m 3 | mм2 | м 1 | м 0 | |
2 | В | v̅ 3 | v̅ 2 | v̅ 1 | v̅ 0 | л | п 1 | п 0 | |
VEX2 (2-байтовый VEX) | |||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
0 (0xC5) | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | |
1 | Р̅ | v̅ 3 | v̅ 2 | v̅ 1 | v̅ 0 | л | п 1 | п 0 | |
REX2 (2-байтовый REX) | |||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
0 (0xD5) | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | |
1 | MМ0 | Р 4 | х 4 | Б 4 | В | Р 3 | х 3 | BБ3 |
Префикс REX предоставляет дополнительное пространство для кодирования 64-битных режимов адресации и дополнительных регистров, присутствующих в архитектуре x86-64. Битовое поле W изменяет размер операнда на 64 бита, R расширяет reg до 4 битов, B расширяет r/m (или opreg в тех немногих кодах операций, которые кодируют регистр в 3 младших битах кода операции, например «POP reg»), а X и B расширяют индекс и базу в байте SIB.
Префикс VEX3 содержит все битовые поля префикса REX, а также различные другие префиксы, расширяющие режим адресации, перечисление регистров, размер и ширину операнда:
- Биты R̅, X̅ и B̅ представляют собой инверсии битов R, X и B префикса REX; они предоставляют четвертый (старший) бит для полей индекса регистра (ModRM reg, индекс SIB и ModRM r/m; база SIB или поля reg кода операции соответственно), обеспечивая доступ к 16 вместо 8 регистров.
- Один бит W, эквивалентный биту W префикса REX, определяет 64-битный операнд; для нецелочисленных инструкций это бит расширения общего кода операции.
- Четыре бита v представляют собой инверсию дополнительного индекса исходного регистра.
- Один бит L указывает длину вектора; 0 для 128-битных регистров SSE (XMM) и 1 для 256-битных регистров AVX (YMM).
- Два бита p кодируют дополнительные байты префикса. Значения 0, 1, 2 и 3 соответствуют подразумеваемым префиксам no, 0x66, 0xF3 и 0xF2. Они кодируют тип операнда для инструкций SSE с плавающей запятой: упакованный одинарный, упакованный двойной, скалярный одинарный и скалярный двойной соответственно.
- Пять m битов используются для указания карты кода операции используемой . Из 32 возможных карт кодов операций, которые могут быть закодированы с помощью m 4 m 3 m 2 m 1 m 0 , карты кодов операций 1, 2 и 3 используются для обеспечения компактной замены устаревших 2-байтовых и 3-байтовых кодов операций — эти три карты кодов операций эквивалентны ведущим последовательностям escape-байтов
0x0F
,0x0F 0x38
и0x0F 0x3A
, соответственно. Другие карты кодов операций VEX мало использовались - по состоянию на декабрь 2023 года единственным известным использованием других карт является карта 0 для Xeon Phi . Xeon Phi, специфичная дляJKZD
/JKNZD
инструкции [2] и карта 7 для запланированногоURDMSR
/UWRMSR
инструкции. [3] Карты 4/5/6 используются с префиксом EVEX , но ни одна из инструкций в этих картах не кодируется VEX.
Префикс VEX2 представляет собой 2-байтовый вариант префикса VEX3, отличающийся от последнего следующими моментами:
- Биты X̅, B̅ и W отсутствуют.
- m битов отсутствуют в префиксе VEX2; подразумевается escape 0x0F.
Инструкции, для которых требуется любое из этих битовых полей, должны быть закодированы с помощью префикса VEX3.
Префикс REX2 представляет собой 2-байтовый вариант префикса REX, представленный расширениями Intel APX, которые добавляют 16 расширенных регистров GPR.
- Биты R3 . , X3 и B3 аналогичны битам R, X и B в префиксе REX
- Биты R4 это дополнительные биты , , X4 и B4 — используемые для кодирования 32 регистров EGPR.
- Бит W такой же, как и в префиксе REX.
- Бит M 0 выбирает между устаревшей картой 0 (1-байтовые коды операций, без перехода) и устаревшей картой 1 (2-байтовые коды операций, escape 0x0F).
Режим адресации | Бит 3 | Биты [2:0] | Тип регистрации | Общее использование |
---|---|---|---|---|
РЕГ | ВЕКС.Р | ModRM.reg | Общего назначения, маска, вектор | Зарегистрировать операнд |
RM (если ModRM.mod = 11) | ВЕКС.Б | МодРМ.р/м | Георадар, маска, вектор | Зарегистрировать операнд |
РМ | ВЕКС.Б | МодРМ.р/м | георадар | Зарегистрировать адрес памяти |
БАЗА | ВЕКС.Б | СИБ.база | георадар | База + индекс × масштаб адреса памяти |
ИНДЕКС | ВЕКС.Х | СИБ.индекс | георадар | База + индекс × масштаб адреса памяти |
ВИДКС | ВЕКС.Х | СИБ.индекс | Вектор | База + векторный индекс × масштаб адреса памяти |
НСР/НДД | VEX.v 3 v 2 v 1 v 0 | Георадар, маска, вектор | Зарегистрировать операнд | |
ИС4 | Имм8[7:4] | Вектор | Зарегистрировать операнд |
Техническое описание
[ редактировать ]Инструкции, закодированные с префиксом VEX, могут иметь до четырех переменных операндов (в регистрах или памяти) и один постоянный операнд (непосредственное значение). Инструкции, которым требуется более трех переменных операндов, используют непосредственные биты операнда для указания операнда 4-го регистра (IS4 выше). Максимум один из операндов может быть операндом памяти; и не более одного из операндов может быть непосредственной константой длиной 4 или 8 бит. Остальные операнды являются регистрами.
Набор инструкций AVX — это первое расширение набора команд, использующее схему кодирования VEX. Набор инструкций AVX использует префикс VEX только для инструкций, использующих регистры SIMD XMM .
Однако схема кодирования VEX использовалась и для других типов команд, а также в последующих расширениях набора команд. Например:
- BMI представила арифметические и битовые инструкции в кодировке VEX, которые работают с регистрами общего назначения.
- AVX-512 представил 8 регистров масок и добавил инструкции в коде VEX для управления ими. (VEX.B̅ игнорируется, когда поле используется для кодирования регистра маски, а VEX.R̅ и VEX.v̅ 3 – нет, и им должно быть присвоено значение 1 в 64-битном режиме. [4] )
- AMX представила 8 регистров плиток и добавила инструкции в коде VEX для управления ими.
Значения начальных байтов префикса VEX, 0xC4 и 0xC5, такие же, как коды операций инструкций LDS и LES. Не поддерживается в 64-битном режиме, неоднозначность разрешается в 32-битном режиме за счет использования того факта, что допустимый байт ModR/M LDS или LES не может указывать операнд-источник регистра; т. е. иметь форму 11xxxxxx . Различные битовые поля во втором байте префикса VEX инвертируются, чтобы гарантировать, что байт всегда имеет эту форму. Аналогичным образом, в однобайтовой форме префикса REX четыре старших бита установлены в четыре, что заменяет шестнадцать кодов операций с номерами 0x40–0x4F. Раньше этими кодами операций были отдельные инструкции INC и DEC для восьми стандартных регистров процессора; Код x86-64 должен использовать инструкции ModR/M INC и DEC. [5]
Устаревшие инструкции SIMD с добавленным префиксом VEX эквивалентны тем же инструкциям без префикса VEX со следующими отличиями:
- Инструкция, закодированная в VEX, может иметь еще один операнд, что делает ее неразрушающей.
- 128-битная инструкция XMM без префикса VEX оставляет старшую половину полного 256-битного регистра YMM неизмененной, тогда как версия с кодировкой VEX устанавливает старшую половину в ноль.
- 128-битные инструкции XMM без префикса VEX обычно требуют, чтобы любые аргументы памяти были выровнены по 16 байтам - версии с кодировкой VEX допускают несовпадение операндов памяти.
Инструкции, использующие весь 256-битный регистр YMM, не следует смешивать с инструкциями, отличными от VEX, которые оставляют неизменной верхнюю половину регистра, по соображениям эффективности. [6] [7]
Префикс VEX не поддерживается в реальном режиме и режиме виртуального-8086 (все инструкции с префиксом VEX будут вызывать #UD в этих режимах).
История
[ редактировать ]- В августе 2007 года AMD предложила расширение набора команд SSE5 , которое включает новую схему кодирования инструкций с тремя операндами с использованием дополнительного байта с именем DREX и предназначено для ядра процессора Bulldozer в 2011 году. [8] [9] Однако в 2009 году SSE5 был отменен и так и не реализован.
- В марте 2008 года Intel предложила набор инструкций AVX , используя новую схему кодирования VEX. [10]
- В августе 2008 года комментаторы выразили сожаление по поводу ожидаемой несовместимости между наборами инструкций AMD и Intel и предложили AMD пересмотреть свои планы и заменить схему DREX более гибкой и расширяемой схемой VEX. [11]
- В мае 2009 года AMD объявила о пересмотре предлагаемого набора инструкций SSE5, чтобы сделать его совместимым с набором инструкций AVX и схемой кодирования VEX. Пересмотренный SSE5 называется XOP . [12]
- Январь 2011 г. Набор инструкций AVX поддерживается микропроцессорной архитектурой Intel Sandy Bridge .
- 2011. Наборы инструкций AVX , XOP и FMA4 поддерживаются процессором AMD Bulldozer . [13]
- 2013. Набор инструкций FMA3 поддерживается в процессорах Intel Haswell.
- В июле 2023 года Intel анонсировала расширения Advanced Performance Extensions (APX), которые используют префикс REX2 и обновленный префикс EVEX.
Ссылки
[ редактировать ]- ^ Корпорация Intel (январь 2009 г.). «Справочник по программированию расширенных векторных расширений Intel» .
- ^ Справочное руководство по архитектуре набора команд сопроцессора Intel® Xeon Phi™ (PDF) . 7 сентября 2012 г. с. 73. 327364-001. Архивировано (PDF) из оригинала 4 августа 2021 г.
- ^ Расширения набора команд архитектуры Intel® и будущие функции (PDF) . Сентябрь 2023 г. с. 103. 314933-050. Архивировано (PDF) из оригинала 12 декабря 2023 г.
- ^ Intel, Руководство разработчика программного обеспечения , номер заказа. 325462-081, сен 2023, том 2, раздел 2.7.11.3, с. 588. Архивировано 6 декабря 2023 г.
- ^ Корпорация Intel (01 сентября 2016 г.). «Руководство разработчика архитектур Intel® 64 и IA-32: Том 2A» . п. 2-8 . Проверено 13 сентября 2021 г.
- ^ Intel, Как избежать штрафов за переход AVX-SSE , 2011. Архивировано 26 октября 2023 г.
- ^ Переполнение стека. Почему этот код SSE в 6 раз медленнее без VZEROUPPER на Skylake? , декабрь 2016 г. Архивировано 6 июля 2023 г.
- ^ «Набор 128-битных инструкций SSE5» . Центр разработчиков AMD . Проверено 2 июня 2009 г.
- ^ Грушка, Джоэл (14 ноября 2008 г.). «AMD Fusion теперь перенесен на 2011 год» . Арс Техника .
- ^ «Сеть программного обеспечения Intel» . Интел . Архивировано из оригинала 7 апреля 2008 г. Проверено 5 апреля 2008 г.
- ^ «AMD и Intel несовместимы. Что делать?» . Форумы разработчиков AMD . Проверено 10 августа 2012 г.
- ^ «Руководство программиста по архитектуре AMD64, том 4: инструкции для 128-битных и 256-битных носителей» (PDF) . АМД . 22 декабря 2010 г.
- ^ «Достижение баланса» . Дэйв Кристи, блоги разработчиков AMD. Архивировано из оригинала 09.11.2013 . Проверено 10 августа 2012 г.