Article View: be.comp.programming
Article #4997Re: caller-save vs. callee-save registers
From: 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
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-mailReferences:
<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