switch() Merkwürdigkeiten

Gast #178652
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.
OP #178653
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
Gast #178654
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
Gast #178656
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

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