XOP (käskysarja)

XOP ( englanniksi  eXtended Operations  - expanded operations [1] ) on x86 / AMD64 - ohjesarjan laajennus , jonka AMD Corporation ilmoitti 1. toukokuuta 2009.

Se on ideoiden laajennus ja kehitystyö, joka on toteutettu 128-bittisissä SSE - käskyissä x86 / x86-64-arkkitehtuureissa . Toteutettu alkaen AMD Bulldozer -mikroprosessorimikroarkkitehtuurista (12. lokakuuta 2011). [2] Ei tueta AMD-prosessoreissa Zen-mikroarkkitehtuurista lähtien (Ryzen, EPIC; 2017) [3] .

XOP-käskyjoukko sisältää useita erityyppisiä vektorikäskyjä, koska se suunniteltiin alun perin SSE: n suureksi päivitykseksi . Suurin osa ohjeista on kokonaislukuja, mutta sarja sisältää myös ohjeet liukulukujen permutointiin sekä ohjeet murto-osan erottamiseen.

Historia

XOP on uudistus joistakin alun perin SSE5 :lle tarkoitetuista ideoista . Sarjaa on muokattu AVX -kaltaisemmaksi , mutta ohjeita ei kopioida. Ohjeet, jotka ovat päällekkäisiä AVX:n kanssa, on poistettu tai siirretty erillisiin laajennuksiin, kuten FMA4 ( liukulukuvektorin kertolasku ) ja CVT16 ( puolitarkkuusmuunnokset , Intel toteuttaa nimellä F16C). [yksi]

Kaikki SSE5-ohjeet, joille oli analoginen tai vastaava AVX- ja FMA3- sarjoissa , käyttävät Intelin ehdottamia koodauksia. Kokonaislukukäskyt , joilla ei ole vastaavia AVX:ssä, on luokiteltu XOP-laajennuksiksi. [1] XOP-käskyt on koodattu opkoodeilla, jotka alkavat tavusta 0x8F ( heksadesimaaliarvo ), mutta muutoin ne käyttävät lähes identtistä koodausmenetelmää AVX :n kanssa 3-tavuisella VEX-etuliitteellä.

Jotkut asiantuntijat (Agner Fog) [4] pitivät tätä merkkinä siitä, että Intel ei sallinut AMD:n käyttää mitään osaa suuresta VEX-koodiavaruudesta. AMD joutui todennäköisesti käyttämään erilaisia ​​koodeja välttääkseen yhdistelmät, joita Intel voisi käyttää tulevaisuudessa. XOP-koodausjärjestelmä on mahdollisimman lähellä VEX:ää, mutta eliminoi päällekkäisyyden riskin tulevien Intelin opkoodien kanssa.

Tavun 8F käyttö edellyttää, että m-bitti (katso VEX-koodausmalli) on suurempi tai yhtä suuri kuin 8, jotta vältytään tällä hetkellä määritettyjen käskyjen häiritsemiseltä. VEX-skeemassa käytetyllä 0xC4-tavulla ei ole tällaista rajoitusta. Tästä johtuen m-bittien käyttö muihin tarkoituksiin tulevaisuudessa XOP-mallissa voi olla vaikeaa (VEX:llä ei ole rajoituksia m-biteille). Toinen mahdollinen ongelma on, että XOP:n pp-bitit asetetaan aina arvoon 00, kun taas VEX:ssä ne on asetettu arvoon 01 osoittamaan, ettei käskyllä ​​ole vanhentuneita vastineita. Tämä voi vaikeuttaa pp-bittien käyttöä muihin tarkoituksiin tulevaisuudessa.

Samanlainen yhteensopivuusongelma on ero FMA3 - ja FMA4 -laajennusten toteutusten välillä . Intel ehdotti alun perin FMA4-laajennusta osana AVX/FMA-version 3 spesifikaatiota korvaamaan AMD:n SSE5:ssä ehdottama 3-operandinen FMA-versio. Kun AMD otti käyttöön FMA4:n, Intel hylkäsi FMA4:n ja palasi FMA3:een AVX/FMA-määrityksen versiossa 5. [1] [5] [6]

Maaliskuussa 2015 AMD paljasti GNU Binutils -paketin korjaustiedoston kuvauksessa, että Zen , x86-64-arkkitehtuurin kolmas sukupolvi, sen ensimmäisessä painoksessa (znver1 - Zen, versio 1) ei tue TBM-, FMA4-, XOP- ja LWP-ohjeet, jotka on kehittänyt erityisesti "Bulldozer"-mikroarkkitehtuuriperheelle. [7] [8]

Kokonaislukuvektorin kertolasku-lisäys

Nämä ohjeet ovat FMA-käskysarjojen kokonaislukuvastineita . Ne ovat kaikki neljä operandikäskyä, jotka ovat samanlaisia ​​kuin FMA4, ja ne kaikki toimivat etumerkillisillä kokonaisluvuilla.

Ohje Kuvaus [9] Operaatio
VPMACSWW

VPMACSSWW

Kerro Kerää (kylläisyyden kanssa) sanasta sanaan 2x8 sanaa (a0-a7, b0-b7) + 8 sanaa (c0-c7) → 4 sanaa (r0-r7)

r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, ..

VPMACSWD

VPMACSSWD

Kerro Kerää (kylläisyyden kanssa) Matala sana kaksoissanaksi 2x8 sanaa (a0-a7, b0-b7) + 4 kaksoissanaa (c0-c3) → 4 kaksoissanaa (r0-r3)

r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, . [2]

VPMACSDD

VPMACSSDD

Kerro Kerää (kylläisyyden kanssa) Doubleword Doublewordiksi 2x4 kaksoissanaa (a0-a3, b0-b3) + 4 kaksoissanaa (c0-c3) → 4 kaksoissanaa (r0-r3)

r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, ..

VPMACSDQL

VPMACSSDQL

Kerro Kerää (kylläisyyden kanssa) Matala Doubleword to Quadword 2x4 kaksoissanaa (a0-a3, b0-b3) + 2 neliosaa (c0-c1) → 2 neliosaa (r0-r3)

r0 = a0 * b0 + c0, r1 = a2 * b2 + c1

VPMACSDQH

VPMACSSDQH

Kerro Kerää (kylläisyyden kanssa) High Doubleword to Quadword 2x4 kaksoissanaa (a0-a3, b0-b3) + 2 neliosaa (c0-c1) → 2 neliosaa (r0-r3)

r0 = a1 * b1 + c0, r1 = a3 * b3 + c1

VPMADCSWD

VPMADCSSWD

Kerro Lisää Kerää (kylläisyyden kanssa) sana Doublewordiin 2x8 sanaa (a0-a7, b0-b7) + 4 kaksoissanaa (c0-c3) → 4 kaksoissanaa (r0-r3)

r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, ..

Kokonaislukuvektori vaakasuora summaus

Vaakasuuntaiset summakäskyt lisäävät vierekkäisiä tulovektorin arvoja toisiinsa. Alla olevien ohjeiden tulosteen koko määrittää, kuinka leveitä summausoperaatioiden tulee olla. Esimerkiksi vaakasuuntainen tavukohtainen summa lisää kaksi tavua kerrallaan ja palauttaa tuloksen sanavektorina; "tavu nelisanaiseksi" lisää kahdeksan tavua yhdessä vaiheessa ja palauttaa tuloksen nelisanaisena vektorina. Kuusi muuta vaakasuuntaista yhteen- ja vähennysoperaatiota toteutettiin SSSE3 :ssa , mutta ne toimivat vain kahdella syöttövektorilla ja suorittavat kumpikin kaksi operaatiota.

Ohje Kuvaus [9] Operaatio
VPHADDBW

VPHADDUBW

Vaakasuora lisää kaksi allekirjoitettua/allekirjoittamatonta tavua sanaan 16 tavua (a0-a15) → 8 sanaa (r0-r7)

r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, …

VPHADDBD

VPHADDUBD

Vaakasuora lisää neljä etumerkittyä/allekirjoittamatonta tavua kaksoissanaan 16 tavua (a0-a15) → 4 kaksoissanaa (r0-r3)

r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7, …

VPHADDBQ

VPHADDUBQ

Vaaka Lisää kahdeksan etumerkittyä/allekirjoittamatonta tavua nelisanaan 16 tavua (a0-a15) → 2 nelinumeroista (r0-r1)

r0 = a0+a1+a2+a3+a4+a5+a6+a7, …

VPHADDWD

VPHADDUWD

Vaakasuuntainen lisää kaksi allekirjoitettua/allekirjoittamatonta sanaa kaksoissanaan 8 sanaa (a0-a7) → 4 kaksoissanaa (r0-r3)

r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, …

VPHADDWQ

VPHADDUWQ

Vaaka Lisää neljä allekirjoitettua/allekirjoittamatonta sanaa quadwordiin 8 sanaa (a0-a7) → 2 nelisanaa (r0-r1)

r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7

VPHADDDQ

VPHADDUDQ

Vaakasuora Lisää kaksi allekirjoitettua/allekirjoittamatonta kaksoissanaa nelisanaan 4 kaksoissanaa (a0-a3) → 2 nelisanaa (r0-r1)

r0 = a0+a1, r1 = a2+a3

VPHSUBBW Vaakasuuntainen vähennä sanasta kaksi etumerkillä varustettua tavua 16 tavua (a0-a15) → 8 sanaa (r0-r7)

r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, …

VPHSUBWD Vaakasuuntainen vähennä kaksi etumerkillistä sanaa kaksoissanaksi 8 sanaa (a0-a7) → 4 kaksoissanaa (r0-r3)

r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, …

VPHSUBDQ Vaakasuuntainen vähennä kaksi merkkistä kaksoissanaa nelisanaksi 4 kaksoissanaa (a0-a3) → 2 nelisanaa (r0-r1)

r0 = a0-a1, r1 = a2-a3

Kokonaislukuvektorivertailu

Tämä vektoriohjeiden joukko käyttää koodauksen välitöntä kenttää lisäargumenttina, joka määrittää suoritettavan vertailun. Jokaiselle ohjeelle on kahdeksan mahdollista vertailua. Vektoreita verrataan ja mahdolliset vertailut, jotka ovat tosi, asettavat kaikki vastaavan kohderekisterin bitit arvoon 1, ja väärät vertailut asettavat bitit 0:ksi. Tätä tulosta voidaan käyttää suoraan VPCMOV-käskyssä, vektorisoidussa ehdollisessa siirrossa.

Ohje Kuvaus [9] välittömästi Vertailu
VPCOMB Vertaa Vector Signed Bytes 000 Vähemmän
VPCOMW Vertaa vektorimerkittyjä sanoja 001 Vähemmän tai yhtä suuret
VPCOMD Vertaa vektorimerkkisiä kaksoissanoja 010 Lisää
VPCOMQ Vertaa Vector Signed Quad-tekstejä 011 Suurempi tai yhtä suuri
VPCOMUB Vertaa Vector Unsigned Bytes 100 Ovat tasavertaisia
VPCOMUW Vertaa vektori allekirjoittamattomia sanoja 101 Ei tasa-arvoista
VPCOMUD Vertaa vektori allekirjoittamattomia Doublewords 110 Aina vääriä
VPCOMUQ Vertaa Vector Unsigned Quad-lauseita 111 Aina totta

Vector ehdollinen edelleenlähetys

VPCMOV toimii kuin bittikohtainen versio SSE4 -sekoitusohjeista . Jokaiselle valitsinoperandin bitille, joka on yhtä suuri kuin 1, valitse tulosbitti ensimmäisestä lähteestä, jos valitsimen bitti on 0, valitse tulosbitti toisesta lähteestä. Kun XOP:ta käytetään yhdessä vektorien vertailutoimintojen kanssa, voit toteuttaa kolmivektorioperaattorin tai, jos kohderekisteri on toinen argumentti, vektorin ehdollisen siirron ( CMOV ).

Ohje Kuvaus [9]
VPCMOV Vector ehdollinen siirto

Kokonaislukuvektorin käännös ja rotaatio

Siirtokäskyt eroavat SSE2-käskyjoukon käskyistä siinä, että ne voivat siirtää kutakin elementtiä eri bittimäärällä käyttämällä vektorirekisterin pakattuja etumerkillisiä kokonaislukuja. Merkki osoittaa siirto- tai kääntymissuunnan, positiiviset arvot siirrolle vasemmalle ja negatiiviset arvot siirto oikealle [10] Intel on ottanut käyttöön erilaisen, yhteensopimattoman joukon vektorisiirto- ja kääntymismuuttujia AVX2:ssa. [yksitoista]

Ohje Kuvaus [9]
VPROTB Pakattu Rotate Bytes
VPROTW Pakattu Pyöritä sanoja
VPROTD Pakattu Rotate Doublewords
VPROTQ Pakattu Rotate Quad
VPSHAB Pakatut Shift aritmeettiset tavut
VPSHAW Pakatut Shift Aritmeettiset sanat
VPSHAD Pakattu Shift Aritmeettinen Doublewords
VPSHAQ Pakattu Shift Aritmetic Quad
VPSHLB Pakatut Shift Logical Bytes
VPSHLW Pakatut Shift loogiset sanat
VPSHLD Pakatut Shift Logical Doublewords
VPSHLQ Pakattu Shift Logical Quadwords

Vektoripermutaatio

VPPERM on yksittäinen käsky, joka yhdistää ja laajentaa SSSE3:n PALIGNR- ja PSHUFB- käskyt . Jotkut vertaavat sitä AltiVec VPERM -ohjeeseen. [12] Syöttönä tarvitaan kolme rekisteriä: kaksi lähdettä ja valitsin (kolmas). Jokainen valitsimen tavu valitsee yhden tavuista toisessa kahdesta lähteestä kirjoitettavaksi lähtörekisteriin. Valitsin voi valita nollatavun, kääntää bittien järjestyksen, toistaa merkitsevimmän bitin. Kaikki tehosteet tai tulot voidaan lisäksi kääntää.

VPPERMIL2PD- ja VPPERMIL2PS-käskyt ovat kahden operandin versioita AVX-sarjan VPERMILPD- ja VPERMILPS-käskyistä . He, kuten VPPERM, voivat valita lähtöarvon mistä tahansa kahden tulorekisterin kentistä.

Ohje Kuvaus [9]
VPPERM Pakattu permutetavu
VPPERMIL2PD Permute kahden lähteen kaksinkertainen tarkkuus liukupiste
VPPERMIL2PS Permute Two-Source Single-Precision Floating Point

Liukulukujen murto-osan erottaminen

Nämä ohjeet erottavat murto-osan pakatuista liukulukuluvuista. Tällainen osa luvusta voi kadota, kun ne muunnetaan kokonaisluvuksi.

Ohje Kuvaus [9]
VFRCZPD Uutefraktiopakattu kaksinkertainen tarkkuus kelluva piste
VFRCZPS Uute fraktiopakattu yksittäinen tarkkuus kelluva piste
VFRCZSD Ote fraktio skalaari kaksinkertainen tarkkuus liukuluku
VFRCZSS Poimi murto-osa skalaari yhden tarkkuuden liukuluku

Katso myös

Muistiinpanot

  1. 1 2 3 4 Dave Christie (2009-05-07), Striking a balance , AMD Developer -blogit , < http://developer.amd.com/community/blog/2009/05/06/striking-a-balance/ > . Haettu 4. marraskuuta 2013. Arkistoitu alkuperäisestä 9. marraskuuta 2013. 
  2. 1 2 AMD64-arkkitehtuuriohjelmoijan opas, osa 6: 128-bittinen ja 256-bittinen XOP-, FMA4- ja CVT16-ohjeet , AMD , 1. toukokuuta 2009 , < http://support.amd.com/TechDocs/43479 datedpdf > Archived . 21. elokuuta 2018 Wayback Machinessa 
  3. [1] Arkistoitu 14. syyskuuta 2017 Wayback Machinessa "Mutta koska Zen on puhtaan arkin suunnittelu, Bulldozer-prosessoreista löytyy joitain ohjesarjalaajennuksia, joita ei löydy Zen/znver1:stä. Niitä, joita ei enää ole, ovat FMA4 ja XOP."
  4. Stop the instruction set war , Agner Fog, 5. joulukuuta 2009 , < http://www.agner.org/optimize/blog/read.php?i=25 > Arkistoitu 12. toukokuuta 2022 Wayback Machinessa 
  5. Intel AVX Programming Reference , maaliskuu 2008 , < http://softwarecommunity.intel.com/isn/downloads/intelavx/Intel-AVX-Programming-Reference-31943302.pdf > . Haettu 17. tammikuuta 2012. Arkistoitu 7. elokuuta 2011 Wayback Machinessa 
  6. Intel Advanced Vector Extensions Programming Reference , tammikuu 2009 , < http://software.intel.com/file/10069 > . Haettu 17. tammikuuta 2012. Arkistoitu 29. helmikuuta 2012 Wayback Machinessa 
  7. [https://web.archive.org/web/20160304033017/https://sourceware.org/ml/binutils/2015-03/msg00078.html Arkistoitu 4. maaliskuuta 2016 Wayback Machinessa Gopalasubramanian, G - [PATCH ]lisää znver1-prosessori]
  8. [https://web.archive.org/web/20160307134059/https://sourceware.org/ml/binutils/2015-08/msg00039.html Arkistoitu 7. maaliskuuta 2016 Wayback Machinessa Pawar, Amit - [PATCH ]Poista CpuFMA4 Znver1 CPU Flagsista]
  9. 1 2 3 4 5 6 7 AMD64-arkkitehtuuriohjelmoijan opas, Volume 4: 128-bit ja 256-Bit Media Instructions (PDF). AMD . Haettu 13. tammikuuta 2014. Arkistoitu alkuperäisestä 14. marraskuuta 2021.
  10. Uudet "Bulldozer"- ja "Piledriver"-ohjeet (PDF). AMD . Haettu 13. tammikuuta 2014. Arkistoitu alkuperäisestä 7. tammikuuta 2013.
  11. Intel Architecture Instruction Set Extensions Programming Reference (PDF)  (linkki ei saatavilla) . Intel . Käyttöpäivä: 29. tammikuuta 2014. Arkistoitu alkuperäisestä 1. helmikuuta 2014.
  12. Buldozer x264 -optimoinnit (linkki ei saatavilla) . Käyttöpäivä: 13. tammikuuta 2014. Arkistoitu alkuperäisestä 15. tammikuuta 2014.