Hi all,

OK fine I agree.

we have to use 'volatile' and all.

But why must it generate such horrid code...
(I reproduce the comparison again below to get the *real* issue into focus)

The compiler output with the 'correct' code ('volatile' used):
//---------------------------------------------------
void delay(unsigned int del_cnt)
     {
   2aa: cf 93           push    r28
   2ac: df 93           push    r29
   2ae: cd b7           in      r28, 0x3d       ; 61
   2b0: de b7           in      r29, 0x3e       ; 62
   2b2: 22 97           sbiw    r28, 0x02       ; 2
   2b4: 0f b6           in      r0, 0x3f        ; 63
   2b6: f8 94           cli                     ;<-----disabling interrupts? 
Why?
   2b8: de bf           out     0x3e, r29       ; 62
   2ba: 0f be           out     0x3f, r0        ; 63
   2bc: cd bf           out     0x3d, r28       ; 61
        volatile unsigned int n = del_cnt;
   2be: 9a 83           std     Y+2, r25        ; 0x02
   2c0: 89 83           std     Y+1, r24        ; 0x01
        while(n--);
   2c2: 89 81           ldd     r24, Y+1        ; 0x01
   2c4: 9a 81           ldd     r25, Y+2        ; 0x02
   2c6: 01 97           sbiw    r24, 0x01       ; 1
   2c8: 9a 83           std     Y+2, r25        ; 0x02
   2ca: 89 83           std     Y+1, r24        ; 0x01
   2cc: 89 81           ldd     r24, Y+1        ; 0x01
   2ce: 9a 81           ldd     r25, Y+2        ; 0x02
   2d0: 8f 5f           subi    r24, 0xFF       ; 255
   2d2: 9f 4f           sbci    r25, 0xFF       ; 255
   2d4: b1 f7           brne    .-20            ; 0x2c2 <delay+0x18>
   2d6: 22 96           adiw    r28, 0x02       ; 2
   2d8: 0f b6           in      r0, 0x3f        ; 63
   2da: f8 94           cli
   2dc: de bf           out     0x3e, r29       ; 62
   2de: 0f be           out     0x3f, r0        ; 63
   2e0: cd bf           out     0x3d, r28       ; 61
   2e2: df 91           pop     r29
   2e4: cf 91           pop     r28
   2e6: 08 95           ret

        return;
     }
//=======================

Output of the older -WinAVR-20060421-version (with the alleged 'wrong' C code)
>> //==========================================
>> void delay(word cnt)
>>     {
>>        while(cnt--);
>>   286:       01 97           sbiw    r24, 0x01       ; 1
>>   288:       2f ef           ldi     r18, 0xFF       ; 255
>>   28a:       8f 3f           cpi     r24, 0xFF       ; 255
>>   28c:       92 07           cpc     r25, r18
>>   28e:       d9 f7           brne    .-10            ; 0x286 <delay>
>>   290:       08 95           ret
>>          return;
>>     }
>> //=======================================
>>

So which is the right output we want? Obviously the second.

Agreed not using 'volatile' optimises the code to a mere 'ret'. I'm ok with 
that.

But should'nt the 'correct' code produce the same output (the shorter version 
above)??

Thanks,

--Royce.



-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/


_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to