Intel APX, новый набор инструкций. Первая часть
INTEL® APX Введение
Введение
Intel®Advanced Performance Extensions (Intel® APX) расширяет архитектуру набора инструкций Intel® 64, предоставляя доступ к большему количеству регистров и добавляя различные новые функции, повышающие производительность общего назначения. Расширения предназначены для обеспечения эффективного прироста производительности при различных рабочих нагрузках без значительного увеличения площади кристалла или энергопотребления ядра.
К основным функциям Intel® APX относятся:
1. 16 дополнительных регистров общего назначения (GPR) R16–R31, также называемых расширенными GPR (EGPR);
2. Форматы инструкций с тремя операндами с новым регистром назначения данных (NDD) для многих целочисленных инструкций;
3. Улучшения условной ISA: новые инструкции условной загрузки, сохранения и сравнения в сочетании с возможностью компилятора подавлять запись флагов состояния общих инструкций;
4.Оптимизированы операции сохранения/восстановления состояния реестра.
5. Новая 64-битная инструкция абсолютного прямого перехода.
Это введение состоит из двух частей. Первая часть представляет собой обзор инструкций Intel® APX и их форматов кодирования. Во второй части описывается общая системная архитектура Intel® APX и то, как она сосуществует с существующими функциями x86.
В этой статье мы будем использовать следующие сокращения:
1. "SDM" расшифровывается как Руководства для разработчиков программного обеспечения для архитектур Intel® 64 и IA-32.
2. «OSIZE» означает размер операнда.
3. "ASIZE" означает размер адреса.
Формат инструкций Intel® APX
В этой главе подробно описывается формат кодирования инструкций Intel® APX. Intel® APX представляет новый 2-байтовый префикс REX2 и расширяет существующий 4-байтовый префикс EVEX чтобы поддержка 32 регистров общего назначения (GPR), регистра назначения новых данных (NDD) и другие усовершенствования.
реклама
Префикс REX2 и расширенный префикс EVEX доступны только после включения Intel® APX в 64-разрядном режиме.
Как правило, инструкции x86 имеют три отдельных пространства кодирования: устаревшее, VEX и EVEX. Инструкции в пространствах VEX и EVEX кодируются с использованием (соответственно) префиксов VEX (0xC4 и 0xC5) и префикса EVEX (0x62). Унаследованное пространство состоит из инструкций, которых нет ни в пространстве VEX, ни в пространстве EVEX. Каждое пространство кодирования имеет ряд отдельных карт. В настоящее время устаревшее пространство имеет четыре карты с номерами 0, 1, 2 и 3, которые соответствуют 1-байтовым кодам операций (без экранирования), 2-байтным кодам операций (экранирование 0x0F) и 3-байтным кодам операций (экранирование 0x0F38 и 0x0F3A) соответственно. . Пространства VEX и EVEX не используют escape-байты, а кодируют идентификатор карты в полезной нагрузке VEX или EVEX. Префиксы VEX и EVEX могут поддерживать до 32 и 8 карт соответственно.
Ниже представлен обзор того, как Intel® APX влияет на эти три области кодирования, подробности о которых приведены в следующих разделах:
Устаревшее пространство:
1. Все инструкции в устаревших картах 0 и 1, которые имеют явные GPR или операнды памяти, могут использовать префикс REX2 для доступа к старшим 16 GPR (а именно, с R16 по R31).
* Существует одно исключение в отношении XSAVE*/XRSTOR* по соображениям архитектуры системы.
2.Некоторые строки кодов операций в устаревших картах 0 и 1, которые не имеют явных GPR или операндов памяти, зарезервированы в REX2 для использования в будущем.
* Один из этих кодов операций уже используется Intel® APX для кодирования 64-битного абсолютного прямого перехода.
3. Выберите инструкции из всех четырех устаревших карт в пространстве EVEX, чтобы активировать новые возможности, предоставляемые Intel® APX.
4. Инструкции в устаревших картах 2 и 3 не могут использовать префикс REX2 и, следовательно, не могут напрямую обращаться к верхним 16 GPR. Но у некоторых из них есть раскрученные формы (см. последний пункт), которые могут.
Пространство VEX:
1.Отдельные инструкции из пространства VEX продвигаются в пространство EVEX, чтобы активировать новые возможности, предоставляемые Intel® APX.
2. В противном случае инструкции в пространстве VEX не могут напрямую использовать новые возможности, предоставляемые Intel® APX.
EVEX пространство:
1. Все инструкции в пространстве EVEX могут обращаться к старшим 16 GPR в своих операндах памяти.
2. Все инструкции, продвигаемые из устаревшего пространства, помещаются в одну карту, карту 4, которая ранее была зарезервирована.
3. Инструкции, продвигаемые из пространства VEX, сохраняют свои прежние номера карт, но с добавлением новых форм EVEX.
Префикс REX2
Как показано на рисунке, префикс REX2 имеет длину два байта и состоит из байта со значением 0xD5, за которым следует второй байт, содержащий биты полезной нагрузки. Биты полезной нагрузки [W,R3,X3,B3] имеют то же значение, что и биты полезной нагрузки REX [W,R,X,B], за исключением того, что инструкции «PUSH reg» с кодами операций 0x50-0x57 и «POP reg
с кодами операций 0x58-0x5F в устаревшей карте 0 будет использовать REX2.W для кодирования подсказки PPX (ускорение push-pop) (подробности см. в разделе 3.1.3.1.2). Биты полезной нагрузки [R4,X4,B4] обеспечивают пятый и самый значащий бит.
идентификаторов регистров R, X и B, каждый из которых теперь может адресовать все 32 GPR. Подобно префиксу REX, когда OSIZE = 8b, наличие префикса REX2 приводит к тому, что идентификаторы GPR [4,5,6,7] адресных байтовых регистров [SPL,BPL,SIL,DIL] вместо [AH,CH,DH, BH].
Инструкция с префиксом REX2 всегда интерпретируется как инструкция в устаревшей карте 0 или 1, где REX2.M0 кодирует идентификатор карты. REX2 не поддерживает никаких инструкций в устаревших картах 2 и 3. Расширение Intel® APX устаревших инструкций в картах 2 и 3 (таких как инструкции CRC32, SHA и RAO) обеспечивается расширенным префиксом EVEX.
REX2 применим ко всем инструкциям в картах 0 и 1 устаревшего пространства, кроме следующих:
1. Префикс инструкций XSAVE* и XRSTOR* с префиксом REX2 запускает #UD. Это связано с тем, что XSAVE* и XRSTOR* не могут использовать верхние 16 GPR по причинам архитектуры системы.
2. Все коды операций, перечисленные ниже, зарезервированы для REX2 и запускают #UD при префиксе REX2.
Устаревшая карта 0:
* Все коды операций в строке 0x4*
* Все коды операций в строке 0x7*
* Все коды операций в строке 0xA*
· - Исключение: 0xA1 с префиксом REX2 используется для кодирования инструкции JMP ABS
* Все коды операций в строке 0xE*
Устаревшая карта 1:
* Все коды операций в строке 0x3*
* Все коды операций в строке 0x8*
Ни один из приведенных выше кодов операций не кодирует инструкцию, которой требуется идентификатор регистра R, X или B и, следовательно, не используется префикс REX2.
Любой код операции в устаревшей карте 0 или 1, который уже имеет #UD без REX2, останется #UD, если к нему добавлен префикс REX2. Кроме того, поскольку байт, следующий за префиксом REX2, всегда интерпретируется как основной байт кода операции, любой устаревший байт префикса (а именно, 0x66, 0x67, 0xF0, 0xF2, 0xF3 и переопределение сегмента) или байт префикса REX (0x4*), следующий за префиксом Префикс REX2 с REX2.M0 = 0 должен иметь #UD, потому что ни один из этих байтов не является кодом операции действительной инструкции в устаревшей карте 0 в 64-битном режиме.
Обратите внимание, что идентификаторы регистров R, X и B также могут относиться к типам регистров, отличным от GPR, таким как векторные регистры, управляющие регистры и регистры отладки. Когда любой из них имеет значение, старшие биты REX2.R4, REX2.X4 или REX2.B4 обычно игнорируются, за исключением случаев, когда адресуемый регистр является регистром управления или отладки. Например, используя префикс REX2, инструкция «ADDPD xmm1, xmm2/m128» может использовать все 32 GPR в качестве базовых и/или индексных регистров в своем операнде памяти, но она по-прежнему не может получить доступ от XMM16 до XMM31, поскольку REX2.R4 и REX2 .B4 игнорируются, когда идентификаторы регистров R и B регистрируют вектор адреса. Точно так же, когда индексный регистр отсутствует, REX2.X4 и REX2.X3 игнорируются, и генераторы кода должны установить эти биты в ноль.
Исключением является то, что REX2.R4 и REX2.R3 не игнорируются, когда идентификатор регистра R обращается к управляющему или отладочному регистру. Кроме того, при любой попытке доступа к несуществующему регистру управления (CR*) или регистру отладки (DR*) с использованием префикса REX2 и одной из следующих инструкций: «MOV CR*, r64», «MOV r64, CR*», «MOV DR*, r64», «MOV r64, DR*»
#UD повышен REX2 должен быть последним префиксом. Байт, следующий за ним, интерпретируется как основной байт кода операции в карте кода операции, обозначенной M0. Управляющий байт 0x0F не нужен и не разрешен. (То есть префикс REX2 с последующим 0x0F запускает #UD.) Префиксы, которые могут предшествовать префиксу REX2: LOCK (0xF0), REPE (0xF3), REPNE (0xF2), переопределение OSIZE (0x66), переопределение ASIZE (0x67) и переопределение сегмента, все которые сохраняют свои текущие значения и ограничения. (Например, ADD с префиксом REX2, адрес назначения которого не является операндом памяти, должен иметь #UD, если он имеет префикс LOCK.) Префикс REX (0x4*), непосредственно предшествующий префиксу REX2, не допускается и вызывает #UD. EVEX (0x62), VEX2 (0xC5), VEX3 (0xC4) или другой REX2 не может предшествовать префиксу REX2, потому что первый байт, следующий за любым из этих префиксов, интерпретируется как основной байт кода операции. Правила префикса для REX2 приведены в таблице.
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила