]> git.pld-linux.org Git - packages/crossavr-gcc.git/commitdiff
- synchronized patches with official AVR toolchain 3.4.1.830
authorPiotr Ziecik <kosmo@angel.net.pl>
Fri, 18 Jan 2013 21:07:05 +0000 (22:07 +0100)
committerPiotr Ziecik <kosmo@angel.net.pl>
Fri, 18 Jan 2013 21:07:05 +0000 (22:07 +0100)
42 files changed:
302-gcc-avrtiny10.patch
307-gcc-avrtc536.patch [new file with mode: 0644]
308-gcc-avrtc537.patch [new file with mode: 0644]
410-gcc-atxmega128a4u.patch
411-gcc-atxmega64d4.patch
412-gcc-atmega164pa_168pa_32a_64a.patch
413-gcc-atxmega64_128_b3.patch
414-gcc-atxmega64b1.patch
415-gcc-atmega_8a_128a_1284.patch
416-gcc-atxmega64a4u.patch
417-gcc-atxmega128d4.patch
418-gcc-atmxt336s.patch
419-gcc-atxmega16c4_32c4_128c3_256c3.patch
420-gcc-atxmega384d3.patch
421-gcc-atmega48hvf.patch
422-gcc-atmega26hvg.patch
423-gcc-atmxt224_224e.patch
424-gcc-atxmega192c3.patch
425-gcc-atmxt112sl.patch
426-gcc-atxmega64c3.patch
427-gcc-ata6285_6286.patch
428-gcc-attiny828.patch
429-gcc-ata5790_5790n_5795.patch
430-gcc-ata5272_ata5505.patch
431-gcc-atmxt540s.patch [new file with mode: 0644]
432-gcc-ata5831.patch [new file with mode: 0644]
433-gcc-attiny841.patch [moved from 409-gcc-attiny80.patch with 54% similarity]
434-gcc-atxmega32_16_8e5.patch [new file with mode: 0644]
501-gcc-avrtiny10-bug-12510.patch
503-gcc-bug13789.patch
504-gcc-conditional-register.patch
506-gcc-avrtc541.patch [new file with mode: 0644]
507-gcc-avrtc-518.patch [new file with mode: 0644]
508-gcc-avrtc514-tiny.patch [new file with mode: 0644]
509-gcc-AVRTC-544-call-used-registers-tiny10.patch [new file with mode: 0644]
510-gcc-avrtc496-tiny.patch [new file with mode: 0644]
511-gcc-avrtc539-backported.patch [new file with mode: 0644]
512-gcc-avrtc542.patch [new file with mode: 0644]
513-gcc-avrtc556-tiny-same-base-and-dest.patch [new file with mode: 0644]
514-gcc-avrtc558.patch [new file with mode: 0644]
515-gcc-avrtc446.patch [new file with mode: 0644]
crossavr-gcc.spec

index 98ed7ff17b1cd6ea5f96fe90ec7c638a8f195df6..2bab2a4a0bbe18d1dc3fac683dc3e736dad52f81 100644 (file)
@@ -217,7 +217,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +                                              AS2 (ld,__tmp_reg__,Y+)     CR_TAB
 +                              AS2 (ld,%B0,Y)         CR_TAB
 +                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
-+                                              AS2 (subi,%B2,hi8(%o1+1)) CR_TAB
++                                              AS2 (sbci,%B2,hi8(%o1+1)) CR_TAB
 +                                              AS2 (mov,%A0,__tmp_reg__))
 +                                       :  (AS2 (ldd,__tmp_reg__,%A1) CR_TAB
 +                              AS2 (ldd,%B0,%B1)         CR_TAB
@@ -228,7 +228,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +                                              AS2 (ld,__tmp_reg__,Z+)     CR_TAB
 +                              AS2 (ld,%B0,Z)         CR_TAB
 +                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
-+                                              AS2 (subi,%B2,hi8(%o1+1)) CR_TAB
++                                              AS2 (sbci,%B2,hi8(%o1+1)) CR_TAB
 +                                              AS2 (mov,%A0,__tmp_reg__))
 +                                       :  (AS2 (ldd,__tmp_reg__,%A1) CR_TAB
                  AS2 (ldd,%B0,%B1)         CR_TAB
@@ -246,7 +246,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +                                              AS2 (ld,%A0,Y+)             CR_TAB
 +                              AS2 (ld,%B0,Y)               CR_TAB
 +                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
-+                                              AS2 (subi,%B2,hi8(%o1+1)))
++                                              AS2 (sbci,%B2,hi8(%o1+1)))
 +                                       :  (AS2 (ldd,%A0,%A1) CR_TAB
 +                              AS2 (ldd,%B0,%B1));
 +        if(REGNO(op[2]) == REG_Z)
@@ -255,7 +255,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +                                              AS2 (ld,%A0,Z+)             CR_TAB
 +                              AS2 (ld,%B0,Z)              CR_TAB
 +                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
-+                                              AS2 (subi,%B2,hi8(%o1+1)))
++                                              AS2 (sbci,%B2,hi8(%o1+1)))
 +                                       :  (AS2 (ldd,%A0,%A1) CR_TAB
              AS2 (ldd,%B0,%B1));
 +      
@@ -571,7 +571,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +
 +              if(REGNO(op[2]) == REG_Y)
 +        return *l=5, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
-+                                              AS2 (subi,%B2,hi8(-(%o1)))   CR_TAB
++                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
 +                              AS2 (ld,%A0,Y+)               CR_TAB
 +                              AS2 (ld,%B0,Y+)               CR_TAB
 +                              AS2 (ld,__tmp_reg__,Y+)       CR_TAB
@@ -587,7 +587,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 -      return *l=4, (AS2 (ldd,%A0,%A1) CR_TAB
 +              if(REGNO(op[2]) == REG_Z)
 +        return *l=5, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
-+                                              AS2 (subi,%B2,hi8(-(%o1)))   CR_TAB
++                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
 +                              AS2 (ld,%A0,Z+)              CR_TAB
 +                              AS2 (ld,%B0,Z+)              CR_TAB
 +                              AS2 (ld,__tmp_reg__,Z+)      CR_TAB
@@ -604,7 +604,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +                      op[2] = XEXP(base, 0);
 +              if(REGNO(op[2]) == REG_Y)
 +        return *l=4, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
-+                                              AS2 (subi,%B2,hi8(-(%o1)))   CR_TAB
++                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
 +                              AS2 (ld,%A0,Y+)               CR_TAB
 +                              AS2 (ld,%B0,Y+)               CR_TAB
 +                              AS2 (ld,%C0,Y+)               CR_TAB
@@ -617,7 +617,7 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +                        AS2 (ldd,%D0,%D1));
 +              if(REGNO(op[2]) == REG_Z)
 +        return *l=4, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
-+                                              AS2 (subi,%B2,hi8(-(%o1)))   CR_TAB
++                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
 +                              AS2 (ld,%A0,Z+)               CR_TAB
 +                              AS2 (ld,%B0,Z+)               CR_TAB
 +                              AS2 (ld,%C0,Z+)               CR_TAB
@@ -1203,8 +1203,8 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
 +                                   : (AS2 (std,%B0,%B1)    CR_TAB
                      AS2 (std,%A0,%A1));
 +              if(REGNO(op[2]) == REG_Z)
-+        return *l=2, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0+1)))    CR_TAB
-+                                              AS2 (sbci,%B2,hi8(-(%o0+1)))    CR_TAB
++        return *l=2, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0+2)))    CR_TAB
++                                              AS2 (sbci,%B2,hi8(-(%o0+2)))    CR_TAB
 +                                              AS2 (st,-Z,%B1)                  CR_TAB
 +                        AS2 (st,-Z,%A1)                  CR_TAB
 +                        AS2 (subi,%A2,lo8(%o0))    CR_TAB
diff --git a/307-gcc-avrtc536.patch b/307-gcc-avrtc536.patch
new file mode 100644 (file)
index 0000000..e520a9d
--- /dev/null
@@ -0,0 +1,28 @@
+diff -Naurp gcc/config/avr/avr-c.c gcc/config/avr/avr-c.c
+--- gcc/config/avr/avr-c.c     2012-05-30 14:46:12.000000000 +0530
++++ gcc/config/avr/avr-c.c     2012-06-06 13:00:15.000000000 +0530
+@@ -95,8 +95,22 @@ avr_cpu_cpp_builtins (struct cpp_reader 
+     }
+   if (avr_current_arch->avrtiny)
+-      {
++    {
+       cpp_define (pfile, "__AVR_TINY__");
+-      }
++
++      /*
++      Define macro "__AVR_TINY_PM_BASE_ADDRESS__" with mapped program memory
++      start address. This macro shall be referred where mapped program memory
++      is accessed. (Eg. copying data section (do_copy_data) contents to data
++      memory region.
++      NOTE:
++      Program memory of AVR_TINY devices can not be accessed directly, it has
++      been mapped to the data memory. For AVR_TINY devices (ATtiny4/ 5/ 9/ 10/
++      20 and 40) mapped program memory starts at 0x4000.
++      */
++      cpp_define (pfile, "__AVR_TINY_PM_BASE_ADDRESS__=0x4000");
++    }
++
++
+ }
diff --git a/308-gcc-avrtc537.patch b/308-gcc-avrtc537.patch
new file mode 100644 (file)
index 0000000..676a892
--- /dev/null
@@ -0,0 +1,31 @@
+diff -Naurp gcc/config/avr/libgcc.S gcc/config/avr/libgcc.S
+--- gcc/config/avr/libgcc.S    2012-05-29 16:32:53.000000000 +0530
++++ gcc/config/avr/libgcc.S    2012-06-04 18:31:55.000000000 +0530
+@@ -782,7 +782,26 @@ __tablejump__:
+ #endif /* defined (L_tablejump) */
+ #endif
+-#if !defined(__AVR_TINY__)
++#if defined(__AVR_TINY__)
++#ifdef L_copy_data
++        .section .init4,"ax",@progbits
++        .global __do_copy_data
++__do_copy_data:
++        ldi     r18, hi8(__data_end)
++        ldi     r26, lo8(__data_start)
++        ldi     r27, hi8(__data_start)
++        ldi     r30, lo8(__data_load_start + __AVR_TINY_PM_BASE_ADDRESS__)
++        ldi     r31, hi8(__data_load_start + __AVR_TINY_PM_BASE_ADDRESS__)
++        rjmp    .L__do_copy_data_start
++.L__do_copy_data_loop:
++        ld      r19, z+
++        st      X+, r19
++.L__do_copy_data_start:
++        cpi     r26, lo8(__data_end)
++        cpc     r27, r18
++        brne    .L__do_copy_data_loop
++#endif
++#else
+ #ifdef L_copy_data
+       .section .init4,"ax",@progbits
+       .global __do_copy_data
index 0f5be09db3fd1fb3281206b270f3d508d3f6c987..000880e4b08bad25c2e7c7bb6cfa1681d02a8cd1 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 11:55:44.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 12:00:41.000000000 +0530
-@@ -295,6 +295,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -294,6 +294,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "avrxmega7",    ARCH_AVRXMEGA7, NULL,                           0, 0x2000, "x128a1" },
    { "atxmega128a1", ARCH_AVRXMEGA7, "__AVR_ATxmega128A1__",         0, 0x2000, "x128a1" },
    { "atxmega128a1u", ARCH_AVRXMEGA7, "__AVR_ATxmega128A1U__",       0, 0x2000, "x128a1u" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 11:55:44.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 12:00:41.000000000 +0530
-@@ -299,6 +299,7 @@ MULTILIB_MATCHES = \
+@@ -298,6 +298,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega6=mmcu?atxmega384c3 \
        mmcu?avrxmega7=mmcu?atxmega128a1 \
        mmcu?avrxmega7=mmcu?atxmega128a1u \
index 320397d786b9ba2333ed926634c96181126b81ae..d1f625d09a4bef9664d83c1b08dd6c80fc3115e6 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 12:00:41.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 12:06:09.000000000 +0530
-@@ -272,6 +272,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -271,6 +271,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega64a3",  ARCH_AVRXMEGA4, "__AVR_ATxmega64A3__",          0, 0x2000, "x64a3" },
    { "atxmega64a3u", ARCH_AVRXMEGA4, "__AVR_ATxmega64A3U__",         0, 0x2000, "x64a3u"},
    { "atxmega64d3",  ARCH_AVRXMEGA4, "__AVR_ATxmega64D3__",          0, 0x2000, "x64d3" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 12:00:41.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 12:04:00.000000000 +0530
-@@ -282,6 +282,7 @@ MULTILIB_MATCHES = \
+@@ -281,6 +281,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega4=mmcu?atxmega64a3 \
        mmcu?avrxmega4=mmcu?atxmega64a3u \
        mmcu?avrxmega4=mmcu?atxmega64d3 \
index 0a08fe80545439c7b30ed4c415a791d2e6582d81..6d07827b3b55ea3933d19395e92dfa03a99ee3d9 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 12:06:09.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 12:15:49.000000000 +0530
-@@ -147,6 +147,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -146,6 +146,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atmega163",            ARCH_AVR5, "__AVR_ATmega163__",         0, 0x0060, "m163" },
    { "atmega164a",           ARCH_AVR5, "__AVR_ATmega164A__",        0, 0x0100, "m164a" },
    { "atmega164p",           ARCH_AVR5, "__AVR_ATmega164P__",        0, 0x0100, "m164p" },
@@ -9,7 +9,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "atmega165",            ARCH_AVR5, "__AVR_ATmega165__",         0, 0x0100, "m165" },
    { "atmega165a",           ARCH_AVR5, "__AVR_ATmega165A__",        0, 0x0100, "m165a" },
    { "atmega165p",           ARCH_AVR5, "__AVR_ATmega165P__",        0, 0x0100, "m165p" },
-@@ -154,6 +155,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -153,6 +154,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atmega168",            ARCH_AVR5, "__AVR_ATmega168__",         0, 0x0100, "m168" },
    { "atmega168a",           ARCH_AVR5, "__AVR_ATmega168A__",        0, 0x0100, "m168a" },
    { "atmega168p",           ARCH_AVR5, "__AVR_ATmega168P__",        0, 0x0100, "m168p" },
@@ -17,7 +17,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "atmega169",            ARCH_AVR5, "__AVR_ATmega169__",         0, 0x0100, "m169" },
    { "atmega169a",           ARCH_AVR5, "__AVR_ATmega169A__",        0, 0x0100, "m169a" },
    { "atmega169p",           ARCH_AVR5, "__AVR_ATmega169P__",        0, 0x0100, "m169p" },
-@@ -164,6 +166,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -163,6 +165,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atmega16m1",           ARCH_AVR5, "__AVR_ATmega16M1__",        0, 0x0100, "m16m1" },
    { "atmega16u4",           ARCH_AVR5, "__AVR_ATmega16U4__",        0, 0x0100, "m16u4" },
    { "atmega32",             ARCH_AVR5, "__AVR_ATmega32__",          0, 0x0060, "m32" },
@@ -25,7 +25,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "atmega323",            ARCH_AVR5, "__AVR_ATmega323__",         0, 0x0060, "m323" },
    { "atmega324a",           ARCH_AVR5, "__AVR_ATmega324A__",        0, 0x0100, "m324a" },
    { "atmega324p",           ARCH_AVR5, "__AVR_ATmega324P__",        0, 0x0100, "m324p" },
-@@ -192,6 +195,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -191,6 +194,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atmega32u6",           ARCH_AVR5, "__AVR_ATmega32U6__",        0, 0x0100, "m32u6" },
    { "atmega406",            ARCH_AVR5, "__AVR_ATmega406__",         0, 0x0100, "m406" },
    { "atmega64",             ARCH_AVR5, "__AVR_ATmega64__",          0, 0x0100, "m64" },
@@ -36,7 +36,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 12:04:00.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 12:15:49.000000000 +0530
-@@ -178,6 +178,7 @@ MULTILIB_MATCHES = \
+@@ -177,6 +177,7 @@ MULTILIB_MATCHES = \
        mmcu?avr5=mmcu?atmega163 \
        mmcu?avr5=mmcu?atmega164a \
        mmcu?avr5=mmcu?atmega164p \
@@ -44,7 +44,7 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avr5=mmcu?atmega165 \
        mmcu?avr5=mmcu?atmega165a \
        mmcu?avr5=mmcu?atmega165p \
-@@ -185,11 +186,13 @@ MULTILIB_MATCHES = \
+@@ -184,11 +185,13 @@ MULTILIB_MATCHES = \
        mmcu?avr5=mmcu?atmega168 \
        mmcu?avr5=mmcu?atmega168a \
        mmcu?avr5=mmcu?atmega168p \
@@ -58,7 +58,7 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avr5=mmcu?atmega323 \
        mmcu?avr5=mmcu?atmega324a \
        mmcu?avr5=mmcu?atmega324p \
-@@ -216,6 +219,7 @@ MULTILIB_MATCHES = \
+@@ -215,6 +218,7 @@ MULTILIB_MATCHES = \
        mmcu?avr5=mmcu?atmega64rfa2 \
        mmcu?avr5=mmcu?atmega64rfr2 \
        mmcu?avr5=mmcu?atmega64  \
index 3f3bb548b43f47262ec8660f988621fe75b67b7a..63a414b4d4dc57f9b8b659c64b6e3ad10debe479 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 12:15:49.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 14:31:05.000000000 +0530
-@@ -275,6 +275,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -274,6 +274,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "avrxmega4",    ARCH_AVRXMEGA4, NULL,                           0, 0x2000, "x64d3" },
    { "atxmega64a3",  ARCH_AVRXMEGA4, "__AVR_ATxmega64A3__",          0, 0x2000, "x64a3" },
    { "atxmega64a3u", ARCH_AVRXMEGA4, "__AVR_ATxmega64A3U__",         0, 0x2000, "x64a3u"},
@@ -9,7 +9,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "atxmega64d3",  ARCH_AVRXMEGA4, "__AVR_ATxmega64D3__",          0, 0x2000, "x64d3" },
    { "atxmega64d4",  ARCH_AVRXMEGA4, "__AVR_ATxmega64D4__",          0, 0x2000, "x64d4" },
      /* Xmega, > 64K, <= 128K FLASH, > 64K RAM.  */
-@@ -286,6 +287,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -285,6 +286,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega128a3", ARCH_AVRXMEGA6, "__AVR_ATxmega128A3__",         0, 0x2000, "x128a3" },
    { "atxmega128a3u",ARCH_AVRXMEGA6, "__AVR_ATxmega128A3U__",        0, 0x2000, "x128a3u"},
    { "atxmega128b1", ARCH_AVRXMEGA6, "__AVR_ATxmega128B1__",         0, 0x2000, "x128b1" },
@@ -20,7 +20,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 12:15:49.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 14:31:05.000000000 +0530
-@@ -285,6 +285,7 @@ MULTILIB_MATCHES = \
+@@ -284,6 +284,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega2=mmcu?atxmega32x1 \
        mmcu?avrxmega4=mmcu?atxmega64a3 \
        mmcu?avrxmega4=mmcu?atxmega64a3u \
@@ -28,7 +28,7 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avrxmega4=mmcu?atxmega64d3 \
        mmcu?avrxmega4=mmcu?atxmega64d4 \
        mmcu?avrxmega5=mmcu?atxmega64a1 \
-@@ -292,6 +293,7 @@ MULTILIB_MATCHES = \
+@@ -291,6 +292,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega6=mmcu?atxmega128a3 \
        mmcu?avrxmega6=mmcu?atxmega128a3u \
        mmcu?avrxmega6=mmcu?atxmega128b1 \
index 8a65026b88bd62c97949eafcb172f275efd3488c..12302b3628e5c4a98982641d47282d8f4dc9cfef 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 14:31:05.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 14:34:49.000000000 +0530
-@@ -275,6 +275,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -274,6 +274,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "avrxmega4",    ARCH_AVRXMEGA4, NULL,                           0, 0x2000, "x64d3" },
    { "atxmega64a3",  ARCH_AVRXMEGA4, "__AVR_ATxmega64A3__",          0, 0x2000, "x64a3" },
    { "atxmega64a3u", ARCH_AVRXMEGA4, "__AVR_ATxmega64A3U__",         0, 0x2000, "x64a3u"},
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 14:31:05.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 14:34:49.000000000 +0530
-@@ -285,6 +285,7 @@ MULTILIB_MATCHES = \
+@@ -284,6 +284,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega2=mmcu?atxmega32x1 \
        mmcu?avrxmega4=mmcu?atxmega64a3 \
        mmcu?avrxmega4=mmcu?atxmega64a3u \
index 98c9d40d43620990a6fa33f238674fcd43655f9c..034f66409f79c1a391b7bd2d68583283d96dc9fa 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 14:34:49.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 14:39:27.000000000 +0530
-@@ -118,6 +118,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -117,6 +117,7 @@ const struct mcu_type_s avr_mcu_types[] 
      /* Enhanced, <= 8K + 2-byte PC + { MOVW/LPMX, MUL }.  */
    { "avr4",                 ARCH_AVR4, NULL,                        0, 0x0060, "m8" },
    { "atmega8",              ARCH_AVR4, "__AVR_ATmega8__",           0, 0x0060, "m8" },
@@ -9,7 +9,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "atmega48",             ARCH_AVR4, "__AVR_ATmega48__",          0, 0x0100, "m48" },
    { "atmega48a",            ARCH_AVR4, "__AVR_ATmega48A__",         0, 0x0100, "m48a" },
    { "atmega48pa",           ARCH_AVR4, "__AVR_ATmega48PA__",        0, 0x0100, "m48pa" },
-@@ -242,8 +243,10 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -241,8 +242,10 @@ const struct mcu_type_s avr_mcu_types[] 
         { MOVW/LPMX, JMP/CALL, MUL, ELPM, ELPMX }.  */
    { "avr51",                ARCH_AVR51, NULL,                       0, 0x0100, "m128" },
    { "atmega128",            ARCH_AVR51, "__AVR_ATmega128__",        0, 0x0100, "m128" },
@@ -23,7 +23,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 14:55:08.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 14:52:10.000000000 +0530
-@@ -157,6 +157,7 @@ MULTILIB_MATCHES = \
+@@ -156,6 +156,7 @@ MULTILIB_MATCHES = \
        mmcu?avr4=mmcu?atmega48pa \
        mmcu?avr4=mmcu?atmega48p \
        mmcu?avr4=mmcu?atmega8 \
@@ -31,7 +31,7 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avr4=mmcu?atmega8515 \
        mmcu?avr4=mmcu?atmega8535 \
        mmcu?avr4=mmcu?atmega88 \
-@@ -263,8 +264,10 @@ MULTILIB_MATCHES = \
+@@ -262,8 +263,10 @@ MULTILIB_MATCHES = \
        mmcu?avr5=mmcu?at94k \
        mmcu?avr5=mmcu?m3000 \
        mmcu?avr51=mmcu?atmega128 \
index 03dde6b8b0486269b4334b190407d0396be24621..7c997d11ac9dff9ca28142a3b7a56cfceb2923f1 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 14:39:27.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 14:59:12.000000000 +0530
-@@ -278,6 +278,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -277,6 +277,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "avrxmega4",    ARCH_AVRXMEGA4, NULL,                           0, 0x2000, "x64d3" },
    { "atxmega64a3",  ARCH_AVRXMEGA4, "__AVR_ATxmega64A3__",          0, 0x2000, "x64a3" },
    { "atxmega64a3u", ARCH_AVRXMEGA4, "__AVR_ATxmega64A3U__",         0, 0x2000, "x64a3u"},
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 14:52:10.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 14:59:12.000000000 +0530
-@@ -288,6 +288,7 @@ MULTILIB_MATCHES = \
+@@ -287,6 +287,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega2=mmcu?atxmega32x1 \
        mmcu?avrxmega4=mmcu?atxmega64a3 \
        mmcu?avrxmega4=mmcu?atxmega64a3u \
@@ -20,3 +20,5 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avrxmega4=mmcu?atxmega64b1 \
        mmcu?avrxmega4=mmcu?atxmega64b3 \
        mmcu?avrxmega4=mmcu?atxmega64d3 \
+
+4
index af9222bffdec32a6f1ec9c462c523d6c8244c25f..0f5d94d9fee603a1b15e7d09cf6a59ec995ae159 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 14:59:12.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 15:04:23.000000000 +0530
-@@ -294,6 +294,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -293,6 +293,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega128b1", ARCH_AVRXMEGA6, "__AVR_ATxmega128B1__",         0, 0x2000, "x128b1" },
    { "atxmega128b3", ARCH_AVRXMEGA6, "__AVR_ATxmega128B3__",         0, 0x2000, "x128b3" },
    { "atxmega128d3", ARCH_AVRXMEGA6, "__AVR_ATxmega128D3__",         0, 0x2000, "x128d3" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 14:59:12.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 15:04:23.000000000 +0530
-@@ -300,6 +300,7 @@ MULTILIB_MATCHES = \
+@@ -299,6 +299,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega6=mmcu?atxmega128b1 \
        mmcu?avrxmega6=mmcu?atxmega128b3 \
        mmcu?avrxmega6=mmcu?atxmega128d3 \
index e9067206f9bad3946c60058a62f94dcc7bbac70b..f82160b1fecd5a8e0fd8e8206a81bea607e4af3f 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-10-28 15:04:23.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-10-28 15:06:36.000000000 +0530
-@@ -265,6 +265,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -264,6 +264,7 @@ const struct mcu_type_s avr_mcu_types[] 
      /* Xmega, <= 8K FLASH.  */
      /* Xmega, > 8K, <= 64K FLASH, <= 64K RAM.  */
    { "avrxmega2",    ARCH_AVRXMEGA2, NULL,                           0, 0x2000, "x32a4" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-10-28 15:04:23.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-10-28 15:06:36.000000000 +0530
-@@ -279,6 +279,7 @@ MULTILIB_MATCHES = \
+@@ -278,6 +278,7 @@ MULTILIB_MATCHES = \
        mmcu?avr6=mmcu?atmega256rfr2 \
        mmcu?avr6=mmcu?atmega2560 \
        mmcu?avr6=mmcu?atmega2561 \
index 46bc2d9a6f1ac0f516b8680b63c39de9d65a8c47..ac0903803d32aaf673e03ed56302c391c9fb28b6 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-11-08 17:00:35.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-11-08 17:04:10.000000000 +0530
-@@ -268,9 +268,11 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -267,9 +267,11 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atmxt336s",    ARCH_AVRXMEGA2, "__AVR_ATMXT336S__",            0, 0x2000, "mxt336s"},
    { "atxmega16a4",  ARCH_AVRXMEGA2, "__AVR_ATxmega16A4__",          0, 0x2000, "x16a4" },
    { "atxmega16a4u",  ARCH_AVRXMEGA2, "__AVR_ATxmega16A4U__",        0, 0x2000, "x16a4u" },
@@ -13,7 +13,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "atxmega32d4",  ARCH_AVRXMEGA2, "__AVR_ATxmega32D4__",          0, 0x2000, "x32d4" },
    { "atxmega32x1",  ARCH_AVRXMEGA2, "__AVR_ATxmega32X1__",          0, 0x2000, "x32x1" },
      /* Xmega, > 8K, <= 64K FLASH, > 64K RAM.  */
-@@ -294,6 +296,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -293,6 +295,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega128a3u",ARCH_AVRXMEGA6, "__AVR_ATxmega128A3U__",        0, 0x2000, "x128a3u"},
    { "atxmega128b1", ARCH_AVRXMEGA6, "__AVR_ATxmega128B1__",         0, 0x2000, "x128b1" },
    { "atxmega128b3", ARCH_AVRXMEGA6, "__AVR_ATxmega128B3__",         0, 0x2000, "x128b3" },
@@ -21,7 +21,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "atxmega128d3", ARCH_AVRXMEGA6, "__AVR_ATxmega128D3__",         0, 0x2000, "x128d3" },
    { "atxmega128d4", ARCH_AVRXMEGA6, "__AVR_ATxmega128D4__",         0, 0x2000, "x128d4" },
    { "atxmega192a3", ARCH_AVRXMEGA6, "__AVR_ATxmega192A3__",         0, 0x2000, "x192a3" },
-@@ -303,6 +306,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -302,6 +305,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega256a3u",ARCH_AVRXMEGA6, "__AVR_ATxmega256A3U__",        0, 0x2000, "x256a3u"},
    { "atxmega256a3b",ARCH_AVRXMEGA6, "__AVR_ATxmega256A3B__",        0, 0x2000, "x256a3b" },
    { "atxmega256a3bu", ARCH_AVRXMEGA6, "__AVR_ATxmega256A3BU__",     0, 0x2000, "x256a3bu" },
@@ -32,7 +32,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-11-08 17:00:35.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-11-08 17:02:00.000000000 +0530
-@@ -282,7 +282,9 @@ MULTILIB_MATCHES = \
+@@ -281,7 +281,9 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega2=mmcu?atmxt336s \
        mmcu?avrxmega2=mmcu?atxmega16a4 \
        mmcu?avrxmega2=mmcu?atxmega16a4u \
@@ -42,7 +42,7 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avrxmega2=mmcu?atxmega32d4 \
        mmcu?avrxmega2=mmcu?atxmega32a4 \
        mmcu?avrxmega2=mmcu?atxmega32a4u \
-@@ -300,6 +302,7 @@ MULTILIB_MATCHES = \
+@@ -299,6 +301,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega6=mmcu?atxmega128a3u \
        mmcu?avrxmega6=mmcu?atxmega128b1 \
        mmcu?avrxmega6=mmcu?atxmega128b3 \
@@ -50,7 +50,7 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avrxmega6=mmcu?atxmega128d3 \
        mmcu?avrxmega6=mmcu?atxmega128d4 \
        mmcu?avrxmega6=mmcu?atxmega192a3 \
-@@ -309,6 +312,7 @@ MULTILIB_MATCHES = \
+@@ -308,6 +311,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega6=mmcu?atxmega256a3u \
        mmcu?avrxmega6=mmcu?atxmega256a3b \
        mmcu?avrxmega6=mmcu?atxmega256a3bu \
index 6e51f557080b20abc30693eb9cb3c994173c3e96..24adf88af9d4a0f879ee34fabd15e97b473cf1d6 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-11-08 17:37:12.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-11-08 17:38:18.000000000 +0530
-@@ -309,6 +309,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -308,6 +308,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega256c3", ARCH_AVRXMEGA6, "__AVR_ATxmega256C3__",         0, 0x2000, "x256c3" },
    { "atxmega256d3", ARCH_AVRXMEGA6, "__AVR_ATxmega256D3__",         0, 0x2000, "x256d3" },
    { "atxmega384c3", ARCH_AVRXMEGA6, "__AVR_ATxmega384C3__",         0, 0x2000, "x384c3" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-11-08 17:37:12.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-11-08 17:38:18.000000000 +0530
-@@ -315,6 +315,7 @@ MULTILIB_MATCHES = \
+@@ -314,6 +314,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega6=mmcu?atxmega256c3 \
        mmcu?avrxmega6=mmcu?atxmega256d3 \
        mmcu?avrxmega6=mmcu?atxmega384c3 \
index 9ba627ea1148d6e63bee3ea8f9e5d2455a71890f..c05b174c5b3513469300bca2430c259ad80fe9bd 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-11-16 18:28:11.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-11-16 18:33:39.000000000 +0530
-@@ -222,6 +222,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -221,6 +221,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atmega32hvb",          ARCH_AVR5, "__AVR_ATmega32HVB__",       0, 0x0100, "m32hvb" },
    { "atmega32hvbrevb",      ARCH_AVR5, "__AVR_ATmega32HVBREVB__",   1, 0x0100, "m32hvbrevb" },
    { "atmega16hva2",         ARCH_AVR5, "__AVR_ATmega16HVA2__",      0, 0x0100, "m16hva2" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-11-16 18:28:11.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-11-16 18:34:34.000000000 +0530
-@@ -245,6 +245,7 @@ MULTILIB_MATCHES = \
+@@ -244,6 +244,7 @@ MULTILIB_MATCHES = \
        mmcu?avr5=mmcu?atmega32hvb \
        mmcu?avr5=mmcu?atmega32hvbrevb \
        mmcu?avr5=mmcu?atmega64hve \
index 1df4accbb9e66b0941eee63c6fc036dc860199eb..5af18e7e511c9a0f4fde9223ac40ceef2289b41e 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2011-12-08 14:24:48.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2011-12-08 14:38:53.000000000 +0530
-@@ -166,6 +166,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -165,6 +165,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atmega16hvbrevb",      ARCH_AVR5, "__AVR_ATmega16HVBREVB__",   1, 0x0100, "m16hvbrevb" },
    { "atmega16m1",           ARCH_AVR5, "__AVR_ATmega16M1__",        0, 0x0100, "m16m1" },
    { "atmega16u4",           ARCH_AVR5, "__AVR_ATmega16U4__",        0, 0x0100, "m16u4" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2011-12-08 14:24:48.000000000 +0530
 +++ gcc/config/avr/t-avr       2011-12-08 14:41:10.000000000 +0530
-@@ -192,6 +192,7 @@ MULTILIB_MATCHES = \
+@@ -191,6 +191,7 @@ MULTILIB_MATCHES = \
        mmcu?avr5=mmcu?atmega169a \
        mmcu?avr5=mmcu?atmega169p \
        mmcu?avr5=mmcu?atmega169pa \
index 5d1f0418783a1a64cdeca59c926bf5f9aba49a49..f897533757d67795f04f95332cb1cbb02ab001e6 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2012-02-10 20:08:47.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2012-02-10 20:16:45.000000000 +0530
-@@ -267,6 +267,8 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -266,6 +266,8 @@ const struct mcu_type_s avr_mcu_types[] 
      /* Xmega, <= 8K FLASH.  */
      /* Xmega, > 8K, <= 64K FLASH, <= 64K RAM.  */
    { "avrxmega2",    ARCH_AVRXMEGA2, NULL,                           0, 0x2000, "x32a4" },
@@ -13,7 +13,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2012-02-10 20:08:47.000000000 +0530
 +++ gcc/config/avr/t-avr       2012-02-10 20:16:45.000000000 +0530
-@@ -281,6 +281,8 @@ MULTILIB_MATCHES = \
+@@ -280,6 +280,8 @@ MULTILIB_MATCHES = \
        mmcu?avr6=mmcu?atmega256rfr2 \
        mmcu?avr6=mmcu?atmega2560 \
        mmcu?avr6=mmcu?atmega2561 \
index 5fe2f79ce871c7e133e8efd6f078e05edd21c2aa..d145ece3afeabbc25e747533b70bbe56f58fb548 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2012-02-10 20:20:51.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2012-02-10 20:21:25.000000000 +0530
-@@ -305,6 +305,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -304,6 +304,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega128d4", ARCH_AVRXMEGA6, "__AVR_ATxmega128D4__",         0, 0x2000, "x128d4" },
    { "atxmega192a3", ARCH_AVRXMEGA6, "__AVR_ATxmega192A3__",         0, 0x2000, "x192a3" },
    { "atxmega192a3u",ARCH_AVRXMEGA6, "__AVR_ATxmega192A3U__",        0, 0x2000, "x192a3u"},
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2012-02-10 20:20:51.000000000 +0530
 +++ gcc/config/avr/t-avr       2012-02-10 20:21:25.000000000 +0530
-@@ -311,6 +311,7 @@ MULTILIB_MATCHES = \
+@@ -310,6 +310,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega6=mmcu?atxmega128d4 \
        mmcu?avrxmega6=mmcu?atxmega192a3 \
        mmcu?avrxmega6=mmcu?atxmega192a3u \
index 7881478b00eb7cc79fe1cd8a19070b75da47acd3..618d4b334085c7dfbaf155ade9360571831dde5a 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2012-02-10 20:23:45.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2012-02-10 20:24:34.000000000 +0530
-@@ -267,6 +267,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -266,6 +266,7 @@ const struct mcu_type_s avr_mcu_types[] 
      /* Xmega, <= 8K FLASH.  */
      /* Xmega, > 8K, <= 64K FLASH, <= 64K RAM.  */
    { "avrxmega2",    ARCH_AVRXMEGA2, NULL,                           0, 0x2000, "x32a4" },
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2012-02-10 20:23:45.000000000 +0530
 +++ gcc/config/avr/t-avr       2012-02-10 20:24:34.000000000 +0530
-@@ -281,6 +281,7 @@ MULTILIB_MATCHES = \
+@@ -280,6 +280,7 @@ MULTILIB_MATCHES = \
        mmcu?avr6=mmcu?atmega256rfr2 \
        mmcu?avr6=mmcu?atmega2560 \
        mmcu?avr6=mmcu?atmega2561 \
index 68105015a4862b8206c35696929ff1aa5f8b9911..41a67b8ed8275c3a9484858291047584c2832fda 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2012-02-10 20:28:58.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2012-02-10 20:29:40.000000000 +0530
-@@ -289,6 +289,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -288,6 +288,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "atxmega64a4u", ARCH_AVRXMEGA4, "__AVR_ATxmega64A4U__",         0, 0x2000, "x64a4u"},
    { "atxmega64b1",  ARCH_AVRXMEGA4, "__AVR_ATxmega64B1__",          0, 0x2000, "x64b1" },
    { "atxmega64b3",  ARCH_AVRXMEGA4, "__AVR_ATxmega64B3__",          0, 0x2000, "x64b3"},
@@ -12,7 +12,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2012-02-10 20:28:58.000000000 +0530
 +++ gcc/config/avr/t-avr       2012-02-10 20:29:40.000000000 +0530
-@@ -299,6 +299,7 @@ MULTILIB_MATCHES = \
+@@ -298,6 +298,7 @@ MULTILIB_MATCHES = \
        mmcu?avrxmega4=mmcu?atxmega64a4u \
        mmcu?avrxmega4=mmcu?atxmega64b1 \
        mmcu?avrxmega4=mmcu?atxmega64b3 \
index 857d2061c9e189e9c162defff391d6744ff570b5..a74328aeec65cfdbe2a7986c4d1371ce2e95d61a 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2012-02-15 14:00:53.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2012-02-17 11:04:27.000000000 +0530
-@@ -117,6 +117,8 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -116,6 +116,8 @@ const struct mcu_type_s avr_mcu_types[] 
    { "attiny1634",           ARCH_AVR35, "__AVR_ATtiny1634__",       0, 0x0100, "tn1634" },
      /* Enhanced, <= 8K + 2-byte PC + { MOVW/LPMX, MUL }.  */
    { "avr4",                 ARCH_AVR4, NULL,                        0, 0x0060, "m8" },
@@ -13,7 +13,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2012-02-15 14:00:53.000000000 +0530
 +++ gcc/config/avr/t-avr       2012-02-17 11:30:56.000000000 +0530
-@@ -152,6 +152,8 @@ MULTILIB_MATCHES = \
+@@ -151,6 +151,8 @@ MULTILIB_MATCHES = \
        mmcu?avr35=mmcu?attiny167 \
        mmcu?avr35=mmcu?attiny1634 \
        mmcu?avr35=mmcu?attiny327 \
index 907fa03ebab1ae88976a7977ac8b3650f293af91..e8765b95d48d468f3c2929d62db9181b1e6a3e87 100644 (file)
@@ -1,21 +1,21 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
---- gcc/config/avr/avr-devices.c       2012-02-23 15:24:34.000000000 +0530
-+++ gcc/config/avr/avr-devices.c       2012-02-23 15:28:51.000000000 +0530
-@@ -97,6 +97,7 @@ const struct mcu_type_s avr_mcu_types[] 
+--- gcc/config/avr/avr-devices.c       2012-05-31 14:44:29.000000000 +0530
++++ gcc/config/avr/avr-devices.c       2012-05-31 14:44:40.000000000 +0530
+@@ -96,6 +96,7 @@ const struct mcu_type_s avr_mcu_types[] 
+   { "attiny87",             ARCH_AVR25, "__AVR_ATtiny87__",         0, 0x0100, "tn87" },
    { "attiny48",             ARCH_AVR25, "__AVR_ATtiny48__",         0, 0x0100, "tn48" },
    { "attiny88",             ARCH_AVR25, "__AVR_ATtiny88__",         0, 0x0100, "tn88" },
-   { "attiny80",             ARCH_AVR25, "__AVR_ATtiny80__",         0, 0x0100, "tn80" },
 +  { "attiny828",            ARCH_AVR25, "__AVR_ATtiny828__",        0, 0x0100, "tn828" },
    { "at86rf401",            ARCH_AVR25, "__AVR_AT86RF401__",        1, 0x0060, "86401" },
      /* Classic, > 8K, <= 64K +2-byte PC + { JMP/CALL }.  */
    { "avr3",                 ARCH_AVR3, NULL,                        0, 0x0060, "43355" },
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
---- gcc/config/avr/t-avr       2012-02-23 15:24:34.000000000 +0530
-+++ gcc/config/avr/t-avr       2012-02-23 15:29:11.000000000 +0530
-@@ -139,6 +139,7 @@ MULTILIB_MATCHES = \
+--- gcc/config/avr/t-avr       2012-05-31 14:44:29.000000000 +0530
++++ gcc/config/avr/t-avr       2012-05-31 14:44:40.000000000 +0530
+@@ -138,6 +138,7 @@ MULTILIB_MATCHES = \
+       mmcu?avr25=mmcu?attiny87 \
        mmcu?avr25=mmcu?attiny48 \
        mmcu?avr25=mmcu?attiny88 \
-       mmcu?avr25=mmcu?attiny80 \
 +      mmcu?avr25=mmcu?attiny828 \
        mmcu?avr25=mmcu?at86rf401 \
        mmcu?avr3=mmcu?at43usb355 \
index ac4e275462f5ee9fec05a48e23b77dcb220e2746..1a5b336d2872de5ba5731c8f4b13e4787b776bac 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 --- gcc/config/avr/avr-devices.c       2012-02-27 09:26:40.000000000 +0530
 +++ gcc/config/avr/avr-devices.c       2012-02-27 09:27:37.000000000 +0530
-@@ -144,6 +144,9 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -143,6 +143,9 @@ const struct mcu_type_s avr_mcu_types[] 
    { "avr5",                 ARCH_AVR5, NULL,                        0, 0x0060, "m16" },
    { "at90pwm161",           ARCH_AVR5, "__AVR_AT90PWM161__",    1, 0x0100, "90pwm161" },
  
@@ -14,7 +14,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
 --- gcc/config/avr/t-avr       2012-02-27 09:26:40.000000000 +0530
 +++ gcc/config/avr/t-avr       2012-02-27 09:27:37.000000000 +0530
-@@ -175,6 +175,9 @@ MULTILIB_MATCHES = \
+@@ -174,6 +174,9 @@ MULTILIB_MATCHES = \
        mmcu?avr4=mmcu?at90pwm3b \
        mmcu?avr4=mmcu?at90pwm81 \
        mmcu?avr5=mmcu?at90pwm161 \
index b7deac12c15bbf6a09946f6a457068b184fb2a60..5f53481d2d6b89a662e008456896e9540bd8bd5f 100644 (file)
@@ -9,7 +9,7 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
    { "attiny13",             ARCH_AVR25, "__AVR_ATtiny13__",         1, 0x0060, "tn13" },
    { "attiny13a",            ARCH_AVR25, "__AVR_ATtiny13A__",        1, 0x0060, "tn13a" },
    { "attiny2313",           ARCH_AVR25, "__AVR_ATtiny2313__",       1, 0x0060, "tn2313" },
-@@ -109,6 +110,7 @@ const struct mcu_type_s avr_mcu_types[] 
+@@ -108,6 +109,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "at43usb320",           ARCH_AVR31, "__AVR_AT43USB320__",       0, 0x0060, "43320" },
      /* Classic, >=16K, <=64K + 2-byte PC + { MOVW/LPMX + JMP/CALL }.  */
    { "avr35",                ARCH_AVR35, NULL,                       0, 0x0100, "usb162" },
@@ -28,7 +28,7 @@ diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
        mmcu?avr25=mmcu?ata6289 \
        mmcu?avr25=mmcu?attiny13 \
        mmcu?avr25=mmcu?attiny13a \
-@@ -147,6 +148,7 @@ MULTILIB_MATCHES = \
+@@ -146,6 +147,7 @@ MULTILIB_MATCHES = \
        mmcu?avr31=mmcu?at43usb320 \
        mmcu?avr35=mmcu?at90usb82 \
        mmcu?avr35=mmcu?at90usb162 \
diff --git a/431-gcc-atmxt540s.patch b/431-gcc-atmxt540s.patch
new file mode 100644 (file)
index 0000000..d3b8a39
--- /dev/null
@@ -0,0 +1,24 @@
+diff -Naurp gcc/config/avr/avr-devices.c config/avr/avr-devices.c
+--- gcc/config/avr/avr-devices.c       2012-06-28 16:20:39.000000000 +0530
++++ gcc/config/avr/avr-devices.c       2012-06-28 16:23:31.000000000 +0530
+@@ -312,6 +312,8 @@ const struct mcu_type_s avr_mcu_types[] 
+   { "atxmega128c3", ARCH_AVRXMEGA6, "__AVR_ATxmega128C3__",         0, 0x2000, "x128c3" },
+   { "atxmega128d3", ARCH_AVRXMEGA6, "__AVR_ATxmega128D3__",         0, 0x2000, "x128d3" },
+   { "atxmega128d4", ARCH_AVRXMEGA6, "__AVR_ATxmega128D4__",         0, 0x2000, "x128d4" },
++  { "atmxt540s",    ARCH_AVRXMEGA6, "__AVR_ATMXT540S__",            0, 0x2000, "mxt540s"},
++  { "atmxt540sreva", ARCH_AVRXMEGA6, "__AVR_ATMXT540SREVA__",     0, 0x2000, "mxt540sreva"},
+   { "atxmega192a3", ARCH_AVRXMEGA6, "__AVR_ATxmega192A3__",         0, 0x2000, "x192a3" },
+   { "atxmega192a3u",ARCH_AVRXMEGA6, "__AVR_ATxmega192A3U__",        0, 0x2000, "x192a3u"},
+   { "atxmega192c3", ARCH_AVRXMEGA6, "__AVR_ATxmega192C3__",         0, 0x2000, "x192c3" },
+diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
+--- gcc/config/avr/t-avr       2012-06-28 16:20:39.000000000 +0530
++++ gcc/config/avr/t-avr       2012-06-28 16:37:18.000000000 +0530
+@@ -318,6 +318,8 @@ MULTILIB_MATCHES = \
+       mmcu?avrxmega6=mmcu?atxmega128c3 \
+       mmcu?avrxmega6=mmcu?atxmega128d3 \
+       mmcu?avrxmega6=mmcu?atxmega128d4 \
++      mmcu?avrxmega6=mmcu?atmxt540s \
++      mmcu?avrxmega6=mmcu?atmxt540sreva \
+       mmcu?avrxmega6=mmcu?atxmega192a3 \
+       mmcu?avrxmega6=mmcu?atxmega192a3u \
+       mmcu?avrxmega6=mmcu?atxmega192c3 \
diff --git a/432-gcc-ata5831.patch b/432-gcc-ata5831.patch
new file mode 100644 (file)
index 0000000..fadd66b
--- /dev/null
@@ -0,0 +1,54 @@
+diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
+--- gcc/config/avr/avr-devices.c       2012-04-20 18:52:19.000000000 +0530
++++ gcc/config/avr/avr-devices.c       2012-04-20 18:52:59.000000000 +0530
+@@ -37,6 +37,7 @@ const struct base_arch_s avr_arch_types[
+   { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=5",   "avr5" },
+   { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=51",  "avr51" },
+   { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0x0060, "__AVR_ARCH__=6",   "avr6" },
++  { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0x0200, "__AVR_ARCH__=7",   "avr7" }, 
+   { 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0x2000, "__AVR_ARCH__=101", "avrxmega1" },
+   { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0x2000, "__AVR_ARCH__=102", "avrxmega2" },
+   { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0x2000, "__AVR_ARCH__=103", "avrxmega3" },
+@@ -270,6 +271,9 @@ const struct mcu_type_s avr_mcu_types[] 
+   { "atmega2561",           ARCH_AVR6, "__AVR_ATmega2561__",        0, 0x0200, "m2561" },
+   { "atmega256rfa2",        ARCH_AVR6, "__AVR_ATmega256RFA2__",     0, 0x0200, "m256rfa2" },
+   { "atmega256rfr2",        ARCH_AVR6, "__AVR_ATmega256RFR2__",     0, 0x0200, "m256rfr2" },
++    /* Enhanced, == 20K starts at 0x8000 */
++  { "avr7",                 ARCH_AVR7, NULL,                        0, 0x0200, "a5831" },
++  { "ata5831",              ARCH_AVR7, "__AVR_ATA5831__",           0, 0x0200, "a5831" },
+     /* Enhanced, == 256K.  */
+     /* Xmega, <= 8K FLASH.  */
+     /* Xmega, > 8K, <= 64K FLASH, <= 64K RAM.  */
+diff -Naurp gcc/config/avr/avr.h gcc-4.6.2-src/gcc/config/avr/avr.h
+--- gcc/config/avr/avr.h       2012-04-20 18:52:19.000000000 +0530
++++ gcc/config/avr/avr.h       2012-04-20 18:52:59.000000000 +0530
+@@ -79,6 +79,7 @@ enum avr_arch
+   ARCH_AVR5,
+   ARCH_AVR51,
+   ARCH_AVR6,
++  ARCH_AVR7,
+   ARCH_AVRXMEGA1,
+   ARCH_AVRXMEGA2,
+   ARCH_AVRXMEGA3,
+diff -Naurp gcc-4.6.2-base/gcc/config/avr/t-avr gcc-4.6.2-src/gcc/config/avr/t-avr
+--- gcc/config/avr/t-avr       2012-04-20 18:52:19.000000000 +0530
++++ gcc/config/avr/t-avr       2012-04-20 18:52:59.000000000 +0530
+@@ -107,8 +107,8 @@ fp-bit.c: $(srcdir)/config/fp-bit.c $(sr
+ FPBIT = fp-bit.c
+-MULTILIB_OPTIONS = mmcu=avr2/mmcu=avr25/mmcu=avr3/mmcu=avr31/mmcu=avr35/mmcu=avr4/mmcu=avr5/mmcu=avr51/mmcu=avr6/mmcu=avrxmega2/mmcu=avrxmega4/mmcu=avrxmega5/mmcu=avrxmega6/mmcu=avrxmega7/mmcu=avrtiny10
+-MULTILIB_DIRNAMES = avr2 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny10
++MULTILIB_OPTIONS = mmcu=avr2/mmcu=avr25/mmcu=avr3/mmcu=avr31/mmcu=avr35/mmcu=avr4/mmcu=avr5/mmcu=avr51/mmcu=avr6/mmcu=avr7/mmcu=avrxmega2/mmcu=avrxmega4/mmcu=avrxmega5/mmcu=avrxmega6/mmcu=avrxmega7/mmcu=avrtiny10
++MULTILIB_DIRNAMES = avr2 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avr7 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny10
+ # The many avr2 matches are not listed here - this is the default.
+ MULTILIB_MATCHES = \
+@@ -288,6 +288,7 @@ MULTILIB_MATCHES = \
+       mmcu?avr6=mmcu?atmega256rfr2 \
+       mmcu?avr6=mmcu?atmega2560 \
+       mmcu?avr6=mmcu?atmega2561 \
++      mmcu?avr7=mmcu?ata5831 \
+       mmcu?avrxmega2=mmcu?atmxt112sl \
+       mmcu?avrxmega2=mmcu?atmxt224 \
+       mmcu?avrxmega2=mmcu?atmxt224e \
similarity index 54%
rename from 409-gcc-attiny80.patch
rename to 433-gcc-attiny841.patch
index c109b09e8e74009c468ab5c93ff967aae920c1fa..f846bfdc4b58bad8697ea450c99da538191dc877 100644 (file)
@@ -1,22 +1,22 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
---- gcc/config/avr/avr-devices.c       2011-10-28 11:44:14.000000000 +0530
-+++ gcc/config/avr/avr-devices.c       2011-10-28 11:55:44.000000000 +0530
-@@ -96,6 +96,7 @@ const struct mcu_type_s avr_mcu_types[] 
-   { "attiny87",             ARCH_AVR25, "__AVR_ATtiny87__",         0, 0x0100, "tn87" },
+--- gcc/config/avr/avr-devices.c       2012-06-12 11:41:02.000000000 +0530
++++ gcc/config/avr/avr-devices.c       2012-06-12 11:48:03.000000000 +0530
+@@ -99,6 +99,7 @@ const struct mcu_type_s avr_mcu_types[] 
    { "attiny48",             ARCH_AVR25, "__AVR_ATtiny48__",         0, 0x0100, "tn48" },
    { "attiny88",             ARCH_AVR25, "__AVR_ATtiny88__",         0, 0x0100, "tn88" },
-+  { "attiny80",             ARCH_AVR25, "__AVR_ATtiny80__",         0, 0x0100, "tn80" },
+   { "attiny828",            ARCH_AVR25, "__AVR_ATtiny828__",        0, 0x0100, "tn828" },
++  { "attiny841",            ARCH_AVR25, "__AVR_ATtiny841__",        0, 0x0100, "tn841" },
    { "at86rf401",            ARCH_AVR25, "__AVR_AT86RF401__",        1, 0x0060, "86401" },
      /* Classic, > 8K, <= 64K +2-byte PC + { JMP/CALL }.  */
    { "avr3",                 ARCH_AVR3, NULL,                        0, 0x0060, "43355" },
 diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
---- gcc/config/avr/t-avr       2011-10-28 11:40:24.000000000 +0530
-+++ gcc/config/avr/t-avr       2011-10-28 11:55:44.000000000 +0530
-@@ -138,6 +138,7 @@ MULTILIB_MATCHES = \
-       mmcu?avr25=mmcu?attiny87 \
+--- gcc/config/avr/t-avr       2012-06-12 11:41:02.000000000 +0530
++++ gcc/config/avr/t-avr       2012-06-12 11:45:26.000000000 +0530
+@@ -140,6 +140,7 @@ MULTILIB_MATCHES = \
        mmcu?avr25=mmcu?attiny48 \
        mmcu?avr25=mmcu?attiny88 \
-+      mmcu?avr25=mmcu?attiny80 \
+       mmcu?avr25=mmcu?attiny828 \
++      mmcu?avr25=mmcu?attiny841 \
        mmcu?avr25=mmcu?at86rf401 \
        mmcu?avr3=mmcu?at43usb355 \
        mmcu?avr3=mmcu?at76c711 \
diff --git a/434-gcc-atxmega32_16_8e5.patch b/434-gcc-atxmega32_16_8e5.patch
new file mode 100644 (file)
index 0000000..b66709a
--- /dev/null
@@ -0,0 +1,26 @@
+diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
+--- gcc/config/avr/avr-devices.c       2012-10-16 16:56:11.000000000 +0530
++++ gcc/config/avr/avr-devices.c       2012-10-16 16:55:50.000000000 +0530
+@@ -291,6 +291,9 @@ const struct mcu_type_s avr_mcu_types[] 
+   { "atxmega32a4u",  ARCH_AVRXMEGA2, "__AVR_ATxmega32A4U__",        0, 0x2000, "x32a4u" },
+   { "atxmega32c4",  ARCH_AVRXMEGA2, "__AVR_ATxmega32C4__",          0, 0x2000, "x32c4" },
+   { "atxmega32d4",  ARCH_AVRXMEGA2, "__AVR_ATxmega32D4__",          0, 0x2000, "x32d4" },
++  { "atxmega16e5",  ARCH_AVRXMEGA2, "__AVR_ATxmega16E5__",          0, 0x2000, "x16e5" },
++  { "atxmega8e5",   ARCH_AVRXMEGA2, "__AVR_ATxmega8E5__",          0, 0x2000, "x8e5"  },
++  { "atxmega32e5",  ARCH_AVRXMEGA2, "__AVR_ATxmega32E5__",          0, 0x2000, "x32e5" },
+   { "atxmega32x1",  ARCH_AVRXMEGA2, "__AVR_ATxmega32X1__",          0, 0x2000, "x32x1" },
+     /* Xmega, > 8K, <= 64K FLASH, > 64K RAM.  */
+     /* { "avrxmega3",    ARCH_AVRXMEGA3, NULL }, */
+diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
+--- gcc/config/avr/t-avr       2012-10-16 16:56:11.000000000 +0530
++++ gcc/config/avr/t-avr       2012-10-16 16:55:50.000000000 +0530
+@@ -300,6 +300,9 @@ MULTILIB_MATCHES = \
+       mmcu?avrxmega2=mmcu?atxmega16d4 \
+       mmcu?avrxmega2=mmcu?atxmega32c4 \
+       mmcu?avrxmega2=mmcu?atxmega32d4 \
++      mmcu?avrxmega2=mmcu?atxmega32e5 \
++      mmcu?avrxmega2=mmcu?atxmega16e5 \
++      mmcu?avrxmega2=mmcu?atxmega8e5 \
+       mmcu?avrxmega2=mmcu?atxmega32a4 \
+       mmcu?avrxmega2=mmcu?atxmega32a4u \
+       mmcu?avrxmega2=mmcu?atxmega32x1 \
index eecd478a2a6641ee7e91d23fb6130d5df3c3582d..36d31f111f46cab9ea2b2386bfd88ecc133e7f59 100644 (file)
@@ -1,7 +1,7 @@
 diff -Naurp gcc/config/avr/avr.h gcc/config/avr/avr.h
---- gcc/config/avr/avr.h       2011-06-22 10:28:47.000000000 +0530
-+++ gcc/config/avr/avr.h       2011-06-22 10:35:08.000000000 +0530
-@@ -136,7 +136,7 @@ extern GTY(()) section *progmem_section;
+--- gcc/config/avr/avr.h       2012-04-23 11:17:05.000000000 +0530
++++ gcc/config/avr/avr.h       2012-04-23 11:17:24.000000000 +0530
+@@ -137,7 +137,7 @@ extern GTY(()) section *progmem_section;
  #define AVR_2_BYTE_PC (!AVR_HAVE_EIJMP_EICALL)
  #define AVR_3_BYTE_PC (AVR_HAVE_EIJMP_EICALL)
  
@@ -11,8 +11,8 @@ diff -Naurp gcc/config/avr/avr.h gcc/config/avr/avr.h
  #define AVR_RAMPX_ADDR (AVR_XMEGA ? 0x39 : 0)
  #define AVR_RAMPY_ADDR (AVR_XMEGA ? 0x3A : 0)
 diff -Naurp gcc/config/avr/predicates.md gcc/config/avr/predicates.md
---- gcc/config/avr/predicates.md       2011-06-22 10:25:29.000000000 +0530
-+++ gcc/config/avr/predicates.md       2011-06-22 10:35:08.000000000 +0530
+--- gcc/config/avr/predicates.md       2012-04-23 11:07:59.000000000 +0530
++++ gcc/config/avr/predicates.md       2012-04-23 11:17:24.000000000 +0530
 @@ -50,21 +50,24 @@
  ;; Return true if OP is a valid address for lower half of I/O space.
  (define_predicate "low_io_address_operand"
index bfccc05dbca79c5e0255bc0bf5e158970b082a84..e4887718d47c109cf77ef1bd6104a0244fb8b74d 100644 (file)
@@ -1,11 +1,11 @@
 diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
---- gcc/config/avr/avr-devices.c       2011-06-22 10:26:14.000000000 +0530
-+++ gcc/config/avr/avr-devices.c       2011-06-22 10:48:05.000000000 +0530
-@@ -37,14 +37,14 @@ const struct base_arch_s avr_arch_types[
-   { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=5",   "avr5" },
+--- gcc/config/avr/avr-devices.c       2012-03-27 16:11:43.000000000 +0530
++++ gcc/config/avr/avr-devices.c       2012-03-28 11:36:52.000000000 +0530
+@@ -38,14 +38,14 @@ const struct base_arch_s avr_arch_types[
    { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=51",  "avr51" },
    { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0x0060, "__AVR_ARCH__=6",   "avr6" },
-+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0x0040, "__AVR_ARCH__=100",  "avrtiny10" },
+   { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0x0200, "__AVR_ARCH__=7",   "avr7" }, 
++  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0x0040, "__AVR_ARCH__=100", "avrtiny10" },
    { 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0x2000, "__AVR_ARCH__=101", "avrxmega1" },
    { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0x2000, "__AVR_ARCH__=102", "avrxmega2" },
    { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0x2000, "__AVR_ARCH__=103", "avrxmega3" },
@@ -19,12 +19,12 @@ diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
  
  /* List of all known AVR MCU types - if updated, it has to be kept
 diff -Naurp gcc/config/avr/avr.h gcc/config/avr/avr.h
---- gcc/config/avr/avr.h       2011-06-22 10:36:29.000000000 +0530
-+++ gcc/config/avr/avr.h       2011-06-22 10:48:05.000000000 +0530
-@@ -79,14 +79,14 @@ enum avr_arch
-   ARCH_AVR5,
+--- gcc/config/avr/avr.h       2012-03-27 16:44:27.000000000 +0530
++++ gcc/config/avr/avr.h       2012-03-28 11:38:15.000000000 +0530
+@@ -80,14 +80,14 @@ enum avr_arch
    ARCH_AVR51,
    ARCH_AVR6,
+   ARCH_AVR7,
 +  ARCH_AVRTINY10,
    ARCH_AVRXMEGA1,
    ARCH_AVRXMEGA2,
index 1dd01c1d73f9b06d186f7788d918c881c7fca585..acab4d22be4b5a8f3c973ed78d993ca3bf64bace 100644 (file)
@@ -1,6 +1,6 @@
 diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
---- gcc/config/avr/avr.c       2011-10-28 16:28:16.000000000 +0530
-+++ gcc/config/avr/avr.c       2011-10-28 16:40:20.000000000 +0530
+--- gcc/config/avr/avr.c       2012-04-23 11:22:39.000000000 +0530
++++ gcc/config/avr/avr.c       2012-04-23 11:26:15.000000000 +0530
 @@ -96,6 +96,7 @@ static struct machine_function * avr_ini
  static void avr_init_builtins (void);
  static rtx avr_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
@@ -39,9 +39,9 @@ diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
     registers (for a define_peephole2) in the current function.  */
  
 diff -Naurp gcc/config/avr/avr.h gcc/config/avr/avr.h
---- gcc/config/avr/avr.h       2011-10-28 16:29:55.000000000 +0530
-+++ gcc/config/avr/avr.h       2011-10-28 16:40:20.000000000 +0530
-@@ -313,41 +313,6 @@ enum reg_class {
+--- gcc/config/avr/avr.h       2012-04-23 11:25:46.000000000 +0530
++++ gcc/config/avr/avr.h       2012-04-23 11:26:15.000000000 +0530
+@@ -314,41 +314,6 @@ enum reg_class {
    {0xffffffff,0x00000003}     /* ALL_REGS */                          \
  }
  
diff --git a/506-gcc-avrtc541.patch b/506-gcc-avrtc541.patch
new file mode 100644 (file)
index 0000000..2675251
--- /dev/null
@@ -0,0 +1,42 @@
+diff -Naurp gcc/config/avr/libgcc.S gcc/config/avr/libgcc.S
+--- gcc/config/avr/libgcc.S    2012-06-12 12:43:40.000000000 +0530
++++ gcc/config/avr/libgcc.S    2012-06-12 12:44:08.000000000 +0530
+@@ -862,6 +862,12 @@ __do_copy_data:
+       cpc     r27, r17
+       brne    .L__do_copy_data_loop
+ #endif /* !defined(__AVR_HAVE_ELPMX__) && !defined(__AVR_HAVE_ELPM__) */
++
++;Clear RAMPZ in case it was set during copy_data
++#if defined(__AVR_HAVE_ELPMX__ ) || defined(__AVR_HAVE_ELPM__)
++    out __RAMPZ__, __zero_reg__
++#endif
++
+ #endif /* L_copy_data */
+ #endif
+@@ -941,6 +947,12 @@ __do_global_ctors:
+       cpc     r29, r17
+       brne    .L__do_global_ctors_loop
+ #endif /* defined(__AVR_HAVE_RAMPZ__) */
++
++;Clear RAMPZ in case it was set
++#if defined(__AVR_HAVE_RAMPZ__)
++    out __RAMPZ__, __zero_reg__
++#endif
++
+ #endif /* L_ctors */
+ #ifdef L_dtors
+@@ -992,6 +1004,12 @@ __do_global_dtors:
+       cpc     r29, r17
+       brne    .L__do_global_dtors_loop
+ #endif /* defined(__AVR_HAVE_RAMPZ__) */
++
++;Clear RAMPZ in case it was set
++#if defined(__AVR_HAVE_RAMPZ__)
++    out __RAMPZ__, __zero_reg__
++#endif
++
+ #endif /* L_dtors */
+ #if !defined (__AVR_TINY__)
diff --git a/507-gcc-avrtc-518.patch b/507-gcc-avrtc-518.patch
new file mode 100644 (file)
index 0000000..07b2a87
--- /dev/null
@@ -0,0 +1,23 @@
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-05-31 11:55:38.000000000 +0530
++++ gcc/config/avr/avr.c       2012-06-15 12:10:49.000000000 +0530
+@@ -738,7 +738,8 @@ expand_prologue (void)
+             && !cfun->machine->is_signal
+             && !cfun->machine->is_OS_task
+             && !cfun->machine->is_OS_main
+-            && live_seq);
++            && live_seq
++            && !AVR_TINY);
+   if (cfun->machine->is_interrupt || cfun->machine->is_signal)
+     {
+@@ -1068,7 +1069,8 @@ expand_epilogue (void)
+             && !cfun->machine->is_signal
+             && !cfun->machine->is_OS_task
+             && !cfun->machine->is_OS_main
+-            && live_seq);
++            && live_seq
++            && !AVR_TINY);
+   
+   if (minimize && (frame_pointer_needed || live_seq > 4))
+     {
diff --git a/508-gcc-avrtc514-tiny.patch b/508-gcc-avrtc514-tiny.patch
new file mode 100644 (file)
index 0000000..5e91123
--- /dev/null
@@ -0,0 +1,12 @@
+diff -Naurp gcc/config/avr/avr.h gcc/config/avr/avr.h
+--- gcc/config/avr/avr.h       2012-06-27 15:36:22.000000000 +0530
++++ gcc/config/avr/avr.h       2012-06-27 15:38:34.000000000 +0530
+@@ -369,7 +369,7 @@ enum reg_class {
+ #define ARG_POINTER_REGNUM 34
+-#define STATIC_CHAIN_REGNUM 2
++#define STATIC_CHAIN_REGNUM ((AVR_TINY)?18:2)
+ #define ELIMINABLE_REGS {                                     \
+       {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},             \
diff --git a/509-gcc-AVRTC-544-call-used-registers-tiny10.patch b/509-gcc-AVRTC-544-call-used-registers-tiny10.patch
new file mode 100644 (file)
index 0000000..8ef99f7
--- /dev/null
@@ -0,0 +1,173 @@
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-06-22 15:29:05.000000000 +0530
++++ gcc/config/avr/avr.c       2012-06-28 12:50:23.000000000 +0530
+@@ -111,6 +111,9 @@ static void avr_help (void);
+ /* Allocate registers from r25 to r8 for parameters for function calls.  */
+ #define FIRST_CUM_REG 26
++/* Last call saved register */
++#define LAST_CALLEE_SAVED_REG (AVR_TINY ? 21 : 17)
++
+ /* Temporary register RTX (gen_rtx_REG (QImode, TMP_REGNO)) */
+ static GTY(()) rtx tmp_reg_rtx;
+@@ -611,7 +614,7 @@ sequent_regs_live (void)
+   int live_seq=0;
+   int cur_seq=0;
+-  for (reg = 0; reg < 18; ++reg)
++  for (reg = 0; reg <= LAST_CALLEE_SAVED_REG; ++reg)
+     {
+       if (fixed_regs[reg])
+         {
+@@ -838,11 +841,11 @@ expand_prologue (void)
+       /* Note that live_seq always contains r28+r29, but the other
+        registers to be saved are all below 18.  */
+-      first_reg = 18 - (live_seq - 2);
++      first_reg = (LAST_CALLEE_SAVED_REG + 1) - (live_seq - 2);
+       for (reg = 29, offset = -live_seq + 1;
+          reg >= first_reg;
+-         reg = (reg == 28 ? 17 : reg - 1), ++offset)
++         reg = (reg == 28 ? (LAST_CALLEE_SAVED_REG) : reg - 1), ++offset)
+       {
+         rtx m, r;
+@@ -6375,6 +6378,17 @@ order_regs_for_local_alloc (void)
+     0,1,
+     32,33,34,35
+   };
++  static const int tiny_order_0[] = {
++    24,25,
++    22,23,
++    30,31,
++    26,27,
++    28,29,
++    21,20,19,18,
++    16,17,
++    32,33,34,35,
++    15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
++  };
+   static const int order_1[] = {
+     18,19,
+     20,21,
+@@ -6387,6 +6401,17 @@ order_regs_for_local_alloc (void)
+     0,1,
+     32,33,34,35
+   };
++  static const int tiny_order_1[] = {
++    22,23,
++    24,25,
++    30,31,
++    26,27,
++    28,29,
++    21,20,19,18,
++    16,17,
++    32,33,34,35,
++    15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
++  };
+   static const int order_2[] = {
+     25,24,
+     23,22,
+@@ -6400,10 +6425,15 @@ order_regs_for_local_alloc (void)
+     1,0,
+     32,33,34,35
+   };
+-  
+-  const int *order = (TARGET_ORDER_1 ? order_1 :
+-                    TARGET_ORDER_2 ? order_2 :
+-                    order_0);
++ 
++  /*
++  Select specific register allocation order. Tiny Core (attiny4/5/9/10/20/40)
++  devices has only 16 registers, so different allocation order should be used
++  */ 
++  const int *order = (TARGET_ORDER_1 ? (AVR_TINY ? tiny_order_1 : order_1) :
++                    TARGET_ORDER_2 ? (AVR_TINY ? tiny_order_1 : order_2) :
++                                       (AVR_TINY ? tiny_order_0 : order_0));
++
+   for (i=0; i < ARRAY_SIZE (order_0); ++i)
+       reg_alloc_order[i] = order[i];
+ }
+@@ -7395,15 +7425,45 @@ avr_output_addr_vec_elt (FILE *stream, i
+ static void
+ avr_conditional_register_usage(void) {
+-   if (AVR_TINY) {                             
+-     int i;                                    
+-     for (i = 0;  i <= 17;  i++) {             
+-       fixed_regs[i] = 1;                      
+-       call_used_regs[i] = 1;                  
+-     }                                         
+-      CLEAR_HARD_REG_SET(reg_class_contents[(int)ADDW_REGS]);           
+-      CLEAR_HARD_REG_SET(reg_class_contents[(int)NO_LD_REGS]);           
+-   }
++  if (AVR_TINY) {
++    int i;
++
++    const int tiny_reg_alloc_order[] = {
++      24,25,
++      22,23,
++      30,31,
++      26,27,
++      28,29,
++      21,20,19,18,
++      16,17,
++      32,33,34,35,
++      15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
++    };
++
++    /* Set R0-R17 as fixed registers. Reset R0-R17 in call used register list
++    - R0-R15 are not available in Tiny Core devices
++    - R16 and R17 are fixed registers
++    */
++    for (i = 0;  i <= 17;  i++) {
++      fixed_regs[i] = 1;
++      call_used_regs[i] = 1;
++    }
++
++    /* Set R18 to R21 as call used register 
++    - R18, R19, R20 and R21 are the call used registers in Tiny Core devices
++    */
++    for (i = 18; i <= LAST_CALLEE_SAVED_REG; i++) {
++      call_used_regs[i] = 0;
++    }
++
++    /*update register allocation order for Tiny Core devices */
++    for (i=0; i < ARRAY_SIZE (tiny_reg_alloc_order); i++) {
++      reg_alloc_order[i] = tiny_reg_alloc_order[i];
++    }
++
++    CLEAR_HARD_REG_SET(reg_class_contents[(int)ADDW_REGS]);
++    CLEAR_HARD_REG_SET(reg_class_contents[(int)NO_LD_REGS]);
++  }
+ }
+ /* Returns true if SCRATCH are safe to be allocated as a scratch
+@@ -7553,13 +7613,20 @@ avr_asm_out_dtor (rtx symbol, int priori
+ static bool
+ avr_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
+ {
+-  if (TYPE_MODE (type) == BLKmode)
+-    {
+-      HOST_WIDE_INT size = int_size_in_bytes (type);
+-      return (size == -1 || size > 8);
+-    }
++  HOST_WIDE_INT size = int_size_in_bytes (type);
++  HOST_WIDE_INT ret_size_limit = AVR_TINY ? 4 : 8;
++
++  /* In avr, there are 8 return registers. But, for Tiny Core 
++  (attiny4/5/9/10/20/40) devices, only 4 registers available.
++  Return true if size is unknown or greater than the limit */
++  if ((size == -1) || (size > ret_size_limit))
++  {
++    return true;
++  }
+   else
++  {
+     return false;
++  }
+ }
+ /* Worker function for CASE_VALUES_THRESHOLD.  */
diff --git a/510-gcc-avrtc496-tiny.patch b/510-gcc-avrtc496-tiny.patch
new file mode 100644 (file)
index 0000000..2bcc7f6
--- /dev/null
@@ -0,0 +1,42 @@
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-06-27 15:41:23.000000000 +0530
++++ gcc/config/avr/avr.c       2012-06-27 15:42:02.000000000 +0530
+@@ -751,15 +751,15 @@ expand_prologue (void)
+       emit_insn (gen_enable_interrupt ());
+       
+       /* Push zero reg.  */
+-      emit_push_byte (ZERO_REGNO, true);
++      emit_push_byte ((AVR_TINY)?ZERO_REGNO_AVRTINY10:ZERO_REGNO, true);
+       /* Push tmp reg.  */
+-      emit_push_byte (TMP_REGNO, true);
++      emit_push_byte ((AVR_TINY)?TMP_REGNO_AVRTINY10:TMP_REGNO, true);
+       /* Push SREG.  */
+       /* ??? There's no dwarf2 column reserved for SREG.  */
+       emit_move_insn (tmp_reg_rtx, gen_rtx_MEM (QImode, GEN_INT (AVR_SREG_ADDR)));
+-      emit_push_byte (TMP_REGNO, false);
++      emit_push_byte ((AVR_TINY)?TMP_REGNO_AVRTINY10:TMP_REGNO, false);
+       /* Push RAMPD, RAMPX, RAMPY. */
+       /*
+@@ -1217,16 +1217,16 @@ expand_epilogue (void)
+               } 
+           /* Restore SREG using tmp reg as scratch.  */
+-          emit_pop_byte (TMP_REGNO);
++          emit_pop_byte ((AVR_TINY)?TMP_REGNO_AVRTINY10:TMP_REGNO);
+       
+           emit_move_insn (gen_rtx_MEM (QImode, GEN_INT (AVR_SREG_ADDR)), 
+                         tmp_reg_rtx);
+           /* Restore tmp REG.  */
+-          emit_pop_byte (TMP_REGNO);
++          emit_pop_byte ((AVR_TINY)?TMP_REGNO_AVRTINY10:TMP_REGNO);
+           /* Restore zero REG.  */
+-          emit_pop_byte (ZERO_REGNO);
++          emit_pop_byte ((AVR_TINY)?ZERO_REGNO_AVRTINY10:ZERO_REGNO);
+         }
+       emit_jump_insn (gen_return ());
diff --git a/511-gcc-avrtc539-backported.patch b/511-gcc-avrtc539-backported.patch
new file mode 100644 (file)
index 0000000..20d01db
--- /dev/null
@@ -0,0 +1,44 @@
+diff -Naurp gcc/combine.c gcc/combine.c
+--- gcc/combine.c      2011-07-29 14:05:59.000000000 +0530
++++ gcc/combine.c      2012-06-28 15:51:12.000000000 +0530
+@@ -1666,6 +1666,7 @@ can_combine_p (rtx insn, rtx i3, rtx pre
+   rtx link;
+ #endif
+   bool all_adjacent = true;
++  int (*is_volatile_p) (const_rtx);
+   if (succ)
+     {
+@@ -1914,11 +1915,17 @@ can_combine_p (rtx insn, rtx i3, rtx pre
+       && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
+     return 0;
+-  /* If there are any volatile insns between INSN and I3, reject, because
+-     they might affect machine state.  */
+-
++  /* If INSN contains volatile references (specifically volatile MEMs),
++     we cannot combine across any other volatile references.
++     Even if INSN doesn't contain volatile references, any intervening
++     volatile insn might affect machine state.  */
++
++  is_volatile_p = volatile_refs_p (PATTERN (insn))
++    ? volatile_refs_p
++    : volatile_insn_p;
++    
+   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
+-    if (INSN_P (p) && p != succ && p != succ2 && volatile_insn_p (PATTERN (p)))
++    if (INSN_P (p) && p != succ && p != succ2 && is_volatile_p (PATTERN (p)))
+       return 0;
+   /* If INSN contains an autoincrement or autodecrement, make sure that
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-06-28 15:47:34.000000000 +0530
++++ gcc/config/avr/avr.c       2012-06-28 15:51:12.000000000 +0530
+@@ -6307,6 +6307,7 @@ avr_encode_section_info (tree decl, rtx 
+   if (new_decl_p
+       && decl && DECL_P (decl)
+       && NULL_TREE == DECL_INITIAL (decl)
++      && !DECL_EXTERNAL (decl)
+       && avr_progmem_p (decl, DECL_ATTRIBUTES (decl)))
+     {
+       warning (OPT_Wuninitialized,
diff --git a/512-gcc-avrtc542.patch b/512-gcc-avrtc542.patch
new file mode 100644 (file)
index 0000000..9c23ed8
--- /dev/null
@@ -0,0 +1,2753 @@
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-07-05 14:23:46.000000000 +0530
++++ gcc/config/avr/avr.c       2012-07-06 17:30:38.000000000 +0530
+@@ -2191,19 +2191,28 @@ out_movqi_r_mr (rtx insn, rtx op[], int 
+           fatal_insn ("incorrect insn:",insn);
+         if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
+-          return *l = 3, AVR_TINY ? (AS2 (subi,r28,lo8(-(%o1-63))) CR_TAB 
+-                                        AS2 (sbci,r29,hi8(-(%o1-63))) CR_TAB
+-                                                AS2 (subi,r28,lo8(-63))       CR_TAB 
+-                                        AS2 (sbci,r29,hi8(-63))       CR_TAB
+-                                    AS2 (ld,%0,Y)                 CR_TAB
+-                                                AS2 (subi,r28,lo8(63))       CR_TAB 
+-                                        AS2 (sbci,r29,hi8(63))       CR_TAB
+-                                                AS2 (subi,r28,lo8(%o1-63)) CR_TAB 
+-                                        AS2 (sbci,r29,hi8(%o1-63)))  
+-                                 : (AS2 (adiw,r28,%o1-63) CR_TAB
+-                          AS2 (ldd,%0,Y+63)     CR_TAB
+-                          AS2 (sbiw,r28,%o1-63));
+-
++        {
++            if (AVR_TINY)
++            {
++              *l = 9;
++              return (AS2 (subi,r28,lo8(-(%o1-63))) CR_TAB
++                      AS2 (sbci,r29,hi8(-(%o1-63))) CR_TAB
++                      AS2 (subi,r28,lo8(-63))       CR_TAB
++                      AS2 (sbci,r29,hi8(-63))       CR_TAB
++                      AS2 (ld,%0,Y)                 CR_TAB
++                      AS2 (subi,r28,lo8(63))        CR_TAB
++                      AS2 (sbci,r29,hi8(63))        CR_TAB
++                      AS2 (subi,r28,lo8(%o1-63))    CR_TAB
++                      AS2 (sbci,r29,hi8(%o1-63)));
++            }
++            else
++            {
++              *l = 3;
++              return (AS2 (adiw,r28,%o1-63) CR_TAB
++                      AS2 (ldd,%0,Y+63)     CR_TAB
++                      AS2 (sbiw,r28,%o1-63));
++            }
++        }
+         return *l = 5, (AS2 (subi,r28,lo8(-%o1)) CR_TAB
+                         AS2 (sbci,r29,hi8(-%o1)) CR_TAB
+@@ -2217,38 +2226,75 @@ out_movqi_r_mr (rtx insn, rtx op[], int 
+            it but I have this situation with extremal optimizing options.  */
+         if (reg_overlap_mentioned_p (dest, XEXP (x,0))
+             || reg_unused_after (insn, XEXP (x,0)))
+-          return *l = 2, AVR_TINY ? (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
+-                                                AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
+-                                                AS2 (ld,%0,X))
+-                                                 : (AS2 (adiw,r26,%o1) CR_TAB
+-                          AS2 (ld,%0,X));
+-
+-          return *l = 3, AVR_TINY ? (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
+-                                                AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
+-                                                AS2 (ld,%0,X) CR_TAB
+-                                                AS2 (subi,r26,lo8(%o1)) CR_TAB 
+-                                        AS2 (sbci,r27,hi8(%o1))) 
+-                                                 : (AS2 (adiw,r26,%o1) CR_TAB
+-                        AS2 (ld,%0,X)      CR_TAB
+-                        AS2 (sbiw,r26,%o1));
++          {
++            if (AVR_TINY)
++            {
++              *l = 3;
++              return (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,%0,X));
++            }
++            else
++            {
++              *l = 2;
++              return (AS2 (adiw,r26,%o1) CR_TAB
++                      AS2 (ld,%0,X));
++            }
++          }
++
++          if (AVR_TINY)
++          {
++            *l = 5;
++            return (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
++                    AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
++                    AS2 (ld,%0,X) CR_TAB
++                    AS2 (subi,r26,lo8(%o1)) CR_TAB 
++                    AS2 (sbci,r27,hi8(%o1)));
++          }
++          else
++          {
++            *l = 3;
++            return (AS2 (adiw,r26,%o1) CR_TAB
++                    AS2 (ld,%0,X)      CR_TAB
++                    AS2 (sbiw,r26,%o1));
++          }
+       }
+-      *l = 1;
+         op[2] = XEXP(x, 0);
+         if(REGNO(op[2]) == REG_Y)
+-                        return AVR_TINY ? ( AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+-                                              AS2 (ld,%0,Y)              CR_TAB
+-                                  AS2 (subi,%A2,lo8(%o1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1)))
+-                                               :   AS2 (ldd,%0,%1);
++          {
++            if (AVR_TINY)
++            {
++              *l = 5;
++              return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,%0,Y)              CR_TAB
++                      AS2 (subi,%A2,lo8(%o1)) CR_TAB
++                      AS2 (sbci,%B2,hi8(%o1)));
++            }
++            else
++            {
++              *l = 1;
++              return (AS2 (ldd,%0,%1));
++            }
++          }
+         if(REGNO(op[2]) == REG_Z)
+-                        return AVR_TINY ? ( AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+-                                              AS2 (ld,%0,Z)              CR_TAB
+-                                  AS2 (subi,%A2,lo8(%o1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1)))
+-                                               :   AS2 (ldd,%0,%1);
++          {
++            if (AVR_TINY)
++            {
++              *l = 5;
++              return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,%0,Z)              CR_TAB
++                      AS2 (subi,%A2,lo8(%o1)) CR_TAB
++                      AS2 (sbci,%B2,hi8(%o1)));
++            }
++            else
++            {
++              *l = 1;
++              return (AS2 (ldd,%0,%1));
++            }
++          }
+     }
+   *l = 1;
+   return AS2 (ld,%0,%1);
+@@ -2287,36 +2333,57 @@ out_movhi_r_mr (rtx insn, rtx op[], int 
+             return (AS2 (ld,%A0,X+) CR_TAB
+                     AS2 (ld,%B0,X));
+           }
+-        *l  = 3;
+-        return AVR_TINY ? (AS2 (ld,%A0,X+) CR_TAB
+-                              AS2 (ld,%B0,X)  CR_TAB
+-                              AS2 (subi,r26,lo8(1))          CR_TAB
+-                              AS2 (sbci,r27,hi8(1))) 
+-                       : (AS2 (ld,%A0,X+) CR_TAB
+-                AS2 (ld,%B0,X) CR_TAB
+-                AS2 (sbiw,r26,1));
++
++          if (AVR_TINY)
++          {
++            *l = 4;
++            return (AS2 (ld,%A0,X+)       CR_TAB
++                    AS2 (ld,%B0,X)        CR_TAB
++                    AS2 (subi,r26,lo8(1)) CR_TAB
++                    AS2 (sbci,r27,hi8(1)));
++          }
++          else
++          {
++            *l = 3;
++            return (AS2 (ld,%A0,X+) CR_TAB
++                    AS2 (ld,%B0,X)  CR_TAB
++                    AS2 (sbiw,r26,1));
++          }
+         }
+       else                      /* (R)  */
+       {
+-        *l = 2;
+         if(reg_base == REG_Y)
+-        return AVR_TINY ? (AS2 (ld,%A0,%1) CR_TAB
+-                              AS2 (subi,r28,lo8((-1))) CR_TAB
+-                              AS2 (sbci,r29,hi8((-1))) CR_TAB 
+-                      AS2 (ld,%B0,%1) CR_TAB
+-                              AS2 (subi,r28,lo8(1)) CR_TAB
+-                              AS2 (sbci,r29,hi8(1)))             
+-                       : (AS2 (ld,%A0,%1) CR_TAB
+-                              AS2 (ldd,%B0,%1+1));
++          {
++            if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (ld,%A0,%1) CR_TAB
++                      AS2 (subi,r28,lo8((-1))) CR_TAB
++                      AS2 (sbci,r29,hi8((-1))) CR_TAB 
++                      AS2 (ld,%B0,%1) CR_TAB
++                      AS2 (subi,r28,lo8(1)) CR_TAB
++                      AS2 (sbci,r29,hi8(1)));
++            } else {
++              *l = 2;
++              return (AS2 (ld,%A0,%1) CR_TAB
++                      AS2 (ldd,%B0,%1+1));
++            }
++          }
+         if(reg_base == REG_Z)
+-        return AVR_TINY ? (AS2 (ld,%A0,%1) CR_TAB
+-                              AS2 (subi,r30,lo8((-1))) CR_TAB
+-                              AS2 (sbci,r31,hi8((-1))) CR_TAB 
+-                      AS2 (ld,%B0,%1) CR_TAB
+-                              AS2 (subi,r30,lo8(1)) CR_TAB
+-                              AS2 (sbci,r31,hi8(1)))
+-                       : (AS2 (ld,%A0,%1) CR_TAB
+-                AS2 (ldd,%B0,%1+1));
++          {
++            if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (ld,%A0,%1) CR_TAB
++                      AS2 (subi,r30,lo8((-1))) CR_TAB
++                      AS2 (sbci,r31,hi8((-1))) CR_TAB 
++                      AS2 (ld,%B0,%1) CR_TAB
++                      AS2 (subi,r30,lo8(1)) CR_TAB
++                      AS2 (sbci,r31,hi8(1)));
++            } else {
++              *l = 2;
++              return (AS2 (ld,%A0,%1) CR_TAB
++                      AS2 (ldd,%B0,%1+1));
++            }
++          }
+       }
+     }
+   else if (GET_CODE (base) == PLUS) /* (R + i) */
+@@ -2330,35 +2397,47 @@ out_movhi_r_mr (rtx insn, rtx op[], int 
+           fatal_insn ("incorrect insn:",insn);
+         
+         if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
+-          return *l = 4, AVR_TINY ? (AS2 (subi,r28,lo8(-(%o1-62))) CR_TAB 
+-                                        AS2 (sbci,r29,hi8(-(%o1-62))) CR_TAB
+-                                                AS2 (subi,r28,lo8(-62))       CR_TAB 
+-                                        AS2 (sbci,r29,hi8(-62))       CR_TAB
+-                                    AS2 (ld,%A0,Y+)                CR_TAB
+-                                    AS2 (ld,%B0,Y)                CR_TAB
+-                                                AS2 (subi,r28,lo8(63))       CR_TAB 
+-                                        AS2 (sbci,r29,hi8(63))       CR_TAB
+-                                                AS2 (subi,r28,lo8(%o1-62)) CR_TAB 
+-                                        AS2 (sbci,r29,hi8(%o1-62)))  
+-                                     : (AS2 (adiw,r28,%o1-62) CR_TAB
+-                          AS2 (ldd,%A0,Y+62)    CR_TAB
+-                          AS2 (ldd,%B0,Y+63)    CR_TAB
+-                          AS2 (sbiw,r28,%o1-62));
+-
+-        return *l = 6, AVR_TINY ? (AS2 (subi,r28,lo8(-%o1)) CR_TAB
+-                                              AS2 (sbci,r29,hi8(-%o1)) CR_TAB
+-                                              AS2 (ld,%A0,Y+)          CR_TAB
+-                                              AS2 (ld,%B0,Y)           CR_TAB
+-                                              AS2 (subi,r28,lo8(1))   CR_TAB
+-                                              AS2 (sbci,r29,hi8(1))   CR_TAB
+-                                      AS2 (subi,r28,lo8(%o1))  CR_TAB
+-                                              AS2 (sbci,r29,hi8(%o1)))
+-                                               : (AS2 (subi,r28,lo8(-%o1)) CR_TAB
+-                        AS2 (sbci,r29,hi8(-%o1)) CR_TAB
+-                        AS2 (ld,%A0,Y)           CR_TAB
+-                        AS2 (ldd,%B0,Y+1)        CR_TAB
+-                        AS2 (subi,r28,lo8(%o1))  CR_TAB
+-                        AS2 (sbci,r29,hi8(%o1)));
++          {
++            if (AVR_TINY) {
++              *l = 10;
++              return (AS2 (subi,r28,lo8(-(%o1-62))) CR_TAB 
++                      AS2 (sbci,r29,hi8(-(%o1-62))) CR_TAB
++                      AS2 (subi,r28,lo8(-62))       CR_TAB 
++                      AS2 (sbci,r29,hi8(-62))       CR_TAB
++                      AS2 (ld,%A0,Y+)               CR_TAB
++                      AS2 (ld,%B0,Y)                CR_TAB
++                      AS2 (subi,r28,lo8(63))        CR_TAB 
++                      AS2 (sbci,r29,hi8(63))        CR_TAB
++                      AS2 (subi,r28,lo8(%o1-62))    CR_TAB 
++                      AS2 (sbci,r29,hi8(%o1-62)));
++            } else {
++              *l = 4;
++              return (AS2 (adiw,r28,%o1-62) CR_TAB
++                      AS2 (ldd,%A0,Y+62)    CR_TAB
++                      AS2 (ldd,%B0,Y+63)    CR_TAB
++                      AS2 (sbiw,r28,%o1-62));
++            }
++          }
++
++        if (AVR_TINY) {
++            *l = 8;
++            return (AS2 (subi,r28,lo8(-%o1)) CR_TAB
++                    AS2 (sbci,r29,hi8(-%o1)) CR_TAB
++                    AS2 (ld,%A0,Y+)          CR_TAB
++                    AS2 (ld,%B0,Y)           CR_TAB
++                    AS2 (subi,r28,lo8(1))    CR_TAB
++                    AS2 (sbci,r29,hi8(1))    CR_TAB
++                    AS2 (subi,r28,lo8(%o1))  CR_TAB
++                    AS2 (sbci,r29,hi8(%o1)));
++          } else {
++            *l = 6;
++            return (AS2 (subi,r28,lo8(-%o1)) CR_TAB
++                    AS2 (sbci,r29,hi8(-%o1)) CR_TAB
++                    AS2 (ld,%A0,Y)           CR_TAB
++                    AS2 (ldd,%B0,Y+1)        CR_TAB
++                    AS2 (subi,r28,lo8(%o1))  CR_TAB
++                    AS2 (sbci,r29,hi8(%o1)));
++          }
+       }
+       if (reg_base == REG_X)
+       {
+@@ -2366,80 +2445,114 @@ out_movhi_r_mr (rtx insn, rtx op[], int 
+            it but I have this situation with extremal
+            optimization options.  */
+         
+-        *l = 4;
+-        if (reg_base == reg_dest)
+-          return AVR_TINY ? (AS2 (subi,r26,lo8(-%o1))      CR_TAB
+-                                AS2 (sbci,r27,hi8(-%o1))      CR_TAB
+-                        AS2 (ld,__tmp_reg__,X+)       CR_TAB
+-                        AS2 (ld,%B0,X)                CR_TAB
+-                        AS2 (mov,%A0,__tmp_reg__))
+-                             : (AS2 (adiw,r26,%o1)      CR_TAB
+-                  AS2 (ld,__tmp_reg__,X+) CR_TAB
+-                  AS2 (ld,%B0,X)          CR_TAB
+-                  AS2 (mov,%A0,__tmp_reg__));
+-
+-          return AVR_TINY ? (AS2 (subi,r26,lo8(-%o1))      CR_TAB
+-                        AS2 (sbci,r27,hi8(-%o1))      CR_TAB
+-                        AS2 (ld,%A0,X+)                            CR_TAB
+-                        AS2 (ld,%B0,X)                CR_TAB
+-                                AS2 (subi,r26,lo8(%o1+1))     CR_TAB 
+-                                AS2 (sbci,r27,hi8(%o1+1)))  
+-                         : (AS2 (adiw,r26,%o1) CR_TAB
+-                AS2 (ld,%A0,X+)    CR_TAB
+-                AS2 (ld,%B0,X)     CR_TAB
+-                AS2 (sbiw,r26,%o1+1));
++        if (reg_base == reg_dest) {
++            if (AVR_TINY) {
++              *l = 5;
++              return (AS2 (subi,r26,lo8(-%o1))      CR_TAB
++                      AS2 (sbci,r27,hi8(-%o1))      CR_TAB
++                      AS2 (ld,__tmp_reg__,X+)       CR_TAB
++                      AS2 (ld,%B0,X)                CR_TAB
++                      AS2 (mov,%A0,__tmp_reg__));
++            } else {
++              *l = 4;
++              return (AS2 (adiw,r26,%o1)      CR_TAB
++                      AS2 (ld,__tmp_reg__,X+) CR_TAB
++                      AS2 (ld,%B0,X)          CR_TAB
++                      AS2 (mov,%A0,__tmp_reg__));
++            }
++          }
++
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (subi,r26,lo8(-%o1))      CR_TAB
++                    AS2 (sbci,r27,hi8(-%o1))      CR_TAB
++                    AS2 (ld,%A0,X+)             CR_TAB
++                    AS2 (ld,%B0,X)                CR_TAB
++                    AS2 (subi,r26,lo8(%o1+1))     CR_TAB 
++                    AS2 (sbci,r27,hi8(%o1+1)));
++          } else {
++            *l = 4;
++            return (AS2 (adiw,r26,%o1) CR_TAB
++                    AS2 (ld,%A0,X+)    CR_TAB
++                    AS2 (ld,%B0,X)     CR_TAB
++                    AS2 (sbiw,r26,%o1+1));
++          }
+       }
+       if (reg_base == reg_dest)
+       {
+-        *l = 3;
+         op[2] = XEXP(base, 0);
+-        if(REGNO(op[2]) == REG_Y)
+-                        return AVR_TINY ? ( AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+-                                              AS2 (ld,__tmp_reg__,Y+)     CR_TAB
+-                              AS2 (ld,%B0,Y)         CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+1)) CR_TAB
+-                                              AS2 (mov,%A0,__tmp_reg__))
+-                                       :  (AS2 (ldd,__tmp_reg__,%A1) CR_TAB
+-                              AS2 (ldd,%B0,%B1)         CR_TAB
+-                              AS2 (mov,%A0,__tmp_reg__));
+-        if(REGNO(op[2]) == REG_Z)
+-                        return AVR_TINY ? ( AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+-                                              AS2 (ld,__tmp_reg__,Z+)     CR_TAB
+-                              AS2 (ld,%B0,Z)         CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+1)) CR_TAB
+-                                              AS2 (mov,%A0,__tmp_reg__))
+-                                       :  (AS2 (ldd,__tmp_reg__,%A1) CR_TAB
+-                AS2 (ldd,%B0,%B1)         CR_TAB
+-                AS2 (mov,%A0,__tmp_reg__));
++        if(REGNO(op[2]) == REG_Y) {
++            if (AVR_TINY) {
++              *l = 7;
++              return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,__tmp_reg__,Y+)    CR_TAB
++                      AS2 (ld,%B0,Y)             CR_TAB
++                      AS2 (subi,%A2,lo8(%o1+1))  CR_TAB
++                      AS2 (sbci,%B2,hi8(%o1+1))  CR_TAB
++                      AS2 (mov,%A0,__tmp_reg__));
++            } else {
++              *l = 3;
++              return (AS2 (ldd,__tmp_reg__,%A1) CR_TAB
++                      AS2 (ldd,%B0,%B1)         CR_TAB
++                      AS2 (mov,%A0,__tmp_reg__));
++            }
++          }
++        if(REGNO(op[2]) == REG_Z) {
++            if (AVR_TINY) {
++              *l = 7;
++              return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,__tmp_reg__,Z+)    CR_TAB
++                      AS2 (ld,%B0,Z)             CR_TAB
++                      AS2 (subi,%A2,lo8(%o1+1))  CR_TAB
++                      AS2 (sbci,%B2,hi8(%o1+1))  CR_TAB
++                      AS2 (mov,%A0,__tmp_reg__));
++            } else {
++              *l = 3;
++              return (AS2 (ldd,__tmp_reg__,%A1) CR_TAB
++                      AS2 (ldd,%B0,%B1)         CR_TAB
++                      AS2 (mov,%A0,__tmp_reg__));
++            }
++          }
+       }
+-      *l = 2;
+         op[2] = XEXP(base, 0);
+         if(REGNO(op[2]) == REG_Y)
+-                        return AVR_TINY ? ( AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+-                                              AS2 (ld,%A0,Y+)             CR_TAB
+-                              AS2 (ld,%B0,Y)               CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+1)))
+-                                       :  (AS2 (ldd,%A0,%A1) CR_TAB
+-                              AS2 (ldd,%B0,%B1));
++          {
++            if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,%A0,Y+)            CR_TAB
++                      AS2 (ld,%B0,Y)             CR_TAB
++                      AS2 (subi,%A2,lo8(%o1+1))  CR_TAB
++                      AS2 (sbci,%B2,hi8(%o1+1)));
++            } else {
++              *l = 2;
++              return (AS2 (ldd,%A0,%A1) CR_TAB
++                      AS2 (ldd,%B0,%B1));
++            }
++          }
+         if(REGNO(op[2]) == REG_Z)
+-                        return AVR_TINY ? ( AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+-                                              AS2 (ld,%A0,Z+)             CR_TAB
+-                              AS2 (ld,%B0,Z)              CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+1)))
+-                                       :  (AS2 (ldd,%A0,%A1) CR_TAB
+-            AS2 (ldd,%B0,%B1));
++          {
++            if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,%A0,Z+)            CR_TAB
++                      AS2 (ld,%B0,Z)             CR_TAB
++                      AS2 (subi,%A2,lo8(%o1+1))  CR_TAB
++                      AS2 (sbci,%B2,hi8(%o1+1)));
++            } else {
++              *l = 2;
++              return (AS2 (ldd,%A0,%A1) CR_TAB
++                      AS2 (ldd,%B0,%B1));
++            }
++          }
+       
+     }
+   else if (GET_CODE (base) == PRE_DEC) /* (--R) */
+@@ -2450,35 +2563,43 @@ out_movhi_r_mr (rtx insn, rtx op[], int 
+       if (mem_volatile_p)
+         {
+           if (REGNO (XEXP (base, 0)) == REG_X)
+-            {
++          {
++            if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (subi,r26,lo8(2))  CR_TAB
++                      AS2 (sbci,r27,hi8(2))  CR_TAB
++                      AS2 (ld,%A0,X+)        CR_TAB
++                      AS2 (ld,%B0,X)         CR_TAB
++                      AS2 (subi,r26,lo8(1))  CR_TAB
++                      AS2 (sbci,r27,hi8(1)));
++            } else {
+               *l = 4;
+-              return AVR_TINY ? (AS2 (subi,r26,lo8(2))  CR_TAB
+-                                          AS2 (sbci,r27,hi8(2))   CR_TAB
+-                        AS2 (ld,%A0,X+)            CR_TAB
+-                        AS2 (ld,%B0,X)             CR_TAB
+-                                              AS2 (subi,r26,lo8(1))  CR_TAB
+-                                              AS2 (sbci,r27,hi8(1)))
+-                                       : (AS2 (sbiw,r26,2)  CR_TAB
++              return (AS2 (sbiw,r26,2)  CR_TAB
+                       AS2 (ld,%A0,X+)   CR_TAB
+                       AS2 (ld,%B0,X)    CR_TAB
+                       AS2 (sbiw,r26,1));
+             }
++          }
+           else
+-            {
++          {
++            //FIXME:check the code once again for AVR_TINY
++            if (AVR_TINY) {
++              *l = 8;
++              return (AS2 (subi,%A1,lo8(3))  CR_TAB
++                      AS2 (sbci,%B1,hi8(3))  CR_TAB
++                      AS2 (ld,%A0,%p1)       CR_TAB
++                      AS2 (subi,%A1,lo8(-1)) CR_TAB
++                      AS2 (sbci,%B1,hi8(-1)) CR_TAB
++                      AS2 (ld,%B0,%p1)       CR_TAB
++                      AS2 (subi,%A1,lo8(1))  CR_TAB
++                      AS2 (sbci,%B1,hi8(1)));
++            } else {
+               *l = 3;
+-                        //FIXME:check the code once again for AVR_TINY
+-              return AVR_TINY ? (AS2 (subi,%A1,lo8(3))  CR_TAB 
+-                                          AS2 (sbci,%B1,hi8(3))  CR_TAB
+-                        AS2 (ld,%A0,%p1)       CR_TAB
+-                                              AS2 (subi,%A1,lo8(-1)) CR_TAB
+-                                              AS2 (sbci,%B1,hi8(-1)) CR_TAB
+-                        AS2 (ld,%B0,%p1)       CR_TAB
+-                                              AS2 (subi,%A1,lo8(1)) CR_TAB
+-                                              AS2 (sbci,%B1,hi8(1)))
+-                                       : (AS2 (sbiw,%r1,2)   CR_TAB
+-                      AS2 (ld,%A0,%p1)  CR_TAB
++              return (AS2 (sbiw,%r1,2)   CR_TAB
++                      AS2 (ld,%A0,%p1)   CR_TAB
+                       AS2 (ldd,%B0,%p1+1));
+             }
++          }
+         }
+       *l = 2;
+@@ -2529,24 +2650,30 @@ out_movsi_r_mr (rtx insn, rtx op[], int 
+     {
+       if (reg_base == REG_X)        /* (R26) */
+         {
+-          if (reg_dest == REG_X)
++          if (reg_dest == REG_X) {
+           /* "ld r26,-X" is undefined */
+-          return *l=7, AVR_TINY ? (AS2 (subi,r26,lo8(-3))  CR_TAB
+-                                              AS2 (sbci,r27,hi8(-3))  CR_TAB
+-                                  AS2 (ld,r29,X)          CR_TAB
+-                                  AS2 (ld,r28,-X)         CR_TAB
+-                                  AS2 (ld,__tmp_reg__,-X) CR_TAB
+-                                  AS2 (subi,r26,lo8(1))   CR_TAB
+-                                  AS2 (sbci,r27,hi8(1))   CR_TAB
+-                                  AS2 (ld,r26,X)          CR_TAB
+-                                  AS2 (mov,r27,__tmp_reg__))
+-                                   : (AS2 (adiw,r26,3)        CR_TAB
+-                        AS2 (ld,r29,X)          CR_TAB
+-                        AS2 (ld,r28,-X)         CR_TAB
+-                        AS2 (ld,__tmp_reg__,-X) CR_TAB
+-                        AS2 (sbiw,r26,1)        CR_TAB
+-                        AS2 (ld,r26,X)          CR_TAB
+-                        AS2 (mov,r27,__tmp_reg__));
++            if (AVR_TINY) {
++              *l = 9;
++              return (AS2 (subi,r26,lo8(-3))  CR_TAB
++                      AS2 (sbci,r27,hi8(-3))  CR_TAB
++                    AS2 (ld,r29,X)          CR_TAB
++                      AS2 (ld,r28,-X)         CR_TAB
++                      AS2 (ld,__tmp_reg__,-X) CR_TAB
++                      AS2 (subi,r26,lo8(1))   CR_TAB
++                      AS2 (sbci,r27,hi8(1))   CR_TAB
++                      AS2 (ld,r26,X)          CR_TAB
++                      AS2 (mov,r27,__tmp_reg__));
++            } else {
++              *l = 7;
++              return (AS2 (adiw,r26,3)        CR_TAB
++                      AS2 (ld,r29,X)          CR_TAB
++                      AS2 (ld,r28,-X)         CR_TAB
++                      AS2 (ld,__tmp_reg__,-X) CR_TAB
++                      AS2 (sbiw,r26,1)        CR_TAB
++                      AS2 (ld,r26,X)          CR_TAB
++                      AS2 (mov,r27,__tmp_reg__));
++            }
++          }
+           else if (reg_dest == REG_X - 2)
+             return *l=5, (AS2 (ld,%A0,X+)  CR_TAB
+@@ -2559,113 +2686,154 @@ out_movsi_r_mr (rtx insn, rtx op[], int 
+                            AS2 (ld,%B0,X+) CR_TAB
+                            AS2 (ld,%C0,X+) CR_TAB
+                            AS2 (ld,%D0,X));
+-          else
+-            return  *l=5, AVR_TINY ? (AS2 (ld,%A0,X+) CR_TAB
+-                             AS2 (ld,%B0,X+) CR_TAB
+-                             AS2 (ld,%C0,X+) CR_TAB
+-                             AS2 (ld,%D0,X)  CR_TAB
+-                             AS2 (subi,r26,lo8(3)) CR_TAB
+-                             AS2 (sbci,r27,hi8(3)))
+-                                                : (AS2 (ld,%A0,X+) CR_TAB
+-                           AS2 (ld,%B0,X+) CR_TAB
+-                           AS2 (ld,%C0,X+) CR_TAB
+-                           AS2 (ld,%D0,X)  CR_TAB
+-                           AS2 (sbiw,r26,3));
++          else {
++            if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (ld,%A0,X+) CR_TAB
++                      AS2 (ld,%B0,X+) CR_TAB
++                      AS2 (ld,%C0,X+) CR_TAB
++                      AS2 (ld,%D0,X)  CR_TAB
++                      AS2 (subi,r26,lo8(3)) CR_TAB
++                      AS2 (sbci,r27,hi8(3)));
++            } else {
++              *l = 5;
++              return (AS2 (ld,%A0,X+) CR_TAB
++                      AS2 (ld,%B0,X+) CR_TAB
++                      AS2 (ld,%C0,X+) CR_TAB
++                      AS2 (ld,%D0,X)  CR_TAB
++                      AS2 (sbiw,r26,3));
++            }
++          }
+         }
+       else
+         {
+           if (reg_dest == reg_base)
+-                {
+-                        if(reg_base == REG_Y)
+-            return *l=5, AVR_TINY ? (AS2 (subi,r28,lo8(-3)) CR_TAB
+-                                                      AS2 (sbci,r29,hi8(-3)) CR_TAB
+-                                          AS2 (ld,%D0,Y)        CR_TAB
+-                            AS2 (ld,%C0,-Y)        CR_TAB
+-                            AS2 (subi,r28,lo8(1)) CR_TAB
+-                            AS2 (sbci,r29,hi8(1)) CR_TAB
+-                            AS2 (ld,__tmp_reg__,%1)  CR_TAB
+-                            AS2 (subi,r28,lo8(1)) CR_TAB
+-                            AS2 (sbci,r29,hi8(1)) CR_TAB
+-                            AS2 (ld,%A0,%1)  CR_TAB
+-                            AS2 (mov,%B0,__tmp_reg__))
+-                                           : (AS2 (ldd,%D0,%1+3) CR_TAB
+-                            AS2 (ldd,%C0,%1+2) CR_TAB
+-                            AS2 (ldd,__tmp_reg__,%1+1)  CR_TAB
+-                            AS2 (ld,%A0,%1)  CR_TAB
+-                            AS2 (mov,%B0,__tmp_reg__));
+-                        if(reg_base == REG_Z)
+-            return *l=5, AVR_TINY ? (AS2 (subi,r30,lo8(-3)) CR_TAB
+-                                                      AS2 (sbci,r31,hi8(-3)) CR_TAB
+-                                          AS2 (ld,%D0,Z)        CR_TAB
+-                            AS2 (ld,%C0,-Z)        CR_TAB
+-                            AS2 (subi,r30,lo8(1)) CR_TAB
+-                            AS2 (sbci,r31,hi8(1)) CR_TAB
+-                            AS2 (ld,__tmp_reg__,%1)  CR_TAB
+-                            AS2 (subi,r30,lo8(1)) CR_TAB
+-                            AS2 (sbci,r31,hi8(1)) CR_TAB
+-                            AS2 (ld,%A0,%1)  CR_TAB
+-                            AS2 (mov,%B0,__tmp_reg__))
+-                                           : (AS2 (ldd,%D0,%1+3) CR_TAB
+-                          AS2 (ldd,%C0,%1+2) CR_TAB
+-                          AS2 (ldd,__tmp_reg__,%1+1)  CR_TAB
+-                          AS2 (ld,%A0,%1)  CR_TAB
+-                          AS2 (mov,%B0,__tmp_reg__));
+-                }
++        {
++            if(reg_base == REG_Y) {
++              if (AVR_TINY) {
++                *l = 11;
++                return (AS2 (subi,r28,lo8(-3)) CR_TAB
++                        AS2 (sbci,r29,hi8(-3)) CR_TAB
++                        AS2 (ld,%D0,Y)         CR_TAB
++                        AS2 (ld,%C0,-Y)        CR_TAB
++                        AS2 (subi,r28,lo8(1))  CR_TAB
++                        AS2 (sbci,r29,hi8(1))  CR_TAB
++                        AS2 (ld,__tmp_reg__,%1)  CR_TAB
++                        AS2 (subi,r28,lo8(1)) CR_TAB
++                        AS2 (sbci,r29,hi8(1)) CR_TAB
++                        AS2 (ld,%A0,%1)  CR_TAB
++                        AS2 (mov,%B0,__tmp_reg__));
++              } else {
++                *l = 5;
++                return (AS2 (ldd,%D0,%1+3) CR_TAB
++                        AS2 (ldd,%C0,%1+2) CR_TAB
++                        AS2 (ldd,__tmp_reg__,%1+1)  CR_TAB
++                        AS2 (ld,%A0,%1)  CR_TAB
++                        AS2 (mov,%B0,__tmp_reg__));
++              }
++            }
++            if(reg_base == REG_Z) {
++              if (AVR_TINY) {
++                *l = 11;
++                return (AS2 (subi,r30,lo8(-3)) CR_TAB
++                        AS2 (sbci,r31,hi8(-3)) CR_TAB
++                        AS2 (ld,%D0,Z)         CR_TAB
++                        AS2 (ld,%C0,-Z)        CR_TAB
++                        AS2 (subi,r30,lo8(1))  CR_TAB
++                        AS2 (sbci,r31,hi8(1))  CR_TAB
++                        AS2 (ld,__tmp_reg__,%1)  CR_TAB
++                        AS2 (subi,r30,lo8(1)) CR_TAB
++                        AS2 (sbci,r31,hi8(1)) CR_TAB
++                        AS2 (ld,%A0,%1)  CR_TAB
++                        AS2 (mov,%B0,__tmp_reg__));
++              } else {
++                *l = 5;
++                return (AS2 (ldd,%D0,%1+3) CR_TAB
++                        AS2 (ldd,%C0,%1+2) CR_TAB
++                        AS2 (ldd,__tmp_reg__,%1+1)  CR_TAB
++                        AS2 (ld,%A0,%1)  CR_TAB
++                        AS2 (mov,%B0,__tmp_reg__));
++              }
++            }
++          }
+           else if (reg_base == reg_dest + 2)
+-                {
+-                        if(reg_base == REG_Y)
+-            return *l=5, AVR_TINY ? (AS2 (ld ,%A0,Y+)       CR_TAB
+-                            AS2 (ld,%B0,Y+) CR_TAB
+-                            AS2 (ld,__tmp_reg__,Y+) CR_TAB
+-                            AS2 (ld,%D0,Y) CR_TAB
+-                            AS2 (subi,r28,lo8(3)) CR_TAB
+-                            AS2 (sbci,r29,hi8(3)) CR_TAB
+-                            AS2 (mov,%C0,__tmp_reg__))
+-                                           : (AS2 (ld ,%A0,%1)    CR_TAB
+-                            AS2 (ldd,%B0,%1+1) CR_TAB
+-                            AS2 (ldd,__tmp_reg__,%1+2)  CR_TAB
+-                            AS2 (ldd,%D0,%1+3) CR_TAB
+-                            AS2 (mov,%C0,__tmp_reg__));
+-                        if(reg_base == REG_Z)
+-            return *l=5, AVR_TINY ? (AS2 (ld ,%A0,Z+)       CR_TAB
+-                            AS2 (ld,%B0,Z+) CR_TAB
+-                            AS2 (ld,__tmp_reg__,Z+) CR_TAB
+-                            AS2 (ld,%D0,Z) CR_TAB
+-                            AS2 (subi,r30,lo8(3)) CR_TAB
+-                            AS2 (sbci,r31,hi8(3)) CR_TAB
+-                            AS2 (mov,%C0,__tmp_reg__))
+-                                           : (AS2 (ld ,%A0,%1)    CR_TAB
+-                          AS2 (ldd,%B0,%1+1) CR_TAB
+-                          AS2 (ldd,__tmp_reg__,%1+2)  CR_TAB
+-                          AS2 (ldd,%D0,%1+3) CR_TAB
+-                          AS2 (mov,%C0,__tmp_reg__));
+-                }
+-          else
+-                {
+-                        if(reg_base == REG_Y)
+-            return *l=4, AVR_TINY ? (AS2 (ld ,%A0,Y+)   CR_TAB
+-                            AS2 (ld,%B0,Y+) CR_TAB
+-                            AS2 (ld,%C0,Y+) CR_TAB
+-                            AS2 (ld,%D0,Y)  CR_TAB
+-                            AS2 (subi,r28,lo8(3)) CR_TAB
+-                            AS2 (sbci,r29,hi8(3)))
+-                                                   : (AS2 (ld ,%A0,%1)   CR_TAB
+-                          AS2 (ldd,%B0,%1+1) CR_TAB
+-                          AS2 (ldd,%C0,%1+2) CR_TAB
+-                          AS2 (ldd,%D0,%1+3));
+-                        if(reg_base == REG_Z)
+-            return *l=4, AVR_TINY ? (AS2 (ld ,%A0,Z+)   CR_TAB
+-                            AS2 (ld,%B0,Z+) CR_TAB
+-                            AS2 (ld,%C0,Z+) CR_TAB
+-                            AS2 (ld,%D0,Z) CR_TAB
+-                            AS2 (subi,r30,lo8(3)) CR_TAB
+-                            AS2 (sbci,r31,hi8(3))) 
+-                                                   : (AS2 (ld ,%A0,%1)   CR_TAB
+-                            AS2 (ldd,%B0,%1+1) CR_TAB
+-                            AS2 (ldd,%C0,%1+2) CR_TAB
+-                            AS2 (ldd,%D0,%1+3));
+-        }
++          {
++            if(reg_base == REG_Y) {
++              if (AVR_TINY) {
++                *l = 7;
++                return (AS2 (ld ,%A0,Y+)       CR_TAB
++                        AS2 (ld,%B0,Y+) CR_TAB
++                        AS2 (ld,__tmp_reg__,Y+) CR_TAB
++                        AS2 (ld,%D0,Y) CR_TAB
++                        AS2 (subi,r28,lo8(3)) CR_TAB
++                        AS2 (sbci,r29,hi8(3)) CR_TAB
++                        AS2 (mov,%C0,__tmp_reg__));
++              } else {
++                *l = 5;
++                return (AS2 (ld ,%A0,%1)    CR_TAB
++                        AS2 (ldd,%B0,%1+1) CR_TAB
++                        AS2 (ldd,__tmp_reg__,%1+2)  CR_TAB
++                        AS2 (ldd,%D0,%1+3) CR_TAB
++                        AS2 (mov,%C0,__tmp_reg__));
++              }
++            }
++
++            if(reg_base == REG_Z) {
++              if (AVR_TINY) {
++                *l = 7;
++                return (AS2 (ld ,%A0,Z+) CR_TAB
++                        AS2 (ld,%B0,Z+) CR_TAB
++                        AS2 (ld,__tmp_reg__,Z+) CR_TAB
++                        AS2 (ld,%D0,Z) CR_TAB
++                        AS2 (subi,r30,lo8(3)) CR_TAB
++                        AS2 (sbci,r31,hi8(3)) CR_TAB
++                        AS2 (mov,%C0,__tmp_reg__));
++              } else {
++                *l = 5;
++                return (AS2 (ld ,%A0,%1)    CR_TAB
++                        AS2 (ldd,%B0,%1+1) CR_TAB
++                        AS2 (ldd,__tmp_reg__,%1+2)  CR_TAB
++                        AS2 (ldd,%D0,%1+3) CR_TAB
++                        AS2 (mov,%C0,__tmp_reg__));
++              }
++            }
++          } else {
++            if(reg_base == REG_Y) {
++              if (AVR_TINY) {
++                *l = 6;
++                return (AS2 (ld ,%A0,Y+) CR_TAB
++                        AS2 (ld,%B0,Y+) CR_TAB
++                        AS2 (ld,%C0,Y+) CR_TAB
++                        AS2 (ld,%D0,Y) CR_TAB
++                        AS2 (subi,r28,lo8(3)) CR_TAB
++                        AS2 (sbci,r29,hi8(3)));
++              } else {
++                *l = 4;
++                return (AS2 (ld ,%A0,%1)   CR_TAB
++                        AS2 (ldd,%B0,%1+1) CR_TAB
++                        AS2 (ldd,%C0,%1+2) CR_TAB
++                        AS2 (ldd,%D0,%1+3));
++              }
++            }
++            if(reg_base == REG_Z) {
++              if (AVR_TINY) {
++                *l = 6;
++                return (AS2 (ld ,%A0,Z+) CR_TAB
++                        AS2 (ld,%B0,Z+) CR_TAB
++                        AS2 (ld,%C0,Z+) CR_TAB
++                        AS2 (ld,%D0,Z) CR_TAB
++                        AS2 (subi,r30,lo8(3)) CR_TAB
++                        AS2 (sbci,r31,hi8(3)));
++              } else {
++                *l = 4;
++                return (AS2 (ld ,%A0,%1)   CR_TAB
++                        AS2 (ldd,%B0,%1+1) CR_TAB
++                        AS2 (ldd,%C0,%1+2) CR_TAB
++                        AS2 (ldd,%D0,%1+3));
++              }
++            }
++          }
+         }
+     }
+   else if (GET_CODE (base) == PLUS) /* (R + i) */
+@@ -2677,44 +2845,54 @@ out_movsi_r_mr (rtx insn, rtx op[], int 
+         if (REGNO (XEXP (base, 0)) != REG_Y)
+           fatal_insn ("incorrect insn:",insn);
+-        if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
+-          return *l = 6, AVR_TINY ? (AS2 (subi,r28,lo8(-(%o1-60))) CR_TAB
+-                                                AS2 (sbci,r29,hi8(-(%o1-60))) CR_TAB
+-                          AS2 (subi,r28,lo8(-60)) CR_TAB
+-                          AS2 (sbci,r29,hi8(-60)) CR_TAB
+-                                                AS2 (ld,%A0,Y+)    CR_TAB
+-                                                AS2 (ld,%B0,Y+)    CR_TAB
+-                                                AS2 (ld,%C0,Y+)    CR_TAB
+-                                                AS2 (ld,%D0,Y)    CR_TAB
+-                          AS2 (subi,r28,lo8(63)) CR_TAB
+-                          AS2 (sbci,r29,hi8(63)) CR_TAB
+-                          AS2 (subi,r28,lo8(%o1-60)) CR_TAB
+-                          AS2 (sbci,r29,hi8(%o1-60)))
+-                                                 : (AS2 (adiw,r28,%o1-60) CR_TAB
+-                          AS2 (ldd,%A0,Y+60)    CR_TAB
+-                          AS2 (ldd,%B0,Y+61)    CR_TAB
+-                          AS2 (ldd,%C0,Y+62)    CR_TAB
+-                          AS2 (ldd,%D0,Y+63)    CR_TAB
+-                          AS2 (sbiw,r28,%o1-60));
+-
+-        return *l = 8, AVR_TINY ? (AS2 (subi,r28,lo8(-%o1)) CR_TAB
+-                                              AS2 (sbci,r29,hi8(-%o1)) CR_TAB
+-                                              AS2 (ld,%A0,Y+)           CR_TAB
+-                                              AS2 (ld,%B0,Y+)           CR_TAB
+-                                              AS2 (ld,%C0,Y+)           CR_TAB
+-                                              AS2 (ld,%D0,Y)           CR_TAB
+-                        AS2 (subi,r28,lo8(3))   CR_TAB
+-                        AS2 (sbci,r29,hi8(3))   CR_TAB
+-                                              AS2 (subi,r28,lo8(%o1))  CR_TAB
+-                                              AS2 (sbci,r29,hi8(%o1)))
+-                                   : (AS2 (subi,r28,lo8(-%o1)) CR_TAB
+-                        AS2 (sbci,r29,hi8(-%o1)) CR_TAB
+-                        AS2 (ld,%A0,Y)           CR_TAB
+-                        AS2 (ldd,%B0,Y+1)        CR_TAB
+-                        AS2 (ldd,%C0,Y+2)        CR_TAB
+-                        AS2 (ldd,%D0,Y+3)        CR_TAB
+-                        AS2 (subi,r28,lo8(%o1))  CR_TAB
+-                        AS2 (sbci,r29,hi8(%o1)));
++        if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src))) {
++          if (AVR_TINY) {
++              *l = 12;
++              return (AS2 (subi,r28,lo8(-(%o1-60))) CR_TAB
++                      AS2 (sbci,r29,hi8(-(%o1-60))) CR_TAB
++                      AS2 (subi,r28,lo8(-60)) CR_TAB
++                      AS2 (sbci,r29,hi8(-60)) CR_TAB
++                      AS2 (ld,%A0,Y+)    CR_TAB
++                      AS2 (ld,%B0,Y+)    CR_TAB
++                    AS2 (ld,%C0,Y+)    CR_TAB
++                      AS2 (ld,%D0,Y)    CR_TAB
++                      AS2 (subi,r28,lo8(63)) CR_TAB
++                      AS2 (sbci,r29,hi8(63)) CR_TAB
++                      AS2 (subi,r28,lo8(%o1-60)) CR_TAB
++                      AS2 (sbci,r29,hi8(%o1-60)));
++            } else {
++              *l = 6;
++              return (AS2 (adiw,r28,%o1-60) CR_TAB
++                      AS2 (ldd,%A0,Y+60)    CR_TAB
++                      AS2 (ldd,%B0,Y+61)    CR_TAB
++                      AS2 (ldd,%C0,Y+62)    CR_TAB
++                      AS2 (ldd,%D0,Y+63)    CR_TAB
++                      AS2 (sbiw,r28,%o1-60));
++            }
++          }
++          if (AVR_TINY) {
++            *l = 10;
++            return (AS2 (subi,r28,lo8(-%o1)) CR_TAB
++                    AS2 (sbci,r29,hi8(-%o1)) CR_TAB
++                    AS2 (ld,%A0,Y+)          CR_TAB
++                    AS2 (ld,%B0,Y+)          CR_TAB
++                    AS2 (ld,%C0,Y+)          CR_TAB
++                    AS2 (ld,%D0,Y)           CR_TAB
++                    AS2 (subi,r28,lo8(3))    CR_TAB
++                    AS2 (sbci,r29,hi8(3))    CR_TAB
++                    AS2 (subi,r28,lo8(%o1))  CR_TAB
++                    AS2 (sbci,r29,hi8(%o1)));
++          } else {
++            *l = 8;
++            return (AS2 (subi,r28,lo8(-%o1)) CR_TAB
++                    AS2 (sbci,r29,hi8(-%o1)) CR_TAB
++                    AS2 (ld,%A0,Y)           CR_TAB
++                    AS2 (ldd,%B0,Y+1)        CR_TAB
++                    AS2 (ldd,%C0,Y+2)        CR_TAB
++                    AS2 (ldd,%D0,Y+3)        CR_TAB
++                    AS2 (subi,r28,lo8(%o1))  CR_TAB
++                    AS2 (sbci,r29,hi8(%o1)));
++          }
+       }
+       reg_base = true_regnum (XEXP (base, 0));
+@@ -2722,154 +2900,204 @@ out_movsi_r_mr (rtx insn, rtx op[], int 
+       {
+         /* R = (X + d) */
+         if (reg_dest == REG_X)
+-          {
+-            *l = 7;
+-            /* "ld r26,-X" is undefined */
+-            return AVR_TINY ? (AS2 (subi,r26,lo8(-(%o1+3)))  CR_TAB
+-                                      AS2 (sbci,r27,hi8(-(%o1+3)))  CR_TAB
+-                                      AS2 (ld,r29,X)          CR_TAB
+-                          AS2 (ld,r28,-X)         CR_TAB
+-                          AS2 (ld,__tmp_reg__,-X) CR_TAB
+-                    AS2 (subi,r26,lo8(1))   CR_TAB
+-                    AS2 (sbci,r27,hi8(1))   CR_TAB
+-                          AS2 (ld,r26,X)          CR_TAB
+-                          AS2 (mov,r27,__tmp_reg__))
+-                           : (AS2 (adiw,r26,%o1+3)    CR_TAB
+-                    AS2 (ld,r29,X)          CR_TAB
+-                    AS2 (ld,r28,-X)         CR_TAB
+-                    AS2 (ld,__tmp_reg__,-X) CR_TAB
+-                    AS2 (sbiw,r26,1)        CR_TAB
+-                    AS2 (ld,r26,X)          CR_TAB
+-                    AS2 (mov,r27,__tmp_reg__));
+-          }
+-        *l = 6;
+-        if (reg_dest == REG_X - 2)
+-          return AVR_TINY ? (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
+-                                AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
+-                        AS2 (ld,r24,X+)         CR_TAB
+-                        AS2 (ld,r25,X+)         CR_TAB
+-                        AS2 (ld,__tmp_reg__,X+) CR_TAB
+-                        AS2 (ld,r27,X)          CR_TAB
+-                        AS2 (mov,r26,__tmp_reg__))
+-                         : (AS2 (adiw,r26,%o1)      CR_TAB
+-                  AS2 (ld,r24,X+)         CR_TAB
+-                  AS2 (ld,r25,X+)         CR_TAB
+-                  AS2 (ld,__tmp_reg__,X+) CR_TAB
+-                  AS2 (ld,r27,X)          CR_TAB
+-                  AS2 (mov,r26,__tmp_reg__));
+-
+-        return AVR_TINY ? (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
+-                          AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
+-                      AS2 (ld,%A0,X+)    CR_TAB
+-                      AS2 (ld,%B0,X+)    CR_TAB
+-                      AS2 (ld,%C0,X+)    CR_TAB
+-                      AS2 (ld,%D0,X)     CR_TAB
+-                      AS2 (subi,r26,lo8(%o1+3)) CR_TAB
+-                              AS2 (sbci,r27,hi8(%o1+3)))
+-                               : (AS2 (adiw,r26,%o1) CR_TAB
+-                AS2 (ld,%A0,X+)    CR_TAB
+-                AS2 (ld,%B0,X+)    CR_TAB
+-                AS2 (ld,%C0,X+)    CR_TAB
+-                AS2 (ld,%D0,X)     CR_TAB
+-                AS2 (sbiw,r26,%o1+3));
++        {
++          /* "ld r26,-X" is undefined */
++            if (AVR_TINY) {
++              *l = 9;
++              return (AS2 (subi,r26,lo8(-(%o1+3)))  CR_TAB
++                      AS2 (sbci,r27,hi8(-(%o1+3)))  CR_TAB
++                      AS2 (ld,r29,X)          CR_TAB
++                      AS2 (ld,r28,-X)         CR_TAB
++                      AS2 (ld,__tmp_reg__,-X) CR_TAB
++                      AS2 (subi,r26,lo8(1))   CR_TAB
++                      AS2 (sbci,r27,hi8(1))   CR_TAB
++                      AS2 (ld,r26,X)          CR_TAB
++                      AS2 (mov,r27,__tmp_reg__));
++            } else {
++              *l = 7;
++              return (AS2 (adiw,r26,%o1+3)    CR_TAB
++                      AS2 (ld,r29,X)          CR_TAB
++                      AS2 (ld,r28,-X)         CR_TAB
++                      AS2 (ld,__tmp_reg__,-X) CR_TAB
++                      AS2 (sbiw,r26,1)        CR_TAB
++                      AS2 (ld,r26,X)          CR_TAB
++                      AS2 (mov,r27,__tmp_reg__));
++            }
++        }
++
++          if (reg_dest == REG_X - 2) {
++            if (AVR_TINY) {
++              *l = 7;
++              return (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
++                      AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
++                      AS2 (ld,r24,X+)         CR_TAB
++                      AS2 (ld,r25,X+)         CR_TAB
++                      AS2 (ld,__tmp_reg__,X+) CR_TAB
++                      AS2 (ld,r27,X)          CR_TAB
++                      AS2 (mov,r26,__tmp_reg__));
++            } else {
++              *l = 6;
++              return (AS2 (adiw,r26,%o1)      CR_TAB
++                    AS2 (ld,r24,X+)         CR_TAB
++                    AS2 (ld,r25,X+)         CR_TAB
++                    AS2 (ld,__tmp_reg__,X+) CR_TAB
++                    AS2 (ld,r27,X)          CR_TAB
++                    AS2 (mov,r26,__tmp_reg__));
++            }
++          }
++          
++          if (AVR_TINY) {
++            *l = 8;
++            return (AS2 (subi,r26,lo8(-(%o1))) CR_TAB
++                    AS2 (sbci,r27,hi8(-(%o1))) CR_TAB
++                    AS2 (ld,%A0,X+)    CR_TAB
++                    AS2 (ld,%B0,X+)    CR_TAB
++                    AS2 (ld,%C0,X+)    CR_TAB
++                    AS2 (ld,%D0,X)     CR_TAB
++                    AS2 (subi,r26,lo8(%o1+3)) CR_TAB
++                    AS2 (sbci,r27,hi8(%o1+3)));
++          } else {
++            *l = 6;
++            return (AS2 (adiw,r26,%o1) CR_TAB
++                    AS2 (ld,%A0,X+)    CR_TAB
++                    AS2 (ld,%B0,X+)    CR_TAB
++                    AS2 (ld,%C0,X+)    CR_TAB
++                    AS2 (ld,%D0,X)     CR_TAB
++                    AS2 (sbiw,r26,%o1+3));
++          }
+       }
+       if (reg_dest == reg_base)
+-        {
+-                      op[2] = XEXP(base, 0);
++      {
++        op[2] = XEXP(base, 0);
+-              if(REGNO(op[2]) == REG_Y)
+-        return *l=5, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1+4))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1+4))) CR_TAB
+-                                              AS2 (ld,%D0,-Y)               CR_TAB
+-                              AS2 (ld,%C0,-Y)               CR_TAB
+-                              AS2 (ld,__tmp_reg__,-Y)       CR_TAB
+-                              AS2 (ld,%A0,-Y)               CR_TAB
+-                        AS2 (subi,%A2,lo8(%o1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1)) CR_TAB
+-                        AS2 (mov,%B0,__tmp_reg__))
+-                                   : (AS2 (ldd,%D0,%D1) CR_TAB
+-                        AS2 (ldd,%C0,%C1) CR_TAB
+-                        AS2 (ldd,__tmp_reg__,%B1)  CR_TAB
+-                        AS2 (ldd,%A0,%A1) CR_TAB
+-                        AS2 (mov,%B0,__tmp_reg__));
+-              if(REGNO(op[2]) == REG_Z)
+-        return *l=5, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1+4))) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1+4))) CR_TAB
+-                                              AS2 (ld,%D0,-Z)               CR_TAB
+-                              AS2 (ld,%C0,-Z)               CR_TAB
+-                              AS2 (ld,__tmp_reg__,-Z)       CR_TAB
+-                              AS2 (ld,%A0,-Z)               CR_TAB
+-                        AS2 (subi,%A2,lo8(%o1)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1)) CR_TAB
+-                        AS2 (mov,%B0,__tmp_reg__))
+-                                   : (AS2 (ldd,%D0,%D1)                       CR_TAB
+-                      AS2 (ldd,%C0,%C1) CR_TAB
+-                      AS2 (ldd,__tmp_reg__,%B1)  CR_TAB
+-                      AS2 (ldd,%A0,%A1) CR_TAB
+-                      AS2 (mov,%B0,__tmp_reg__));
+-        }
+-      else if (reg_dest == reg_base - 2)
+-        {
+-                      op[2] = XEXP(base, 0);
++        if(REGNO(op[2]) == REG_Y) {
++          if (AVR_TINY) {
++            *l = 9;
++            return (AS2 (subi,%A2,lo8(-(%o1+4))) CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o1+4))) CR_TAB
++                    AS2 (ld,%D0,-Y)              CR_TAB
++                    AS2 (ld,%C0,-Y)              CR_TAB
++                    AS2 (ld,__tmp_reg__,-Y)      CR_TAB
++                    AS2 (ld,%A0,-Y)              CR_TAB
++                    AS2 (subi,%A2,lo8(%o1))      CR_TAB
++                    AS2 (sbci,%B2,hi8(%o1)) CR_TAB
++                    AS2 (mov,%B0,__tmp_reg__));
++          } else {
++            *l = 5;
++            return (AS2 (ldd,%D0,%D1) CR_TAB
++                    AS2 (ldd,%C0,%C1) CR_TAB
++                    AS2 (ldd,__tmp_reg__,%B1) CR_TAB
++                    AS2 (ldd,%A0,%A1) CR_TAB
++                    AS2 (mov,%B0,__tmp_reg__));
++          }
++        }
++        if(REGNO(op[2]) == REG_Z) {
++          if (AVR_TINY) {
++            *l = 9;
++            return (AS2 (subi,%A2,lo8(-(%o1+4))) CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o1+4))) CR_TAB
++                    AS2 (ld,%D0,-Z)              CR_TAB
++                    AS2 (ld,%C0,-Z)              CR_TAB
++                    AS2 (ld,__tmp_reg__,-Z)      CR_TAB
++                    AS2 (ld,%A0,-Z)              CR_TAB
++                    AS2 (subi,%A2,lo8(%o1)) CR_TAB
++                    AS2 (sbci,%B2,hi8(%o1)) CR_TAB
++                    AS2 (mov,%B0,__tmp_reg__));
++          } else {
++            *l = 5;
++            return (AS2 (ldd,%D0,%D1) CR_TAB
++                    AS2 (ldd,%C0,%C1) CR_TAB
++                    AS2 (ldd,__tmp_reg__,%B1) CR_TAB
++                    AS2 (ldd,%A0,%A1) CR_TAB
++                    AS2 (mov,%B0,__tmp_reg__));
++          }
++        }
++      } else if (reg_dest == reg_base - 2) {
++        op[2] = XEXP(base, 0);
+-              if(REGNO(op[2]) == REG_Y)
+-        return *l=5, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
+-                              AS2 (ld,%A0,Y+)               CR_TAB
+-                              AS2 (ld,%B0,Y+)               CR_TAB
+-                              AS2 (ld,__tmp_reg__,Y+)       CR_TAB
+-                                              AS2 (ld,%D0,Y)               CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+3)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+3)) CR_TAB
+-                        AS2 (mov,%C0,__tmp_reg__)) 
+-                                   : (AS2 (ldd,%A0,%A1)          CR_TAB
+-                      AS2 (ldd,%B0,%B1) CR_TAB
+-                      AS2 (ldd,__tmp_reg__,%C1)  CR_TAB
+-                      AS2 (ldd,%D0,%D1) CR_TAB
+-                      AS2 (mov,%C0,__tmp_reg__));
+-              if(REGNO(op[2]) == REG_Z)
+-        return *l=5, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
+-                              AS2 (ld,%A0,Z+)              CR_TAB
+-                              AS2 (ld,%B0,Z+)              CR_TAB
+-                              AS2 (ld,__tmp_reg__,Z+)      CR_TAB
+-                                              AS2 (ld,%D0,Z)               CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+3))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+3))    CR_TAB
+-                        AS2 (mov,%C0,__tmp_reg__)) 
+-                                   : (AS2 (ldd,%A0,%A1)          CR_TAB
+-                        AS2 (ldd,%B0,%B1)          CR_TAB
+-                        AS2 (ldd,__tmp_reg__,%C1)  CR_TAB
+-                        AS2 (ldd,%D0,%D1)          CR_TAB
+-                        AS2 (mov,%C0,__tmp_reg__));
+-        }
+-                      op[2] = XEXP(base, 0);
+-              if(REGNO(op[2]) == REG_Y)
+-        return *l=4, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
+-                              AS2 (ld,%A0,Y+)               CR_TAB
+-                              AS2 (ld,%B0,Y+)               CR_TAB
+-                              AS2 (ld,%C0,Y+)               CR_TAB
+-                                              AS2 (ld,%D0,Y)                CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+3)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+3))) 
+-                                   : (AS2 (ldd,%A0,%A1) CR_TAB
+-                        AS2 (ldd,%B0,%B1) CR_TAB
+-                        AS2 (ldd,%C0,%C1) CR_TAB
+-                        AS2 (ldd,%D0,%D1));
+-              if(REGNO(op[2]) == REG_Z)
+-        return *l=4, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
+-                              AS2 (ld,%A0,Z+)               CR_TAB
+-                              AS2 (ld,%B0,Z+)               CR_TAB
+-                              AS2 (ld,%C0,Z+)               CR_TAB
+-                                              AS2 (ld,%D0,Z)               CR_TAB
+-                                              AS2 (subi,%A2,lo8(%o1+3)) CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o1+3)))
+-                                   : (AS2 (ldd,%A0,%A1) CR_TAB
++        if(REGNO(op[2]) == REG_Y) {
++          if (AVR_TINY) {
++            *l = 9;
++            return (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
++                    AS2 (ld,%A0,Y+)              CR_TAB
++                    AS2 (ld,%B0,Y+)              CR_TAB
++                    AS2 (ld,__tmp_reg__,Y+)      CR_TAB
++                    AS2 (ld,%D0,Y)               CR_TAB
++                    AS2 (subi,%A2,lo8(%o1+3)) CR_TAB
++                    AS2 (sbci,%B2,hi8(%o1+3)) CR_TAB
++                    AS2 (mov,%C0,__tmp_reg__));
++          } else {
++            *l = 5;
++            return (AS2 (ldd,%A0,%A1) CR_TAB
+                     AS2 (ldd,%B0,%B1) CR_TAB
+-                    AS2 (ldd,%C0,%C1) CR_TAB
+-                    AS2 (ldd,%D0,%D1));
++                    AS2 (ldd,__tmp_reg__,%C1) CR_TAB
++                    AS2 (ldd,%D0,%D1) CR_TAB
++                    AS2 (mov,%C0,__tmp_reg__));
++          }
++        }
++        if(REGNO(op[2]) == REG_Z) {
++          if (AVR_TINY) {
++            *l = 9;
++            return (AS2 (subi,%A2,lo8(-(%o1)))   CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o1)))   CR_TAB
++                    AS2 (ld,%A0,Z+)              CR_TAB
++                    AS2 (ld,%B0,Z+)              CR_TAB
++                    AS2 (ld,__tmp_reg__,Z+)      CR_TAB
++                    AS2 (ld,%D0,Z)               CR_TAB
++                    AS2 (subi,%A2,lo8(%o1+3))    CR_TAB
++                    AS2 (sbci,%B2,hi8(%o1+3))    CR_TAB
++                    AS2 (mov,%C0,__tmp_reg__));
++          } else {
++            *l = 5;
++            return (AS2 (ldd,%A0,%A1)          CR_TAB
++                    AS2 (ldd,%B0,%B1)          CR_TAB
++                    AS2 (ldd,__tmp_reg__,%C1)  CR_TAB
++                    AS2 (ldd,%D0,%D1)          CR_TAB
++                    AS2 (mov,%C0,__tmp_reg__));
++          }
++        }
++      }
++
++      op[2] = XEXP(base, 0);
++      if(REGNO(op[2]) == REG_Y) {
++        if (AVR_TINY) {
++          *l = 8;
++          return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                  AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                  AS2 (ld,%A0,Y+)            CR_TAB
++                  AS2 (ld,%B0,Y+)            CR_TAB
++                  AS2 (ld,%C0,Y+)            CR_TAB
++                  AS2 (ld,%D0,Y)             CR_TAB
++                  AS2 (subi,%A2,lo8(%o1+3)) CR_TAB
++                  AS2 (sbci,%B2,hi8(%o1+3)));
++        } else {
++          *l = 4;
++          return (AS2 (ldd,%A0,%A1) CR_TAB
++                  AS2 (ldd,%B0,%B1) CR_TAB
++                  AS2 (ldd,%C0,%C1) CR_TAB
++                  AS2 (ldd,%D0,%D1));
++        }
++      }
++      if(REGNO(op[2]) == REG_Z) {
++        if (AVR_TINY) {
++          *l = 8;
++          return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                  AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                  AS2 (ld,%A0,Z+)            CR_TAB
++                  AS2 (ld,%B0,Z+)            CR_TAB
++                  AS2 (ld,%C0,Z+)            CR_TAB
++                  AS2 (ld,%D0,Z)             CR_TAB
++                  AS2 (subi,%A2,lo8(%o1+3)) CR_TAB
++                  AS2 (sbci,%B2,hi8(%o1+3)));
++        } else {
++          *l = 4;
++          return (AS2 (ldd,%A0,%A1) CR_TAB
++                  AS2 (ldd,%B0,%B1) CR_TAB
++                  AS2 (ldd,%C0,%C1) CR_TAB
++                  AS2 (ldd,%D0,%D1));
++        }
++      }
+     }
+   else if (GET_CODE (base) == PRE_DEC) /* (--R) */
+     return *l=4, (AS2 (ld,%D0,%1) CR_TAB
+@@ -2916,37 +3144,48 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+           if (reg_src == REG_X)
+             {
+             /* "st X+,r26" is undefined */
+-              if (reg_unused_after (insn, base))
+-              return *l=6, AVR_TINY ? (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                                  AS2 (st,X,r26)            CR_TAB
+-                                  AS2 (subi,r26,lo8(-1))    CR_TAB
+-                                  AS2 (sbci,r27,hi8(-1))    CR_TAB
+-                                  AS2 (st,X+,__tmp_reg__)   CR_TAB
+-                                  AS2 (st,X+,r28)           CR_TAB
+-                                  AS2 (st,X,r29))
+-                                   : (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                            AS2 (st,X,r26)            CR_TAB
+-                            AS2 (adiw,r26,1)          CR_TAB
+-                            AS2 (st,X+,__tmp_reg__)   CR_TAB
+-                            AS2 (st,X+,r28)           CR_TAB
+-                            AS2 (st,X,r29));
+-              else
+-        return *l=7, AVR_TINY ? (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                                  AS2 (st,X,r26)            CR_TAB
+-                                  AS2 (subi,r26,lo8(-1))    CR_TAB
+-                                  AS2 (sbci,r27,hi8(-1))    CR_TAB
+-                                  AS2 (st,X+,__tmp_reg__)   CR_TAB
+-                                  AS2 (st,X+,r28)           CR_TAB
+-                                  AS2 (st,X,r29)            CR_TAB
+-                                  AS2 (subi,r26,lo8(3))     CR_TAB
+-                                  AS2 (sbci,r27,hi8(3)))
+-                                       : (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                            AS2 (st,X,r26)            CR_TAB
+-                            AS2 (adiw,r26,1)          CR_TAB
+-                            AS2 (st,X+,__tmp_reg__)   CR_TAB
+-                            AS2 (st,X+,r28)           CR_TAB
+-                            AS2 (st,X,r29)            CR_TAB
+-                            AS2 (sbiw,r26,3));
++              if (reg_unused_after (insn, base)) {
++                if (AVR_TINY) {
++                  *l = 7;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                          AS2 (st,X,r26)            CR_TAB
++                          AS2 (subi,r26,lo8(-1))    CR_TAB
++                          AS2 (sbci,r27,hi8(-1))    CR_TAB
++                          AS2 (st,X+,__tmp_reg__)   CR_TAB
++                          AS2 (st,X+,r28)           CR_TAB
++                          AS2 (st,X,r29));
++                } else {
++                  *l = 6;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                          AS2 (st,X,r26)            CR_TAB
++                          AS2 (adiw,r26,1)          CR_TAB
++                          AS2 (st,X+,__tmp_reg__)   CR_TAB
++                          AS2 (st,X+,r28)           CR_TAB
++                          AS2 (st,X,r29));
++                }
++              } else {
++                if (AVR_TINY) {
++                  *l = 9;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                          AS2 (st,X,r26)            CR_TAB
++                          AS2 (subi,r26,lo8(-1))    CR_TAB
++                          AS2 (sbci,r27,hi8(-1))    CR_TAB
++                          AS2 (st,X+,__tmp_reg__)   CR_TAB
++                          AS2 (st,X+,r28)           CR_TAB
++                          AS2 (st,X,r29)            CR_TAB
++                          AS2 (subi,r26,lo8(3))     CR_TAB
++                          AS2 (sbci,r27,hi8(3)));
++                } else {
++                  *l = 7;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                          AS2 (st,X,r26)            CR_TAB
++                          AS2 (adiw,r26,1)          CR_TAB
++                          AS2 (st,X+,__tmp_reg__)   CR_TAB
++                          AS2 (st,X+,r28)           CR_TAB
++                          AS2 (st,X,r29)            CR_TAB
++                          AS2 (sbiw,r26,3));
++                }
++              }
+             }
+           else if (reg_base == reg_src + 2)
+             {
+@@ -2958,61 +3197,84 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+                               AS2 (st,%0+,__zero_reg__)  CR_TAB
+                               AS2 (st,%0,__tmp_reg__)   CR_TAB
+                               AS1 (clr,__zero_reg__));
+-              else
+-                return *l=8, AVR_TINY ? (AS2 (mov,__zero_reg__,%C1) CR_TAB
+-                                AS2 (mov,__tmp_reg__,%D1)  CR_TAB
+-                                AS2 (st,%0+,%A1)           CR_TAB
+-                                AS2 (st,%0+,%B1)           CR_TAB
+-                                AS2 (st,%0+,__zero_reg__)  CR_TAB
+-                                AS2 (st,%0,__tmp_reg__)    CR_TAB
+-                                AS1 (clr,__zero_reg__)     CR_TAB
+-                                          AS2 (subi,r26,lo8(3))      CR_TAB
+-                                          AS2 (sbci,r27,hi8(3)))
+-                                                   : (AS2 (mov,__zero_reg__,%C1) CR_TAB
+-                              AS2 (mov,__tmp_reg__,%D1) CR_TAB
+-                              AS2 (st,%0+,%A1) CR_TAB
+-                              AS2 (st,%0+,%B1) CR_TAB
+-                              AS2 (st,%0+,__zero_reg__)  CR_TAB
+-                              AS2 (st,%0,__tmp_reg__)   CR_TAB
+-                              AS1 (clr,__zero_reg__)     CR_TAB
+-                              AS2 (sbiw,r26,3));
++              else {
++                if (AVR_TINY) {
++                  *l = 9;
++                  return (AS2 (mov,__zero_reg__,%C1) CR_TAB
++                          AS2 (mov,__tmp_reg__,%D1)  CR_TAB
++                          AS2 (st,%0+,%A1)           CR_TAB
++                          AS2 (st,%0+,%B1)           CR_TAB
++                          AS2 (st,%0+,__zero_reg__)  CR_TAB
++                          AS2 (st,%0,__tmp_reg__)    CR_TAB
++                          AS1 (clr,__zero_reg__)     CR_TAB
++                          AS2 (subi,r26,lo8(3))      CR_TAB
++                          AS2 (sbci,r27,hi8(3)));
++                } else {
++                  *l = 8;
++                  return (AS2 (mov,__zero_reg__,%C1) CR_TAB
++                          AS2 (mov,__tmp_reg__,%D1) CR_TAB
++                          AS2 (st,%0+,%A1) CR_TAB
++                          AS2 (st,%0+,%B1) CR_TAB
++                          AS2 (st,%0+,__zero_reg__) CR_TAB
++                          AS2 (st,%0,__tmp_reg__)   CR_TAB
++                          AS1 (clr,__zero_reg__)    CR_TAB
++                          AS2 (sbiw,r26,3));
++                }
++              }
+             }
+-          return *l=5, AVR_TINY ? (AS2 (st,%0+,%A1)  CR_TAB
+-                          AS2 (st,%0+,%B1)  CR_TAB
+-                          AS2 (st,%0+,%C1)  CR_TAB
+-                          AS2 (st,%0,%D1)   CR_TAB
+-                                    AS2 (subi,r26,lo8(3))      CR_TAB
+-                                    AS2 (sbci,r27,hi8(3)))
+-                                         : (AS2 (st,%0+,%A1)  CR_TAB
+-                        AS2 (st,%0+,%B1) CR_TAB
+-                        AS2 (st,%0+,%C1) CR_TAB
+-                        AS2 (st,%0,%D1)  CR_TAB
+-                        AS2 (sbiw,r26,3));
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (st,%0+,%A1)  CR_TAB
++                    AS2 (st,%0+,%B1)  CR_TAB
++                    AS2 (st,%0+,%C1)  CR_TAB
++                    AS2 (st,%0,%D1)   CR_TAB
++                    AS2 (subi,r26,lo8(3)) CR_TAB
++                    AS2 (sbci,r27,hi8(3)));
++          } else {
++            *l = 5;
++            return (AS2 (st,%0+,%A1) CR_TAB
++                    AS2 (st,%0+,%B1) CR_TAB
++                    AS2 (st,%0+,%C1) CR_TAB
++                    AS2 (st,%0,%D1)  CR_TAB
++                    AS2 (sbiw,r26,3));
++          }
+         }
+       else
+        {
+-               if(reg_base == REG_Y)
+-        return *l=4, AVR_TINY ? (AS2 (st,Y+,%A1)        CR_TAB
+-                              AS2 (st,Y+,%B1)        CR_TAB
+-                              AS2 (st,Y+,%C1)        CR_TAB
+-                              AS2 (st,Y,%D1)        CR_TAB
+-                                      AS2 (subi,r28,lo8(3)) CR_TAB
+-                                      AS2 (sbci,r29,lo8(3)))
+-                                   : (AS2 (st,%0,%A1)    CR_TAB
+-                              AS2 (std,%0+1,%B1) CR_TAB
+-                              AS2 (std,%0+2,%C1) CR_TAB
+-                              AS2 (std,%0+3,%D1));
+-               if(reg_base == REG_Z)
+-        return *l=4, AVR_TINY ? (AS2 (st,Z+,%A1)        CR_TAB
+-                              AS2 (st,Z+,%B1)        CR_TAB
+-                              AS2 (st,Z+,%C1)        CR_TAB
+-                              AS2 (st,Z,%D1)        CR_TAB
+-                                      AS2 (subi,r30,lo8(3)) CR_TAB
+-                                      AS2 (sbci,r31,lo8(3)))
+-                                   : (AS2 (st,%0,%A1)    CR_TAB
+-                    AS2 (std,%0+1,%B1) CR_TAB
+-                    AS2 (std,%0+2,%C1) CR_TAB
+-                    AS2 (std,%0+3,%D1));
++        if(reg_base == REG_Y) {
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (st,Y+,%A1)       CR_TAB
++                    AS2 (st,Y+,%B1)       CR_TAB
++                    AS2 (st,Y+,%C1)       CR_TAB
++                    AS2 (st,Y,%D1)        CR_TAB
++                    AS2 (subi,r28,lo8(3)) CR_TAB
++                    AS2 (sbci,r29,lo8(3)));
++          } else {
++            *l = 4;
++            return (AS2 (st,%0,%A1)    CR_TAB
++                    AS2 (std,%0+1,%B1) CR_TAB
++                    AS2 (std,%0+2,%C1) CR_TAB
++                    AS2 (std,%0+3,%D1));
++          }
++        }
++        if(reg_base == REG_Z) {
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (st,Z+,%A1)       CR_TAB
++                    AS2 (st,Z+,%B1)       CR_TAB
++                    AS2 (st,Z+,%C1)       CR_TAB
++                    AS2 (st,Z,%D1)        CR_TAB
++                    AS2 (subi,r30,lo8(3)) CR_TAB
++                    AS2 (sbci,r31,lo8(3)));
++          } else {
++            *l = 4;
++            return (AS2 (st,%0,%A1)    CR_TAB
++                    AS2 (std,%0+1,%B1) CR_TAB
++                    AS2 (std,%0+2,%C1) CR_TAB
++                    AS2 (std,%0+3,%D1));
++          }
++        }
+     }
+     }
+   else if (GET_CODE (base) == PLUS) /* (R + i) */
+@@ -3024,62 +3286,76 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+         if (reg_base != REG_Y)
+           fatal_insn ("incorrect insn:",insn);
+-        if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
+-          return *l = 6, AVR_TINY ? (AS2 (subi,r28,lo8(-(%o0-60))) CR_TAB
+-                                        AS2 (sbci,r29,hi8(-(%o0-60))) CR_TAB
+-                                        AS2 (subi,r28,lo8(-60)) CR_TAB
+-                                        AS2 (sbci,r29,lo8(-60)) CR_TAB
+-                                    AS2 (st,Y+,%A1)          CR_TAB
+-                                    AS2 (st,Y+,%B1)          CR_TAB
+-                                    AS2 (st,Y+,%C1)          CR_TAB
+-                                    AS2 (st,Y,%D1)          CR_TAB
+-                                        AS2 (subi,r28,lo8(63)) CR_TAB
+-                                        AS2 (sbci,r29,lo8(63)) CR_TAB
+-                                    AS2 (subi,r28,lo8(%o0-60)) CR_TAB 
+-                                    AS2 (sbci,r29,hi8(%o0-60)))  
+-                                     : (AS2 (adiw,r28,%o0-60) CR_TAB
+-                          AS2 (std,Y+60,%A1)    CR_TAB
+-                          AS2 (std,Y+61,%B1)    CR_TAB
+-                          AS2 (std,Y+62,%C1)    CR_TAB
+-                          AS2 (std,Y+63,%D1)    CR_TAB
+-                          AS2 (sbiw,r28,%o0-60));
+-        return *l = 8, AVR_TINY ? (AS2 (subi,r28,lo8(-%o0)) CR_TAB
+-                                  AS2 (sbci,r29,hi8(-%o0)) CR_TAB
+-                                  AS2 (st,Y+,%A1)           CR_TAB
+-                                  AS2 (st,Y+,%B1)           CR_TAB
+-                                  AS2 (st,Y+,%C1)           CR_TAB
+-                                  AS2 (st,Y,%D1)           CR_TAB
+-                                      AS2 (subi,r28,lo8(3))   CR_TAB
+-                                      AS2 (sbci,r29,lo8(3))   CR_TAB
+-                                  AS2 (subi,r28,lo8(%o0))  CR_TAB
+-                                  AS2 (sbci,r29,hi8(%o0)))
+-                                   : (AS2 (subi,r28,lo8(-%o0)) CR_TAB
+-                        AS2 (sbci,r29,hi8(-%o0)) CR_TAB
+-                        AS2 (st,Y,%A1)           CR_TAB
+-                        AS2 (std,Y+1,%B1)        CR_TAB
+-                        AS2 (std,Y+2,%C1)        CR_TAB
+-                        AS2 (std,Y+3,%D1)        CR_TAB
+-                        AS2 (subi,r28,lo8(%o0))  CR_TAB
+-                        AS2 (sbci,r29,hi8(%o0)));
++        if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) {
++          if (AVR_TINY) {
++              *l = 12;
++              return (AS2 (subi,r28,lo8(-(%o0-60))) CR_TAB
++                      AS2 (sbci,r29,hi8(-(%o0-60))) CR_TAB
++                      AS2 (subi,r28,lo8(-60)) CR_TAB
++                      AS2 (sbci,r29,lo8(-60)) CR_TAB
++                      AS2 (st,Y+,%A1)         CR_TAB
++                      AS2 (st,Y+,%B1)         CR_TAB
++                      AS2 (st,Y+,%C1)         CR_TAB
++                      AS2 (st,Y,%D1)          CR_TAB
++                      AS2 (subi,r28,lo8(63)) CR_TAB
++                      AS2 (sbci,r29,lo8(63)) CR_TAB
++                      AS2 (subi,r28,lo8(%o0-60)) CR_TAB 
++                      AS2 (sbci,r29,hi8(%o0-60)));
++            } else {
++              *l = 6;
++              return (AS2 (adiw,r28,%o0-60) CR_TAB
++                      AS2 (std,Y+60,%A1)    CR_TAB
++                      AS2 (std,Y+61,%B1)    CR_TAB
++                      AS2 (std,Y+62,%C1)    CR_TAB
++                      AS2 (std,Y+63,%D1)    CR_TAB
++                      AS2 (sbiw,r28,%o0-60));
++            }
++          }
++          if (AVR_TINY) {
++            *l = 10;
++            return (AS2 (subi,r28,lo8(-%o0)) CR_TAB
++                  AS2 (sbci,r29,hi8(-%o0)) CR_TAB
++                  AS2 (st,Y+,%A1)           CR_TAB
++                  AS2 (st,Y+,%B1)           CR_TAB
++                  AS2 (st,Y+,%C1)           CR_TAB
++                  AS2 (st,Y,%D1)           CR_TAB
++                    AS2 (subi,r28,lo8(3))   CR_TAB
++                    AS2 (sbci,r29,lo8(3))   CR_TAB
++                  AS2 (subi,r28,lo8(%o0))  CR_TAB
++                  AS2 (sbci,r29,hi8(%o0)));
++          } else {
++            *l = 8;
++            return (AS2 (subi,r28,lo8(-%o0)) CR_TAB
++                    AS2 (sbci,r29,hi8(-%o0)) CR_TAB
++                  AS2 (st,Y,%A1)           CR_TAB
++                  AS2 (std,Y+1,%B1)        CR_TAB
++                  AS2 (std,Y+2,%C1)        CR_TAB
++                  AS2 (std,Y+3,%D1)        CR_TAB
++                  AS2 (subi,r28,lo8(%o0))  CR_TAB
++                  AS2 (sbci,r29,hi8(%o0)));
++          }
+       }
+       if (reg_base == REG_X)
+       {
+         /* (X + d) = R */
+         if (reg_src == REG_X)
+-          {
+-            *l = 9;
+-            return AVR_TINY ? (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+-                          AS2 (mov,__zero_reg__,r27) CR_TAB
+-                      AS2 (subi,r26,lo8(-(%o0))) CR_TAB
+-                              AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
+-                          AS2 (st,X+,__tmp_reg__)    CR_TAB
+-                          AS2 (st,X+,__zero_reg__)   CR_TAB
+-                          AS2 (st,X+,r28)            CR_TAB
+-                          AS2 (st,X,r29)             CR_TAB
+-                          AS1 (clr,__zero_reg__)     CR_TAB
+-                                      AS2 (subi,r26,lo8(%o0+3))  CR_TAB
+-                          AS2 (sbci,r27,hi8(%o0+3)))
+-                               : (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++        {
++            if (AVR_TINY) {
++              *l = 11;
++              return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++                    AS2 (mov,__zero_reg__,r27) CR_TAB
++                    AS2 (subi,r26,lo8(-(%o0))) CR_TAB
++                    AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
++                    AS2 (st,X+,__tmp_reg__)    CR_TAB
++                    AS2 (st,X+,__zero_reg__)   CR_TAB
++                    AS2 (st,X+,r28)            CR_TAB
++                    AS2 (st,X,r29)             CR_TAB
++                    AS1 (clr,__zero_reg__)     CR_TAB
++                    AS2 (subi,r26,lo8(%o0+3))  CR_TAB
++                    AS2 (sbci,r27,hi8(%o0+3)));
++            } else {
++              *l = 9;
++              return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+                     AS2 (mov,__zero_reg__,r27) CR_TAB
+                     AS2 (adiw,r26,%o0)         CR_TAB
+                     AS2 (st,X+,__tmp_reg__)    CR_TAB
+@@ -3088,22 +3364,26 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+                     AS2 (st,X,r29)             CR_TAB
+                     AS1 (clr,__zero_reg__)     CR_TAB
+                     AS2 (sbiw,r26,%o0+3));
+-          }
++            }
++        }
+         else if (reg_src == REG_X - 2)
+-          {
+-            *l = 9;
+-            return AVR_TINY ? (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+-                          AS2 (mov,__zero_reg__,r27) CR_TAB
+-                      AS2 (subi,r26,lo8(-(%o0))) CR_TAB
+-                              AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
+-                          AS2 (st,X+,r24)            CR_TAB
+-                          AS2 (st,X+,r25)            CR_TAB
+-                          AS2 (st,X+,__tmp_reg__)    CR_TAB
+-                          AS2 (st,X,__zero_reg__)    CR_TAB
+-                          AS1 (clr,__zero_reg__)     CR_TAB
+-                                      AS2 (subi,r26,lo8(%o0+3)) CR_TAB
+-                          AS2 (sbci,r27,hi8(%o0+3)))
+-                               : (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++        {
++            if (AVR_TINY) {
++            *l = 11;
++            return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++                    AS2 (mov,__zero_reg__,r27) CR_TAB
++                    AS2 (subi,r26,lo8(-(%o0))) CR_TAB
++                    AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
++                    AS2 (st,X+,r24)            CR_TAB
++                    AS2 (st,X+,r25)            CR_TAB
++                    AS2 (st,X+,__tmp_reg__)    CR_TAB
++                    AS2 (st,X,__zero_reg__)    CR_TAB
++                    AS1 (clr,__zero_reg__)     CR_TAB
++                    AS2 (subi,r26,lo8(%o0+3)) CR_TAB
++                    AS2 (sbci,r27,hi8(%o0+3)));
++            } else {
++              *l = 9;
++              return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+                     AS2 (mov,__zero_reg__,r27) CR_TAB
+                     AS2 (adiw,r26,%o0)         CR_TAB
+                     AS2 (st,X+,r24)            CR_TAB
+@@ -3112,51 +3392,71 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+                     AS2 (st,X,__zero_reg__)    CR_TAB
+                     AS1 (clr,__zero_reg__)     CR_TAB
+                     AS2 (sbiw,r26,%o0+3));
+-          }
+-        *l = 6;
+-        return AVR_TINY ? (AS2 (subi,r26,lo8(-(%o0))) CR_TAB
+-                          AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
+-                      AS2 (st,X+,%A1)    CR_TAB
+-                      AS2 (st,X+,%B1)    CR_TAB
+-                      AS2 (st,X+,%C1)    CR_TAB
+-                      AS2 (st,X,%D1)     CR_TAB
+-                              AS2 (subi,r26,lo8(%o0+3)) CR_TAB
+-                      AS2 (sbci,r27,hi8(%o0+3)))
+-                       : (AS2 (adiw,r26,%o0) CR_TAB
+-                AS2 (st,X+,%A1)    CR_TAB
+-                AS2 (st,X+,%B1)    CR_TAB
+-                AS2 (st,X+,%C1)    CR_TAB
+-                AS2 (st,X,%D1)     CR_TAB
+-                AS2 (sbiw,r26,%o0+3));
+-      }
+-              op[2] = XEXP(base, 0);
+-              if(REGNO(op[2]) == REG_Y)
+-      return *l=4, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0)))    CR_TAB
+-                                        AS2 (sbci,%B2,hi8(-(%o0)))    CR_TAB
+-                            AS2 (st,Y+,%A1)               CR_TAB
+-                            AS2 (st,Y+,%B1)               CR_TAB
+-                            AS2 (st,Y+,%C1)               CR_TAB
+-                            AS2 (st,Y,%D1)                CR_TAB
+-                                        AS2 (subi,%A2,lo8(%o0+3))     CR_TAB
+-                                        AS2 (sbci,%B2,hi8(%o0+3)))
+-                             : (AS2 (std,%A0,%A1)    CR_TAB
+-                            AS2 (std,%B0,%B1)    CR_TAB
+-                            AS2 (std,%C0,%C1)    CR_TAB
+-                            AS2 (std,%D0,%D1));
+-
+-              if(REGNO(op[2]) == REG_Z)
+-      return *l=4, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0)))    CR_TAB
+-                                        AS2 (sbci,%B2,hi8(-(%o0)))    CR_TAB
+-                            AS2 (st,Z+,%A1)              CR_TAB
+-                            AS2 (st,Z+,%B1)             CR_TAB
+-                            AS2 (st,Z+,%C1)             CR_TAB
+-                            AS2 (st,Z,%D1)              CR_TAB
+-                                        AS2 (subi,%A2,lo8(%o0+3))    CR_TAB
+-                                        AS2 (sbci,%B2,hi8(%o0+3)))
+-                             : (AS2 (std,%A0,%A1)    CR_TAB
+-                  AS2 (std,%B0,%B1) CR_TAB
+-                  AS2 (std,%C0,%C1) CR_TAB
+-                  AS2 (std,%D0,%D1));
++            }
++        }
++
++          if (AVR_TINY) {
++            *l = 8;
++            return (AS2 (subi,r26,lo8(-(%o0))) CR_TAB
++                  AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
++                  AS2 (st,X+,%A1)    CR_TAB
++                  AS2 (st,X+,%B1)    CR_TAB
++                  AS2 (st,X+,%C1)    CR_TAB
++                  AS2 (st,X,%D1)     CR_TAB
++                  AS2 (subi,r26,lo8(%o0+3)) CR_TAB
++                  AS2 (sbci,r27,hi8(%o0+3)));
++          } else {
++            *l = 6;
++            return (AS2 (adiw,r26,%o0) CR_TAB
++                  AS2 (st,X+,%A1)    CR_TAB
++                  AS2 (st,X+,%B1)    CR_TAB
++                  AS2 (st,X+,%C1)    CR_TAB
++                  AS2 (st,X,%D1)     CR_TAB
++                  AS2 (sbiw,r26,%o0+3));
++          }
++      }
++        op[2] = XEXP(base, 0);
++        if(REGNO(op[2]) == REG_Y)
++        {
++          if (AVR_TINY) {
++            *l = 8;
++            return (AS2 (subi,%A2,lo8(-(%o0)))    CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o0)))    CR_TAB
++                  AS2 (st,Y+,%A1)               CR_TAB
++                  AS2 (st,Y+,%B1)               CR_TAB
++                  AS2 (st,Y+,%C1)               CR_TAB
++                  AS2 (st,Y,%D1)                CR_TAB
++                  AS2 (subi,%A2,lo8(%o0+3))     CR_TAB
++                  AS2 (sbci,%B2,hi8(%o0+3)));
++        } else {
++            *l = 4;
++            return (AS2 (std,%A0,%A1)    CR_TAB
++                  AS2 (std,%B0,%B1)    CR_TAB
++                  AS2 (std,%C0,%C1)    CR_TAB
++                          AS2 (std,%D0,%D1));
++          }
++        }
++
++      if(REGNO(op[2]) == REG_Z)
++        {
++          if (AVR_TINY) {
++            *l = 8;
++            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                  AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                  AS2 (st,Z+,%A1)            CR_TAB
++                  AS2 (st,Z+,%B1)            CR_TAB
++                  AS2 (st,Z+,%C1)            CR_TAB
++                  AS2 (st,Z,%D1)             CR_TAB
++                  AS2 (subi,%A2,lo8(%o0+3))  CR_TAB
++                  AS2 (sbci,%B2,hi8(%o0+3)));
++         } else {
++           *l = 4;
++           return (AS2 (std,%A0,%A1) CR_TAB
++                 AS2 (std,%B0,%B1) CR_TAB
++                 AS2 (std,%C0,%C1) CR_TAB
++                 AS2 (std,%D0,%D1));
++         }
++       }
+     }
+   else if (GET_CODE (base) == PRE_DEC) /* (--R) */
+     return *l=4, (AS2 (st,%0,%D1) CR_TAB
+@@ -3370,18 +3670,25 @@ out_movqi_mr_r (rtx insn, rtx op[], int 
+           fatal_insn ("incorrect insn:",insn);
+         if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
+-          return *l = 3, AVR_TINY ? (AS2 (subi,r28,lo8(-(%o0-63))) CR_TAB
+-                                        AS2 (sbci,r29,hi8(-(%o0-63))) CR_TAB
+-                                                AS2 (subi,r28,lo8(-63)) CR_TAB
+-                                                AS2 (sbci,r29,hi8(-63)) CR_TAB
+-                                    AS2 (st,Y,%1)           CR_TAB
+-                                                AS2 (subi,r28,lo8(63)) CR_TAB
+-                                                AS2 (sbci,r29,hi8(63)) CR_TAB
+-                                        AS2 (subi,r28,lo8(%o0-63)) CR_TAB
+-                                    AS2 (sbci,r29,hi8(%o0-63)))
+-                                     : (AS2 (adiw,r28,%o0-63) CR_TAB
+-                          AS2 (std,Y+63,%1)     CR_TAB
+-                          AS2 (sbiw,r28,%o0-63));
++          {
++          if (AVR_TINY) {
++              *l = 9;
++              return (AS2 (subi,r28,lo8(-(%o0-63))) CR_TAB
++                    AS2 (sbci,r29,hi8(-(%o0-63))) CR_TAB
++                    AS2 (subi,r28,lo8(-63)) CR_TAB
++                    AS2 (sbci,r29,hi8(-63)) CR_TAB
++                    AS2 (st,Y,%1)           CR_TAB
++                    AS2 (subi,r28,lo8(63)) CR_TAB
++                    AS2 (sbci,r29,hi8(63)) CR_TAB
++                    AS2 (subi,r28,lo8(%o0-63)) CR_TAB
++                    AS2 (sbci,r29,hi8(%o0-63)));
++            } else {
++            *l = 3;
++              return (AS2 (adiw,r28,%o0-63) CR_TAB
++                    AS2 (std,Y+63,%1)     CR_TAB
++                    AS2 (sbiw,r28,%o0-63));
++            }
++          }
+         return *l = 5, (AS2 (subi,r28,lo8(-%o0)) CR_TAB
+                         AS2 (sbci,r29,hi8(-%o0)) CR_TAB
+@@ -3394,60 +3701,95 @@ out_movqi_mr_r (rtx insn, rtx op[], int 
+         if (reg_overlap_mentioned_p (src, XEXP (x, 0)))
+           {
+             if (reg_unused_after (insn, XEXP (x,0)))
+-              return *l = 3, AVR_TINY ? (AS2 (mov,__tmp_reg__,%1) CR_TAB
+-                                    AS2 (subi,r26,lo8(-(%o0)))       CR_TAB
+-                                    AS2 (sbci,r27,hi8(-(%o0)))       CR_TAB
+-                                        AS2 (st,X,__tmp_reg__))
+-                                     : (AS2 (mov,__tmp_reg__,%1) CR_TAB
+-                              AS2 (adiw,r26,%o0)       CR_TAB
+-                              AS2 (st,X,__tmp_reg__));
+-
+-            return *l = 4, AVR_TINY ? (AS2 (mov,__tmp_reg__,%1) CR_TAB
+-                                      AS2 (subi,r26,lo8(-(%o0)))       CR_TAB
+-                                      AS2 (sbci,r27,hi8(-(%o0)))       CR_TAB
+-                                      AS2 (st,X,__tmp_reg__)   CR_TAB
+-                                      AS2 (subi,r26,lo8(%o0))       CR_TAB
+-                                      AS2 (sbci,r27,hi8(%o0)))
+-                                           : (AS2 (mov,__tmp_reg__,%1) CR_TAB
+-                            AS2 (adiw,r26,%o0)       CR_TAB
+-                            AS2 (st,X,__tmp_reg__)   CR_TAB
+-                            AS2 (sbiw,r26,%o0));
++              {
++                if (AVR_TINY) {
++                  *l = 4;
++                  return (AS2 (mov,__tmp_reg__,%1) CR_TAB
++                        AS2 (subi,r26,lo8(-(%o0)))       CR_TAB
++                        AS2 (sbci,r27,hi8(-(%o0)))       CR_TAB
++                        AS2 (st,X,__tmp_reg__));
++                } else {
++                  *l = 3;
++                  return (AS2 (mov,__tmp_reg__,%1) CR_TAB
++                          AS2 (adiw,r26,%o0)       CR_TAB
++                                AS2 (st,X,__tmp_reg__));
++                }
++              }
++
++            if (AVR_TINY) {
++                *l = 6;
++                 return (AS2 (mov,__tmp_reg__,%1)   CR_TAB
++                       AS2 (subi,r26,lo8(-(%o0))) CR_TAB
++                       AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
++                       AS2 (st,X,__tmp_reg__)     CR_TAB
++                       AS2 (subi,r26,lo8(%o0))    CR_TAB
++                       AS2 (sbci,r27,hi8(%o0)));
++              } else {
++                *l = 4;
++                return (AS2 (mov,__tmp_reg__,%1) CR_TAB
++                        AS2 (adiw,r26,%o0)       CR_TAB
++                        AS2 (st,X,__tmp_reg__)   CR_TAB
++                        AS2 (sbiw,r26,%o0));
++              }
+           }
+         else
+-          {
+-            if (reg_unused_after (insn, XEXP (x,0)))
+-              return *l = 2, AVR_TINY ? (AS2 (subi,r26,lo8(-(%o0)))       CR_TAB
+-                                    AS2 (sbci,r27,hi8(-(%o0)))       CR_TAB
+-                                        AS2 (st,X,%1))
+-                                     : (AS2 (adiw,r26,%o0) CR_TAB
+-                              AS2 (st,X,%1));
+-
+-            return *l = 3, AVR_TINY ? (AS2 (subi,r26,lo8(-(%o0)))       CR_TAB
+-                                      AS2 (sbci,r27,hi8(-(%o0)))       CR_TAB
+-                                      AS2 (st,X,%1)                    CR_TAB
+-                                      AS2 (subi,r26,lo8(%o0))          CR_TAB
+-                                      AS2 (sbci,r27,hi8(%o0)))
+-                                                       : (AS2 (adiw,r26,%o0) CR_TAB
+-                            AS2 (st,X,%1)      CR_TAB
+-                            AS2 (sbiw,r26,%o0));
+-          }
++        {
++          if (reg_unused_after (insn, XEXP (x,0))) {
++              if (AVR_TINY) {
++                 *l = 3;
++                 return (AS2 (subi,r26,lo8(-(%o0))) CR_TAB
++                         AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
++                       AS2 (st,X,%1));
++              } else {
++                *l = 2;
++                return (AS2 (adiw,r26,%o0) CR_TAB
++                      AS2 (st,X,%1));
++              }
++            }
++
++            if (AVR_TINY) {
++              *l = 5;
++              return (AS2 (subi,r26,lo8(-(%o0)))       CR_TAB
++                      AS2 (sbci,r27,hi8(-(%o0)))       CR_TAB
++                      AS2 (st,X,%1)                    CR_TAB
++                      AS2 (subi,r26,lo8(%o0))          CR_TAB
++                      AS2 (sbci,r27,hi8(%o0)));
++            } else {
++              *l = 3;
++              return (AS2 (adiw,r26,%o0) CR_TAB
++                      AS2 (st,X,%1)      CR_TAB
++                      AS2 (sbiw,r26,%o0));
++            }
++        }
+       }
+-      *l = 1;
+-        op[2] = XEXP(x, 0);
+-        if(REGNO(op[2]) == REG_Y)
+-      return AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
+-                              AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
+-                      AS2 (st,Y,%1)              CR_TAB
+-                AS2 (subi,%A2,lo8(%o0)) CR_TAB
+-                              AS2 (sbci,%B2,hi8(%o0)))
+-                       :  AS2 (std,%0,%1);
+-        if(REGNO(op[2]) == REG_Z)
+-      return AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
+-                              AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
+-                      AS2 (st,Z,%1)              CR_TAB
+-                AS2 (subi,%A2,lo8(%o0)) CR_TAB
+-                              AS2 (sbci,%B2,hi8(%o0)))
+-                       :  AS2 (std,%0,%1);
++
++        op[2] = XEXP(x, 0);
++        if(REGNO(op[2]) == REG_Y) {
++          if (AVR_TINY) {
++            *l = 5;
++            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                  AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                  AS2 (st,Y,%1)              CR_TAB
++                    AS2 (subi,%A2,lo8(%o0)) CR_TAB
++                  AS2 (sbci,%B2,hi8(%o0)));
++          } else {
++            *l = 1;
++            return (AS2 (std,%0,%1));
++          }
++        }
++        if(REGNO(op[2]) == REG_Z) {
++          if (AVR_TINY) {
++            *l = 5;
++            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                  AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                    AS2 (st,Z,%1)              CR_TAB
++                    AS2 (subi,%A2,lo8(%o0)) CR_TAB
++                    AS2 (sbci,%B2,hi8(%o0)));
++          } else {
++          *l = 1;
++            return (AS2 (std,%0,%1));
++          }
++        }
+     }
+   *l = 1;
+   return AS2 (st,%0,%1);
+@@ -3493,109 +3835,162 @@ out_movhi_mr_r (rtx insn, rtx op[], int 
+       if (reg_base == REG_X)
+         {
+           if (reg_src == REG_X)
+-            {
+-              /* "st X+,r26" and "st -X,r26" are undefined.  */
+-              if (!mem_volatile_p && reg_unused_after (insn, src))
+-              return *l=4, AVR_TINY ? (AS2 (mov,__tmp_reg__,r27)  CR_TAB
+-                                  AS2 (st,X,r26)             CR_TAB
+-                                  AS2 (subi,r26,lo8(-1))     CR_TAB
+-                                  AS2 (sbci,r27,hi8(-1))     CR_TAB
+-                                  AS2 (st,X,__tmp_reg__))
+-                                   : (AS2 (mov,__tmp_reg__,r27)  CR_TAB
+-                            AS2 (st,X,r26)            CR_TAB
+-                            AS2 (adiw,r26,1)          CR_TAB
+-                            AS2 (st,X,__tmp_reg__));
+-              else
+-              {
+-                  if (!AVR_XMEGA)
+-                  return *l=5, AVR_TINY ? (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                                                      AS2 (subi,r26,lo8(-1))    CR_TAB
+-                                                      AS2 (sbci,r27,hi8(-1))    CR_TAB
+-                                                      AS2 (st,X,__tmp_reg__)    CR_TAB
+-                                                      AS2 (subi,r26,lo8(1))     CR_TAB
+-                                                      AS2 (sbci,r27,hi8(1))     CR_TAB
+-                                                      AS2 (st,X,r26))
+-                                                       : (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                            AS2 (adiw,r26,1)          CR_TAB
+-                            AS2 (st,X,__tmp_reg__)    CR_TAB
+-                              AS2 (sbiw,r26,1)          CR_TAB
+-                              AS2 (st,X,r26));
+-                else
+-                  return *l=5, AVR_TINY ? (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                                      AS2 (st,X,r26)            CR_TAB
+-                                                  AS2 (subi,r26,lo8(-1))    CR_TAB
+-                                                  AS2 (sbci,r27,hi8(-1))    CR_TAB
+-                                      AS2 (st,X,__tmp_reg__)    CR_TAB
+-                                                  AS2 (subi,r26,lo8(1))     CR_TAB
+-                                                  AS2 (sbci,r27,hi8(1)))
+-                                           : (AS2 (mov,__tmp_reg__,r27) CR_TAB
+-                                AS2 (st,X,r26)            CR_TAB
+-                                AS2 (adiw,r26,1)          CR_TAB
+-                                AS2 (st,X,__tmp_reg__)    CR_TAB
+-                                AS2 (sbiw,r26,1));
+-              }
++          {
++            /* "st X+,r26" and "st -X,r26" are undefined.  */
++            if (!mem_volatile_p && reg_unused_after (insn, src)) {
++              if (AVR_TINY) {
++                *l = 5;
++                return  (AS2 (mov,__tmp_reg__,r27)  CR_TAB
++                         AS2 (st,X,r26)             CR_TAB
++                         AS2 (subi,r26,lo8(-1))     CR_TAB
++                         AS2 (sbci,r27,hi8(-1))     CR_TAB
++                         AS2 (st,X,__tmp_reg__));
++              } else {
++                *l = 4;
++                return (AS2 (mov,__tmp_reg__,r27)  CR_TAB
++                        AS2 (st,X,r26)            CR_TAB
++                        AS2 (adiw,r26,1)          CR_TAB
++                        AS2 (st,X,__tmp_reg__));
++              }
++            }
++            else
++          {
++              if (!AVR_XMEGA) {
++                if (AVR_TINY) {
++                  *l = 7;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                          AS2 (subi,r26,lo8(-1))    CR_TAB
++                          AS2 (sbci,r27,hi8(-1))    CR_TAB
++                          AS2 (st,X,__tmp_reg__)    CR_TAB
++                          AS2 (subi,r26,lo8(1))     CR_TAB
++                          AS2 (sbci,r27,hi8(1))     CR_TAB
++                          AS2 (st,X,r26));
++                } else {
++                  *l = 5;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                          AS2 (adiw,r26,1)          CR_TAB
++                          AS2 (st,X,__tmp_reg__)    CR_TAB
++                          AS2 (sbiw,r26,1)          CR_TAB
++                          AS2 (st,X,r26));
++                }
++              }
++              else {
++                if (AVR_TINY) {
++                  *l = 7;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                        AS2 (st,X,r26)            CR_TAB
++                        AS2 (subi,r26,lo8(-1))    CR_TAB
++                        AS2 (sbci,r27,hi8(-1))    CR_TAB
++                        AS2 (st,X,__tmp_reg__)    CR_TAB
++                        AS2 (subi,r26,lo8(1))     CR_TAB
++                        AS2 (sbci,r27,hi8(1)));
++                } else {
++                  *l = 5;
++                  return (AS2 (mov,__tmp_reg__,r27) CR_TAB
++                        AS2 (st,X,r26)            CR_TAB
++                        AS2 (adiw,r26,1)          CR_TAB
++                        AS2 (st,X,__tmp_reg__)    CR_TAB
++                        AS2 (sbiw,r26,1));
++                }
++              }
+             }
++          }
+           else
+             {
+               if (!mem_volatile_p && reg_unused_after (insn, base))
+                 return *l=2, (AS2 (st,X+,%A1) CR_TAB
+                               AS2 (st,X,%B1));
+               else
+-              {
+-                  if (!AVR_XMEGA)
+-                    return *l=3, AVR_TINY ? (AS2 (subi,r26,lo8(-1)) CR_TAB
+-                                                              AS2 (sbci,r27,hi8(-1)) CR_TAB
+-                                    AS2 (st,X,%B1)         CR_TAB
+-                                    AS2 (st,-X,%A1))
+-                                                           : (AS2 (adiw,r26,1) CR_TAB
+-                              AS2 (st,X,%B1)   CR_TAB
+-                              AS2 (st,-X,%A1));
+-                else
+-                    return *l=3, AVR_TINY ? (AS2 (st,X+,%A1) CR_TAB
+-                                    AS2 (st,X,%B1) CR_TAB
+-                                                          AS2 (subi,r26,lo8(1))     CR_TAB
+-                                                          AS2 (sbci,r27,hi8(1)))
+-                                                           : (AS2 (st,X+,%A1) CR_TAB
+-                                  AS2 (st,X,%B1) CR_TAB
+-                                  AS2 (sbiw,r26,1));
+-              }
++            {
++                if (!AVR_XMEGA) {
++                  if (AVR_TINY) {
++                    *l = 4;
++                     return (AS2 (subi,r26,lo8(-1)) CR_TAB
++                             AS2 (sbci,r27,hi8(-1)) CR_TAB
++                             AS2 (st,X,%B1)         CR_TAB
++                             AS2 (st,-X,%A1));
++                  } else {
++                    *l = 3;
++                    return (AS2 (adiw,r26,1) CR_TAB
++                            AS2 (st,X,%B1)   CR_TAB
++                            AS2 (st,-X,%A1));
++                  }
++                } else {
++                  if (AVR_TINY) {
++                    *l = 4;
++                    return (AS2 (st,X+,%A1) CR_TAB
++                            AS2 (st,X,%B1) CR_TAB
++                                  AS2 (subi,r26,lo8(1)) CR_TAB
++                            AS2 (sbci,r27,hi8(1)));
++                  } else {
++                    *l = 3;
++                    return (AS2 (st,X+,%A1) CR_TAB
++                            AS2 (st,X,%B1) CR_TAB
++                            AS2 (sbiw,r26,1));
++                  }
++                }
++            }
+             }
+         }
+       else
+         {
+         if (!AVR_XMEGA)
+         {
+-                  if(reg_base == REG_Y)
+-            return  *l=2, AVR_TINY ? (AS2 (subi,r28,lo8(-1))  CR_TAB
+-                                       AS2 (sbci,r29,hi8(-1))  CR_TAB
+-                             AS2 (st,Y,%B1)         CR_TAB
+-                             AS2 (st,-Y,%A1))
+-                                            : (AS2 (std,%0+1,%B1)      CR_TAB
+-                             AS2 (st,%0,%A1));
+-                  if(reg_base == REG_Z)
+-            return  *l=2, AVR_TINY ? (AS2 (subi,r30,lo8(-1))  CR_TAB
+-                                       AS2 (sbci,r31,hi8(-1))  CR_TAB
+-                             AS2 (st,Z,%B1)         CR_TAB
+-                             AS2 (st,-Z,%A1))
+-                                            : (AS2 (std,%0+1,%B1)      CR_TAB
+-                       AS2 (st,%0,%A1));
++            if(reg_base == REG_Y) {
++              if (AVR_TINY) {
++                *l = 4;
++                return (AS2 (subi,r28,lo8(-1)) CR_TAB
++                      AS2 (sbci,r29,hi8(-1)) CR_TAB
++                        AS2 (st,Y,%B1)         CR_TAB
++                        AS2 (st,-Y,%A1));
++              } else {
++              *l = 2;
++                return (AS2 (std,%0+1,%B1)     CR_TAB
++                        AS2 (st,%0,%A1));
++              }
++            }
++          if(reg_base == REG_Z) {
++              if (AVR_TINY) {
++                *l = 4;
++                return (AS2 (subi,r30,lo8(-1)) CR_TAB
++                      AS2 (sbci,r31,hi8(-1)) CR_TAB
++                        AS2 (st,Z,%B1)         CR_TAB
++                        AS2 (st,-Z,%A1));
++              } else {
++                *l = 2;
++                return (AS2 (std,%0+1,%B1)     CR_TAB
++                        AS2 (st,%0,%A1));
++              }
++            }
+         }
+         else
+         {
+-                  if(reg_base == REG_Y)
+-            return  *l=2, AVR_TINY ? (AS2 (st,Y+,%A1)        CR_TAB
+-                             AS2 (st,Y,%B1)        CR_TAB
+-                                               AS2 (subi,r28,lo8(1))  CR_TAB
+-                                       AS2 (sbci,r29,hi8(1)))
+-                                                : (AS2 (st,%0,%A1)    CR_TAB
+-                             AS2 (std,%0+1,%B1));
+-                  if(reg_base == REG_Z)
+-            return  *l=2, AVR_TINY ? (AS2 (st,Z+,%A1)         CR_TAB
+-                             AS2 (st,Z,%B1)         CR_TAB
+-                                               AS2 (subi,r30,lo8(1))  CR_TAB
+-                                       AS2 (sbci,r31,hi8(1)))
+-                                                : (AS2 (st,%0,%A1)    CR_TAB
+-                           AS2 (std,%0+1,%B1));
++          if(reg_base == REG_Y) {
++              if (AVR_TINY) {
++                *l = 4;
++                return (AS2 (st,Y+,%A1)       CR_TAB
++                        AS2 (st,Y,%B1)        CR_TAB
++                      AS2 (subi,r28,lo8(1)) CR_TAB
++                      AS2 (sbci,r29,hi8(1)));
++              } else {
++              *l = 2;
++                return (AS2 (st,%0,%A1)    CR_TAB
++                        AS2 (std,%0+1,%B1));
++              }
++            }
++          if(reg_base == REG_Z) {
++              if (AVR_TINY) {
++                *l = 4;
++                return (AS2 (st,Z+,%A1)        CR_TAB
++                        AS2 (st,Z,%B1)         CR_TAB
++                      AS2 (subi,r30,lo8(1))  CR_TAB
++                      AS2 (sbci,r31,hi8(1)));
++              } else {
++                *l = 2;
++                return (AS2 (st,%0,%A1)    CR_TAB
++                        AS2 (std,%0+1,%B1));
++              }
++            }
+         }
+     }
+     }
+@@ -3610,69 +4005,91 @@ out_movhi_mr_r (rtx insn, rtx op[], int 
+           if (!AVR_XMEGA)
+             {
+-        if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
+-              return *l = 4, AVR_TINY ? (AS2 (subi,r28,lo8(-(%o0-62))) CR_TAB
+-                                                AS2 (sbci,r29,hi8(-(%o0-62))) CR_TAB
+-                                                        AS2 (subi,r28,lo8(-63))       CR_TAB
+-                                                        AS2 (sbci,r29,hi8(-63))       CR_TAB
+-                                        AS2 (st,Y,%B1)                                 CR_TAB
+-                                        AS2 (st,-Y,%A1)                                CR_TAB
+-                                                        AS2 (subi,r28,lo8(62))       CR_TAB
+-                                                        AS2 (sbci,r29,hi8(62))       CR_TAB
+-                                        AS2 (subi,r28,lo8(%o0-62))    CR_TAB
+-                                        AS2 (sbci,r29,hi8(%o0-62)))
+-                                             : (AS2 (adiw,r28,%o0-62) CR_TAB
+-                          AS2 (std,Y+63,%B1)    CR_TAB
+-                          AS2 (std,Y+62,%A1)    CR_TAB
+-                          AS2 (sbiw,r28,%o0-62));
+-
+-            return *l = 6, AVR_TINY ? (AS2 (subi,r28,lo8(-%o0)) CR_TAB
+-                                      AS2 (sbci,r29,hi8(-%o0)) CR_TAB
+-                                                      AS2 (subi,r28,lo8(-1))   CR_TAB
+-                                                      AS2 (sbci,r29,hi8(-1))   CR_TAB
+-                                      AS2 (st,Y,%B1)           CR_TAB
+-                                      AS2 (st,-Y,%A1)           CR_TAB
+-                                      AS2 (subi,r28,lo8(%o0))  CR_TAB
+-                                      AS2 (sbci,r29,hi8(%o0)))
+-                                           : (AS2 (subi,r28,lo8(-%o0)) CR_TAB
+-                        AS2 (sbci,r29,hi8(-%o0)) CR_TAB
+-                        AS2 (std,Y+1,%B1)        CR_TAB
+-                        AS2 (st,Y,%A1)           CR_TAB
+-                        AS2 (subi,r28,lo8(%o0))  CR_TAB
+-                        AS2 (sbci,r29,hi8(%o0)));
++        if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) {
++          if (AVR_TINY) {
++              *l = 10;
++              return (AS2 (subi,r28,lo8(-(%o0-62))) CR_TAB
++                    AS2 (sbci,r29,hi8(-(%o0-62))) CR_TAB
++                    AS2 (subi,r28,lo8(-63))       CR_TAB
++                    AS2 (sbci,r29,hi8(-63))       CR_TAB
++                    AS2 (st,Y,%B1)                CR_TAB
++                    AS2 (st,-Y,%A1)               CR_TAB
++                    AS2 (subi,r28,lo8(62))        CR_TAB
++                    AS2 (sbci,r29,hi8(62))        CR_TAB
++                    AS2 (subi,r28,lo8(%o0-62))    CR_TAB
++                    AS2 (sbci,r29,hi8(%o0-62)));
++            } else {
++              *l = 4;
++              return (AS2 (adiw,r28,%o0-62) CR_TAB
++                    AS2 (std,Y+63,%B1)    CR_TAB
++                    AS2 (std,Y+62,%A1)    CR_TAB
++                    AS2 (sbiw,r28,%o0-62));
++            }
++          }
++
++            if (AVR_TINY) {
++                *l = 8;
++                return (AS2 (subi,r28,lo8(-%o0)) CR_TAB
++                      AS2 (sbci,r29,hi8(-%o0)) CR_TAB
++                      AS2 (subi,r28,lo8(-1))   CR_TAB
++                      AS2 (sbci,r29,hi8(-1))   CR_TAB
++                      AS2 (st,Y,%B1)           CR_TAB
++                      AS2 (st,-Y,%A1)          CR_TAB
++                      AS2 (subi,r28,lo8(%o0))  CR_TAB
++                      AS2 (sbci,r29,hi8(%o0)));
++              } else {
++              *l = 6;
++                return (AS2 (subi,r28,lo8(-%o0)) CR_TAB
++                      AS2 (sbci,r29,hi8(-%o0)) CR_TAB
++                      AS2 (std,Y+1,%B1)        CR_TAB
++                      AS2 (st,Y,%A1)           CR_TAB
++                      AS2 (subi,r28,lo8(%o0))  CR_TAB
++                      AS2 (sbci,r29,hi8(%o0)));
++              }
+       }
+         else
+           {
+-            if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
+-              return *l = 4, AVR_TINY ? (AS2 (subi,r28,lo8(-(%o0-62))) CR_TAB
+-                                                AS2 (sbci,r29,hi8(-(%o0-62))) CR_TAB
+-                                                        AS2 (subi,r28,lo8(-62))       CR_TAB
+-                                                        AS2 (sbci,r29,hi8(-62))       CR_TAB
+-                                        AS2 (st,Y+,%A1)                                CR_TAB
+-                                        AS2 (st,Y,%B1)                                 CR_TAB
+-                                                        AS2 (subi,r28,lo8(63))       CR_TAB
+-                                                        AS2 (sbci,r29,hi8(63))       CR_TAB
+-                                        AS2 (subi,r28,lo8(%o0-62))    CR_TAB
+-                                        AS2 (sbci,r29,hi8(%o0-62)))
+-                                             : (AS2 (adiw,r28,%o0-62) CR_TAB
+-                              AS2 (std,Y+62,%A1)    CR_TAB
+-                              AS2 (std,Y+63,%B1)    CR_TAB
+-                              AS2 (sbiw,r28,%o0-62));
++            if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) {
++              if (AVR_TINY) {
++                  *l = 10; 
++                  return (AS2 (subi,r28,lo8(-(%o0-62))) CR_TAB
++                          AS2 (sbci,r29,hi8(-(%o0-62))) CR_TAB
++                                AS2 (subi,r28,lo8(-62))       CR_TAB
++                                AS2 (sbci,r29,hi8(-62))       CR_TAB
++                          AS2 (st,Y+,%A1)             CR_TAB
++                          AS2 (st,Y,%B1)              CR_TAB
++                          AS2 (subi,r28,lo8(63))        CR_TAB
++                                AS2 (sbci,r29,hi8(63))        CR_TAB
++                          AS2 (subi,r28,lo8(%o0-62))    CR_TAB
++                          AS2 (sbci,r29,hi8(%o0-62)));
++                } else {
++                  *l = 4;
++                  return (AS2 (adiw,r28,%o0-62) CR_TAB
++                          AS2 (std,Y+62,%A1)    CR_TAB
++                          AS2 (std,Y+63,%B1)    CR_TAB
++                          AS2 (sbiw,r28,%o0-62));
++                }
++              }
+  
+-            return *l = 6, AVR_TINY ? (AS2 (subi,r28,lo8(-%o0)) CR_TAB
+-                                      AS2 (sbci,r29,hi8(-%o0)) CR_TAB
+-                                      AS2 (st,Y+,%A1)           CR_TAB
+-                                      AS2 (st,Y,%B1)           CR_TAB
+-                                                      AS2 (subi,r28,lo8(1))   CR_TAB
+-                                                      AS2 (sbci,r29,hi8(1))   CR_TAB
+-                                      AS2 (subi,r28,lo8(%o0))  CR_TAB
+-                                      AS2 (sbci,r29,hi8(%o0)))
+-                                           : (AS2 (subi,r28,lo8(-%o0)) CR_TAB
+-                            AS2 (sbci,r29,hi8(-%o0)) CR_TAB
+-                            AS2 (st,Y,%A1)           CR_TAB
+-                            AS2 (std,Y+1,%B1)        CR_TAB
+-                            AS2 (subi,r28,lo8(%o0))  CR_TAB
+-                            AS2 (sbci,r29,hi8(%o0)));
++            if (AVR_TINY) {
++                *l = 8;
++                return (AS2 (subi,r28,lo8(-%o0)) CR_TAB
++                        AS2 (sbci,r29,hi8(-%o0)) CR_TAB
++                        AS2 (st,Y+,%A1)          CR_TAB
++                        AS2 (st,Y,%B1)           CR_TAB
++                        AS2 (subi,r28,lo8(1))    CR_TAB
++                        AS2 (sbci,r29,hi8(1))    CR_TAB
++                        AS2 (subi,r28,lo8(%o0))  CR_TAB
++                        AS2 (sbci,r29,hi8(%o0)));
++              } else {
++                *l = 6;
++                return (AS2 (subi,r28,lo8(-%o0)) CR_TAB
++                        AS2 (sbci,r29,hi8(-%o0)) CR_TAB
++                        AS2 (st,Y,%A1)           CR_TAB
++                        AS2 (std,Y+1,%B1)        CR_TAB
++                        AS2 (subi,r28,lo8(%o0))  CR_TAB
++                        AS2 (sbci,r29,hi8(%o0)));
++              }
+           }
+       }
+       if (reg_base == REG_X)
+@@ -3681,121 +4098,164 @@ out_movhi_mr_r (rtx insn, rtx op[], int 
+         if (reg_src == REG_X)
+             {
+             if (!AVR_XMEGA)
+-              {
+-            *l = 7;
+-                return AVR_TINY ? (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+-                              AS2 (mov,__zero_reg__,r27) CR_TAB
+-                        AS2 (subi,r26,lo8(-(%o0+1)))   CR_TAB
+-                        AS2 (sbci,r27,hi8(-(%o0+1)))   CR_TAB
+-                              AS2 (st,X,__zero_reg__)    CR_TAB
+-                              AS2 (st,-X,__tmp_reg__)    CR_TAB
+-                              AS1 (clr,__zero_reg__)     CR_TAB
+-                        AS2 (subi,r26,lo8(%o0))    CR_TAB
+-                        AS2 (sbci,r27,hi8(%o0))) 
+-                                       : (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+-                    AS2 (mov,__zero_reg__,r27) CR_TAB
+-                      AS2 (adiw,r26,%o0+1)       CR_TAB
+-                    AS2 (st,X,__zero_reg__)    CR_TAB
+-                    AS2 (st,-X,__tmp_reg__)    CR_TAB
+-                    AS1 (clr,__zero_reg__)     CR_TAB
+-                      AS2 (sbiw,r26,%o0));
+-          }
++            {
++              if (AVR_TINY) {
++                  *l = 9;
++                return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++                          AS2 (mov,__zero_reg__,r27) CR_TAB
++                          AS2 (subi,r26,lo8(-(%o0+1))) CR_TAB
++                          AS2 (sbci,r27,hi8(-(%o0+1))) CR_TAB
++                          AS2 (st,X,__zero_reg__)    CR_TAB
++                          AS2 (st,-X,__tmp_reg__)    CR_TAB
++                          AS1 (clr,__zero_reg__)     CR_TAB
++                          AS2 (subi,r26,lo8(%o0))    CR_TAB
++                          AS2 (sbci,r27,hi8(%o0)));
++                } else {
++                  *l = 7;
++                  return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++                          AS2 (mov,__zero_reg__,r27) CR_TAB
++                          AS2 (adiw,r26,%o0+1)       CR_TAB
++                          AS2 (st,X,__zero_reg__)    CR_TAB
++                          AS2 (st,-X,__tmp_reg__)    CR_TAB
++                          AS1 (clr,__zero_reg__)     CR_TAB
++                          AS2 (sbiw,r26,%o0));
++                }
++              }
+             else
+-              {
+-                *l = 7;
+-                        return AVR_TINY ? (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++            {
++                if (AVR_TINY) {
++                *l = 9;
++                  return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+                         AS2 (mov,__zero_reg__,r27) CR_TAB
+-                                      AS2 (subi,r26,lo8(-(%o0)))   CR_TAB
+-                                      AS2 (sbci,r27,hi8(-(%o0)))   CR_TAB
++                        AS2 (subi,r26,lo8(-(%o0)))   CR_TAB
++                        AS2 (sbci,r27,hi8(-(%o0)))   CR_TAB
+                         AS2 (st,X+,__tmp_reg__)    CR_TAB
+                         AS2 (st,X,__zero_reg__)    CR_TAB
+                         AS1 (clr,__zero_reg__)     CR_TAB
+-                                      AS2 (subi,r26,lo8(%o0+1))    CR_TAB
+-                                      AS2 (sbci,r27,hi8(%o0+1)))
+-                                       : (AS2 (mov,__tmp_reg__,r26)  CR_TAB
+-                                              AS2 (mov,__zero_reg__,r27) CR_TAB
+-                                              AS2 (adiw,r26,%o0+1)       CR_TAB
+-                                              AS2 (st,X+,__tmp_reg__)    CR_TAB
+-                                              AS2 (st,X,__zero_reg__)    CR_TAB
+-                                              AS1 (clr,__zero_reg__)     CR_TAB
+-                                              AS2 (sbiw,r26,%o0));
+-
+-              }
++                        AS2 (subi,r26,lo8(%o0+1))    CR_TAB
++                        AS2 (sbci,r27,hi8(%o0+1)));
++                } else {
++                  *l = 7;
++                  return (AS2 (mov,__tmp_reg__,r26)  CR_TAB
++                          AS2 (mov,__zero_reg__,r27) CR_TAB
++                          AS2 (adiw,r26,%o0+1)       CR_TAB
++                          AS2 (st,X+,__tmp_reg__)    CR_TAB
++                          AS2 (st,X,__zero_reg__)    CR_TAB
++                          AS1 (clr,__zero_reg__)     CR_TAB
++                          AS2 (sbiw,r26,%o0));
++                }
++            }
+           }
+         if (!AVR_XMEGA)
+-            {     
+-        *l = 4;
+-              return AVR_TINY ? (AS2 (subi,r26,lo8(-(%o0+1)))   CR_TAB
+-                        AS2 (sbci,r27,hi8(-(%o0+1)))   CR_TAB
+-                        AS2 (st,X,%B1)       CR_TAB
+-                        AS2 (st,-X,%A1)      CR_TAB
+-                        AS2 (subi,r26,lo8(%o0))    CR_TAB
+-                        AS2 (sbci,r27,hi8(%o0))) 
+-                                       : (AS2 (adiw,r26,%o0+1) CR_TAB
+-                  AS2 (st,X,%B1)       CR_TAB
+-                  AS2 (st,-X,%A1)      CR_TAB
+-                  AS2 (sbiw,r26,%o0));
+-      }
++          {
++            if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (subi,r26,lo8(-(%o0+1)))   CR_TAB
++                      AS2 (sbci,r27,hi8(-(%o0+1)))   CR_TAB
++                      AS2 (st,X,%B1)       CR_TAB
++                      AS2 (st,-X,%A1)      CR_TAB
++                      AS2 (subi,r26,lo8(%o0))    CR_TAB
++                      AS2 (sbci,r27,hi8(%o0)));
++            } else {
++              *l = 4;
++              return (AS2 (adiw,r26,%o0+1) CR_TAB
++                      AS2 (st,X,%B1)       CR_TAB
++                      AS2 (st,-X,%A1)      CR_TAB
++                      AS2 (sbiw,r26,%o0));
++            }
++          }
+         else
+-          {
+-            *l = 4;
+-              return AVR_TINY ? (AS2 (subi,r26,lo8(-(%o0)))   CR_TAB
+-                        AS2 (sbci,r27,hi8(-(%o0)))   CR_TAB
+-                        AS2 (st,X+,%A1)       CR_TAB
+-                        AS2 (st,X,%B1)      CR_TAB
+-                        AS2 (subi,r26,lo8(%o0))    CR_TAB
+-                        AS2 (sbci,r27,hi8(%o0))) 
+-                                       : (AS2 (adiw,r26,%o0) CR_TAB
++          {
++          if (AVR_TINY) {
++              *l = 6;
++              return (AS2 (subi,r26,lo8(-(%o0))) CR_TAB
++                      AS2 (sbci,r27,hi8(-(%o0))) CR_TAB
++                      AS2 (st,X+,%A1)            CR_TAB
++                      AS2 (st,X,%B1)             CR_TAB
++                      AS2 (subi,r26,lo8(%o0))    CR_TAB
++                      AS2 (sbci,r27,hi8(%o0)));
++            } else {
++              *l = 4;
++              return (AS2 (adiw,r26,%o0) CR_TAB
+                     AS2 (st,X+,%A1)    CR_TAB
+                     AS2 (st,X,%B1)     CR_TAB
+                     AS2 (sbiw,r26,%o0+1));
+             }
++          }
+       }
+       
+       if (!AVR_XMEGA)
+-        {
+-              op[2] = XEXP(base, 0);
+-              if(REGNO(op[2]) == REG_Y)
+-        return *l=2, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0+2)))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o0+2)))    CR_TAB
+-                                              AS2 (st,-Y,%B1)                  CR_TAB
+-                        AS2 (st,-Y,%A1)                  CR_TAB
+-                        AS2 (subi,%A2,lo8(%o0))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o0)))   
+-                                   : (AS2 (std,%B0,%B1)    CR_TAB
++      {
++      op[2] = XEXP(base, 0);
++        if(REGNO(op[2]) == REG_Y)
++        {
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (subi,%A2,lo8(-(%o0+2))) CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o0+2))) CR_TAB
++                    AS2 (st,-Y,%B1)              CR_TAB
++                    AS2 (st,-Y,%A1)              CR_TAB
++                    AS2 (subi,%A2,lo8(%o0))      CR_TAB
++                    AS2 (sbci,%B2,hi8(%o0)));
++          } else {
++            *l = 2;
++            return (AS2 (std,%B0,%B1)    CR_TAB
+                     AS2 (std,%A0,%A1));
+-              if(REGNO(op[2]) == REG_Z)
+-        return *l=2, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0+2)))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o0+2)))    CR_TAB
+-                                              AS2 (st,-Z,%B1)                  CR_TAB
+-                        AS2 (st,-Z,%A1)                  CR_TAB
+-                        AS2 (subi,%A2,lo8(%o0))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o0)))   
+-                                   : (AS2 (std,%B0,%B1)    CR_TAB
+-                        AS2 (std,%A0,%A1));
+-        }
++          }
++        }
++        if(REGNO(op[2]) == REG_Z)
++        {
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (subi,%A2,lo8(-(%o0+2))) CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o0+2))) CR_TAB
++                    AS2 (st,-Z,%B1)              CR_TAB
++                    AS2 (st,-Z,%A1)              CR_TAB
++                    AS2 (subi,%A2,lo8(%o0))      CR_TAB
++                    AS2 (sbci,%B2,hi8(%o0)));
++          } else {
++            *l = 2;
++            return (AS2 (std,%B0,%B1)    CR_TAB
++                    AS2 (std,%A0,%A1));
++          }
++        }
++      }
+       else
+-        {
+-              op[2] = XEXP(base, 0);
+-              if(REGNO(op[2]) == REG_Y)
+-        return *l=2, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0)))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o0)))    CR_TAB
+-                        AS2 (st,Y+,%A1)                CR_TAB
+-                                              AS2 (st,Y,%B1)                 CR_TAB                 
+-                                      AS2 (subi,%A2,lo8(%o0+1))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o0+1)))
+-                         : (AS2 (std,%A0,%A1)    CR_TAB
+-                    AS2 (std,%B0,%B1));
+-              if(REGNO(op[2]) == REG_Z)
+-        return *l=2, AVR_TINY ? (AS2 (subi,%A2,lo8(-(%o0)))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(-(%o0)))    CR_TAB
+-                        AS2 (st,Z+,%A1)                CR_TAB
+-                                              AS2 (st,Z,%B1)                CR_TAB 
+-                                      AS2 (subi,%A2,lo8(%o0+1))    CR_TAB
+-                                              AS2 (sbci,%B2,hi8(%o0+1))) 
+-                         : (AS2 (std,%A0,%A1)    CR_TAB
+-                          AS2 (std,%B0,%B1));
+-        }
++      {
++        op[2] = XEXP(base, 0);
++        if(REGNO(op[2]) == REG_Y)
++        {
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                    AS2 (st,Y+,%A1)            CR_TAB
++                    AS2 (st,Y,%B1)             CR_TAB                 
++                    AS2 (subi,%A2,lo8(%o0+1))  CR_TAB
++                    AS2 (sbci,%B2,hi8(%o0+1)));
++          } else {
++            *l = 2;
++            return (AS2 (std,%A0,%A1)    CR_TAB
++                    AS2 (std,%B0,%B1));
++          }
++        }
++        if(REGNO(op[2]) == REG_Z)
++        {
++          if (AVR_TINY) {
++            *l = 6;
++            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                    AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                    AS2 (st,Z+,%A1)            CR_TAB
++                    AS2 (st,Z,%B1)             CR_TAB 
++                    AS2 (subi,%A2,lo8(%o0+1))  CR_TAB
++                    AS2 (sbci,%B2,hi8(%o0+1)));
++          } else {
++            *l = 2;
++            return (AS2 (std,%A0,%A1)    CR_TAB
++                    AS2 (std,%B0,%B1));
++          }
++        }
++      }
+     }
+   else if (GET_CODE (base) == PRE_DEC) /* (--R) */
+     {
+@@ -3814,33 +4274,41 @@ out_movhi_mr_r (rtx insn, rtx op[], int 
+         {
+           if (REGNO (XEXP (base, 0)) == REG_X)
+             {
+-              *l = 4;
+-              return AVR_TINY ? (AS2 (subi,r26,lo8(-1))  CR_TAB
+-                                          AS2 (sbci,r27,hi8(-1))  CR_TAB
++              if (AVR_TINY) {
++                *l = 6;
++                return (AS2 (subi,r26,lo8(-1))  CR_TAB
++                        AS2 (sbci,r27,hi8(-1))  CR_TAB
+                         AS2 (st,X,%B1)    CR_TAB
+                         AS2 (st,-X,%A1)   CR_TAB
+-                                              AS2 (subi,r26,lo8(-2)) CR_TAB
+-                                              AS2 (sbci,r27,hi8(-2)))
+-                                       : (AS2 (adiw,r26,1)  CR_TAB
+-                      AS2 (st,X,%B1)    CR_TAB
+-                      AS2 (st,-X,%A1)   CR_TAB
+-                      AS2 (adiw,r26,2));
++                              AS2 (subi,r26,lo8(-2)) CR_TAB
++                        AS2 (sbci,r27,hi8(-2)));
++              } else {
++                *l = 4;
++                return (AS2 (adiw,r26,1)  CR_TAB
++                        AS2 (st,X,%B1)    CR_TAB
++                        AS2 (st,-X,%A1)   CR_TAB
++                        AS2 (adiw,r26,2));
++              }
+             }
+           else
+             {
+-                        //FIXME:check the code once again for AVR_TINY
+-              *l = 3;
+-              return AVR_TINY ? (AS2 (subi,%A0,lo8(-1)) CR_TAB
+-                                              AS2 (sbci,%B0,hi8(-1)) CR_TAB
+-                                              AS2 (st,%p0,%B1)       CR_TAB
+-                        AS2 (subi,%A0,lo8(1)) CR_TAB
+-                                              AS2 (sbci,%B0,hi8(1)) CR_TAB
++              //FIXME:check the code once again for AVR_TINY
++              if (AVR_TINY) {
++                *l = 8;
++                return (AS2 (subi,%A0,lo8(-1)) CR_TAB
++                        AS2 (sbci,%B0,hi8(-1)) CR_TAB
++                        AS2 (st,%p0,%B1)       CR_TAB
++                        AS2 (subi,%A0,lo8(1))  CR_TAB
++                        AS2 (sbci,%B0,hi8(1))  CR_TAB
+                         AS2 (st,%p0,%A1)       CR_TAB
+                         AS2 (subi,%A0,lo8(-3)) CR_TAB 
+-                                          AS2 (sbci,%B0,hi8(-3)))
+-                                       : (AS2 (std,%p0+1,%B1) CR_TAB
+-                      AS2 (st,%p0,%A1)    CR_TAB
+-                      AS2 (adiw,%r0,2));
++                        AS2 (sbci,%B0,hi8(-3)));
++              } else {
++                *l = 3;
++                return (AS2 (std,%p0+1,%B1) CR_TAB
++                        AS2 (st,%p0,%A1)    CR_TAB
++                        AS2 (adiw,%r0,2));
++              }
+             }
+         }
+@@ -3927,10 +4395,14 @@ out_tsthi (rtx insn, rtx op, int *l)
+     }
+   if (test_hard_reg_class (ADDW_REGS, op))
+     {
+-      if (l) *l = 1;
+-      return AVR_TINY ? (AS2 (subi,%A0,lo8(0)) CR_TAB
+-                              AS2 (sbci,%B0,hi8(0)))
+-                       :  AS2 (sbiw,%0,0);
++      if (AVR_TINY) {
++        if (l) *l = 2;
++        return (AS2 (subi,%A0,lo8(0)) CR_TAB
++                AS2 (sbci,%B0,hi8(0)));
++      } else {
++        if (l) *l = 1;
++        return (AS2 (sbiw,%0,0));
++      }
+     }
+   if (l) *l = 2;
+   return (AS2 (cp,%A0,__zero_reg__) CR_TAB
+@@ -3950,14 +4422,18 @@ out_tstsi (rtx insn, rtx op, int *l)
+     }
+   if (test_hard_reg_class (ADDW_REGS, op))
+     {
+-      if (l) *l = 3;
+-      return AVR_TINY ? (AS2 (subi,%A0,lo8(-(-0))) CR_TAB
+-                              AS2 (sbci,%B0,hi8(-(-0))) CR_TAB
++      if (AVR_TINY) {
++        if (l) *l = 4;
++        return (AS2 (subi,%A0,lo8(-(-0))) CR_TAB
++                AS2 (sbci,%B0,hi8(-(-0))) CR_TAB
+                 AS2 (cpc,%C0,__zero_reg__) CR_TAB
+-                AS2 (cpc,%D0,__zero_reg__))
+-                       : (AS2 (sbiw,%A0,0) CR_TAB
+-              AS2 (cpc,%C0,__zero_reg__) CR_TAB
+-              AS2 (cpc,%D0,__zero_reg__));
++                AS2 (cpc,%D0,__zero_reg__));
++      } else {
++        if (l) *l = 3;
++        return (AS2 (sbiw,%A0,0) CR_TAB
++                AS2 (cpc,%C0,__zero_reg__) CR_TAB
++                AS2 (cpc,%D0,__zero_reg__));
++      }
+     }
+   if (l) *l = 4;
+   return (AS2 (cp,%A0,__zero_reg__) CR_TAB
diff --git a/513-gcc-avrtc556-tiny-same-base-and-dest.patch b/513-gcc-avrtc556-tiny-same-base-and-dest.patch
new file mode 100644 (file)
index 0000000..1b6f633
--- /dev/null
@@ -0,0 +1,130 @@
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-07-13 16:06:56.000000000 +0530
++++ gcc/config/avr/avr.c       2012-07-13 15:23:01.000000000 +0530
+@@ -2265,6 +2265,15 @@ out_movqi_r_mr (rtx insn, rtx op[], int 
+           {
+             if (AVR_TINY)
+             {
++                if (reg_overlap_mentioned_p (dest, XEXP (x,0))
++                    || reg_unused_after (insn, XEXP (x,0)))
++                {
++
++                    *l = 3;
++                    return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                            AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                            AS2 (ld,%0,Y));
++                }
+               *l = 5;
+               return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+                       AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+@@ -2282,6 +2291,15 @@ out_movqi_r_mr (rtx insn, rtx op[], int 
+           {
+             if (AVR_TINY)
+             {
++              if (reg_overlap_mentioned_p (dest, XEXP (x,0))
++                  || reg_unused_after (insn, XEXP (x,0)))
++                  {
++
++                    *l = 3;
++                    return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                            AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                            AS2 (ld,%0,Z));
++                  }
+               *l = 5;
+               return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+                       AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+@@ -3766,12 +3784,41 @@ out_movqi_mr_r (rtx insn, rtx op[], int 
+         op[2] = XEXP(x, 0);
+         if(REGNO(op[2]) == REG_Y) {
+           if (AVR_TINY) {
+-            *l = 5;
+-            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
+-                  AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
+-                  AS2 (st,Y,%1)              CR_TAB
+-                    AS2 (subi,%A2,lo8(%o0)) CR_TAB
+-                  AS2 (sbci,%B2,hi8(%o0)));
++            if (reg_overlap_mentioned_p (src, XEXP (x, 0)))
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 4;
++                return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                  AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                  AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                  AS2 (st,Y,__tmp_reg__));
++              }
++              *l = 6;
++              return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                AS2 (st,Y,__tmp_reg__)          CR_TAB
++                      AS2 (subi,%A2,lo8(%o0))          CR_TAB
++                            AS2 (sbci,%B2,hi8(%o0)));        
++            }
++            else
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 3;
++                return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                              AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                              AS2 (st,Y,%1));
++              }
++
++              *l = 5;
++              return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                      AS2 (st,Y,%1)              CR_TAB
++                      AS2 (subi,%A2,lo8(%o0)) CR_TAB
++                      AS2 (sbci,%B2,hi8(%o0)));
++            }
+           } else {
+             *l = 1;
+             return (AS2 (std,%0,%1));
+@@ -3779,12 +3826,40 @@ out_movqi_mr_r (rtx insn, rtx op[], int 
+         }
+         if(REGNO(op[2]) == REG_Z) {
+           if (AVR_TINY) {
+-            *l = 5;
+-            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
+-                  AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
+-                    AS2 (st,Z,%1)              CR_TAB
+-                    AS2 (subi,%A2,lo8(%o0)) CR_TAB
+-                    AS2 (sbci,%B2,hi8(%o0)));
++            if (reg_overlap_mentioned_p (src, XEXP (x, 0)))
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 4;
++                return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                  AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                  AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                  AS2 (st,Z,__tmp_reg__));
++              }
++              *l = 6;
++              return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                AS2 (st,Z,__tmp_reg__)          CR_TAB
++                      AS2 (subi,%A2,lo8(%o0))          CR_TAB
++                            AS2 (sbci,%B2,hi8(%o0)));        
++            }
++            else
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 3;
++                return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                              AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                              AS2 (st,Z,%1));
++              }
++              *l = 5;
++              return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                      AS2 (st,Z,%1)              CR_TAB
++                      AS2 (subi,%A2,lo8(%o0)) CR_TAB
++                      AS2 (sbci,%B2,hi8(%o0)));
++            }
+           } else {
+           *l = 1;
+             return (AS2 (std,%0,%1));
diff --git a/514-gcc-avrtc558.patch b/514-gcc-avrtc558.patch
new file mode 100644 (file)
index 0000000..49ac0d7
--- /dev/null
@@ -0,0 +1,46 @@
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-07-16 11:46:50.000000000 +0530
++++ gcc/config/avr/avr.c       2012-07-16 11:54:05.000000000 +0530
+@@ -3267,7 +3267,7 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+                     AS2 (st,Y+,%C1)       CR_TAB
+                     AS2 (st,Y,%D1)        CR_TAB
+                     AS2 (subi,r28,lo8(3)) CR_TAB
+-                    AS2 (sbci,r29,lo8(3)));
++                    AS2 (sbci,r29,hi8(3)));
+           } else {
+             *l = 4;
+             return (AS2 (st,%0,%A1)    CR_TAB
+@@ -3284,7 +3284,7 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+                     AS2 (st,Z+,%C1)       CR_TAB
+                     AS2 (st,Z,%D1)        CR_TAB
+                     AS2 (subi,r30,lo8(3)) CR_TAB
+-                    AS2 (sbci,r31,lo8(3)));
++                    AS2 (sbci,r31,hi8(3)));
+           } else {
+             *l = 4;
+             return (AS2 (st,%0,%A1)    CR_TAB
+@@ -3310,13 +3310,13 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+               return (AS2 (subi,r28,lo8(-(%o0-60))) CR_TAB
+                       AS2 (sbci,r29,hi8(-(%o0-60))) CR_TAB
+                       AS2 (subi,r28,lo8(-60)) CR_TAB
+-                      AS2 (sbci,r29,lo8(-60)) CR_TAB
++                      AS2 (sbci,r29,hi8(-60)) CR_TAB
+                       AS2 (st,Y+,%A1)         CR_TAB
+                       AS2 (st,Y+,%B1)         CR_TAB
+                       AS2 (st,Y+,%C1)         CR_TAB
+                       AS2 (st,Y,%D1)          CR_TAB
+                       AS2 (subi,r28,lo8(63)) CR_TAB
+-                      AS2 (sbci,r29,lo8(63)) CR_TAB
++                      AS2 (sbci,r29,hi8(63)) CR_TAB
+                       AS2 (subi,r28,lo8(%o0-60)) CR_TAB 
+                       AS2 (sbci,r29,hi8(%o0-60)));
+             } else {
+@@ -3338,7 +3338,7 @@ out_movsi_mr_r (rtx insn, rtx op[], int 
+                   AS2 (st,Y+,%C1)           CR_TAB
+                   AS2 (st,Y,%D1)           CR_TAB
+                     AS2 (subi,r28,lo8(3))   CR_TAB
+-                    AS2 (sbci,r29,lo8(3))   CR_TAB
++                    AS2 (sbci,r29,hi8(3))   CR_TAB
+                   AS2 (subi,r28,lo8(%o0))  CR_TAB
+                   AS2 (sbci,r29,hi8(%o0)));
+           } else {
diff --git a/515-gcc-avrtc446.patch b/515-gcc-avrtc446.patch
new file mode 100644 (file)
index 0000000..71b8cc7
--- /dev/null
@@ -0,0 +1,38 @@
+diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
+--- gcc/config/avr/avr-devices.c       2012-10-25 13:28:05.000000000 +0530
++++ gcc/config/avr/avr-devices.c       2012-10-25 13:30:18.000000000 +0530
+@@ -72,7 +72,6 @@ const struct mcu_type_s avr_mcu_types[] 
+   { "at90s8535",            ARCH_AVR2, "__AVR_AT90S8535__",         0, 0x0060, "s8535" },
+     /* Classic, <= 8K + 2-byte PC + { MOVW/LPMX }.  */
+   { "avr25",                ARCH_AVR25, NULL,                       0, 0x0060, "tn85" },
+-  { "ata6289",              ARCH_AVR25, "__AVR_ATA6289__",          0, 0x0100, "a6289" },
+   { "ata5272",              ARCH_AVR25, "__AVR_ATA5272__",          0, 0x0100, "a5272" },
+   { "attiny13",             ARCH_AVR25, "__AVR_ATtiny13__",         1, 0x0060, "tn13" },
+   { "attiny13a",            ARCH_AVR25, "__AVR_ATtiny13A__",        1, 0x0060, "tn13a" },
+@@ -123,6 +122,7 @@ const struct mcu_type_s avr_mcu_types[] 
+   { "avr4",                 ARCH_AVR4, NULL,                        0, 0x0060, "m8" },
+   { "ata6285",              ARCH_AVR4, "__AVR_ATA6285__",           0, 0x0100, "a6285" },
+   { "ata6286",              ARCH_AVR4, "__AVR_ATA6286__",           0, 0x0100, "a6286" },
++  { "ata6289",              ARCH_AVR4, "__AVR_ATA6289__",           0, 0x0100, "a6289" },
+   { "atmega8",              ARCH_AVR4, "__AVR_ATmega8__",           0, 0x0060, "m8" },
+   { "atmega8a",             ARCH_AVR4, "__AVR_ATmega8A__",          0, 0x0060, "m8a" },
+   { "atmega48",             ARCH_AVR4, "__AVR_ATmega48__",          0, 0x0100, "m48" },
+diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
+--- gcc/config/avr/t-avr       2012-10-25 13:28:05.000000000 +0530
++++ gcc/config/avr/t-avr       2012-10-25 13:31:25.000000000 +0530
+@@ -113,7 +113,6 @@ MULTILIB_DIRNAMES = avr2 avr25 avr3 avr3
+ # The many avr2 matches are not listed here - this is the default.
+ MULTILIB_MATCHES = \
+       mmcu?avr25=mmcu?ata5272 \
+-      mmcu?avr25=mmcu?ata6289 \
+       mmcu?avr25=mmcu?attiny13 \
+       mmcu?avr25=mmcu?attiny13a \
+       mmcu?avr25=mmcu?attiny2313 \
+@@ -157,6 +156,7 @@ MULTILIB_MATCHES = \
+       mmcu?avr35=mmcu?attiny327 \
+       mmcu?avr4=mmcu?ata6285 \
+       mmcu?avr4=mmcu?ata6286 \
++      mmcu?avr4=mmcu?ata6289 \
+       mmcu?avr4=mmcu?atmega48 \
+       mmcu?avr4=mmcu?atmega48a \
+       mmcu?avr4=mmcu?atmega48pa \
index fe849500fc431bae8e6460f5339c11468c0f768a..be8f6ceeb4bbc663f024672e721aa546189783c1 100644 (file)
@@ -10,10 +10,10 @@ Summary(pt_BR.UTF-8):       Utilitários para desenvolvimento de binários da GNU - AV
 Summary(tr.UTF-8):     GNU geliştirme araçları - AVR gcc
 Name:          crossavr-gcc
 Version:       4.6.2
-Release:       4
+Release:       5
 Epoch:         1
 Patch1:                gcc-bug51969.patch
-# Patches 1xx are taken form Atmel official AVR8-GNU toolchain version 3.4.0.663.
+# Patches 1xx are taken form Atmel official AVR8-GNU toolchain version 3.4.1.830
 Patch100:      200-gcc-libiberty-Makefile.in.patch
 Patch101:      300-gcc-fixedpoint-3-4-2010.patch
 Patch102:      301-gcc-xmega-v14.patch
@@ -22,43 +22,58 @@ Patch104:   303-gcc-osmain.patch
 Patch105:      304-gcc-builtins-v6.patch
 Patch106:      305-gcc-avrtiny10-non-fixedpoint.patch
 Patch107:      306-gcc-option-list-devices.patch
-Patch108:      400-gcc-new-devices.patch
-Patch109:      401-gcc-atmega32_5_50_90_pa.patch
-Patch110:      402-gcc-attiny1634.patch
-Patch111:      403-gcc-atmega48pa.patch
-Patch112:      404-gcc-atxmega_16_32_a4u.patch
-Patch113:      405-gcc-atxmega64_128_192_256a3u.patch
-Patch114:      406-gcc-atmegarfr2_a2.patch
-Patch115:      407-gcc-atmega165pa.patch
-Patch116:      408-gcc-atxmega384c3.patch
-Patch117:      409-gcc-attiny80.patch
-Patch118:      410-gcc-atxmega128a4u.patch
-Patch119:      411-gcc-atxmega64d4.patch
-Patch120:      412-gcc-atmega164pa_168pa_32a_64a.patch
-Patch121:      413-gcc-atxmega64_128_b3.patch
-Patch122:      414-gcc-atxmega64b1.patch
-Patch123:      415-gcc-atmega_8a_128a_1284.patch
-Patch124:      416-gcc-atxmega64a4u.patch
-Patch125:      417-gcc-atxmega128d4.patch
-Patch126:      418-gcc-atmxt336s.patch
-Patch127:      419-gcc-atxmega16c4_32c4_128c3_256c3.patch
-Patch128:      420-gcc-atxmega384d3.patch
-Patch129:      421-gcc-atmega48hvf.patch
-Patch130:      422-gcc-atmega26hvg.patch
-Patch131:      423-gcc-atmxt224_224e.patch
-Patch132:      424-gcc-atxmega192c3.patch
-Patch133:      425-gcc-atmxt112sl.patch
-Patch134:      426-gcc-atxmega64c3.patch
-Patch135:      427-gcc-ata6285_6286.patch
-Patch136:      428-gcc-attiny828.patch
-Patch137:      429-gcc-ata5790_5790n_5795.patch
-Patch138:      430-gcc-ata5272_ata5505.patch
-Patch139:      500-gcc-bug13473.patch
-Patch140:      501-gcc-avrtiny10-bug-12510.patch
-Patch141:      502-gcc-bug12915.patch
-Patch142:      503-gcc-bug13789.patch
-Patch143:      504-gcc-conditional-register.patch
-Patch144:      505-gcc-avrtc381-tiny.patch
+Patch108:      307-gcc-avrtc536.patch
+Patch109:      308-gcc-avrtc537.patch
+Patch110:      400-gcc-new-devices.patch
+Patch111:      401-gcc-atmega32_5_50_90_pa.patch
+Patch112:      402-gcc-attiny1634.patch
+Patch113:      403-gcc-atmega48pa.patch
+Patch114:      404-gcc-atxmega_16_32_a4u.patch
+Patch115:      405-gcc-atxmega64_128_192_256a3u.patch
+Patch116:      406-gcc-atmegarfr2_a2.patch
+Patch117:      407-gcc-atmega165pa.patch
+Patch118:      408-gcc-atxmega384c3.patch
+Patch119:      410-gcc-atxmega128a4u.patch
+Patch120:      411-gcc-atxmega64d4.patch
+Patch121:      412-gcc-atmega164pa_168pa_32a_64a.patch
+Patch122:      413-gcc-atxmega64_128_b3.patch
+Patch123:      414-gcc-atxmega64b1.patch
+Patch124:      415-gcc-atmega_8a_128a_1284.patch
+Patch125:      416-gcc-atxmega64a4u.patch
+Patch126:      417-gcc-atxmega128d4.patch
+Patch127:      418-gcc-atmxt336s.patch
+Patch128:      419-gcc-atxmega16c4_32c4_128c3_256c3.patch
+Patch129:      420-gcc-atxmega384d3.patch
+Patch130:      421-gcc-atmega48hvf.patch
+Patch131:      422-gcc-atmega26hvg.patch
+Patch132:      423-gcc-atmxt224_224e.patch
+Patch133:      424-gcc-atxmega192c3.patch
+Patch134:      425-gcc-atmxt112sl.patch
+Patch135:      426-gcc-atxmega64c3.patch
+Patch136:      427-gcc-ata6285_6286.patch
+Patch137:      428-gcc-attiny828.patch
+Patch138:      429-gcc-ata5790_5790n_5795.patch
+Patch139:      430-gcc-ata5272_ata5505.patch
+Patch140:      431-gcc-atmxt540s.patch
+Patch141:      432-gcc-ata5831.patch
+Patch142:      433-gcc-attiny841.patch
+Patch143:      434-gcc-atxmega32_16_8e5.patch
+Patch144:      500-gcc-bug13473.patch
+Patch145:      501-gcc-avrtiny10-bug-12510.patch
+Patch146:      502-gcc-bug12915.patch
+Patch147:      503-gcc-bug13789.patch
+Patch148:      504-gcc-conditional-register.patch
+Patch149:      505-gcc-avrtc381-tiny.patch
+Patch150:      506-gcc-avrtc541.patch
+Patch151:      507-gcc-avrtc-518.patch
+Patch152:      508-gcc-avrtc514-tiny.patch
+Patch153:      509-gcc-AVRTC-544-call-used-registers-tiny10.patch
+Patch154:      510-gcc-avrtc496-tiny.patch
+Patch155:      511-gcc-avrtc539-backported.patch
+Patch156:      512-gcc-avrtc542.patch
+Patch157:      513-gcc-avrtc556-tiny-same-base-and-dest.patch
+Patch158:      514-gcc-avrtc558.patch
+Patch159:      515-gcc-avrtc446.patch
 License:       GPL
 Group:         Development/Languages
 Source0:       ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{version}/gcc-%{version}.tar.bz2
@@ -163,6 +178,21 @@ cd gcc/config/%{target} && %undos -f c,h && cd -
 %patch142 -p0
 %patch143 -p0
 %patch144 -p0
+%patch145 -p0
+%patch146 -p0
+%patch147 -p0
+%patch148 -p0
+%patch149 -p0
+%patch150 -p0
+%patch151 -p0
+%patch152 -p0
+%patch153 -p0
+%patch154 -p0
+%patch155 -p0
+%patch156 -p0
+%patch157 -p0
+%patch158 -p0
+%patch159 -p0
 
 %build
 rm -rf obj-%{target}
This page took 0.514024 seconds and 4 git commands to generate.