Linux 6.13-rc4
[linux.git] / arch / sh / lib / movmem.S
blob8ac54d6b38a1b9f505370bc9f2c4b19e3cc73628
1 /* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
3    Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4    2004, 2005, 2006
5    Free Software Foundation, Inc.
6 */
8 !! libgcc routines for the Renesas / SuperH SH CPUs.
9 !! Contributed by Steve Chamberlain.
10 !! sac@cygnus.com
12 !! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
13 !! recoded in assembly by Toshiyasu Morita
14 !! tm@netcom.com
16 /* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
17    ELF local label prefixes by J"orn Rennecke
18    amylaar@cygnus.com  */
20         .text
21         .balign 4
22         .global __movmem
23         .global __movstr
24         .set __movstr, __movmem 
25         /* This would be a lot simpler if r6 contained the byte count
26            minus 64, and we wouldn't be called here for a byte count of 64.  */
27 __movmem:
28         sts.l   pr,@-r15
29         shll2   r6
30         bsr     __movmemSI52+2
31         mov.l   @(48,r5),r0
32         .balign 4
33 movmem_loop: /* Reached with rts */
34         mov.l   @(60,r5),r0
35         add     #-64,r6
36         mov.l   r0,@(60,r4)
37         tst     r6,r6
38         mov.l   @(56,r5),r0
39         bt      movmem_done
40         mov.l   r0,@(56,r4)
41         cmp/pl  r6
42         mov.l   @(52,r5),r0
43         add     #64,r5
44         mov.l   r0,@(52,r4)
45         add     #64,r4
46         bt      __movmemSI52
47 ! done all the large groups, do the remainder
48 ! jump to movmem+
49         mova    __movmemSI4+4,r0
50         add     r6,r0
51         jmp     @r0
52 movmem_done: ! share slot insn, works out aligned.
53         lds.l   @r15+,pr
54         mov.l   r0,@(56,r4)
55         mov.l   @(52,r5),r0
56         rts
57         mov.l   r0,@(52,r4)
58         .balign 4
60         .global __movmemSI64
61         .global __movstrSI64
62         .set    __movstrSI64, __movmemSI64
63 __movmemSI64:
64         mov.l   @(60,r5),r0
65         mov.l   r0,@(60,r4)
66         .global __movmemSI60
67         .global __movstrSI60
68         .set    __movstrSI60, __movmemSI60
69 __movmemSI60:
70         mov.l   @(56,r5),r0
71         mov.l   r0,@(56,r4)
72         .global __movmemSI56
73         .global __movstrSI56
74         .set    __movstrSI56, __movmemSI56
75 __movmemSI56:
76         mov.l   @(52,r5),r0
77         mov.l   r0,@(52,r4)
78         .global __movmemSI52
79         .global __movstrSI52
80         .set    __movstrSI52, __movmemSI52
81 __movmemSI52:
82         mov.l   @(48,r5),r0
83         mov.l   r0,@(48,r4)
84         .global __movmemSI48
85         .global __movstrSI48
86         .set    __movstrSI48, __movmemSI48
87 __movmemSI48:
88         mov.l   @(44,r5),r0
89         mov.l   r0,@(44,r4)
90         .global __movmemSI44
91         .global __movstrSI44
92         .set    __movstrSI44, __movmemSI44
93 __movmemSI44:
94         mov.l   @(40,r5),r0
95         mov.l   r0,@(40,r4)
96         .global __movmemSI40
97         .global __movstrSI40
98         .set    __movstrSI40, __movmemSI40
99 __movmemSI40:
100         mov.l   @(36,r5),r0
101         mov.l   r0,@(36,r4)
102         .global __movmemSI36
103         .global __movstrSI36
104         .set    __movstrSI36, __movmemSI36
105 __movmemSI36:
106         mov.l   @(32,r5),r0
107         mov.l   r0,@(32,r4)
108         .global __movmemSI32
109         .global __movstrSI32
110         .set    __movstrSI32, __movmemSI32
111 __movmemSI32:
112         mov.l   @(28,r5),r0
113         mov.l   r0,@(28,r4)
114         .global __movmemSI28
115         .global __movstrSI28
116         .set    __movstrSI28, __movmemSI28
117 __movmemSI28:
118         mov.l   @(24,r5),r0
119         mov.l   r0,@(24,r4)
120         .global __movmemSI24
121         .global __movstrSI24
122         .set    __movstrSI24, __movmemSI24
123 __movmemSI24:
124         mov.l   @(20,r5),r0
125         mov.l   r0,@(20,r4)
126         .global __movmemSI20
127         .global __movstrSI20
128         .set    __movstrSI20, __movmemSI20
129 __movmemSI20:
130         mov.l   @(16,r5),r0
131         mov.l   r0,@(16,r4)
132         .global __movmemSI16
133         .global __movstrSI16
134         .set    __movstrSI16, __movmemSI16
135 __movmemSI16:
136         mov.l   @(12,r5),r0
137         mov.l   r0,@(12,r4)
138         .global __movmemSI12
139         .global __movstrSI12
140         .set    __movstrSI12, __movmemSI12
141 __movmemSI12:
142         mov.l   @(8,r5),r0
143         mov.l   r0,@(8,r4)
144         .global __movmemSI8
145         .global __movstrSI8
146         .set    __movstrSI8, __movmemSI8
147 __movmemSI8:
148         mov.l   @(4,r5),r0
149         mov.l   r0,@(4,r4)
150         .global __movmemSI4
151         .global __movstrSI4
152         .set    __movstrSI4, __movmemSI4
153 __movmemSI4:
154         mov.l   @(0,r5),r0
155         rts
156         mov.l   r0,@(0,r4)
158         .global __movmem_i4_even
159         .global __movstr_i4_even
160         .set    __movstr_i4_even, __movmem_i4_even
162         .global __movmem_i4_odd
163         .global __movstr_i4_odd
164         .set    __movstr_i4_odd, __movmem_i4_odd
166         .global __movmemSI12_i4
167         .global __movstrSI12_i4
168         .set    __movstrSI12_i4, __movmemSI12_i4
170         .p2align        5
171 L_movmem_2mod4_end:
172         mov.l   r0,@(16,r4)
173         rts
174         mov.l   r1,@(20,r4)
176         .p2align        2
178 __movmem_i4_even:
179         mov.l   @r5+,r0
180         bra     L_movmem_start_even
181         mov.l   @r5+,r1
183 __movmem_i4_odd:
184         mov.l   @r5+,r1
185         add     #-4,r4
186         mov.l   @r5+,r2
187         mov.l   @r5+,r3
188         mov.l   r1,@(4,r4)
189         mov.l   r2,@(8,r4)
191 L_movmem_loop:
192         mov.l   r3,@(12,r4)
193         dt      r6
194         mov.l   @r5+,r0
195         bt/s    L_movmem_2mod4_end
196         mov.l   @r5+,r1
197         add     #16,r4
198 L_movmem_start_even:
199         mov.l   @r5+,r2
200         mov.l   @r5+,r3
201         mov.l   r0,@r4
202         dt      r6
203         mov.l   r1,@(4,r4)
204         bf/s    L_movmem_loop
205         mov.l   r2,@(8,r4)
206         rts
207         mov.l   r3,@(12,r4)
209         .p2align        4
210 __movmemSI12_i4:
211         mov.l   @r5,r0
212         mov.l   @(4,r5),r1
213         mov.l   @(8,r5),r2
214         mov.l   r0,@r4
215         mov.l   r1,@(4,r4)
216         rts
217         mov.l   r2,@(8,r4)