Předpona VEX - VEX prefix
VEX prefix (od „vektorových rozšíření“) a VEX kódovací schéma se zahrnuje prodloužení na x86 a x86-64 instrukční sady architektury pro mikroprocesory od společnosti Intel , AMD a jiní.
Funkce
Schéma kódování VEX umožňuje definici nových instrukcí a rozšíření nebo úpravu dříve existujících instrukčních kódů . To slouží k následujícím účelům:
- Opcode mapa je rozšířen, aby prostor pro budoucí pokyny.
- Umožňuje kódům instrukcí mít až čtyři operandy (plus okamžité), kde původní schéma umožňuje pouze dva operandy (plus okamžité).
- To umožňuje velikost SIMD vektorových registrů , které mají být rozšířena z 128- bity XMM registrů 256-bitových registrů pojmenované YMM. Je zde prostor pro další rozšíření velikosti registru.
- Umožňuje stávající instrukce se dvěma operandy upravit na nedestruktivní formy se třemi operandy, kde se cílový registr liší od obou zdrojových registrů. Například c = a + b místo a = a + b (kde registr a je změněn instrukcí).
Předpona VEX nahrazuje nejčastěji používané bajty předpony instrukcí a únikové kódy . V mnoha případech je počet bajtů předpony a únikových bajtů, které jsou nahrazeny, stejný jako počet bajtů v předponě VEX, takže celková délka instrukce kódované VEX je stejná jako délka staršího kódu instrukce . V ostatních případech je verze kódovaná VEX delší nebo kratší než starší kód. V 32bitovém režimu mají instrukce kódované VEX přístup pouze k prvním 8 registrům YMM/XMM; kódování pro ostatní registry by bylo interpretováno jako starší instrukce LDS a LES, které nejsou podporovány v 64bitovém režimu.
Dvoubajtová předpona VEX obsahuje následující komponenty:
- Bit R̅, podobný bitu předpony REX.R použitému v rozšíření sady instrukcí x86-64 .
- Čtyři bity pojmenované v̅, určující druhý operand zdrojového registru.
- Bit s názvem L udávající 256bitovou délku vektoru.
- Dva bity s názvem p, které nahradí předpony velikosti operandu a předpony typu operandu (66, F2, F3).
Tříbajtová předpona VEX navíc obsahuje:
- Tři bity, X̅; B̅; a W, také podobné odpovídajícím bitům v předponě REX.
- Pět bitů pojmenovaných m. Dva z m bitů se používají k nahrazení stávajících únikových kódů a k určení délky instrukce. Zbývající tři m bity jsou vyhrazeny pro budoucí použití, jako je zadávání délek vektorů> 256 bitů, zadávání různých délek instrukcí nebo rozšiřování prostoru operačního kódu; od roku 2013 se však Intel rozhodl zavést nové schéma kódování, předponu EVEX , namísto rozšiřování zbývajících m bitů.
Technický popis
| # bajtů | 0,2,3 | 1 | 1 | 0,1 | 0,1,2,4 | 0,1 |
|---|---|---|---|---|---|---|
| [Předpony] | [VEX] | OPCODE | ModR/M | [SIB] | [DISP] | [IMM] |
Schéma kódování VEX používá předponu kódu skládající se ze dvou nebo tří bajtů , která je přidána ke stávajícím nebo novým instrukčním kódům .
V architektuře x86 mohou instrukce s operandem paměti používat bajt ModR/M, který určuje režim adresování. Tento bajt má tři bitová pole:
- mod , bits [7: 6] - v kombinaci s polem r/m kóduje buď 8 registrů, nebo 24 režimů adresování. U některých pokynů také kóduje informace o operačním kódu.
- reg/opcode , bity [5: 3] - v závislosti na primárním bajtu operačního kódu určuje buď registr, nebo další tři bity informací o operačním kódu.
- r/m , bity [2: 0] - může specifikovat registr jako operand nebo kombinovat s modovým polem pro kódování režimu adresování.
Formy indexu plus-index a scale-plus-index 32bitového adresování (kódované r/m = 100 a mod <> 11) vyžadují další adresovací bajt, bajt SIB. Má následující pole:
- faktor měřítka , kódovaný bity [7: 6]
- indexový registr, bity [5: 3]
- základní registr, bity [2: 0].
Aby bylo možné používat 64bitové adresování a další registry přítomné v architektuře x86-64, byla zavedena předpona REX, která poskytuje další prostor pro režimy kódování adresování. Bitové pole W mění velikost operandu na 64 bitů, R rozšiřuje reg na 4 bity, B rozšiřuje r/m (nebo opreg v několika operačních kódech, jako je „POP reg“, které kódují číslo registru ve svých 3 nejnižších bitech opcode) a X a B rozšiřují index a základnu v bajtu SIB. Předpona REX je však kódována poměrně neefektivně a ztrácí polovinu ze svých 8 bitů.
| REX | ||||||||
|---|---|---|---|---|---|---|---|---|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| Byte 0 | 0 | 1 | 0 | 0 | W | R. | X | B |
| 3-bajtový VEX | ||||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| Byte 0 (C4h) | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| Byte 1 | R̅ | X | B̅ | m 4 | m 3 | m 2 | m 1 | m 0 |
| Byte 2 | W | v̅ 3 | v̅ 2 | v̅ 1 | v̅ 0 | L | p 1 | p 0 |
| 2bajtový VEX | ||||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| Byte 0 (C5h) | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
| Byte 1 | R̅ | v̅ 3 | v̅ 2 | v̅ 1 | v̅ 0 | L | p 1 | p 0 |
Předpona VEX poskytuje kompaktní reprezentaci předpony REX a různých dalších předpon pro rozšíření režimu adresování, výčtu registrů a velikosti a šířky operandu:
- Bity R̅, X̅ a B̅ jsou inverzí bitů R, X a B předpony REX; tyto poskytují čtvrtý (vysoký) bit pro pole rejstříku registrů (ModRM reg, SIB index a ModRM r/m; základna SIB; resp. pole opcode reg) umožňující přístup k 16 namísto 8 registrů. Bit W je ekvivalentní bitu W předpony REX a určuje 64bitový operand; v případě neceločíselných pokynů jde o obecný bit rozšíření operačního kódu.
- v̅ je inverze dalšího indexu zdrojového registru.
- m nahradí úvodní bajty předpony opcode. Hodnoty 1, 2 a 3 jsou ekvivalentní předponám operačního kódu 0F, 0F 38 a 0F 3A; všechny ostatní hodnoty jsou vyhrazeny. 2bajtová předpona VEX vždy odpovídá předponě 0F.
- L označuje délku vektoru; 0 pro 128bitové registry SSE (XMM) a 1 pro 256bitové registry AVX (YMM).
- p kóduje další bajty předpony. Hodnoty 0, 1, 2 a 3 odpovídají implikovaným předponám none, 66, F3 a F2. Ty kódují typ operandu pro instrukce SSE: zabalený jednotlivý, zabalený dvojitý, skalární jeden a skalární dvojitý.
| Režim adresování | Bit 3 | Bity [2: 0] | Typ registrace | Běžné použití |
|---|---|---|---|---|
| REG | VEX.R | ModRM.reg | Obecný účel, maska, vektor | Zaregistrovat operand |
| RM (pokud ModRM.mod = 11) | VEX.B | ModRM.r/m | GPR, maska, vektor | Zaregistrovat operand |
| RM | VEX.B | ModRM.r/m | GPR | Zaregistrujte adresu paměti |
| ZÁKLADNA | VEX.B | SIB.base | GPR | Base + Index * Měřítko adresy paměti |
| INDEX | VEX.X | SIB.index | GPR | Base + Index * Měřítko adresy paměti |
| VIDX | VEX.X | SIB.index | Vektor | Base + VectorIndex * Měřítko adresy paměti |
| NDS/NDD | VEX.v 3 v 2 v 1 v 0 | GPR, maska, vektor | Zaregistrovat operand | |
| IS4 | Imm8 [7: 4] | Vektor | Zaregistrovat operand | |
Instrukce kódované předponou VEX mohou mít až čtyři variabilní operandy (v registrech nebo paměti) a jeden konstantní operand (okamžitá hodnota). Pokyny, které vyžadují více než tři variabilní operandy, používají k určení operandu 4. registru (IS4 výše) okamžité bity operandu. Maximálně jeden z operandů může být paměťový operand; a nejvýše jeden z operandů může být okamžitá konstanta 4 nebo 8 bitů. Zbývající operandy jsou registry.
Sada instrukcí AVX je první rozšíření sady instrukcí, které používá kódovací schéma VEX. Sada instrukcí AVX používá předponu VEX pouze pro instrukce pomocí registrů SIMD XMM .
Schéma kódování VEX však bylo použito i pro další typy instrukcí při následném rozšíření sady instrukcí. Například BMI představil VEX kódované aritmetické a bitové manipulační instrukce, které fungují na obecných účelových registrech. AVX-512 představil 8 registrů masky a přidal pokyny k jejich manipulaci. Tyto pokyny používají kódování VEX. VEX.R, VEX.B nebo VEX.v3 jsou ignorovány, pokud je pole použito ke kódování registru masky.
Počáteční bajtové hodnoty předpony VEX, C4h a C5h, jsou stejné jako operační kódy instrukcí LDS a LES. Tyto pokyny nejsou v 64bitovém režimu podporovány. Chcete-li vyřešit nejednoznačnost v 32bitovém režimu, specifikace VEX využívá skutečnost, že legální bajt LDS nebo LES ModRM nemůže mít tvar 11xxxxxx (což by určovalo operand registru). Různá bitová pole ve druhém bajtu předpony VEX jsou invertována, aby bylo zajištěno, že bajt je vždy v této podobě v 32bitovém režimu. Podobně jednobajtová forma předpony REX má čtyři bity vysokého řádu nastavené na čtyři, což nahrazuje šestnáct operačních kódů očíslovaných 0x40-0x4F. Dříve byly tyto operační kódy individuálními pokyny INC a DEC pro osm standardních registrů procesorů; Kód x86-64 musí používat pokyny ModR/M INC a DEC.
Starší instrukce SIMD s přidanou předponou VEX jsou ekvivalentní stejným pokynům bez předpony VEX s následujícími rozdíly:
- Instrukce kódovaná VEX může mít ještě jeden operand, takže je nedestruktivní.
- 128bitová instrukce XMM bez předpony VEX ponechává horní polovinu celého 256bitového registru YMM beze změny, zatímco verze kódovaná VEX nastavuje horní polovinu na nulu.
Instrukce, které používají celý 256bitový registr YMM, by z důvodu efektivity neměly být míseny s instrukcemi, které nejsou VEX a které ponechávají horní polovinu registru beze změny.
Dějiny
- V srpnu 2007 AMD navrhlo rozšíření instrukční sady SSE5, které obsahuje nové kódovací schéma pro instrukce se třemi operandy, s použitím dalšího bajtu s názvem DREX určeného pro jádro procesoru Bulldozer , kvůli zahájení výroby v roce 2011.
- V březnu 2008 společnost Intel navrhla instrukční sadu AVX pomocí nového schématu kódování VEX.
- V srpnu 2008 komentátoři odsoudili očekávanou nekompatibilitu mezi instrukčními sadami AMD a Intel a navrhli, aby AMD revidovalo své plány a nahradilo schéma DREX flexibilnějším a rozšiřitelnějším schématem VEX.
- V květnu 2009 AMD oznámila revizi navrhované instrukční sady SSE5, aby byla kompatibilní s instrukční sadou AVX a schématem kódování VEX. Revidovaný SSE5 se nazývá XOP .
- Leden 2011. Instrukční sada AVX je podporována v architektuře mikroprocesorů Sandy Bridge společnosti Intel .
- 2011. V procesoru AMD Bulldozer jsou podporovány instrukční sady AVX , XOP a FMA4 , všechny využívající schéma VEX .
- 2013. Instrukční sada FMA3 je podporována v procesorech Intel Haswell.