diff options
| author | Peter Wemm <peter@FreeBSD.org> | 2003-05-24 20:58:47 +0000 |
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 2003-05-24 20:58:47 +0000 |
| commit | cd51f0035e64cf8045a944a9abdc7749c52713a2 (patch) | |
| tree | 2cf84d1950e04e5b9a7118ec721d6be42e0ee499 /gnu/usr.bin/cc | |
| parent | fb4aa34f3bb500dc44073b7387ebf4cad93803b8 (diff) | |
Notes
Diffstat (limited to 'gnu/usr.bin/cc')
| -rw-r--r-- | gnu/usr.bin/cc/cc_int/Makefile | 15 | ||||
| -rw-r--r-- | gnu/usr.bin/cc/cc_int/amd64.patch | 54 |
2 files changed, 67 insertions, 2 deletions
diff --git a/gnu/usr.bin/cc/cc_int/Makefile b/gnu/usr.bin/cc/cc_int/Makefile index ef892e7adcd1..bfc7b7705fbc 100644 --- a/gnu/usr.bin/cc/cc_int/Makefile +++ b/gnu/usr.bin/cc/cc_int/Makefile @@ -23,8 +23,19 @@ SRCS= c-common.c c-format.c \ toplev.c tree.c unroll.c varasm.c version.c xcoffout.c \ alias.c bitmap.c dyn-string.c \ gcse.c genrtl.c profile.c regmove.c varray.c \ - attribs.c cselib.c debug.c rtl-error.c tree-dump.c tree-inline.c \ - ${GCC_CPU}.c + attribs.c cselib.c debug.c rtl-error.c tree-dump.c tree-inline.c + +.if ${TARGET_ARCH} != "amd64" +SRCS+= ${GCC_CPU}.c +.else +SRCS+= i386-hacked.c +CLEANFILES+= i386-hacked.c + +i386-hacked.c: ${GCCDIR}/config/i386/i386.c amd64.patch + rm -f i386-hacked.c # in case p4 readonly copied + cp ${GCCDIR}/config/i386/i386.c i386-hacked.c + patch -b .orig < ${.CURDIR}/amd64.patch +.endif SRCS+= bb-reorder.c conflict.c ggc-common.c \ ggc-page.c ifcvt.c lists.c predict.c regrename.c resource.c sibcall.c \ diff --git a/gnu/usr.bin/cc/cc_int/amd64.patch b/gnu/usr.bin/cc/cc_int/amd64.patch new file mode 100644 index 000000000000..2c5078099b56 --- /dev/null +++ b/gnu/usr.bin/cc/cc_int/amd64.patch @@ -0,0 +1,54 @@ +# $FreeBSD$ +# The first chunk is to stop gcc generating stupid assembler output +# for jump tables. This change is already in gcc-3.3. +# The second chunk is to stop gcc doing an ICE on libc/stdio/vfprintf.c. +# This one has been committed to the gcc mainline and is due to go in +# gcc-3.3.1, but is *not* in gcc-3.3-release. Its changelog: +# * config/i386/i386.c (ix86_split_long_move): Fix base register +# mode for XFmode splits for TARGET_64BIT. + +Index: i386-hacked.c +=========================================================================== +--- i386-hacked.c 2003/05/24 10:50:22 #11 ++++ i386-hacked.c 2003/05/24 10:50:22 +@@ -6764,7 +6764,7 @@ + int value, rel; + { + if (TARGET_64BIT) +- fprintf (file, "%s%s%d-.+(.-%s%d)\n", ++ fprintf (file, "%s%s%d-%s%d\n", + ASM_LONG, LPREFIX, value, LPREFIX, rel); + else if (HAVE_AS_GOTOFF_IN_DATA) + fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value); +@@ -8823,15 +8823,24 @@ + Do an lea to the last part and use only one colliding move. */ + else if (collisions > 1) + { ++ rtx base; ++ + collisions = 1; +- emit_insn (gen_rtx_SET (VOIDmode, part[0][nparts - 1], +- XEXP (part[1][0], 0))); +- part[1][0] = change_address (part[1][0], +- TARGET_64BIT ? DImode : SImode, +- part[0][nparts - 1]); +- part[1][1] = adjust_address (part[1][0], VOIDmode, UNITS_PER_WORD); ++ ++ base = part[0][nparts - 1]; ++ ++ /* Handle the case when the last part isn't valid for lea. ++ Happens in 64-bit mode storing the 12-byte XFmode. */ ++ if (GET_MODE (base) != Pmode) ++ base = gen_rtx_REG (Pmode, REGNO (base)); ++ ++ emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0))); ++ part[1][0] = replace_equiv_address (part[1][0], base); ++ part[1][1] = replace_equiv_address (part[1][1], ++ plus_constant (base, UNITS_PER_WORD)); + if (nparts == 3) +- part[1][2] = adjust_address (part[1][0], VOIDmode, 8); ++ part[1][2] = replace_equiv_address (part[1][2], ++ plus_constant (base, 8)); + } + } + |
