patches/gcc/3.4.4/arm-softfloat.patch
changeset 301 2be7232a73ac
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/gcc/3.4.4/arm-softfloat.patch	Sat Jul 28 21:34:41 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