diff options
Diffstat (limited to 'patches/gcc-4.4.3/atmel/0007-Add-support-for-devices-with-16-gp-registers.patch')
-rw-r--r-- | patches/gcc-4.4.3/atmel/0007-Add-support-for-devices-with-16-gp-registers.patch | 2520 |
1 files changed, 0 insertions, 2520 deletions
diff --git a/patches/gcc-4.4.3/atmel/0007-Add-support-for-devices-with-16-gp-registers.patch b/patches/gcc-4.4.3/atmel/0007-Add-support-for-devices-with-16-gp-registers.patch deleted file mode 100644 index 42e5e49..0000000 --- a/patches/gcc-4.4.3/atmel/0007-Add-support-for-devices-with-16-gp-registers.patch +++ /dev/null @@ -1,2520 +0,0 @@ -From 564ff03f509767b2b1e34ad906d634e0b5c1fdcf Mon Sep 17 00:00:00 2001 -From: Stephan Linz <linz@li-pro.net> -Date: Wed, 20 Apr 2011 22:29:45 +0200 -Subject: [PATCH 07/10] Add support for devices with 16 gp registers - -Add support for a bunch of new AVR devices, especially tiny devices -with 16 gp registers: attiny4, attiny5, attiny9, attiny10, attiny20, -attiny40 - -Compiler generates STS and LDS instructions for IO space less than -0x40 for attiny10, attiny20 and attiny40 families. - -Original ATMEL patch from: -http://distribute.atmel.no/tools/opensource/avr-gcc/gcc-4.4.3/54-gcc-4.4.3-avrtiny10.patch -http://distribute.atmel.no/tools/opensource/avr-gcc/gcc-4.4.3/55-gcc-4.4.3-avrtiny10-bug-12510.patch - -Signed-off-by: Stephan Linz <linz@li-pro.net> ---- - gcc/config/avr/avr.c | 1370 +++++++++++++++++++++++++++++++---------- - gcc/config/avr/avr.h | 55 ++- - gcc/config/avr/avr.md | 7 +- - gcc/config/avr/libgcc-fixed.S | 203 ++++--- - gcc/config/avr/libgcc.S | 44 ++- - gcc/config/avr/predicates.md | 9 +- - gcc/config/avr/t-avr | 12 +- - 7 files changed, 1274 insertions(+), 426 deletions(-) - -diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c -index b818c8b..422fad9 100644 ---- a/gcc/config/avr/avr.c -+++ b/gcc/config/avr/avr.c -@@ -119,27 +119,28 @@ const struct base_arch_s *avr_current_arch; - section *progmem_section; - - static const struct base_arch_s avr_arch_types[] = { -- { 1, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, /* Unknown device specified. */ -- { 1, 0, 0, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=1" }, -- { 0, 0, 0, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=2" }, -- { 0, 0, 0, 1, 0, 0, 0, 0, 0, "__AVR_ARCH__=25" }, -- { 0, 0, 1, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=3" }, -- { 0, 0, 1, 0, 1, 0, 0, 0, 0, "__AVR_ARCH__=31" }, -- { 0, 0, 1, 1, 0, 0, 0, 0, 0, "__AVR_ARCH__=35" }, -- { 0, 1, 0, 1, 0, 0, 0, 0, 0, "__AVR_ARCH__=4" }, -- { 0, 1, 1, 1, 0, 0, 0, 0, 0, "__AVR_ARCH__=5" }, -- { 0, 1, 1, 1, 1, 1, 0, 0, 0, "__AVR_ARCH__=51" }, -- { 0, 1, 1, 1, 1, 1, 1, 0, 0, "__AVR_ARCH__=6" }, -- { 0, 1, 0, 1, 0, 0, 0, 1, 0, "__AVR_ARCH__=101" }, -- { 0, 1, 1, 1, 0, 0, 0, 1, 0, "__AVR_ARCH__=102" }, -- { 0, 1, 1, 1, 0, 0, 0, 1, 1, "__AVR_ARCH__=103" }, -- { 0, 1, 1, 1, 1, 1, 0, 1, 0, "__AVR_ARCH__=104" }, -- { 0, 1, 1, 1, 1, 1, 0, 1, 1, "__AVR_ARCH__=105" }, -- { 0, 1, 1, 1, 1, 1, 1, 1, 0, "__AVR_ARCH__=106" }, -- { 0, 1, 1, 1, 1, 1, 1, 1, 1, "__AVR_ARCH__=107" } -+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, /* Unknown device specified. */ -+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=1" }, -+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=2" }, -+ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=25" }, -+ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=3" }, -+ { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, "__AVR_ARCH__=31" }, -+ { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=35" }, -+ { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=4" }, -+ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, "__AVR_ARCH__=5" }, -+ { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, "__AVR_ARCH__=51" }, -+ { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, "__AVR_ARCH__=6" }, -+ { 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, "__AVR_ARCH__=101" }, -+ { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, "__AVR_ARCH__=102" }, -+ { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, "__AVR_ARCH__=103" }, -+ { 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, "__AVR_ARCH__=104" }, -+ { 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, "__AVR_ARCH__=105" }, -+ { 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, "__AVR_ARCH__=106" }, -+ { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, "__AVR_ARCH__=107" }, -+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "__AVR_ARCH__=201" } - }; - --/* These names are used as the index into the avr_arch_types[] table -+/* These names are used as the index into the avr_arch_types[] table - above. */ - - enum avr_arch -@@ -161,7 +162,8 @@ enum avr_arch - ARCH_AVRXMEGA4, - ARCH_AVRXMEGA5, - ARCH_AVRXMEGA6, -- ARCH_AVRXMEGA7 -+ ARCH_AVRXMEGA7, -+ ARCH_AVRTINY10 - }; - - struct mcu_type_s { -@@ -394,6 +396,14 @@ static const struct mcu_type_s avr_mcu_types[] = { - { "avrxmega7", ARCH_AVRXMEGA7, NULL }, - { "atxmega128a1", ARCH_AVRXMEGA7, "__AVR_ATxmega128A1__" }, - { "atxmega128a1u",ARCH_AVRXMEGA7, "__AVR_ATxmega128A1U__" }, -+ /* tiny10 family */ -+ { "avrtiny10", ARCH_AVRTINY10, NULL }, -+ { "attiny4", ARCH_AVRTINY10, "__AVR_ATtiny4__" }, -+ { "attiny5", ARCH_AVRTINY10, "__AVR_ATtiny5__" }, -+ { "attiny9", ARCH_AVRTINY10, "__AVR_ATtiny9__" }, -+ { "attiny10", ARCH_AVRTINY10, "__AVR_ATtiny10__" }, -+ { "attiny20", ARCH_AVRTINY10, "__AVR_ATtiny20__" }, -+ { "attiny40", ARCH_AVRTINY10, "__AVR_ATtiny40__" }, - /* Assembler only. */ - { "avr1", ARCH_AVR1, NULL }, - { "at90s1200", ARCH_AVR1, "__AVR_AT90S1200__" }, -@@ -510,10 +520,8 @@ avr_override_options (void) - inform (input_location, "use the -fno-jump-tables switch instead"); - warned_no_tablejump_deprecated = true; - } -- -- tmp_reg_rtx = gen_rtx_REG (QImode, TMP_REGNO); -- zero_reg_rtx = gen_rtx_REG (QImode, ZERO_REGNO); -- -+ tmp_reg_rtx = gen_rtx_REG (QImode, AVR_TINY ? TMP_REGNO_AVRTINY10 : TMP_REGNO); -+ zero_reg_rtx = gen_rtx_REG (QImode, AVR_TINY ? ZERO_REGNO_AVRTINY10 : ZERO_REGNO); - init_machine_status = avr_init_machine_status; - } - -@@ -1863,7 +1871,7 @@ avr_simplify_comparison_p (enum machine_mode mode, RTX_CODE op, rtx x) - int - function_arg_regno_p(int r) - { -- return (r >= 8 && r <= 25); -+ return (AVR_TINY ? r >= 20 && r <= 25 : r >= 8 && r <= 25); - } - - /* Initializing the variable cum for the state at the beginning -@@ -1873,7 +1881,11 @@ void - init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, rtx libname, - tree fndecl ATTRIBUTE_UNUSED) - { -+ if (AVR_TINY) -+ cum->nregs = 6; -+ else - cum->nregs = 18; -+ - cum->regno = FIRST_CUM_REG; - if (!libname && fntype) - { -@@ -1897,9 +1909,8 @@ avr_num_arg_regs (enum machine_mode mode, tree type) - else - size = GET_MODE_SIZE (mode); - -- /* Align all function arguments to start in even-numbered registers. -+ /* if not AVR_TINY, Align all function arguments to start in even-numbered registers. - Odd-sized arguments leave holes above them. */ -- - return (size + 1) & ~1; - } - -@@ -2231,9 +2242,19 @@ out_movqi_r_mr (rtx insn, rtx op[], int *l) - fatal_insn ("incorrect insn:",insn); - - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src))) -- return *l = 3, (AS2 (adiw,r28,%o1-63) CR_TAB -- AS2 (ldd,%0,Y+63) CR_TAB -- AS2 (sbiw,r28,%o1-63)); -+ 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)); -+ - - return *l = 5, (AS2 (subi,r28,lo8(-%o1)) CR_TAB - AS2 (sbci,r29,hi8(-%o1)) CR_TAB -@@ -2247,15 +2268,38 @@ out_movqi_r_mr (rtx insn, rtx op[], int *l) - 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, (AS2 (adiw,r26,%o1) CR_TAB -- AS2 (ld,%0,X)); -- -- return *l = 3, (AS2 (adiw,r26,%o1) CR_TAB -- AS2 (ld,%0,X) CR_TAB -- AS2 (sbiw,r26,%o1)); -+ 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)); - } -+ - *l = 1; -- return AS2 (ldd,%0,%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(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); - } - *l = 1; - return AS2 (ld,%0,%1); -@@ -2295,15 +2339,35 @@ out_movhi_r_mr (rtx insn, rtx op[], int *l) - AS2 (ld,%B0,X)); - } - *l = 3; -- return (AS2 (ld,%A0,X+) CR_TAB -- AS2 (ld,%B0,X) CR_TAB -- AS2 (sbiw,r26,1)); -+ 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)); - } - else /* (R) */ - { - *l = 2; -- return (AS2 (ld,%A0,%1) CR_TAB -- AS2 (ldd,%B0,%1+1)); -+ 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(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)); - } - } - else if (GET_CODE (base) == PLUS) /* (R + i) */ -@@ -2317,17 +2381,35 @@ out_movhi_r_mr (rtx insn, rtx op[], int *l) - fatal_insn ("incorrect insn:",insn); - - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src))) -- return *l = 4, (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, (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))); -+ 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 (reg_base == REG_X) - { -@@ -2337,28 +2419,79 @@ out_movhi_r_mr (rtx insn, rtx op[], int *l) - - *l = 4; - if (reg_base == reg_dest) -- 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__)); -- -- return (AS2 (adiw,r26,%o1) CR_TAB -- AS2 (ld,%A0,X+) CR_TAB -- AS2 (ld,%B0,X) CR_TAB -- AS2 (sbiw,r26,%o1+1)); -+ 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) - { - *l = 3; -- return (AS2 (ldd,__tmp_reg__,%A1) CR_TAB -- AS2 (ldd,%B0,%B1) CR_TAB -- AS2 (mov,%A0,__tmp_reg__)); -+ 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 (subi,%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 (subi,%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__)); - } -- - *l = 2; -- return (AS2 (ldd,%A0,%A1) CR_TAB -- AS2 (ldd,%B0,%B1)); -+ -+ 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 (subi,%B2,hi8(%o1+1))) -+ : (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 (subi,%B2,hi8(%o1+1))) -+ : (AS2 (ldd,%A0,%A1) CR_TAB -+ AS2 (ldd,%B0,%B1)); -+ - } - else if (GET_CODE (base) == PRE_DEC) /* (--R) */ - { -@@ -2370,17 +2503,32 @@ out_movhi_r_mr (rtx insn, rtx op[], int *l) - if (REGNO (XEXP (base, 0)) == REG_X) - { - *l = 4; -- return (AS2 (sbiw,r26,2) CR_TAB -- AS2 (ld,%A0,X+) CR_TAB -- AS2 (ld,%B0,X) CR_TAB -- AS2 (sbiw,r26,1)); -+ 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 -+ AS2 (ld,%A0,X+) CR_TAB -+ AS2 (ld,%B0,X) CR_TAB -+ AS2 (sbiw,r26,1)); - } - else - { - *l = 3; -- return (AS2 (sbiw,%r1,2) CR_TAB -- AS2 (ld,%A0,%p1) CR_TAB -- AS2 (ldd,%B0,%p1+1)); -+ //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 -+ AS2 (ldd,%B0,%p1+1)); - } - } - -@@ -2434,13 +2582,23 @@ out_movsi_r_mr (rtx insn, rtx op[], int *l) - { - if (reg_dest == REG_X) - /* "ld r26,-X" is undefined */ -- return *l=7, (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__)); -+ 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__)); -+ - else if (reg_dest == REG_X - 2) - return *l=5, (AS2 (ld,%A0,X+) CR_TAB - AS2 (ld,%B0,X+) CR_TAB -@@ -2453,33 +2611,114 @@ out_movsi_r_mr (rtx insn, rtx op[], int *l) - AS2 (ld,%C0,X+) CR_TAB - AS2 (ld,%D0,X)); - else -- return *l=5, (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)); -+ 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 (reg_dest == reg_base) -- return *l=5, (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) -+ 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__)); -+ } -+ - else if (reg_base == reg_dest + 2) -- return *l=5, (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_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 -- return *l=4, (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) -+ 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)); - } - } -+ } - else if (GET_CODE (base) == PLUS) /* (R + i) */ - { - int disp = INTVAL (XEXP (base, 1)); -@@ -2490,21 +2729,43 @@ out_movsi_r_mr (rtx insn, rtx op[], int *l) - fatal_insn ("incorrect insn:",insn); - - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src))) -- return *l = 6, (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, (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))); -+ 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))); - } - - reg_base = true_regnum (XEXP (base, 0)); -@@ -2515,46 +2776,151 @@ out_movsi_r_mr (rtx insn, rtx op[], int *l) - { - *l = 7; - /* "ld r26,-X" is undefined */ -- 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__)); -+ 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 (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 (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)); -+ 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)); - } - if (reg_dest == reg_base) -- return *l=5, (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__)); -+ { -+ 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) -- return *l=5, (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__)); -- return *l=4, (AS2 (ldd,%A0,%A1) CR_TAB -- AS2 (ldd,%B0,%B1) CR_TAB -- AS2 (ldd,%C0,%C1) CR_TAB -- AS2 (ldd,%D0,%D1)); -+ { -+ op[2] = XEXP(base, 0); -+ -+ 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 (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 (subi,%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 (subi,%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 (subi,%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 -+ 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 -@@ -2602,20 +2968,36 @@ out_movsi_mr_r (rtx insn, rtx op[], int *l) - { - /* "st X+,r26" is undefined */ - if (reg_unused_after (insn, base)) -- return *l=6, (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)); -+ 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, (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)); -+ 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)); - } - else if (reg_base == reg_src + 2) - { -@@ -2628,26 +3010,61 @@ out_movsi_mr_r (rtx insn, rtx op[], int *l) - AS2 (st,%0,__tmp_reg__) CR_TAB - AS1 (clr,__zero_reg__)); - else -- return *l=8, (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=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)); - } -- return *l=5, (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)); -+ 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)); - } - else -- return *l=4, (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) -+ 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)); -+ } - } - else if (GET_CODE (base) == PLUS) /* (R + i) */ - { -@@ -2659,21 +3076,42 @@ out_movsi_mr_r (rtx insn, rtx op[], int *l) - fatal_insn ("incorrect insn:",insn); - - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) -- return *l = 6, (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, (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))); -+ 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 (reg_base == REG_X) - { -@@ -2681,41 +3119,95 @@ out_movsi_mr_r (rtx insn, rtx op[], int *l) - if (reg_src == REG_X) - { - *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 -- 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 (sbiw,r26,%o0+3)); -+ 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 -+ AS2 (mov,__zero_reg__,r27) CR_TAB -+ AS2 (adiw,r26,%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 (sbiw,r26,%o0+3)); - } - else if (reg_src == REG_X - 2) - { - *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 -- 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 (sbiw,r26,%o0+3)); -+ 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 -+ AS2 (mov,__zero_reg__,r27) CR_TAB -+ AS2 (adiw,r26,%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 (sbiw,r26,%o0+3)); - } - *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)); -+ 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)); - } -- return *l=4, (AS2 (std,%A0,%A1) CR_TAB -- AS2 (std,%B0,%B1) CR_TAB -- AS2 (std,%C0,%C1) CR_TAB -- AS2 (std,%D0,%D1)); -+ 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)); - } - else if (GET_CODE (base) == PRE_DEC) /* (--R) */ - return *l=4, (AS2 (st,%0,%D1) CR_TAB -@@ -2929,9 +3421,18 @@ out_movqi_mr_r (rtx insn, rtx op[], int *l) - fatal_insn ("incorrect insn:",insn); - - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) -- return *l = 3, (AS2 (adiw,r28,%o0-63) CR_TAB -- AS2 (std,Y+63,%1) CR_TAB -- AS2 (sbiw,r28,%o0-63)); -+ 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)); - - return *l = 5, (AS2 (subi,r28,lo8(-%o0)) CR_TAB - AS2 (sbci,r29,hi8(-%o0)) CR_TAB -@@ -2944,28 +3445,60 @@ out_movqi_mr_r (rtx insn, rtx op[], int *l) - if (reg_overlap_mentioned_p (src, XEXP (x, 0))) - { - if (reg_unused_after (insn, XEXP (x,0))) -- return *l = 3, (AS2 (mov,__tmp_reg__,%1) CR_TAB -- AS2 (adiw,r26,%o0) CR_TAB -- AS2 (st,X,__tmp_reg__)); -- -- return *l = 4, (AS2 (mov,__tmp_reg__,%1) CR_TAB -- AS2 (adiw,r26,%o0) CR_TAB -- AS2 (st,X,__tmp_reg__) CR_TAB -- AS2 (sbiw,r26,%o0)); -+ 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)); - } - else - { - if (reg_unused_after (insn, XEXP (x,0))) -- return *l = 2, (AS2 (adiw,r26,%o0) CR_TAB -- AS2 (st,X,%1)); -- -- return *l = 3, (AS2 (adiw,r26,%o0) CR_TAB -- AS2 (st,X,%1) CR_TAB -- AS2 (sbiw,r26,%o0)); -+ 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)); - } - } - *l = 1; -- return AS2 (std,%0,%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); - } - *l = 1; - return AS2 (st,%0,%1); -@@ -3014,24 +3547,43 @@ out_movhi_mr_r (rtx insn, rtx op[], int *l) - { - /* "st X+,r26" and "st -X,r26" are undefined. */ - if (!mem_volatile_p && reg_unused_after (insn, src)) -- return *l=4, (AS2 (mov,__tmp_reg__,r27) CR_TAB -- AS2 (st,X,r26) CR_TAB -- AS2 (adiw,r26,1) CR_TAB -- AS2 (st,X,__tmp_reg__)); -+ 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, (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)); -+ 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, (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)); -+ 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)); - } - } - else -@@ -3042,26 +3594,62 @@ out_movhi_mr_r (rtx insn, rtx op[], int *l) - else - { - if (!AVR_XMEGA) -- return *l=3, (AS2 (adiw,r26,1) CR_TAB -- AS2 (st,X,%B1) CR_TAB -- AS2 (st,-X,%A1)); -+ 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, (AS2 (st,X+,%A1) CR_TAB -- AS2 (st,X,%B1) CR_TAB -- AS2 (sbiw,r26,1)); -+ 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)); - } - } - } - else - { - if (!AVR_XMEGA) -- return *l=2, (AS2 (std,%0+1,%B1) CR_TAB -- AS2 (st,%0,%A1)); -+ { -+ 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)); -+ } - else -- return *l=2, (AS2 (st,%0,%A1) CR_TAB -- AS2 (std,%0+1,%B1)); -+ { -+ 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)); - } - } -+ } - else if (GET_CODE (base) == PLUS) - { - int disp = INTVAL (XEXP (base, 1)); -@@ -3074,32 +3662,68 @@ out_movhi_mr_r (rtx insn, rtx op[], int *l) - if (!AVR_XMEGA) - { - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) -- return *l = 4, (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, (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))); -+ 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))); - } - else - { - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) -- return *l = 4, (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, (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))); -+ 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)); -+ -+ 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 (reg_base == REG_X) -@@ -3110,50 +3734,119 @@ out_movhi_mr_r (rtx insn, rtx op[], int *l) - if (!AVR_XMEGA) - { - *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)); -+ 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)); - } - else - { - *l = 7; -- 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 -- AS2 (st,X,__zero_reg__) CR_TAB -- AS1 (clr,__zero_reg__) CR_TAB -- AS2 (sbiw,r26,%o0+1)); -+ 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 -+ 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)); -+ - } - } - if (!AVR_XMEGA) - { - *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)); -+ 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)); - } - 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)); -+ 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 -+ AS2 (st,X+,%A1) CR_TAB -+ AS2 (st,X,%B1) CR_TAB -+ AS2 (sbiw,r26,%o0+1)); - } - } - - if (!AVR_XMEGA) -- return *l=2, (AS2 (std,%B0,%B1) CR_TAB -- AS2 (std,%A0,%A1)); -+ { -+ 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 -+ 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 -+ 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)); -+ } - else -- return *l=2, (AS2 (std,%A0,%A1) CR_TAB -- AS2 (std,%B0,%B1)); -+ { -+ 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)); -+ } - } - else if (GET_CODE (base) == PRE_DEC) /* (--R) */ - { -@@ -3173,17 +3866,32 @@ out_movhi_mr_r (rtx insn, rtx op[], int *l) - if (REGNO (XEXP (base, 0)) == REG_X) - { - *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)); -+ return 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) 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)); - } - else - { -+ //FIXME:check the code once again for AVR_TINY - *l = 3; -- return (AS2 (std,%p0+1,%B1) CR_TAB -- AS2 (st,%p0,%A1) CR_TAB -- AS2 (adiw,%r0,2)); -+ 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 -+ 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)); - } - } - -@@ -3271,7 +3979,9 @@ out_tsthi (rtx insn, int *l) - if (test_hard_reg_class (ADDW_REGS, SET_SRC (PATTERN (insn)))) - { - if (l) *l = 1; -- return AS2 (sbiw,%0,0); -+ return AVR_TINY ? (AS2 (subi,%A0,lo8(0)) CR_TAB -+ AS2 (sbci,%B0,hi8(0))) -+ : AS2 (sbiw,%0,0); - } - if (l) *l = 2; - return (AS2 (cp,%A0,__zero_reg__) CR_TAB -@@ -3292,9 +4002,13 @@ out_tstsi (rtx insn, int *l) - if (test_hard_reg_class (ADDW_REGS, SET_SRC (PATTERN (insn)))) - { - if (l) *l = 3; -- return (AS2 (sbiw,%A0,0) CR_TAB -- AS2 (cpc,%C0,__zero_reg__) CR_TAB -- AS2 (cpc,%D0,__zero_reg__)); -+ return AVR_TINY ? (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__)); - } - if (l) *l = 4; - return (AS2 (cp,%A0,__zero_reg__) CR_TAB -@@ -5560,10 +6274,12 @@ avr_file_start (void) - /* fprintf (asm_out_file, "\t.arch %s\n", avr_mcu_name);*/ - fputs ("__SREG__ = 0x3f\n" - "__SP_H__ = 0x3e\n" -- "__SP_L__ = 0x3d\n" -- "__CCP__ = 0x34\n", asm_out_file); -+ "__SP_L__ = 0x3d\n", asm_out_file); -+ -+ AVR_TINY ? fputs ("__CCP__ = 0x3c\n", asm_out_file) : fputs ("__CCP__ = 0x34\n", asm_out_file); - -- fputs ("__tmp_reg__ = 0\n" -+ AVR_TINY ? fputs ("__tmp_reg__ = 16\n" -+ "__zero_reg__ = 17\n", asm_out_file) : fputs ("__tmp_reg__ = 0\n" - "__zero_reg__ = 1\n", asm_out_file); - } - -diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h -index b0d5d60..c947c39 100644 ---- a/gcc/config/avr/avr.h -+++ b/gcc/config/avr/avr.h -@@ -50,6 +50,9 @@ struct base_arch_s { - /* Core have RAMPX, RAMPY and RAMPD registers. */ - int have_rampx_y_d; - -+ /* Core is in tiny 10/20/9/4/5/40. */ -+ int avrtiny; -+ - const char *const macro; - }; - -@@ -102,6 +105,10 @@ extern const struct base_arch_s *avr_current_arch; - builtin_define ("__AVR_XMEGA__"); \ - builtin_define ("__AVR_HAVE_SPMX__"); \ - } \ -+ if (avr_current_arch->avrtiny) \ -+ { \ -+ builtin_define ("__AVR_TINY__"); \ -+ } \ - if (avr_current_arch->have_rampx_y_d) \ - { \ - builtin_define ("__AVR_HAVE_RAMPX__");\ -@@ -124,12 +131,13 @@ extern GTY(()) section *progmem_section; - #define AVR_HAVE_RAMPZ (avr_current_arch->have_elpm) - #define AVR_HAVE_EIJMP_EICALL (avr_current_arch->have_eijmp_eicall) - #define AVR_XMEGA (avr_current_arch->xmega) -+#define AVR_TINY (avr_current_arch->avrtiny) - #define AVR_HAVE_RAMPX_Y_D (avr_current_arch->have_rampx_y_d) - - #define AVR_2_BYTE_PC (!AVR_HAVE_EIJMP_EICALL) - #define AVR_3_BYTE_PC (AVR_HAVE_EIJMP_EICALL) - --#define AVR_IO_OFFSET (AVR_XMEGA ? 0 : 0x20) -+#define AVR_IO_OFFSET ((AVR_XMEGA || AVR_TINY) ? 0 : 0x20) - #define AVR_RAMPD_ADDR (AVR_XMEGA ? 0x38 : 0) - #define AVR_RAMPX_ADDR (AVR_XMEGA ? 0x39 : 0) - #define AVR_RAMPY_ADDR (AVR_XMEGA ? 0x3A : 0) -@@ -248,7 +256,6 @@ extern GTY(()) section *progmem_section; - - #define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc () - -- - #define HARD_REGNO_NREGS(REGNO, MODE) ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) - - #define HARD_REGNO_MODE_OK(REGNO, MODE) avr_hard_regno_mode_ok(REGNO, MODE) -@@ -312,6 +319,41 @@ enum reg_class { - {0xffffffff,0x00000003} /* ALL_REGS */ \ - } - -+/* Zero or more C statements that may conditionally modify five variables -+ fixed_regs, call_used_regs, global_regs, reg_names, and reg_class_contents, -+ to take into account any dependence of these register sets on target flags. -+ The first three of these are of type char [] (interpreted as Boolean -+ vectors). global_regs is a const char *[], and reg_class_contents is a -+ HARD_REG_SET. Before the macro is called, fixed_regs, call_used_regs, -+ reg_class_contents, and reg_names have been initialized from -+ FIXED_REGISTERS, CALL_USED_REGISTERS, REG_CLASS_CONTENTS, and -+ REGISTER_NAMES, respectively. global_regs has been cleared, and any -+ ‘-ffixed-reg’, ‘-fcall-used-reg’ and ‘-fcall-saved-reg’ command options -+ have been applied. -+ -+ You need not define this macro if it has no work to do. -+ -+ If the usage of an entire class of registers depends on the target flags, -+ you may indicate this to GCC by using this macro to modify fixed_regs and -+ call_used_regs to 1 for each of the registers in the classes which should -+ not be used by GCC. Also define the macro REG_CLASS_FROM_LETTER / -+ REG_CLASS_FROM_CONSTRAINT to return NO_REGS if it is called with a letter -+ for a class that shouldn’t be used. (However, if this class is not included -+ in GENERAL_REGS and all of the insn patterns whose constraints permit this -+ class are controlled by target switches, then GCC will automatically avoid -+ using these registers when the target switches are opposed to them.) */ -+ -+#define CONDITIONAL_REGISTER_USAGE \ -+ 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]); \ -+ } -+ - #define REGNO_REG_CLASS(R) avr_regno_reg_class(R) - - /* The following macro defines cover classes for Integrated Register -@@ -1232,7 +1274,14 @@ mmcu=*:-mmcu=%*}" - %{mmcu=atxmega256a3b:crtx256a3b.o%s} \ - %{mmcu=atxmega256d3:crtx256d3.o%s} \ - %{mmcu=atxmega7|mmcu=atxmega128a1:crtx128a1.o%s} \ --%{mmcu=atxmega128a1u:crtx128a1u.o%s}" -+%{mmcu=atxmega128a1u:crtx128a1u.o%s} \ -+%{mmcu=attiny4:crttn4.o%s} \ -+%{mmcu=attiny5:crttn5.o%s} \ -+%{mmcu=attiny9:crttn9.o%s} \ -+%{mmcu=avrtiny10|mmcu=attiny10:crttn10.o%s} \ -+%{mmcu=attiny20:crttn20.o%s} \ -+%{mmcu=attiny40:crttn40.o%s}" -+ - - #define EXTRA_SPECS {"crt_binutils", CRT_BINUTILS_SPECS}, - -diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md -index f91e98c..96ef48e 100644 ---- a/gcc/config/avr/avr.md -+++ b/gcc/config/avr/avr.md -@@ -181,6 +181,9 @@ - DONE; - }) - -+(define_constants -+ [(TMP_REGNO_AVRTINY10 16) ; temporary register r16 -+ (ZERO_REGNO_AVRTINY10 17)]) ; zero register r17 - - (define_insn "*push<ALLQ:mode>" - [(set (mem:ALLQ (post_dec (reg:HI REG_SP))) -@@ -474,7 +477,7 @@ - rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); - - /* Create rtx for tmp register - we use this as scratch. */ -- rtx tmp_reg_rtx = gen_rtx_REG (QImode, TMP_REGNO); -+ rtx tmp_reg_rtx = gen_rtx_REG (QImode, AVR_TINY ? TMP_REGNO_AVRTINY10 : TMP_REGNO); - - if (GET_CODE (operands[2]) != CONST_INT) - FAIL; -@@ -2955,7 +2958,7 @@ - UNSPEC_INDEX_JMP)) - (use (label_ref (match_operand 1 "" ""))) - (clobber (match_dup 0))] -- "AVR_HAVE_JMP_CALL && !AVR_HAVE_EIJMP_EICALL" -+ "(AVR_HAVE_JMP_CALL && !AVR_HAVE_EIJMP_EICALL)" - "lsl r30 - rol r31 - lpm -diff --git a/gcc/config/avr/libgcc-fixed.S b/gcc/config/avr/libgcc-fixed.S -index a694ee6..73d0ad1 100644 ---- a/gcc/config/avr/libgcc-fixed.S -+++ b/gcc/config/avr/libgcc-fixed.S -@@ -29,13 +29,17 @@ Boston, MA 02110-1301, USA. */ - - /* Fixed point library routines for avr. */ - -+#if defined (__AVR_TINY__) -+#define __zero_reg__ r17 -+#define __tmp_reg__ r16 -+#else - #define __zero_reg__ r1 - #define __tmp_reg__ r0 -+#endif - #define __SREG__ 0x3f - #define __SP_H__ 0x3e - #define __SP_L__ 0x3d - #define __RAMPZ__ 0x3B -- - /* Conversions to float. */ - #if defined (L_fractqqsf) - .global __fractqqsf -@@ -281,15 +285,15 @@ __muluqq3_exit: - .func __mulhq3 - __mulhq3: - fmuls r_arg1H, r_arg2H -- movw r_resL, r0 -+ movw r_resL, __tmp_reg__ - fmulsu r_arg2H, r_arg1L - clr r_arg1L - sbc r_resH, r_arg1L -- add r_resL, r1 -+ add r_resL, __zero_reg__ - adc r_resH, r_arg1L - fmulsu r_arg1H, r_arg2L - sbc r_resH, r_arg1L -- add r_resL, r1 -+ add r_resL, __zero_reg__ - adc r_resH, r_arg1L - clr __zero_reg__ - ret -@@ -301,13 +305,13 @@ __mulhq3: - .func __muluhq3 - __muluhq3: - mul r_arg1H, r_arg2H -- movw r_resL, r0 -+ movw r_resL, __tmp_reg__ - mul r_arg1H, r_arg2L -- add r_resL, r1 -+ add r_resL, __zero_reg__ - clr __zero_reg__ - adc r_resH, __zero_reg__ - mul r_arg1L, r_arg2H -- add r_resL, r1 -+ add r_resL, __zero_reg__ - clr __zero_reg__ - adc r_resH, __zero_reg__ - ret -@@ -401,15 +405,15 @@ __muluhq3_skip: - .func __mulha3 - __mulha3: - mul r_arg1L, r_arg2L -- mov r_resL, r1 -+ mov r_resL, __zero_reg__ - muls r_arg1H, r_arg2H -- mov r_resH, r0 -+ mov r_resH, __tmp_reg__ - mulsu r_arg1H, r_arg2L -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - mulsu r_arg2H, r_arg1L -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - clr __zero_reg__ - ret - .endfunc -@@ -420,15 +424,15 @@ __mulha3: - .func __muluha3 - __muluha3: - mul r_arg1L, r_arg2L -- mov r_resL, r1 -+ mov r_resL, __zero_reg__ - mul r_arg1H, r_arg2H -- mov r_resH, r0 -+ mov r_resH, __tmp_reg__ - mul r_arg1H, r_arg2L -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - mul r_arg1L, r_arg2H -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - clr __zero_reg__ - ret - .endfunc -@@ -442,8 +446,8 @@ __muluha3: - #define r_arg2H r23 /* multiplicand High */ - #define r_resL r18 /* result Low */ - #define r_resH r19 /* result High */ --#define r_scratchL r0 /* scratch Low */ --#define r_scratchH r1 -+#define r_scratchL __tmp_reg__ /* scratch Low */ -+#define r_scratchH __zero_reg__ - - #if defined (L_mulha3) - .global __mulha3 -@@ -480,8 +484,8 @@ __mulha3_exit: - __muluha3: - clr r_resL ; clear result - clr r_resH -- mov_l r0, r_arg1L ; save multiplicand -- mov_h r1, r_arg1H -+ mov_l __tmp_reg__, r_arg1L ; save multiplicand -+ mov_h __zero_reg__, r_arg1H - __muluha3_loop1: - sbrs r_arg2H,0 - rjmp __muluha3_skip1 -@@ -490,7 +494,12 @@ __muluha3_loop1: - __muluha3_skip1: - lsl r_arg1L ; shift multiplicand - rol r_arg1H -+#if defined (__AVR_TINY__) -+ subi r_arg1L, lo8(0) -+ sbci r_arg1L, hi8(0) -+#else - sbiw r_arg1L,0 -+#endif - breq __muluha3_loop1_done ; exit multiplicand = 0 - lsr r_arg2H - brne __muluha3_loop1 ; exit multiplier = 0 -@@ -500,7 +509,12 @@ __muluha3_loop1_done: - __muluha3_loop2: - lsr r_arg1H ; shift multiplicand - ror r_arg1L -+#if defined (__AVR_TINY__) -+ subi r_arg1L, lo8(0) -+ sbci r_arg1L, hi8(0) -+#else - sbiw r_arg1L,0 -+#endif - breq __muluha3_exit ; exit if multiplicand = 0 - sbrs r_arg2L,7 - rjmp __muluha3_skip2 -@@ -556,53 +570,53 @@ __mulsa3: - clr r_resHL - clr r_resHH - mul r_arg1H, r_arg2L -- mov r_resL, r1 -+ mov r_resL, __zero_reg__ - mul r_arg1L, r_arg2H -- add r_resL, r1 -+ add r_resL, __zero_reg__ - adc r_resH, r_clr - mul r_arg1L, r_arg2HL -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - adc r_resHL, r_clr - mul r_arg1H, r_arg2H -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - adc r_resHL, r_clr - mul r_arg1HL, r_arg2L -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - adc r_resHL, r_clr - mulsu r_arg2HH, r_arg1L - sbc r_resHH, r_clr -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mul r_arg1H, r_arg2HL -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mul r_arg1HL, r_arg2H -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mulsu r_arg1HH, r_arg2L - sbc r_resHH, r_clr -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mulsu r_arg2HH, r_arg1H -- add r_resHL, r0 -- adc r_resHH, r1 -+ add r_resHL, __tmp_reg__ -+ adc r_resHH, __zero_reg__ - mul r_arg1HL, r_arg2HL -- add r_resHL, r0 -- adc r_resHH, r1 -+ add r_resHL, __tmp_reg__ -+ adc r_resHH, __zero_reg__ - mulsu r_arg1HH, r_arg2H -- add r_resHL, r0 -- adc r_resHH, r1 -+ add r_resHL, __tmp_reg__ -+ adc r_resHH, __zero_reg__ - mulsu r_arg2HH, r_arg1HL -- add r_resHH, r0 -+ add r_resHH, __tmp_reg__ - mulsu r_arg1HH, r_arg2HL -- add r_resHH, r0 -+ add r_resHH, __tmp_reg__ - clr __zero_reg__ - ret - .endfunc -@@ -617,51 +631,51 @@ __mulusa3: - clr r_resHL - clr r_resHH - mul r_arg1H, r_arg2L -- mov r_resL, r1 -+ mov r_resL, __zero_reg__ - mul r_arg1L, r_arg2H -- add r_resL, r1 -+ add r_resL, __zero_reg__ - adc r_resH, r_clr - mul r_arg1L, r_arg2HL -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - adc r_resHL, r_clr - mul r_arg1H, r_arg2H -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - adc r_resHL, r_clr - mul r_arg1HL, r_arg2L -- add r_resL, r0 -- adc r_resH, r1 -+ add r_resL, __tmp_reg__ -+ adc r_resH, __zero_reg__ - adc r_resHL, r_clr - mul r_arg1L, r_arg2HH -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mul r_arg1H, r_arg2HL -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mul r_arg1HL, r_arg2H -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mul r_arg1HH, r_arg2L -- add r_resH, r0 -- adc r_resHL, r1 -+ add r_resH, __tmp_reg__ -+ adc r_resHL, __zero_reg__ - adc r_resHH, r_clr - mul r_arg1H, r_arg2HH -- add r_resHL, r0 -- adc r_resHH, r1 -+ add r_resHL, __tmp_reg__ -+ adc r_resHH, __zero_reg__ - mul r_arg1HL, r_arg2HL -- add r_resHL, r0 -- adc r_resHH, r1 -+ add r_resHL, __tmp_reg__ -+ adc r_resHH, __zero_reg__ - mul r_arg1HH, r_arg2H -- add r_resHL, r0 -- adc r_resHH, r1 -+ add r_resHL, __tmp_reg__ -+ adc r_resHH, __zero_reg__ - mul r_arg1HL, r_arg2HH -- add r_resHH, r0 -+ add r_resHH, __tmp_reg__ - mul r_arg1HH, r_arg2HL -- add r_resHH, r0 -+ add r_resHH, __tmp_reg__ - clr __zero_reg__ - ret - .endfunc -@@ -680,13 +694,20 @@ __mulusa3: - #define r_arg2HL r26 - #define r_arg2HH r27 /* multiplicand High */ - -+#if defined (__AVR_TINY__) -+#define r_resL r28 /* result Low */ -+#define r_resH r29 -+#define r_resHL r30 -+#define r_resHH r31 /* result High */ -+#else - #define r_resL r14 /* result Low */ - #define r_resH r15 - #define r_resHL r16 - #define r_resHH r17 /* result High */ -+#endif - --#define r_scratchL r0 /* scratch Low */ --#define r_scratchH r1 -+#define r_scratchL __tmp_reg__ /* scratch Low */ -+#define r_scratchH __zero_reg__ - #define r_scratchHL r22 - #define r_scratchHH r23 /* scratch High */ - -@@ -758,7 +779,12 @@ __mulusa3_skip1: - rol r_arg1HH - lsr r_arg2HH - ror r_arg2HL -+#if defined (__AVR_TINY__) -+ subi r_arg2HL, lo8(0) -+ sbci r_arg2HL, hi8(0) -+#else - sbiw r_arg2HL,0 -+#endif - brne __mulusa3_loop1 ; exit multiplier = 0 - __mulusa3_loop1_done: - mov_l r_arg1L, r_scratchL ; restore multiplicand -@@ -779,7 +805,12 @@ __mulusa3_loop2: - __mulusa3_skip2: - lsl r_arg2L - rol r_arg2H -+#if defined (__AVR_TINY__) -+ subi r_arg2L, lo8(0) -+ sbci r_arg2L, hi8(0) -+#else - sbiw r_arg2L,0 -+#endif - brne __mulusa3_loop2 ; exit if multiplier = 0 - __mulusa3_exit: - clr __zero_reg__ ; got clobbered -@@ -791,9 +822,7 @@ __mulusa3_exit: - #undef r_scratchH - #undef r_scratchHL - #undef r_scratchHH -- - #endif -- - #undef r_arg1L - #undef r_arg1H - #undef r_arg1HL -@@ -821,8 +850,8 @@ __mulusa3_exit: - .global __divqq3 - .func __divqq3 - __divqq3: -- mov r0, r_divd -- eor r0, r_div -+ mov __tmp_reg__, r_divd -+ eor __tmp_reg__, r_div - sbrc r_div, 7 - neg r_div - sbrc r_divd, 7 -@@ -831,7 +860,7 @@ __divqq3: - breq __divqq3_minus1 ; if equal return -1 - rcall __udivuqq3 - lsr r_quo -- sbrc r0, 7 ; negate result if needed -+ sbrc __tmp_reg__, 7 ; negate result if needed - neg r_quo - ret - __divqq3_minus1: -@@ -886,8 +915,8 @@ __udivuqq3_cont: - .global __divhq3 - .func __divhq3 - __divhq3: -- mov r0, r_divdH -- eor r0, r_divH -+ mov __tmp_reg__, r_divdH -+ eor __tmp_reg__, r_divH - sbrs r_divH, 7 - rjmp __divhq3_divpos - com r_divH -@@ -906,7 +935,7 @@ __divhq3_divdpos: - rcall __udivuhq3 - lsr r_quoH - ror r_quoL -- sbrs r0, 7 ; negate result if needed -+ sbrs __tmp_reg__, 7 ; negate result if needed - ret - com r_quoH - neg r_quoL -@@ -958,8 +987,8 @@ __udivuhq3_cont: - .global __divha3 - .func __divha3 - __divha3: -- mov r0, r_divdH -- eor r0, r_divH -+ mov __tmp_reg__, r_divdH -+ eor __tmp_reg__, r_divH - sbrs r_divH, 7 - rjmp __divha3_divpos - com r_divH -@@ -973,7 +1002,7 @@ __divha3_divpos: - sbci r_divdH,-1 - __divha3_divdpos: - rcall __udivuha3 -- sbrs r0, 7 ; negate result if needed -+ sbrs __tmp_reg__, 7 ; negate result if needed - ret - com r_quoH - neg r_quoL -@@ -1027,8 +1056,8 @@ __udivuha3: - .global __divsa3 - .func __divsa3 - __divsa3: -- mov r0, r27 -- eor r0, r_divHH -+ mov __tmp_reg__, r27 -+ eor __tmp_reg__, r_divHH - sbrs r_divHH, 7 - rjmp __divsa3_divpos - com r_divHH -@@ -1050,7 +1079,7 @@ __divsa3_divpos: - sbci r_arg1HH,-1 - __divsa3_arg1pos: - rcall __udivusa3 -- sbrs r0, 7 ; negate result if needed -+ sbrs __tmp_reg__, 7 ; negate result if needed - ret - com r_quoHH - com r_quoHL -diff --git a/gcc/config/avr/libgcc.S b/gcc/config/avr/libgcc.S -index 5a711a8..eda75a1 100644 ---- a/gcc/config/avr/libgcc.S -+++ b/gcc/config/avr/libgcc.S -@@ -22,8 +22,13 @@ a copy of the GCC Runtime Library Exception along with this program; - see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - -+#if defined (__AVR_TINY__) -+#define __zero_reg__ r17 -+#define __tmp_reg__ r16 -+#else - #define __zero_reg__ r1 - #define __tmp_reg__ r0 -+#endif - #define __SREG__ 0x3f - #define __SP_H__ 0x3e - #define __SP_L__ 0x3d -@@ -140,7 +145,12 @@ __mulhi3_skip1: - - lsr r_arg1H ; gets LSB of multiplier - ror r_arg1L -+#if defined (__AVR_TINY__) -+ subi r_arg1L, lo8(0) -+ sbci r_arg1L, hi8(0) -+#else - sbiw r_arg1L,0 -+#endif - brne __mulhi3_loop ; exit if multiplier = 0 - __mulhi3_exit: - mov r_arg1H,r_resH ; result to return register -@@ -304,7 +314,12 @@ __mulsi3_skip1: - ror r_arg1H - ror r_arg1L - brne __mulsi3_loop -+#if defined (__AVR_TINY__) -+ subi r_arg1HL, lo8(0) -+ sbci r_arg1HL, hi8(0) -+#else - sbiw r_arg1HL,0 -+#endif - cpc r_arg1H,r_arg1L - brne __mulsi3_loop ; exit if multiplier = 0 - __mulsi3_exit: -@@ -610,6 +625,7 @@ __divmodsi4_neg1: - /********************************** - * This is a prologue subroutine - **********************************/ -+#if !defined (__AVR_TINY__) - #if defined (L_prologue) - - .global __prologue_saves__ -@@ -663,7 +679,6 @@ __prologue_saves__: - * This is an epilogue subroutine - */ - #if defined (L_epilogue) -- - .global __epilogue_restores__ - .func __epilogue_restores__ - __epilogue_restores__: -@@ -704,6 +719,7 @@ __epilogue_restores__: - ret - .endfunc - #endif /* defined (L_epilogue) */ -+#endif /* !defined (__AVR_TINY__) */ - - #ifdef L_exit - .section .fini9,"ax",@progbits -@@ -730,6 +746,7 @@ _cleanup: - .endfunc - #endif /* defined (L_cleanup) */ - -+#if !defined(__AVR_TINY__) - #ifdef L_tablejump - .global __tablejump2__ - .func __tablejump2__ -@@ -762,7 +779,9 @@ __tablejump__: - #endif - .endfunc - #endif /* defined (L_tablejump) */ -+#endif - -+#if !defined(__AVR_TINY__) - #ifdef L_copy_data - .section .init4,"ax",@progbits - .global __do_copy_data -@@ -824,6 +843,7 @@ __do_copy_data: - brne .L__do_copy_data_loop - #endif /* !defined(__AVR_HAVE_ELPMX__) && !defined(__AVR_HAVE_ELPM__) */ - #endif /* L_copy_data */ -+#endif - - /* __do_clear_bss is only necessary if there is anything in .bss section. */ - -@@ -864,7 +884,12 @@ __do_global_ctors: - ldi r20, hh8(__ctors_end) - rjmp .L__do_global_ctors_start - .L__do_global_ctors_loop: -+#if defined (__AVR_TINY__) -+ subi r28, lo8(2) -+ sbci r29, hi8(2) -+#else - sbiw r28, 2 -+#endif - sbc r20, __zero_reg__ - mov_h r31, r29 - mov_l r30, r28 -@@ -882,7 +907,12 @@ __do_global_ctors: - ldi r29, hi8(__ctors_end) - rjmp .L__do_global_ctors_start - .L__do_global_ctors_loop: -+#if defined (__AVR_TINY__) -+ subi r28, lo8(2) -+ sbci r29, hi8(2) -+#else - sbiw r28, 2 -+#endif - mov_h r31, r29 - mov_l r30, r28 - XCALL __tablejump__ -@@ -905,7 +935,12 @@ __do_global_dtors: - ldi r20, hh8(__dtors_start) - rjmp .L__do_global_dtors_start - .L__do_global_dtors_loop: -+#if defined (__AVR_TINY__) -+ subi r28, lo8(2) -+ sbci r29, hi8(2) -+#else - sbiw r28, 2 -+#endif - sbc r20, __zero_reg__ - mov_h r31, r29 - mov_l r30, r28 -@@ -926,7 +961,12 @@ __do_global_dtors: - mov_h r31, r29 - mov_l r30, r28 - XCALL __tablejump__ -+#if defined (__AVR_TINY__) -+ subi r28, lo8(-2) -+ sbci r29, hi8(-2) -+#else - adiw r28, 2 -+#endif - .L__do_global_dtors_start: - cpi r28, lo8(__dtors_end) - cpc r29, r17 -@@ -934,6 +974,7 @@ __do_global_dtors: - #endif /* defined(__AVR_HAVE_RAMPZ__) */ - #endif /* L_dtors */ - -+#if !defined (__AVR_TINY__) - #ifdef L_tablejump_elpm - .global __tablejump_elpm__ - .func __tablejump_elpm__ -@@ -963,5 +1004,6 @@ __tablejump_elpm__: - #endif /* defined (__AVR_HAVE_ELPM__) */ - .endfunc - #endif /* defined (L_tablejump_elpm) */ -+#endif /* !defined (__AVR_TINY__) */ - - #include "libgcc-fixed.S" -diff --git a/gcc/config/avr/predicates.md b/gcc/config/avr/predicates.md -index aca33d7..3ff85fd 100755 ---- a/gcc/config/avr/predicates.md -+++ b/gcc/config/avr/predicates.md -@@ -45,21 +45,24 @@ - ;; Return true if OP is a valid address for lower half of I/O space. - (define_predicate "low_io_address_operand" - (and (match_code "const_int") -- (if_then_else (match_test "AVR_XMEGA") -+ (if_then_else (ior (match_test "AVR_XMEGA") -+ (match_test "AVR_TINY")) - (match_test "IN_RANGE((INTVAL (op)), 0x00, 0x1F)") - (match_test "IN_RANGE((INTVAL (op)), 0x20, 0x3F)")))) - - ;; Return true if OP is a valid address for high half of I/O space. - (define_predicate "high_io_address_operand" - (and (match_code "const_int") -- (if_then_else (match_test "AVR_XMEGA") -+ (if_then_else (ior (match_test "AVR_XMEGA") -+ (match_test "AVR_TINY")) - (match_test "IN_RANGE((INTVAL (op)), 0x20, 0x3F)") - (match_test "IN_RANGE((INTVAL (op)), 0x40, 0x5F)")))) - - ;; Return true if OP is a valid address of I/O space. - (define_predicate "io_address_operand" - (and (match_code "const_int") -- (if_then_else (match_test "AVR_XMEGA") -+ (if_then_else (ior (match_test "AVR_XMEGA") -+ (match_test "AVR_TINY")) - (match_test "IN_RANGE((INTVAL (op)), 0x0, (0x40 - GET_MODE_SIZE(mode)))") - (match_test "IN_RANGE((INTVAL (op)), 0x20, (0x60 - GET_MODE_SIZE(mode)))")))) - -diff --git a/gcc/config/avr/t-avr b/gcc/config/avr/t-avr -index b068d3c..644195b 100644 ---- a/gcc/config/avr/t-avr -+++ b/gcc/config/avr/t-avr -@@ -73,8 +73,8 @@ fp-bit.c: $(srcdir)/config/fp-bit.c $(srcdir)/config/avr/t-avr - - 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 --MULTILIB_DIRNAMES = avr2 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 -+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 - - # The many avr2 matches are not listed here - this is the default. - MULTILIB_MATCHES = \ -@@ -244,7 +244,13 @@ MULTILIB_MATCHES = \ - mmcu?avrxmega6=mmcu?atxmega256a3b \ - mmcu?avrxmega6=mmcu?atxmega256d3 \ - mmcu?avrxmega7=mmcu?atxmega128a1 \ -- mmcu?avrxmega7=mmcu?atxmega128a1u -+ mmcu?avrxmega7=mmcu?atxmega128a1u \ -+ mmcu?avrtiny10=mmcu?attiny4 \ -+ mmcu?avrtiny10=mmcu?attiny5 \ -+ mmcu?avrtiny10=mmcu?attiny9 \ -+ mmcu?avrtiny10=mmcu?attiny10 \ -+ mmcu?avrtiny10=mmcu?attiny20 \ -+ mmcu?avrtiny10=mmcu?attiny40 - - MULTILIB_EXCEPTIONS = - --- -1.6.0.4 - |