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