diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c --- gcc/config/avr/avr.c 2012-07-16 11:46:50.000000000 +0530 +++ gcc/config/avr/avr.c 2012-07-16 11:54:05.000000000 +0530 @@ -3267,7 +3267,7 @@ out_movsi_mr_r (rtx insn, rtx op[], int AS2 (st,Y+,%C1) CR_TAB AS2 (st,Y,%D1) CR_TAB AS2 (subi,r28,lo8(3)) CR_TAB - AS2 (sbci,r29,lo8(3))); + AS2 (sbci,r29,hi8(3))); } else { *l = 4; return (AS2 (st,%0,%A1) CR_TAB @@ -3284,7 +3284,7 @@ out_movsi_mr_r (rtx insn, rtx op[], int AS2 (st,Z+,%C1) CR_TAB AS2 (st,Z,%D1) CR_TAB AS2 (subi,r30,lo8(3)) CR_TAB - AS2 (sbci,r31,lo8(3))); + AS2 (sbci,r31,hi8(3))); } else { *l = 4; return (AS2 (st,%0,%A1) CR_TAB @@ -3310,13 +3310,13 @@ out_movsi_mr_r (rtx insn, rtx op[], int return (AS2 (subi,r28,lo8(-(%o0-60))) CR_TAB AS2 (sbci,r29,hi8(-(%o0-60))) CR_TAB AS2 (subi,r28,lo8(-60)) CR_TAB - AS2 (sbci,r29,lo8(-60)) CR_TAB + AS2 (sbci,r29,hi8(-60)) CR_TAB AS2 (st,Y+,%A1) CR_TAB AS2 (st,Y+,%B1) CR_TAB AS2 (st,Y+,%C1) CR_TAB AS2 (st,Y,%D1) CR_TAB AS2 (subi,r28,lo8(63)) CR_TAB - AS2 (sbci,r29,lo8(63)) CR_TAB + AS2 (sbci,r29,hi8(63)) CR_TAB AS2 (subi,r28,lo8(%o0-60)) CR_TAB AS2 (sbci,r29,hi8(%o0-60))); } else { @@ -3338,7 +3338,7 @@ out_movsi_mr_r (rtx insn, rtx op[], int AS2 (st,Y+,%C1) CR_TAB AS2 (st,Y,%D1) CR_TAB AS2 (subi,r28,lo8(3)) CR_TAB - AS2 (sbci,r29,lo8(3)) CR_TAB + AS2 (sbci,r29,hi8(3)) CR_TAB AS2 (subi,r28,lo8(%o0)) CR_TAB AS2 (sbci,r29,hi8(%o0))); } else {