67
Programování v asembleru – FPU a spol. Jakub Yaghob

Programování v asembleru – FPU a spol

  • Upload
    gunnar

  • View
    82

  • Download
    0

Embed Size (px)

DESCRIPTION

Programování v asembleru – FPU a spol. Jakub Yaghob. Ještě jednou historie – FPU. FPU F loating P oint U nit Formát dat i výpočet odpovídá IEEE 754 Koprocesor Nejprve samostatný čip 8086+8087, 80186+80187, 80286+80287, 80386+80387 Integrovaný na čipu s hlavním procesorem - PowerPoint PPT Presentation

Citation preview

Page 1: Programování v asembleru – FPU a spol

Programování v asembleru – FPU a spol.

Jakub Yaghob

Page 2: Programování v asembleru – FPU a spol

Ještě jednou historie – FPU

FPU Floating Point Unit

Formát dat i výpočet odpovídá IEEE 754 Koprocesor

Nejprve samostatný čip 8086+8087, 80186+80187, 80286+80287, 80386+80387

Integrovaný na čipu s hlavním procesorem i486, Pentium, Pentium Pro, Pentium II, Pentium III,

Pentium IV Výpočet probíhá paralelně s výpočtem hlavního

procesoru

Page 3: Programování v asembleru – FPU a spol

Ještě jednou historie – MMX

MMX První pokus o SIMD na IA-32

Prvně implementováno v procesorech Pentium MMX a Pentium II

Pouze celočíselné operace Vzájemně se vylučuje s FPU

Používá registry FPU AMD odpovědělo technologií 3DNow

Page 4: Programování v asembleru – FPU a spol

Ještě jednou historie – SSE

SSE Streaming SIMD extensions Implementováno poměrně pozdě

Pentium III Vlastní nové registry

XMM, MXCSR Operace SIMD ve „float“ přesnosti Instrukce pro řízení cache, prefetch

Page 5: Programování v asembleru – FPU a spol

Ještě jednou historie – SSE2

SSE2 Pentium IV Používá registry z SSE Operace SIMD v „double“ přesnosti 128-bitové operace SIMD na celých číslech Instrukce pro řízení cache, pořadí paměťových

operací

Page 6: Programování v asembleru – FPU a spol

Ještě jednou historie – SSE3

SSE3 Nová generace procesoru Pentium IV (Prescott) a

procesory Core Další rozšíření SSE2 Další SIMD operace „Horizontální“ SIMD operace Monitor

Page 7: Programování v asembleru – FPU a spol

Ještě jednou historie – SSE4

SSE4 Rozděleno na dvě rozšíření SSE4.1 a SSE4.2 SSE4.1

45nm Core 2 47 nových instrukcí Zlepšení výkonu pro zpracování médií, 3D

SSE4.2 Core i7 7 nových instrukcí Zpracování řetězců, aplikační instrukce

Page 8: Programování v asembleru – FPU a spol

Ještě jednou historie – AESNI

AESNI AES New Instructions 6 instrukcí pro kódování/dekódování AES PCLMULQDQ – carryless multiplication of two 64-

bit numbers

Page 9: Programování v asembleru – FPU a spol

Ještě jednou historie – AVX

AVX Advanced Vector eXtensions Rozšíření SSE registrů na 256 bitů 3-operandový zápis instrukcí

ADDPS xmm1,xmm2/m128 VADDPS xmm1,xmm2,xmm3/m128

Většina instrukcí bez omezení na zarovnání Prefix instrukce VEX

Page 10: Programování v asembleru – FPU a spol

Ještě jednou historie – AVX2

AVX2 Přidání velké většiny celočíselných vektorových

instrukcí do AVX Haswell

Page 11: Programování v asembleru – FPU a spol

Výpočetní prostředí FPU I.

Page 12: Programování v asembleru – FPU a spol

Výpočetní prostředí FPU II.

Datové registry Zásobník Výpočet v obrácené polské notaci

Page 13: Programování v asembleru – FPU a spol

Výpočetní prostředí FPU III.

Stavový registr Pouze pro čtení Podmínkové příznaky

se chovají u různých instrukcí různě

ES nastaveno, kdykoliv nějaké xE nastaveno

Při SF rozhoduje C1=1 (overflow), C1=0 (underflow)

Page 14: Programování v asembleru – FPU a spol

Výpočetní prostředí FPU IV.

Řídící registr Maska výjimek Řízení přesnosti

Ovlivňuje pouze operace +,-,*,/, sqrt

Řízení zaokrouhlování

00 24 bitů01 Vyhrazeno10 53 bitů11 64 bitů

00 Nejbližší sudý01 K −∞10 K +∞11 K 0

Page 15: Programování v asembleru – FPU a spol

Výpočetní prostředí FPU V.

Značkovací registr Vázáno na fyzické registry

Page 16: Programování v asembleru – FPU a spol

Datové typy FPU I.

Numerické typy Odpovídají IEEE 754 32- a 64-bitová čísla mají implicitní celou část mantisy = 1 Hodnota = -1Sign * Mantisa * 2Exponent-Posun exponentu

Page 17: Programování v asembleru – FPU a spol

Datové typy FPU II.

Celočíselné typy

Page 18: Programování v asembleru – FPU a spol

Datové typy FPU III.

Nekonečno Numerické Celočíselné = 10...0

Další typy hodnot NaN (Not a Number)

Quiet Signaling

Nenormalizované číslo

Page 19: Programování v asembleru – FPU a spol

Instrukce FPU – přesuny

FloatFLD mem

FLDST(i)

FST, FSTP mem

FST, FSTP ST(i)

FXCH ST(i)

FCMOVccST(0),ST(i)

IntegerFILD mem

FIST, FISTP mem BCDFBLD mem

FBSTP mem

Page 20: Programování v asembleru – FPU a spol

Instrukce FPU – konstanty

Load +0.0FLDZ

Load +1.0FLD1

Load πFLDPI

Load log2 10

FLDL2T Load log2 e

FLDL2E log10 2

FLDLG2 loge 2

FLDLN2

Page 21: Programování v asembleru – FPU a spol

Instrukce FPU – aritmetika Sčítání

FADD memFADD ST(0),ST(i)FADD ST(i),ST(0)FADDP ST(i),ST(0)FIADD mem

OdčítáníFSUB/FSUBPFSUBR/FSUBRPFISUB/FISUBR

NásobeníFMUL/FMULPFIMUL

DěleníFDIV/FDIVPFDIVR/FDIVRPFIDIV/FIDIVR

OstatníFABSFCHSFSQRTFPREM, FPREM1FRNDINTFXTRACT

Page 22: Programování v asembleru – FPU a spol

Instrukce FPU – porovnání

FloatFCOM/FCOMP mem

FCOM/FCOMPST(i)

FCOMPP Float neuspořádanéFUCOM/FUCOMP

FUCOMPP IntegerFICOM/FICOMP mem

Přímé floatFCOMI/FCOMIP

Přímé float neuspořádanéFUCOMI/FUCOMIP

OstatníFTST

FXAM

Page 23: Programování v asembleru – FPU a spol

Instrukce FPU – trigonometrické

sinFSIN

cosFCOS

sin a cosFSINCOS

tgFPTAN

arctgFPATAN

Page 24: Programování v asembleru – FPU a spol

Instrukce FPU – logaritmické a exponenciální

Logaritmus y * log2 x

FYL2X Logaritmus y * log2 x+1

FYL2XP1 Exponent 2x-1F2XM1

Násobení mocninou 2FSCALE

Page 25: Programování v asembleru – FPU a spol

Instrukce FPU – řídící

InicializaceFINIT/FNINIT

Řídící slovoFLDCW

FSTCW/FNSTCW Stavové slovo

FSTSW/FNSTSW Výjimky

FCLEX/FNCLEX Ukazatel zásobníku

FINCSTP/FDECSTP

ProstředíFLDENV

FSTENV/FNSTENV Stav

FRSTOR

FSAVE/FNSAVE Ostatní

FFREE

FNOP

WAIT/FWAIT

Page 26: Programování v asembleru – FPU a spol

Porovnání ve FPU – I

Tradiční metoda

Page 27: Programování v asembleru – FPU a spol

Porovnání ve FPU – II

Novější metoda Od Pentia Pro Porovnávací instrukce přímo nastavují

odpovídající příznaky v EFLAGS jako bezznaménkové porovnání

Instrukce pro porovnání:

FCOMI, FCOMIP, FUCOMI, FUCOMIP Instrukce pro podmíněný přesun:

FCMOVcc ST(0),ST(i)

Page 28: Programování v asembleru – FPU a spol

Porovnání ve FPU – III

Unordered porovnání Aspoň jeden NaN

Nastavení příznaků

Page 29: Programování v asembleru – FPU a spol

Hlášení výjimek FPU

FPU pracuje paralelně s hlavním proudem instrukcí Kdy se má vyvolat výjímka pro FPU v hlavním

proudu? Na další FPU instrukci WAIT/FWAIT

Problém s ukládáním dat FPU: kdy je uvidím v hlavním proudu? Od i486 není třeba WAIT/FWAIT

Page 30: Programování v asembleru – FPU a spol

Výpočetní prostředí MMX

Registry jsou sdíleny s FPU Mantisová část registrů

Page 31: Programování v asembleru – FPU a spol

Datové typy MMX

Page 32: Programování v asembleru – FPU a spol

SIMD model

Page 33: Programování v asembleru – FPU a spol

Modely aritmetiky MMX

Wraparound „Normální“ aritmetika, která nekontroluje žádné přetečení

Znaménková saturace Při přetečení/podtečení přes znaménkové

maximum/minimum je výsledkem znaménkové maximum/minimum

Bezznaménková saturace Při přetečení/podtečení přes bezznaménkové

maximum/minimum je výsledkem bezznaménkové maximum/minimum

Page 34: Programování v asembleru – FPU a spol

Instrukce MMX – datové přesuny

32-bitůMOVD mem,mmxr

MOVD mmxr,mem

MOVD r,mmxr

MOVD mmxr,r

64-bitůMOVQ mem,mmxr

MOVQ mmxr,mem

MOVQ mmxr,mmxr

Page 35: Programování v asembleru – FPU a spol

Instrukce MMX – aritmetika

SčítáníPADDB mmxr,mmxrPADDB mmxr,memPADDW, PADDDPADDSB, PADDSWPADDUSB, PADDUSW

OdčítáníPSUBB, PSUBW, PSUBDPSUBSB, PSUBSWPSUBUSB, PSUBUSW

NásobeníPMULL, PMULH

Násobení a sečteníPMADDWD

Page 36: Programování v asembleru – FPU a spol

StaženíPACKSSWB, PACKSSDW

PACKUSWB Rozbalení

PUNPCKHBWPUNPCKHWDPUNPCKHDQPUNPCKLBWPUNPCKLWDPUNPCKLDQ

Instrukce MMX – porovnání a konverze Porovnání na rovnost

PCMPEQBPCMPEQWPCMPEQD

Porovnání na >PCMPGTBPCMPGTWPCMPGTD

Page 37: Programování v asembleru – FPU a spol

Instrukce MMX – logické a posuvy, EMMS

LogickéPAND

PANDN

POR

PXOR PosuvyPSLLW, PSLLD, PSLLQ

PSRLW, PSRLD, PSRLQ

PSRAW, PSRAD

EMMS (Empty MMX state)EMMS

Page 38: Programování v asembleru – FPU a spol

Přechody MMX a FPU

Přechod FPU→MMX Libovolná instrukce MMX kromě EMMS FPU nastavení:

TOP v SW je 0 Tag registr je celý 0 V exponentech registrů jsou 1

Přechod MMX→FPU Použít instrukci EMMS

Míchaný kód (volací konvence!) Při použití MMX ve funkci je nutno uložit/obnovit stav FPU

Page 39: Programování v asembleru – FPU a spol

Výpočetní prostředí SSE

128-bitové datové registry Intel 64 má navíc 8 registrů XMM8-XMM15

Page 40: Programování v asembleru – FPU a spol

Výpočetní prostředí SSE – řídící/stavový registr

Stavový i řídící registr MXCSR

Page 41: Programování v asembleru – FPU a spol

Datové typy SSE

Čtyři „floaty“

Page 42: Programování v asembleru – FPU a spol

Instrukce SSE – I

Pakované a skalární float operace

64-bitové SIMD celočíselné instrukce Instrukce na řízení stavu Řízení cache, prefetch, pořadí paměťových operací

Page 43: Programování v asembleru – FPU a spol

Instrukce SSE – II

Pakované a skalární float operace Přesuny dat Aritmetické instrukce Logické instrukce Porovnání Míchání Konverze

Page 44: Programování v asembleru – FPU a spol

Instrukce SSE - přesuny Aligned 16B, unalignedMOVAPS, MOVUPS

SP skalárMOVSS

Low, high 2 SPMOVLPS, MOVHPS

Low-high, high-low 2 SPMOVLHPS, MOVHLPS

4 nejvýznamnější bity SP do 4 bitů obecného registruMOVMSKPS

Page 45: Programování v asembleru – FPU a spol

Instrukce SSE – aritmetické a logické

SIMD aritmetické operaceADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, RSQRTPS, MAXPS, MINPS

Skalární aritmetické operaceADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, RSQRTSS, MAXSS, MINSS

Logické operaceANDPS, ANDNPS, ORPS, XORPS

PorovnáníCMPPS, CMPSS, COMISS, UCOMISS

Page 46: Programování v asembleru – FPU a spol

Instrukce SSE – míchání

Zamíchání podle maskySHUFPS

ProloženíUNPCKHPS

UNPCKLPS

Page 47: Programování v asembleru – FPU a spol

Instrukce SSE – konverze

Konverze 2 DW INT↔ 2 PS CVTPI2PS, CVTPS2PI, CVTTPS2PI Viz obrázek později

Konverze 1 DW INT↔ skalár PS CVTSI2SS, CVTSS2SI Viz obrázek později

Page 48: Programování v asembleru – FPU a spol

Instrukce SSE – rozšíření MMX

PřesunyPEXTRW, PINSRWPMOVMSKBPSHUFW

AritmetickéPMULHUW

AgregačníPAVGB, PMAXUB, PMINUB, PMAXSW, PMINSW, PSADBW

Page 49: Programování v asembleru – FPU a spol

Instrukce SSE – netemporální data

Netemporální data Některé MM operace zapisují data, která nebudou

v nejbližší budoucnosti zapotřebí Je třeba zabránit zanesení cache Data se neukládají do cache Pokud jsou v cache, cache-line označena jako

oběť Zápis s WC sémantikou

Není zaručeno pořadí zápisu, slučování ve WC bufferech

Page 50: Programování v asembleru – FPU a spol

Instrukce SSE – netemporální přesuny, řízení cache

Netemporální přesunyMOVNTQ, MOVNTPS, MASKMOVQ

Řízení přednačítáníPREFETCHh h je hint

T0 – temporální data do všech úrovní Tx – temporální data do úrovně nejvýše x NTA – netemporální data co nejblíže k CPU bez

zanesení cache Pořadí paměťových operacíSFENCE

Page 51: Programování v asembleru – FPU a spol

Instrukce SSE – stav

Práce s MXCSRLDMXCSR mem

STMXCSR mem Stav SSEFXSAVE

FXRSTOR Zavedeny před SSE v Pentium II jako rychlé

uložení/načtení stavu FPU Nejsou součástí SSE Nyní ukládají stav XMM, MXCSR, FPU, MMX

Page 52: Programování v asembleru – FPU a spol

Datové typy SSE2

128-bitové celočíselné typy Dva „double“

Page 53: Programování v asembleru – FPU a spol

Instrukce SSE2 Pakované a skalární double operace

Přesuny dat Aritmetické instrukce Logické instrukce Porovnání Míchání Konverze

64-bitové a 128-bitové celočíselné operace 128-bitové rozšíření stávajících SIMD celočíselných

operací MMX a SSE Řízení cache a pořadí paměťových instrukcí Flush-to-Zero flag in MXCSR

Page 54: Programování v asembleru – FPU a spol

Instrukce SSE2 – přesuny

Obdoba instrukcí pro SSE, ale určené pro Packed Double-precisionMOVAPD, MOVUPD

MOVSD

MOVHPD, MOVLPD

MOVMSKPD

Page 55: Programování v asembleru – FPU a spol

Instrukce SSE2 – aritmetické a logické

SIMD aritmetické operaceADDPD, SUBPD, MULPD, DIVPD, SQRTPD, MAXPD, MINPD

Skalární aritmetické operaceADDSD, SUBSD, MULSD, DIVSD, SQRTSD, MAXSD, MINSD

Logické operaceANDPD, ANDNPD, ORPD, XORPD

PorovnáníCMPPD, CMPSD, COMISD, UCOMISD

Page 56: Programování v asembleru – FPU a spol

Instrukce SSE2 – míchání

Zamíchání podle maskySHUFPD

ProloženíUNPCKHPD

UNPCKLPD

Page 57: Programování v asembleru – FPU a spol

Konverze SSE a SSE2

Page 58: Programování v asembleru – FPU a spol

Instrukce SSE2 – operace v celých číslech

Přesuny 128 bitů (Double Quadword)

MOVDQA, MOVDQU Aritmetické operace Packed Quadword

PADDQ, PSUBQ, PMULUDQ Míchání, rozbalení

PSHUFLW, PSHUFHW, PSHUFDPUNPCKHQDQ, PUNPCKLQDQ

Posuny

PSSLDQ, PSQLDQ Přesuny MMX↔XMM

MOVQ2DQ, MOVDQ2Q

Page 59: Programování v asembleru – FPU a spol

Instrukce SSE2 – caching

Vyhození řádky cache

CLFLUSH Další instrukce pro netemporální uložení

MOVNTDQ, MOVNTPD, MOVNTI, MASKMOVDQU Pořadí paměťových operací

LFENCE, MFENCE Podpora hyperthreadingu u spin-locků

PAUSE Hinty u skoků

Statická předpověď úspěšnosti skoku

Page 60: Programování v asembleru – FPU a spol

Instrukce SSE3 Výpočetní prostředí a stavy procesoru se proti SSE2 nezměnily

Žádné nové datové typy Žádné nové registry

1 instrukce FPU Zrychlení převodu z plovoucí čárky na celé číslo

1 SIMD celočíselná instrukce 128-bitové nezarovnané čtení

9 SIMD instrukcí v plovoucí čárce Zrychlení LOAD/MOVE/DUPLICATE Pakované sčítání a odčítání Horizontální sčítání a odčítání

2 synchronizační instrukce

Page 61: Programování v asembleru – FPU a spol

Instrukce SSE3 – další módy SIMD operací

Asymetrické zpracování

Horizontální zpracování

Page 62: Programování v asembleru – FPU a spol

Instrukce SSE3 – I

FPU konverze na celé číslo FISTTP

Načtení nezarovnaného 128-bitového celého čísla LDDQU

Pomnožení MOVSHDUP, MOVSLDUP, MOVDDUP

Page 63: Programování v asembleru – FPU a spol

Instrukce SSE3 – II

Asymetrické operace ADDSUBPS, ADDSUBPD

Horizontální operace HADDPS, HSUBPS, HADDPD, HSUBPD

Page 64: Programování v asembleru – FPU a spol

Instrukce SSE3 – synchronizace Instrukce MONITOR a MWAIT

Dostupné na EPL=0 Podmíněně dostupné na vyšším EPL

MONITOR Nastaví HW monitoring zápisu na adresu udanou v DS:EAX (lze použít

segmentové prefixy) Rozsah adres určen implementací, lze zjistit pomocí CPUID

V ECX jsou volitelná rozšíření, v EDX volitelná nápověda Aktuálně není nic definováno

MWAIT Čeká na zápis na adresu nastavenou MONITORem V ECX jsou volitelná rozšíření, v EAX volitelné nápovědy (např. požadovaný

stav CPU) Aktuálně není nic definováno

Page 65: Programování v asembleru – FPU a spol

Instrukce SSE4.1 Výpočetní prostředí a stavy procesoru se proti SSE3 nezměnily 2 instrukce pro násobení packed dword 2 instrukce pro skalární součin 1 instrukce pro čtení streamů 6 instrukcí pro míchání 8 instrukcí pro celočíselné MIN/MAX 4 instrukce s řiditelným zaokrouhlením 7 instrukcí pro přesuny mezi obecnými a XMM registry 12 instrukcí pro konverzi celočíselných typů 1 instrukce pro součet absolutních rozdílů 1 instrukce horizontálního vyhledávání 1 instrukce pro maskované porovnání 1 instrukce pro porovnání qwordů na rovnost 1 instrukce pro dword packing

Page 66: Programování v asembleru – FPU a spol

Instrukce SSE4.2 4 instrukce pro zpracování textů

PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM Vhodné pro zpracování XML dokumentů

1 instrukce pro porovnání qwordů na > 2 instrukce pro aplikační doménu

CRC32, POPCNT

Page 67: Programování v asembleru – FPU a spol

Intel AES instrukční sada

AES instruction set Zvláštní rozšíření u CPU Intel od roku 2010,

nutno identifikovat pomocí CPUID Pracuje s XMM registry Možnost volby AES-128, AES-192, AES-256 Instrukce pro kódování

AESENC, AESENCLAST Instrukce pro dekódování

AESDEC, AESDECLAST Instrukce pro generování klíčů

AESKEYGENASSIST, AESIMC