Длина вектора AVX512 и управление SAE
Мой вопрос касается EVEX-кодированных упакованных инструкций reg-reg без округления семантики, которые позволяют контролировать SAE (подавление всех исключений), таких как VMIN*, VCVTT*, VGETEXT*, VREDUCE*, VRANGE* и т. Д. Intel объявляет SAE-осведомленность только с полной Длина вектора 512 бит, например
VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}
но я не вижу причины, по которой SAE нельзя применять к инструкциям, где используются регистры xmm или ymm.
В главе 4.6.4 Справочного руководства по программированию расширений набора команд Intel в таблице 4-7 говорится, что в инструкциях без округления семантический бит EVEX.b указывает, что применяется SAE, а биты EVEX.L'L указывают явную длину вектора:
00b: 128bit (XMM)
01b: 256bit (YMM)
10b: 512bit (ZMM)
11b: reserved
поэтому их комбинация должна быть законной.
Однако NASM собирает vminpd zmm1,zmm2,zmm3,{sae}
как 62F1ED185DCB, то есть EVEX.L'L=00b, EVEX.b=1, который разбирается обратно NDISASM 2.12 как vminpd xmm1,xmm2,xmm3
NASM отказывается собирать vminpd ymm1,ymm2,ymm3,{sae}
и NDISASM разбирает 62F1ED385DCB (EVEX.L'L=01b, EVEX.b=1) как vminpd xmm1,xmm2,xmm3
Интересно, как работает Knights Landing CPU? VMINPD ymm1, ymm2, ymm3{sae}
(собранный как 62F1ED385DCB, EVEX.L'L = 01b, EVEX.b = 1):
- CPU выдает исключение. Документ Intel Таблица 4-7 вводит в заблуждение.
- Действует SAE, CPU работает только с xmm, так же как и в скалярных операциях. NASM и NDISASM делают это правильно, документация Intel неверна.
- SAE игнорируется, процессор работает с 256 битами в соответствии со спецификацией VMINPD в Intel doc. NASM & NDISASM не правы.
- Действует SAE, процессор работает с 256 битами, как указано в коде инструкции. NASM и NDISASM не правы, для документа Intel необходимо дополнительно декорировать инструкции xmm/ymm с помощью {sae}.
- Действует SAE, ЦП работает с подразумеваемым полным векторным размером 512 бит, независимо от EVEX.L'L, так же, как если бы были разрешены статические округления {er}. NDISASM и Intel Doc Таблица 4-7 неверны.
2 ответа
Ваш VMINPD ymm1, ymm2, ymm3{sae}
Инструкция недействительна. Согласно справочнику по набору инструкций для MINPD в Справочнике по программированию расширений инструкций по архитектуре Intel (февраль 2016 г.) допускаются только следующие кодировки:
66 0F 5D /r MINPD xmm1, xmm2/m128 VEX.NDS.128.66.0F.WIG 5D /r VMINPD xmm1, xmm2, xmm3/m128 VEX.NDS.256.66.0F.WIG 5D /r VMINPD ymm1, ymm2, ymm3/m256 EVEX.NDS.128.66.0F.W1 5D /r VMINPD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst EVEX.NDS.256.66.0F.W1 5D /r VMINPD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst EVEX.NDS.512.66.0F.W1 5D /r VMINPD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst{sae}
Обратите внимание, что только последняя версия отображается с {sae}
суффикс, означающий, что это единственная форма инструкции, с которой вам разрешено ее использовать. Тот факт, что биты существуют для кодирования конкретной инструкции, не означает ее действительность.
Также обратите внимание, что раздел 4.6.3, Поддержка SAE в EVEX, разъясняет, что SAE не применяется к 128-битным или 256-битным векторам:
Система кодирования EVEX позволяет арифметическим инструкциям с плавающей запятой без семантического округления кодироваться с помощью атрибута SAE. Эта возможность применяется к скалярным и 512-битным векторным длинам, только от регистра к регистру, путем установки EVEX.b. Когда EVEX.b установлен, подразумевается "подавить все исключения". [...]
Однако я не уверен, будет ли созданная вами вручную инструкция генерировать исключение Invalid Opcode, будет ли бит EVEX.b просто игнорироваться или биты EVEX.L'L будут игнорироваться. Команды VMINPD в кодировке EVEX относятся к классу исключений типа E2, и в соответствии с таблицей 4-17, условия исключений класса E2, инструкция может генерировать исключение #UD в любом из следующих случаев:
- Государственное требование, таблица 4-8 не соблюдена.
- Независимое от кода операции условие #UD в таблице 4-9.
- Условия кодирования операнда #UD в таблице 4-10.
- Условие кодировки #UD маски в таблице 4-11.
- Если EVEX.L'L!= 10b (VL=512).
Кажется, здесь применима только последняя причина, но это будет означать, что ваша инструкция сгенерирует исключение #UD с или без {sae}
модификатор. Поскольку это, кажется, прямо противоречит разрешенным кодировкам в сводке инструкций, я не уверен, что произойдет.
В Твиттере iximeow добавляет некоторые дополнения к ответу Росс Ридж выше:
- Росс Ридж прав в том, что текст недействителен, но важная деталь заключается в том, что выбирается конкретный режим SAE, поэтому, если вы установите
L'L
указыватьymm
ты просто получаешь{rd-sae}
- это означает, что если вы установите
b
дляsae
вообще, ширина вектора сразу фиксируется на 512 бит
ширина вектора фиксирована и составляет 512 бит *
* за исключением некоторых инструкций cvt, где один операнд равен 512 бит, а один операнд меньше
( Комментарий @Pepijn к ответу Росса уже связан с этими твитами; но я подумал, что стоит сделать это отдельным ответом, хотя бы для наглядности.)