SSE4

SSE4 ( Streaming SIMD Extensions 4 ) är en SIMD CPU- instruktionsuppsättning som används i Intel Core-mikroarkitekturen och AMD K10 (K8L) . Det tillkännagavs den 27 september 2006 vid Intel Developer Forum hösten 2006 , med vaga detaljer i en vitbok ; mer exakta detaljer om 47 instruktioner blev tillgängliga på våren 2007 Intel Developer Forum i Peking , i presentationen. SSE4 är helt kompatibel med programvara skriven för tidigare generationer av Intel 64- och IA-32-arkitekturmikroprocessorer. All befintlig programvara fortsätter att köras korrekt utan ändringar på mikroprocessorer som innehåller SSE4, såväl som i närvaro av befintliga och nya applikationer som innehåller SSE4.

SSE4 delmängder

Intel SSE4 består av 54 instruktioner. En delmängd bestående av 47 instruktioner, kallad SSE4.1 i viss Intel-dokumentation, finns tillgänglig i Penryn . Dessutom SSE4.2 , en andra delmängd bestående av de 7 återstående instruktionerna, först tillgänglig i Nehalem -baserade Core i7 . Intel anser att feedback från utvecklare spelar en viktig roll i utvecklingen av instruktionsuppsättningen.

Från och med Barcelona -baserade processorer introducerade AMD SSE4a -instruktionsuppsättningen, som har 4 SSE4-instruktioner och 4 nya SSE-instruktioner. Dessa instruktioner finns inte i Intels processorer som stöder SSE4.1 och AMD-processorer som bara började stödja Intels SSE4.1 och SSE4.2 (hela SSE4-instruktionsuppsättningen) i Bulldozer -baserade FX-processorer. Med SSE4a introducerades också den felaktiga SSE-funktionen, vilket innebar att ojusterade laddningsinstruktioner var lika snabba som justerade versioner på justerade adresser. Det gjorde det också möjligt att inaktivera inriktningskontrollen på icke-lastade SSE-operationer som åtkomst till minne. Intel introducerade senare liknande hastighetsförbättringar för ojusterade SSE i sina Nehalem-processorer, men introducerade inte feljusterad åtkomst genom icke-lastade SSE-instruktioner förrän AVX .

Namnförvirring

Det som nu är känt som SSSE3 (Supplemental Streaming SIMD Extensions 3), introducerat i Intel Core 2- processorlinjen, hänvisades till som SSE4 av vissa medier tills Intel kom med SSSE3-monikern. Internt kallad Merom New Instructions, Intel planerade ursprungligen inte att tilldela dem något speciellt namn, vilket kritiserades av vissa journalister. Intel löste så småningom förvirringen och reserverade SSE4-namnet för deras nästa instruktionsuppsättningstillägg.

Intel använder marknadsföringstermen HD Boost för att referera till SSE4.

Nya instruktioner

Till skillnad från alla tidigare iterationer av SSE, innehåller SSE4 instruktioner som utför operationer som inte är specifika för multimediaapplikationer. Den innehåller ett antal instruktioner vars åtgärd bestäms av ett konstant fält och en uppsättning instruktioner som tar XMM0 som en implicit tredje operand.

Flera av dessa instruktioner är aktiverade av encykels shuffle-motorn i Penryn. (Blanda operationer ändrar ordningen på bytes i ett register.)

SSE4.1

Dessa instruktioner introducerades med Penryn mikroarkitektur , 45 nm krympningen av Intels Core mikroarkitektur . Support indikeras via flaggan CPUID.01H:ECX.SSE41[Bit 19].

Instruktion Beskrivning
MPSADBW
0000 00 Beräkna åtta offsetsummor av absoluta skillnader, fyra åt gången (dvs |x −y |+|x 1 −y 1 |+|x 2 −y 2 |+|x 3 −y 3 |, |x −y 1 |+|x 1 −y 2 |+|x 2 −y 3 |+|x 3 −y 4 |, ..., |x −y 7 |+|x 1 −y 8 |+|x 2 −y 9 |+|x 3 -y 10 |); denna operation är viktig för vissa HD- codecs och gör att en 8×8 blockskillnad kan beräknas på mindre än sju cykler. En bit av en trebitars omedelbar operand anger om y .. y 10 eller y 4 .. y 14 ska användas från destinationsoperanden, de andra två om x ..x 3 , x 4 ..x 7 , x 8 ..x 11 eller x 12 ..x 15 bör användas från källan.
PHMINPOSUW
Ställer in det nedersta osignerade 16-bitarsordet för destinationen till det minsta osignerade 16-bitarsordet i källan, och nästa-från-botten till indexet för det ordet i källan.
PMULDQ
Packad 32-bitars signerad "lång" multiplikation, två (1:a och 3:e) av fyra packade heltal multiplicerade ger två packade 64-bitars resultat.
PMULLD
Packad 32-bitars signerad "låg" multiplikation, fyra packade uppsättningar av heltal multiplicerade ger fyra packade 32-bitars resultat.
  DPPS  ,  DPPD 
Punktprodukt för AOS-data (Array of Structs). Detta kräver en omedelbar operand bestående av fyra (eller två för DPPD) bitar för att välja vilken av posterna i ingången som ska multipliceras och ackumuleras, och ytterligare fyra (eller två för DPPD) för att välja om 0 eller punktprodukten ska läggas in i lämpligt fält för utgången.
  
   BLENDPS  ,  BLENDPD  ,  BLENDVPS  ,  BLENDVPD  ,  PBLENDVB  ,  PBLENDW 
Villkorlig kopiering av element på en plats med en annan, baserad (för icke-V-form) på bitarna i en omedelbar operand, och (för V-form) på bitarna i register XMM0.
   
   
  PMINSB  ,  PMAXSB  ,  PMINUW  ,  PMAXUW  ,  PMINUD  ,  PMAXUD  ,  PMINSD  ,  PMAXSD 
Packad minimum/maximum för olika heltalsoperandtyper
    ROUNDPS  ,  ROUNDSS  ,  ROUNDPD  ,  ROUNDSD 
Avrunda värden i ett flyttalsregister till heltal, med ett av fyra avrundningslägen specificerade av en omedelbar operand
  
   INSERTPS  ,  PINSRB  ,  PINSRD  /  PINSRQ  ,  EXTRACTPS  ,  PEXTRB  ,  PEXTRD  /  PEXTRQ 
Instruktionerna INSERTPS och PINSR läser 8, 16 eller 32 bitar från ett x86-register eller minnesplats och infogar det i ett fält i destinationsregistret som ges av en omedelbar operand. EXTRACTPS och PEXTR läser ett fält från källregistret och infogar det i ett x86-register eller minnesplats. Till exempel, PEXTRD eax, [xmm0], 1; EXTRACTPS [addr+4*eax], xmm1, 1 lagrar det första fältet av xmm1 i adressen som ges av det första fältet av xmm0.
   
   
   
   PMOVSXBW  ,  PMOVZXBW  ,  PMOVSXBD  ,  PMOVZXBD  ,  PMOVSXBQ  ,  PMOVZXBQ  ,  PMOVSXWD  ,  PMOVZXWD  ,  PMOVSXWQ  ,  PMOVZXWQ  ,  PMOVSXZDQDQ  PM  _ 
Packad skylt/nollförlängning till bredare typer
PTEST
Detta liknar TEST-instruktionen, genom att den sätter Z-flaggan till resultatet av en AND mellan dess operander: ZF är satt, om DEST OCH SRC är lika med 0. Dessutom sätter den C-flaggan om (NOT DEST) AND SRC är lika med noll.

Detta är ekvivalent med att sätta Z-flaggan om ingen av bitarna maskerade av SRC är satta, och C-flaggan om alla bitar maskerade av SRC är satta.

PCMPEQQ
Quadword (64 bitar) jämför för jämlikhet
PACKUSDW
Konvertera signerade DWORDs till osignerade WORDs med mättnad.
MOVNTDQA
Effektiv läsning från skrivkombinerande minnesområde till SSE-register; detta är användbart för att hämta resultat från kringutrustning som är ansluten till minnesbussen.

SSE4.2

SSE4.2 lade till STTNI (String and Text New Instructions), flera nya instruktioner som utför teckensökningar och jämförelser på två operander på 16 byte åt gången. Dessa utformades (bland annat) för att påskynda analysen av XML- dokument. Den lade också till en CRC32-instruktion för att beräkna cykliska redundanskontroller som används i vissa dataöverföringsprotokoll. Dessa instruktioner implementerades först i den Nehalem -baserade Intel Core i7- produktlinjen och kompletterar SSE4-instruktionsuppsättningen. Support indikeras via flaggan CPUID.01H:ECX.SSE42[Bit 20].

Instruktion Beskrivning
CRC32
Ackumulera CRC32 C-värdet med hjälp av polynomet 0x11EDC6F41 (eller, utan den höga ordningens bit, 0x1EDC6F41).
PCMPESTRI
Packade Jämför explicita längdsträngar, returindex
PCMPESTRM
Packade Jämför strängar med explicit längd, returmask
PCMPISTRI
Packade Jämför implicita längdsträngar, returindex
PCMPISTRM
Packade Jämför implicita längdsträngar, returmask
PCMPGTQ
Jämför packad signerad 64-bitars data för större än

POPCNT och LZCNT

Dessa instruktioner fungerar på heltal snarare än SSE-register, eftersom de inte är SIMD-instruktioner, utan visas samtidigt och även om de introducerades av AMD med SSE4a-instruktionsuppsättningen, räknas de som separata tillägg med sina egna dedikerade CPUID-bitar för att indikera stöd. Intel implementerar POPCNT som börjar med Nehalem -mikroarkitekturen och LZCNT som börjar med Haswell -mikroarkitekturen. AMD implementerar båda från Barcelonas mikroarkitektur .

AMD kallar detta instruktionspar Advanced Bit Manipulation (ABM) .

Instruktion Beskrivning
POPCNT
Populationsantal (antal antal bitar satt till 1). Support indikeras via flaggan CPUID.01H:ECX.POPCNT[Bit 23].
LZCNT
Ledande nollräkning . Support indikeras via flaggan CPUID.80000001H:ECX.ABM[Bit 5].

Kodningen av lzcnt tar samma kodningsväg som kodningen av bsr- instruktionen (bit scan reverse). Detta resulterar i ett problem där lzcnt anropade vissa processorer som inte stöder det, t.ex. Intel-processorer före Haswell, kan felaktigt utföra bsr -operationen istället för att ta fram ett ogiltigt instruktionsundantag . Detta är ett problem eftersom resultatvärdena för lzcnt och bsr är olika.

Efterföljande nollor kan räknas med bsf (bit scan forward) eller tzcnt instruktionerna.

SSE4a

Instruktionsgruppen SSE4a introducerades i AMD:s Barcelona-mikroarkitektur . Dessa instruktioner är inte tillgängliga i Intel-processorer. Support indikeras via CPUID.80000001H:ECX.SSE4A[Bit 6]-flaggan.

Instruktion Beskrivning
 EXTRQ  /  INSERTQ 
Kombinerade mask-shift instruktioner.
 MOVNTSD  /  MOVNTSS 
Scalar streaming butik instruktioner.

Stödjer CPU:er

externa länkar