avr-gcc: Optimierung: mehrere RCALLs erzeugt

Persönliche Seite #4840491
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.
#4840507
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.
Persönliche Seite #4840508
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.
Persönliche Seite #4840785
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren