http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45263

--- Comment #8 from Michael Schulze <mschulze at ivs dot cs.ovgu.de> 2010-11-30 
15:21:57 UTC ---
Comment on attachment 22579
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22579
alternative patch using register r15 instead of r20 avoids pushing/poping

>diff -Naur gcc-4.5.1-orig/gcc/config/avr/libgcc.S 
>gcc-4.5.1/gcc/config/avr/libgcc.S
>--- gcc-4.5.1-orig/gcc/config/avr/libgcc.S     2009-05-23 09:16:07.000000000 
>+0200
>+++ gcc-4.5.1/gcc/config/avr/libgcc.S  2010-11-30 14:35:53.000000000 +0100
>@@ -792,21 +792,22 @@
> __do_global_ctors:
>       ldi     r17, hi8(__ctors_start)
>       ldi     r16, hh8(__ctors_start)
>-      ldi     r28, lo8(__ctors_end)
>+      ldi     r28, hh8(__ctors_end)
>+      mov     r15, r28
>+      ldi     r28, lo8(__ctors_end)
>       ldi     r29, hi8(__ctors_end)
>-      ldi     r20, hh8(__ctors_end)
>       rjmp    .L__do_global_ctors_start
> .L__do_global_ctors_loop:
>       sbiw    r28, 2
>-      sbc     r20, __zero_reg__
>+      sbc     r15, __zero_reg__
>       mov_h   r31, r29
>       mov_l   r30, r28
>-      out     __RAMPZ__, r20
>+      out     __RAMPZ__, r15
>       XCALL   __tablejump_elpm__
> .L__do_global_ctors_start:
>       cpi     r28, lo8(__ctors_start)
>       cpc     r29, r17
>-      cpc     r20, r16
>+      cpc     r15, r16
>       brne    .L__do_global_ctors_loop
> #else
> __do_global_ctors:
>@@ -833,21 +834,22 @@
> __do_global_dtors:
>       ldi     r17, hi8(__dtors_end)
>       ldi     r16, hh8(__dtors_end)
>+      ldi     r28, hh8(__dtors_start)
>+      mov     r15, r28
>       ldi     r28, lo8(__dtors_start)
>       ldi     r29, hi8(__dtors_start)
>-      ldi     r20, hh8(__dtors_start)
>       rjmp    .L__do_global_dtors_start
> .L__do_global_dtors_loop:
>       sbiw    r28, 2
>-      sbc     r20, __zero_reg__
>+      sbc     r15, __zero_reg__
>       mov_h   r31, r29
>       mov_l   r30, r28
>-      out     __RAMPZ__, r20
>+      out     __RAMPZ__, r15
>       XCALL   __tablejump_elpm__
> .L__do_global_dtors_start:
>       cpi     r28, lo8(__dtors_end)
>       cpc     r29, r17
>-      cpc     r20, r16
>+      cpc     r15, r16
>       brne    .L__do_global_dtors_loop
> #else
> __do_global_dtors:

Reply via email to