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