xref: /openbmc/u-boot/arch/sh/lib/movmem.S (revision 7b384eccc785b596f68448b155cbda26df57fb23)
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)
217