1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-12-23 22:43:21 +02:00
openwrt-xburst/toolchain/gcc/patches/3.4.6/arm-softfloat.patch.conditional

271 lines
10 KiB
Plaintext
Raw Normal View History

Note... modified my mjn3 to not conflict with the big endian arm patch.
Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT.
Also changed
#define SUBTARGET_EXTRA_ASM_SPEC "\
%{!mcpu=*:-mcpu=xscale} \
%{mhard-float:-mfpu=fpa} \
%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
to
#define SUBTARGET_EXTRA_ASM_SPEC "\
%{mhard-float:-mfpu=fpa} \
%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
in gcc/config/arm/linux-elf.h.
#
# Submitted:
#
# Dimitry Andric <dimitry@andric.com>, 2004-05-01
#
# Description:
#
# Nicholas Pitre released this patch for gcc soft-float support here:
# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html
#
# This version has been adapted to work with gcc 3.4.0.
#
# The original patch doesn't distinguish between softfpa and softvfp modes
# in the way Nicholas Pitre probably meant. His description is:
#
# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for
# floats can be achieved with -mhard-float or with the configure
# --with-float=hard option. If -msoft-float or --with-float=soft is used then
# software float support will be used just like the default but with the legacy
# big endian word ordering for double float representation instead."
#
# Which means the following:
#
# * If you compile without -mhard-float or -msoft-float, you should get
# software floating point, using the VFP format. The produced object file
# should have these flags in its header:
#
# private flags = 600: [APCS-32] [VFP float format] [software FP]
#
# * If you compile with -mhard-float, you should get hardware floating point,
# which always uses the FPA format. Object file header flags should be:
#
# private flags = 0: [APCS-32] [FPA float format]
#
# * If you compile with -msoft-float, you should get software floating point,
# using the FPA format. This is done for compatibility reasons with many
# existing distributions. Object file header flags should be:
#
# private flags = 200: [APCS-32] [FPA float format] [software FP]
#
# The original patch from Nicholas Pitre contained the following constructs:
#
# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
# %{mhard-float:-mfpu=fpa} \
# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
#
# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This
# is probably the reason Robert Schwebel modified it to:
#
# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
# %{mhard-float:-mfpu=fpa} \
# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}"
#
# But this causes the following behaviour:
#
# * If you compile without -mhard-float or -msoft-float, the compiler generates
# software floating point instructions, but *nothing* is passed to the
# assembler, which results in an object file which has flags:
#
# private flags = 0: [APCS-32] [FPA float format]
#
# This is not correct!
#
# * If you compile with -mhard-float, the compiler generates hardware floating
# point instructions, and passes "-mfpu=fpa" to the assembler, which results
# in an object file which has the same flags as in the previous item, but now
# those *are* correct.
#
# * If you compile with -msoft-float, the compiler generates software floating
# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that
# order) to the assembler, which results in an object file with flags:
#
# private flags = 600: [APCS-32] [VFP float format] [software FP]
#
# This is not correct, because the last "-mfpu=" option on the assembler
# command line determines the actual FPU convention used (which should be FPA
# in this case).
#
# Therefore, I modified this patch to get the desired behaviour. Every
# instance of the notation:
#
# %{msoft-float:-mfpu=softfpa -mfpu=softvfp}
#
# was changed to:
#
# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}
#
# I also did the following:
#
# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to
# be consistent with Nicholas' original patch.
# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS
# macros I could find. I think that if you compile without any options, you
# would like to get the defaults. :)
# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
# anymore. (The required functions are now in libgcc.)
diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h
--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600
+++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500
@@ -31,11 +31,16 @@
#define TARGET_VERSION fputs (" (ARM/coff)", stderr)
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
+#define TARGET_DEFAULT \
+ ( ARM_FLAG_SOFT_FLOAT \
+ | ARM_FLAG_VFP \
+ | ARM_FLAG_APCS_32 \
+ | ARM_FLAG_APCS_FRAME \
+ | ARM_FLAG_MMU_TRAPS )
#ifndef MULTILIB_DEFAULTS
#define MULTILIB_DEFAULTS \
- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }
+ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" }
#endif
/* This is COFF, but prefer stabs. */
diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h
--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600
+++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500
@@ -46,7 +46,9 @@
#ifndef SUBTARGET_ASM_FLOAT_SPEC
#define SUBTARGET_ASM_FLOAT_SPEC "\
-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}"
+%{mapcs-float:-mfloat} \
+%{mhard-float:-mfpu=fpa} \
+%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
#endif
#ifndef ASM_SPEC
@@ -106,12 +108,17 @@
#endif
#ifndef TARGET_DEFAULT
-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
+#define TARGET_DEFAULT \
+ ( ARM_FLAG_SOFT_FLOAT \
+ | ARM_FLAG_VFP \
+ | ARM_FLAG_APCS_32 \
+ | ARM_FLAG_APCS_FRAME \
+ | ARM_FLAG_MMU_TRAPS )
#endif
#ifndef MULTILIB_DEFAULTS
#define MULTILIB_DEFAULTS \
- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
+ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
#endif
#define TARGET_ASM_FILE_START_APP_OFF true
diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h
--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500
+++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500
@@ -44,12 +44,26 @@
#define TARGET_LINKER_EMULATION "armelf_linux"
#endif
-/* Default is to use APCS-32 mode. */
+/*
+ * Default is to use APCS-32 mode with soft-vfp.
+ * The old Linux default for floats can be achieved with -mhard-float
+ * or with the configure --with-float=hard option.
+ * If -msoft-float or --with-float=soft is used then software float
+ * support will be used just like the default but with the legacy
+ * big endian word ordering for double float representation instead.
+ */
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT \
- ( ARM_FLAG_APCS_32 | \
- ARM_FLAG_MMU_TRAPS | \
- TARGET_ENDIAN_DEFAULT )
+#define TARGET_DEFAULT \
+ ( ARM_FLAG_APCS_32 \
+ | ARM_FLAG_SOFT_FLOAT \
+ | TARGET_ENDIAN_DEFAULT \
+ | ARM_FLAG_VFP \
+ | ARM_FLAG_MMU_TRAPS )
+
+#undef SUBTARGET_EXTRA_ASM_SPEC
+#define SUBTARGET_EXTRA_ASM_SPEC "\
+%{mhard-float:-mfpu=fpa} \
+%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
@@ -57,7 +71,7 @@
#undef MULTILIB_DEFAULTS
#define MULTILIB_DEFAULTS \
- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" }
#define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
@@ -72,7 +86,7 @@
%{shared:-lc} \
%{!shared:%{profile:-lc_p}%{!profile:-lc}}"
-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
+#define LIBGCC_SPEC "-lgcc"
/* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add
the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux
--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500
+++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500
@@ -4,7 +4,10 @@
LIBGCC2_DEBUG_CFLAGS = -g0
LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
+ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
+ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
+ _fixsfsi _fixunssfsi
# MULTILIB_OPTIONS = mhard-float/msoft-float
# MULTILIB_DIRNAMES = hard-float soft-float
diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h
--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600
+++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500
@@ -30,7 +30,12 @@
/* Default to using APCS-32 and software floating point. */
#ifndef TARGET_DEFAULT
-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
+#define TARGET_DEFAULT \
+ ( ARM_FLAG_SOFT_FLOAT \
+ | ARM_FLAG_VFP \
+ | ARM_FLAG_APCS_32 \
+ | ARM_FLAG_APCS_FRAME \
+ | ARM_FLAG_MMU_TRAPS )
#endif
/* Now we define the strings used to build the spec file. */
diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h
--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500
+++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500
@@ -49,11 +49,12 @@
endian, regardless of the endian-ness of the memory
system. */
-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
- %{mhard-float:-mfpu=fpa} \
- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
+#define SUBTARGET_EXTRA_ASM_SPEC "\
+%{!mcpu=*:-mcpu=xscale} \
+%{mhard-float:-mfpu=fpa} \
+%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
#ifndef MULTILIB_DEFAULTS
#define MULTILIB_DEFAULTS \
- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" }
+ { "mlittle-endian", "mno-thumb-interwork", "marm" }
#endif