avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] Strange Optimizing


From: Alex Wenger
Subject: [avr-gcc-list] Strange Optimizing
Date: Thu, 23 Sep 2004 17:31:31 +0200
User-agent: Mozilla Thunderbird 0.8 (Windows/20040913)

When i compile:


void cmd_write_ee()
{
        uint8_t size;
        uint8_t adr;
        
        adr = messageBuf[1];
        size = TWI_bufPtr-2;
    if (size > 8) return;   /// Parameter boundary check
        
        eeprom_write_block(messageBuf+2,adr,size);
}

-------------------------------------------------------

"gcc -Os -mcall-prologues" makes

-------------------------------------------------------
void cmd_write_ee()
{
        uint8_t size;
        uint8_t adr;
        
        adr = messageBuf[1];
 604:   20 91 45 01     lds     r18, 0x0145
        size = TWI_bufPtr-2;
 608:   80 91 39 01     lds     r24, 0x0139
 60c:   82 50           subi    r24, 0x02       ; 2
    if (size > 8) return;   /// Parameter boundary check
 60e:   89 30           cpi     r24, 0x09       ; 9
 610:   38 f4           brcc    .+14            ; 0x620
        
        eeprom_write_block(messageBuf+2,adr,size);
 612:   99 27           eor     r25, r25
 614:   33 27           eor     r19, r19
 616:   ac 01           movw    r20, r24
 618:   b9 01           movw    r22, r18
 61a:   86 e4           ldi     r24, 0x46       ; 70
 61c:   91 e0           ldi     r25, 0x01       ; 1
 61e:   07 d2           rcall   .+1038          ; 0xa2e
 620:   08 95           ret
 622:   08 95           ret

00000624 <cmd_read_ee>:
}

-------------------------------------------------------
- Why are there 2 rets on the end?
- Why is R25 cleared on 612?
- Why it first use R24 and R18 and then copy them to R20 and R22

hand corrected code:
-------------------------------------------------------

void cmd_write_ee()
{
        uint8_t size;
        uint8_t adr;
        
        adr = messageBuf[1];
 604:   20 91 45 01     lds     r22, 0x0145
        size = TWI_bufPtr-2;
 608:   80 91 39 01     lds     r20, 0x0139
 60c:   82 50           subi    r20, 0x02       ; 2
    if (size > 8) return;   /// Parameter boundary check
 60e:   89 30           cpi     r24, 0x09       ; 9
 610:   38 f4           brcc    .+14            ; 0x620
        
        eeprom_write_block(messageBuf+2,adr,size);
 612:   33 27           eor     r19, r19
 614:   86 e4           ldi     r24, 0x46       ; 70
 616:   91 e0           ldi     r25, 0x01       ; 1
 618:   07 d2           rcall   .+1038          ; 0xa2e
 61a:   08 95           ret
 61c:   08 95           ret

00000624 <cmd_read_ee>:
}

-------------------------------------------------------

saved 6 Bytes.....

BlueLoop


reply via email to

[Prev in Thread] Current Thread [Next in Thread]