hurd: XFAIL tests for signal features not implemented yet
[glibc.git] / sysdeps / s390 / s390-32 / memcpy.S
blob493cc18aba67d6ec3a419225191dcb21167c18bd
1 /* memcpy - copy a block from source to destination.  S/390 version.
2    Copyright (C) 2012-2018 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
20 #include "sysdep.h"
21 #include "asm-syntax.h"
23 /* INPUT PARAMETERS
24      %r2 = address of destination memory area
25      %r3 = address of source memory area
26      %r4 = number of bytes to copy.  */
28        .text
29 ENTRY(__mempcpy)
30         .machine "g5"
31         lr      %r1,%r2             # Use as dest
32         la      %r2,0(%r4,%r2)      # Return dest + n
33         j       .L_G5_start
34 END(__mempcpy)
35 #ifndef USE_MULTIARCH
36 libc_hidden_def (__mempcpy)
37 weak_alias (__mempcpy, mempcpy)
38 libc_hidden_builtin_def (mempcpy)
39 #endif
41 ENTRY(memcpy)
42         .machine "g5"
43         lr      %r1,%r2             # r1: Use as dest ; r2: Return dest
44 .L_G5_start:
45         ltr     %r4,%r4
46         je      .L_G5_99
47         ahi     %r4,-1
48         lr      %r5,%r4
49         srl     %r5,8
50         ltr     %r5,%r5
51         jne     .L_G5_13
52 .L_G5_4:
53         basr    %r5,0
54 .L_G5_16:
55         ex      %r4,.L_G5_17-.L_G5_16(%r5)
56 .L_G5_99:
57         br      %r14
58 .L_G5_13:
59         chi     %r5,4096            # Switch to mvcle for copies >1MB
60         jh      __memcpy_mvcle
61 .L_G5_12:
62         mvc     0(256,%r1),0(%r3)
63         la      %r1,256(%r1)
64         la      %r3,256(%r3)
65         brct    %r5,.L_G5_12
66         j       .L_G5_4
67 .L_G5_17:
68         mvc     0(1,%r1),0(%r3)
69 END(memcpy)
70 #ifndef USE_MULTIARCH
71 libc_hidden_builtin_def (memcpy)
72 #endif
74 ENTRY(__memcpy_mvcle)
75         # Using as standalone function will result in unexpected
76         # results since the length field is incremented by 1 in order to
77         # compensate the changes already done in the functions above.
78         lr      %r0,%r2             # backup return dest [ + n ]
79         ahi     %r4,1               # length + 1
80         lr      %r5,%r4             # source length
81         lr      %r4,%r3             # source address
82         lr      %r2,%r1             # destination address
83         lr      %r3,%r5             # destination length = source length
84 .L_MVCLE_1:
85         mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
86         jo      .L_MVCLE_1
87         lr      %r2,%r0             # return destination address
88         br      %r14
89 END(__memcpy_mvcle)