XOP (z angličtiny eXtended Operations - rozšířené operace [1] ) je rozšíření instrukční sady x86 / AMD64 , oznámené společností AMD Corporation dne 1. května 2009.
Jedná se o rozšíření a rozvoj myšlenek implementovaných do 128bitových instrukcí SSE v architekturách x86 / x86-64 . Implementováno počínaje mikroarchitekturou mikroprocesoru AMD Bulldozer (12. října 2011). [2] Není podporováno na procesorech AMD od mikroarchitektury Zen (Ryzen, EPIC; 2017) [3] .
Instrukční sada XOP obsahuje několik různých typů vektorových instrukcí, protože byla původně koncipována jako hlavní aktualizace SSE . Většina instrukcí je celočíselná, ale sada obsahuje také instrukce pro permutaci čísel s pohyblivou řádovou čárkou a instrukce pro extrakci zlomkové části.
XOP je přepracováním některých nápadů původně zamýšlených pro SSE5 . Sada byla upravena tak, aby byla více podobná AVX , aniž by duplikovala instrukce. Instrukce, které se překrývají s AVX, byly odstraněny nebo přesunuty do samostatných rozšíření, jako je FMA4 ( s plovoucí desetinnou čárkou vektor multiply-add ) a CVT16 ( převody s poloviční přesností , implementované společností Intel jako F16C). [jeden]
Všechny instrukce SSE5, pro které existoval analog nebo ekvivalent v sadách AVX a FMA3 , používají kódování navržená společností Intel. Integer instrukce bez ekvivalentů v AVX byly klasifikovány jako rozšíření XOP. [1] Instrukce XOP jsou kódovány operačními kódy začínajícími na byte 0x8F ( hexadecimální hodnota), ale jinak používají schéma kódování téměř identické s AVX s 3bajtovou předponou VEX.
Někteří experti (Agner Fog) [4] to brali jako znamení, že Intel nedovolil AMD využít žádnou část velkého kódového prostoru VEX. AMD bylo pravděpodobně nuceno používat různé kódy, aby se vyhnulo jakékoli kombinaci, kterou by Intel mohl v budoucnu použít. Schéma kódování XOP je co nejblíže VEX, ale eliminuje riziko překrývání s budoucími operačními kódy Intel.
Použití bajtu 8F vyžaduje, aby m-bit (viz schéma kódování VEX) byl větší nebo roven 8, aby se zabránilo interferenci s aktuálně definovanými instrukcemi. Bajt 0xC4 použitý ve schématu VEX nemá žádné takové omezení. Z tohoto důvodu může být použití m-bitů pro jiné účely v budoucnu ve schématu XOP obtížné (VEX nemá žádná omezení na m-bity). Dalším možným problémem je, že bity pp v XOP jsou vždy nastaveny na 00, zatímco ve VEX jsou nastaveny na 01, což znamená, že instrukce nemá žádné zastaralé ekvivalenty. To může v budoucnu ztížit použití bitů pp pro jiné účely.
Podobným problémem s kompatibilitou je rozdíl mezi implementacemi rozšíření FMA3 a FMA4 . Intel původně navrhoval rozšíření FMA4 jako součást specifikace AVX/FMA verze 3, aby nahradilo variantu FMA se 3 operandy navrženou AMD v SSE5. Poté, co AMD implementovalo FMA4, Intel opustil FMA4 a vrátil se k FMA3 ve verzi 5 specifikace AVX/FMA. [1] [5] [6]
V březnu 2015 AMD v popisu opravy pro balíček GNU Binutils odhalilo, že Zen , třetí generace architektury x86-64, ve svém prvním vydání (znver1 - Zen, verze 1), nebude podporovat TBM, FMA4, XOP a Instrukce LWP vyvinuté speciálně pro rodinu mikroarchitektur "Bulldozer". [7] [8]
Tyto instrukce jsou celočíselným ekvivalentem instrukčních sad FMA . Jsou to všechny čtyři instrukce operandu, podobné FMA4, a všechny fungují na celých číslech se znaménkem.
Návod | Popis [9] | Úkon |
---|---|---|
VPMACSWW
VPMACSSWW |
Násobit Akumulovat (s nasycením) Word to Word | 2x8 slov (a0-a7, b0-b7) + 8 slov (c0-c7) → 4 slova (r0-r7)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSWD
VPMACSSWD |
Násobit akumulovat (s nasycením) Low Word to Doubleword | 2x8 slov (a0-a7, b0-b7) + 4 dvojitá slova (c0-c3) → 4 dvojitá slova (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, . [2] |
VPMACSDD
VPMACSSDD |
Násobit akumulovat (s nasycením) Doubleword to Doubleword | 2x4 dvojslova (a0-a3, b0-b3) + 4 dvojslova (c0-c3) → 4 dvojslova (r0-r3)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSDQL
VPMACSSDQL |
Násobit akumulovat (se saturací) Nízké Doubleword to Quadword | 2x4 dvojslova (a0-a3, b0-b3) + 2 čtyřslova (c0-c1) → 2 čtyřslova (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
VPMACSSDQH |
Násobit akumulovat (se saturací) High Doubleword to Quadword | 2x4 dvojslova (a0-a3, b0-b3) + 2 čtyřslova (c0-c1) → 2 čtyřslova (r0-r3)
r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
VPMADCSSWD |
Násobit Přidat akumulovat (s nasycením) Word do Doubleword | 2x8 slov (a0-a7, b0-b7) + 4 dvojitá slova (c0-c3) → 4 dvojitá slova (r0-r3)
r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, .. |
Instrukce vodorovného součtu k sobě přidávají sousední hodnoty vstupního vektoru. Velikost výstupu v níže uvedených pokynech určuje, jak široké by měly být operace součtu. Například horizontální součet bajtů za slovem přidá dva bajty najednou a vrátí výsledek jako vektor slov; "byte to quadword" přidá osm bajtů dohromady v jednom kroku a vrátí výsledek jako vektor čtyř slov. Šest dalších horizontálních operací sčítání a odčítání bylo implementováno v SSSE3 , ale fungují pouze na dvou vstupních vektorech a každý provádí dvě operace.
Návod | Popis [9] | Úkon |
---|---|---|
VPHADDBW
VPHADDUBW |
Horizontálně přidat dva podepsané/nepodepsané bajty do wordu | 16 bajtů (a0-a15) → 8 slov (r0-r7)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDBD
VPHADDUBD |
Horizontálně přidat čtyři podepsané/nepodepsané bajty do doubleword | 16 bajtů (a0-a15) → 4 dvojitá slova (r0-r3)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7, … |
VPHADDBQ
VPHADDUBQ |
Horizontálně přidat osm podepsaných/nepodepsaných bajtů do quadword | 16 bajtů (a0-a15) → 2 čtveřice (r0-r1)
r0 = a0+a1+a2+a3+a4+a5+a6+a7, … |
VPHADDWD
VPHADDUWD |
Horizontálně přidat dvě podepsané/nepodepsané slova do doubleword | 8 slov (a0-a7) → 4 dvojitá slova (r0-r3)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDWQ
VPHADDUWQ |
Horizontální přidání čtyř podepsaných/nepodepsaných slov do quadword | 8 slov (a0-a7) → 2 čtyřsloví (r0-r1)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7 |
VPHADDDQ
VPHADDUDQ |
Vodorovně přidat dvě podepsané/nepodepsané dvojslova do čtyřslova | 4 dvojslova (a0-a3) → 2 čtyřslova (r0-r1)
r0 = a0+a1, r1 = a2+a3 |
VPHSUBBW | Horizontálně odečte dva bajty se znaménkem do wordu | 16 bajtů (a0-a15) → 8 slov (r0-r7)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBWD | Vodorovně odečtěte dvě podepsaná slova do dvojslovu | 8 slov (a0-a7) → 4 dvojitá slova (r0-r3)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBDQ | Vodorovně odečtěte dvě podepsaná dvojslova ke čtyřslovům | 4 dvojslova (a0-a3) → 2 čtyřslova (r0-r1)
r0 = a0-a1, r1 = a2-a3 |
Tato sada vektorových instrukcí používá bezprostřední pole kódování jako další argument, který určuje, které srovnání se má provést. Pro každou instrukci existuje osm možných srovnání. Vektory jsou porovnány a všechna srovnání, která jsou pravdivá, nastaví všechny bity v odpovídajícím cílovém registru na 1 a falešná porovnání nastaví bity na 0. Tento výsledek lze přímo použít v instrukci VPCMOV, vektorizovaném podmíněném pohybu.
Návod | Popis [9] | bezprostřední | Srovnání | |
---|---|---|---|---|
VPCOMB | Porovnejte vektorové bajty se znaménkem | 000 | Méně | |
VPCOMW | Porovnejte vektorová podepsaná slova | 001 | Méně nebo stejně | |
VPCOMD | Porovnejte vektorově podepsaná dvojitá slova | 010 | Více | |
VPCOMQ | Porovnejte vektorové čtyřsloví podepsané | 011 | Větší nebo rovno | |
VPCOMUB | Porovnejte vektorové bajty bez znaménka | 100 | Jsou si rovni | |
VPCOMUW | Porovnejte vektorová nepodepsané slova | 101 | Ne rovné | |
VPCOMUD | Porovnejte vektorová nepodepsané dvojsloví | 110 | Vždy falešné | |
VPCOMUQ | Porovnejte vektorové nepodepsané čtyřčíslí | 111 | Vždy pravda |
VPCMOV funguje jako bitová verze instrukcí pro míchání SSE4 . Pro každý bit v operandu selektoru rovný 1 vyberte výsledný bit z prvního zdroje, pokud je bit v selektoru 0, vyberte výsledný bit z druhého zdroje. Při použití ve spojení s operacemi vektorového porovnávání vám XOP umožňuje implementovat vektorový ternární operátor, nebo, pokud je cílový registr druhým argumentem, vektorový podmíněný pohyb ( CMOV ).
Návod | Popis [9] |
---|---|
VPCMOV | Vektor podmíněný pohyb |
Instrukce posunu se liší od instrukcí v instrukční sadě SSE2 v tom, že mohou posunout každý prvek o jiný počet bitů pomocí zabalených celých čísel se znaménkem z vektorového registru. Znak označuje směr posunu nebo otočení, kladné hodnoty pro posun doleva a záporné hodnoty pro posun vpravo [10] Intel implementoval jinou, nekompatibilní sadu proměnných vektorového posunu a otočení v AVX2. [jedenáct]
Návod | Popis [9] |
---|---|
VPROTB | Sbalené rotace bajtů |
VPROTW | Balené střídat slova |
VPROTD | Packed Rotate Doublewords |
VPROTQ | Packed Rotate Quadwords |
VPSHAB | Sbalené aritmetické bajty posunu |
VPSHAW | Zabalená směna aritmetická slova |
VPSHAD | Nabitá aritmetická dvojslova posunu |
VPSHAQ | Aritmetické čtyřkolky na směny |
VPSHLB | Sbalené logické bajty Shift |
VPSHLW | Logická slova nabité směny |
VPSHLD | Nabitá logická dvojslova Shift |
VPSHLQ | Balená směna logických čtyřslov |
VPERM je jediná instrukce, která kombinuje a rozšiřuje instrukce PALIGNR a PSHUFB z SSSE3 . Někteří to přirovnávají k instrukci AltiVec VPERM. [12] Jako vstup používá tři registry: dva zdroje a selektor (třetí). Každý bajt ve selektoru vybírá jeden z bajtů v jednom ze dvou zdrojů, který se má zapsat do výstupního registru. Selektor může zvolit nulový bajt, obrátit pořadí bitů, opakovat nejvýznamnější bit. Všechny efekty nebo vstupy lze dodatečně invertovat.
Instrukce VPERMIL2PD a VPERMIL2PS jsou dvouoperandové verze instrukcí VPERMILPD a VPERMILPS ze sady AVX . Stejně jako VPERM si mohou vybrat výstupní hodnotu z libovolných polí dvou vstupních registrů.
Návod | Popis [9] |
---|---|
VPPERM | Packed Permute Byte |
VPPERMIL2PD | Permute dvouzdrojový s dvojitou přesností s plovoucí desetinnou čárkou |
VPPERMIL2PS | Permute dvouzdrojový s jednou přesností s plovoucí desetinnou čárkou |
Tyto instrukce extrahují zlomkovou část ze zabalených čísel s pohyblivou řádovou čárkou. Taková část čísla se může při převodu na celé číslo ztratit.
Návod | Popis [9] |
---|---|
VFRCZPD | Extrahovaná frakce s plovoucí desetinnou čárkou s dvojitou přesností |
VFRCZPS | Extrahovaná frakce s plovoucí desetinnou čárkou s jednoduchou přesností |
VFRCZSD | Extrahujte zlomek skalární s dvojitou přesností s plovoucí desetinnou čárkou |
VFRCZSS | Extrahujte zlomek skalární s jednoduchou přesností s plovoucí desetinnou čárkou |
instrukční sady procesoru x86 | |
---|---|
Intel | |
AMD | |
Cyrix |