Forum: Compiler & IDEs avr-gcc: Optimierung: mehrere RCALLs erzeugt


von N. G. (newgeneration) Benutzerseite


Lesenswert?

Hallo Forum,

Testcode:
1
extern uint8_t x;
2
extern void bar(const uint8_t *cmd);
3
4
void foo(void) {
5
  uint8_t cmd[6];
6
  cmd[0] = x;
7
  cmd[1] = 0x00;
8
  cmd[2] = 0x00;
9
  cmd[3] = 0x00;
10
  cmd[4] = 0x00;
11
  cmd[5] = 0xFF;
12
  bar(cmd);
13
}
wird mit avr-gcc -s -Os -mmcu=avr6
1
foo:
2
  push r28
3
  push r29
4
  rcall .            // !
5
  rcall .            // !
6
  in r28,__SP_L__
7
  in r29,__SP_H__
8
/* prologue: function */
9
/* frame size = 6 */
10
/* stack size = 8 */
11
.L__stack_usage = 8
12
  lds r24,x
13
  std Y+1,r24
14
  std Y+2,__zero_reg__
15
  std Y+3,__zero_reg__
16
  std Y+4,__zero_reg__
17
  std Y+5,__zero_reg__
18
  ldi r24,lo8(-1)
19
  std Y+6,r24
20
  movw r24,r28
21
  adiw r24,1
22
  call bar
23
/* epilogue start */
24
  adiw r28,6
25
  in __tmp_reg__,__SREG__
26
  cli
27
  out __SP_H__,r29
28
  out __SREG__,__tmp_reg__
29
  out __SP_L__,r28
30
  pop r29
31
  pop r28
32
  ret
33
  .ident  "GCC: (GNU) 5.3.1 20160106"

Wie man sieht werden im Prolog der Funktion 2x RCALL . erzeugt.

Ich kann mir das nicht erklären.

mit freundlichen Grüßen und frohe Weihnachten,
N.G.

von Bilch (Gast)


Lesenswert?

Einfach durch den Simulator steppen, dann siehst du schon was passiert.

von Rolf M. (rmagnus)


Lesenswert?

N. G. schrieb:
> Wie man sieht werden im Prolog der Funktion 2x RCALL . erzeugt.
>
> Ich kann mir das nicht erklären.

Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für 
dein lokales Array zu schaffen. Das dient der Optimierung der Codegröße, 
da es das mit lediglich zwei Instruktionen schafft. Alle anderen 
Möglichkeiten wären größer.

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Rolf M. schrieb:
> Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für
> dein lokales Array zu schaffen. Das dient der Optimierung der Codegröße,
> da es das mit lediglich zwei Instruktionen schafft. Alle anderen
> Möglichkeiten wären größer.

Ach so okay, danke!

Diese Möglichkeit kannte ich noch nicht.

Das wäre dann schon geklärt, so einfach kanns manchmal sein.

Danke und frohe Weihnachten
N.G.

von Peter D. (peda)


Lesenswert?

Rolf M. schrieb:
> Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für
> dein lokales Array zu schaffen.

Da gilt aber nur für den ATmega2560/1. Auf kleineren AVRs pusht RCALL 
nur 2 Byte.

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Rolf M. schrieb:
>> Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für
>> dein lokales Array zu schaffen.
>
> Da gilt aber nur für den ATmega2560/1. Auf kleineren AVRs pusht RCALL
> nur 2 Byte.

Ja, das gilt nur für AVRs mit der avr6-Architektur (alle mit 256kB 
Flash, z.B. auch der ATmega256rfr2), da diese einen PC von > 16bit (= 3 
Byte) haben.
Auf einem kleineren AVR mit nur 2 Byte Program Counter sind es auch 
wirklich 3x RCALLs.

von Rolf M. (rmagnus)


Lesenswert?

N. G. schrieb:
> Ja, das gilt nur für AVRs mit der avr6-Architektur

Du hattest ja geschickterweise erwähnt, dass sich um so einen handelt:

N. G. schrieb:
> wird mit avr-gcc -s -Os -mmcu=avr6

Ich hatte anfangs auch gedacht, dass da doch eigentlich noch 2 Bytes 
fehlen, und dann hab ich obige Zeile gesehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.