XOP (utasításkészlet)

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.

Történelem

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]

Egész vektor szorzás-összeadás

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

Egész szám vektor vízszintes összegzés

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

Egész számú vektor összehasonlítása

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

Vektor feltételes továbbítás

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

Egész számú vektor fordítása és elforgatása

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

Vektor permutáció

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

Lebegőpontos számok tört részének kinyerése

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

Lásd még

Jegyzetek

  1. 1 2 3 4 Dave Christie (2009. 05. 07.), Az egyensúly megteremtése , AMD fejlesztői blogok , < http://developer.amd.com/community/blog/2009/05/06/striking-a-balance/ > . Letöltve: 2013. november 4. Az eredetiből archiválva : 2013. november 9.. 
  2. 1 2 AMD64 architektúra programozói kézikönyv 6. kötet: 128 bites és 256 bites XOP, FMA4 és CVT16 utasítások , AMD , 2009. május 1. , < http://support.amd.com/TechDocs/43479 > Archived date.pdf 2018. augusztus 21-én a Wayback Machine -ben 
  3. [1] 2017. szeptember 14-én archiválva a Wayback Machine -nél "De mivel a Zen egy tiszta lapos kialakítás, a Bulldozer processzorokban néhány utasításkészlet-bővítés található, amelyek nem találhatók meg a Zen/znver1-ben. A már nem jelenlevők közé tartozik az FMA4 és az XOP."
  4. Állítsd meg az utasításkészlet háborúját , Agner Fog, 2009. december 5., < http://www.agner.org/optimize/blog/read.php?i=25 > Archivált : 2022. május 12. a Wayback Machine -nél 
  5. Intel AVX programozási kézikönyv , 2008. március , < http://softwarecommunity.intel.com/isn/downloads/intelavx/Intel-AVX-Programming-Reference-31943302.pdf > . Letöltve: 2012. január 17. Archiválva : 2011. augusztus 7. a Wayback Machine -nél 
  6. Intel Advanced Vector Extensions Programming Reference , 2009. január , < http://software.intel.com/file/10069 > . Letöltve: 2012. január 17. Archiválva : 2012. február 29. a Wayback Machine -nél 
  7. [https://web.archive.org/web/20160304033017/https://sourceware.org/ml/binutils/2015-03/msg00078.html Archiválva : 2016. március 4., a Wayback Machine Gopalasubramanian, G - [PATCH ]znver1 processzor hozzáadása]
  8. [https://web.archive.org/web/20160307134059/https://sourceware.org/ml/binutils/2015-08/msg00039.html Archiválva : 2016. március 7., a Wayback Machine Pawar, Amit - [PATCH ]CpuFMA4 eltávolítása a Znver1 CPU-jelzőkről]
  9. 1 2 3 4 5 6 7 AMD64 architektúra programozói kézikönyv, 4. kötet: 128 bites és 256 bites médiautasítások (PDF). AMD . Letöltve: 2014. január 13. Az eredetiből archiválva : 2021. november 14.
  10. Új "Bulldozer" és "Piledriver" utasítások (PDF). AMD . Letöltve: 2014. január 13. Az eredetiből archiválva : 2013. január 7..
  11. Intel Architecture Instruction Set Extensions Programming Reference (PDF)  (a hivatkozás nem érhető el) . Intel . Hozzáférés dátuma: 2014. január 29. Az eredetiből archiválva : 2014. február 1..
  12. Buldozer x264 optimalizálás (nem elérhető link) . Hozzáférés dátuma: 2014. január 13. Az eredetiből archiválva : 2014. január 15.