diff options
author | Joerg Wunsch <joerg@FreeBSD.org> | 2005-03-10 21:14:44 +0000 |
---|---|---|
committer | Joerg Wunsch <joerg@FreeBSD.org> | 2005-03-10 21:14:44 +0000 |
commit | 96fe03484f9c3b29efa8e57a279d96b9e4ba3d0e (patch) | |
tree | b3bf6deb247b3e7863951679ff978a90252afbec /devel/avr-gcc-3/files | |
parent | Merge some patches that have meanwhile be integrated in binutil's CVS, (diff) |
Bring in some patches from the head of GCC's CVS back to the latest
released version, 3.4.3. This mainly adds support for new AVR devices
that appeared on the market recently, and fixes a bug related to the
order of assignments for volatile uint16_t * objects (in the
assumption they might point to IO space where the order of two 8-bit
operations can be important).
Notes
Notes:
svn path=/head/; revision=130833
Diffstat (limited to 'devel/avr-gcc-3/files')
-rw-r--r-- | devel/avr-gcc-3/files/patch-16bitassign | 215 | ||||
-rw-r--r-- | devel/avr-gcc-3/files/patch-mega08-tinyx13-can128 | 124 | ||||
-rw-r--r-- | devel/avr-gcc-3/files/patch-mega325x-mega645x | 58 |
3 files changed, 397 insertions, 0 deletions
diff --git a/devel/avr-gcc-3/files/patch-16bitassign b/devel/avr-gcc-3/files/patch-16bitassign new file mode 100644 index 000000000000..d527a87cf935 --- /dev/null +++ b/devel/avr-gcc-3/files/patch-16bitassign @@ -0,0 +1,215 @@ +=================================================================== +RCS file: /cvsroot/gcc/cvsroot/gcc/gcc/gcc/config/avr/avr.c,v +retrieving revision 1.129 +retrieving revision 1.130 +diff -u -r1.129 -r1.130 +--- gcc/config/avr/avr.c 2005/02/09 14:43:28 1.129 ++++ gcc/config/avr/avr.c 2005/03/06 21:50:34 1.130 +@@ -1120,6 +1120,16 @@ + + print_operand (file, XEXP (addr, 1), 0); + } ++ else if (code == 'p' || code == 'r') ++ { ++ if (GET_CODE (addr) != POST_INC && GET_CODE (addr) != PRE_DEC) ++ fatal_insn ("bad address, not post_inc or pre_dec:", addr); ++ ++ if (code == 'p') ++ print_operand_address (file, XEXP (addr, 0)); /* X, Y, Z */ ++ else ++ print_operand (file, XEXP (addr, 0), 0); /* r26, r28, r30 */ ++ } + else if (GET_CODE (addr) == PLUS) + { + print_operand_address (file, XEXP (addr,0)); +@@ -1835,6 +1845,9 @@ + rtx base = XEXP (src, 0); + int reg_dest = true_regnum (dest); + int reg_base = true_regnum (base); ++ /* "volatile" forces reading low byte first, even if less efficient, ++ for correct operation with 16-bit I/O registers. */ ++ int mem_volatile_p = MEM_VOLATILE_P (src); + int tmp; + + if (!l) +@@ -1928,6 +1941,25 @@ + if (reg_overlap_mentioned_p (dest, XEXP (base, 0))) + fatal_insn ("incorrect insn:", insn); + ++ if (mem_volatile_p) ++ { ++ if (REGNO (XEXP (base, 0)) == REG_X) ++ { ++ *l = 4; ++ return (AS2 (sbiw,r26,2) CR_TAB ++ AS2 (ld,%A0,X+) CR_TAB ++ AS2 (ld,%B0,X) CR_TAB ++ AS2 (sbiw,r26,1)); ++ } ++ else ++ { ++ *l = 3; ++ return (AS2 (sbiw,%r1,2) CR_TAB ++ AS2 (ld,%A0,%p1) CR_TAB ++ AS2 (ldd,%B0,%p1+1)); ++ } ++ } ++ + *l = 2; + return (AS2 (ld,%B0,%1) CR_TAB + AS2 (ld,%A0,%1)); +@@ -2508,7 +2540,11 @@ + rtx base = XEXP (dest, 0); + int reg_base = true_regnum (base); + int reg_src = true_regnum (src); ++ /* "volatile" forces writing high byte first, even if less efficient, ++ for correct operation with 16-bit I/O registers. */ ++ int mem_volatile_p = MEM_VOLATILE_P (dest); + int tmp; ++ + if (!l) + l = &tmp; + if (CONSTANT_ADDRESS_P (base)) +@@ -2528,33 +2564,33 @@ + { + if (reg_src == REG_X) + { +- /* "st X+,r26" is undefined */ +- if (reg_unused_after (insn, src)) ++ /* "st X+,r26" and "st -X,r26" are undefined. */ ++ if (!mem_volatile_p && reg_unused_after (insn, src)) + return *l=4, (AS2 (mov,__tmp_reg__,r27) CR_TAB + AS2 (st,X,r26) CR_TAB + AS2 (adiw,r26,1) CR_TAB + AS2 (st,X,__tmp_reg__)); + else + return *l=5, (AS2 (mov,__tmp_reg__,r27) CR_TAB +- AS2 (st,X,r26) CR_TAB + AS2 (adiw,r26,1) CR_TAB + AS2 (st,X,__tmp_reg__) CR_TAB +- AS2 (sbiw,r26,1)); ++ AS2 (sbiw,r26,1) CR_TAB ++ AS2 (st,X,r26)); + } + else + { +- if (reg_unused_after (insn, base)) ++ if (!mem_volatile_p && reg_unused_after (insn, base)) + return *l=2, (AS2 (st,X+,%A1) CR_TAB + AS2 (st,X,%B1)); + else +- return *l=3, (AS2 (st ,X+,%A1) CR_TAB +- AS2 (st ,X,%B1) CR_TAB +- AS2 (sbiw,r26,1)); ++ return *l=3, (AS2 (adiw,r26,1) CR_TAB ++ AS2 (st,X,%B1) CR_TAB ++ AS2 (st,-X,%A1)); + } + } + else +- return *l=2, (AS2 (st ,%0,%A1) CR_TAB +- AS2 (std,%0+1,%B1)); ++ return *l=2, (AS2 (std,%0+1,%B1) CR_TAB ++ AS2 (st,%0,%A1)); + } + else if (GET_CODE (base) == PLUS) + { +@@ -2567,14 +2603,14 @@ + + if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest))) + return *l = 4, (AS2 (adiw,r28,%o0-62) CR_TAB +- AS2 (std,Y+62,%A1) CR_TAB + AS2 (std,Y+63,%B1) CR_TAB ++ AS2 (std,Y+62,%A1) CR_TAB + AS2 (sbiw,r28,%o0-62)); + + return *l = 6, (AS2 (subi,r28,lo8(-%o0)) CR_TAB + AS2 (sbci,r29,hi8(-%o0)) CR_TAB +- AS2 (st,Y,%A1) CR_TAB + AS2 (std,Y+1,%B1) CR_TAB ++ AS2 (st,Y,%A1) CR_TAB + AS2 (subi,r28,lo8(%o0)) CR_TAB + AS2 (sbci,r29,hi8(%o0))); + } +@@ -2582,31 +2618,53 @@ + { + /* (X + d) = R */ + if (reg_src == REG_X) +- { ++ { + *l = 7; + return (AS2 (mov,__tmp_reg__,r26) CR_TAB + AS2 (mov,__zero_reg__,r27) CR_TAB +- AS2 (adiw,r26,%o0) CR_TAB +- AS2 (st,X+,__tmp_reg__) CR_TAB ++ AS2 (adiw,r26,%o0+1) CR_TAB + AS2 (st,X,__zero_reg__) CR_TAB ++ AS2 (st,-X,__tmp_reg__) CR_TAB + AS1 (clr,__zero_reg__) CR_TAB +- AS2 (sbiw,r26,%o0+1)); ++ AS2 (sbiw,r26,%o0)); + } + *l = 4; +- return (AS2 (adiw,r26,%o0) CR_TAB +- AS2 (st,X+,%A1) CR_TAB +- AS2 (st,X,%B1) CR_TAB +- AS2 (sbiw,r26,%o0+1)); ++ return (AS2 (adiw,r26,%o0+1) CR_TAB ++ AS2 (st,X,%B1) CR_TAB ++ AS2 (st,-X,%A1) CR_TAB ++ AS2 (sbiw,r26,%o0)); + } +- return *l=2, (AS2 (std,%A0,%A1) CR_TAB +- AS2 (std,%B0,%B1)); ++ return *l=2, (AS2 (std,%B0,%B1) CR_TAB ++ AS2 (std,%A0,%A1)); + } + else if (GET_CODE (base) == PRE_DEC) /* (--R) */ + return *l=2, (AS2 (st,%0,%B1) CR_TAB + AS2 (st,%0,%A1)); + else if (GET_CODE (base) == POST_INC) /* (R++) */ +- return *l=2, (AS2 (st,%0,%A1) CR_TAB +- AS2 (st,%0,%B1)); ++ { ++ if (mem_volatile_p) ++ { ++ if (REGNO (XEXP (base, 0)) == REG_X) ++ { ++ *l = 4; ++ return (AS2 (adiw,r26,1) CR_TAB ++ AS2 (st,X,%B1) CR_TAB ++ AS2 (st,-X,%A1) CR_TAB ++ AS2 (adiw,r26,2)); ++ } ++ else ++ { ++ *l = 3; ++ return (AS2 (std,%p0+1,%B1) CR_TAB ++ AS2 (st,%p0,%A1) CR_TAB ++ AS2 (adiw,%r0,2)); ++ } ++ } ++ ++ *l = 2; ++ return (AS2 (st,%0,%A1) CR_TAB ++ AS2 (st,%0,%B1)); ++ } + fatal_insn ("unknown move insn:",insn); + return ""; + } +=================================================================== +RCS file: /cvsroot/gcc/cvsroot/gcc/gcc/gcc/config/avr/avr.md,v +retrieving revision 1.49 +retrieving revision 1.50 +diff -u -r1.49 -r1.50 +--- gcc/config/avr/avr.md 2005/01/27 18:22:25 1.49 ++++ gcc/config/avr/avr.md 2005/03/06 21:50:36 1.50 +@@ -30,6 +30,8 @@ + ;; j Branch condition. + ;; k Reverse branch condition. + ;; o Displacement for (mem (plus (reg) (const_int))) operands. ++;; p POST_INC or PRE_DEC address as a pointer (X, Y, Z) ++;; r POST_INC or PRE_DEC address as a register (r26, r28, r30) + ;; ~ Output 'r' if not AVR_MEGA. + + ;; UNSPEC usage: diff --git a/devel/avr-gcc-3/files/patch-mega08-tinyx13-can128 b/devel/avr-gcc-3/files/patch-mega08-tinyx13-can128 new file mode 100644 index 000000000000..9719ccb90695 --- /dev/null +++ b/devel/avr-gcc-3/files/patch-mega08-tinyx13-can128 @@ -0,0 +1,124 @@ +--- gcc/config/avr/avr.c.orig 2004-09-27 19:13:55.000000000 -0600 ++++ gcc/config/avr/avr.c 2005-02-01 14:58:40.465250000 -0700 +@@ -175,6 +175,9 @@ + { "at90c8534", 2, "__AVR_AT90C8534__" }, + { "at90s8535", 2, "__AVR_AT90S8535__" }, + { "at86rf401", 2, "__AVR_AT86RF401__" }, ++ /* Classic + MOVW, <= 8K. */ ++ { "attiny13", 2, "__AVR_ATtiny13__" }, ++ { "attiny2313", 2, "__AVR_ATtiny2313__" }, + /* Classic, > 8K. */ + { "avr3", 3, NULL }, + { "atmega103", 3, "__AVR_ATmega103__" }, +@@ -185,6 +188,8 @@ + /* Enhanced, <= 8K. */ + { "avr4", 4, NULL }, + { "atmega8", 4, "__AVR_ATmega8__" }, ++ { "atmega48", 4, "__AVR_ATmega48__" }, ++ { "atmega88", 4, "__AVR_ATmega88__" }, + { "atmega8515", 4, "__AVR_ATmega8515__" }, + { "atmega8535", 4, "__AVR_ATmega8535__" }, + /* Enhanced, > 8K. */ +@@ -193,11 +198,13 @@ + { "atmega161", 5, "__AVR_ATmega161__" }, + { "atmega162", 5, "__AVR_ATmega162__" }, + { "atmega163", 5, "__AVR_ATmega163__" }, ++ { "atmega168", 5, "__AVR_ATmega168__" }, + { "atmega169", 5, "__AVR_ATmega169__" }, + { "atmega32", 5, "__AVR_ATmega32__" }, + { "atmega323", 5, "__AVR_ATmega323__" }, + { "atmega64", 5, "__AVR_ATmega64__" }, + { "atmega128", 5, "__AVR_ATmega128__" }, ++ { "at90can128", 5, "__AVR_AT90CAN128__" }, + { "at94k", 5, "__AVR_AT94K__" }, + /* Assembler only. */ + { "avr1", 1, NULL }, + +--- gcc/config/avr/avr.h.orig 2004-03-08 19:59:55.000000000 -0700 ++++ gcc/config/avr/avr.h 2005-02-01 14:58:40.480875000 -0700 +@@ -2351,12 +2351,12 @@ + Do not define this macro if it does not need to do anything. */ + + #define LINK_SPEC " %{!mmcu*:-m avr2}\ +-%{mmcu=at90s1200|mmcu=attiny1*|mmcu=attiny28:-m avr1} \ +-%{mmcu=attiny22|mmcu=attiny26|mmcu=at90s2*|mmcu=at90s4*|mmcu=at90s8*|mmcu=at90c8*|mmcu=at86rf401:-m avr2}\ ++%{mmcu=at90s1200|mmcu=attiny11|mmcu=attiny12|mmcu=attiny15|mmcu=attiny28:-m avr1} \ ++%{mmcu=attiny22|mmcu=attiny26|mmcu=at90s2*|mmcu=at90s4*|mmcu=at90s8*|mmcu=at90c8*|mmcu=at86rf401|mmcu=attiny13|mmcu=attiny2313:-m avr2}\ + %{mmcu=atmega103|mmcu=atmega603|mmcu=at43*|mmcu=at76*:-m avr3}\ +-%{mmcu=atmega8*:-m avr4}\ +-%{mmcu=atmega16*|mmcu=atmega32*|mmcu=atmega64|mmcu=atmega128|mmcu=at94k:-m avr5}\ +-%{mmcu=atmega64|mmcu=atmega128|mmcu=atmega162|mmcu=atmega169: -Tdata 0x800100} " ++%{mmcu=atmega8*|mmcu=atmega48:-m avr4}\ ++%{mmcu=atmega16*|mmcu=atmega32*|mmcu=atmega64|mmcu=atmega128|mmcu=at90can128|mmcu=at94k:-m avr5}\ ++%{mmcu=atmega48|mmcu=atmega88|mmcu=atmega64|mmcu=atmega128|mmcu=at90can128|mmcu=at90can128|mmcu=atmega162|mmcu=atmega168|mmcu=atmega169: -Tdata 0x800100} " + + /* A C string constant that tells the GCC driver program options to + pass to the linker. It can also specify how to translate options +@@ -2365,7 +2365,7 @@ + Do not define this macro if it does not need to do anything. */ + + #define LIB_SPEC \ +- "%{!mmcu=at90s1*:%{!mmcu=attiny1*:%{!mmcu=attiny28: -lc }}}" ++ "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lc }}}}}" + /* Another C string constant used much like `LINK_SPEC'. The + difference between the two is that `LIB_SPEC' is used at the end + of the command given to the linker. +@@ -2377,7 +2377,7 @@ + /* No libstdc++ for now. Empty string doesn't work. */ + + #define LIBGCC_SPEC \ +- "%{!mmcu=at90s1*:%{!mmcu=attiny1*:%{!mmcu=attiny28: -lgcc }}}" ++ "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc }}}}}" + /* Another C string constant that tells the GCC driver program how + and when to place a reference to `libgcc.a' into the linker + command line. This constant is placed both before and after the +@@ -2421,23 +2421,29 @@ + %{mmcu=at90c8534:crtc8534.o%s} \ + %{mmcu=at90s8535:crts8535.o%s} \ + %{mmcu=at86rf401:crt86401.o%s} \ ++%{mmcu=attiny13:crttn13.o%s} \ ++%{mmcu=attiny2313:crttn2313.o%s} \ + %{mmcu=atmega103|mmcu=avr3:crtm103.o%s} \ + %{mmcu=atmega603:crtm603.o%s} \ + %{mmcu=at43usb320:crt43320.o%s} \ + %{mmcu=at43usb355:crt43355.o%s} \ + %{mmcu=at76c711:crt76711.o%s} \ + %{mmcu=atmega8|mmcu=avr4:crtm8.o%s} \ ++%{mmcu=atmega48:crtm48.o%s} \ ++%{mmcu=atmega88:crtm88.o%s} \ + %{mmcu=atmega8515:crtm8515.o%s} \ + %{mmcu=atmega8535:crtm8535.o%s} \ + %{mmcu=atmega16:crtm16.o%s} \ + %{mmcu=atmega161|mmcu=avr5:crtm161.o%s} \ + %{mmcu=atmega162:crtm162.o%s} \ + %{mmcu=atmega163:crtm163.o%s} \ ++%{mmcu=atmega168:crtm168.o%s} \ + %{mmcu=atmega169:crtm169.o%s} \ + %{mmcu=atmega32:crtm32.o%s} \ + %{mmcu=atmega323:crtm323.o%s} \ + %{mmcu=atmega64:crtm64.o%s} \ + %{mmcu=atmega128:crtm128.o%s} \ ++%{mmcu=at90can128:crtcan128.o%s} \ + %{mmcu=at94k:crtat94k.o%s}" + + #define EXTRA_SPECS {"crt_binutils", CRT_BINUTILS_SPECS}, +--- gcc/config/avr/t-avr.orig 2003-02-27 14:45:33.000000000 -0700 ++++ gcc/config/avr/t-avr 2005-02-01 14:58:40.480875000 -0700 +@@ -50,13 +50,14 @@ + mmcu?avr3=mmcu?at43usb320 mmcu?avr3=mmcu?at43usb355 \ + mmcu?avr3=mmcu?at76c711 \ + mmcu?avr4=mmcu?atmega8515 mmcu?avr4=mmcu?atmega8535 \ +- mmcu?avr4=mmcu?atmega8 \ ++ mmcu?avr4=mmcu?atmega8 mmcu?avr4=mmcu?atmega48 \ ++ mmcu?avr4=mmcu?atmega88 \ + mmcu?avr5=mmcu?atmega161 mmcu?avr5=mmcu?atmega162 \ + mmcu?avr5=mmcu?atmega163 mmcu?avr5=mmcu?atmega169 \ +- mmcu?avr5=mmcu?atmega16 \ ++ mmcu?avr5=mmcu?atmega16 mmcu?avr5=mmcu?atmega168 \ + mmcu?avr5=mmcu?atmega323 mmcu?avr5=mmcu?atmega32 \ + mmcu?avr5=mmcu?atmega64 mmcu?avr5=mmcu?atmega128 \ +- mmcu?avr5=mmcu?at94k ++ mmcu?avr5=mmcu?at94k mmcu?avr5=mmcu?at90can128 + + MULTILIB_EXCEPTIONS = + diff --git a/devel/avr-gcc-3/files/patch-mega325x-mega645x b/devel/avr-gcc-3/files/patch-mega325x-mega645x new file mode 100644 index 000000000000..16f7b5f27f64 --- /dev/null +++ b/devel/avr-gcc-3/files/patch-mega325x-mega645x @@ -0,0 +1,58 @@ +2005-03-04 Eric B. Weddington <ericw@evcohs.com> + + * gcc/config/avr/avr.c (avr_mcu_types): Add entries for atmega325, + atmega3250, atmega645, atmega6450. + * gcc/config/avr/avr.h (LINK_SPEC): Ditto. + (CRT_BINUTILS_SPECS): Ditto. + * gcc/config/avr/t-avr (MULTILIB_MATCHES): Ditto. + +--- gcc/config/avr/avr.c.old 2005-02-10 17:36:47.921875000 -0700 ++++ gcc/config/avr/avr.c 2005-03-04 09:35:26.633875000 -0700 +@@ -202,7 +202,11 @@ + { "atmega169", 5, "__AVR_ATmega169__" }, + { "atmega32", 5, "__AVR_ATmega32__" }, + { "atmega323", 5, "__AVR_ATmega323__" }, ++ { "atmega325", 5, "__AVR_ATmega325__" }, ++ { "atmega3250", 5, "__AVR_ATmega3250__" }, + { "atmega64", 5, "__AVR_ATmega64__" }, ++ { "atmega645", 5, "__AVR_ATmega645__" }, ++ { "atmega6450", 5, "__AVR_ATmega6450__" }, + { "atmega128", 5, "__AVR_ATmega128__" }, + { "at90can128", 5, "__AVR_AT90CAN128__" }, + { "at94k", 5, "__AVR_AT94K__" }, +--- gcc/config/avr/avr.h.old 2005-02-10 17:36:48.015625000 -0700 ++++ gcc/config/avr/avr.h 2005-03-04 09:44:23.118250000 -0700 +@@ -2355,8 +2355,8 @@ + %{mmcu=attiny22|mmcu=attiny26|mmcu=at90s2*|mmcu=at90s4*|mmcu=at90s8*|mmcu=at90c8*|mmcu=at86rf401|mmcu=attiny13|mmcu=attiny2313:-m avr2}\ + %{mmcu=atmega103|mmcu=atmega603|mmcu=at43*|mmcu=at76*:-m avr3}\ + %{mmcu=atmega8*|mmcu=atmega48:-m avr4}\ +-%{mmcu=atmega16*|mmcu=atmega32*|mmcu=atmega64|mmcu=atmega128|mmcu=at90can128|mmcu=at94k:-m avr5}\ +-%{mmcu=atmega48|mmcu=atmega88|mmcu=atmega64|mmcu=atmega128|mmcu=at90can128|mmcu=at90can128|mmcu=atmega162|mmcu=atmega168|mmcu=atmega169: -Tdata 0x800100} " ++%{mmcu=atmega16*|mmcu=atmega32*|mmcu=atmega64*|mmcu=atmega128|mmcu=at90can128|mmcu=at94k:-m avr5}\ ++%{mmcu=atmega325|mmcu=atmega3250|mmcu=atmega48|mmcu=atmega88|mmcu=atmega64|mmcu=atmega645|mmcu=atmega6450|mmcu=atmega128|mmcu=at90can128|mmcu=at90can128|mmcu=atmega162|mmcu=atmega168|mmcu=atmega169: -Tdata 0x800100} " + + /* A C string constant that tells the GCC driver program options to + pass to the linker. It can also specify how to translate options +@@ -2441,7 +2441,11 @@ + %{mmcu=atmega169:crtm169.o%s} \ + %{mmcu=atmega32:crtm32.o%s} \ + %{mmcu=atmega323:crtm323.o%s} \ ++%{mmcu=atmega325:crtm325.o%s} \ ++%{mmcu=atmega3250:crtm3250.o%s} \ + %{mmcu=atmega64:crtm64.o%s} \ ++%{mmcu=atmega645:crtm645.o%s} \ ++%{mmcu=atmega6450:crtm6450.o%s} \ + %{mmcu=atmega128:crtm128.o%s} \ + %{mmcu=at90can128:crtcan128.o%s} \ + %{mmcu=at94k:crtat94k.o%s}" +--- gcc/config/avr/t-avr.old 2005-02-10 17:36:48.031250000 -0700 ++++ gcc/config/avr/t-avr 2005-03-04 09:56:43.790125000 -0700 +@@ -56,6 +56,8 @@ + mmcu?avr5=mmcu?atmega163 mmcu?avr5=mmcu?atmega169 \ + mmcu?avr5=mmcu?atmega16 mmcu?avr5=mmcu?atmega168 \ + mmcu?avr5=mmcu?atmega323 mmcu?avr5=mmcu?atmega32 \ ++ mmcu?avr5=mmcu?atmega325 mmcu?avr5=mmcu?atmega3250 \ ++ mmcu?avr5=mmcu?atmega645 mmcu?avr5=mmcu?atmega6450 \ + mmcu?avr5=mmcu?atmega64 mmcu?avr5=mmcu?atmega128 \ + mmcu?avr5=mmcu?at94k mmcu?avr5=mmcu?at90can128 + |