Forum: Compiler & IDEs avr-gcc: Optimierung von Addition uint8_t + int8_t


von Nase (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Vermutlich PR77353.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Welche Compilerversion?

Mit avr-gcc bzw. avr-g++ 6.2.0 wird die Addition beiden Fällen nur
8 Bit breit ausgeführt.

von Nase (Gast)


Lesenswert?

Ich nehm alles zurück, es stand versehentlich die 4.9er-Toolchain im 
$PATH.

Die Optimierungsergebnisse von 4.9 auf 6.2 sind überwältigend -- eine 
16-Bit-FFT in 128 Punkten, programmiert in C, kommt von 30ms runter auf 
20ms bei 4MHz - das ist 0,3ms langsamer, als das mühselig handgestrickte 
Assembly von Elm-Chan[1]...


[1] http://elm-chan.org/works/akilcd/report_e.html

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.