Forum: Compiler & IDEs switch() Merkwürdigkeiten


von Peter D. (peda)


Lesenswert?

Ist schon jemandem aufgefallen, daß switch() R26 und R27 auf 0 setzt und
dann aber nirgends verwendet:

eor     r26, r26
eor     r27, r27


Ist mir auch erst im Interrupt aufgefallen, als da plötzlich soviele
Register gepusht wurden.


Peter

von Michael (Gast)


Lesenswert?

Das muß eine GCC-spezifische Sache sein. Hab eben mal in mein
IAR-Programm geschaut. Der macht das nicht.
Michael

von Peter D. (peda)


Lesenswert?

"Das muß eine GCC-spezifische Sache sein."

Ja stimmt, deshalb hab ichs ja im GCC-Forum geschrieben :-)

Um genau zu sein, es ist der AVR-GCC Version 3.3.2


Peter

von Jörg Wunsch (Gast)


Lesenswert?

Ein Register würde ich noch verstehen: der switch-Ausdruck wird als
`int' behandelt und daher auf 16 bits expandiert.  Es gibt (bislang)
keine Optimierung herauszufinden, ob das obere Byte dabei gar nicht
benötigt würde und daher ignoriert werden kann.

Zwei Register verstehe ich nicht wirklich.

von Peter D. (peda)


Lesenswert?

Hier nochmal der komplette Sprungcode:

    switch( cmd  ){
 3d4:   99 27           eor     r25, r25
 3d6:   aa 27           eor     r26, r26
 3d8:   bb 27           eor     r27, r27
 3da:   fc 01           movw    r30, r24
 3dc:   4e 97           sbiw    r24, 0x1e
 3de:   08 f0           brcs    .+2
 3e0:   7e c0           rjmp    .+252
 3e2:   ed 5c           subi    r30, 0xCD
 3e4:   ff 4f           sbci    r31, 0xFF
 3e6:   09 94           ijmp


R24 = cmd und R25 ist für die Erweiterung auf 16 Bit.


Peter

von MooseC (Gast)


Lesenswert?

kann ich nicht bestätigen

Compiler:   avr-gcc (GCC) 3.4.1


  95:be_cmd.c      ****
  96:be_cmd.c      **** UCHAR getaxisnumber(UCHAR c){
 185                 .LM7:
 186                 /* prologue: frame size=0 */
 187                 /* prologue end (size=0) */
  97:be_cmd.c      ****   switch( c ) {
 189                 .LM8:
 190 0028 9927          clr r25
 191 002a 8835          cpi r24,88
 192 002c 9105          cpc r25,__zero_reg__
 193 002e 71F0          breq .L10


MooseC

von Peter D. (peda)


Lesenswert?

Das tritt auch nur bei vielen "case" Anweisungen auf, wo es für den
Compiler effektiver ist, eine Sprungtabelle zu verwenden (ijmp).


Peter

von MooseC (Gast)


Lesenswert?

gebe ich Dir Recht...

1975:be_cmd.c      ****   switch( ascii_cmd[0] ) {
 5870                 .LM680:
 5871 20a4 892F          mov r24,r25
 5872 20a6 9927          clr r25
 5873 20a8 AA27          clr r26
 5874 20aa BB27          clr r27
 5875 20ac FC01          movw r30,r24
 5876 20ae B897          sbiw r30,40
 5877 20b0 E333          cpi r30,51
 5878 20b2 F105          cpc r31,__zero_reg__
 5879 20b4 08F0          brlo .+2
 5880 20b6 4FC0          rjmp .L497
 5881 20b8 E050          subi r30,lo8(-(pm(.L498)))


MooseC
 5882 20ba F040          sbci r31,hi8(-(pm(.L498)))
 5

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.