XOP (instruktionssæt)

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.

Historie

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]

Heltal vektor multiplikation-addition

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

Heltal vektor horisontal summering

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

Heltalsvektorsammenligning

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

Vektor betinget videresendelse

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

Heltal vektor translation og rotation

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

Vektorpermutation

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

Ekstraktion af brøkdelen af ​​flydende kommatal

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

Se også

Noter

  1. 1 2 3 4 Dave Christie (2009-05-07), Striking a balance , AMD Developer blogs , < http://developer.amd.com/community/blog/2009/05/06/striking-a-balance/ > . Hentet 4. november 2013. Arkiveret fra originalen 9. november 2013. 
  2. 1 2 AMD64 Architecture Programmer's Manual Volume 6: 128-bit og 256-bit XOP, FMA4 og CVT16 instruktioner , AMD , 1. maj 2009 , < http://support.amd.com/TechDocs/43479.pdf > Arkiveret dateret 21. august 2018 på Wayback Machine 
  3. [1] Arkiveret 14. september 2017 på Wayback Machine "Men da Zen er et rent ark-design, er der nogle instruktionssætudvidelser fundet i Bulldozer-processorer, der ikke findes i Zen/znver1. De, der ikke længere er til stede, inkluderer FMA4 og XOP."
  4. Stop instruction set war , Agner Fog, 5. december 2009 , < http://www.agner.org/optimize/blog/read.php?i=25 > Arkiveret 12. maj 2022 på Wayback Machine 
  5. Intel AVX Programming Reference , marts 2008 , < http://softwarecommunity.intel.com/isn/downloads/intelavx/Intel-AVX-Programming-Reference-31943302.pdf > . Hentet 17. januar 2012. Arkiveret 7. august 2011 på Wayback Machine 
  6. Intel Advanced Vector Extensions Programming Reference , januar 2009 , < http://software.intel.com/file/10069 > . Hentet 17. januar 2012. Arkiveret 29. februar 2012 på Wayback Machine 
  7. [https://web.archive.org/web/20160304033017/https://sourceware.org/ml/binutils/2015-03/msg00078.html Arkiveret 4. marts 2016 på Wayback Machine Gopalasubramanian, G - [PATCH ]tilføj znver1-processor]
  8. [https://web.archive.org/web/20160307134059/https://sourceware.org/ml/binutils/2015-08/msg00039.html Arkiveret 7. marts 2016 på Wayback Machine Pawar, Amit - [PATCH ]Fjern CpuFMA4 fra Znver1 CPU-flag]
  9. 1 2 3 4 5 6 7 AMD64 Architecture Programmer's Manual, Volume4: 128-bit og 256-bit medieinstruktioner (PDF). AMD . Hentet 13. januar 2014. Arkiveret fra originalen 14. november 2021.
  10. Ny "Bulldozer" og "Piledriver" instruktioner (PDF). AMD . Hentet 13. januar 2014. Arkiveret fra originalen 7. januar 2013.
  11. Intel Architecture Instruction Set Extensions Programming Reference (PDF)  (link ikke tilgængeligt) . Intel . Dato for adgang: 29. januar 2014. Arkiveret fra originalen 1. februar 2014.
  12. Buldozer x264-optimeringer (utilgængeligt link) . Dato for adgang: 13. januar 2014. Arkiveret fra originalen 15. januar 2014.