avr-gcc: Optimierung von Addition uint8_t + int8_t

Gast #4776974
Lesenswert?

Hallo,

mir ist gerade aufgefallen, dass avr-g++ (im Gegensatz zu avr-gcc) 
folgendes nicht durchoptimiert:
1
volatile signed char s;
2
volatile unsigned char i;
3
int main() {
4
  s += i;
5
}


avr-g++ macht daraus:
1
volatile signed char s;
2
volatile unsigned char i;
3
int main() {
4
  s += i;
5
  7c:  80 91 60 00   lds  r24, 0x0060  ; 0x800060 <_edata>
6
  80:  20 91 61 00   lds  r18, 0x0061  ; 0x800061 <s>
7
  84:  90 e0         ldi  r25, 0x00  ; 0
8
  86:  82 0f         add  r24, r18
9
  88:  91 1d         adc  r25, r1
10
  8a:  27 fd         sbrc  r18, 7
11
  8c:  9a 95         dec  r25
12
  8e:  80 93 61 00   sts  0x0061, r24  ; 0x800061 <s>
13
  for (;;) {
14

15
  }

avr-gcc dagegen optimiert das obere Byte weg:
1
volatile signed char s;
2
volatile unsigned char i;
3
int main() {
4
  s += i;
5
  7c:  80 91 60 00   lds  r24, 0x0060  ; 0x800060 <_edata>
6
  80:  90 91 61 00   lds  r25, 0x0061  ; 0x800061 <s>
7
  84:  89 0f         add  r24, r25
8
  86:  80 93 61 00   sts  0x0061, r24  ; 0x800061 <s>
9
}
Vermutlich greift ein Pattern nicht beim Optimieren.

Ich schreibs hierher, da ich z.Zt. keine Möglichkeit habe, mich auf dem 
Bugzilla anzumelden und es bis dahin sicher wieder vergessen habe...

Danke und Grüße,
Nase

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