[PATCH] Basic support for MIPS r5900

Richard Sandiford rdsandiford@googlemail.com
Tue Jun 25 21:24:00 GMT 2013


Jürgen Urban <JuergenUrban@gmx.de> writes:
> Am 23.06.2013 um 22:21 schrieb Richard Sandiford <rdsandiford@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



More information about the Gcc-patches mailing list