180 likes | 332 Views
Antalet operander/instruktion. 0 - stackmaskin ADD - adderar värdena överst på stacken, tar bort dem och lägger dit summan 1 - ackumulatormaskin ADD X - adderar innehåll i ackumulatorn och innehåll i minnescell X, summan i ackumulatorn 2 - tvåadressmaskin - ADD R1,R2
E N D
Antalet operander/instruktion • 0 - stackmaskin • ADD - adderar värdena överst på stacken, tar bort dem och lägger dit summan • 1 - ackumulatormaskin • ADD X - adderar innehåll i ackumulatorn och innehåll i minnescell X, summan i ackumulatorn • 2 - tvåadressmaskin - ADD R1,R2 • 3 - treadressmaskin - ADD R1 <- R2 + R3
Antal operander i minnet för en vanlig instruktion • 0 - registermaskin (som MIPS) • 1 - register-minne (x86) • 2 - minne-minne (ovanligt numera) • 3 - minne-minne (också ovanligt)
Exempel: stackmaskin • Kod för C = A + B • push A ; innehåll i minnescell ; med adress A läggs på stacken • push B • add • pop C ; översta värdet på stacken tas ; bort och skrivs till minnescell ; med adress C
Exempel: ackumulatormaskin • 1 operand/instruktion, 1 minnesadress/instruktion • Kod för C = A + B • Load A ; innehåll i minnescell med ; adress A kopieras till ackumulator • Add B • Store C ; innehåll i ackumulator kopieras ; till minnescell med adress C
Exempel: registermaskin av register-register-typ • 3 operand/instruktion,0 minnesadresser/instruktion • Kod för C = A + B • Load R1,A • Load R2,B • Add R3 <- R1 + R2 • Store R3,C
De första datorerna var ackumulatormaskiner • Varje bit som skulle lagras i processorn krävde flera elektronrör • Instruktioner kan kodas enkelt och ändå kompakt
Stackmaskiner - eleganta men opraktiska • Endast två värden är enkelt tillgängliga • Ett värde som återanvänds i ett uttryck kan behöva läsas från minnet flera gånger • Enkelt att kompilera uttryck till program för stackmaskin
Register-register-maskin (Risc) • Enkelt instruktionsformat - lätt att avkoda • Många register - lätt att kompilera för • Lätt att konstruera pipelinade processorer • Programmen större än för andra typer • instruktionerna är inte kompakt kodade • programmen innehåller fler instruktioner än för datorer med operander i minnet
Operandutpekning • Operand: värde som används i beräkningen • Immediate: operanden finns i instruktionen • Register: operanden finns i ett register • Om operanden finns i minnet så existerar effektivadressen: adressen till den minnescell där operanden finns
Varför immediate behövs • För konstanter • Konstanterna finns i koden, bra eftersom • värdet är snabbt tillgängligt • värdet tar inte upp plats i ett register • koden ändras inte under körning, "konstanter" som ändras kan ge svårfunna fel
Goda tumregler för processorkonstruktörer • Ortogonalitet:operationer, datatyper, adresseringssätt ska kunna väljas oberoende av varandra • underlättar kodgenereringen • Erbjud byggblock, inte specialinstruktioner • Gör det lätt att se hur snabb koden blir
Multimediainstruktioner • Grafik använder små heltal (8 bitar) • 8 små heltal ryms i ett 64-bits register • Operationer utförs på 8 tal samtidigt • Bryt carry-kedjan, använd vanliga ALU:n • Idéer lånade från vektordatorer, men de var mer flexibla
Multimediainstruktionernas brister • Vektorelement som ska laddas till register är ofta utspridda i stället för intilliggande • Vektordatorer: load/store för utspridda data • strided addressing: t ex vart 3:e element • gather/scatter: en vektor med pekare anger vilka vektorelement som ska laddas/lagras • Multimediatillägg saknar denna adressering
En dålig idé: delayed branch • Definition: instruktionen efter ett villkorligt hopp utförs alltid, även om hoppet tas • Idealiskt i femstegspipeline • Problematiskt i alla andra pipelines
En dålig idé: registerfönster • En Sparc-processor har 48-528 register, men bara 32 i taget är tillgängliga • R0-R7 är globala (och R0 innehåller alltid 0) • R8-R31 ingår i registerfönstret • Fönstret ändras i steg om 16 med instruktionerna save/restore
save (funktionsanrop) restore (retur från funktion)
Varför registerfönster är en dålig idé • Registerfönster optimerar anrop till och retur från funktioner/procedurer/metoder • Vid processbyte har man 47-527 register som ska sparas (R0 är borträknat) • Processbyte inträffar oftare än funktionsanrop
Dåliga idéer kan vara bra • Ett par dåliga idéer räcker inte för att slå ihjäl en instruktionsuppsättning • Delayed branching bidrog till att höja prestanda när Risc var nytt och okänt • Registerfönster skapade intresse för Sparc • Med tiden får man tillräckligt med kisel för bra prestanda trots gamla dåliga idéer