]> git.pld-linux.org Git - packages/crossavr-gcc.git/blobdiff - 513-gcc-avrtc556-tiny-same-base-and-dest.patch
Revert "Revert "- synchronized patches with official AVR toolchain 3.4.1.830""
[packages/crossavr-gcc.git] / 513-gcc-avrtc556-tiny-same-base-and-dest.patch
diff --git a/513-gcc-avrtc556-tiny-same-base-and-dest.patch b/513-gcc-avrtc556-tiny-same-base-and-dest.patch
new file mode 100644 (file)
index 0000000..1b6f633
--- /dev/null
@@ -0,0 +1,130 @@
+diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c
+--- gcc/config/avr/avr.c       2012-07-13 16:06:56.000000000 +0530
++++ gcc/config/avr/avr.c       2012-07-13 15:23:01.000000000 +0530
+@@ -2265,6 +2265,15 @@ out_movqi_r_mr (rtx insn, rtx op[], int 
+           {
+             if (AVR_TINY)
+             {
++                if (reg_overlap_mentioned_p (dest, XEXP (x,0))
++                    || reg_unused_after (insn, XEXP (x,0)))
++                {
++
++                    *l = 3;
++                    return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                            AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                            AS2 (ld,%0,Y));
++                }
+               *l = 5;
+               return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+                       AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+@@ -2282,6 +2291,15 @@ out_movqi_r_mr (rtx insn, rtx op[], int 
+           {
+             if (AVR_TINY)
+             {
++              if (reg_overlap_mentioned_p (dest, XEXP (x,0))
++                  || reg_unused_after (insn, XEXP (x,0)))
++                  {
++
++                    *l = 3;
++                    return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
++                            AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
++                            AS2 (ld,%0,Z));
++                  }
+               *l = 5;
+               return (AS2 (subi,%A2,lo8(-(%o1))) CR_TAB
+                       AS2 (sbci,%B2,hi8(-(%o1))) CR_TAB
+@@ -3766,12 +3784,41 @@ out_movqi_mr_r (rtx insn, rtx op[], int 
+         op[2] = XEXP(x, 0);
+         if(REGNO(op[2]) == REG_Y) {
+           if (AVR_TINY) {
+-            *l = 5;
+-            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
+-                  AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
+-                  AS2 (st,Y,%1)              CR_TAB
+-                    AS2 (subi,%A2,lo8(%o0)) CR_TAB
+-                  AS2 (sbci,%B2,hi8(%o0)));
++            if (reg_overlap_mentioned_p (src, XEXP (x, 0)))
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 4;
++                return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                  AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                  AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                  AS2 (st,Y,__tmp_reg__));
++              }
++              *l = 6;
++              return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                AS2 (st,Y,__tmp_reg__)          CR_TAB
++                      AS2 (subi,%A2,lo8(%o0))          CR_TAB
++                            AS2 (sbci,%B2,hi8(%o0)));        
++            }
++            else
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 3;
++                return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                              AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                              AS2 (st,Y,%1));
++              }
++
++              *l = 5;
++              return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                      AS2 (st,Y,%1)              CR_TAB
++                      AS2 (subi,%A2,lo8(%o0)) CR_TAB
++                      AS2 (sbci,%B2,hi8(%o0)));
++            }
+           } else {
+             *l = 1;
+             return (AS2 (std,%0,%1));
+@@ -3779,12 +3826,40 @@ out_movqi_mr_r (rtx insn, rtx op[], int 
+         }
+         if(REGNO(op[2]) == REG_Z) {
+           if (AVR_TINY) {
+-            *l = 5;
+-            return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
+-                  AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
+-                    AS2 (st,Z,%1)              CR_TAB
+-                    AS2 (subi,%A2,lo8(%o0)) CR_TAB
+-                    AS2 (sbci,%B2,hi8(%o0)));
++            if (reg_overlap_mentioned_p (src, XEXP (x, 0)))
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 4;
++                return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                  AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                  AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                  AS2 (st,Z,__tmp_reg__));
++              }
++              *l = 6;
++              return (AS2 (mov,__tmp_reg__,%1)         CR_TAB
++                                AS2 (subi,%A2,lo8(-(%o0)))       CR_TAB
++                                AS2 (sbci,%B2,hi8(-(%o0)))       CR_TAB
++                                AS2 (st,Z,__tmp_reg__)          CR_TAB
++                      AS2 (subi,%A2,lo8(%o0))          CR_TAB
++                            AS2 (sbci,%B2,hi8(%o0)));        
++            }
++            else
++            {
++              if (reg_unused_after (insn, XEXP (x, 0)))
++              {
++                *l = 3;
++                return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                              AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                              AS2 (st,Z,%1));
++              }
++              *l = 5;
++              return (AS2 (subi,%A2,lo8(-(%o0))) CR_TAB
++                      AS2 (sbci,%B2,hi8(-(%o0))) CR_TAB
++                      AS2 (st,Z,%1)              CR_TAB
++                      AS2 (subi,%A2,lo8(%o0)) CR_TAB
++                      AS2 (sbci,%B2,hi8(%o0)));
++            }
+           } else {
+           *l = 1;
+             return (AS2 (std,%0,%1));
This page took 0.035274 seconds and 4 git commands to generate.