MIPS modulet og registerallokatoren

Relaterede dokumenter
MIPS, registerallokering og MARS

Oversættere Skriftlig eksamen onsdag d. 25. januar 2006

Oversættere Skriftlig eksamen onsdag d. 19. april 2006

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

Oversættere. Vejledende løsninger til Skriftlig eksamen onsdag d. 25. januar 2006

To mikroarkitekturer til MIPS Karakteropgave på Maskinarkitektur 1B

Oversættere. Vejledende løsninger til Skriftlig eksamen onsdag d. 18. april 2007

DATALOGI 1E. Skriftlig eksamen fredag d. 16. januar 2004

Maskinsprog. Martin Zachariasen, DIKU. Programmer og ordrer. Ordretyper. Operander og deres placering. Ordreformat. Procedurekald. Andre arkitekturer

DATALOGI 1E. Vejledende løsninger til Skriftlig eksamen torsdag den 16. januar 2003

DATALOGI 1E. Skriftlig eksamen fredag den 7. juni 2002

DATALOGI 1E. Skriftlig eksamen mandag den 23. juni 2003

Oversættere Skriftlig eksamen onsdag d. 20. april 2005

Oversættere Skriftlig eksamen onsdag d. 24. januar 2007

Sider og segmenter. dopsys 1

Indhold. Maskinstruktur Kapitel 1. Assemblersprog Indledning Hop-instruktioner Input og output...

Oversættere. Vejledende løsninger til Skriftlig eksamen onsdag d. 20. april 2005

DATALOGI 1E. Vejledende løsninger til Skriftlig eksamen fredag den 7. juni 2002

Yderligere udvidelser af oversætter for Minimal

Sider og segmenter. dopsys 1

DATALOGI 1E. Vejledende løsninger til Skriftlig eksamen mandag den 28. maj min min min min.

Sproget Limba. Til brug i G1 og K1. Dat1E 2003

DM13-3. Obligatorisk opgave E.05 Håndoptimering af SPARC assembler-kode

Oversættere Vejledende løsninger til Skriftlig eksamen onsdag d. 24. januar 2007

Sproget Rascal (v. 2)

Moduler i Standard ML

Programmering og Problemløsning, 2017

Åben uddannelse, Efterår 1996, Oversættere og køretidsomgivelser

Vejledning til Kilometer Registrering

DATALOGI MASKINARKITEKTUR Blok 2 samt Reeksamination i DATALOGI MASKINARKITEKTUR Blok 1 og arkitekturdelen af DATALOGI 1E

Kernealphaerne Indhold af G1

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:

Hukommelsesspil. Introduktion. Scratch

DM507 Algoritmer og datastrukturer

XML webservice for pensionsordninger. Version 1.0 Draft A

Skriftlig eksamen, Programmer som Data Onsdag 6. januar Spørgsmål 1 (20 %): Regulære udtryk og automater

Svane Electronic Universal timer med 2 relæer og 18 funktioner hver 1

Lær Python dag 1 - modul 1

Svane Electronic Timer universal med 8 funktioner 1

DM507 Algoritmer og datastrukturer

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

JTA-DynamicsPDF. til. Microsoft Dynamics C5 vers. 3 SP3 eller højere. JTA-Data Jylland Vinkelvej 108a 8800 Viborg Tlf

Fang Prikkerne. Introduktion. Scratch

Programmering C RTG

DM507 Algoritmer og datastrukturer

Indholdsfortegnelse If-sætningen... 3 Opgaver... 4 OR, AND sammen med if-sætningen... 5 Rand() funktion... 5 Opgave... 5 Include() funktionen...

DM507 Algoritmer og datastrukturer

Planen for idag. Indhold af G1. Kernealphaerne. Alpha erne. Datalogi 1F Forår 2003

Dat1E K1-1 - En pipelinet mikroarkitektur. Espen Højsgaard Rune Højsgaard Christian Iversen

#AlleKanKode. Lektion 3 - Operatorer

Dat1E G2 - En enkelt/dobbelt-cyklus mikroarkitektur. Espen Højsgaard Rune Højsgaard Christian Iversen

Denne artikel er en detaljeret gennemgag af det fundamentale i batchfiler til hjemmebrug :-) FEEL THE POWER! ;-)

Post Danmark forsendelsesmodul til Magento (Pacsoft)

ectrl Skabelonkonvertering

CPUer og maskinkode DM534. Rolf Fagerberg

It og informationssøgning Forelæsning december 2006 Jakob Grue Simonsen. Diverse emner af almen interesse

Peter Kellberg. Rundt om Danmarks Statistiks makroer. Design, Standardisering, Teknik

GeoCad modul DSFL ingen 1. Oversætterens opbygning (frdsfl)

Nyt i Analyseportalen og Web Report Studio. Analyseportalen

Computerarkitektur. - en introduktion til computerarkitektur med LINDA

Svane Electronic Timer universal med 8 funktioner 1

Lær Python - Dag 4, modul 2 Objektorienteret programmering

Skriftlig eksamen, Programmer som Data januar 2014

Forelæsning Uge 4 Torsdag

Oversættere / Datalogi 1E

DM507 Algoritmer og datastrukturer

SwipBox forsendelses modul til Magento

SIGIL Sådan opretter du en e- bog Step by Step

Easy Guide i GallupPC

Instruks for udlevering af fraktioner Regionernes Bio- og GenomBank

SPSS introduktion Om at komme igang 1

Vejledning til PRO2TAL Bager/Online. Ordrer

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

VSM. Værdistrømsanalyse. Ledelsens vejledning. DI version

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen

JTAnno. Annoncestyring. til. Microsoft Business Solutions C5 JTA DATA. Jylland

Kom godt igang med Inventar registrering

Programmering og Problemløsning, 2017

1.1 Formål Webservicen gør det muligt for eksterne parter, at fremsøge informationer om elevers fravær.

Design af IT-medier. Skriftlig prøve 27. august Alle skriftlige hjælpemidler er tilladt.

Hent filoplysninger fra billeder og filer

Skriftlig eksamen i Datalogi

Anvendelse af metoder - Programmering

Induktive og rekursive definitioner

Husk lige at gemme under et andet filnavn, så du har en arbejdskopi at lege med.!!

PICTURE formater. Klog på SAS 15. marts 2012

dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet)

Skriftlig eksamen i Datalogi

dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet)

Indberetning af data til DMU

DATALOGI 1E. Vejledende løsninger til Skriftlig eksamen mandag den 23. juni 2003

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt.

Svane Electronic Universal timer med 4 relæer og et valg af 18 funktioner hver 1. 4 kanals timer med 18 funktioner

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Abstrakte datatyper C#-version

poedit og oversættelse af sprogfiler

Computerarkitektur Eksamen 2014Q2. Niels Olof Bouvin A. Studienummer Navn

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Integralregning med TI-Interactive! Stamfunktioner Integraler Arealer Jan Leffers (2005)

Transkript:

MIPS modulet og registerallokatoren Værktøjer til oversætterdelen af K1 Dat1E 2001 MIPS modulet Den vigtigste del af modulet MipsData.sml er datatypen mips, som beskriver MIPS ordrer, se figur 1. Alle de i K1-opgaven nævnte ordrer (og lidt til) er understøttet af denne datastruktur. Endvidere er de fleste pseudo-ordrer fra MASM understøttet. Alle registre eller konstanter angives i mips datatypen som tegnfølger (af typen string). Dermed er det muligt at bruge symbolske navne og regneudtryk. I registerfelter vil en tegnfølge, der er rent numerisk blive betragtet som et nummereret register og udskrevet med et $-prefix. Ikke-numeriske tegnfølger i registerfelter vil blive betragtet som symbolske navne og udskrevet med et :-prefix. Talfelter udskrives uændret, så man kan bruge alle de udtryk, som MASM understøtter. Til at repræsentere en liste af MIPS-intruktioner bruges typen mips list. En liste kan omformes til en tekst (string) i MASM -kompatibelt format med funktionen pp_mips_list. Der er i MipsData.sml defineret tre funktioner, som implementerer pseudoordrer MOVE, LI og SUBI. Disse bliver oversat til hhv. ORI og ADDI. Pseudoordrer har to formål: 1) De letter læseligheden af oversættere. 2) Registerallokatoren kan fjerne MOVE-ordrer, som flytter mellem to identiske registre. Det kan den ikke hvis MOVE er implementeret på en anden måde end den definerede pseudo-ordrer (f.eks. med ADDI eller OR med register 0). JAL intruktionen har, udover destination, i mips datastrukturen et ekstra argument, som er en liste af registre. Denne liste skal indeholde de registre, som er brugt til at overføre parametre til den kaldte funktion (hvis registre 1

datatype mips = LABEL of string ASSERT of string ORG of string EQU of string*string EQUR of string*string END NOP DC of string list DS of string DSRND of string*string COMMENT of string LUI of string*string ADD of string*string*string ADDI of string*string*string SUB of string*string*string AND of string*string*string ANDI of string*string*string OR of string*string*string ORI of string*string*string SLT of string*string*string SLTI of string*string*string BEQ of string*string*string BNE of string*string*string J of string JAL of string * string list (* label + argumentregistre *) JR of string LW of string*string*string (* lw rd,i(rs) kodes som LW (rd,rs,i) *) SW of string*string*string (* sw rd,i(rs) kodes som SW (rd,rs,i) *) STOP fun MOVE (rd,rs) = ORI (rd,rs,"0") fun LI (rd,v) = ADDI (rd,"0",v) fun SUBI (rd,rs,v) = ADDI (rd,rs,"-(" ^ v ^ ")") Figure 1: MIPS datastrukturen 2

bruges til dette). Dette er af hensyn til registerallokatoren, som ellers ikke kan se, at disse registre er levende frem til kaldet. Funktionen pp_mips_list udskriver en liste af MIPS instruktioner i et format, der kan læses af MASM assembleren. MIPS modulet findes i filen ~dat1e/k1/mipsdata.sml. Registerallokatoren Registerallokatoren er defineret i RegAlloc.sig og RegAlloc.sml. Det er en simpel registerallokator uden spill. Dette skulle ikke være noget problem med programmer i den størrelse som skal oversættes i K1. Registerallokatoren kaldes med følgende argumenter: En liste af MIPS-ordrer Angivelse af de registre, som registerallokatoren må bruge. Dette er givet som et interval af registre, som er opdelt i to grupper: Callersaves registre og callee-saves registre. Dette angives med tre tal: rmin, callermax og rmax. Alle registre mellem rmin og callermax er callersaves registre. Registre mellem callermax+1 og rmax er callee-saves. Registerallokatoren returnerer følgende: En liste af register-alias definitioner som knytter numeriske registre til symbolske navne. Disse er lavet med equr direktivet fra MASM. En modificeret udgave af den liste af MIPS-ordrer, som blev givet som inddata. MOVE ordrer vil være kommenteret ud i den modificerede liste, hvis de to operander er allokeret til samme register. En liste af de variabler, der er levende ved indgangen af koden. Denne information er primært nyttig til testudskrifter under aflusning af oversætteren. Det højeste allokerede registernummer. Dette kan udnyttes til kun at gemme de callee-saves registre, der rent faktisk bliver brugt. Registerallokatoren findes i filerne RegAlloc.sml og RegAlloc.sig i kataloget ~dat1e/k1. 3

Kaldkonventioner Registerallokatoren understøtter rene callee-saves kaldkonventioner eller blandede caller-saves/callee-saves konventioner, men ikke rene caller-saves konventioner. Det skyldes at registerallokatoren ikke har adgang til aktiverinsgposten og derfor ikke har et sted at gemme caller-saves registre ved kald. Det betyder også at gemning/hentning af callee-saves registre ikke gøres af registerallokatoren. Kode for dette kan tilføjes efter registerallokatoren er kaldt, når man ved, hvilke callee-saves registre er brugt. Herunder er en kort vejledning om hvordan registerallokatorer kan bruges ved forskellige kaldkonventioner. Ren stakbaseret callee-saves. Denne konvention svarer til figurerne 9.4-9.6 i Basics of Compiler Design. Registerallokatoren kaldes med koden svarende til den del af figur 9.5 som starter med parameter 1 := M[F P + 4] og slutter med M[F P + 4] := result. Da JAL bruger et register til at gemme returadressen, skal gemningen af denne flyttes fra kaldstedet til prologen af den kaldte funktion, altså fra figur 9.6 til figur 9.5. Se endvidere herunder. Da der ikke er nogen caller-saves registre, sættes callermax parameteren til registerallokatoren til 0. rmin sættes til 1 og rmax til det højeste register, som ikke bliver brugt til specielle formål, såsom F P eller link-register. I eksemplet herunder er rmax sat til 25. Hvis body er kroppen af funktionen, inklusive hentning af parametre fra stakken og gemning af resultatet i stakken (som beskrevet herover), så kan man kalde registerallokatoren som følger: let val (allocs, newbody, liveatentry, maxused) = RegAlloc.registerAlloc body 1 0 25 Efter kaldet indeholder allocs registerdefinitioner (en liste af EQUR pseudoordrer), newbody en ny version af kroppen (hvor nogle MOVE ordrer er kommenteret ud). liveatentry skal ikke bruges i denne sammenhæng, men maxused indeholder nummeret på det højeste brugte register. Man skal nu foran newbody tilføje kode til at gemme registrene 1... maxr på stakken og efter newbody tilføje kode til at hente dem fra stakken igen. For at gøre funktionen komplet skal yderligere tilføjes: En label for funktionen. De registerdefinitioner, som er givet i allocs. 4

let val body = kode for kroppen af funktionen val loadcode = kode til at hente parametre fra stakken val resultcode = kode til at lægge resultat på stakken val body2 = loadcode @ body @ resultcode val (allocs,body3,liveatentry,maxused) = RegAlloc.registerAlloc body2 1 0 25 val framesize = 4*(antal parametre+1+maxused) val savecode = kode til at gemme reg. 1..maxUsed i aktiveringspost val restorecode = kode til at hente reg. 1..maxUsed i aktiveringspost in [MipsData.LABEL f, MipsData.SW ("31",FP,"0"), MipsData.EQU (f ^ "_framesize", Int.toString framesize)] @ allocs @ savecode @ body3 @ restorecode @ [MipsData.LW ("31",FP,"0"), MipsData.JR "31"] end Figure 2: Kodegenerering for funktionen f med ren callee-saves strategi Kode til at gemme register 31 i aktiveringskroppen. (Efter kroppen) kode til at hente register 31 fra aktiveringsposten. En JR ordre til at hoppe til returadressen. I figur 2 er skitseret et stykke SML, der genererer kode for en funktion jævnfør ovenstående beskrivelse. Visse detaljer er udeladt (markeret med kursiv). FP er en SML variabel, der indeholder nummeret (som tegnfølge) på det register, derf bruges som frame-pointer. Når man inde i kroppen af funktionen skal oversætte et funktionskald, skal man (jvf. fig 9.6 i Basics of Compiler Design ) lægge framesize til F P. Men f ramesize kendes først efter at registerallokatoern er kaldt og (med maxused) angiver hvor mange registre, der skal gemmes. Derfor er det en god ide, inde i kroppen at bruge en symbolsk konstant for framesize og efter kaldet til registerallokatoren tilføje en definition af den symbolske konstant til koden (med en EQU pseudo-ordre). Husk at bruge forskellige symbolske navne for f ramesize i forskellige funktioner. Figur 2 viser hvordan det gøres. Når man skal oversætte et funktionskald, beregnes parametrene først i mellemkodevariabler. Lige før kaldet lægges den aktuelle framesize til F P og paramterene flyttes fra mellemkodevariablerne til den nye aktiveringspost (som vist i figur 9.6 i Basics of Compiler Design ). Derefter laves en JAL 5

instruktion til den kaldte funktions label. Da der ikke bruges registre til parameteroverførsel, er registerlisten til MipsData.JAL tom. Bagefter JAL instruktionen sættes kode til at flytte resultatet fra aktiveringsposten og trække framsize fra F P igen. Som nevnt ovenover, er framesize en symbolsk variable, der hedder noget forskelligt fra funktion til funktion. For at bruge den rigtige symbolske variabel, skal oversætterfunktionen kende navnet på denne. Dette kan gøres med en ekstra nedarvet attribut til oversætterfunktionen eller via en global variabel. Hvis man har separat F P og SP, som beskrevet i afsnit 9.8.1 i Basics of Compiler Design, behøves f ramesize ikke. Til gengæld skal prolog/epilog og kaldsekvens modificeres så både F P og SP opdateres. Se afsnit 9.8.1 for flere detaljer. Stakbaseret blandet caller-saves og callee-saves. Registerallokatoren er lavet sådan at variabler, der er levende henover funktionskald, ikke bliver allokeret i caller-saves registre. Dermed er det ikke nødvendigt at gemme levende variabler, som ligger i caller-saves registre (der vil nemlig ikke være levende variabler i caller-saves registre), så koden for et kald i den blandede kaldkonvention ser ud præcis som i den rene callee-saves strategi ovenfor. Man skal sørge for, at der er callee-saves registre nok til at holde alle variabler, der er levende over funktionskald. Derfor bør højest 1/3 af de allokerbare registre være caller-saves. I forhold til den rene callee-saves strategi beskrevet i figur 2, skal der kun laves to ændringer: 1) I kaldet til registerallokatoren skal callermax sættes til det højeste caller-saves register (f.eks. 8), så man skriver 8 i stedet for 0 i kaldet. 2) Kun registre mellem callermax+1 (f.eks. 9) og maxused skal gemmes og hentes i aktiveringsposten. 3) Beregningen af framesize ændres så man i stedet for maxused bruger (maxused-callermax). Med meget lidt ekstra indsats kan man altså spare et betydeligt antal gemninger og hentninger af registre. 6

Brug af registre til parameteroverførsel/retur. Denne konvention svarer til figur 9.7-9.10 i Basics of Compiler design. I forhold til den ovenfor beskrevne blandende konvention skal der laves følgende ændringer: I kaldsekvensen: 1) De første parametre lægges i caller-saves registre (rmin... callermax) i stedet for på stakken. De resterende parametre (hvis der er flere) skal stadig lægges på stakken. 2) I koden for funktionskaldet skal JAL ordren markeres med de variabler, der bruges til overførsel af parametre til kaldet. 3) Efter kaldet laves et flyt fra det første caller-saves register til den symbolske variabel, der skal indeholde resultatet af kaldet. Registerallokatoren vil fjerne dette flyt, hvis det ikke er nødvendigt, dvs, hvis den symbolske variabel kan allokeres i det første caller-saves register. I prolog og epilog: 1) I stedet for at hente alle parametrene fra stakken, flyttes de første af dem fra caller-saves registrene til symbolske registre 1. Registerallokatoren vil eliminere de indsatte MOVE, hvis der alligevel ikke er brug for dem (dvs., hvis det symbolske register kan allokeres i samme register, som parameteren blev overført i). 2) Efter beregning af kroppen lægges værdien af denne i det første callersaves register i stedet for på stakken. 3) Beregningen af framesize ændres, så parametre, der er overført i registre ikke tæller med til framesize. 1 Det er ikke en god ide bare at lade dem blive liggende i de nummererede registre, da de så vil blive overskrevet ved funktionskald. 7