www.mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC Deoptimierung


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Funktion
char add(char a,char b)
{
  return a+b;
}
die mir die Summe der beiden Argumente liefert. Bei Optimierung 2,3,s 
erzeugt AVR-GCC das hier:
  35                  .global   _Z3addcc 
  37                  _Z3addcc: 
  38                  .LFB42: 
  39                  .LM1: 
  40                  /* prologue: frame size=0 */ 
  41                  /* prologue end (size=0) */ 
  42 0000 962F            mov r25,r22 
  43                  .LBB2: 
  44                  .LM2: 
  45 0002 980F            add r25,r24 
  46                  .LBE2: 
  47                  .LM3: 
  48 0004 892F            mov r24,r25 
  49 0006 9927            clr r25 
  50                  /* epilogue: frame size=0 */ 
  51 0008 0895            ret
R22 wird zuerst nach r25 kopiert, mit r24 addiert und das Ergebnis dann 
nach r24 kopiert. Nicht gerade der beste Weg, um r24 mit r22 zu 
addieren.

Das richtig abartige kommt aber bei Optimierung 0:
  32                  .global   _Z3addcc 
  34                  _Z3addcc: 
  35                  .LFB42: 
  36                  .LM1: 
  37                  /* prologue: frame size=2 */ 
  38 0000 CF93            push r28 
  39 0002 DF93            push r29 
  40 0004 CDB7            in r28,__SP_L__ 
  41 0006 DEB7            in r29,__SP_H__ 
  42 0008 2297            sbiw r28,2 
  43 000a 0FB6            in __tmp_reg__,__SREG__ 
  44 000c F894            cli 
  45 000e DEBF            out __SP_H__,r29 
  46 0010 0FBE            out __SREG__,__tmp_reg__ 
  47 0012 CDBF            out __SP_L__,r28 
  48                  /* prologue end (size=10) */ 
  49 0014 8983            std Y+1,r24 
  50 0016 6A83            std Y+2,r22 
  51                  .LBB2: 
  52                  .LM2: 
  53 0018 9981            ldd r25,Y+1 
  54 001a 8A81            ldd r24,Y+2 
  55 001c 890F            add r24,r25 
  56 001e 9927            clr r25 
  57                  .LBE2: 
  58                  /* epilogue: frame size=2 */ 
  59 0020 2296            adiw r28,2 
  60 0022 0FB6            in __tmp_reg__,__SREG__ 
  61 0024 F894            cli 
  62 0026 DEBF            out __SP_H__,r29 
  63 0028 0FBE            out __SREG__,__tmp_reg__ 
  64 002a CDBF            out __SP_L__,r28 
  65 002c DF91            pop r29 
  66 002e CF91            pop r28 
  67 0030 0895            ret
Da wird anscheinend der Stackpointer manuell de-/inkrementiert.

Bei Opt. 1 kommt aber die einzig anständige Lösung:
  32                  .global   _Z3addcc 
  34                  _Z3addcc: 
  35                  .LFB42: 
  36                  .LM1: 
  37                  /* prologue: frame size=0 */ 
  38                  /* prologue end (size=0) */ 
  39                  .LBB2: 
  40                  .LM2: 
  41 0000 860F            add r24,r22 
  42                  .LBE2: 
  43                  .LM3: 
  44 0002 9927            clr r25 
  45                  /* epilogue: frame size=0 */ 
  46 0004 0895            ret
Kann mir bitte jemand erklären, wieso der GCC bei Opt 0,2,3,s solche 
"Deoptimierungen" durchführt?

MfG Mark

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das richtig abartige kommt aber bei Optimierung 0:

Nur zur Info: "Optimierung 0", also das Flag -O0, bedeutet "optimiere 
gar nicht". Ist also kein Wunder dass der Code dann etwas umständlicher 
aussieht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.