blob: 95173296669da01fe1027cc2ca7d0618c1662bb8 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Phil Edworthy8e5ab4b2011-06-02 22:15:27 +00002/* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006
4 Free Software Foundation, Inc.
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02005 */
Phil Edworthy8e5ab4b2011-06-02 22:15:27 +00006
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
32movmem_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
51movmem_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
170L_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
190L_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
197L_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)