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
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
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
171 L_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 
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)
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