X-Reportbug-Version: 3.18
X-Debbugs-Cc: [EMAIL PROTECTED]
Package: gcc-avr
Version: 1:4.1.0-1
Severity: important


This piece of code gets compiled incorrectly.
        SIGNAL(SIG_INTERRUPT0)
        {
           if (PIND & _BV(PD2))
           {
              low_period=TCNT1;
           }
           else
           {
              high_period=TCNT1;
           }
        }


The Makefile looks like:

        MCU:=atmega168
        CC:=avr-gcc
        OBJCOPY:=avr-objcopy
        CFLAGS:=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues 
-I/usr/avr/include -funroll-loops
        LDFLAGS:=-g -lc

        all:    $(TARGET)

        %.hex: %.out
                $(OBJCOPY) -R .eeprom -O ihex $< $@
        %.out: %.o
                $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -Wl,-Map,$(basename $<).map
        %.s: %.c
                $(CC) $(CFLAGS) -Os -S $<
        %.o: %.s
                $(CC) $(CFLAGS) -Os -c $<


The result is:
SIGNAL(SIG_INTERRUPT0)
{
 294:   1f 92           push    r1
 296:   0f 92           push    r0
 298:   0f b6           in      r0, 0x3f        ; 63
 29a:   0f 92           push    r0
 29c:   11 24           eor     r1, r1
 29e:   2f 93           push    r18
 2a0:   8f 93           push    r24
 2a2:   9f 93           push    r25
        if (PIND & _BV(PD2))
 2a4:   4a 9b           sbis    0x09, 2 ; 9
 2a6:   09 c0           rjmp    .+18            ; 0x2ba <__vector_1+0x26>
        {
                // now H
                high_period=TCNT1;
 2a8:   80 91 84 00     lds     r24, 0x0084
 2ac:   90 91 85 00     lds     r25, 0x0085
 2b0:   90 93 0c 01     sts     0x010C, r25
 2b4:   80 93 0b 01     sts     0x010B, r24
 2b8:   08 c0           rjmp    .+16            ; 0x2ca <__vector_1+0x36>
        }
        else
        {
                low_period=TCNT1;
 2ba:   20 91 84 00     lds     r18, 0x0084
 2be:   30 91 85 00     lds     r19, 0x0085
 2c2:   30 93 0e 01     sts     0x010E, r19
 2c6:   20 93 0d 01     sts     0x010D, r18
 2ca:   9f 91           pop     r25
 2cc:   8f 91           pop     r24
 2ce:   2f 91           pop     r18
 2d0:   0f 90           pop     r0
 2d2:   0f be           out     0x3f, r0        ; 63
 2d4:   0f 90           pop     r0
 2d6:   1f 90           pop     r1
 2d8:   18 95           reti


- r0, r1 are pushed/popped, r1 is zeroed.
  If 0x3f really needs to be saved, it could be done by 
  another register, which has to be used anyway.
  (or instead of (r18, r19, r24, r25) (r0,r1) should be used.)
- r19 is modified, but not saved
- this whole construct could be optimized very much better.
- -Os, as already used, is much better than without. -O7 or -O2 
  give the same result as -Os.


-- System Information:
Debian Release: testing/unstable
  APT prefers testing
  APT policy: (850, 'testing'), (600, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/dash
Kernel: Linux 2.6.15-1-k7
Locale: LANG=de_AT, LC_CTYPE=de_AT (charmap=ISO-8859-1)

Versions of packages gcc-avr depends on:
ii  binutils-avr                  2.16.1-1   Binary utilities that support Atme
ii  libc6                         2.3.6-7    GNU C Library: Shared libraries

gcc-avr recommends no packages.

-- no debconf information


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to