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