diff options
Diffstat (limited to 'devel/avr-gcc/files/patch-302-gcc-4.5.1-avrtiny10')
-rw-r--r-- | devel/avr-gcc/files/patch-302-gcc-4.5.1-avrtiny10 | 2132 |
1 files changed, 0 insertions, 2132 deletions
diff --git a/devel/avr-gcc/files/patch-302-gcc-4.5.1-avrtiny10 b/devel/avr-gcc/files/patch-302-gcc-4.5.1-avrtiny10 deleted file mode 100644 index 427a73552c9f..000000000000 --- a/devel/avr-gcc/files/patch-302-gcc-4.5.1-avrtiny10 +++ /dev/null @@ -1,2132 +0,0 @@ -diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c ---- gcc/config/avr/avr.c 2011-01-19 13:03:59.000000000 -0600 -+++ gcc/config/avr/avr.c 2011-01-19 13:11:23.000000000 -0600 -@@ -232,8 +232,8 @@ avr_override_options (void) - avr_current_arch = &avr_arch_types[avr_current_device->arch]; - avr_extra_arch_macro = avr_current_device->macro; - -- 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; - } -@@ -1641,7 +1641,7 @@ avr_simplify_comparison_p (enum machine_ - 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 -@@ -1651,7 +1651,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) - { -@@ -1675,9 +1679,8 @@ avr_num_arg_regs (enum machine_mode mode - 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; - } - -@@ -2009,10 +2012,20 @@ 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, (AS2 (adiw,r28,%o1-63) CR_TAB -+ 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 - AS2 (ld,%0,Y) CR_TAB -@@ -2025,15 +2038,38 @@ 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, (AS2 (adiw,r26,%o1) CR_TAB -+ 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, (AS2 (adiw,r26,%o1) CR_TAB -+ 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); -@@ -2073,14 +2109,34 @@ out_movhi_r_mr (rtx insn, rtx op[], int - AS2 (ld,%B0,X)); - } - *l = 3; -- return (AS2 (ld,%A0,X+) CR_TAB -+ 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 -+ 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)); - } - } -@@ -2095,12 +2151,30 @@ 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, (AS2 (adiw,r28,%o1-62) CR_TAB -+ 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, (AS2 (subi,r28,lo8(-%o1)) CR_TAB -+ 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 -@@ -2115,12 +2189,23 @@ out_movhi_r_mr (rtx insn, rtx op[], int - - *l = 4; - if (reg_base == reg_dest) -- return (AS2 (adiw,r26,%o1) CR_TAB -+ 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 (AS2 (adiw,r26,%o1) CR_TAB -+ 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)); -@@ -2129,14 +2214,54 @@ out_movhi_r_mr (rtx insn, rtx op[], int - if (reg_base == reg_dest) - { - *l = 3; -- return (AS2 (ldd,__tmp_reg__,%A1) CR_TAB -+ 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 -+ -+ 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) */ - { -@@ -2148,7 +2273,13 @@ out_movhi_r_mr (rtx insn, rtx op[], int - if (REGNO (XEXP (base, 0)) == REG_X) - { - *l = 4; -- return (AS2 (sbiw,r26,2) CR_TAB -+ 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)); -@@ -2156,7 +2287,16 @@ out_movhi_r_mr (rtx insn, rtx op[], int - else - { - *l = 3; -- return (AS2 (sbiw,%r1,2) CR_TAB -+ //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)); - } -@@ -2212,13 +2352,23 @@ out_movsi_r_mr (rtx insn, rtx op[], int - { - if (reg_dest == REG_X) - /* "ld r26,-X" is undefined */ -- return *l=7, (AS2 (adiw,r26,3) CR_TAB -+ 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 -@@ -2231,7 +2381,13 @@ out_movsi_r_mr (rtx insn, rtx op[], int - AS2 (ld,%C0,X+) CR_TAB - AS2 (ld,%D0,X)); - else -- return *l=5, (AS2 (ld,%A0,X+) CR_TAB -+ 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 -@@ -2240,22 +2396,97 @@ out_movsi_r_mr (rtx insn, rtx op[], int - else - { - if (reg_dest == reg_base) -- return *l=5, (AS2 (ldd,%D0,%1+3) CR_TAB -+ { -+ 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 -+ { -+ 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 -+ { -+ 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) */ -@@ -2268,14 +2499,36 @@ out_movsi_r_mr (rtx insn, rtx op[], int - fatal_insn ("incorrect insn:",insn); - - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src))) -- return *l = 6, (AS2 (adiw,r28,%o1-60) CR_TAB -+ 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, (AS2 (subi,r28,lo8(-%o1)) CR_TAB -+ 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 -@@ -2293,7 +2546,16 @@ out_movsi_r_mr (rtx insn, rtx op[], int - { - *l = 7; - /* "ld r26,-X" is undefined */ -- return (AS2 (adiw,r26,%o1+3) CR_TAB -+ 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 -@@ -2303,14 +2565,29 @@ out_movsi_r_mr (rtx insn, rtx op[], int - } - *l = 6; - if (reg_dest == REG_X - 2) -- return (AS2 (adiw,r26,%o1) CR_TAB -+ 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 (AS2 (adiw,r26,%o1) CR_TAB -+ 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 -@@ -2318,18 +2595,99 @@ out_movsi_r_mr (rtx insn, rtx op[], int - AS2 (sbiw,r26,%o1+3)); - } - if (reg_dest == reg_base) -- return *l=5, (AS2 (ldd,%D0,%D1) CR_TAB -+ { -+ 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 -+ { -+ 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__)); -- 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 (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)); -@@ -2380,14 +2738,30 @@ out_movsi_mr_r (rtx insn, rtx op[], int - { - /* "st X+,r26" is undefined */ - if (reg_unused_after (insn, base)) -- return *l=6, (AS2 (mov,__tmp_reg__,r27) CR_TAB -+ 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 -+ 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 -@@ -2406,7 +2780,16 @@ out_movsi_mr_r (rtx insn, rtx op[], int - AS2 (st,%0,__tmp_reg__) CR_TAB - AS1 (clr,__zero_reg__)); - else -- return *l=8, (AS2 (mov,__zero_reg__,%C1) CR_TAB -+ 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 -@@ -2415,18 +2798,44 @@ out_movsi_mr_r (rtx insn, rtx op[], int - AS1 (clr,__zero_reg__) CR_TAB - AS2 (sbiw,r26,3)); - } -- return *l=5, (AS2 (st,%0+,%A1) CR_TAB -+ 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 -+ { -+ 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) */ - { - int disp = INTVAL (XEXP (base, 1)); -@@ -2437,14 +2846,35 @@ out_movsi_mr_r (rtx insn, rtx op[], int - fatal_insn ("incorrect insn:",insn); - - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) -- return *l = 6, (AS2 (adiw,r28,%o0-60) CR_TAB -+ 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, (AS2 (subi,r28,lo8(-%o0)) CR_TAB -+ 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 -@@ -2459,7 +2889,18 @@ out_movsi_mr_r (rtx insn, rtx op[], int - if (reg_src == REG_X) - { - *l = 9; -- return (AS2 (mov,__tmp_reg__,r26) CR_TAB -+ 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 -@@ -2472,7 +2913,18 @@ out_movsi_mr_r (rtx insn, rtx op[], int - else if (reg_src == REG_X - 2) - { - *l = 9; -- return (AS2 (mov,__tmp_reg__,r26) CR_TAB -+ 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 -@@ -2483,14 +2935,46 @@ out_movsi_mr_r (rtx insn, rtx op[], int - AS2 (sbiw,r26,%o0+3)); - } - *l = 6; -- return (AS2 (adiw,r26,%o0) CR_TAB -+ 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 -+ 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)); -@@ -2707,7 +3191,16 @@ 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, (AS2 (adiw,r28,%o0-63) CR_TAB -+ 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)); - -@@ -2722,11 +3215,21 @@ 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, (AS2 (mov,__tmp_reg__,%1) CR_TAB -+ 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, (AS2 (mov,__tmp_reg__,%1) CR_TAB -+ 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)); -@@ -2734,16 +3237,38 @@ out_movqi_mr_r (rtx insn, rtx op[], int - else - { - if (reg_unused_after (insn, XEXP (x,0))) -- return *l = 2, (AS2 (adiw,r26,%o0) CR_TAB -+ 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, (AS2 (adiw,r26,%o0) CR_TAB -+ 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); -@@ -2792,20 +3317,39 @@ out_movhi_mr_r (rtx insn, rtx op[], int - { - /* "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 -+ 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 -+ 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 -+ 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 -@@ -2820,11 +3364,19 @@ out_movhi_mr_r (rtx insn, rtx op[], int - else - { - if (!AVR_XMEGA) -- return *l=3, (AS2 (adiw,r26,1) CR_TAB -+ 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 -+ 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)); - } -@@ -2833,13 +3385,41 @@ out_movhi_mr_r (rtx insn, rtx op[], int - else - { - if (!AVR_XMEGA) -- return *l=2, (AS2 (std,%0+1,%B1) CR_TAB -+ { -+ 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 -+ { -+ 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)); -@@ -2852,12 +3432,30 @@ out_movhi_mr_r (rtx insn, rtx op[], int - if (!AVR_XMEGA) - { - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) -- return *l = 4, (AS2 (adiw,r28,%o0-62) CR_TAB -+ 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, (AS2 (subi,r28,lo8(-%o0)) CR_TAB -+ 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 -@@ -2867,12 +3465,30 @@ out_movhi_mr_r (rtx insn, rtx op[], int - else - { - if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) -- return *l = 4, (AS2 (adiw,r28,%o0-62) CR_TAB -+ 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, (AS2 (subi,r28,lo8(-%o0)) CR_TAB -+ 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 -@@ -2888,7 +3504,16 @@ out_movhi_mr_r (rtx insn, rtx op[], int - if (!AVR_XMEGA) - { - *l = 7; -- return (AS2 (mov,__tmp_reg__,r26) CR_TAB -+ 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 -@@ -2899,19 +3524,35 @@ out_movhi_mr_r (rtx insn, rtx op[], int - else - { - *l = 7; -- return (AS2 (mov,__tmp_reg__,r26) CR_TAB -+ return AVR_TINY ? (AS2 (mov,__tmp_reg__,r26) CR_TAB - AS2 (mov,__zero_reg__,r27) CR_TAB -- AS2 (adiw,r26,%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 (sbiw,r26,%o0+1)); -+ 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 -+ 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)); -@@ -2919,7 +3560,13 @@ out_movhi_mr_r (rtx insn, rtx op[], int - else - { - *l = 4; -- return (AS2 (adiw,r26,%o0) CR_TAB -+ 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)); -@@ -2927,11 +3574,49 @@ out_movhi_mr_r (rtx insn, rtx op[], int - } - - if (!AVR_XMEGA) -- return *l=2, (AS2 (std,%B0,%B1) CR_TAB -+ { -+ 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 -+ { -+ 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) */ - { -@@ -2951,15 +3636,30 @@ out_movhi_mr_r (rtx insn, rtx op[], int - if (REGNO (XEXP (base, 0)) == REG_X) - { - *l = 4; -- return (AS2 (adiw,r26,1) CR_TAB -+ 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 -+ 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)); - } -@@ -3049,7 +3749,9 @@ out_tsthi (rtx insn, rtx op, int *l) - if (test_hard_reg_class (ADDW_REGS, op)) - { - 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 -@@ -3070,7 +3772,11 @@ out_tstsi (rtx insn, rtx op, int *l) - if (test_hard_reg_class (ADDW_REGS, op)) - { - if (l) *l = 3; -- return (AS2 (sbiw,%A0,0) CR_TAB -+ 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__)); - } -@@ -5392,10 +6098,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); - - /* FIXME: output these only if there is anything in the .data / .bss -diff -Naurp gcc/config/avr/avr-c.c gcc/config/avr/avr-c.c ---- gcc/config/avr/avr-c.c 2011-01-19 13:03:59.000000000 -0600 -+++ gcc/config/avr/avr-c.c 2011-01-19 13:11:23.000000000 -0600 -@@ -94,5 +94,9 @@ avr_cpu_cpp_builtins (struct cpp_reader - cpp_define (pfile, "__AVR_HAVE_RAMPD__");
- }
-
-+ if (avr_current_arch->avrtiny)
-+ {
-+ cpp_define (pfile, "__AVR_TINY__");
-+ }
- }
-
-diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c ---- gcc/config/avr/avr-devices.c 2011-01-19 13:03:59.000000000 -0600 -+++ gcc/config/avr/avr-devices.c 2011-01-19 13:11:23.000000000 -0600 -@@ -26,24 +26,25 @@ - /* List of all known AVR MCU architectyres. */ - - const struct base_arch_s avr_arch_types[] = { -- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, NULL, "avr2" }, /* unknown device specified */ -- { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=1", "avr1" }, -- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=2", "avr2" }, -- { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=25", "avr25" }, -- { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=3", "avr3" }, -- { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=31", "avr31" }, -- { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=35", "avr35" }, -- { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=4", "avr4" }, -- { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=5", "avr5" }, -- { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0x0060, "__AVR_ARCH__=51", "avr51" }, -- { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0x0060, "__AVR_ARCH__=6", "avr6" }, -- { 0, 1, 0, 1, 0, 0, 0, 1, 0, 0x2000, "__AVR_ARCH__=101", "avrxmega1" }, -- { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0x2000, "__AVR_ARCH__=102", "avrxmega2" }, -- { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0x2000, "__AVR_ARCH__=103", "avrxmega3" }, -- { 0, 1, 1, 1, 1, 1, 0, 1, 0, 0x2000, "__AVR_ARCH__=104", "avrxmega4" }, -- { 0, 1, 1, 1, 1, 1, 0, 1, 1, 0x2000, "__AVR_ARCH__=105", "avrxmega5" }, -- { 0, 1, 1, 1, 1, 1, 1, 1, 0, 0x2000, "__AVR_ARCH__=106", "avrxmega6" }, -- { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0x2000, "__AVR_ARCH__=107", "avrxmega7" } -+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, NULL, "avr2" }, /* unknown device specified */ -+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=1", "avr1" }, -+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=2", "avr2" }, -+ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=25", "avr25" }, -+ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=3", "avr3" }, -+ { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=31", "avr31" }, -+ { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=35", "avr35" }, -+ { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0x0060, "__AVR_ARCH__=4", "avr4" }, -+ { 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, 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" }, -+ { 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0x2000, "__AVR_ARCH__=104", "avrxmega4" }, -+ { 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0x2000, "__AVR_ARCH__=105", "avrxmega5" }, -+ { 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0x2000, "__AVR_ARCH__=106", "avrxmega6" }, -+ { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0x2000, "__AVR_ARCH__=107", "avrxmega7" }, -+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0x0040, "__AVR_ARCH__=201", "avrtiny10" } - }; - - /* List of all known AVR MCU types - if updated, it has to be kept -@@ -229,6 +230,14 @@ 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" }, -+ /* tiny10 family */ -+ { "avrtiny10", ARCH_AVRTINY10, NULL, 0, 0x0040, "tn10" }, -+ { "attiny4", ARCH_AVRTINY10, "__AVR_ATtiny4__", 0, 0x0040, "tn4" }, -+ { "attiny5", ARCH_AVRTINY10, "__AVR_ATtiny5__", 0, 0x0040, "tn5" }, -+ { "attiny9", ARCH_AVRTINY10, "__AVR_ATtiny9__", 0, 0x0040, "tn9" }, -+ { "attiny10", ARCH_AVRTINY10, "__AVR_ATtiny10__", 0, 0x0040, "tn10" }, -+ { "attiny20", ARCH_AVRTINY10, "__AVR_ATtiny20__", 0, 0x0040, "tn20" }, -+ { "attiny40", ARCH_AVRTINY10, "__AVR_ATtiny40__", 0, 0x0040, "tn40" }, - /* Assembler only. */ - { "avr1", ARCH_AVR1, NULL, 0, 0x0060, "s1200" }, - { "at90s1200", ARCH_AVR1, "__AVR_AT90S1200__", 0, 0x0060, "s1200" }, -diff -Naurp gcc/config/avr/avr.h gcc/config/avr/avr.h ---- gcc/config/avr/avr.h 2011-01-19 13:03:59.000000000 -0600 -+++ gcc/config/avr/avr.h 2011-01-19 13:11:23.000000000 -0600 -@@ -51,6 +51,9 @@ struct base_arch_s { - /* Core have RAMPX, RAMPY and RAMPD registers. */ - int have_rampx_y_d; - -+ /* Core is in avrtiny10 family. */ -+ int avrtiny; -+ - /* Default start of data section address for architecture. */ - int default_data_section_start; - -@@ -82,7 +85,8 @@ enum avr_arch - ARCH_AVRXMEGA4, - ARCH_AVRXMEGA5, - ARCH_AVRXMEGA6, -- ARCH_AVRXMEGA7 -+ ARCH_AVRXMEGA7, -+ ARCH_AVRTINY10 - }; - - struct mcu_type_s { -@@ -126,6 +130,7 @@ extern GTY(()) section *progmem_section; - #define AVR_HAVE_EIJMP_EICALL (avr_current_arch->have_eijmp_eicall) - #define AVR_HAVE_8BIT_SP (avr_current_device->short_sp || TARGET_TINY_STACK) - #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) -@@ -249,7 +254,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) -@@ -313,6 +317,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 -diff -Naurp gcc/config/avr/avr.md gcc/config/avr/avr.md ---- gcc/config/avr/avr.md 2011-01-19 13:03:59.000000000 -0600 -+++ gcc/config/avr/avr.md 2011-01-19 13:11:23.000000000 -0600 -@@ -186,6 +186,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))) -@@ -479,7 +482,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; -@@ -2900,7 +2903,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 -Naurp gcc/config/avr/libgcc-fixed.S gcc/config/avr/libgcc-fixed.S ---- gcc/config/avr/libgcc-fixed.S 2011-01-18 17:58:12.000000000 -0600 -+++ gcc/config/avr/libgcc-fixed.S 2011-01-19 13:11:23.000000000 -0600 -@@ -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 -Naurp gcc/config/avr/libgcc.S gcc/config/avr/libgcc.S ---- gcc/config/avr/libgcc.S 2011-01-19 13:03:59.000000000 -0600 -+++ gcc/config/avr/libgcc.S 2011-01-19 13:11:23.000000000 -0600 -@@ -22,8 +22,13 @@ a copy of the GCC Runtime Library Except - 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 -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr ---- gcc/config/avr/t-avr 2011-01-19 13:03:59.000000000 -0600 -+++ gcc/config/avr/t-avr 2011-01-19 13:11:23.000000000 -0600 -@@ -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 --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 = \ -@@ -242,7 +242,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 = - |