1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/patches/gcc/3.4.4/arm-softfloat.patch Sun May 20 09:27:05 2007 +0000
1.3 @@ -0,0 +1,270 @@
1.4 +Note... modified my mjn3 to not conflict with the big endian arm patch.
1.5 +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT.
1.6 +Also changed
1.7 + #define SUBTARGET_EXTRA_ASM_SPEC "\
1.8 + %{!mcpu=*:-mcpu=xscale} \
1.9 + %{mhard-float:-mfpu=fpa} \
1.10 + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
1.11 +to
1.12 + #define SUBTARGET_EXTRA_ASM_SPEC "\
1.13 + %{mhard-float:-mfpu=fpa} \
1.14 + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
1.15 +in gcc/config/arm/linux-elf.h.
1.16 +#
1.17 +# Submitted:
1.18 +#
1.19 +# Dimitry Andric <dimitry@andric.com>, 2004-05-01
1.20 +#
1.21 +# Description:
1.22 +#
1.23 +# Nicholas Pitre released this patch for gcc soft-float support here:
1.24 +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html
1.25 +#
1.26 +# This version has been adapted to work with gcc 3.4.0.
1.27 +#
1.28 +# The original patch doesn't distinguish between softfpa and softvfp modes
1.29 +# in the way Nicholas Pitre probably meant. His description is:
1.30 +#
1.31 +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for
1.32 +# floats can be achieved with -mhard-float or with the configure
1.33 +# --with-float=hard option. If -msoft-float or --with-float=soft is used then
1.34 +# software float support will be used just like the default but with the legacy
1.35 +# big endian word ordering for double float representation instead."
1.36 +#
1.37 +# Which means the following:
1.38 +#
1.39 +# * If you compile without -mhard-float or -msoft-float, you should get
1.40 +# software floating point, using the VFP format. The produced object file
1.41 +# should have these flags in its header:
1.42 +#
1.43 +# private flags = 600: [APCS-32] [VFP float format] [software FP]
1.44 +#
1.45 +# * If you compile with -mhard-float, you should get hardware floating point,
1.46 +# which always uses the FPA format. Object file header flags should be:
1.47 +#
1.48 +# private flags = 0: [APCS-32] [FPA float format]
1.49 +#
1.50 +# * If you compile with -msoft-float, you should get software floating point,
1.51 +# using the FPA format. This is done for compatibility reasons with many
1.52 +# existing distributions. Object file header flags should be:
1.53 +#
1.54 +# private flags = 200: [APCS-32] [FPA float format] [software FP]
1.55 +#
1.56 +# The original patch from Nicholas Pitre contained the following constructs:
1.57 +#
1.58 +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
1.59 +# %{mhard-float:-mfpu=fpa} \
1.60 +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
1.61 +#
1.62 +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This
1.63 +# is probably the reason Robert Schwebel modified it to:
1.64 +#
1.65 +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
1.66 +# %{mhard-float:-mfpu=fpa} \
1.67 +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}"
1.68 +#
1.69 +# But this causes the following behaviour:
1.70 +#
1.71 +# * If you compile without -mhard-float or -msoft-float, the compiler generates
1.72 +# software floating point instructions, but *nothing* is passed to the
1.73 +# assembler, which results in an object file which has flags:
1.74 +#
1.75 +# private flags = 0: [APCS-32] [FPA float format]
1.76 +#
1.77 +# This is not correct!
1.78 +#
1.79 +# * If you compile with -mhard-float, the compiler generates hardware floating
1.80 +# point instructions, and passes "-mfpu=fpa" to the assembler, which results
1.81 +# in an object file which has the same flags as in the previous item, but now
1.82 +# those *are* correct.
1.83 +#
1.84 +# * If you compile with -msoft-float, the compiler generates software floating
1.85 +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that
1.86 +# order) to the assembler, which results in an object file with flags:
1.87 +#
1.88 +# private flags = 600: [APCS-32] [VFP float format] [software FP]
1.89 +#
1.90 +# This is not correct, because the last "-mfpu=" option on the assembler
1.91 +# command line determines the actual FPU convention used (which should be FPA
1.92 +# in this case).
1.93 +#
1.94 +# Therefore, I modified this patch to get the desired behaviour. Every
1.95 +# instance of the notation:
1.96 +#
1.97 +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp}
1.98 +#
1.99 +# was changed to:
1.100 +#
1.101 +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}
1.102 +#
1.103 +# I also did the following:
1.104 +#
1.105 +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to
1.106 +# be consistent with Nicholas' original patch.
1.107 +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS
1.108 +# macros I could find. I think that if you compile without any options, you
1.109 +# would like to get the defaults. :)
1.110 +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
1.111 +# anymore. (The required functions are now in libgcc.)
1.112 +
1.113 +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h
1.114 +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600
1.115 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500
1.116 +@@ -31,11 +31,16 @@
1.117 + #define TARGET_VERSION fputs (" (ARM/coff)", stderr)
1.118 +
1.119 + #undef TARGET_DEFAULT
1.120 +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
1.121 ++#define TARGET_DEFAULT \
1.122 ++ ( ARM_FLAG_SOFT_FLOAT \
1.123 ++ | ARM_FLAG_VFP \
1.124 ++ | ARM_FLAG_APCS_32 \
1.125 ++ | ARM_FLAG_APCS_FRAME \
1.126 ++ | ARM_FLAG_MMU_TRAPS )
1.127 +
1.128 + #ifndef MULTILIB_DEFAULTS
1.129 + #define MULTILIB_DEFAULTS \
1.130 +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }
1.131 ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" }
1.132 + #endif
1.133 +
1.134 + /* This is COFF, but prefer stabs. */
1.135 +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h
1.136 +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600
1.137 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500
1.138 +@@ -46,7 +46,9 @@
1.139 +
1.140 + #ifndef SUBTARGET_ASM_FLOAT_SPEC
1.141 + #define SUBTARGET_ASM_FLOAT_SPEC "\
1.142 +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}"
1.143 ++%{mapcs-float:-mfloat} \
1.144 ++%{mhard-float:-mfpu=fpa} \
1.145 ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
1.146 + #endif
1.147 +
1.148 + #ifndef ASM_SPEC
1.149 +@@ -106,12 +108,17 @@
1.150 + #endif
1.151 +
1.152 + #ifndef TARGET_DEFAULT
1.153 +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
1.154 ++#define TARGET_DEFAULT \
1.155 ++ ( ARM_FLAG_SOFT_FLOAT \
1.156 ++ | ARM_FLAG_VFP \
1.157 ++ | ARM_FLAG_APCS_32 \
1.158 ++ | ARM_FLAG_APCS_FRAME \
1.159 ++ | ARM_FLAG_MMU_TRAPS )
1.160 + #endif
1.161 +
1.162 + #ifndef MULTILIB_DEFAULTS
1.163 + #define MULTILIB_DEFAULTS \
1.164 +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
1.165 ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
1.166 + #endif
1.167 +
1.168 + #define TARGET_ASM_FILE_START_APP_OFF true
1.169 +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h
1.170 +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500
1.171 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500
1.172 +@@ -44,12 +44,26 @@
1.173 + #define TARGET_LINKER_EMULATION "armelf_linux"
1.174 + #endif
1.175 +
1.176 +-/* Default is to use APCS-32 mode. */
1.177 ++/*
1.178 ++ * Default is to use APCS-32 mode with soft-vfp.
1.179 ++ * The old Linux default for floats can be achieved with -mhard-float
1.180 ++ * or with the configure --with-float=hard option.
1.181 ++ * If -msoft-float or --with-float=soft is used then software float
1.182 ++ * support will be used just like the default but with the legacy
1.183 ++ * big endian word ordering for double float representation instead.
1.184 ++ */
1.185 + #undef TARGET_DEFAULT
1.186 +-#define TARGET_DEFAULT \
1.187 +- ( ARM_FLAG_APCS_32 | \
1.188 +- ARM_FLAG_MMU_TRAPS | \
1.189 +- TARGET_ENDIAN_DEFAULT )
1.190 ++#define TARGET_DEFAULT \
1.191 ++ ( ARM_FLAG_APCS_32 \
1.192 ++ | ARM_FLAG_SOFT_FLOAT \
1.193 ++ | TARGET_ENDIAN_DEFAULT \
1.194 ++ | ARM_FLAG_VFP \
1.195 ++ | ARM_FLAG_MMU_TRAPS )
1.196 ++
1.197 ++#undef SUBTARGET_EXTRA_ASM_SPEC
1.198 ++#define SUBTARGET_EXTRA_ASM_SPEC "\
1.199 ++%{mhard-float:-mfpu=fpa} \
1.200 ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
1.201 +
1.202 + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
1.203 +
1.204 +@@ -57,7 +71,7 @@
1.205 +
1.206 + #undef MULTILIB_DEFAULTS
1.207 + #define MULTILIB_DEFAULTS \
1.208 +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
1.209 ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" }
1.210 +
1.211 + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
1.212 +
1.213 +@@ -72,7 +86,7 @@
1.214 + %{shared:-lc} \
1.215 + %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
1.216 +
1.217 +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
1.218 ++#define LIBGCC_SPEC "-lgcc"
1.219 +
1.220 + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add
1.221 + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
1.222 +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux
1.223 +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500
1.224 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500
1.225 +@@ -4,7 +4,10 @@
1.226 + LIBGCC2_DEBUG_CFLAGS = -g0
1.227 +
1.228 + LIB1ASMSRC = arm/lib1funcs.asm
1.229 +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
1.230 ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
1.231 ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
1.232 ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
1.233 ++ _fixsfsi _fixunssfsi
1.234 +
1.235 + # MULTILIB_OPTIONS = mhard-float/msoft-float
1.236 + # MULTILIB_DIRNAMES = hard-float soft-float
1.237 +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h
1.238 +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600
1.239 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500
1.240 +@@ -30,7 +30,12 @@
1.241 +
1.242 + /* Default to using APCS-32 and software floating point. */
1.243 + #ifndef TARGET_DEFAULT
1.244 +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
1.245 ++#define TARGET_DEFAULT \
1.246 ++ ( ARM_FLAG_SOFT_FLOAT \
1.247 ++ | ARM_FLAG_VFP \
1.248 ++ | ARM_FLAG_APCS_32 \
1.249 ++ | ARM_FLAG_APCS_FRAME \
1.250 ++ | ARM_FLAG_MMU_TRAPS )
1.251 + #endif
1.252 +
1.253 + /* Now we define the strings used to build the spec file. */
1.254 +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h
1.255 +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500
1.256 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500
1.257 +@@ -49,11 +49,12 @@
1.258 + endian, regardless of the endian-ness of the memory
1.259 + system. */
1.260 +
1.261 +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
1.262 +- %{mhard-float:-mfpu=fpa} \
1.263 +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
1.264 ++#define SUBTARGET_EXTRA_ASM_SPEC "\
1.265 ++%{!mcpu=*:-mcpu=xscale} \
1.266 ++%{mhard-float:-mfpu=fpa} \
1.267 ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
1.268 +
1.269 + #ifndef MULTILIB_DEFAULTS
1.270 + #define MULTILIB_DEFAULTS \
1.271 +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" }
1.272 ++ { "mlittle-endian", "mno-thumb-interwork", "marm" }
1.273 + #endif