]>
Commit | Line | Data |
---|---|---|
ffeac417 | 1 | /* bcopy -- copy a block from source to destination. 64 bit S/390 version. |
847b055c | 2 | This file is part of the GNU C Library. |
bfff8b1b | 3 | Copyright (C) 2000-2017 Free Software Foundation, Inc. |
847b055c AJ |
4 | Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). |
5 | ||
41bdb6e2 AJ |
6 | The GNU C Library is free software; you can redistribute it and/or |
7 | modify it under the terms of the GNU Lesser General Public | |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
847b055c AJ |
10 | |
11 | The GNU C Library is distributed in the hope that it will be useful, | |
41bdb6e2 | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
847b055c | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
41bdb6e2 | 14 | Lesser General Public License for more details. |
847b055c | 15 | |
41bdb6e2 | 16 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
17 | License along with the GNU C Library; if not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
847b055c | 19 | |
ffeac417 UD |
20 | /* INPUT PARAMETERS |
21 | %r2 = address of source | |
22 | %r3 = address of destination | |
23 | %r4 = number of bytes to copy. */ | |
847b055c AJ |
24 | |
25 | #include "sysdep.h" | |
26 | #include "asm-syntax.h" | |
27 | ||
c891b2df | 28 | .text |
847b055c | 29 | ENTRY(__bcopy) |
c891b2df UD |
30 | ltgr %r1,%r4 # zero bcopy ? |
31 | jz .L4 | |
32 | clgr %r2,%r3 # check against destructive overlap | |
33 | jnl .L0 | |
34 | algr %r1,%r2 | |
35 | clgr %r1,%r3 | |
3c204435 | 36 | jh .L7 |
c891b2df UD |
37 | .L0: aghi %r4,-1 # length - 1 |
38 | srlg %r1,%r4,8 | |
3c204435 | 39 | ltgr %r1,%r1 # < 256 bytes to move ? |
c891b2df | 40 | jz .L2 |
3c204435 UD |
41 | cghi %r1,255 # > 1MB to move ? |
42 | jh .L5 | |
c891b2df UD |
43 | .L1: mvc 0(256,%r3),0(%r2) # move in 256 byte chunks |
44 | la %r2,256(%r2) | |
45 | la %r3,256(%r3) | |
46 | brctg %r1,.L1 | |
47 | .L2: bras %r1,.L3 # setup base pointer for execute | |
48 | mvc 0(1,%r3),0(%r2) # instruction for execute | |
49 | .L3: ex %r4,0(%r1) # execute mvc with length ((%r4)&255)+1 | |
50 | .L4: br %r14 | |
3c204435 UD |
51 | # data copies > 1MB are faster with mvcle. |
52 | .L5: aghi %r4,1 # length + 1 | |
53 | lgr %r5,%r4 # source length | |
54 | lgr %r4,%r2 # source address | |
55 | lgr %r2,%r3 # set destination | |
56 | lgr %r3,%r5 # destination length = source length | |
57 | .L6: mvcle %r2,%r4,0 # thats it, MVCLE is your friend | |
58 | jo .L6 | |
59 | br %r14 | |
60 | .L7: # destructive overlay, can not use mvcle | |
d1abd625 UD |
61 | lgr %r1,%r2 # bcopy is called with source,dest |
62 | lgr %r2,%r3 # memmove with dest,source! Oh, well... | |
63 | lgr %r3,%r1 | |
64 | jg HIDDEN_BUILTIN_JUMPTARGET(memmove) | |
847b055c AJ |
65 | |
66 | END(__bcopy) | |
67 | ||
68 | #ifndef NO_WEAK_ALIAS | |
69 | weak_alias (__bcopy, bcopy) | |
70 | #endif | |
ffeac417 | 71 |