]> sourceware.org Git - glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 4 Apr 2001 00:01:02 +0000 (00:01 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 4 Apr 2001 00:01:02 +0000 (00:01 +0000)
2001-04-03  Ulrich Drepper  <drepper@redhat.com>

* misc/dirname.c (dirname): Handle multiple slashes correctly.

2001-04-03  Martin Schwidefsky  <schwidefsky@de.ibm.com>

* sysdeps/s390/s390-64/initfini.c: Fix __gmon_start__ GOT access.

2001-04-03  Martin Schwidefsky  <schwidefsky@de.ibm.com>

* sysdeps/s390/s390-32/bcopy.S: Optimize for speed.
* sysdeps/s390/s390-64/bcopy.S: Likewise.
* sysdeps/s390/s390-32/mempcy.S: Likewise.
* sysdeps/s390/s390-64/memcpy.S: Likewise.

2001-04-02  Bruno Haible  <haible@clisp.cons.org>

* manual/message.texi (Advanced gettext functions): More specific
syntax in the plural formula examples.

2001-04-02  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>

* sysdeps/powerpc/atomicity.h: Silence warnings.
* sysdeps/powerpc/dl-machine.h: Likewise.
* sysdeps/powerpc/register-dump.h: Likewise.
* sysdeps/powerpc/fpu/s_lrint.c: Likewise.

2001-04-02  Andreas Jaeger  <aj@suse.de>

* misc/tst-dirname.c (main): Add more tests, derived from a bug
report by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>.

2001-04-01  Andreas Jaeger  <aj@suse.de>

* debug/xtrace.sh (pcprofileso): Use SLIBDIR since libpcprofile.so
is installed there.
* malloc/memusage.sh (memusageso): Likewise for libmemusage.so.

2001-04-01  H.J. Lu  <hjl@gnu.org>

* posix/annexc.c (macrofile): Renamed from TMPFILE and set to
tmpnam (NULL).
* stdlib/isomac.c (macrofile): Likewise.

2001-03-30  Thorsten Kukuk  <kukuk@suse.de>

* inet/rcmd.c: Allow AF_UNSPEC as parameter.
* nis/ypclnt.c (yp_all): Print error message only at last try,
check for protocoll error only if we don't have a network error.

20 files changed:
ChangeLog
FAQ
FAQ.in
debug/xtrace.sh
malloc/memusage.sh
manual/message.texi
misc/dirname.c
misc/tst-dirname.c
nis/ypclnt.c
posix/annexc.c
stdlib/isomac.c
sysdeps/powerpc/atomicity.h
sysdeps/powerpc/dl-machine.h
sysdeps/powerpc/fpu/s_lrint.c
sysdeps/powerpc/register-dump.h
sysdeps/s390/s390-32/bcopy.S
sysdeps/s390/s390-32/memcpy.S
sysdeps/s390/s390-64/bcopy.S
sysdeps/s390/s390-64/initfini.c
sysdeps/s390/s390-64/memcpy.S

index f43ec8b9b06d52894da3bef1e1b2f3b7a6e744bd..ed9cba9b907eb8130901b59ae8b7739576bc87fc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,53 @@
+2001-04-03  Ulrich Drepper  <drepper@redhat.com>
+
+       * misc/dirname.c (dirname): Handle multiple slashes correctly.
+
+2001-04-03  Martin Schwidefsky  <schwidefsky@de.ibm.com>
+
+       * sysdeps/s390/s390-64/initfini.c: Fix __gmon_start__ GOT access.
+
+2001-04-03  Martin Schwidefsky  <schwidefsky@de.ibm.com>
+
+       * sysdeps/s390/s390-32/bcopy.S: Optimize for speed.
+       * sysdeps/s390/s390-64/bcopy.S: Likewise.
+       * sysdeps/s390/s390-32/mempcy.S: Likewise.
+       * sysdeps/s390/s390-64/memcpy.S: Likewise.
+
+2001-04-02  Bruno Haible  <haible@clisp.cons.org>
+
+       * manual/message.texi (Advanced gettext functions): More specific
+       syntax in the plural formula examples.
+
+2001-04-02  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
+
+       * sysdeps/powerpc/atomicity.h: Silence warnings.
+       * sysdeps/powerpc/dl-machine.h: Likewise.
+       * sysdeps/powerpc/register-dump.h: Likewise.
+       * sysdeps/powerpc/fpu/s_lrint.c: Likewise.
+
+2001-04-02  Andreas Jaeger  <aj@suse.de>
+
+       * misc/tst-dirname.c (main): Add more tests, derived from a bug
+       report by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>.
+
+2001-04-01  Andreas Jaeger  <aj@suse.de>
+
+       * debug/xtrace.sh (pcprofileso): Use SLIBDIR since libpcprofile.so
+       is installed there.
+       * malloc/memusage.sh (memusageso): Likewise for libmemusage.so.
+
+2001-04-01  H.J. Lu  <hjl@gnu.org>
+
+       * posix/annexc.c (macrofile): Renamed from TMPFILE and set to
+       tmpnam (NULL).
+       * stdlib/isomac.c (macrofile): Likewise.
+
+2001-03-30  Thorsten Kukuk  <kukuk@suse.de>
+
+       * inet/rcmd.c: Allow AF_UNSPEC as parameter.
+       * nis/ypclnt.c (yp_all): Print error message only at last try,
+       check for protocoll error only if we don't have a network error.
+
 2001-04-02  Andreas Schwab  <schwab@suse.de>
 
        * resolv/res_data.c (res_isourserver): Fix cast.
diff --git a/FAQ b/FAQ
index f9ae5af441e279aa07013dd3a6985d50d03b14f9..955cc543be8ebf21d08d53b2ded0d16d893698f4 100644 (file)
--- a/FAQ
+++ b/FAQ
@@ -163,6 +163,7 @@ please let me know.
        when I try to use it, it always returns -1 and sets errno to ENOSYS.
 3.22.  My program segfaults when I call fclose() on the FILE* returned
        from setmntent().  Is this a glibc bug?
+3.23.  I get "undefined reference to `atexit'"
 
 4. Miscellaneous
 
@@ -1683,6 +1684,17 @@ In the case of setmntent(), it may appear to work in most cases, but it
 won't always work.  Unfortunately, for compatibility reasons, we can't
 change the return type of setmntent() to something other than FILE *.
 
+
+3.23.  I get "undefined reference to `atexit'"
+
+{UD} This means that your installation is somehow broken.  The situation is
+the same as for 'stat', 'fstat', etc (see question 2.7).  Investigate why the
+linker does not pick up libc_nonshared.a.
+
+If a similar message is issued at runtime this means that the application or
+DSO is not linked against libc.  This can cause problems since 'atexit' is
+not exported anymore.
+
 \f
 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
 
diff --git a/FAQ.in b/FAQ.in
index f06569ace441fb40b95e8f0bca73975a772d1480..397b62fe8b827aabe2f04ea8b8fd0a27fa533340 100644 (file)
--- a/FAQ.in
+++ b/FAQ.in
@@ -565,7 +565,7 @@ exactly what to use.
 Version 2.7.2.3 does and future versions of GCC will automatically
 provide the correct specs.
 
-??     Looking through the shared libc file I haven't found the
+??nonsh        Looking through the shared libc file I haven't found the
        functions `stat', `lstat', `fstat', and `mknod' and while
        linking on my Linux system I get error messages.  How is
        this supposed to work?
@@ -1438,6 +1438,16 @@ In the case of setmntent(), it may appear to work in most cases, but it
 won't always work.  Unfortunately, for compatibility reasons, we can't
 change the return type of setmntent() to something other than FILE *.
 
+??     I get "undefined reference to `atexit'"
+
+{UD} This means that your installation is somehow broken.  The situation is
+the same as for 'stat', 'fstat', etc (see ?nonsh).  Investigate why the
+linker does not pick up libc_nonshared.a.
+
+If a similar message is issued at runtime this means that the application or
+DSO is not linked against libc.  This can cause problems since 'atexit' is
+not exported anymore.
+
 
 ? Miscellaneous
 
index 3c7c7fe5f7c6ac8c102791e2d7a825a8c11ba64f..d885650446f9fa18d0c30714e849e17d181f063a 100755 (executable)
@@ -18,7 +18,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 # Boston, MA 02111-1307, USA.
 
-pcprofileso=@LIBDIR@/libpcprofile.so
+pcprofileso=@SLIBDIR@/libpcprofile.so
 pcprofiledump=@BINDIR@/pcprofiledump
 
 # Print usage message.
index 70595e8b789cca15e3ce9a36fee37bc48242a19c..1268f8879a589dcae159da588153cad41b998117 100755 (executable)
@@ -18,7 +18,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 # Boston, MA 02111-1307, USA.
 
-memusageso=@LIBDIR@/libmemusage.so
+memusageso=@SLIBDIR@/libmemusage.so
 memusagestat=@BINDIR@/memusagestat
 
 # Print usage message.
index ebf373d49ab39aa7e56b634627c7e39684e90203..ff410f083b4e048e6071a8e3dc824a5626690113 100644 (file)
@@ -1075,7 +1075,7 @@ code similar to the following:
 @end smallexample
 
 @noindent
-After the first complains from people internationalizing the code people
+After the first complaints from people internationalizing the code people
 either completely avoided formulations like this or used strings like
 @code{"file(s)"}.  Both look unnatural and should be avoided.  First
 tries to solve the problem correctly looked like this:
@@ -1193,11 +1193,11 @@ details are explained in the GNU @code{gettext} manual.  Here only a a
 bit of information is provided.
 
 The information about the plural form selection has to be stored in the
-header entry (the one with the empty (@code{msgid} string).  There should
-be something like:
+header entry (the one with the empty (@code{msgid} string).  It looks
+like this:
 
 @smallexample
-  nplurals=2; plural=n == 1 ? 0 : 1
+Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
 @end smallexample
 
 The @code{nplurals} value must be a decimal number which specifies how
@@ -1222,11 +1222,11 @@ below).@footnote{Additions are welcome.  Send appropriate information to
 @table @asis
 @item Only one form:
 Some languages only require one single form.  There is no distinction
-between the singular and plural form.  And appropriate header entry
+between the singular and plural form.  An appropriate header entry
 would look like this:
 
 @smallexample
-nplurals=1; plural=0
+Plural-Forms: nplurals=1; plural=0;
 @end smallexample
 
 @noindent
@@ -1246,7 +1246,7 @@ This is the form used in most existing programs since it is what English
 is using.  A header entry would look like this:
 
 @smallexample
-nplurals=2; plural=n != 1
+Plural-Forms: nplurals=2; plural=n != 1;
 @end smallexample
 
 (Note: this uses the feature of C expressions that boolean expressions
@@ -1274,7 +1274,7 @@ Esperanto
 Exceptional case in the language family.  The header entry would be:
 
 @smallexample
-nplurals=2; plural=n>1
+Plural-Forms: nplurals=2; plural=n>1;
 @end smallexample
 
 @noindent
@@ -1289,7 +1289,7 @@ French
 The header entry would be:
 
 @smallexample
-nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2
+Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;
 @end smallexample
 
 @noindent
@@ -1304,7 +1304,8 @@ Gaeilge
 The header entry would look like this:
 
 @smallexample
-nplurals=3; plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1
+Plural-Forms: nplurals=3; \
+    plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;
 @end smallexample
 
 @noindent
@@ -1319,8 +1320,9 @@ Czech, Russian, Slovak
 The header entry would look like this:
 
 @smallexample
-nplurals=3; plural=n==1 ? 0 : \
-  n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2
+Plural-Forms: nplurals=3; \
+    plural=n==1 ? 0 : \
+           n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
 @end smallexample
 
 (Continuation in the next line is possible.)
@@ -1337,7 +1339,8 @@ Polish
 The header entry would look like this:
 
 @smallexample
-nplurals=4; plural=n==1 ? 0 : n%10==2 ? 1 : n%10==3 || n%10==4 ? 2 : 3
+Plural-Forms: nplurals=4; \
+    plural=n==1 ? 0 : n%10==2 ? 1 : n%10==3 || n%10==4 ? 2 : 3;
 @end smallexample
 
 @noindent
index 8be25e51b873bd3c6587b728bd77493a2c4cd43e..b8374049752c7bc5c6e334700a215875cca2522a 100644 (file)
@@ -1,5 +1,5 @@
 /* dirname - return directory part of PATH.
-   Copyright (C) 1996, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1996, 2000, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -32,16 +32,40 @@ dirname (char *path)
   last_slash = path != NULL ? strrchr (path, '/') : NULL;
 
   if (last_slash != NULL && last_slash != path && last_slash[1] == '\0')
-    /* The '/' is the last character, we have to look further.  */
-    last_slash = __memrchr (path, '/', last_slash - path);
+    {
+      /* Determine whether all remaining characters are slashes.  */
+      char *runp;
+
+      for (runp = last_slash; runp != path; --runp)
+       if (runp[-1] != '/')
+         break;
+
+      /* The '/' is the last character, we have to look further.  */
+      if (runp != path)
+       last_slash = __memrchr (path, '/', runp - path);
+    }
 
   if (last_slash != NULL)
     {
+      /* Determine whether all remaining characters are slashes.  */
+      char *runp;
+
+      for (runp = last_slash; runp != path; --runp)
+       if (runp[-1] != '/')
+         break;
+
       /* Terminate the path.  */
-      if (last_slash == path)
-       /* The last slash is the first character in the string.  We have to
-          return "/".  */
-       ++last_slash;
+      if (runp == path)
+       {
+         /* The last slash is the first character in the string.  We have to
+            return "/".  As a special case we have to return "//" if there
+            are exactly two slashes at the beginning of the string.  See
+            XBD 4.10 Path Name Resolution for more information.  */
+         if (last_slash == path + 1)
+           ++last_slash;
+         else
+           last_slash = path + 1;
+       }
 
       last_slash[0] = '\0';
     }
index e688bd3a4206d7da2f50d6755cf78171efb550d0..aa0d782392420862ddd8f5c682cafec04d82aea2 100644 (file)
@@ -1,5 +1,5 @@
 /* Test program for dirname function a la XPG.
-   Copyright (C) 1996, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1996, 2000, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -54,6 +54,13 @@ main (void)
   /* Some more tests.   */
   result |= test ("/usr/lib/", "/usr");
   result |= test ("/usr", "/");
+  result |= test ("a//", ".");
+  result |= test ("a////", ".");
+  result |= test ("////usr", "/");
+  result |= test ("////usr//", "/");
+  result |= test ("//usr", "//");
+  result |= test ("//usr//", "//");
+  result |= test ("//", "//");
 
   return result != 0;
 }
index a62e356912e796be2405e293fa33d89b95012479..67ac42597b33fbbbd99a110781aa7737258e2bf2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
 
@@ -729,7 +729,9 @@ yp_all (const char *indomain, const char *inmap,
 
       if (result != RPC_SUCCESS)
        {
-         clnt_perror (clnt, "yp_all: clnt_call");
+         /* Print the error message only on the last try */
+         if (try == MAXTRIES - 1)
+           clnt_perror (clnt, "yp_all: clnt_call");
          res = YPERR_RPC;
        }
       else
@@ -738,7 +740,7 @@ yp_all (const char *indomain, const char *inmap,
       __yp_unbind (ydb);
       clnt_destroy (clnt);
 
-      if (status != YP_NOMORE)
+      if (res == YPERR_SUCCESS && status != YP_NOMORE)
        {
          __set_errno (saved_errno);
          return ypprot_err (status);
index 1dbc3f617b2464a85589c89978a18a2e9a285599..78d70fa8046ae2344217f97cdbc868eb40608daf 100644 (file)
 #include <signal.h>
 #include <sys/wait.h>
 
-#define TMPFILE             "/tmp/macros"
 #define HEADER_MAX          256
 
+static const char *macrofile;
+
 /* <aio.h>.  */
 static const char *const aio_syms[] =
 {
@@ -712,8 +713,10 @@ get_null_defines (void)
   FILE *input;
   int first = 1;
 
+  macrofile = tmpnam (NULL);
+
   command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
-                   + strlen (INC) + strlen (TMPFILE));
+                   + strlen (INC) + strlen (macrofile));
 
   if (command == NULL)
     {
@@ -721,7 +724,7 @@ get_null_defines (void)
       exit (1);
     }
 
-  sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE);
+  sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
 
   if (xsystem (command))
     {
@@ -729,11 +732,11 @@ get_null_defines (void)
       return NULL;
     }
   free (command);
-  input = fopen (TMPFILE, "r");
+  input = fopen (macrofile, "r");
 
   if (input == NULL)
     {
-      printf ("Could not read %s: ", TMPFILE);
+      printf ("Could not read %s: ", macrofile);
       perror (NULL);
       return NULL;
     }
@@ -782,7 +785,7 @@ get_null_defines (void)
     }
   result[result_len] = NULL;
   fclose (input);
-  remove (TMPFILE);
+  remove (macrofile);
 
   return (const char **) result;
 }
@@ -799,7 +802,7 @@ check_header (const struct header *header, const char **except)
 
   memset (found, '\0', header->nsyms * sizeof (int));
   command = alloca (sizeof fmt + strlen (header->name) + 2 * strlen (CC)
-                   + strlen (INC) + strlen (TMPFILE));
+                   + strlen (INC) + strlen (macrofile));
 
 
   if (command == NULL)
@@ -809,13 +812,13 @@ check_header (const struct header *header, const char **except)
     }
 
   printf ("=== %s ===\n", header->name);
-  sprintf (command, fmt, header->name, CC, INC, CC, TMPFILE);
+  sprintf (command, fmt, header->name, CC, INC, CC, macrofile);
 
   /* First see whether this subset is supported at all.  */
   if (header->subset != NULL)
     {
       sprintf (line, testfmt, header->subset, header->subset, CC, INC, CC,
-              TMPFILE);
+              macrofile);
       if (xsystem (line))
        {
          printf ("!! not available\n");
@@ -828,11 +831,11 @@ check_header (const struct header *header, const char **except)
       puts ("system() returned nonzero");
       result = 1;
     }
-  input = fopen (TMPFILE, "r");
+  input = fopen (macrofile, "r");
 
   if (input == NULL)
     {
-      printf ("Could not read %s: ", TMPFILE);
+      printf ("Could not read %s: ", macrofile);
       perror (NULL);
       return 1;
     }
@@ -884,7 +887,7 @@ check_header (const struct header *header, const char **except)
       result |= 1;
     }
   fclose (input);
-  remove (TMPFILE);
+  remove (macrofile);
 
   for (i = 0; i < header->nsyms; ++i)
     if (found[i] == 0)
index ab63d1b154402ff846f1d20ae8b7a5fc8ee7f4b3..f18e8d92eb5876af62389f6e8cf8a32604a69abf 100644 (file)
@@ -52,7 +52,7 @@
      preprocessor has something similar to gcc's -dM option. Tune
      PRINT_MACROS in this case. This program assumes headers are found
      under /usr/include and that there is a writable /tmp directory.
-     Tune SYSTEM_INCLUDE and TMPFILE if your system differs.
+     Tune SYSTEM_INCLUDE if your system differs.
      #define BROKEN_SYSTEM if system(NULL) bombs -- one more violation
      of ISO C, by the way.
 
 #include <stdlib.h>
 #include <string.h>
 
-#define TMPFILE             "/tmp/macros"
 #define HEADER_MAX          256
 
+static const char *macrofile;
+
 /* ISO C header names including Amendment 1 (without ".h" suffix).  */
 static char *header[] =
 {
@@ -247,8 +248,10 @@ get_null_defines (void)
   FILE *input;
   int first = 1;
 
+  macrofile = tmpnam (NULL);
+
   command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
-                   + strlen (INC) + strlen (TMPFILE));
+                   + strlen (INC) + strlen (macrofile));
 
   if (command == NULL)
     {
@@ -256,7 +259,7 @@ get_null_defines (void)
       exit (1);
     }
 
-  sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE);
+  sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
 
   if (system (command))
     {
@@ -264,11 +267,11 @@ get_null_defines (void)
       return NULL;
     }
   free (command);
-  input = fopen (TMPFILE, "r");
+  input = fopen (macrofile, "r");
 
   if (input == NULL)
     {
-      printf ("Could not read %s: ", TMPFILE);
+      printf ("Could not read %s: ", macrofile);
       perror (NULL);
       return NULL;
     }
@@ -321,7 +324,7 @@ get_null_defines (void)
     }
   result[result_len] = NULL;
   fclose (input);
-  remove (TMPFILE);
+  remove (macrofile);
 
   return (const char **) result;
 }
@@ -335,7 +338,7 @@ check_header (const char *file_name, const char **except)
   int result = 0;
 
   command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC)
-                   + strlen (INC) + strlen (TMPFILE));
+                   + strlen (INC) + strlen (macrofile));
 
   if (command == NULL)
     {
@@ -344,7 +347,7 @@ check_header (const char *file_name, const char **except)
     }
 
   puts (file_name);
-  sprintf (command, fmt, file_name, CC, INC, CC, TMPFILE);
+  sprintf (command, fmt, file_name, CC, INC, CC, macrofile);
 
   if (system (command))
     {
@@ -352,11 +355,11 @@ check_header (const char *file_name, const char **except)
       result = 1;
     }
   free (command);
-  input = fopen (TMPFILE, "r");
+  input = fopen (macrofile, "r");
 
   if (input == NULL)
     {
-      printf ("Could not read %s: ", TMPFILE);
+      printf ("Could not read %s: ", macrofile);
       perror (NULL);
       return 1;
     }
@@ -430,7 +433,7 @@ check_header (const char *file_name, const char **except)
        }
     }
   fclose (input);
-  remove (TMPFILE);
+  remove (macrofile);
 
   return result;
 }
index 2924b181f529c176660460dc5bee8c892fc6ce22..6942dfecd18ed0d8110927268f7672050b3b5151 100644 (file)
@@ -33,11 +33,11 @@ __attribute__ ((unused))
 exchange_and_add (volatile uint32_t *mem, int val)
 {
   int tmp, result;
-  __asm__ ("\
-0:     lwarx   %0,0,%2
-       add%I3  %1,%0,%3
-       stwcx.  %1,0,%2
-       bne-    0b
+  __asm__ ("\n\
+0:     lwarx   %0,0,%2 \n\
+       add%I3  %1,%0,%3        \n\
+       stwcx.  %1,0,%2 \n\
+       bne-    0b      \n\
 " : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
   return result;
 }
@@ -47,11 +47,11 @@ __attribute__ ((unused))
 atomic_add (volatile uint32_t *mem, int val)
 {
   int tmp;
-  __asm__ ("\
-0:     lwarx   %0,0,%1
-       add%I2  %0,%0,%2
-       stwcx.  %0,0,%1
-       bne-    0b
+  __asm__ ("\n\
+0:     lwarx   %0,0,%1 \n\
+       add%I2  %0,%0,%2        \n\
+       stwcx.  %0,0,%1 \n\
+       bne-    0b      \n\
 " : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
 }
 
@@ -60,14 +60,14 @@ __attribute__ ((unused))
 compare_and_swap (volatile long int *p, long int oldval, long int newval)
 {
   int result;
-  __asm__ ("\
-0:     lwarx   %0,0,%1
-       sub%I2c.        %0,%0,%2
-       cntlzw  %0,%0
-       bne-    1f
-       stwcx.  %3,0,%1
-       bne-    0b
-1:
+  __asm__ ("\n\
+0:     lwarx   %0,0,%1 \n\
+       sub%I2c.        %0,%0,%2        \n\
+       cntlzw  %0,%0   \n\
+       bne-    1f      \n\
+       stwcx.  %3,0,%1 \n\
+       bne-    0b      \n\
+1:     \n\
 " : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
   return result >> 5;
 }
@@ -77,10 +77,10 @@ __attribute__ ((unused))
 always_swap (volatile long int *p, long int newval)
 {
   long int result;
-  __asm__ ("\
-0:     lwarx   %0,0,%1
-       stwcx.  %2,0,%1
-       bne-    0b
+  __asm__ ("\n\
+0:     lwarx   %0,0,%1 \n\
+       stwcx.  %2,0,%1 \n\
+       bne-    0b      \n\
 " : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
   return result;
 }
@@ -90,13 +90,13 @@ __attribute__ ((unused))
 test_and_set (volatile long int *p, long int newval)
 {
   int result;
-  __asm__ ("\
-0:     lwarx   %0,0,%1
-       cmpwi   %0,0
-       bne-    1f
-       stwcx.  %2,0,%1
-       bne-    0b
-1:
+  __asm__ ("\n\
+0:     lwarx   %0,0,%1 \n\
+       cmpwi   %0,0    \n\
+       bne-    1f      \n\
+       stwcx.  %2,0,%1 \n\
+       bne-    0b      \n\
+1:     \n\
 " : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
   return result;
 }
index 961aafbd62dab92d35950ee169e8c1e4f8742474..80db704835c4244a0737f5f8e8b0f2dfa4d68a13 100644 (file)
@@ -102,101 +102,101 @@ elf_machine_load_address (void)
 /* This code is used in dl-runtime.c to call the `fixup' function
    and then redirect to the address it returns.  It is called
    from code built in the PLT by elf_machine_runtime_setup.  */
-#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
-       .section \".text\"
-       .align 2
-       .globl _dl_runtime_resolve
-       .type _dl_runtime_resolve,@function
-_dl_runtime_resolve:
- # We need to save the registers used to pass parameters, and register 0,
- # which is used by _mcount; the registers are saved in a stack frame.
-       stwu 1,-64(1)
-       stw 0,12(1)
-       stw 3,16(1)
-       stw 4,20(1)
- # The code that calls this has put parameters for `fixup' in r12 and r11.
-       mr 3,12
-       stw 5,24(1)
-       mr 4,11
-       stw 6,28(1)
-       mflr 0
- # We also need to save some of the condition register fields.
-       stw 7,32(1)
-       stw 0,48(1)
-       stw 8,36(1)
-       mfcr 0
-       stw 9,40(1)
-       stw 10,44(1)
-       stw 0,8(1)
-       bl fixup@local
- # 'fixup' returns the address we want to branch to.
-       mtctr 3
- # Put the registers back...
-       lwz 0,48(1)
-       lwz 10,44(1)
-       lwz 9,40(1)
-       mtlr 0
-       lwz 8,36(1)
-       lwz 0,8(1)
-       lwz 7,32(1)
-       lwz 6,28(1)
-       mtcrf 0xFF,0
-       lwz 5,24(1)
-       lwz 4,20(1)
-       lwz 3,16(1)
-       lwz 0,12(1)
- # ...unwind the stack frame, and jump to the PLT entry we updated.
-       addi 1,1,64
-       bctr
-       .size    _dl_runtime_resolve,.-_dl_runtime_resolve
-
-       .align 2
-       .globl _dl_prof_resolve
-       .type _dl_prof_resolve,@function
-_dl_prof_resolve:
- # We need to save the registers used to pass parameters, and register 0,
- # which is used by _mcount; the registers are saved in a stack frame.
-       stwu 1,-64(1)
-        stw 0,12(1)
-       stw 3,16(1)
-       stw 4,20(1)
- # The code that calls this has put parameters for `fixup' in r12 and r11.
-       mr 3,12
-       stw 5,24(1)
-       mr 4,11
-       stw 6,28(1)
-       mflr 5
- # We also need to save some of the condition register fields.
-       stw 7,32(1)
-       stw 5,48(1)
-       stw 8,36(1)
-       mfcr 0
-       stw 9,40(1)
-       stw 10,44(1)
-       stw 0,8(1)
-       bl profile_fixup@local
- # 'fixup' returns the address we want to branch to.
-       mtctr 3
- # Put the registers back...
-       lwz 0,48(1)
-       lwz 10,44(1)
-       lwz 9,40(1)
-       mtlr 0
-       lwz 8,36(1)
-       lwz 0,8(1)
-       lwz 7,32(1)
-       lwz 6,28(1)
-       mtcrf 0xFF,0
-       lwz 5,24(1)
-       lwz 4,20(1)
-       lwz 3,16(1)
-        lwz 0,12(1)
- # ...unwind the stack frame, and jump to the PLT entry we updated.
-       addi 1,1,64
-       bctr
-       .size    _dl_prof_resolve,.-_dl_prof_resolve
- # Undo '.section text'.
-       .previous
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
+       .section \".text\"      \n\
+       .align 2        \n\
+       .globl _dl_runtime_resolve      \n\
+       .type _dl_runtime_resolve,@function     \n\
+_dl_runtime_resolve:   \n\
+ # We need to save the registers used to pass parameters, and register 0,\n\
+ # which is used by _mcount; the registers are saved in a stack frame.\n\
+       stwu 1,-64(1)   \n\
+       stw 0,12(1)     \n\
+       stw 3,16(1)     \n\
+       stw 4,20(1)     \n\
+ # The code that calls this has put parameters for `fixup' in r12 and r11.\n\
+       mr 3,12 \n\
+       stw 5,24(1)     \n\
+       mr 4,11 \n\
+       stw 6,28(1)     \n\
+       mflr 0  \n\
+ # We also need to save some of the condition register fields.\n\
+       stw 7,32(1)     \n\
+       stw 0,48(1)     \n\
+       stw 8,36(1)     \n\
+       mfcr 0  \n\
+       stw 9,40(1)     \n\
+       stw 10,44(1)    \n\
+       stw 0,8(1)      \n\
+       bl fixup@local  \n\
+ # 'fixup' returns the address we want to branch to.\n\
+       mtctr 3 \n\
+ # Put the registers back...\n\
+       lwz 0,48(1)     \n\
+       lwz 10,44(1)    \n\
+       lwz 9,40(1)     \n\
+       mtlr 0  \n\
+       lwz 8,36(1)     \n\
+       lwz 0,8(1)      \n\
+       lwz 7,32(1)     \n\
+       lwz 6,28(1)     \n\
+       mtcrf 0xFF,0    \n\
+       lwz 5,24(1)     \n\
+       lwz 4,20(1)     \n\
+       lwz 3,16(1)     \n\
+       lwz 0,12(1)     \n\
+ # ...unwind the stack frame, and jump to the PLT entry we updated.\n\
+       addi 1,1,64     \n\
+       bctr    \n\
+       .size    _dl_runtime_resolve,.-_dl_runtime_resolve      \n\
+       \n\
+       .align 2        \n\
+       .globl _dl_prof_resolve \n\
+       .type _dl_prof_resolve,@function        \n\
+_dl_prof_resolve:      \n\
+ # We need to save the registers used to pass parameters, and register 0,\n\
+ # which is used by _mcount; the registers are saved in a stack frame.\n\
+       stwu 1,-64(1)   \n\
+        stw 0,12(1)    \n\
+       stw 3,16(1)     \n\
+       stw 4,20(1)     \n\
+ # The code that calls this has put parameters for `fixup' in r12 and r11.\n\
+       mr 3,12 \n\
+       stw 5,24(1)     \n\
+       mr 4,11 \n\
+       stw 6,28(1)     \n\
+       mflr 5  \n\
+ # We also need to save some of the condition register fields.\n\
+       stw 7,32(1)     \n\
+       stw 5,48(1)     \n\
+       stw 8,36(1)     \n\
+       mfcr 0  \n\
+       stw 9,40(1)     \n\
+       stw 10,44(1)    \n\
+       stw 0,8(1)      \n\
+       bl profile_fixup@local  \n\
+ # 'fixup' returns the address we want to branch to.\n\
+       mtctr 3 \n\
+ # Put the registers back...\n\
+       lwz 0,48(1)     \n\
+       lwz 10,44(1)    \n\
+       lwz 9,40(1)     \n\
+       mtlr 0  \n\
+       lwz 8,36(1)     \n\
+       lwz 0,8(1)      \n\
+       lwz 7,32(1)     \n\
+       lwz 6,28(1)     \n\
+       mtcrf 0xFF,0    \n\
+       lwz 5,24(1)     \n\
+       lwz 4,20(1)     \n\
+       lwz 3,16(1)     \n\
+        lwz 0,12(1)    \n\
+ # ...unwind the stack frame, and jump to the PLT entry we updated.\n\
+       addi 1,1,64     \n\
+       bctr    \n\
+       .size    _dl_prof_resolve,.-_dl_prof_resolve    \n\
+ # Undo '.section text'.\n\
+       .previous       \n\
 ");
 
 /* The actual _start code is in dl-start.S.  Use a really
index a06059885951c8f1035ffbbe4280eb27dfce17f5..ce8df3193ea1af40a64d32675dec0ea9662dd821 100644 (file)
@@ -32,12 +32,12 @@ __lrint (double x)
 weak_alias (__lrint, lrint)
 
 /* This code will also work for a 'float' argument.  */
-asm ("\
-        .globl __lrintf
-        .globl lrintf
-        .weak lrintf
-       .set __lrintf,__lrint
-       .set lrintf,__lrint
+asm ("\n\
+       .globl __lrintf \n\
+       .globl lrintf   \n\
+       .weak lrintf    \n\
+       .set __lrintf,__lrint   \n\
+       .set lrintf,__lrint     \n\
 ");
 
 #ifdef NO_LONG_DOUBLE
index f1d3985e322491093abc2fcfee879300e87e309a..5cea8f8775e074fc0377240fbddfac6fba8753aa 100644 (file)
 
 /* This prints out the information in the following form: */
 static const char dumpform[] = "\
-Register dump:
-fp0-3:   0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037%
-fp4-7:   0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f%
-fp8-11:  0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047%
-fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f%
-fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057%
-fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f%
-fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067%
-fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f%
-r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003%  trap=0000028%
-r4 =0000004% r5 =0000005% r6 =0000006% r7 =0000007%   sr0=0000020% sr1=0000021%
-r8 =0000008% r9 =0000009% r10=000000a% r11=000000b%   dar=0000029% dsi=000002a%
-r12=000000c% r13=000000d% r14=000000e% r15=000000f%   r3*=0000022%
-r16=0000010% r17=0000011% r18=0000012% r19=0000013%
-r20=0000014% r21=0000015% r22=0000016% r23=0000017%    lr=0000024% xer=0000025%
-r24=0000018% r25=0000019% r26=000001a% r27=000001b%    mq=0000027% ctr=0000023%
-r28=000001c% r29=000001d% r30=000001e% r31=000001f%  fscr=0000071% ccr=0000026%
+Register dump:\n\
+fp0-3:   0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037%\n\
+fp4-7:   0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f%\n\
+fp8-11:  0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047%\n\
+fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f%\n\
+fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057%\n\
+fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f%\n\
+fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067%\n\
+fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f%\n\
+r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003%  trap=0000028%\n\
+r4 =0000004% r5 =0000005% r6 =0000006% r7 =0000007%   sr0=0000020% sr1=0000021%\n\
+r8 =0000008% r9 =0000009% r10=000000a% r11=000000b%   dar=0000029% dsi=000002a%\n\
+r12=000000c% r13=000000d% r14=000000e% r15=000000f%   r3*=0000022%\n\
+r16=0000010% r17=0000011% r18=0000012% r19=0000013%\n\
+r20=0000014% r21=0000015% r22=0000016% r23=0000017%    lr=0000024% xer=0000025%\n\
+r24=0000018% r25=0000019% r26=000001a% r27=000001b%    mq=0000027% ctr=0000023%\n\
+r28=000001c% r29=000001d% r30=000001e% r31=000001f%  fscr=0000071% ccr=0000026%\n\
 ";
 
 /* Most of the fields are self-explanatory.  'sr0' is the next
index 8bf5bbbefa2dc7fdb9c758066ee49115f513a97a..526e3361d1917389433e9e28da3616f45ee8a8e1 100644 (file)
@@ -1,4 +1,4 @@
-/* bcopy -- copy a block from source to destination.  For IBM S390
+/* bcopy -- copy a block from source to destination.  S/390 version.
    This file is part of the GNU C Library.
    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/*
- * R2 = address of source
- * R3 = address of destination
- * R4 = number of bytes to copy
- */
+/* INPUT PARAMETERS
+     %r2 = address of source
+     %r3 = address of destination
+     %r4 = number of bytes to copy.  */
 
 #include "sysdep.h"
 #include "asm-syntax.h"
 
         .text
 ENTRY(__bcopy)
+       ltr     %r1,%r4             # zero bcopy ?
+       jz      .L4
         clr     %r2,%r3             # check against destructive overlap
         jnl     .L0
-        lr      %r1,%r2
-        alr     %r1,%r4
+        alr     %r1,%r2
         clr     %r1,%r3
-        jh      .L2
-.L0:
-       lr      %r5,%r4             # source length
-        lr      %r4,%r2             # source address
-        sr      %r1,%r1             # set pad byte to zero
-       lr      %r2,%r3             # set destination
-        lr      %r3,%r5             # destination length = source length
-.L1:    mvcle   %r2,%r4,0(%r1)      # thats it, MVCLE is your friend
-        jo      .L1
-        br      %r14
-.L2:                                # destructive overlay, can not use mvcle
+        jh      .L5
+.L0:   ahi     %r4,-1              # length - 1
+       lr      %r1,%r4
+       srl     %r1,8
+       ltr     %r1,%r1
+       jz      .L2
+.L1:   mvc     0(256,%r3),0(%r2)   # move in 256 byte chunks
+       la      %r2,256(%r2)
+       la      %r3,256(%r3)
+       brct    %r1,.L1
+.L2:   bras    %r1,.L3             # setup base pointer for execute
+       mvc     0(1,%r3),0(%r2)     # instruction for execute
+.L3:   ex      %r4,0(%r1)          # execute mvc with length ((%r4)&255)+1
+.L4:   br      %r14
+
+.L5:                                # destructive overlay, can not use mvcle
         lr     %r1,%r2              # bcopy is called with source,dest
         lr     %r2,%r3              # memmove with dest,source! Oh, well...
         lr     %r3,%r1
         basr   %r1,0
-.L3:
+.L6:
 #ifdef PIC
-        al     %r1,.L4-.L3(%r1)     # get address of global offset table
+        al     %r1,.L7-.L6(%r1)     # get address of global offset table
                                     # load address of memmove
         l      %r1,memmove@GOT12(%r1)
         br     %r1
-.L4:    .long  _GLOBAL_OFFSET_TABLE_-.L3
+.L7:    .long  _GLOBAL_OFFSET_TABLE_-.L6
 #else
-        al     %r1,.L4-.L3(%r1)     # load address of memmove
+        al     %r1,.L7-.L6(%r1)     # load address of memmove
         br     %r1                  # jump to memmove
-.L4:    .long  memmove-.L3
+.L7:    .long  memmove-.L6
 #endif
 
 END(__bcopy)
@@ -67,3 +72,4 @@ END(__bcopy)
 #ifndef NO_WEAK_ALIAS
 weak_alias (__bcopy, bcopy)
 #endif
+
index 4bbec7c6337fb5ff4d184c2913cb219ab974a16d..9c4b8409283c171e2bf3b45c3c9ae0d15313aae2 100644 (file)
@@ -1,4 +1,4 @@
-/* Set a block of memory to some byte value.  For IBM S390
+/* memcpy - copy a block from source to destination.  S/390 version.
    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
 
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/*
- * R2 = address to destination memory area
- * R3 = address to source memory area
- * R4 = number of bytes to copy
- */
+/* INPUT PARAMETERS
+     %r2 = address of destination memory area
+     %r3 = address of source memory area
+     %r4 = number of bytes to copy.  */
 
 #include "sysdep.h"
 #include "asm-syntax.h"
 
        .text
 ENTRY(memcpy)
-       ltr     %r5,%r4
+       ltr     %r4,%r4
+       jz      .L3
+       ahi     %r4,-1              # length - 1
+       lr      %r1,%r2             # copy destination address
+       lr      %r5,%r4
+       sra     %r5,8
        jz      .L1
-       lr      %r4,%r3             # %r4/%r5 = source ptr/len
-       lr      %r3,%r5             # %r2/%r3 = dest ptr/len
-       lr      %r0,%r2             # save source address
-.L0:    mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
-       jo      .L0
-       lr      %r2,%r0             # return value is source address
-.L1:
-       br      %r14
-END(memset)
+.L0:   mvc     0(256,%r1),0(%r3)   # move in 256 byte chunks
+       la      %r1,256(%r1)
+       la      %r3,256(%r3)
+       brct    %r5,.L0
+.L1:   bras    %r5,.L2             # setup base pointer for execute
+       mvc     0(1,%r1),0(%r3)     # instruction for execute
+.L2:   ex      %r4,0(%r5)          # execute mvc with length ((%r4)&255)+1
+.L3:   br      %r14
+END(memcpy)
+       
index 5cb02b316297b56e5128bc56e97be0440dd1f201..0d75d3ea9f19f0b668e2e40dff5eb06a12359302 100644 (file)
@@ -1,6 +1,6 @@
 /* bcopy -- copy a block from source to destination.  64 bit S/390 version.
    This file is part of the GNU C Library.
-   Copyright (C) 2001 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
 
    The GNU C Library is free software  ; you can redistribute it and/or
 #include "sysdep.h"
 #include "asm-syntax.h"
 
-        .text
+       .text
 ENTRY(__bcopy)
-        clgr    %r2,%r3             # check against destructive overlap
-        jnl     .L0
-        lgr     %r1,%r2
-        algr    %r1,%r4
-        clgr    %r1,%r3
-        jh      .L2
-.L0:
-       lgr     %r5,%r4             # source length
-        lgr     %r4,%r2             # source address
-        sgr     %r1,%r1             # set pad byte to zero
-       lgr     %r2,%r3             # set destination
-        lgr     %r3,%r5             # destination length = source length
-.L1:    mvcle   %r2,%r4,0(%r1)      # thats it, MVCLE is your friend
-        jo      .L1
-        br      %r14
-.L2:                                # destructive overlay, can not use mvcle
-        lgr    %r1,%r2              # bcopy is called with source,dest
-        lgr    %r2,%r3              # memmove with dest,source! Oh, well...
-        lgr    %r3,%r1
+       ltgr    %r1,%r4             # zero bcopy ?
+       jz      .L4
+       clgr    %r2,%r3             # check against destructive overlap
+       jnl     .L0
+       algr    %r1,%r2
+       clgr    %r1,%r3
+       jh      .L5
+.L0:   aghi    %r4,-1              # length - 1
+       srlg    %r1,%r4,8
+       ltgr    %r1,%r1
+       jz      .L2
+.L1:   mvc     0(256,%r3),0(%r2)   # move in 256 byte chunks
+       la      %r2,256(%r2)
+       la      %r3,256(%r3)
+       brctg   %r1,.L1
+.L2:   bras    %r1,.L3             # setup base pointer for execute
+       mvc     0(1,%r3),0(%r2)     # instruction for execute
+.L3:   ex      %r4,0(%r1)          # execute mvc with length ((%r4)&255)+1
+.L4:   br      %r14
+
+.L5:                               # destructive overlay, can not use mvcle
+       lgr    %r1,%r2              # bcopy is called with source,dest
+       lgr    %r2,%r3              # memmove with dest,source! Oh, well...
+       lgr    %r3,%r1
 #ifdef PIC
        jg     memmove@PLT
 #else
index 3d14b0b2839a163452c7ab4b6bbce9d0f8c4f4d7..be5614b203fc9d0f957157a9d950bbeb9996e6c2 100644 (file)
@@ -68,8 +68,8 @@ _init:
        AGHI    15,-160
        STG     1,0(15)
         LARL    12,_GLOBAL_OFFSET_TABLE_
-        LGHI    1,__gmon_start__@GOT
-       LG      1,0(1,12)
+       LARL    1,__gmon_start__@GOTENT
+       LG      1,0(1)
        LTGR    1,1
        JE      .L22
        BASR    14,1
index c59d3fbb7909b3f02313a46c4fe3b0fdea4e1060..008f02690930a05bfe30545916aac72d7d99816f 100644 (file)
@@ -1,7 +1,6 @@
-/* Set a block of memory to some byte value.  64 bit S/390 version.
-   Copyright (C) 2001 Free Software Foundation, Inc.
+/* memcpy - copy a block from source to destination.  64 bit S/390 version.
+   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
-   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 Library General Public License as
@@ -19,8 +18,8 @@
    Boston, MA 02111-1307, USA.  */
 
 /* INPUT PARAMETERS
-     %r2 = address to destination memory area
-     %r3 = address to source memory area
+     %r2 = address of destination memory area
+     %r3 = address of source memory area
      %r4 = number of bytes to copy.  */
 
 #include "sysdep.h"
 
        .text
 ENTRY(memcpy)
-       ltgr    %r5,%r4
+       ltgr    %r4,%r4
+       jz      .L3
+       aghi    %r4,-1              # length - 1
+       lgr     %r1,%r2             # copy destination address
+       srag    %r5,%r4,8
        jz      .L1
-       lgr     %r4,%r3             # %r4/%r5 = source ptr/len
-       lgr     %r3,%r5             # %r2/%r3 = dest ptr/len
-       lgr     %r0,%r2             # save source address
-.L0:   mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
-       jo      .L0
-       lgr     %r2,%r0             # return value is source address
-.L1:
-       br      %r14
-END(memset)
+.L0:   mvc     0(256,%r1),0(%r3)   # move in 256 byte chunks
+       la      %r1,256(%r1)
+       la      %r3,256(%r3)
+       brctg   %r5,.L0
+.L1:   bras    %r5,.L2             # setup base pointer for execute
+       mvc     0(1,%r1),0(%r3)     # instruction for execute
+.L2:   ex      %r4,0(%r5)          # execute mvc with length ((%r4)&255)+1
+.L3:   br      %r14
+END(memcpy)
+       
This page took 0.105963 seconds and 5 git commands to generate.