1/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
2
3 Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 2004, 2005, 2006
5 Free Software Foundation, Inc.
6*/
7
8!! libgcc routines for the Renesas / SuperH SH CPUs.
9!! Contributed by Steve Chamberlain.
10!! sac@cygnus.com
11
12!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
13!! recoded in assembly by Toshiyasu Morita
14!! tm@netcom.com
15
16/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
17 ELF local label prefixes by J"orn Rennecke
18 amylaar@cygnus.com */
19
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
33movmem_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
52movmem_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
59
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)
157
158 .global __movmem_i4_even
159 .global __movstr_i4_even
160 .set __movstr_i4_even, __movmem_i4_even
161
162 .global __movmem_i4_odd
163 .global __movstr_i4_odd
164 .set __movstr_i4_odd, __movmem_i4_odd
165
166 .global __movmemSI12_i4
167 .global __movstrSI12_i4
168 .set __movstrSI12_i4, __movmemSI12_i4
169
170 .p2align 5
171L_movmem_2mod4_end:
172 mov.l r0,@(16,r4)
173 rts
174 mov.l r1,@(20,r4)
175
176 .p2align 2
177
178__movmem_i4_even:
179 mov.l @r5+,r0
180 bra L_movmem_start_even
181 mov.l @r5+,r1
182
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)
190
191L_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
198L_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)
208
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)
218

source code of linux/arch/sh/lib/movmem.S