Jürgen Urban <juergenur...@gmx.de> writes: > Am 23.06.2013 um 22:21 schrieb Richard Sandiford <rdsandif...@googlemail.com>: >>> In the native PS2SDK (i.e. no Linux) I detected that there are undefined >>> references to `__fixtfsi', `__floatsitf', `__subtf3', `__multf3', >>> __extenddftf2', `__lttf2' and `__gttf2'. These are the functions for >>> handling "long double". >>> There is a fix needed for this in libgcc. I attached 2 patches to this >>> e-mail. There should be only one of the patches used to fix this. >>> The first one fixes the problem for all mips systems. The second one >>> fixes this only for r5900. I think it is a general problem. I assume the >>> undefined references could appear on all mips64 systems which are not >>> Linux. So the first patch should be applied. >> >> The second patch is right. Not all targets have 128-bit long doubles, >> so t-tpbit is intentionally an opt-in rather than opt-out thing. >> >> E.g. mips*-sde-elf and mips*-mti-elf both use: >> >> #undef LONG_DOUBLE_TYPE_SIZE >> #define LONG_DOUBLE_TYPE_SIZE 64 >> >> to get a form of n32 in which long doubles are the same as doubles. >> >> Do you want to stick with 128-bit long doubles for PS2, or would you >> prefer to do what SDE does? > > I prefer shorter long doubles because of the performance impact. For 32 > bit hard float we may need it. Can you change it or do I need to submit > a patch?
OK, could you give this a go? Thanks, Richard gcc/ * config.gcc (mips*-mti-elf*, mips*-sde-elf*, mips64r5900-*-elf*) (mips64r5900el-*-elf*): Include mips/n32-elf.h. * config/mips/sde.h (LOCAL_LABEL_PREFIX, NO_DOLLAR_IN_LABEL) (LONG_DOUBLE_TYPE_SIZE, LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Move to... * config/mips/n32-elf.h: ...this new file. Index: gcc/config.gcc =================================================================== --- gcc/config.gcc 2013-06-25 22:15:25.414731542 +0100 +++ gcc/config.gcc 2013-06-25 22:15:29.076761150 +0100 @@ -1850,12 +1850,12 @@ mips*-*-linux*) # Linux MIPS, either esac ;; mips*-mti-elf*) - tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/sde.h mips/mti-elf.h" + tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/n32-elf.h mips/sde.h mips/mti-elf.h" tmake_file="mips/t-mti-elf" tm_defines="${tm_defines} MIPS_ISA_DEFAULT=33 MIPS_ABI_DEFAULT=ABI_32" ;; mips*-sde-elf*) - tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/sde.h" + tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/n32-elf.h mips/sde.h" tmake_file="mips/t-sde" extra_options="${extra_options} mips/sde.opt" case "${with_newlib}" in @@ -1937,7 +1937,7 @@ mips-*-elf* | mipsel-*-elf* | mipsr5900- tmake_file="mips/t-elf" ;; mips64r5900-*-elf* | mips64r5900el-*-elf*) - tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h" + tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/n32-elf.h" tmake_file="mips/t-elf" tm_defines="${tm_defines} MIPS_ISA_DEFAULT=3 MIPS_ABI_DEFAULT=ABI_N32" ;; Index: gcc/config/mips/sde.h =================================================================== --- gcc/config/mips/sde.h 2013-06-25 22:15:27.563748916 +0100 +++ gcc/config/mips/sde.h 2013-06-25 22:15:33.443796467 +0100 @@ -89,23 +89,6 @@ #define SIZE_TYPE "long unsigned int" #undef PTRDIFF_TYPE #define PTRDIFF_TYPE "long int" -/* Use standard ELF-style local labels (not '$' as on early Irix). */ -#undef LOCAL_LABEL_PREFIX -#define LOCAL_LABEL_PREFIX "." - -/* Use periods rather than dollar signs in special g++ assembler names. */ -#define NO_DOLLAR_IN_LABEL - -/* Currently we don't support 128bit long doubles, so for now we force - n32 to be 64bit. */ -#undef LONG_DOUBLE_TYPE_SIZE -#define LONG_DOUBLE_TYPE_SIZE 64 - -#ifdef IN_LIBGCC2 -#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#endif - /* Force all .init and .fini entries to be 32-bit, not mips16, so that in a mixed environment they are all the same mode. The crti.asm and crtn.asm files will also be compiled as 32-bit due to the Index: gcc/config/mips/n32-elf.h =================================================================== --- /dev/null 2013-06-17 18:11:16.259026486 +0100 +++ gcc/config/mips/n32-elf.h 2013-06-25 22:15:29.076761150 +0100 @@ -0,0 +1,35 @@ +/* Definitions of target machine for GNU compiler. + n32 for embedded systems. + Copyright (C) 2003-2013 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +/* Use standard ELF-style local labels (not '$' as on early Irix). */ +#undef LOCAL_LABEL_PREFIX +#define LOCAL_LABEL_PREFIX "." + +/* Use periods rather than dollar signs in special g++ assembler names. */ +#define NO_DOLLAR_IN_LABEL + +/* Force n32 to use 64-bit long doubles. */ +#undef LONG_DOUBLE_TYPE_SIZE +#define LONG_DOUBLE_TYPE_SIZE 64 + +#ifdef IN_LIBGCC2 +#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 +#endif