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