This is the mail archive of the libc-ports@sources.redhat.com mailing list for the libc-ports project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 1/2] Enable ppc476 processor: Sysdeps


The following patch set provides 476fp processor support to glibc ports.

The attached patch provides the necessary sysdeps structure.

Configuration is enabled using --with-cpu=476fp or --with-cpu=476
--with-fp

These patches require a very recent GCC and binutils that have support
for the ppc476fp instruction set.

Ryan S. Arnold
IBM Linux Technology Center

2010-01-05  Ryan S. Arnold  <rsa@us.ibm.com>

	* sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/fpu/Implies: Forward
	the implies to ../../476/fpu/.  This is so that --with-cpu=476fp
	works as well as --with-cpu=476 --with-fp.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/Implies: Forward
	the implies to ../../476/.  This is so that --with-cpu=476fp
	works as well as --with-cpu=476 --with-fp.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/476/fpu/Implies: Implies
	powerpc/powerpc32/476/fpu.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/464/fpu/Implies: Implies
	powerpc/powerpc32/464/fpu.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/440/fpu/Implies: Implies
	powerpc/powerpc32/440/fpu.
	* sysdeps/powerpc/powerpc32/476/fpu/Implies: Implies 464/fpu.
	* sysdeps/powerpc/powerpc32/476/Implies: Implies 464/
	* sysdeps/powerpc/powerpc32/464/fpu/Implies: Implies 440/fpu.
	* sysdeps/powerpc/powerpc32/464/Implies: Implies 440/.
	* sysdeps/powerpc/powerpc32/440/fpu/Implies: Implies powerpc32/fpu.
	* sysdeps/powerpc/powerpc32/440/Implies: Implies powerpc32/.
	* sysdeps/powerpc/powerpc32/Makefile (with-fp): Add -mhard-float to
	+cflags, ASFLAGS, and sysdep-LDFLAGS.
	* sysdeps/powerpc/dl-procinfo.c: New file.  Clone of non-ports version
	with ppc4xx variants.
	* sysdeps/powerpc/dl-procinfo.h: New file.  Clone of non-ports version
	with ppc4xx variants.

diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/fpu/Implies glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/fpu/Implies
--- glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/fpu/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/fpu/Implies	2009-12-04 11:36:50.000000000 -0600
@@ -0,0 +1,12 @@
+# This `476fp/fpu' directory is simply here to appease --with-cpu=476fp so
+# that one may pass the official processor/abi designation of 476fp to glibc's
+# configuration.  The preferred method is `--with-cpu=476 --with-fp' which
+# will traverse the ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476/fpu
+# path implicitly.
+
+# Don't put any files in this directory.  Put non-fpu 476 code in the `476'
+# directory and put fpu 476 code in the `476/fpu' per the current precident.
+# There should be no ports/sysdeps/powerpc/powerpc32/476fp directory, so don't
+# add one.
+
+powerpc/powerpc32/476/fpu/
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/dl-procinfo.c glibc.new/ports/sysdeps/powerpc/dl-procinfo.c
--- glibc/ports/sysdeps/powerpc/dl-procinfo.c	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/dl-procinfo.c	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1,95 @@
+/* Data for processor capability information.  PowerPC version.
+   Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* This information must be kept in sync with the _DL_HWCAP_COUNT and
+   _DL_PLATFORM_COUNT definitions in procinfo.h.
+
+   If anything should be added here check whether the size of each string
+   is still ok with the given array size.
+
+   All the #ifdefs in the definitions are quite irritating but
+   necessary if we want to avoid duplicating the information.  There
+   are three different modes:
+
+   - PROCINFO_DECL is defined.  This means we are only interested in
+     declarations.
+
+   - PROCINFO_DECL is not defined:
+
+     + if SHARED is defined the file is included in an array
+       initializer.  The .element = { ... } syntax is needed.
+
+     + if SHARED is not defined a normal array initialization is
+       needed.
+  */
+
+#ifndef PROCINFO_CLASS
+# define PROCINFO_CLASS
+#endif
+
+#if !defined PROCINFO_DECL && defined SHARED
+  ._dl_powerpc_cap_flags
+#else
+PROCINFO_CLASS const char _dl_powerpc_cap_flags[25][10]
+#endif
+#ifndef PROCINFO_DECL
+= {
+    "vsx", 
+    "arch_2_06", "power6x", "dfp", "pa6t",
+    "arch_2_05", "ic_snoop", "smt", "booke",
+    "cellbe", "power5+", "power5", "power4",
+    "notb", "efpdouble", "efpsingle", "spe",
+    "ucache", "4xxmac", "mmu", "fpu",
+    "altivec", "ppc601", "ppc64", "ppc32",
+  }
+#endif
+#if !defined SHARED || defined PROCINFO_DECL
+;
+#else
+,
+#endif
+
+#if !defined PROCINFO_DECL && defined SHARED
+  ._dl_powerpc_platforms
+#else
+PROCINFO_CLASS const char _dl_powerpc_platforms[11][12]
+#endif
+#ifndef PROCINFO_DECL
+= {
+    [PPC_PLATFORM_POWER4] = "power4",
+    [PPC_PLATFORM_PPC970] = "ppc970",
+    [PPC_PLATFORM_POWER5] = "power5",
+    [PPC_PLATFORM_POWER5_PLUS] = "power5+",
+    [PPC_PLATFORM_POWER6] = "power6",
+    [PPC_PLATFORM_CELL_BE] = "ppc-cell-be",
+    [PPC_PLATFORM_POWER6X] = "power6x",
+    [PPC_PLATFORM_POWER7] = "power7",
+    [PPC_PLATFORM_PPC440] = "ppc440",
+    [PPC_PLATFORM_PPC464] = "ppc464",
+    [PPC_PLATFORM_PPC476] = "ppc476"
+  }
+#endif
+#if !defined SHARED || defined PROCINFO_DECL
+;
+#else
+,
+#endif
+
+#undef PROCINFO_DECL
+#undef PROCINFO_CLASS
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/dl-procinfo.h glibc.new/ports/sysdeps/powerpc/dl-procinfo.h
--- glibc/ports/sysdeps/powerpc/dl-procinfo.h	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/dl-procinfo.h	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1,163 @@
+/* Processor capability information handling macros.  PowerPC version.
+   Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _DL_PROCINFO_H
+#define _DL_PROCINFO_H	1
+
+#include <ldsodefs.h>
+#include <sysdep.h>		/* This defines the PPC_FEATURE_* macros.  */
+
+/* There are 25 bits used, but they are bits 7..31.  */
+#define _DL_HWCAP_FIRST		7
+#define _DL_HWCAP_COUNT		32
+
+/* These bits influence library search.  */
+#define HWCAP_IMPORTANT		(PPC_FEATURE_HAS_ALTIVEC \
+				+ PPC_FEATURE_HAS_DFP)
+
+#define _DL_PLATFORMS_COUNT	11
+
+#define _DL_FIRST_PLATFORM      32
+/* Mask to filter out platforms.  */
+#define _DL_HWCAP_PLATFORM      (((1ULL << _DL_PLATFORMS_COUNT) - 1) \
+                                 << _DL_FIRST_PLATFORM)
+
+/* Platform bits (relative to _DL_FIRST_PLATFORM).  */
+#define PPC_PLATFORM_POWER4		0
+#define PPC_PLATFORM_PPC970		1
+#define PPC_PLATFORM_POWER5		2
+#define PPC_PLATFORM_POWER5_PLUS	3
+#define PPC_PLATFORM_POWER6		4
+#define PPC_PLATFORM_CELL_BE		5
+#define PPC_PLATFORM_POWER6X		6
+#define PPC_PLATFORM_POWER7		7
+#define PPC_PLATFORM_PPC440		8
+#define PPC_PLATFORM_PPC464		9
+#define PPC_PLATFORM_PPC476		10
+
+static inline const char *
+__attribute__ ((unused))
+_dl_hwcap_string (int idx)
+{
+  return GLRO(dl_powerpc_cap_flags)[idx - _DL_HWCAP_FIRST];
+}
+
+static inline const char *
+__attribute__ ((unused))
+_dl_platform_string (int idx)
+{
+  return GLRO(dl_powerpc_platforms)[idx - _DL_FIRST_PLATFORM];
+}
+
+static inline int
+__attribute__ ((unused))
+_dl_string_hwcap (const char *str)
+{
+  for (int i = _DL_HWCAP_FIRST; i < _DL_HWCAP_COUNT; ++i)
+    if (strcmp (str, _dl_hwcap_string (i)) == 0)
+      return i;
+  return -1;
+}
+
+static inline int
+__attribute__ ((unused, always_inline))
+_dl_string_platform (const char *str)
+{
+  if (str == NULL)
+    return -1;
+
+  if (strncmp (str, GLRO(dl_powerpc_platforms)[PPC_PLATFORM_POWER4], 5) == 0)
+    {
+      int ret;
+      str += 5;
+      switch (*str)
+	{
+	case '4':
+	  ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER4;
+	  break;
+	case '5':
+	  ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER5;
+	  if (str[1] == '+')
+	    {
+	      ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER5_PLUS;
+	      ++str;
+	    }
+	  break;
+	case '6':
+	  ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER6;
+	  if (str[1] == 'x')
+	    {
+	      ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER6X;
+	      ++str;
+	    }
+	  break;
+	case '7':
+	  ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER7;
+	  break;
+	default:
+	  return -1;
+	}
+      if (str[1] == '\0')
+	return ret;
+    }
+  else if (strncmp (str, GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC970],
+		    3) == 0)
+    {
+      if (strcmp (str + 3, GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC970]
+			   + 3) == 0)
+	return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC970;
+      else if (strcmp (str + 3,
+		       GLRO(dl_powerpc_platforms)[PPC_PLATFORM_CELL_BE] + 3)
+	       == 0)
+	return _DL_FIRST_PLATFORM + PPC_PLATFORM_CELL_BE;
+      else if (strcmp (str + 3,
+		       GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC440] + 3)
+	       == 0)
+	return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC440;
+      else if (strcmp (str + 3,
+		       GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC464] + 3)
+	       == 0)
+	return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC464;
+      else if (strcmp (str + 3,
+		       GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC476] + 3)
+	       == 0)
+	return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC476;
+    }
+
+  return -1;
+}
+
+#ifdef IS_IN_rtld
+static inline int
+__attribute__ ((unused))
+_dl_procinfo (int word)
+{
+  _dl_printf ("AT_HWCAP:       ");
+
+  for (int i = _DL_HWCAP_FIRST; i < _DL_HWCAP_COUNT; ++i)
+    if (word & (1 << i))
+      _dl_printf (" %s", _dl_hwcap_string (i));
+
+  _dl_printf ("\n");
+
+  return 0;
+}
+#endif
+
+#endif /* dl-procinfo.h */
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/powerpc32/Makefile glibc.new/ports/sysdeps/powerpc/powerpc32/Makefile
--- glibc/ports/sysdeps/powerpc/powerpc32/Makefile	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/powerpc32/Makefile	2009-12-21 09:11:44.000000000 -0600
@@ -0,0 +1,8 @@
+# Some Powerpc32 variants assume soft-fp is the default even though there is
+# an fp variant so provide -mhard-float if --with-fp is explicitly passed.
+
+ifeq ($(with-fp),yes)
++cflags += -mhard-float
+ASFLAGS += -mhard-float
+sysdep-LDFLAGS += -mhard-float
+endif
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/440/fpu/Implies glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/440/fpu/Implies
--- glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/440/fpu/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/440/fpu/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1,3 @@
+# Make sure this comes before the powerpc/powerpc32/fpu that's
+# listed in unix/sysv/linux/powerpc/powerpc32/fpu/Implies.
+powerpc/powerpc32/440/fpu
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/464/fpu/Implies glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/464/fpu/Implies
--- glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/464/fpu/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/464/fpu/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1,3 @@
+# Make sure this comes before the powerpc/powerpc32/fpu that's
+# listed in unix/sysv/linux/powerpc/powerpc32/fpu/Implies.
+powerpc/powerpc32/464/fpu
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476/fpu/Implies glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476/fpu/Implies
--- glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476/fpu/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476/fpu/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1,3 @@
+# Make sure this comes before the powerpc/powerpc32/fpu that's
+# listed in unix/sysv/linux/powerpc/powerpc32/fpu/Implies.
+powerpc/powerpc32/476/fpu
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/Implies glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/Implies
--- glibc/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476fp/Implies	2009-12-04 11:38:31.000000000 -0600
@@ -0,0 +1,12 @@
+# This `476fp/' directory is simply here to appease --with-cpu=476fp so that
+# one may pass the official processor/abi designation of 476fp to glibc's
+# configuration.  The preferred method is `--with-cpu=476 --with-fp' which
+# will traverse the ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/476/fpu
+# path implicitly.
+
+# Don't put any files in this directory.  Put non-fpu 476 code in the `476'
+# directory and put fpu 476 code in the `476/fpu' per the current precident.
+# There should be no ports/sysdeps/powerpc/powerpc32/476fp directory, so don't
+# add one.
+
+powerpc/powerpc32/476/
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/powerpc32/440/Implies glibc.new/ports/sysdeps/powerpc/powerpc32/440/Implies
--- glibc/ports/sysdeps/powerpc/powerpc32/440/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/powerpc32/440/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1 @@
+#powerpc/powerpc32/fpu
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/powerpc32/440/fpu/Implies glibc.new/ports/sysdeps/powerpc/powerpc32/440/fpu/Implies
--- glibc/ports/sysdeps/powerpc/powerpc32/440/fpu/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/powerpc32/440/fpu/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1 @@
+#powerpc/powerpc32
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/powerpc32/464/Implies glibc.new/ports/sysdeps/powerpc/powerpc32/464/Implies
--- glibc/ports/sysdeps/powerpc/powerpc32/464/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/powerpc32/464/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1 @@
+powerpc/powerpc32/440
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/powerpc32/464/fpu/Implies glibc.new/ports/sysdeps/powerpc/powerpc32/464/fpu/Implies
--- glibc/ports/sysdeps/powerpc/powerpc32/464/fpu/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/powerpc32/464/fpu/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1 @@
+powerpc/powerpc32/440/fpu
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/powerpc32/476/Implies glibc.new/ports/sysdeps/powerpc/powerpc32/476/Implies
--- glibc/ports/sysdeps/powerpc/powerpc32/476/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/powerpc32/476/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1 @@
+powerpc/powerpc32/464
diff -X /home/ryanarn/bin/dontdiff -uNr glibc/ports/sysdeps/powerpc/powerpc32/476/fpu/Implies glibc.new/ports/sysdeps/powerpc/powerpc32/476/fpu/Implies
--- glibc/ports/sysdeps/powerpc/powerpc32/476/fpu/Implies	1969-12-31 18:00:00.000000000 -0600
+++ glibc.new/ports/sysdeps/powerpc/powerpc32/476/fpu/Implies	2009-12-01 16:42:28.000000000 -0600
@@ -0,0 +1 @@
+powerpc/powerpc32/464/fpu

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]