Thread View: be.comp.programming
3 messages
3 total messages
Started by Bart Vandewoestyne
Sun, 08 Jun 2003 19:44
caller-save vs. callee-save registers
Author: Bart Vandewoestyne
Date: Sun, 08 Jun 2003 19:44
Date: Sun, 08 Jun 2003 19:44
66 lines
3738 bytes
3738 bytes
Ik snap wel wat caller-save en callee-save registers zijn, maar mij is
het niet echt duidelijk waarom dit onderscheid juist wordt gemaakt.
In mijn handboek (1) worden 2 voorbeelden vermeld, het eerste gaat als
volgt en denk ik nog te snappen:
void h(int y) {
int x;
x = y+1;
f(y);
f(2);
}
Mijn boek zegt hier "If local variabele x is never live across a
procedure call, it is properly kept in a caller-save register.
Explain how doing this would speed up the program above."
Het antwoord daarop is volgens mij dat aangezien de caller (zijnde h)
hier weet dat x niet gebruikt wordt na het oproepen van f, dat je dan
best x in een caller-save register stopt en dat je dan de caller dat
register TOCH NIET laat saven en daarmee een store uitspaart. Mocht
je x in een callee-save register gestopt hebben, dan zouden de twee
oproepen van f telkens het register van x gesaved en teruggezet
hebben.
Maar nu komt mijn boek ook nog af met volgend voorbeeld:
"If local variabele b is live across more than one procedure call, is
it kept in a callee-save register? Explain how doing this would speed
up the following program:"
int f(int a) {
int b;
b = a +1;
g();
h(b);
return b+2;
}
Hier wordt b dus wel nog gebruikt na het oproepen van g en h. Ik denk
wel dat je b hier in een callee-save register moet stoppen, want op
pag. 130 vermeld mijn boek: "..., if the caller has a local variabele
i that is needed before and after several function calls, it may put i
in some callee-save register r_i and, save r_i just once (upon entry
to f) and fetch it back just once (before returning from f)."
En dat snap ik nu eens niet goed se... Als je die b in een
callee-save register stopt, dan zal toch telkens bij het oproepen van
g en h dat register gesaved worden? M.a.w. dus extra veel fetches en
stores? Zou je niet eerder moeten zeggen dat je b in een caller-save
register moet stoppen omdat je het register van b dan maar 1 keer moet
laten bewaren door de caller (f) en slechts 1 keer moet terugzetten
vlak voor je returnt?
I'm confused...
Greetzzz,
mc303
(1) Modern compiler implementation in C - Andrew W. Appel
--
Ing. Bart Vandewoestyne Bart.Vandewoestyne_at_pandora.be
Hugo Verrieststraat 48 GSM: +32 (0)478 397 697
B-8550 Zwevegem http://users.pandora.be/vandewoestyne
----------------------------------------------------------------------
"Any fool can know, the point is to understand." - Albert Einstein
Re: caller-save vs. callee-save registers
Author: Nicolas Barbier
Date: Sun, 08 Jun 2003 20:38
Date: Sun, 08 Jun 2003 20:38
81 lines
4541 bytes
4541 bytes
Bart Vandewoestyne wrote:
> Ik snap wel wat caller-save en callee-save registers zijn, maar mij is
> het niet echt duidelijk waarom dit onderscheid juist wordt gemaakt.
> In mijn handboek (1) worden 2 voorbeelden vermeld, het eerste gaat als
> volgt en denk ik nog te snappen:
>
> void h(int y) {
> int x;
> x = y+1;
> f(y);
> f(2);
> }
>
> Mijn boek zegt hier "If local variabele x is never live across a
> procedure call, it is properly kept in a caller-save register.
> Explain how doing this would speed up the program above."
>
> Het antwoord daarop is volgens mij dat aangezien de caller (zijnde h)
> hier weet dat x niet gebruikt wordt na het oproepen van f, dat je dan
> best x in een caller-save register stopt en dat je dan de caller dat
> register TOCH NIET laat saven en daarmee een store uitspaart. Mocht
> je x in een callee-save register gestopt hebben, dan zouden de twee
> oproepen van f telkens het register van x gesaved en teruggezet
> hebben.
>
> Maar nu komt mijn boek ook nog af met volgend voorbeeld:
>
> "If local variabele b is live across more than one procedure call, is
> it kept in a callee-save register? Explain how doing this would speed
> up the following program:"
Deze vraag is nogal dubbelzinnig, betekent "doing this" in de laatste vraag
"wat je doet volgens het antwoord op de eerste vraag" of "als het antwoord
op de eerste vraag ja is"?
> int f(int a) {
> int b;
> b = a +1;
> g();
> h(b);
> return b+2;
> }
>
> Hier wordt b dus wel nog gebruikt na het oproepen van g en h. Ik denk
> wel dat je b hier in een callee-save register moet stoppen, want op
> pag. 130 vermeld mijn boek: "..., if the caller has a local variabele
> i that is needed before and after several function calls, it may put i
> in some callee-save register r_i and, save r_i just once (upon entry
> to f) and fetch it back just once (before returning from f)."
>
> En dat snap ik nu eens niet goed se... Als je die b in een
> callee-save register stopt, dan zal toch telkens bij het oproepen van
> g en h dat register gesaved worden? M.a.w. dus extra veel fetches en
> stores? Zou je niet eerder moeten zeggen dat je b in een caller-save
> register moet stoppen omdat je het register van b dan maar 1 keer moet
> laten bewaren door de caller (f) en slechts 1 keer moet terugzetten
> vlak voor je returnt?
Ik zal hier eens even mijn ad hoc aangeleerde compiler-kennis gaan
bovenhalen ;-) :
Welke van deze twee het beste resultaat gaat opleveren hangt af van hoeveel
registers die "several functions calls" nodig hebben. Als die ooit het
callee-save register gaan storen, dan had je het even goed zelf kunnen doen
(dan doe je het gegarandeerd maar 1 keer) (en je stopt het dus in een
caller-save register), maar als ze het nooit nodig hebben, dan bespaar je
de store als je het in een callee-save register stopt.
Maw: gebruiken de opgeroepen functies weinig registers, stop je gegevens
dan in callee-save registers. Anders stop je ze in caller-save registers,
en je store't ze voordat je de functies oproept.
Als je niet aan "interprocedural" optimalisatie kan doen (omdat je de code
van de opgeroepen functies niet bij de hand hebt, bv omdat ze in een andere
compilatie-unit zitten), veronderstel ik dat de meeste compilers gaan
aannemen dat de opgeroepen functies veel registers gebruiken en daarom zo
veel mogelijk live variabelen in caller-save registers gaan stoppen.
--
Nicolas Barbier
Re: caller-save vs. callee-save registers
Author: Bart Vandewoestyne
Date: Sun, 08 Jun 2003 20:52
Date: Sun, 08 Jun 2003 20:52
51 lines
3811 bytes
3811 bytes
Nicolas Barbier wrote: > >>"If local variabele b is live across more than one procedure call, is >>it kept in a callee-save register? Explain how doing this would speed >>up the following program:" > > Deze vraag is nogal dubbelzinnig, betekent "doing this" in de laatste vraag > "wat je doet volgens het antwoord op de eerste vraag" of "als het antwoord > op de eerste vraag ja is"? Inderdaad... dubbelzinnigheid alom... bemerk dat ik dus die vraag wel degelijk NIET zelf heb geformuleerd he :-) > Ik zal hier eens even mijn ad hoc aangeleerde compiler-kennis gaan > bovenhalen ;-) : > > Welke van deze twee het beste resultaat gaat opleveren hangt af van hoeveel > registers die "several functions calls" nodig hebben. Als die ooit het > callee-save register gaan storen, dan had je het even goed zelf kunnen doen > (dan doe je het gegarandeerd maar 1 keer) (en je stopt het dus in een > caller-save register), maar als ze het nooit nodig hebben, dan bespaar je > de store als je het in een callee-save register stopt. > > Maw: gebruiken de opgeroepen functies weinig registers, stop je gegevens > dan in callee-save registers. Anders stop je ze in caller-save registers, > en je store't ze voordat je de functies oproept. > > Als je niet aan "interprocedural" optimalisatie kan doen (omdat je de code > van de opgeroepen functies niet bij de hand hebt, bv omdat ze in een andere > compilatie-unit zitten), veronderstel ik dat de meeste compilers gaan > aannemen dat de opgeroepen functies veel registers gebruiken en daarom zo > veel mogelijk live variabelen in caller-save registers gaan stoppen. Inderdaad, dat zal het zijn! Aan de hand van een mailtje naar een vriend kwam ik zo ook ongeveer tot die conclusie. Alles zal dus inderdaad afhangen van de callees... als deze het register van b niet blijken nodig te hebben omdat ze heel weinig registers gebruiken, dan kan je die b in een callee-save register stoppen en dan de callees toch geen store/fetch-werk laten doen omdat ze het reg van b toch niet nodig hebben. Blijkt echter dat het register van b ook zal nodig zijn voor de callees, dan zet je b denk ik ook best in een caller-save register, al zal het wschl niet veel verschil uitmaken dan... Ma ik had dus in mijn redenering niet gedacht aan de 'hoeveelheid' registers die de callees eventueel kunnen nodig hebben. Bedankt om me daar op te wijzen! Greetzzz, mc303
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads