]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/s390/s390-64/bcopy.S
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / s390 / s390-64 / bcopy.S
index bb3acdb70806f0303f6a44a4f63ec668dd40ae87..fdfbfdfb0bc3e398e4f4ea5fe19dab0742710b96 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) 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 2000-2014 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
@@ -14,9 +14,8 @@
    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.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 /* INPUT PARAMETERS
      %r2 = address of source
@@ -34,11 +33,13 @@ ENTRY(__bcopy)
        jnl     .L0
        algr    %r1,%r2
        clgr    %r1,%r3
-       jh      .L5
+       jh      .L7
 .L0:   aghi    %r4,-1              # length - 1
        srlg    %r1,%r4,8
-       ltgr    %r1,%r1
+       ltgr    %r1,%r1             # < 256 bytes to move ?
        jz      .L2
+       cghi    %r1,255             # > 1MB to move ?
+       jh      .L5
 .L1:   mvc     0(256,%r3),0(%r2)   # move in 256 byte chunks
        la      %r2,256(%r2)
        la      %r3,256(%r3)
@@ -47,16 +48,20 @@ ENTRY(__bcopy)
        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
-       jg     memmove
-#endif
+       # data copies > 1MB are faster with mvcle.
+.L5:   aghi    %r4,1               # length + 1
+       lgr     %r5,%r4             # source length
+       lgr     %r4,%r2             # source address
+       lgr     %r2,%r3             # set destination
+       lgr     %r3,%r5             # destination length = source length
+.L6:   mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
+       jo      .L6
+       br      %r14
+.L7:                               # 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
+       jg      HIDDEN_BUILTIN_JUMPTARGET(memmove)
 
 END(__bcopy)