Streaming SIMD Extensions
Streaming SIMD Extensions (SSE) er en IA-32 SIMD multimediautvidelse av x86-arkitekturen, som ble lansert i Intel Pentium III i 1999.
SSE var opprinnelig kjent som KNI (Katmai New Instructions), der «Katmai» var kodenavnet på den første versjonen av Intel Pentium III. Den ble senere omdøpt til ISSE (Internet Streaming SIMD Extensions), og deretter til SSE.
SSE ble utviklet som et svar på AMDs 3DNow!, som var en forbedring av Intels egen MMX. SSE inneholder 70 nye instruksjoner. AMD tilføyde støtte for SSE i AMD Athlon XP og senere prosessorer.
MMX har to store begrensninger. For det første arbeider det utelukkende med heltall. For det andre kan ikke MMX-instruksjoner utføres uten å bruke desimaltallsenheten.
SSE arbeider med både heltall og desimaltall, uten å bruke desimaltallsenheten.
8 nye registre
[rediger | rediger kilde]SSE tilføyde 8 stk nye 128-bit registre, kalt XMM0–XMM7, og et nytt 32-bit kontroll- og statusregister (MXCSR). Hvert register pakker 4 stk enkelt-presisjons desimaltall. SIMD operasjoner på heltall utføres ved å bruke de 8, allerede eksisterende, 64-bit MMX-registrene.
Bruken av SSE krevde endringer i operativsystemene, fordi x86-arkitekturen måtte utvides med to nye x86-instruksjoner – FXSAVE og FXRSTR, for å lagre og gjenopprette registrenes tilstand uavhengig av og parallelt med desimaltallsenheten. Disse to nye instruksjonene kan også lagre x87-registrenes tilstand, og kan dermed også lagre MMX- og 3DNow!-instruksjoner parallelt med SSE.
Pentium III kunne imidlertid ikke utføre SSE og desimaltallsberegninger samtidig. XMM-registrene tillater imidlertid utførelsen av enkelte SIMD og skalære desimaltallsoperasjoner, uten å redusere ytelsen gjennom kontekst-skifter.
SSE-instruksjoner
[rediger | rediger kilde]SSE introduserte både nye skalære og nye SIMD-instruksjoner.
Desimal-talls instruksjoner
- RAM-til-register / Register-til-RAM / Register-til-register (flytting av data)
- Skalær – MOVSS
- SIMD – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
- Aritmetikk
- Skalær – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
- SIMD – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
- Sammenligning av tall
- Skalær – CMPSS, COMISS, UCOMISS
- SIMD – CMPPS
- Slumptallsgenerering og utpakking av SIMD-instruksjoner
- SIMD – SHUFPS, UNPCKHPS, UNPCKLPS
- Data-type convertering
- Skalær – CVTSI2SS, CVTSS2SI, CVTTSS2SI
- SIMD – CVTPI2PS, CVTPS2PI, CVTTPS2PI
- Bitvise logiske operasjoner
- SIMD – ANDPS, ORPS, XORPS, ANDNPS
Heltalls-instruksjoner
- Aritmetikk
- PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
- Flytting av data
- PEXTRW, PINSRW
- Andre
- PMOVMSKB, PSHUFW
Andre instruksjoner
- MXCSR håndtering
- LDMXCSR, STMXCSR
- Håndtering av Cache-RAM og RAM
- MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE