Hallo Sprinter.
Danke für die ausfürliche Antwort.
Zu deinem Bsp.
Wieso muss GCC diese sichern? Das ganze geht ja auch ohne das sichern. Es geht doch auch add R22,R22 ?
Ich habe mal ein Beispiel, bei dem der GCC (für mich) unverständlich viel Pushed.
Code:
long foo(long a, long b, long c, uint8_t d){
if(d){
return a+b;
}else{
return a-c;
}
}
Nun das Listing:
Code:
long foo(long a, long b, long c, uint8_t d){
4e: cf 92 push r12 ;Alle unteren Register werden gepushed
50: ef 92 push r14 ;obwohl sie nicht verändert werden
52: ff 92 push r15 ;
54: 0f 93 push r16
56: 1f 93 push r17
if(d){
58: cc 20 and r12, r12
5a: 29 f0 breq .+10 ; 0x66 <foo+0x18>
return a+b;
5c: 62 0f add r22, r18
5e: 73 1f adc r23, r19
60: 84 1f adc r24, r20
62: 95 1f adc r25, r21
64: 04 c0 rjmp .+8 ; 0x6e <foo+0x20>
}else{
return a-c;
66: 6e 19 sub r22, r14
68: 7f 09 sbc r23, r15
6a: 80 0b sbc r24, r16
6c: 91 0b sbc r25, r17
6e: 1f 91 pop r17 ;und wieder restaurieren, obwohl sie
70: 0f 91 pop r16 ;unberührt sind...
72: ff 90 pop r15
74: ef 90 pop r14
76: cf 90 pop r12
78: 08 95 ret
GCC ist jedoch, obwohl er diese Eigenheit hat. einer der besten Compiler. Recursive funktionen macht er z.T. auch ohne Pushen. Sofern halt wieder die unteren Register nicht berührt werden.
Mir ist bewust, dass GCC die unteren Register nur zum Teil verwenden kann. Das ist doch aber kein Grund, diese zu Pushen, obwohl die nicht verändert werden. Kann man das dem GCC irgendwie abgewöhnen?
Grüße
Lesezeichen