XOP (fra engelsk eXtended Operations - extended operations [1] ) er en udvidelse af x86 / AMD64 instruktionssættet , annonceret af AMD Corporation den 1. maj 2009.
Det er en udvidelse og udvikling af ideer implementeret i 128-bit SSE - instruktioner i x86 / x86-64-arkitekturer . Implementeret startende med AMD Bulldozer mikroprocessor mikroarkitektur (12. oktober 2011). [2] Ikke understøttet på AMD-processorer siden Zen mikroarkitektur (Ryzen, EPIC; 2017) [3] .
XOP-instruktionssættet indeholder flere forskellige typer vektorinstruktioner, da det oprindeligt blev tænkt som en større opdatering til SSE . De fleste af instruktionerne er heltal, men sættet indeholder også instruktioner til permutering af flydende kommatal og instruktioner til at udtrække brøkdelen.
XOP er en omarbejdning af nogle af de ideer, der oprindeligt var beregnet til SSE5 . Sættet er blevet ændret til at være mere AVX -agtigt , uden at duplikere instruktioner. Instruktioner, der overlapper med AVX, er blevet fjernet eller flyttet til separate udvidelser, såsom FMA4 ( floating point vector multiply-add ) og CVT16 ( halvpræcisionskonverteringer , implementeret af Intel som F16C). [en]
Alle SSE5-instruktioner, for hvilke der var en analog eller tilsvarende i AVX- og FMA3- sættene , bruger kodninger foreslået af Intel. Heltalsinstruktioner uden ækvivalenter i AVX er blevet klassificeret som en XOP-udvidelse. [1] XOP-instruktioner er kodet med opkoder, der starter ved byte 0x8F ( hexadecimal værdi), men ellers bruger man et kodningsskema, der næsten er identisk med AVX med et 3-byte VEX-præfiks.
Nogle eksperter (Agner Fog) [4] tog dette som et tegn på, at Intel ikke tillod AMD at bruge nogen del af det store VEX-koderum. AMD var sandsynligvis tvunget til at bruge forskellige koder for at undgå enhver kombination, som Intel måtte bruge i fremtiden. XOP-kodningsskemaet er så tæt som muligt på VEX, men eliminerer risikoen for overlapning med fremtidige Intel-opkoder.
Brugen af byte 8F kræver, at m-bit (se VEX-kodningsskema) er større end eller lig med 8 for at undgå at interferere med aktuelt definerede instruktioner. 0xC4-byten brugt i VEX-skemaet har ingen sådan begrænsning. På grund af dette kan brugen af m-bits til andre formål i fremtiden i XOP-ordningen være vanskelig (VEX har ingen begrænsninger på m-bits). Et andet muligt problem er, at pp-bittene i XOP altid er sat til 00, mens de i VEX er sat til 01 for at indikere, at instruktionen ikke har nogen forældede ækvivalenter. Dette kan gøre det sværere at bruge pp-bits til andre formål i fremtiden.
Et lignende kompatibilitetsproblem er forskellen mellem implementeringerne af FMA3- og FMA4-udvidelserne . Intel foreslog oprindeligt FMA4-udvidelsen som en del af AVX/FMA version 3-specifikationen for at erstatte 3-operand FMA-varianten foreslået af AMD i SSE5. Efter at AMD implementerede FMA4, opgav Intel FMA4 og vendte tilbage til FMA3 i version 5 af AVX/FMA-specifikationen. [1] [5] [6]
I marts 2015 afslørede AMD i en patchbeskrivelse til GNU Binutils-pakken , at Zen , den tredje generation af x86-64-arkitekturen, i sin første udgave (znver1 - Zen, version 1), ikke vil understøtte TBM, FMA4, XOP og LWP instruktioner udviklet af specifikt til "Bulldozer" familien af mikroarkitekturer. [7] [8]
Disse instruktioner er heltalsækvivalenten til FMA-instruktionssættene . De er alle fire operandinstruktioner, der ligner FMA4, og de opererer alle på signerede heltal.
Instruktion | Beskrivelse [9] | Operation |
---|---|---|
VPMACSWW
VPMACSSWW |
Multiplicer Akkumuler (med mætning) ord til ord | 2x8 ord (a0-a7, b0-b7) + 8 ord (c0-c7) → 4 ord (r0-r7)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSWD
VPMACSSWD |
Multiplicer Akkumuler (med mætning) Lavt ord til dobbeltord | 2x8 ord (a0-a7, b0-b7) + 4 dobbeltord (c0-c3) → 4 dobbeltord (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, . [2] |
VPMACSDD
VPMACSSDD |
Multiplicer Akkumuler (med mætning) Doubleword til Doubleword | 2x4 dobbeltord (a0-a3, b0-b3) + 4 dobbeltord (c0-c3) → 4 dobbeltord (r0-r3)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSDQL
VPMACSSDQL |
Multiplicer Akkumuler (med mætning) Lavt dobbeltord til Quadword | 2x4 dobbeltord (a0-a3, b0-b3) + 2 kvadord (c0-c1) → 2 kvadord (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
VPMACSSDQH |
Multiplicer Akkumuler (med mætning) High Doubleword til Quadword | 2x4 dobbeltord (a0-a3, b0-b3) + 2 kvadord (c0-c1) → 2 kvadord (r0-r3)
r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
VPMADCSSWD |
Multiplicer Tilføj Accumulate (med Saturation) Word til Doubleword | 2x8 ord (a0-a7, b0-b7) + 4 dobbeltord (c0-c3) → 4 dobbeltord (r0-r3)
r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, .. |
Vandrette suminstruktioner tilføjer tilstødende værdier af inputvektoren til hinanden. Outputstørrelsen i instruktionerne nedenfor angiver, hvor brede summeringsoperationerne skal være. For eksempel tilføjer en vandret byte-for-ord-sum to bytes ad gangen og returnerer resultatet som en vektor af ord; "byte til quadword" tilføjer otte bytes sammen i ét trin og returnerer resultatet som en quadword-vektor. Seks yderligere horisontale additions- og subtraktionsoperationer blev implementeret i SSSE3 , men de opererer kun på to inputvektorer og udfører to operationer hver.
Instruktion | Beskrivelse [9] | Operation |
---|---|---|
VPHADDBW
VPHADDUBW |
Vandret tilføje to signerede/usignerede bytes til word | 16 bytes (a0-a15) → 8 ord (r0-r7)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDBD
VPHADDUBD |
Vandret tilføj fire signerede/usignerede bytes til dobbeltord | 16 bytes (a0-a15) → 4 dobbeltord (r0-r3)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7, … |
VPHADDBQ
VPHADDUBQ |
Vandret tilføj otte signerede/usignerede bytes til quadword | 16 bytes (a0-a15) → 2 quadwords (r0-r1)
r0 = a0+a1+a2+a3+a4+a5+a6+a7, … |
VPHADDWD
VPHADDUWD |
Vandret føje to underskrevne/usignerede ord til dobbeltord | 8 ord (a0-a7) → 4 dobbeltord (r0-r3)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDWQ
VPHADDUWQ |
Vandret føj fire signerede/usignerede ord til quadword | 8 ord (a0-a7) → 2 kvadord (r0-r1)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7 |
VPHADDDQ
VPHADDUDQ |
Vandret tilføj to fortegnede/usignerede dobbeltord til quadword | 4 dobbeltord (a0-a3) → 2 kvadord (r0-r1)
r0 = a0+a1, r1 = a2+a3 |
VPHSUBBW | Vandret subtraher to signerede bytes til ord | 16 bytes (a0-a15) → 8 ord (r0-r7)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBWD | Vandret træk to signerede ord fra til dobbeltord | 8 ord (a0-a7) → 4 dobbeltord (r0-r3)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBDQ | Vandret subtraher to signerede dobbeltord til quadword | 4 dobbeltord (a0-a3) → 2 kvadord (r0-r1)
r0 = aO-a1, r1 = a2-a3 |
Dette sæt vektorinstruktioner bruger det umiddelbare felt for kodningen som et yderligere argument, der bestemmer, hvilken sammenligning der skal udføres. Der er otte mulige sammenligninger for hver instruktion. Vektorerne sammenlignes, og enhver sammenligning, der er sand, sætter alle bit i det tilsvarende destinationsregister til 1, og falske sammenligninger sætter bitsene til 0. Dette resultat kan bruges direkte i VPCMOV-instruktionen, en vektoriseret betinget bevægelse.
Instruktion | Beskrivelse [9] | umiddelbar | Sammenligning | |
---|---|---|---|---|
VPCOMB | Sammenlign Vector Signed Bytes | 000 | Mindre | |
VPCOMW | Sammenlign vektorsignerede ord | 001 | Mindre eller lige | |
VPCOMD | Sammenlign Vector Signed Doublewords | 010 | Mere | |
VPCOMQ | Sammenlign Vector Signed Quadwords | 011 | Større end eller lig | |
VPCOMUB | Sammenlign Vector Unsigned Bytes | 100 | er ligeværdige | |
VPCOMUW | Sammenlign Vector usignerede ord | 101 | Ikke lige | |
VPCOMUD | Sammenlign Vector Unsigned Doublewords | 110 | Altid falsk | |
VPCOMUQ | Sammenlign Vector Unsigned Quadwords | 111 | Altid sandt |
VPCMOV fungerer som en bitvis version af SSE4- blandingsinstruktionerne . For hver bit i vælgeroperanden, der er lig med 1, skal du vælge resultatbitten fra den første kilde, hvis bit i vælgeren er 0, skal du vælge resultatbitten fra den anden kilde. Når det bruges sammen med vektorsammenligningsoperationer, giver XOP dig mulighed for at implementere en ternær vektoroperator eller, hvis destinationsregisteret er det andet argument, en vektorbetinget bevægelse ( CMOV ).
Instruktion | Beskrivelse [9] |
---|---|
VPCMOV | Vektor Betinget Flyt |
Skiftinstruktioner adskiller sig fra dem i SSE2-instruktionssættet ved, at de kan forskyde hvert element med et forskelligt antal bits ved hjælp af pakkede fortegnsheltal fra et vektorregister. Tegnet angiver retningen af skift eller drejning, positive værdier for skift til venstre og negative værdier for skift til højre [10] Intel har implementeret et andet, inkompatibelt sæt vektorskift og drejningsvariabler i AVX2. [elleve]
Instruktion | Beskrivelse [9] |
---|---|
VPROTB | Pakkede Roter Bytes |
VPROTW | Pakkede Roter Ord |
VPROTD | Pakkede Roter Doublewords |
VPROTQ | Pakket Roter Quaadwords |
VPSHAB | Pakkede Shift Aritmetiske Bytes |
VPSHAW | Pakkede Shift aritmetiske ord |
VPSHAD | Pakkede Shift Arithmetic Doublewords |
VPSHAQ | Pakket Shift Arithmetic Quadwords |
VPSHLB | Pakkede skiftlogiske bytes |
VPSHLW | Pakkede skift logiske ord |
VPSHLD | Pakkede skiftlogiske dobbeltord |
VPSHLQ | Pakket skift logiske quadwords |
VPERM er en enkelt instruktion, der kombinerer og udvider PALIGNR- og PSHUFB-instruktionerne fra SSSE3 . Nogle sammenligner det med AltiVec VPERM-instruktionen. [12] Det kræver tre registre som input: to kilder og en vælger (tredje). Hver byte i vælgeren vælger en af bytene i en af de to kilder til at skrive til outputregisteret. Vælgeren kan vælge en nulbyte, vende rækkefølgen af bits, gentage den mest signifikante bit. Alle effekter eller input kan desuden inverteres.
VPPERMIL2PD- og VPPERMIL2PS-instruktionerne er to-operand-versioner af VPERMILPD- og VPERMILPS-instruktionerne fra AVX-sættet . De kan, ligesom VPERM, vælge en outputværdi fra alle felter i de to inputregistre.
Instruktion | Beskrivelse [9] |
---|---|
VPPERM | Pakket Permute Byte |
VPPERMIL2PD | Permute Two-Source Double-Precision Floating Point |
VPPERMIL2PS | Permuter Two-Source Single-Precision Floating-Point |
Disse instruktioner uddrager brøkdelen fra pakkede flydende kommatal. En sådan del af tallet kan gå tabt, når de konverteres til et heltal.
Instruktion | Beskrivelse [9] |
---|---|
VFRCZPD | Ekstraher fraktion pakket dobbelt-præcision flydende-point |
VFRCZPS | Ekstraher fraktion pakket enkelt-præcision flydende-point |
VFRCZSD | Udtræk fraktion skalar dobbelt-præcision flydende punkt |
VFRCZSS | Ekstraher fraktion skalar enkelt-præcision flydende punkt |
x86 processor instruktionssæt | |
---|---|
Intel | |
AMD | |
Cyrix |