patches/gcc/3.4.4/arm-softfloat.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Feb 24 11:00:05 2007 +0000 (2007-02-24)
changeset 1 eeea35fbf182
permissions -rw-r--r--
Add the full crosstool-NG sources to the new repository of its own.
You might just say: 'Yeah! crosstool-NG's got its own repo!".
Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup.
That means I'm putting backups in place in the afternoon.
That also means we've lost history... :-(
     1 Note... modified my mjn3 to not conflict with the big endian arm patch.
     2 Warning!!!  Only the linux target is aware of TARGET_ENDIAN_DEFAULT.
     3 Also changed
     4   #define SUBTARGET_EXTRA_ASM_SPEC "\
     5   %{!mcpu=*:-mcpu=xscale} \
     6   %{mhard-float:-mfpu=fpa} \
     7   %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
     8 to
     9   #define SUBTARGET_EXTRA_ASM_SPEC "\
    10   %{mhard-float:-mfpu=fpa} \
    11   %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
    12 in gcc/config/arm/linux-elf.h.
    13 #
    14 # Submitted:
    15 #
    16 # Dimitry Andric <dimitry@andric.com>, 2004-05-01
    17 #
    18 # Description:
    19 #
    20 # Nicholas Pitre released this patch for gcc soft-float support here: 
    21 # http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html
    22 #
    23 # This version has been adapted to work with gcc 3.4.0.
    24 #
    25 # The original patch doesn't distinguish between softfpa and softvfp modes
    26 # in the way Nicholas Pitre probably meant.  His description is:
    27 #
    28 # "Default is to use APCS-32 mode with soft-vfp.  The old Linux default for
    29 # floats can be achieved with -mhard-float or with the configure
    30 # --with-float=hard option.  If -msoft-float or --with-float=soft is used then
    31 # software float support will be used just like the default but with the legacy
    32 # big endian word ordering for double float representation instead."
    33 #
    34 # Which means the following:
    35 #
    36 # * If you compile without -mhard-float or -msoft-float, you should get
    37 #   software floating point, using the VFP format.  The produced object file
    38 #   should have these flags in its header:
    39 #
    40 #     private flags = 600: [APCS-32] [VFP float format] [software FP]
    41 #
    42 # * If you compile with -mhard-float, you should get hardware floating point,
    43 #   which always uses the FPA format.  Object file header flags should be:
    44 #
    45 #     private flags = 0: [APCS-32] [FPA float format]
    46 #
    47 # * If you compile with -msoft-float, you should get software floating point,
    48 #   using the FPA format.  This is done for compatibility reasons with many
    49 #   existing distributions.  Object file header flags should be:
    50 #
    51 #     private flags = 200: [APCS-32] [FPA float format] [software FP]
    52 #
    53 # The original patch from Nicholas Pitre contained the following constructs:
    54 #
    55 #   #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
    56 #     %{mhard-float:-mfpu=fpa} \
    57 #     %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
    58 #
    59 # However, gcc doesn't accept this ";:" notation, used in the 3rd line.  This
    60 # is probably the reason Robert Schwebel modified it to:
    61 #
    62 #   #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
    63 #     %{mhard-float:-mfpu=fpa} \
    64 #     %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}"
    65 #
    66 # But this causes the following behaviour:
    67 #
    68 # * If you compile without -mhard-float or -msoft-float, the compiler generates
    69 #   software floating point instructions, but *nothing* is passed to the
    70 #   assembler, which results in an object file which has flags:
    71 #
    72 #     private flags = 0: [APCS-32] [FPA float format]
    73 #
    74 #   This is not correct!
    75 #
    76 # * If you compile with -mhard-float, the compiler generates hardware floating
    77 #   point instructions, and passes "-mfpu=fpa" to the assembler, which results
    78 #   in an object file which has the same flags as in the previous item, but now
    79 #   those *are* correct.
    80 #    
    81 # * If you compile with -msoft-float, the compiler generates software floating
    82 #   point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that
    83 #   order) to the assembler, which results in an object file with flags:
    84 #
    85 #   private flags = 600: [APCS-32] [VFP float format] [software FP]
    86 #
    87 #   This is not correct, because the last "-mfpu=" option on the assembler
    88 #   command line determines the actual FPU convention used (which should be FPA
    89 #   in this case).
    90 #
    91 # Therefore, I modified this patch to get the desired behaviour.  Every
    92 # instance of the notation:
    93 #
    94 #   %{msoft-float:-mfpu=softfpa -mfpu=softvfp}
    95 #
    96 # was changed to:
    97 #
    98 #   %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}
    99 #
   100 # I also did the following:
   101 # 
   102 # * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to
   103 #   be consistent with Nicholas' original patch.
   104 # * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS
   105 #   macros I could find.  I think that if you compile without any options, you
   106 #   would like to get the defaults. :)
   107 # * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
   108 #   anymore.  (The required functions are now in libgcc.)
   109 
   110 diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h
   111 --- gcc-3.4.1-old/gcc/config/arm/coff.h	2004-02-24 08:25:22.000000000 -0600
   112 +++ gcc-3.4.1/gcc/config/arm/coff.h	2004-09-02 21:51:15.000000000 -0500
   113 @@ -31,11 +31,16 @@
   114  #define TARGET_VERSION fputs (" (ARM/coff)", stderr)
   115  
   116  #undef  TARGET_DEFAULT
   117 -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
   118 +#define TARGET_DEFAULT		\
   119 +	( ARM_FLAG_SOFT_FLOAT	\
   120 +	| ARM_FLAG_VFP		\
   121 +	| ARM_FLAG_APCS_32	\
   122 +	| ARM_FLAG_APCS_FRAME	\
   123 +	| ARM_FLAG_MMU_TRAPS )
   124  
   125  #ifndef MULTILIB_DEFAULTS
   126  #define MULTILIB_DEFAULTS \
   127 -  { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }
   128 +  { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" }
   129  #endif
   130  
   131  /* This is COFF, but prefer stabs.  */
   132 diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h
   133 --- gcc-3.4.1-old/gcc/config/arm/elf.h	2004-02-24 08:25:22.000000000 -0600
   134 +++ gcc-3.4.1/gcc/config/arm/elf.h	2004-09-02 21:51:15.000000000 -0500
   135 @@ -46,7 +46,9 @@
   136  
   137  #ifndef SUBTARGET_ASM_FLOAT_SPEC
   138  #define SUBTARGET_ASM_FLOAT_SPEC "\
   139 -%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}"
   140 +%{mapcs-float:-mfloat} \
   141 +%{mhard-float:-mfpu=fpa} \
   142 +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
   143  #endif
   144  
   145  #ifndef ASM_SPEC
   146 @@ -106,12 +108,17 @@
   147  #endif
   148  
   149  #ifndef TARGET_DEFAULT
   150 -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
   151 +#define TARGET_DEFAULT		\
   152 +	( ARM_FLAG_SOFT_FLOAT	\
   153 +	| ARM_FLAG_VFP		\
   154 +	| ARM_FLAG_APCS_32	\
   155 +	| ARM_FLAG_APCS_FRAME	\
   156 +	| ARM_FLAG_MMU_TRAPS )
   157  #endif
   158  
   159  #ifndef MULTILIB_DEFAULTS
   160  #define MULTILIB_DEFAULTS \
   161 -  { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
   162 +  { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
   163  #endif
   164  
   165  #define TARGET_ASM_FILE_START_APP_OFF true
   166 diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h
   167 --- gcc-3.4.1-old/gcc/config/arm/linux-elf.h	2004-09-02 21:50:52.000000000 -0500
   168 +++ gcc-3.4.1/gcc/config/arm/linux-elf.h	2004-09-02 22:00:49.000000000 -0500
   169 @@ -44,12 +44,26 @@
   170  #define TARGET_LINKER_EMULATION "armelf_linux"
   171  #endif
   172  
   173 -/* Default is to use APCS-32 mode.  */
   174 +/*
   175 + * Default is to use APCS-32 mode with soft-vfp.
   176 + * The old Linux default for floats can be achieved with -mhard-float
   177 + * or with the configure --with-float=hard option.
   178 + * If -msoft-float or --with-float=soft is used then software float 
   179 + * support will be used just like the default but with the legacy
   180 + * big endian word ordering for double float representation instead.
   181 + */
   182  #undef  TARGET_DEFAULT
   183 -#define TARGET_DEFAULT \
   184 -		( ARM_FLAG_APCS_32 | \
   185 -		  ARM_FLAG_MMU_TRAPS | \
   186 -		  TARGET_ENDIAN_DEFAULT )
   187 +#define TARGET_DEFAULT		\
   188 +	( ARM_FLAG_APCS_32	\
   189 +	| ARM_FLAG_SOFT_FLOAT	\
   190 +	| TARGET_ENDIAN_DEFAULT	\
   191 +	| ARM_FLAG_VFP		\
   192 +	| ARM_FLAG_MMU_TRAPS )
   193 +
   194 +#undef  SUBTARGET_EXTRA_ASM_SPEC
   195 +#define SUBTARGET_EXTRA_ASM_SPEC "\
   196 +%{mhard-float:-mfpu=fpa} \
   197 +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
   198  
   199  #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
   200  
   201 @@ -57,7 +71,7 @@
   202  
   203  #undef  MULTILIB_DEFAULTS
   204  #define MULTILIB_DEFAULTS \
   205 -	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
   206 +	{ "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" }
   207  
   208  #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
   209  
   210 @@ -72,7 +86,7 @@
   211     %{shared:-lc} \
   212     %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
   213  
   214 -#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
   215 +#define LIBGCC_SPEC "-lgcc"
   216  
   217  /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
   218     the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
   219 diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux
   220 --- gcc-3.4.1-old/gcc/config/arm/t-linux	2003-09-20 16:09:07.000000000 -0500
   221 +++ gcc-3.4.1/gcc/config/arm/t-linux	2004-09-02 21:51:15.000000000 -0500
   222 @@ -4,7 +4,10 @@
   223  LIBGCC2_DEBUG_CFLAGS = -g0
   224  
   225  LIB1ASMSRC = arm/lib1funcs.asm
   226 -LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
   227 +LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
   228 +	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
   229 +	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
   230 +	_fixsfsi _fixunssfsi
   231  
   232  # MULTILIB_OPTIONS = mhard-float/msoft-float
   233  # MULTILIB_DIRNAMES = hard-float soft-float
   234 diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h
   235 --- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h	2004-02-24 08:25:22.000000000 -0600
   236 +++ gcc-3.4.1/gcc/config/arm/unknown-elf.h	2004-09-02 21:51:15.000000000 -0500
   237 @@ -30,7 +30,12 @@
   238  
   239  /* Default to using APCS-32 and software floating point.  */
   240  #ifndef TARGET_DEFAULT
   241 -#define TARGET_DEFAULT	(ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
   242 +#define TARGET_DEFAULT		\
   243 +	( ARM_FLAG_SOFT_FLOAT	\
   244 +	| ARM_FLAG_VFP		\
   245 +	| ARM_FLAG_APCS_32	\
   246 +	| ARM_FLAG_APCS_FRAME	\
   247 +	| ARM_FLAG_MMU_TRAPS )
   248  #endif
   249  
   250  /* Now we define the strings used to build the spec file.  */
   251 diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h
   252 --- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h	2003-07-01 18:26:43.000000000 -0500
   253 +++ gcc-3.4.1/gcc/config/arm/xscale-elf.h	2004-09-02 21:51:15.000000000 -0500
   254 @@ -49,11 +49,12 @@
   255  		     endian, regardless of the endian-ness of the memory
   256  		     system.  */
   257  		     
   258 -#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
   259 -  %{mhard-float:-mfpu=fpa} \
   260 -  %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
   261 +#define SUBTARGET_EXTRA_ASM_SPEC "\
   262 +%{!mcpu=*:-mcpu=xscale} \
   263 +%{mhard-float:-mfpu=fpa} \
   264 +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
   265  
   266  #ifndef MULTILIB_DEFAULTS
   267  #define MULTILIB_DEFAULTS \
   268 -  { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" }
   269 +  { "mlittle-endian", "mno-thumb-interwork", "marm" }
   270  #endif