AVXENCODING OPCJI
Wybiera preferowane kodowanie instrukcji AVX.
Składnia
OPTION AVXENCODING:
preferencja
Tło
Instrukcje intel AVX i AVX-512 są kodowane inaczej niż inne instrukcje dotyczące architektury Intel. Zamiast polegać na prefiksach instrukcji bajtach i bajtach potencjalnych klientów kodu opcode w celu wybrania instrukcji, używają one pojedynczego prefiksu wielobajtowego. Ten prefiks może kodować dodatkowy operand rejestru. W trybie 64-bitowym ma również bity do wybrania rejestrów od 8 do 15 dla innych operandów, a prefiks REX nie jest potrzebny.
Używane są trzy różne prefiksy wielo bajtowe. Instrukcje AVX można kodować za pomocą prefiksu VEX 3-bajtowego, gdzie druga i trzecia bajty pomagają wybrać określoną operację wykonaną. Jeśli niektóre pola w prefiksie VEX 3-bajtowym mają określone wartości, można użyć 2-bajtowego formularza prefiksu VEX. Na koniec niektóre instrukcje AVX mają również postać AVX-512, która jest kodowana z prefiksem EVEX 4-bajtowym. Prefiks EVEX zawiera dodatkowe pola do wybrania długości wektora 512-bitowego i innych opcji specyficznych dla instrukcji AVX-512.
Ponieważ niektóre instrukcje AVX mogą być kodowane na maksymalnie trzy różne sposoby, istnieją reguły umożliwiające wybranie formularza do użycia. Dyrektywa OPTION AVXENCODING
służy do wybierania zestawu reguł do użycia.
Preferencje
Preferencja | Priorytet preferencji kodowania |
---|---|
PREFER_FIRST |
Jeśli to możliwe, użyj pierwszego zdefiniowanego formularza. |
PREFER_VEX |
Użyj VEX kodowania w preferencjach do EVEX kodowania. |
PREFER_VEX3 |
Użyj kodowania 3-bajtowego VEX w preferencjach do EVEX kodowania. |
PREFER_EVEX |
Użyj EVEX kodowania w preferencjach do VEX kodowania. |
NO_EVEX |
Nie koduj przy użyciu polecenia EVEX . |
Kolejność AVXENCODING ma zastosowanie tylko wtedy, gdy dla instrukcji nie określono formularza prefiksu instrukcji. Jeśli prefiks instrukcji jest jawnie zakodowany, ma pierwszeństwo przed opcją AVXENCODING
. Na przykład evex vpmaddwd
użyje EVEX
parametru -prefiks, VPMADDWD
nawet jeśli OPTION AVXENCODING:no_EVEX
zostanie określony.
Jeśli źródło zestawu nie służy OPTION AVXENCODING
do wybierania preferencji kodowania, PREFER_FIRST
reguły są używane domyślnie. Zgodnie z tymi regułami pierwszeństwo mają najwcześniejsze kodowania instrukcji dodane do programu Microsoft Macro Assembler (MASM), a wśród tych możliwości preferowane jest kodowanie z najkrótszym formularzem prefiksu. Te reguły zapewniają, że kod złożony przez program MASM nadal generuje ten sam kod obiektu, jeśli nowe formularze instrukcji zostaną dodane później.
Reguły PREFER_VEX
zawsze próbują zakodować prefiks przed próbą VEX
zakodowania za pomocą polecenia EVEX
. Jeśli to możliwe, 2-bajtowa forma VEX
jest używana zamiast formularza 3-bajtowego.
Preferencja PREFER_VEX3
zawsze próbuje zakodować za pomocą prefiksu 3-bajtowego VEX
przed próbą zakodowania za pomocą polecenia EVEX
. Nie będzie używana forma 2-bajtowa VEX
.
Opcja PREFER_EVEX
zawsze próbuje zakodować prefiks EVEX
i próbuje użyć VEX
tylko wtedy, gdy instrukcja nie ma formularza AVX-512.
Preferencja NO_EVEX
próbuje kodować tylko przy użyciu prefiksu VEX
. Formularze instrukcji AVX-512 nie są dozwolone. Ta opcja umożliwia zebranie kodu do użycia na platformach, na których w ogóle nie ma obsługi avX-512.
Dyrektywa OPTION AVXENCODING
jest dostępna w programie Visual Studio 2019 w wersji 16.7 lub nowszej.
Przykład
W tym przykładzie użyto VPDPBUSD
instrukcji i VPMADDWD
pokazano, jak AVXENCODING
działa opcja. VPDPBUSD
po raz pierwszy zdefiniowano kodowanie tylko z elementem EVEX
, a później rozszerzono go o formularz zakodowany w formacie VEX dla platform bez obsługi AVX-512, a został VPMADDWD
rozszerzony na AVX-512. Wyświetlenie listy danych wyjściowych z zestawu przykładu pokazuje, jak zmiana AVXENCODING
trybu wpływa na kod obiektu wygenerowany dla każdej instrukcji. Prefiks dla każdej instrukcji kończy się na "/".
00000000 62 F2 6D 08/ 50 vpdpbusd xmm1, xmm2, xmm3
CB
00000006 C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:no_EVEX
0000000A C4 E2 69/ 50 CB vpdpbusd xmm1, xmm2, xmm3
0000000F C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:prefer_VEX
00000013 C4 E2 69/ 50 CB vpdpbusd xmm1, xmm2, xmm3
00000018 C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:prefer_VEX3
0000001C C4 E2 69/ 50 CB vpdpbusd xmm1, xmm2, xmm3
00000021 C4 E1 69/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:prefer_EVEX
00000026 62 F2 6D 08/ 50 vpdpbusd xmm1, xmm2, xmm3
CB
0000002C 62 F1 6D 08/ F5 vpmaddwd xmm1, xmm2, xmm3
CB
option avxencoding:prefer_first
00000032 62 F2 6D 08/ 50 vpdpbusd xmm1, xmm2, xmm3
CB
00000038 C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3