From ab7f78a4a6b0448f315db017e24209b62c772e22 Mon Sep 17 00:00:00 2001 From: Piotr Ziecik Date: Fri, 18 Jan 2013 22:07:05 +0100 Subject: [PATCH] - synchronized patches with official AVR toolchain 3.4.1.830 --- 302-gcc-avrtiny10.patch | 20 +- 307-gcc-avrtc536.patch | 28 + 308-gcc-avrtc537.patch | 31 + 410-gcc-atxmega128a4u.patch | 4 +- 411-gcc-atxmega64d4.patch | 4 +- 412-gcc-atmega164pa_168pa_32a_64a.patch | 14 +- 413-gcc-atxmega64_128_b3.patch | 8 +- 414-gcc-atxmega64b1.patch | 4 +- 415-gcc-atmega_8a_128a_1284.patch | 8 +- 416-gcc-atxmega64a4u.patch | 6 +- 417-gcc-atxmega128d4.patch | 4 +- 418-gcc-atmxt336s.patch | 4 +- 419-gcc-atxmega16c4_32c4_128c3_256c3.patch | 12 +- 420-gcc-atxmega384d3.patch | 4 +- 421-gcc-atmega48hvf.patch | 4 +- 422-gcc-atmega26hvg.patch | 4 +- 423-gcc-atmxt224_224e.patch | 4 +- 424-gcc-atxmega192c3.patch | 4 +- 425-gcc-atmxt112sl.patch | 4 +- 426-gcc-atxmega64c3.patch | 4 +- 427-gcc-ata6285_6286.patch | 4 +- 428-gcc-attiny828.patch | 16 +- 429-gcc-ata5790_5790n_5795.patch | 4 +- 430-gcc-ata5272_ata5505.patch | 4 +- 431-gcc-atmxt540s.patch | 24 + 432-gcc-ata5831.patch | 54 + ...-attiny80.patch => 433-gcc-attiny841.patch | 20 +- 434-gcc-atxmega32_16_8e5.patch | 26 + 501-gcc-avrtiny10-bug-12510.patch | 10 +- 503-gcc-bug13789.patch | 18 +- 504-gcc-conditional-register.patch | 10 +- 506-gcc-avrtc541.patch | 42 + 507-gcc-avrtc-518.patch | 23 + 508-gcc-avrtc514-tiny.patch | 12 + ...AVRTC-544-call-used-registers-tiny10.patch | 173 ++ 510-gcc-avrtc496-tiny.patch | 42 + 511-gcc-avrtc539-backported.patch | 44 + 512-gcc-avrtc542.patch | 2753 +++++++++++++++++ ...gcc-avrtc556-tiny-same-base-and-dest.patch | 130 + 514-gcc-avrtc558.patch | 46 + 515-gcc-avrtc446.patch | 38 + crossavr-gcc.spec | 108 +- 42 files changed, 3637 insertions(+), 139 deletions(-) create mode 100644 307-gcc-avrtc536.patch create mode 100644 308-gcc-avrtc537.patch create mode 100644 431-gcc-atmxt540s.patch create mode 100644 432-gcc-ata5831.patch rename 409-gcc-attiny80.patch => 433-gcc-attiny841.patch (54%) create mode 100644 434-gcc-atxmega32_16_8e5.patch create mode 100644 506-gcc-avrtc541.patch create mode 100644 507-gcc-avrtc-518.patch create mode 100644 508-gcc-avrtc514-tiny.patch create mode 100644 509-gcc-AVRTC-544-call-used-registers-tiny10.patch create mode 100644 510-gcc-avrtc496-tiny.patch create mode 100644 511-gcc-avrtc539-backported.patch create mode 100644 512-gcc-avrtc542.patch create mode 100644 513-gcc-avrtc556-tiny-same-base-and-dest.patch create mode 100644 514-gcc-avrtc558.patch create mode 100644 515-gcc-avrtc446.patch diff --git a/302-gcc-avrtiny10.patch b/302-gcc-avrtiny10.patch index 98ed7ff..2bab2a4 100644 --- a/302-gcc-avrtiny10.patch +++ b/302-gcc-avrtiny10.patch @@ -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 index 0000000..e520a9d --- /dev/null +++ b/307-gcc-avrtc536.patch @@ -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 index 0000000..676a892 --- /dev/null +++ b/308-gcc-avrtc537.patch @@ -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 diff --git a/410-gcc-atxmega128a4u.patch b/410-gcc-atxmega128a4u.patch index 0f5be09..000880e 100644 --- a/410-gcc-atxmega128a4u.patch +++ b/410-gcc-atxmega128a4u.patch @@ -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 \ diff --git a/411-gcc-atxmega64d4.patch b/411-gcc-atxmega64d4.patch index 320397d..d1f625d 100644 --- a/411-gcc-atxmega64d4.patch +++ b/411-gcc-atxmega64d4.patch @@ -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 \ diff --git a/412-gcc-atmega164pa_168pa_32a_64a.patch b/412-gcc-atmega164pa_168pa_32a_64a.patch index 0a08fe8..6d07827 100644 --- a/412-gcc-atmega164pa_168pa_32a_64a.patch +++ b/412-gcc-atmega164pa_168pa_32a_64a.patch @@ -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 \ diff --git a/413-gcc-atxmega64_128_b3.patch b/413-gcc-atxmega64_128_b3.patch index 3f3bb54..63a414b 100644 --- a/413-gcc-atxmega64_128_b3.patch +++ b/413-gcc-atxmega64_128_b3.patch @@ -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 \ diff --git a/414-gcc-atxmega64b1.patch b/414-gcc-atxmega64b1.patch index 8a65026..12302b3 100644 --- a/414-gcc-atxmega64b1.patch +++ b/414-gcc-atxmega64b1.patch @@ -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 \ diff --git a/415-gcc-atmega_8a_128a_1284.patch b/415-gcc-atmega_8a_128a_1284.patch index 98c9d40..034f664 100644 --- a/415-gcc-atmega_8a_128a_1284.patch +++ b/415-gcc-atmega_8a_128a_1284.patch @@ -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 \ diff --git a/416-gcc-atxmega64a4u.patch b/416-gcc-atxmega64a4u.patch index 03dde6b..7c997d1 100644 --- a/416-gcc-atxmega64a4u.patch +++ b/416-gcc-atxmega64a4u.patch @@ -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 diff --git a/417-gcc-atxmega128d4.patch b/417-gcc-atxmega128d4.patch index af9222b..0f5d94d 100644 --- a/417-gcc-atxmega128d4.patch +++ b/417-gcc-atxmega128d4.patch @@ -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 \ diff --git a/418-gcc-atmxt336s.patch b/418-gcc-atmxt336s.patch index e906720..f82160b 100644 --- a/418-gcc-atmxt336s.patch +++ b/418-gcc-atmxt336s.patch @@ -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 \ diff --git a/419-gcc-atxmega16c4_32c4_128c3_256c3.patch b/419-gcc-atxmega16c4_32c4_128c3_256c3.patch index 46bc2d9..ac09038 100644 --- a/419-gcc-atxmega16c4_32c4_128c3_256c3.patch +++ b/419-gcc-atxmega16c4_32c4_128c3_256c3.patch @@ -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 \ diff --git a/420-gcc-atxmega384d3.patch b/420-gcc-atxmega384d3.patch index 6e51f55..24adf88 100644 --- a/420-gcc-atxmega384d3.patch +++ b/420-gcc-atxmega384d3.patch @@ -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 \ diff --git a/421-gcc-atmega48hvf.patch b/421-gcc-atmega48hvf.patch index 9ba627e..c05b174 100644 --- a/421-gcc-atmega48hvf.patch +++ b/421-gcc-atmega48hvf.patch @@ -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 \ diff --git a/422-gcc-atmega26hvg.patch b/422-gcc-atmega26hvg.patch index 1df4acc..5af18e7 100644 --- a/422-gcc-atmega26hvg.patch +++ b/422-gcc-atmega26hvg.patch @@ -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 \ diff --git a/423-gcc-atmxt224_224e.patch b/423-gcc-atmxt224_224e.patch index 5d1f041..f897533 100644 --- a/423-gcc-atmxt224_224e.patch +++ b/423-gcc-atmxt224_224e.patch @@ -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 \ diff --git a/424-gcc-atxmega192c3.patch b/424-gcc-atxmega192c3.patch index 5fe2f79..d145ece 100644 --- a/424-gcc-atxmega192c3.patch +++ b/424-gcc-atxmega192c3.patch @@ -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 \ diff --git a/425-gcc-atmxt112sl.patch b/425-gcc-atmxt112sl.patch index 7881478..618d4b3 100644 --- a/425-gcc-atmxt112sl.patch +++ b/425-gcc-atmxt112sl.patch @@ -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 \ diff --git a/426-gcc-atxmega64c3.patch b/426-gcc-atxmega64c3.patch index 6810501..41a67b8 100644 --- a/426-gcc-atxmega64c3.patch +++ b/426-gcc-atxmega64c3.patch @@ -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 \ diff --git a/427-gcc-ata6285_6286.patch b/427-gcc-ata6285_6286.patch index 857d206..a74328a 100644 --- a/427-gcc-ata6285_6286.patch +++ b/427-gcc-ata6285_6286.patch @@ -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 \ diff --git a/428-gcc-attiny828.patch b/428-gcc-attiny828.patch index 907fa03..e8765b9 100644 --- a/428-gcc-attiny828.patch +++ b/428-gcc-attiny828.patch @@ -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 \ diff --git a/429-gcc-ata5790_5790n_5795.patch b/429-gcc-ata5790_5790n_5795.patch index ac4e275..1a5b336 100644 --- a/429-gcc-ata5790_5790n_5795.patch +++ b/429-gcc-ata5790_5790n_5795.patch @@ -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 \ diff --git a/430-gcc-ata5272_ata5505.patch b/430-gcc-ata5272_ata5505.patch index b7deac1..5f53481 100644 --- a/430-gcc-ata5272_ata5505.patch +++ b/430-gcc-ata5272_ata5505.patch @@ -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 index 0000000..d3b8a39 --- /dev/null +++ b/431-gcc-atmxt540s.patch @@ -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 index 0000000..fadd66b --- /dev/null +++ b/432-gcc-ata5831.patch @@ -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 \ diff --git a/409-gcc-attiny80.patch b/433-gcc-attiny841.patch similarity index 54% rename from 409-gcc-attiny80.patch rename to 433-gcc-attiny841.patch index c109b09..f846bfd 100644 --- a/409-gcc-attiny80.patch +++ b/433-gcc-attiny841.patch @@ -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 index 0000000..b66709a --- /dev/null +++ b/434-gcc-atxmega32_16_8e5.patch @@ -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 \ diff --git a/501-gcc-avrtiny10-bug-12510.patch b/501-gcc-avrtiny10-bug-12510.patch index eecd478..36d31f1 100644 --- a/501-gcc-avrtiny10-bug-12510.patch +++ b/501-gcc-avrtiny10-bug-12510.patch @@ -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" diff --git a/503-gcc-bug13789.patch b/503-gcc-bug13789.patch index bfccc05..e488771 100644 --- a/503-gcc-bug13789.patch +++ b/503-gcc-bug13789.patch @@ -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, diff --git a/504-gcc-conditional-register.patch b/504-gcc-conditional-register.patch index 1dd01c1..acab4d2 100644 --- a/504-gcc-conditional-register.patch +++ b/504-gcc-conditional-register.patch @@ -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 index 0000000..2675251 --- /dev/null +++ b/506-gcc-avrtc541.patch @@ -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 index 0000000..07b2a87 --- /dev/null +++ b/507-gcc-avrtc-518.patch @@ -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 index 0000000..5e91123 --- /dev/null +++ b/508-gcc-avrtc514-tiny.patch @@ -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 index 0000000..8ef99f7 --- /dev/null +++ b/509-gcc-AVRTC-544-call-used-registers-tiny10.patch @@ -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 index 0000000..2bcc7f6 --- /dev/null +++ b/510-gcc-avrtc496-tiny.patch @@ -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 index 0000000..20d01db --- /dev/null +++ b/511-gcc-avrtc539-backported.patch @@ -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 index 0000000..9c23ed8 --- /dev/null +++ b/512-gcc-avrtc542.patch @@ -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 index 0000000..1b6f633 --- /dev/null +++ b/513-gcc-avrtc556-tiny-same-base-and-dest.patch @@ -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 index 0000000..49ac0d7 --- /dev/null +++ b/514-gcc-avrtc558.patch @@ -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 index 0000000..71b8cc7 --- /dev/null +++ b/515-gcc-avrtc446.patch @@ -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 \ diff --git a/crossavr-gcc.spec b/crossavr-gcc.spec index fe84950..be8f6ce 100644 --- a/crossavr-gcc.spec +++ b/crossavr-gcc.spec @@ -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} -- 2.43.0