🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#4995
Author: Bart Vandewoestyne
Date: Sun, 08 Jun 2003 19:44
66 lines
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
#4997
Author: Nicolas Barbier
Date: Sun, 08 Jun 2003 20:38
81 lines
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
#4998
Author: Bart Vandewoestyne
Date: Sun, 08 Jun 2003 20:52
51 lines
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