Antalet operander/instruktion z0 - stackmaskin yADD - adderar värdena överst på stacken, tar bort dem och lägger dit summan z1 - ackumulatormaskin yADD X - adderar innehåll i ackumulatorn och innehåll i minnescell X, summan i ackumulatorn z2 - tvåadressmaskin - ADD R1,R2 z3 - treadressmaskin - ADD R1 <- R2 + R3
Antal operander i minnet för en vanlig instruktion z0 - registermaskin (som MIPS) z1 - register-minne (x86) z2 - minne-minne (ovanligt numera) z3 - minne-minne (också ovanligt)
Exempel: stackmaskin zKod för C = A + B ypush A; innehåll i minnescell ; med adress A läggs på stacken ypush B yadd ypop C; översta värdet på stacken tas ; bort och skrivs till minnescell ; med adress C
Exempel: ackumulatormaskin z1 operand/instruktion, 1 minnesadress/instruktion zKod för C = A + B yLoad A; innehåll i minnescell med ; adress A kopieras till ackumulator yAdd B yStore C; innehåll i ackumulator kopieras ; till minnescell med adress C
Exempel: registermaskin av register-register-typ z3 operand/instruktion, 0 minnesadresser/instruktion zKod för C = A + B yLoad R1,A yLoad R2,B yAdd R3 <- R1 + R2 yStore R3,C
De första datorerna var ackumulatormaskiner zVarje bit som skulle lagras i processorn krävde flera elektronrör zInstruktioner kan kodas enkelt och ändå kompakt
Stackmaskiner - eleganta men opraktiska zEndast två värden är enkelt tillgängliga zEtt värde som återanvänds i ett uttryck kan behöva läsas från minnet flera gånger zEnkelt att kompilera uttryck till program för stackmaskin
Register-register-maskin (Risc) zEnkelt instruktionsformat - lätt att avkoda zMånga register - lätt att kompilera för zLätt att konstruera pipelinade processorer zProgrammen större än för andra typer yinstruktionerna är inte kompakt kodade yprogrammen innehåller fler instruktioner än för datorer med operander i minnet
Operandutpekning zOperand: värde som används i beräkningen zImmediate: operanden finns i instruktionen zRegister: operanden finns i ett register zOm operanden finns i minnet så existerar effektivadressen: adressen till den minnescell där operanden finns
Varför immediate behövs zFör konstanter zKonstanterna finns i koden, bra eftersom yvärdet är snabbt tillgängligt yvärdet tar inte upp plats i ett register ykoden ändras inte under körning, "konstanter" som ändras kan ge svårfunna fel
Goda tumregler för processorkonstruktörer zOrtogonalitet: operationer, datatyper, adresseringssätt ska kunna väljas oberoende av varandra yunderlättar kodgenereringen zErbjud byggblock, inte specialinstruktioner zGör det lätt att se hur snabb koden blir
Multimediainstruktioner zGrafik använder små heltal (8 bitar) z8 små heltal ryms i ett 64-bits register zOperationer utförs på 8 tal samtidigt zBryt carry-kedjan, använd vanliga ALU:n zIdéer lånade från vektordatorer, men de var mer flexibla
Multimediainstruktionernas brister zVektorelement som ska laddas till register är ofta utspridda i stället för intilliggande zVektordatorer: load/store för utspridda data ystrided addressing: t ex vart 3:e element ygather/scatter: en vektor med pekare anger vilka vektorelement som ska laddas/lagras zMultimediatillägg saknar denna adressering
En dålig idé: delayed branch zDefinition: instruktionen efter ett villkorligt hopp utförs alltid, även om hoppet tas zIdealiskt i femstegspipeline zProblematiskt i alla andra pipelines
En dålig idé: registerfönster zEn Sparc-processor har register, men bara 32 i taget är tillgängliga zR0-R7 är globala (och R0 innehåller alltid 0) zR8-R31 ingår i registerfönstret zFö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é zRegisterfönster optimerar anrop till och retur från funktioner/procedurer/metoder zVid processbyte har man register som ska sparas (R0 är borträknat) zProcessbyte inträffar oftare än funktionsanrop
Dåliga idéer kan vara bra zEtt par dåliga idéer räcker inte för att slå ihjäl en instruktionsuppsättning zDelayed branching bidrog till att höja prestanda när Risc var nytt och okänt zRegisterfönster skapade intresse för Sparc zMed tiden får man tillräckligt med kisel för bra prestanda trots gamla dåliga idéer