GNU Linux-libre 4.4.283-gnu1
[releases.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/nospec-insn.h>
9
10         GEN_BR_THUNK %r14
11
12 /*
13  * memset implementation
14  *
15  * This code corresponds to the C construct below. We do distinguish
16  * between clearing (c == 0) and setting a memory array (c != 0) simply
17  * because nearly all memset invocations in the kernel clear memory and
18  * the xc instruction is preferred in such cases.
19  *
20  * void *memset(void *s, int c, size_t n)
21  * {
22  *      if (likely(c == 0))
23  *              return __builtin_memset(s, 0, n);
24  *      return __builtin_memset(s, c, n);
25  * }
26  */
27 ENTRY(memset)
28         ltgr    %r4,%r4
29         jz      .Lmemset_exit
30         ltgr    %r3,%r3
31         jnz     .Lmemset_fill
32         aghi    %r4,-1
33         srlg    %r3,%r4,8
34         ltgr    %r3,%r3
35         lgr     %r1,%r2
36         jz      .Lmemset_clear_rest
37 .Lmemset_clear_loop:
38         xc      0(256,%r1),0(%r1)
39         la      %r1,256(%r1)
40         brctg   %r3,.Lmemset_clear_loop
41 .Lmemset_clear_rest:
42         larl    %r3,.Lmemset_xc
43         ex      %r4,0(%r3)
44 .Lmemset_exit:
45         BR_EX   %r14
46 .Lmemset_fill:
47         stc     %r3,0(%r2)
48         cghi    %r4,1
49         lgr     %r1,%r2
50         je      .Lmemset_fill_exit
51         aghi    %r4,-2
52         srlg    %r3,%r4,8
53         ltgr    %r3,%r3
54         jz      .Lmemset_fill_rest
55 .Lmemset_fill_loop:
56         mvc     1(256,%r1),0(%r1)
57         la      %r1,256(%r1)
58         brctg   %r3,.Lmemset_fill_loop
59 .Lmemset_fill_rest:
60         larl    %r3,.Lmemset_mvc
61         ex      %r4,0(%r3)
62 .Lmemset_fill_exit:
63         BR_EX   %r14
64 .Lmemset_xc:
65         xc      0(1,%r1),0(%r1)
66 .Lmemset_mvc:
67         mvc     1(1,%r1),0(%r1)
68
69 /*
70  * memcpy implementation
71  *
72  * void *memcpy(void *dest, const void *src, size_t n)
73  */
74 ENTRY(memcpy)
75         ltgr    %r4,%r4
76         jz      .Lmemcpy_exit
77         aghi    %r4,-1
78         srlg    %r5,%r4,8
79         ltgr    %r5,%r5
80         lgr     %r1,%r2
81         jnz     .Lmemcpy_loop
82 .Lmemcpy_rest:
83         larl    %r5,.Lmemcpy_mvc
84         ex      %r4,0(%r5)
85 .Lmemcpy_exit:
86         BR_EX   %r14
87 .Lmemcpy_loop:
88         mvc     0(256,%r1),0(%r3)
89         la      %r1,256(%r1)
90         la      %r3,256(%r3)
91         brctg   %r5,.Lmemcpy_loop
92         j       .Lmemcpy_rest
93 .Lmemcpy_mvc:
94         mvc     0(1,%r1),0(%r3)