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: