Az XOP (az angol nyelven eXtended Operations - extended operations [1] ) az x86 / AMD64 utasításkészlet kiterjesztése , amelyet az AMD Corporation 2009. május 1-jén jelentett be.
Ez a 128 bites SSE utasításokban megvalósított ötletek kiterjesztése és fejlesztése x86 / x86-64 architektúrákban . Az AMD Bulldozer mikroprocesszoros mikroarchitektúrától kezdődően valósították meg (2011. október 12.). [2] Nem támogatott AMD processzorokon a Zen mikroarchitektúra óta (Ryzen, EPIC; 2017) [3] .
Az XOP utasításkészlet számos különböző típusú vektoros utasítást tartalmaz, mivel eredetileg az SSE fő frissítéseként készült . Az utasítások többsége egész szám, de a készlet tartalmaz utasításokat a lebegőpontos számok permutálására és a tört rész kinyerésére is.
Az XOP néhány eredetileg SSE5 -höz tervezett ötlet átdolgozása . A készletet úgy módosították, hogy AVX -szerűbb legyen , miközben nem duplikálja az utasításokat. Az AVX-szel átfedő utasításokat eltávolítottuk, vagy külön bővítményekre helyezték át, például az FMA4 -re ( lebegőpontos vektoros szorzás-összeadás ) és a CVT16 -ra ( félpontos konverziók , az Intel F16C-ként valósítja meg). [egy]
Minden SSE5 utasítás, amelyhez analóg vagy azzal egyenértékű volt az AVX és FMA3 készletekben , az Intel által javasolt kódolást használja. Az AVX-ben ekvivalens nélküli egész számú utasítások XOP-kiterjesztésnek minősülnek. [1] Az XOP utasítások 0x8F ( hexadecimális érték) bájttól kezdődő műveleti kódokkal vannak kódolva, de egyébként az AVX -hez közel azonos kódolási sémát használnak 3 bájtos VEX előtaggal.
Egyes szakértők (Agner Fog) [4] ezt annak a jelének tekintették, hogy az Intel nem engedte meg az AMD-nek, hogy a nagy VEX kódtér egyetlen részét sem használja. Az AMD valószínűleg különböző kódok használatára kényszerült, hogy elkerülje az Intel által a jövőben esetlegesen használt kombinációkat. Az XOP kódolási séma a lehető legközelebb áll a VEX-hez, de kiküszöböli az átfedés kockázatát a jövőbeli Intel opkódokkal.
A 8F bájt használatához az m-bitnek (lásd a VEX kódolási sémát) nagyobbnak vagy egyenlőnek kell lennie 8-nál, hogy elkerüljük az aktuálisan meghatározott utasításokkal való interferenciát. A VEX sémában használt 0xC4 bájtnak nincs ilyen korlátozása. Emiatt az m-bitek más célokra való felhasználása a jövőben az XOP sémában nehézkes lehet (a VEX-nek nincs korlátozása az m-bitekre). Egy másik lehetséges probléma, hogy az XOP-ban a pp bitek mindig 00-ra, míg a VEX-ben 01-re vannak állítva, jelezve, hogy az utasításnak nincs elavult megfelelője. Ez megnehezítheti a pp bitek más célokra való felhasználását a jövőben.
Hasonló kompatibilitási probléma az FMA3 és FMA4 kiterjesztések megvalósítása közötti különbség . Az Intel eredetileg az FMA4 kiterjesztést az AVX/FMA 3-as verziójának részeként javasolta az AMD által az SSE5-ben javasolt 3 operandusos FMA-változat helyettesítésére. Miután az AMD bevezette az FMA4-et, az Intel elhagyta az FMA4-et, és az AVX/FMA specifikáció 5. verziójában visszatért az FMA3-ra. [1] [5] [6]
2015 márciusában az AMD a GNU Binutils csomag javításának leírásában közölte, hogy a Zen , az x86-64 architektúra harmadik generációja, első kiadásában (znver1 – Zen, 1. verzió) nem támogatja a TBM, FMA4, XOP és LWP utasítások, amelyeket kifejezetten a "Bulldozer" mikroarchitektúra család számára fejlesztett ki. [7] [8]
Ezek az utasítások az FMA utasításkészletek egész számú megfelelői . Mind a négy operandus utasítás, hasonlóan az FMA4-hez, és mindegyik előjeles egész számokkal működik.
Utasítás | Leírás [9] | Művelet |
---|---|---|
VPMACSWW
VPMACSSWW |
Szorozza a felhalmozást (telítettséggel) szóról szóra | 2x8 szó (a0-a7, b0-b7) + 8 szó (c0-c7) → 4 szó (r0-r7)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSWD
VPMACSSWD |
Gyűjtsük össze (telítettséggel) az alacsony szót duplaszóra | 2x8 szó (a0-a7, b0-b7) + 4 kettős szó (c0-c3) → 4 kettős szó (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, . [2] |
VPMACSDD
VPMACSSDD |
A Felhalmozás (telítettséggel) szorzása Doubleword duplaszóvá | 2x4 duplaszó (a0-a3, b0-b3) + 4 kettős szó (c0-c3) → 4 kettős szó (r0-r3)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSDQL
VPMACSSDQL |
Szorzás Akkumuláció (telítettséggel) Low Doubleword to Quadword | 2x4 kettős szó (a0-a3, b0-b3) + 2 négyes szó (c0-c1) → 2 négyes szó (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
VPMACSSDQH |
Szorozza fel a Felhalmozás (telítettséggel) magas duplaszót négyszóra | 2x4 kettős szó (a0-a3, b0-b3) + 2 négyes szó (c0-c1) → 2 négyes szó (r0-r3)
r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
VPMADCSSWD |
Szorozza össze a Felhalmozási (telítettséggel) szót a Doubleword-hez | 2x8 szó (a0-a7, b0-b7) + 4 kettős szó (c0-c3) → 4 kettős szó (r0-r3)
r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, .. |
A vízszintes összegző utasítások hozzáadják a bemeneti vektor szomszédos értékeit egymáshoz. Az alábbi utasítások kimeneti mérete határozza meg, hogy milyen szélességűek legyenek az összegzési műveletek. Például egy vízszintes bájt-szó összeg egyszerre két bájtot ad hozzá, és az eredményt szavak vektoraként adja vissza; A "byte to quadword" egy lépésben nyolc bájtot ad össze, és az eredményt négyszavas vektorként adja vissza. Hat további vízszintes összeadási és kivonási műveletet valósítottak meg az SSSE3 -ban , de ezek csak két bemeneti vektoron működnek, és két-két műveletet hajtanak végre.
Utasítás | Leírás [9] | Művelet |
---|---|---|
VPHADDBW
VPHADDUBW |
Vízszintes két előjeles/előjel nélküli bájt hozzáadása a word-hez | 16 bájt (a0-a15) → 8 szó (r0-r7)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDBD
VPHADDUBD |
Vízszintes négy előjeles/előjel nélküli bájt hozzáadása a duplaszóhoz | 16 bájt (a0-a15) → 4 duplaszó (r0-r3)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7, … |
VPHADDBQ
VPHADDUBQ |
Vízszintes nyolc előjeles/előjel nélküli bájt hozzáadása a négyszóhoz | 16 bájt (a0-a15) → 2 négyes (r0-r1)
r0 = a0+a1+a2+a3+a4+a5+a6+a7, … |
VPHADDWD
VPHADDUWD |
Vízszintes két előjeles/előjel nélküli szó hozzáadása a duplaszóhoz | 8 szó (a0-a7) → 4 kettős szó (r0-r3)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDWQ
VPHADDUWQ |
Vízszintes Adjon hozzá négy előjeles/előjel nélküli szót a négyszóhoz | 8 szó (a0-a7) → 2 négyes (r0-r1)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7 |
VPHADDDQ
VPHADDUDQ |
Vízszintes két előjeles/előjel nélküli kettős szó hozzáadása a négyszóhoz | 4 kettős szó (a0-a3) → 2 négyszó (r0-r1)
r0 = a0+a1, r1 = a2+a3 |
VPHSUBBW | Vízszintes vonjon ki két előjeles bájtot a szóból | 16 bájt (a0-a15) → 8 szó (r0-r7)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBWD | Vízszintes vonjon ki két előjeles szót duplaszóvá | 8 szó (a0-a7) → 4 kettős szó (r0-r3)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBDQ | Vízszintes két előjeles duplaszó kivonása négyszóvá | 4 kettős szó (a0-a3) → 2 négyszó (r0-r1)
r0 = a0-a1, r1 = a2-a3 |
Ez a vektorutasításkészlet a kódolás közvetlen mezőjét használja további argumentumként, amely meghatározza, hogy melyik összehasonlítást kell végrehajtani. Minden utasításhoz nyolc összehasonlítás lehetséges. A vektorokat összehasonlítja, és minden igaz összehasonlítás a megfelelő célregiszter összes bitjét 1-re állítja, a hamis összehasonlítások pedig 0-ra állítják a biteket. Ez az eredmény közvetlenül felhasználható a VPCMOV utasításban, egy vektorizált feltételes mozgásban.
Utasítás | Leírás [9] | azonnali | Összehasonlítás | |
---|---|---|---|---|
VPCOMB | Hasonlítsa össze a vektor aláírt bájtokat | 000 | Kevésbé | |
VPCOMW | Hasonlítsa össze a vektoros jelű szavakat | 001 | Kisebb vagy egyenlő | |
VPCOMD | Hasonlítsa össze a vektoros jelű duplaszavakat | 010 | Több | |
VPCOMQ | Hasonlítsa össze a Vector Signed Quadd | 011 | Nagyobb vagy egyenlő | |
VPCOMUB | Hasonlítsa össze a vektor előjel nélküli bájtjait | 100 | Egyenlőek | |
VPCOMUW | Hasonlítsa össze a vektoros előjel nélküli szavakat | 101 | Nem egyenlő | |
VPCOMUD | Hasonlítsa össze a vektoros előjel nélküli duplaszavakat | 110 | Mindig hamis | |
VPCOMUQ | Hasonlítsa össze a Vector Unsigned Quadokat | 111 | Mindig igaz |
A VPCMOV úgy működik, mint az SSE4 keverési utasítások bitenkénti változata . A kiválasztó operandusban minden 1-gyel egyenlő bithez válassza ki az eredménybitet az első forrásból, ha a szelektorban lévő bit 0, válassza ki a második forrásból származó eredménybitet. Ha vektor-összehasonlítási műveletekkel együtt használjuk, az XOP lehetővé teszi egy vektor hármas operátor megvalósítását, vagy ha a célregiszter a második argumentum, akkor egy vektorfeltételes mozgást ( CMOV ).
Utasítás | Leírás [9] |
---|---|
VPCMOV | Vektor feltételes mozgás |
A Shift utasítások abban különböznek az SSE2 utasításkészletben lévőktől , hogy az egyes elemeket eltérő számú bittel tudják eltolni a vektorregiszterből származó előjeles egész számok használatával. A jel az eltolás vagy a fordulás irányát jelzi, a balra eltolás pozitív és a jobbra eltolás negatív értékeit [10] Az Intel eltérő, inkompatibilis vektoreltolási és fordulási változókat vezetett be az AVX2-ben. [tizenegy]
Utasítás | Leírás [9] |
---|---|
VPROTB | Csomagolt Rotate Byte |
VPROTW | Csomagolt Forgatás szavak |
VPROTD | Csomagolt Rotate Doublewords |
VPROTQ | Csomagolt Rotate Quadwords |
VPSHAB | Csomagolt Shift aritmetikai bájtok |
VPSHAW | Csomagolt Shift aritmetikai szavak |
VPSHAD | Csomagolt Shift aritmetikai duplaszavak |
VPSHAQ | Csomagolt Shift Aritmetikai Quadwords |
VPSHLB | Csomagolt Shift logikai bájtok |
VPSHLW | Csomagolt Shift logikai szavak |
VPSHLD | Csomagolt Shift Logikai Doublewords |
VPSHLQ | Csomagolt Shift Logikai Quadwords |
A VPPERM egyetlen utasítás, amely egyesíti és kiterjeszti az SSSE3 PALIGNR és PSHUFB utasításait . Vannak, akik az AltiVec VPERM utasításhoz hasonlítják. [12] Három regiszter szükséges bemenetként: két forrás és egy szelektor (harmadik). A szelektor minden bájtja kiválasztja a két forrás egyikének bájtját, hogy a kimeneti regiszterbe írjon. A szelektor kiválaszthat egy nulla bájtot, megfordíthatja a bitek sorrendjét, megismételheti a legjelentősebb bitet. Ezenkívül minden effekt vagy bemenet megfordítható.
A VPPERMIL2PD és VPPERMIL2PS utasítások az AVX készlet VPERMILPD és VPERMILPS utasításainak kétoperandusos változatai . A VPPERM-hez hasonlóan a két bemeneti regiszter bármelyik mezőjéből kiválaszthatnak egy kimeneti értéket.
Utasítás | Leírás [9] |
---|---|
VPPERM | Csomagolt Permute Byte |
VPPERMIL2PD | Permute kétforrású dupla pontosságú lebegőpontos |
VPPERMIL2PS | Permute kétforrású egypontos lebegőpontos |
Ezek az utasítások a tört részt kivonják a csomagolt lebegőpontos számokból. A számnak egy ilyen része elveszhet, amikor egész számmá konvertálja őket.
Utasítás | Leírás [9] |
---|---|
VFRCZPD | Kivonat frakció csomagolt dupla pontosságú lebegőpontos |
VFRCZPS | Kivonat frakció csomagolt egypontos lebegőpontos |
VFRCZSD | Kivonat tört skalár dupla pontosságú lebegőpontos |
VFRCZSS | Kivonat tört skalár, egypontos lebegőpontos |
x86 processzor utasításkészletek | |
---|---|
Intel | |
AMD | |
Cyrix |