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.
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]
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, .. |
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 |
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 |
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 |
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 |
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 |
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 |
x86-prosessorin käskysarjat | |
---|---|
Intel | |
AMD | |
Cyrix |