diff -Naur glibc-2.11.2.old/configure glibc-2.11.2.new/configure
--- glibc-2.11.2.old/configure	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/configure	2010-08-24 15:04:09.000000000 +0200
@@ -4215,7 +4215,11 @@
 sh3*)		base_machine=sh machine=sh/sh3 ;;
 sh4*)		base_machine=sh machine=sh/sh4 ;;
 sparc | sparcv[67])
-		base_machine=sparc machine=sparc/sparc32 ;;
+		if test "$with_v8" = no; then
+                    base_machine=sparc machine=sparc/sparc32
+                else
+		    base_machine=sparc machine=sparc/sparc32/sparcv8
+		fi ;;	
 sparcv8 | supersparc | hypersparc)
 		base_machine=sparc machine=sparc/sparc32/sparcv8 ;;
 sparcv8plus | sparcv8plusa | sparcv9)
@@ -6850,7 +6854,7 @@
   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }
 then
-  libc_cv_ssp=yes
+  libc_cv_ssp=no
 else
   libc_cv_ssp=no
 fi
diff -Naur glibc-2.11.2.old/crypt/sha256.c glibc-2.11.2.new/crypt/sha256.c
--- glibc-2.11.2.old/crypt/sha256.c	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/crypt/sha256.c	2010-08-25 16:25:14.000000000 +0200
@@ -302,3 +302,35 @@
       ctx->buflen = left_over;
     }
 }
+
+
+/* gcc-4-4-2 with -O2 caused problems, therefore put part of sha512_process_block here */
+
+#undef Ch
+#undef Maj
+#undef S0
+#undef S1
+#undef R0
+#undef R1
+#undef CYCLIC
+
+/* Operators defined in FIPS 180-2:4.1.2.  */
+#define Ch(x, y, z) ((x & y) ^ (~x & z))
+#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
+#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39))
+#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41))
+#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7))
+#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6))
+      /* It is unfortunate that C does not provide an operator for
+	 cyclic rotation.  Hope the C compiler is smart enough.  */
+#define CYCLIC(w, s) ((w >> s) | (w << (64 - s)))
+
+uint64_t sha512_ph(uint64_t a, uint64_t b, uint64_t c) {
+	uint64_t T2 = S0 (a) + Maj (a, b, c);
+	return T2;
+}
+
+uint64_t sha512_ph2(uint64_t e, uint64_t f, uint64_t g, uint64_t h, unsigned int t, uint64_t *W) {
+	uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
+	return T1;
+}
diff -Naur glibc-2.11.2.old/crypt/sha512.c glibc-2.11.2.new/crypt/sha512.c
--- glibc-2.11.2.old/crypt/sha512.c	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/crypt/sha512.c	2010-08-25 16:25:14.000000000 +0200
@@ -101,10 +101,27 @@
     UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817)
   };
 
+      /* Operators defined in FIPS 180-2:4.1.2.  */
+#define Ch(x, y, z) ((x & y) ^ (~x & z))
+#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
+#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39))
+#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41))
+#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7))
+#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6))
+      /* It is unfortunate that C does not provide an operator for
+	 cyclic rotation.  Hope the C compiler is smart enough.  */
+#define CYCLIC(w, s) ((w >> s) | (w << (64 - s)))
+
+/* gcc-4-4-2 with -O2 caused problems, therefore put part of sha512_process_block into sha256.c */
+
+uint64_t sha512_ph(uint64_t a, uint64_t b, uint64_t c);
+
+uint64_t sha512_ph2(uint64_t e, uint64_t f, uint64_t g, uint64_t h, unsigned int t, uint64_t *W);
+
 
 /* Process LEN bytes of BUFFER, accumulating context into CTX.
    It is assumed that LEN % 128 == 0.  */
-static void
+void
 sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
 {
   const uint64_t *words = buffer;
@@ -139,17 +156,7 @@
       uint64_t g_save = g;
       uint64_t h_save = h;
 
-      /* Operators defined in FIPS 180-2:4.1.2.  */
-#define Ch(x, y, z) ((x & y) ^ (~x & z))
-#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
-#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39))
-#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41))
-#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7))
-#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6))
 
-      /* It is unfortunate that C does not provide an operator for
-	 cyclic rotation.  Hope the C compiler is smart enough.  */
-#define CYCLIC(w, s) ((w >> s) | (w << (64 - s)))
 
       /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2.  */
       for (unsigned int t = 0; t < 16; ++t)
@@ -163,8 +170,8 @@
       /* The actual computation according to FIPS 180-2:6.3.2 step 3.  */
       for (unsigned int t = 0; t < 80; ++t)
 	{
-	  uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
-	  uint64_t T2 = S0 (a) + Maj (a, b, c);
+	  uint64_t T1 = sha512_ph2(e,f,g,h,t,(uint64_t *)&W);
+	  uint64_t T2 = sha512_ph(a,b,c); /*S0 (a) + Maj (a, b, c);*/
 	  h = g;
 	  g = f;
 	  f = e;
diff -Naur glibc-2.11.2.old/math/math.h glibc-2.11.2.new/math/math.h
--- glibc-2.11.2.old/math/math.h	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/math/math.h	2010-08-24 14:08:13.000000000 +0200
@@ -396,20 +396,20 @@
 # define __NO_MATH_INLINES	1
 #endif
 
-#if defined __USE_ISOC99 && __GNUC_PREREQ(2,97)
-/* ISO C99 defines some macros to compare number while taking care for
-   unordered numbers.  Many FPUs provide special instructions to support
-   these operations.  Generic support in GCC for these as builtins went
-   in before 3.0.0, but not all cpus added their patterns.  We define
-   versions that use the builtins here, and <bits/mathinline.h> will
-   undef/redefine as appropriate for the specific GCC version in use.  */
-# define isgreater(x, y)	__builtin_isgreater(x, y)
-# define isgreaterequal(x, y)	__builtin_isgreaterequal(x, y)
-# define isless(x, y)		__builtin_isless(x, y)
-# define islessequal(x, y)	__builtin_islessequal(x, y)
-# define islessgreater(x, y)	__builtin_islessgreater(x, y)
-# define isunordered(u, v)	__builtin_isunordered(u, v)
-#endif
+/* #if defined __USE_ISOC99 && __GNUC_PREREQ(2,97) */
+/* /\* ISO C99 defines some macros to compare number while taking care for */
+/*    unordered numbers.  Many FPUs provide special instructions to support */
+/*    these operations.  Generic support in GCC for these as builtins went */
+/*    in before 3.0.0, but not all cpus added their patterns.  We define */
+/*    versions that use the builtins here, and <bits/mathinline.h> will */
+/*    undef/redefine as appropriate for the specific GCC version in use.  *\/ */
+/* # define isgreater(x, y)	__builtin_isgreater(x, y) */
+/* # define isgreaterequal(x, y)	__builtin_isgreaterequal(x, y) */
+/* # define isless(x, y)		__builtin_isless(x, y) */
+/* # define islessequal(x, y)	__builtin_islessequal(x, y) */
+/* # define islessgreater(x, y)	__builtin_islessgreater(x, y) */
+/* # define isunordered(u, v)	__builtin_isunordered(u, v) */
+/* #endif */
 
 /* Get machine-dependent inline versions (if there are any).  */
 #ifdef __USE_EXTERN_INLINES
diff -Naur glibc-2.11.2.old/scripts/gen-sorted.awk glibc-2.11.2.new/scripts/gen-sorted.awk
--- glibc-2.11.2.old/scripts/gen-sorted.awk	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/scripts/gen-sorted.awk	2010-08-30 09:11:58.000000000 +0200
@@ -16,7 +16,7 @@
 {
   subdir = type = FILENAME;
   sub(/^.*\//, "", type);
-  sub(/\/[^/]+$/, "", subdir);
+  sub(/\/[^\/]+$/, "", subdir);
   sub(/^.*\//, "", subdir);
   thisdir = "";
 }
@@ -56,13 +56,13 @@
     # The Subdirs file comes from an add-on that should have the subdirectory.
     dir = FILENAME;
     do
-      sub(/\/[^/]+$/, "", dir);
+      sub(/\/[^\/]+$/, "", dir);
     while (dir !~ /\/sysdeps$/);
     sub(/\/sysdeps$/, "", dir);
     if (system("test -d " dir "/" thisdir) == 0)
       dir = dir "/" thisdir;
     else {
-      sub(/\/[^/]+$/, "", dir);
+      sub(/\/[^\/]+$/, "", dir);
       if (system("test -d " dir "/" thisdir) == 0)
         dir = dir "/" thisdir;
       else {
diff -Naur glibc-2.11.2.old/sysdeps/sparc/fpu/fraiseexcpt.c glibc-2.11.2.new/sysdeps/sparc/fpu/fraiseexcpt.c
--- glibc-2.11.2.old/sysdeps/sparc/fpu/fraiseexcpt.c	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/sysdeps/sparc/fpu/fraiseexcpt.c	2010-08-24 09:10:05.000000000 +0200
@@ -41,41 +41,61 @@
   if ((FE_INVALID & excepts) != 0)
     {
       /* One example of a invalid operation is 0/0.  */
+#ifndef _SOFT_FLOAT
       __asm ("" : "=e" (d) : "0" (c.zero));
+#endif
       d /= c.zero;
+#ifndef _SOFT_FLOAT
       __asm __volatile ("" : : "e" (d));
+#endif
     }
 
   /* Next: division by zero.  */
   if ((FE_DIVBYZERO & excepts) != 0)
     {
+#ifndef _SOFT_FLOAT
       __asm ("" : "=e" (d) : "0" (c.one));
+#endif
       d /= c.zero;
+#ifndef _SOFT_FLOAT
       __asm __volatile ("" : : "e" (d));
+#endif
     }
 
   /* Next: overflow.  */
   if ((FE_OVERFLOW & excepts) != 0)
     {
+#ifndef _SOFT_FLOAT
       __asm ("" : "=e" (d) : "0" (c.max));
+#endif
       d *= d;
+#ifndef _SOFT_FLOAT
       __asm __volatile ("" : : "e" (d));
+#endif
     }
 
   /* Next: underflow.  */
   if ((FE_UNDERFLOW & excepts) != 0)
     {
+#ifndef _SOFT_FLOAT
       __asm ("" : "=e" (d) : "0" (c.min));
+#endif
       d *= d;
+#ifndef _SOFT_FLOAT
       __asm __volatile ("" : : "e" (d));
+#endif
     }
 
   /* Last: inexact.  */
   if ((FE_INEXACT & excepts) != 0)
     {
+#ifndef _SOFT_FLOAT
       __asm ("" : "=e" (d) : "0" (c.one));
+#endif
       d /= c.pi;
+#ifndef _SOFT_FLOAT
       __asm __volatile ("" : : "e" (d));
+#endif
     }
 
   /* Success.  */
diff -Naur glibc-2.11.2.old/sysdeps/sparc/sparc32/Makefile glibc-2.11.2.new/sysdeps/sparc/sparc32/Makefile
--- glibc-2.11.2.old/sysdeps/sparc/sparc32/Makefile	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/sysdeps/sparc/sparc32/Makefile	2010-06-23 12:53:23.000000000 +0200
@@ -16,6 +16,11 @@
 # Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 # 02111-1307 USA.
 
+ifeq ($(with-fp),no)
++cflags += -msoft-float -DNOFPU
+sysdep-LDFLAGS += -msoft-float
+endif
+
 ifeq ($(subdir),gnulib)
 sysdep_routines = dotmul umul $(divrem) alloca
 endif	# gnulib
diff -Naur glibc-2.11.2.old/sysdeps/sparc/sparc32/e_sqrt.c glibc-2.11.2.new/sysdeps/sparc/sparc32/e_sqrt.c
--- glibc-2.11.2.old/sysdeps/sparc/sparc32/e_sqrt.c	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/sysdeps/sparc/sparc32/e_sqrt.c	2010-06-23 12:53:23.000000000 +0200
@@ -23,6 +23,8 @@
   #error This file uses GNU C extensions; you must compile with GCC.
 #endif
 
+#ifndef NOFPU
+
 /* Return the square root of X.  */
 double
 __ieee754_sqrt (x)
@@ -32,3 +34,9 @@
   asm ("fsqrtd %1, %0" : "=f" (result) : "f" (x));
   return result;
 }
+
+#else 
+
+#include <sysdeps/ieee754/dbl-64/e_sqrt.c>
+
+#endif
diff -Naur glibc-2.11.2.old/sysdeps/sparc/sparc32/sparcv8/Makefile glibc-2.11.2.new/sysdeps/sparc/sparc32/sparcv8/Makefile
--- glibc-2.11.2.old/sysdeps/sparc/sparc32/sparcv8/Makefile	2010-08-31 17:06:35.000000000 +0200
+++ glibc-2.11.2.new/sysdeps/sparc/sparc32/sparcv8/Makefile	2010-07-01 14:46:51.000000000 +0200
@@ -1 +1,2 @@
 sysdep-CFLAGS += -mcpu=v8
+sysdep-LDFLAGS += -mcpu=v8
