(in dutch)
>
Instructieselectie werkt nu aardig maar wat mij nog onduidelijk is, is hoe
>
je bij het aanroepen van een andere functie code genereert om de
>
callee-saved registers te bewaren: je weet immers nog niet welke dat zijn,
>
want de RA komt pas na IS.
Precies. En daarom wil je dat overlaten aan RA. De overlay definitie voor
de jal instructie is als volgt gedefinieerd:
jal(lab, ra, use) =
OPER([" jal ", L(1)], use, CallerSavedRegisters, [lab, ra])
Dit betekent dat de
CallerSavedRegisters (zie
MIPS-registers.r) overschreven
kunnen worden. Dit is genoeg om aan RA te melden dat de callersavedregisters
niet gebruikt kunnen worden waarden te bewaren die moet leven na de procedure
aanroep. `use' is een lijst met registers die `gebruikt' wordt door de jal
instructie. Dit is noidg om te zorgen dat de waarden in de parameter registers
blijven leven tot de instructie wordt uitgevoerd. lab is het label van de
aangeroepen functie. ra is het label van het return adres. Dit moet je genereren na het aanroepen van jal
SEQ(jal("f", "a_0", [TEMP("a_1")]), label("a_0"))
om te zorgen dat de control flow duidelijk is voor RA.
Als je deze informatie verstrekt zal RA zorgen dat de registers zo gekozen
worden dat ze niet in een callersaved register zitten als ze een functie
aanroep moet overleven. Als dat het niet aanders kan zal RA een register
spillen en ruimte op de stack alloceren.
De callee-saved registers moet je aan het begin van een functie aanroep
moven naar een temp en aan het einde weer terug. Als het register niet
nodig is wordt de move gecoalesced anders worden er spill instructies
gegenereerd.
Hoop dat het zo duidelijk is. Appel vertelt dit ook in de sectie over
CALLER-SAVE AND CALLEE-SAVE REGISTERS in hoofdstuk 11 sectie 3.
--
EelcoVisser - 10 Jan 2002