Redigerer
SPARCV7 mikroprosessor
(avsnitt)
Hopp til navigering
Hopp til søk
Advarsel:
Du er ikke innlogget. IP-adressen din vil bli vist offentlig om du redigerer. Hvis du
logger inn
eller
oppretter en konto
vil redigeringene dine tilskrives brukernavnet ditt, og du vil få flere andre fordeler.
Antispamsjekk.
Ikke
fyll inn dette feltet!
===Registervinduer=== I CISC-prosessorer er en stor del av dataoverføringene mellom mikroprosessoren og hovedminnet knyttet til [[funksjon (programmering)|prosedyrekall]]: Parametrene overføres, innholdet i registrene lagres, returadressen legges på [[stakk (datastruktur)|stakken]] og hentes tilbake igjen når prosedyren er avsluttet. Datamaskinens minne har tradisjonelt vært, og er fortsatt, mye tregere enn både mikroprosessorens interne registre og hurtigminne. Derfor er prosedyrekall en stor flaskehals for den totale ytelsen. Arkitektene bak RISC-prosessorene Berkeley RISC I og RISC II benyttet en genial metode for å oppheve nesten alle slike dataoverføringer. De innførte «overlappende registervinduer»,<ref name="Colwell1985s_14-15"/> som også benyttes i SPARC.<ref name="Patterson_Sequin">David. A. Patterson, Carlo. H. Sequin: ''RISC I: A Reduced Instruction Set VLSI Computer'', Proc. 8th International Symposium on Computer Architecture, Association for Computing Machinery, side 443-457, [[1981]], 2. utgave, International Symposium on Computer Architecture archive, 25 years of the international symposia on Computer architecture, side 216–230, [[1998]], ISBN 1-58113-058-9</ref> RISC I og RISC II var inspirasjonskilden til SPARC, men SPARC benytter en noe avvikende implementasjon. RISC I hadde 78 registere; 18 var globale, mens 6 vinduer inneholdt 14 registere hver. RISC II hadde 138 registere; 10 var globale, mens 8 vinduer inneholdt 16 registere hver. SPARC-spesifikasjonen opererer med 32 stk virtuelle 32-biter registre i hvert vindu, nummerert fra R0 til R31. Registrene er delt inn i fire grupper: {| class="wikitable" |- style="background:#efefef;" ! # ! 32 bit lange registre |-bgcolor=#FAFAD2 |R0–R7 |Globale variabler |-bgcolor=#FAFAD2 |R8–R15 |Inngående parametre |-bgcolor=#FAFAD2 |R16–R23 |Lokale variable |-bgcolor=#FAFAD2 |R24–R31 |Utgående parametre |} * R0–R7 er nedenfor nummererte fra G0 til G7. G0 er alltid null. Registrene G1–G7 er globale, og kan inneholde heltall, pekere til tabeller eller andre data-elementer. * R8–R15 er nedenfor nummererte fra I0 til I7, og inneholder de inngående parametrene til en kallende prosedyre. I tradisjonelle CISC-maskiner legges disse på stakken én etter én, like før prosedyrekall. * R16–R23 er nedenfor nummererte fra L0 til L7. De er avsatt til åtte lokale variabler inne i den kalte prosedyren. Også her unngår man bruk av stakken. * R24–R31 er nedenfor nummererte fra O0 til O7. De er avsatt til åtte utgående parametre fra prosedyren som er avsluttet. Også her unngår man stakken. SPARC tillater flere sett («registervinduer») med 32 stk 32-bit registre. Dette er antallet registere som enhver prosedyre på et gitt tidspunkt «ser». 5-bit variabelen ''CWP'' ''(Current Window Pointer)'' peker på R8. 2<sup>5</sup>= 32, og gir opptil (32 x 16) + 8 globale registre, eller 520 registre. Istedenfor å flytte data mellom registrene og hovedminnet, flyttes CWP innenfor registrene, og gir programmet den illusjon at det opererer med et annet register. {| |width="33"| |valign="top"| {| class="wikitable" cellpadding=2 cellspacing=2 |-bgcolor="#cccccc" ! # !! Register-innhold |-bgcolor=#FFE8E8 | R0–R7 || Globale |} {| class="wikitable" cellpadding=2 cellspacing=2 |-bgcolor="#cccccc" ! # !! Register-innhold |-bgcolor=#DDEEFF | R8–<br/>R15 || Inn |-bgcolor=#DDEEFF | R16–R23 || Lokale |-bgcolor=#DDEEFF | R24–R31 || Ut [[Fil:Fairytale right red.png|15px]] |-bgcolor=#FAFAD2 |(R32–R38) || |-bgcolor=#FAFAD2 |(R39–R45) || |-bgcolor=#FAFAD2 |(R46–R52) || |-bgcolor=#FAFAD2 |(R53–R59) || |} |width="33"| |valign="top"| {| class="wikitable" cellpadding=2 cellspacing=2 |-bgcolor="#cccccc" ! # !! Register-innhold |-bgcolor=#FFE8E8 | R0–R7 || Globale |} {| class="wikitable" cellpadding=2 cellspacing=2 |-bgcolor="#cccccc" ! # !! Register-innhold |-bgcolor=#FAFAD2 |(R8–R15) || |-bgcolor=#FAFAD2 |(R16–R23) || |-bgcolor=#DDEEFF | R8–<br/>R15 || [[Fil:Fairytale right red.png|15px]] Inn |-bgcolor=#DDEEFF | R16–R23 || Lokale |-bgcolor=#DDEEFF | R24–R31 || Ut [[Fil:Fairytale right red.png|15px]] |-bgcolor=#FAFAD2 |(R46–R52) || |-bgcolor=#FAFAD2 |(R53–R59) || |} |width="33"| |valign="top"| {| class="wikitable" cellpadding=2 cellspacing=2 |-bgcolor="#cccccc" ! # !! Register-innhold |-bgcolor=#FFE8E8 | R0–R7 || Globale |} {| class="wikitable" cellpadding=2 cellspacing=2 |-bgcolor="#cccccc" ! # !! Register-innhold |-bgcolor=#FAFAD2 |(R8–R15) || |-bgcolor=#FAFAD2 |(R16–R23) || |-bgcolor=#FAFAD2 |(R24–R31) || |-bgcolor=#FAFAD2 |(R32–R38) || |-bgcolor=#DDEEFF | R8–<br/>R15 || [[Fil:Fairytale right red.png|15px]] Inn |-bgcolor=#DDEEFF | R16–R23 || Lokale |-bgcolor=#DDEEFF | R24–R31 || Ut [[Fil:Fairytale right red.png|15px]] |} |} Ovenfor illustreres tre registervinduer for tre prosedyrer. I det første registervinduet (og prosedyren) ligger utgående variabler i R24–R31. Ved å flytte CWP nedover 16 registre i registervinduet til det andre registeret (og prosedyren), blir samme register omdefinert til å inneholde inngående variabler. Det samme gjentar seg i tredje registervindu (og prosedyre). I SPARC blir CWP dekrementert ved prosedyrekall. Den kallende prosedyren legger parametrene i R8–R15, og disse blir R24–R31 i prosedyren som kalles opp. Ved prosedyrekall «glir» «vinduet» oppover istedenfor nedover.
Redigeringsforklaring:
Merk at alle bidrag til Wikisida.no anses som frigitt under Creative Commons Navngivelse-DelPåSammeVilkår (se
Wikisida.no:Opphavsrett
for detaljer). Om du ikke vil at ditt materiale skal kunne redigeres og distribueres fritt må du ikke lagre det her.
Du lover oss også at du har skrevet teksten selv, eller kopiert den fra en kilde i offentlig eie eller en annen fri ressurs.
Ikke lagre opphavsrettsbeskyttet materiale uten tillatelse!
Avbryt
Redigeringshjelp
(åpnes i et nytt vindu)
Navigasjonsmeny
Personlige verktøy
Ikke logget inn
Brukerdiskusjon
Bidrag
Opprett konto
Logg inn
Navnerom
Side
Diskusjon
norsk bokmål
Visninger
Les
Rediger
Rediger kilde
Vis historikk
Mer
Navigasjon
Forside
Siste endringer
Tilfeldig side
Hjelp til MediaWiki
Verktøy
Lenker hit
Relaterte endringer
Spesialsider
Sideinformasjon