🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #4997

Re: caller-save vs. callee-save registers

#4997
From: 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
Technical Details
Message-ID: <3ee39eb1$0$6523$afc38c87@sisyphus.news.be.easynet.net>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-06!sn-xit-09!supernews.com!news.maxwell.syr.edu!easynet-monga!easynet.net!feed1.news.be.easynet.net!sisyphus.news.be.easynet.net!not-for-mail
References: <3EE3920E.6214CC7A@pandora.be>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,cf0ff94794bfc79f
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2003-06-08 13:38:24 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-06!sn-xit-09!supernews.com!news.maxwell.syr.edu!easynet-monga!easynet.net!feed1.news.be.easynet.net!sisyphus.news.be.easynet.net!not-for-mail
Message-ID: <3ee39eb1$0$6523$afc38c87@sisyphus.news.be.easynet.net>
From: Nicolas Barbier <anti@spam.invalid>
Subject: Re: caller-save vs. callee-save registers
Newsgroups: be.comp.programming
Date: Sun, 08 Jun 2003 22:38:07 +0200
References: <3EE3920E.6214CC7A@pandora.be>
User-Agent: KNode/0.6.1
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7Bit
Lines: 81
Organization: [ posted via Easynet Belgium ]
NNTP-Posting-Date: 08 Jun 2003 20:38:10 GMT
NNTP-Posting-Host: 213.193.182.23
X-Trace: 1055104690  6523 [::ffff:213.193.182.23]:34243
X-Complaints-To: abuse@be.easynet.net