XOP (instrukční sada)

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.

Historie

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]

Celé číslo vektorové násobení-sčítání

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, ..

Celočíselná vektorová horizontální sumace

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

Porovnání vektorů celých čísel

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

Vektorové podmíněné předávání

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

Celočíselná vektorová translace a rotace

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

Vektorová permutace

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

Extrakce zlomkové části čísel s pohyblivou řádovou čá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

Viz také

Poznámky

  1. 1 2 3 4 Dave Christie (2009-05-07), Striking a balance , AMD Developer blogs , < http://developer.amd.com/community/blog/2009/05/06/striking-a-balance/ > . Získáno 4. listopadu 2013. Archivováno z originálu 9. listopadu 2013. 
  2. 1 2 AMD64 Architecture Programmer's Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions , AMD , May 1, 2009 , < http://support.amd.com/TechDocs/43479.pdf > Archived date 21. srpna 2018 na Wayback Machine 
  3. [1] Archivováno 14. září 2017 na Wayback Machine "Ale vzhledem k tomu, že Zen je design s čistým listem, existují některá rozšíření instrukční sady nalezená v procesorech Bulldozer, která se nenacházejí v Zen/znver1. Mezi ty, které již nejsou přítomny, patří FMA4 a XOP."
  4. Zastavte válku instrukční sady , Agner Fog, 5. prosince 2009 , < http://www.agner.org/optimize/blog/read.php?i=25 > Archivováno 12. května 2022 na Wayback Machine 
  5. Intel AVX Programming Reference , březen 2008 , < http://softwarecommunity.intel.com/isn/downloads/intelavx/Intel-AVX-Programming-Reference-31943302.pdf > . Získáno 17. ledna 2012. Archivováno 7. srpna 2011 na Wayback Machine 
  6. Intel Advanced Vector Extensions Programming Reference , leden 2009 , < http://software.intel.com/file/10069 > . Získáno 17. ledna 2012. Archivováno 29. února 2012 na Wayback Machine 
  7. [https://web.archive.org/web/20160304033017/https://sourceware.org/ml/binutils/2015-03/msg00078.html Archivováno 4. března 2016 na Wayback Machine Gopalasubramanian, G - [PATCH ]přidat procesor znver1]
  8. [https://web.archive.org/web/20160307134059/https://sourceware.org/ml/binutils/2015-08/msg00039.html Archivováno 7. března 2016 ve Wayback Machine Pawar, Amit - [PATCH ]Odstranit CpuFMA4 z příznaků CPU Znver1]
  9. 1 2 3 4 5 6 7 AMD64 Architecture Programmer's Manual, Volume 4: 128-Bit and 256-Bit Media Instructions (PDF). AMD . Získáno 13. ledna 2014. Archivováno z originálu 14. listopadu 2021.
  10. Nové pokyny pro „buldozer“ a „piledriver“ (PDF). AMD . Získáno 13. ledna 2014. Archivováno z originálu 7. ledna 2013.
  11. Intel Architecture Instruction Set Extensions Programming Reference (PDF)  (odkaz není k dispozici) . Intel . Datum přístupu: 29. ledna 2014. Archivováno z originálu 1. února 2014.
  12. Optimalizace Buldozeru x264 (nedostupný odkaz) . Datum přístupu: 13. ledna 2014. Archivováno z originálu 15. ledna 2014.