diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
---- gcc/config/avr/avr.c 2011-09-02 11:45:05.000000000 +0300
-+++ gcc/config/avr/avr.c 2011-09-02 11:46:03.000000000 +0300
-@@ -232,8 +232,8 @@ avr_override_options (void)
+--- gcc/config/avr/avr.c 2011-10-27 17:00:24.000000000 +0530
++++ gcc/config/avr/avr.c 2011-10-27 17:47:15.000000000 +0530
+@@ -274,8 +274,8 @@ avr_option_override (void)
avr_current_arch = &avr_arch_types[avr_current_device->arch];
avr_extra_arch_macro = avr_current_device->macro;
init_machine_status = avr_init_machine_status;
}
-@@ -1641,7 +1641,7 @@ avr_simplify_comparison_p (enum machine_
+@@ -1771,7 +1771,7 @@ avr_simplify_comparison_p (enum machine_
int
function_arg_regno_p(int r)
{
}
/* Initializing the variable cum for the state at the beginning
-@@ -1651,7 +1651,11 @@ void
+@@ -1781,7 +1781,11 @@ void
init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, rtx libname,
tree fndecl ATTRIBUTE_UNUSED)
{
cum->nregs = 18;
+
cum->regno = FIRST_CUM_REG;
- if (!libname && fntype)
- {
-@@ -1675,9 +1679,8 @@ avr_num_arg_regs (enum machine_mode mode
+ if (!libname && stdarg_p (fntype))
+ cum->nregs = 0;
+@@ -1799,9 +1803,8 @@ avr_num_arg_regs (enum machine_mode mode
else
size = GET_MODE_SIZE (mode);
return (size + 1) & ~1;
}
-@@ -2009,10 +2012,20 @@ out_movqi_r_mr (rtx insn, rtx op[], int
+@@ -2133,10 +2136,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 = 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
+@@ -2149,15 +2162,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)))
}
*l = 1;
return AS2 (ld,%0,%1);
-@@ -2073,14 +2109,34 @@ out_movhi_r_mr (rtx insn, rtx op[], int
+@@ -2197,14 +2233,34 @@ out_movhi_r_mr (rtx insn, rtx op[], int
AS2 (ld,%B0,X));
}
*l = 3;
AS2 (ldd,%B0,%1+1));
}
}
-@@ -2095,12 +2151,30 @@ out_movhi_r_mr (rtx insn, rtx op[], int
+@@ -2219,12 +2275,30 @@ out_movhi_r_mr (rtx insn, rtx op[], int
fatal_insn ("incorrect insn:",insn);
if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
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
+@@ -2239,12 +2313,23 @@ out_movhi_r_mr (rtx insn, rtx op[], int
*l = 4;
if (reg_base == reg_dest)
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
+@@ -2253,14 +2338,54 @@ out_movhi_r_mr (rtx insn, rtx op[], int
if (reg_base == reg_dest)
{
*l = 3;
}
else if (GET_CODE (base) == PRE_DEC) /* (--R) */
{
-@@ -2148,7 +2273,13 @@ out_movhi_r_mr (rtx insn, rtx op[], int
+@@ -2272,7 +2397,13 @@ out_movhi_r_mr (rtx insn, rtx op[], int
if (REGNO (XEXP (base, 0)) == REG_X)
{
*l = 4;
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
+@@ -2280,7 +2411,16 @@ out_movhi_r_mr (rtx insn, rtx op[], int
else
{
*l = 3;
AS2 (ld,%A0,%p1) CR_TAB
AS2 (ldd,%B0,%p1+1));
}
-@@ -2212,13 +2352,23 @@ out_movsi_r_mr (rtx insn, rtx op[], int
+@@ -2336,13 +2476,23 @@ out_movsi_r_mr (rtx insn, rtx op[], int
{
if (reg_dest == REG_X)
/* "ld r26,-X" is undefined */
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
+@@ -2355,7 +2505,13 @@ out_movsi_r_mr (rtx insn, rtx op[], int
AS2 (ld,%C0,X+) CR_TAB
AS2 (ld,%D0,X));
else
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
+@@ -2364,22 +2520,97 @@ out_movsi_r_mr (rtx insn, rtx op[], int
else
{
if (reg_dest == reg_base)
}
}
else if (GET_CODE (base) == PLUS) /* (R + i) */
-@@ -2268,14 +2499,36 @@ out_movsi_r_mr (rtx insn, rtx op[], int
+@@ -2392,14 +2623,36 @@ out_movsi_r_mr (rtx insn, rtx op[], int
fatal_insn ("incorrect insn:",insn);
if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
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
+@@ -2417,7 +2670,16 @@ out_movsi_r_mr (rtx insn, rtx op[], int
{
*l = 7;
/* "ld r26,-X" is undefined */
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
+@@ -2427,14 +2689,29 @@ out_movsi_r_mr (rtx insn, rtx op[], int
}
*l = 6;
if (reg_dest == REG_X - 2)
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
+@@ -2442,18 +2719,99 @@ out_movsi_r_mr (rtx insn, rtx op[], int
AS2 (sbiw,r26,%o1+3));
}
if (reg_dest == reg_base)
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
+@@ -2504,14 +2862,30 @@ out_movsi_mr_r (rtx insn, rtx op[], int
{
/* "st X+,r26" is undefined */
if (reg_unused_after (insn, base))
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
+@@ -2530,7 +2904,16 @@ out_movsi_mr_r (rtx insn, rtx op[], int
AS2 (st,%0,__tmp_reg__) CR_TAB
AS1 (clr,__zero_reg__));
else
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
+@@ -2539,18 +2922,44 @@ out_movsi_mr_r (rtx insn, rtx op[], int
AS1 (clr,__zero_reg__) CR_TAB
AS2 (sbiw,r26,3));
}
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
+@@ -2561,14 +2970,35 @@ out_movsi_mr_r (rtx insn, rtx op[], int
fatal_insn ("incorrect insn:",insn);
if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
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
+@@ -2583,7 +3013,18 @@ out_movsi_mr_r (rtx insn, rtx op[], int
if (reg_src == REG_X)
{
*l = 9;
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
+@@ -2596,7 +3037,18 @@ out_movsi_mr_r (rtx insn, rtx op[], int
else if (reg_src == REG_X - 2)
{
*l = 9;
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
+@@ -2607,14 +3059,46 @@ out_movsi_mr_r (rtx insn, rtx op[], int
AS2 (sbiw,r26,%o0+3));
}
*l = 6;
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
+@@ -2831,7 +3315,16 @@ out_movqi_mr_r (rtx insn, rtx op[], int
fatal_insn ("incorrect insn:",insn);
if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
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
+@@ -2846,11 +3339,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)))
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
+@@ -2858,16 +3361,38 @@ out_movqi_mr_r (rtx insn, rtx op[], int
else
{
if (reg_unused_after (insn, XEXP (x,0)))
}
*l = 1;
return AS2 (st,%0,%1);
-@@ -2792,20 +3317,39 @@ out_movhi_mr_r (rtx insn, rtx op[], int
+@@ -2916,20 +3441,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))
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
+@@ -2944,11 +3488,19 @@ out_movhi_mr_r (rtx insn, rtx op[], int
else
{
if (!AVR_XMEGA)
AS2 (st,X,%B1) CR_TAB
AS2 (sbiw,r26,1));
}
-@@ -2833,13 +3385,41 @@ out_movhi_mr_r (rtx insn, rtx op[], int
+@@ -2957,13 +3509,41 @@ out_movhi_mr_r (rtx insn, rtx op[], int
else
{
if (!AVR_XMEGA)
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
+@@ -2976,12 +3556,30 @@ out_movhi_mr_r (rtx insn, rtx op[], int
if (!AVR_XMEGA)
{
if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
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
+@@ -2991,12 +3589,30 @@ out_movhi_mr_r (rtx insn, rtx op[], int
else
{
if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
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
+@@ -3012,7 +3628,16 @@ out_movhi_mr_r (rtx insn, rtx op[], int
if (!AVR_XMEGA)
{
*l = 7;
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
+@@ -3023,19 +3648,35 @@ out_movhi_mr_r (rtx insn, rtx op[], int
else
{
*l = 7;
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
+@@ -3043,7 +3684,13 @@ out_movhi_mr_r (rtx insn, rtx op[], int
else
{
*l = 4;
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
+@@ -3051,11 +3698,49 @@ out_movhi_mr_r (rtx insn, rtx op[], int
}
if (!AVR_XMEGA)
}
else if (GET_CODE (base) == PRE_DEC) /* (--R) */
{
-@@ -2951,15 +3636,30 @@ out_movhi_mr_r (rtx insn, rtx op[], int
+@@ -3075,15 +3760,30 @@ out_movhi_mr_r (rtx insn, rtx op[], int
if (REGNO (XEXP (base, 0)) == REG_X)
{
*l = 4;
AS2 (st,%p0,%A1) CR_TAB
AS2 (adiw,%r0,2));
}
-@@ -3049,7 +3749,9 @@ out_tsthi (rtx insn, rtx op, int *l)
+@@ -3173,7 +3873,9 @@ out_tsthi (rtx insn, rtx op, int *l)
if (test_hard_reg_class (ADDW_REGS, op))
{
if (l) *l = 1;
}
if (l) *l = 2;
return (AS2 (cp,%A0,__zero_reg__) CR_TAB
-@@ -3070,7 +3772,11 @@ out_tstsi (rtx insn, rtx op, int *l)
+@@ -3194,7 +3896,11 @@ out_tstsi (rtx insn, rtx op, int *l)
if (test_hard_reg_class (ADDW_REGS, op))
{
if (l) *l = 3;
AS2 (cpc,%C0,__zero_reg__) CR_TAB
AS2 (cpc,%D0,__zero_reg__));
}
-@@ -5392,10 +6098,12 @@ avr_file_start (void)
+@@ -5571,10 +6277,12 @@ avr_file_start (void)
/* fprintf (asm_out_file, "\t.arch %s\n", avr_mcu_name);*/
fputs ("__SREG__ = 0x3f\n"
"__SP_H__ = 0x3e\n"
/* 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-09-02 11:45:05.000000000 +0300
-+++ gcc/config/avr/avr-c.c 2011-09-02 11:46:03.000000000 +0300
+--- gcc/config/avr/avr-c.c 2011-10-27 17:00:24.000000000 +0530
++++ gcc/config/avr/avr-c.c 2011-10-27 17:47:15.000000000 +0530
@@ -94,5 +94,9 @@ avr_cpu_cpp_builtins (struct cpp_reader
cpp_define (pfile, "__AVR_HAVE_RAMPD__");
}
}
diff -Naurp gcc/config/avr/avr-devices.c gcc/config/avr/avr-devices.c
---- gcc/config/avr/avr-devices.c 2011-09-02 11:45:05.000000000 +0300
-+++ gcc/config/avr/avr-devices.c 2011-09-02 11:46:03.000000000 +0300
+--- gcc/config/avr/avr-devices.c 2011-10-27 17:00:24.000000000 +0530
++++ gcc/config/avr/avr-devices.c 2011-10-27 17:47:15.000000000 +0530
@@ -26,24 +26,25 @@
- /* List of all known AVR MCU architectyres. */
+ /* List of all known AVR MCU architectures. */
const struct base_arch_s avr_arch_types[] = {
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, NULL, "avr2" }, /* unknown device specified */
};
/* List of all known AVR MCU types - if updated, it has to be kept
-@@ -228,6 +229,14 @@ const struct mcu_type_s avr_mcu_types[]
+@@ -255,6 +256,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" },
{ "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-09-02 11:45:05.000000000 +0300
-+++ gcc/config/avr/avr.h 2011-09-02 11:46:03.000000000 +0300
+--- gcc/config/avr/avr.h 2011-10-27 17:00:24.000000000 +0530
++++ gcc/config/avr/avr.h 2011-10-27 17:47:15.000000000 +0530
@@ -51,6 +51,9 @@ struct base_arch_s {
/* Core have RAMPX, RAMPY and RAMPD registers. */
int have_rampx_y_d;
#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;
+@@ -245,7 +250,6 @@ extern GTY(()) section *progmem_section;
- #define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc ()
+ #define ADJUST_REG_ALLOC_ORDER 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 {
+@@ -309,6 +313,41 @@ enum reg_class {
{0xffffffff,0x00000003} /* ALL_REGS */ \
}
/* 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-09-02 11:45:05.000000000 +0300
-+++ gcc/config/avr/avr.md 2011-09-02 11:46:03.000000000 +0300
-@@ -186,6 +186,9 @@
- DONE;
- })
+--- gcc/config/avr/avr.md 2011-10-27 17:00:24.000000000 +0530
++++ gcc/config/avr/avr.md 2011-10-27 17:47:15.000000000 +0530
+@@ -417,6 +417,9 @@
+ [(set_attr "length" "8")
+ (set_attr "cc" "none")])
+(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 @@
+ (define_insn "*mov<ALLS:mode>"
+ [(set (match_operand:ALLS 0 "nonimmediate_operand" "=r,r,r,Qm,!d,r")
+@@ -476,7 +479,7 @@
rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
/* Create rtx for tmp register - we use this as scratch. */
if (GET_CODE (operands[2]) != CONST_INT)
FAIL;
-@@ -2900,7 +2903,7 @@
+@@ -2907,7 +2910,7 @@
UNSPEC_INDEX_JMP))
(use (label_ref (match_operand 1 "" "")))
(clobber (match_dup 0))]
rol r31
lpm
diff -Naurp gcc/config/avr/libgcc-fixed.S gcc/config/avr/libgcc-fixed.S
---- gcc/config/avr/libgcc-fixed.S 2011-09-02 11:40:55.000000000 +0300
-+++ gcc/config/avr/libgcc-fixed.S 2011-09-02 11:46:03.000000000 +0300
+--- gcc/config/avr/libgcc-fixed.S 2011-10-27 17:00:03.000000000 +0530
++++ gcc/config/avr/libgcc-fixed.S 2011-10-27 17:47:15.000000000 +0530
@@ -29,13 +29,17 @@ Boston, MA 02110-1301, USA. */
/* Fixed point library routines for avr. */
com r_quoHH
com r_quoHL
diff -Naurp gcc/config/avr/libgcc.S gcc/config/avr/libgcc.S
---- gcc/config/avr/libgcc.S 2011-09-02 11:45:05.000000000 +0300
-+++ gcc/config/avr/libgcc.S 2011-09-02 11:46:03.000000000 +0300
+--- gcc/config/avr/libgcc.S 2011-10-27 17:00:24.000000000 +0530
++++ gcc/config/avr/libgcc.S 2011-10-27 17:47:15.000000000 +0530
@@ -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/>. */
#define __SREG__ 0x3f
#define __SP_H__ 0x3e
#define __SP_L__ 0x3d
-@@ -140,7 +145,12 @@ __mulhi3_skip1:
+@@ -141,7 +146,12 @@ __mulhi3_skip1:
lsr r_arg1H ; gets LSB of multiplier
ror r_arg1L
brne __mulhi3_loop ; exit if multiplier = 0
__mulhi3_exit:
mov r_arg1H,r_resH ; result to return register
-@@ -304,7 +314,12 @@ __mulsi3_skip1:
+@@ -305,7 +315,12 @@ __mulsi3_skip1:
ror r_arg1H
ror r_arg1L
brne __mulsi3_loop
cpc r_arg1H,r_arg1L
brne __mulsi3_loop ; exit if multiplier = 0
__mulsi3_exit:
-@@ -610,6 +625,7 @@ __divmodsi4_neg1:
+@@ -611,6 +626,7 @@ __divmodsi4_neg1:
/**********************************
* This is a prologue subroutine
**********************************/
#if defined (L_prologue)
.global __prologue_saves__
-@@ -663,7 +679,6 @@ __prologue_saves__:
+@@ -664,7 +680,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__:
+@@ -705,6 +720,7 @@ __epilogue_restores__:
ret
.endfunc
#endif /* defined (L_epilogue) */
#ifdef L_exit
.section .fini9,"ax",@progbits
-@@ -730,6 +746,7 @@ _cleanup:
+@@ -731,6 +747,7 @@ _cleanup:
.endfunc
#endif /* defined (L_cleanup) */
#ifdef L_tablejump
.global __tablejump2__
.func __tablejump2__
-@@ -762,7 +779,9 @@ __tablejump__:
+@@ -763,7 +780,9 @@ __tablejump__:
#endif
.endfunc
#endif /* defined (L_tablejump) */
#ifdef L_copy_data
.section .init4,"ax",@progbits
.global __do_copy_data
-@@ -824,6 +843,7 @@ __do_copy_data:
+@@ -825,6 +844,7 @@ __do_copy_data:
brne .L__do_copy_data_loop
#endif /* !defined(__AVR_HAVE_ELPMX__) && !defined(__AVR_HAVE_ELPM__) */
#endif /* L_copy_data */
/* __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)
+ ldi r16, 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
++ #if defined (__AVR_TINY__)
++ subi r28, lo8(2)
++ sbci r29, hi8(2)
++ #else
sbiw r28, 2
-+#endif
- sbc r20, __zero_reg__
++ #endif
+ sbc r16, __zero_reg__
mov_h r31, r29
mov_l r30, r28
-@@ -882,7 +907,12 @@ __do_global_ctors:
+@@ -883,7 +908,12 @@ __do_global_ctors:
ldi r29, hi8(__ctors_end)
rjmp .L__do_global_ctors_start
.L__do_global_ctors_loop:
mov_l r30, r28
XCALL __tablejump__
@@ -905,7 +935,12 @@ __do_global_dtors:
- ldi r20, hh8(__dtors_start)
+ ldi r16, 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
++ #if defined (__AVR_TINY__)
++ subi r28, lo8(2)
++ sbci r29, hi8(2)
++ #else
sbiw r28, 2
-+#endif
- sbc r20, __zero_reg__
++ #endif
+ sbc r16, __zero_reg__
mov_h r31, r29
mov_l r30, r28
-@@ -926,7 +961,12 @@ __do_global_dtors:
+@@ -927,7 +962,12 @@ __do_global_dtors:
mov_h r31, r29
mov_l r30, r28
XCALL __tablejump__
.L__do_global_dtors_start:
cpi r28, lo8(__dtors_end)
cpc r29, r17
-@@ -934,6 +974,7 @@ __do_global_dtors:
+@@ -935,6 +975,7 @@ __do_global_dtors:
#endif /* defined(__AVR_HAVE_RAMPZ__) */
#endif /* L_dtors */
#ifdef L_tablejump_elpm
.global __tablejump_elpm__
.func __tablejump_elpm__
-@@ -963,5 +1004,6 @@ __tablejump_elpm__:
+@@ -965,5 +1006,6 @@ __tablejump_elpm__:
#endif /* defined (__AVR_HAVE_ELPM__) */
.endfunc
#endif /* defined (L_tablejump_elpm) */
#include "libgcc-fixed.S"
diff -Naurp gcc/config/avr/t-avr gcc/config/avr/t-avr
---- gcc/config/avr/t-avr 2011-09-02 11:45:05.000000000 +0300
-+++ gcc/config/avr/t-avr 2011-09-02 11:46:03.000000000 +0300
+--- gcc/config/avr/t-avr 2011-10-27 17:00:24.000000000 +0530
++++ gcc/config/avr/t-avr 2011-10-27 17:47:15.000000000 +0530
@@ -107,8 +107,8 @@ fp-bit.c: $(srcdir)/config/fp-bit.c $(sr
FPBIT = fp-bit.c
# The many avr2 matches are not listed here - this is the default.
MULTILIB_MATCHES = \
-@@ -241,7 +241,13 @@ MULTILIB_MATCHES = \
+@@ -270,7 +270,13 @@ MULTILIB_MATCHES = \
mmcu?avrxmega6=mmcu?atxmega256a3b \
mmcu?avrxmega6=mmcu?atxmega256d3 \
mmcu?avrxmega7=mmcu?atxmega128a1 \