]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/s390/lib/mem.S
Merge tag 'v4.10-rc7' into efi/core, to pick up fixes
[karo-tx-linux.git] / arch / s390 / lib / mem.S
1 /*
2  * String handling functions.
3  *
4  * Copyright IBM Corp. 2012
5  */
6
7 #include <linux/linkage.h>
8 #include <asm/export.h>
9
10 /*
11  * void *memmove(void *dest, const void *src, size_t n)
12  */
13 ENTRY(memmove)
14         ltgr    %r4,%r4
15         lgr     %r1,%r2
16         bzr     %r14
17         clgr    %r2,%r3
18         jnh     .Lmemmove_forward
19         la      %r5,0(%r4,%r3)
20         clgr    %r2,%r5
21         jl      .Lmemmove_reverse
22 .Lmemmove_forward:
23         aghi    %r4,-1
24         srlg    %r0,%r4,8
25         ltgr    %r0,%r0
26         jz      .Lmemmove_rest
27 .Lmemmove_loop:
28         mvc     0(256,%r1),0(%r3)
29         la      %r1,256(%r1)
30         la      %r3,256(%r3)
31         brctg   %r0,.Lmemmove_loop
32 .Lmemmove_rest:
33         larl    %r5,.Lmemmove_mvc
34         ex      %r4,0(%r5)
35         br      %r14
36 .Lmemmove_reverse:
37         aghi    %r4,-1
38 .Lmemmove_reverse_loop:
39         ic      %r0,0(%r4,%r3)
40         stc     %r0,0(%r4,%r1)
41         brctg   %r4,.Lmemmove_reverse_loop
42         ic      %r0,0(%r4,%r3)
43         stc     %r0,0(%r4,%r1)
44         br      %r14
45 .Lmemmove_mvc:
46         mvc     0(1,%r1),0(%r3)
47 EXPORT_SYMBOL(memmove)
48
49 /*
50  * memset implementation
51  *
52  * This code corresponds to the C construct below. We do distinguish
53  * between clearing (c == 0) and setting a memory array (c != 0) simply
54  * because nearly all memset invocations in the kernel clear memory and
55  * the xc instruction is preferred in such cases.
56  *
57  * void *memset(void *s, int c, size_t n)
58  * {
59  *      if (likely(c == 0))
60  *              return __builtin_memset(s, 0, n);
61  *      return __builtin_memset(s, c, n);
62  * }
63  */
64 ENTRY(memset)
65         ltgr    %r4,%r4
66         bzr     %r14
67         ltgr    %r3,%r3
68         jnz     .Lmemset_fill
69         aghi    %r4,-1
70         srlg    %r3,%r4,8
71         ltgr    %r3,%r3
72         lgr     %r1,%r2
73         jz      .Lmemset_clear_rest
74 .Lmemset_clear_loop:
75         xc      0(256,%r1),0(%r1)
76         la      %r1,256(%r1)
77         brctg   %r3,.Lmemset_clear_loop
78 .Lmemset_clear_rest:
79         larl    %r3,.Lmemset_xc
80         ex      %r4,0(%r3)
81         br      %r14
82 .Lmemset_fill:
83         stc     %r3,0(%r2)
84         cghi    %r4,1
85         lgr     %r1,%r2
86         ber     %r14
87         aghi    %r4,-2
88         srlg    %r3,%r4,8
89         ltgr    %r3,%r3
90         jz      .Lmemset_fill_rest
91 .Lmemset_fill_loop:
92         mvc     1(256,%r1),0(%r1)
93         la      %r1,256(%r1)
94         brctg   %r3,.Lmemset_fill_loop
95 .Lmemset_fill_rest:
96         larl    %r3,.Lmemset_mvc
97         ex      %r4,0(%r3)
98         br      %r14
99 .Lmemset_xc:
100         xc      0(1,%r1),0(%r1)
101 .Lmemset_mvc:
102         mvc     1(1,%r1),0(%r1)
103 EXPORT_SYMBOL(memset)
104
105 /*
106  * memcpy implementation
107  *
108  * void *memcpy(void *dest, const void *src, size_t n)
109  */
110 ENTRY(memcpy)
111         ltgr    %r4,%r4
112         bzr     %r14
113         aghi    %r4,-1
114         srlg    %r5,%r4,8
115         ltgr    %r5,%r5
116         lgr     %r1,%r2
117         jnz     .Lmemcpy_loop
118 .Lmemcpy_rest:
119         larl    %r5,.Lmemcpy_mvc
120         ex      %r4,0(%r5)
121         br      %r14
122 .Lmemcpy_loop:
123         mvc     0(256,%r1),0(%r3)
124         la      %r1,256(%r1)
125         la      %r3,256(%r3)
126         brctg   %r5,.Lmemcpy_loop
127         j       .Lmemcpy_rest
128 .Lmemcpy_mvc:
129         mvc     0(1,%r1),0(%r3)
130 EXPORT_SYMBOL(memcpy)