lib1funcs.S revision 1.10 1 1.10 mrg /* Copyright (C) 1994-2022 Free Software Foundation, Inc.
2 1.1 mrg
3 1.1 mrg This file is free software; you can redistribute it and/or modify it
4 1.1 mrg under the terms of the GNU General Public License as published by the
5 1.1 mrg Free Software Foundation; either version 3, or (at your option) any
6 1.1 mrg later version.
7 1.1 mrg
8 1.1 mrg This file is distributed in the hope that it will be useful, but
9 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of
10 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 1.1 mrg General Public License for more details.
12 1.1 mrg
13 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
14 1.1 mrg permissions described in the GCC Runtime Library Exception, version
15 1.1 mrg 3.1, as published by the Free Software Foundation.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License and
18 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
19 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
20 1.1 mrg <http://www.gnu.org/licenses/>. */
21 1.1 mrg
22 1.1 mrg
23 1.1 mrg !! libgcc routines for the Renesas / SuperH SH CPUs.
24 1.1 mrg !! Contributed by Steve Chamberlain.
25 1.1 mrg !! sac@cygnus.com
26 1.1 mrg
27 1.1 mrg !! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
28 1.1 mrg !! recoded in assembly by Toshiyasu Morita
29 1.1 mrg !! tm@netcom.com
30 1.1 mrg
31 1.1 mrg #if defined(__ELF__) && defined(__linux__)
32 1.1 mrg .section .note.GNU-stack,"",%progbits
33 1.1 mrg .previous
34 1.1 mrg #endif
35 1.1 mrg
36 1.1 mrg /* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
37 1.1 mrg ELF local label prefixes by J"orn Rennecke
38 1.1 mrg amylaar (at) cygnus.com */
39 1.1 mrg
40 1.1 mrg #include "lib1funcs.h"
41 1.1 mrg
42 1.1 mrg /* t-vxworks needs to build both PIC and non-PIC versions of libgcc,
43 1.1 mrg so it is more convenient to define NO_FPSCR_VALUES here than to
44 1.1 mrg define it on the command line. */
45 1.1 mrg #if defined __vxworks && defined __PIC__
46 1.1 mrg #define NO_FPSCR_VALUES
47 1.1 mrg #endif
48 1.1 mrg
49 1.1 mrg #ifdef L_ashiftrt
50 1.1 mrg .global GLOBAL(ashiftrt_r4_0)
51 1.1 mrg .global GLOBAL(ashiftrt_r4_1)
52 1.1 mrg .global GLOBAL(ashiftrt_r4_2)
53 1.1 mrg .global GLOBAL(ashiftrt_r4_3)
54 1.1 mrg .global GLOBAL(ashiftrt_r4_4)
55 1.1 mrg .global GLOBAL(ashiftrt_r4_5)
56 1.1 mrg .global GLOBAL(ashiftrt_r4_6)
57 1.1 mrg .global GLOBAL(ashiftrt_r4_7)
58 1.1 mrg .global GLOBAL(ashiftrt_r4_8)
59 1.1 mrg .global GLOBAL(ashiftrt_r4_9)
60 1.1 mrg .global GLOBAL(ashiftrt_r4_10)
61 1.1 mrg .global GLOBAL(ashiftrt_r4_11)
62 1.1 mrg .global GLOBAL(ashiftrt_r4_12)
63 1.1 mrg .global GLOBAL(ashiftrt_r4_13)
64 1.1 mrg .global GLOBAL(ashiftrt_r4_14)
65 1.1 mrg .global GLOBAL(ashiftrt_r4_15)
66 1.1 mrg .global GLOBAL(ashiftrt_r4_16)
67 1.1 mrg .global GLOBAL(ashiftrt_r4_17)
68 1.1 mrg .global GLOBAL(ashiftrt_r4_18)
69 1.1 mrg .global GLOBAL(ashiftrt_r4_19)
70 1.1 mrg .global GLOBAL(ashiftrt_r4_20)
71 1.1 mrg .global GLOBAL(ashiftrt_r4_21)
72 1.1 mrg .global GLOBAL(ashiftrt_r4_22)
73 1.1 mrg .global GLOBAL(ashiftrt_r4_23)
74 1.1 mrg .global GLOBAL(ashiftrt_r4_24)
75 1.1 mrg .global GLOBAL(ashiftrt_r4_25)
76 1.1 mrg .global GLOBAL(ashiftrt_r4_26)
77 1.1 mrg .global GLOBAL(ashiftrt_r4_27)
78 1.1 mrg .global GLOBAL(ashiftrt_r4_28)
79 1.1 mrg .global GLOBAL(ashiftrt_r4_29)
80 1.1 mrg .global GLOBAL(ashiftrt_r4_30)
81 1.1 mrg .global GLOBAL(ashiftrt_r4_31)
82 1.1 mrg .global GLOBAL(ashiftrt_r4_32)
83 1.1 mrg
84 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_0))
85 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_1))
86 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_2))
87 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_3))
88 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_4))
89 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_5))
90 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_6))
91 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_7))
92 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_8))
93 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_9))
94 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_10))
95 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_11))
96 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_12))
97 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_13))
98 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_14))
99 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_15))
100 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_16))
101 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_17))
102 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_18))
103 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_19))
104 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_20))
105 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_21))
106 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_22))
107 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_23))
108 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_24))
109 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_25))
110 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_26))
111 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_27))
112 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_28))
113 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_29))
114 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_30))
115 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_31))
116 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_32))
117 1.1 mrg
118 1.1 mrg .align 1
119 1.1 mrg GLOBAL(ashiftrt_r4_32):
120 1.1 mrg GLOBAL(ashiftrt_r4_31):
121 1.1 mrg rotcl r4
122 1.1 mrg rts
123 1.1 mrg subc r4,r4
124 1.1 mrg
125 1.1 mrg GLOBAL(ashiftrt_r4_30):
126 1.1 mrg shar r4
127 1.1 mrg GLOBAL(ashiftrt_r4_29):
128 1.1 mrg shar r4
129 1.1 mrg GLOBAL(ashiftrt_r4_28):
130 1.1 mrg shar r4
131 1.1 mrg GLOBAL(ashiftrt_r4_27):
132 1.1 mrg shar r4
133 1.1 mrg GLOBAL(ashiftrt_r4_26):
134 1.1 mrg shar r4
135 1.1 mrg GLOBAL(ashiftrt_r4_25):
136 1.1 mrg shar r4
137 1.1 mrg GLOBAL(ashiftrt_r4_24):
138 1.1 mrg shlr16 r4
139 1.1 mrg shlr8 r4
140 1.1 mrg rts
141 1.1 mrg exts.b r4,r4
142 1.1 mrg
143 1.1 mrg GLOBAL(ashiftrt_r4_23):
144 1.1 mrg shar r4
145 1.1 mrg GLOBAL(ashiftrt_r4_22):
146 1.1 mrg shar r4
147 1.1 mrg GLOBAL(ashiftrt_r4_21):
148 1.1 mrg shar r4
149 1.1 mrg GLOBAL(ashiftrt_r4_20):
150 1.1 mrg shar r4
151 1.1 mrg GLOBAL(ashiftrt_r4_19):
152 1.1 mrg shar r4
153 1.1 mrg GLOBAL(ashiftrt_r4_18):
154 1.1 mrg shar r4
155 1.1 mrg GLOBAL(ashiftrt_r4_17):
156 1.1 mrg shar r4
157 1.1 mrg GLOBAL(ashiftrt_r4_16):
158 1.1 mrg shlr16 r4
159 1.1 mrg rts
160 1.1 mrg exts.w r4,r4
161 1.1 mrg
162 1.1 mrg GLOBAL(ashiftrt_r4_15):
163 1.1 mrg shar r4
164 1.1 mrg GLOBAL(ashiftrt_r4_14):
165 1.1 mrg shar r4
166 1.1 mrg GLOBAL(ashiftrt_r4_13):
167 1.1 mrg shar r4
168 1.1 mrg GLOBAL(ashiftrt_r4_12):
169 1.1 mrg shar r4
170 1.1 mrg GLOBAL(ashiftrt_r4_11):
171 1.1 mrg shar r4
172 1.1 mrg GLOBAL(ashiftrt_r4_10):
173 1.1 mrg shar r4
174 1.1 mrg GLOBAL(ashiftrt_r4_9):
175 1.1 mrg shar r4
176 1.1 mrg GLOBAL(ashiftrt_r4_8):
177 1.1 mrg shar r4
178 1.1 mrg GLOBAL(ashiftrt_r4_7):
179 1.1 mrg shar r4
180 1.1 mrg GLOBAL(ashiftrt_r4_6):
181 1.1 mrg shar r4
182 1.1 mrg GLOBAL(ashiftrt_r4_5):
183 1.1 mrg shar r4
184 1.1 mrg GLOBAL(ashiftrt_r4_4):
185 1.1 mrg shar r4
186 1.1 mrg GLOBAL(ashiftrt_r4_3):
187 1.1 mrg shar r4
188 1.1 mrg GLOBAL(ashiftrt_r4_2):
189 1.1 mrg shar r4
190 1.1 mrg GLOBAL(ashiftrt_r4_1):
191 1.1 mrg rts
192 1.1 mrg shar r4
193 1.1 mrg
194 1.1 mrg GLOBAL(ashiftrt_r4_0):
195 1.1 mrg rts
196 1.1 mrg nop
197 1.1 mrg
198 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_0))
199 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_1))
200 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_2))
201 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_3))
202 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_4))
203 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_5))
204 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_6))
205 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_7))
206 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_8))
207 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_9))
208 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_10))
209 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_11))
210 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_12))
211 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_13))
212 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_14))
213 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_15))
214 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_16))
215 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_17))
216 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_18))
217 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_19))
218 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_20))
219 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_21))
220 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_22))
221 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_23))
222 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_24))
223 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_25))
224 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_26))
225 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_27))
226 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_28))
227 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_29))
228 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_30))
229 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_31))
230 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_32))
231 1.1 mrg #endif
232 1.1 mrg
233 1.1 mrg #ifdef L_ashiftrt_n
234 1.1 mrg
235 1.1 mrg !
236 1.1 mrg ! GLOBAL(ashrsi3)
237 1.1 mrg !
238 1.1 mrg ! Entry:
239 1.1 mrg !
240 1.1 mrg ! r4: Value to shift
241 1.1 mrg ! r5: Shift count
242 1.1 mrg !
243 1.1 mrg ! Exit:
244 1.1 mrg !
245 1.1 mrg ! r0: Result
246 1.1 mrg !
247 1.1 mrg ! Destroys:
248 1.1 mrg !
249 1.1 mrg ! T bit, r5
250 1.1 mrg !
251 1.1 mrg
252 1.1 mrg .global GLOBAL(ashrsi3)
253 1.1 mrg HIDDEN_FUNC(GLOBAL(ashrsi3))
254 1.1 mrg .align 2
255 1.1 mrg GLOBAL(ashrsi3):
256 1.1 mrg mov #31,r0
257 1.1 mrg and r0,r5
258 1.1 mrg mova LOCAL(ashrsi3_table),r0
259 1.1 mrg mov.b @(r0,r5),r5
260 1.1 mrg #ifdef __sh1__
261 1.1 mrg add r5,r0
262 1.1 mrg jmp @r0
263 1.1 mrg #else
264 1.1 mrg braf r5
265 1.1 mrg #endif
266 1.1 mrg mov r4,r0
267 1.1 mrg
268 1.1 mrg .align 2
269 1.1 mrg LOCAL(ashrsi3_table):
270 1.1 mrg .byte LOCAL(ashrsi3_0)-LOCAL(ashrsi3_table)
271 1.1 mrg .byte LOCAL(ashrsi3_1)-LOCAL(ashrsi3_table)
272 1.1 mrg .byte LOCAL(ashrsi3_2)-LOCAL(ashrsi3_table)
273 1.1 mrg .byte LOCAL(ashrsi3_3)-LOCAL(ashrsi3_table)
274 1.1 mrg .byte LOCAL(ashrsi3_4)-LOCAL(ashrsi3_table)
275 1.1 mrg .byte LOCAL(ashrsi3_5)-LOCAL(ashrsi3_table)
276 1.1 mrg .byte LOCAL(ashrsi3_6)-LOCAL(ashrsi3_table)
277 1.1 mrg .byte LOCAL(ashrsi3_7)-LOCAL(ashrsi3_table)
278 1.1 mrg .byte LOCAL(ashrsi3_8)-LOCAL(ashrsi3_table)
279 1.1 mrg .byte LOCAL(ashrsi3_9)-LOCAL(ashrsi3_table)
280 1.1 mrg .byte LOCAL(ashrsi3_10)-LOCAL(ashrsi3_table)
281 1.1 mrg .byte LOCAL(ashrsi3_11)-LOCAL(ashrsi3_table)
282 1.1 mrg .byte LOCAL(ashrsi3_12)-LOCAL(ashrsi3_table)
283 1.1 mrg .byte LOCAL(ashrsi3_13)-LOCAL(ashrsi3_table)
284 1.1 mrg .byte LOCAL(ashrsi3_14)-LOCAL(ashrsi3_table)
285 1.1 mrg .byte LOCAL(ashrsi3_15)-LOCAL(ashrsi3_table)
286 1.1 mrg .byte LOCAL(ashrsi3_16)-LOCAL(ashrsi3_table)
287 1.1 mrg .byte LOCAL(ashrsi3_17)-LOCAL(ashrsi3_table)
288 1.1 mrg .byte LOCAL(ashrsi3_18)-LOCAL(ashrsi3_table)
289 1.1 mrg .byte LOCAL(ashrsi3_19)-LOCAL(ashrsi3_table)
290 1.1 mrg .byte LOCAL(ashrsi3_20)-LOCAL(ashrsi3_table)
291 1.1 mrg .byte LOCAL(ashrsi3_21)-LOCAL(ashrsi3_table)
292 1.1 mrg .byte LOCAL(ashrsi3_22)-LOCAL(ashrsi3_table)
293 1.1 mrg .byte LOCAL(ashrsi3_23)-LOCAL(ashrsi3_table)
294 1.1 mrg .byte LOCAL(ashrsi3_24)-LOCAL(ashrsi3_table)
295 1.1 mrg .byte LOCAL(ashrsi3_25)-LOCAL(ashrsi3_table)
296 1.1 mrg .byte LOCAL(ashrsi3_26)-LOCAL(ashrsi3_table)
297 1.1 mrg .byte LOCAL(ashrsi3_27)-LOCAL(ashrsi3_table)
298 1.1 mrg .byte LOCAL(ashrsi3_28)-LOCAL(ashrsi3_table)
299 1.1 mrg .byte LOCAL(ashrsi3_29)-LOCAL(ashrsi3_table)
300 1.1 mrg .byte LOCAL(ashrsi3_30)-LOCAL(ashrsi3_table)
301 1.1 mrg .byte LOCAL(ashrsi3_31)-LOCAL(ashrsi3_table)
302 1.1 mrg
303 1.1 mrg LOCAL(ashrsi3_31):
304 1.1 mrg rotcl r0
305 1.1 mrg rts
306 1.1 mrg subc r0,r0
307 1.1 mrg
308 1.1 mrg LOCAL(ashrsi3_30):
309 1.1 mrg shar r0
310 1.1 mrg LOCAL(ashrsi3_29):
311 1.1 mrg shar r0
312 1.1 mrg LOCAL(ashrsi3_28):
313 1.1 mrg shar r0
314 1.1 mrg LOCAL(ashrsi3_27):
315 1.1 mrg shar r0
316 1.1 mrg LOCAL(ashrsi3_26):
317 1.1 mrg shar r0
318 1.1 mrg LOCAL(ashrsi3_25):
319 1.1 mrg shar r0
320 1.1 mrg LOCAL(ashrsi3_24):
321 1.1 mrg shlr16 r0
322 1.1 mrg shlr8 r0
323 1.1 mrg rts
324 1.1 mrg exts.b r0,r0
325 1.1 mrg
326 1.1 mrg LOCAL(ashrsi3_23):
327 1.1 mrg shar r0
328 1.1 mrg LOCAL(ashrsi3_22):
329 1.1 mrg shar r0
330 1.1 mrg LOCAL(ashrsi3_21):
331 1.1 mrg shar r0
332 1.1 mrg LOCAL(ashrsi3_20):
333 1.1 mrg shar r0
334 1.1 mrg LOCAL(ashrsi3_19):
335 1.1 mrg shar r0
336 1.1 mrg LOCAL(ashrsi3_18):
337 1.1 mrg shar r0
338 1.1 mrg LOCAL(ashrsi3_17):
339 1.1 mrg shar r0
340 1.1 mrg LOCAL(ashrsi3_16):
341 1.1 mrg shlr16 r0
342 1.1 mrg rts
343 1.1 mrg exts.w r0,r0
344 1.1 mrg
345 1.1 mrg LOCAL(ashrsi3_15):
346 1.1 mrg shar r0
347 1.1 mrg LOCAL(ashrsi3_14):
348 1.1 mrg shar r0
349 1.1 mrg LOCAL(ashrsi3_13):
350 1.1 mrg shar r0
351 1.1 mrg LOCAL(ashrsi3_12):
352 1.1 mrg shar r0
353 1.1 mrg LOCAL(ashrsi3_11):
354 1.1 mrg shar r0
355 1.1 mrg LOCAL(ashrsi3_10):
356 1.1 mrg shar r0
357 1.1 mrg LOCAL(ashrsi3_9):
358 1.1 mrg shar r0
359 1.1 mrg LOCAL(ashrsi3_8):
360 1.1 mrg shar r0
361 1.1 mrg LOCAL(ashrsi3_7):
362 1.1 mrg shar r0
363 1.1 mrg LOCAL(ashrsi3_6):
364 1.1 mrg shar r0
365 1.1 mrg LOCAL(ashrsi3_5):
366 1.1 mrg shar r0
367 1.1 mrg LOCAL(ashrsi3_4):
368 1.1 mrg shar r0
369 1.1 mrg LOCAL(ashrsi3_3):
370 1.1 mrg shar r0
371 1.1 mrg LOCAL(ashrsi3_2):
372 1.1 mrg shar r0
373 1.1 mrg LOCAL(ashrsi3_1):
374 1.1 mrg rts
375 1.1 mrg shar r0
376 1.1 mrg
377 1.1 mrg LOCAL(ashrsi3_0):
378 1.1 mrg rts
379 1.1 mrg nop
380 1.1 mrg
381 1.1 mrg ENDFUNC(GLOBAL(ashrsi3))
382 1.1 mrg #endif
383 1.1 mrg
384 1.1 mrg #ifdef L_ashiftlt
385 1.1 mrg
386 1.1 mrg !
387 1.1 mrg ! GLOBAL(ashlsi3)
388 1.1 mrg ! (For compatibility with older binaries, not used by compiler)
389 1.1 mrg !
390 1.1 mrg ! Entry:
391 1.1 mrg ! r4: Value to shift
392 1.1 mrg ! r5: Shift count
393 1.1 mrg !
394 1.1 mrg ! Exit:
395 1.1 mrg ! r0: Result
396 1.1 mrg !
397 1.1 mrg ! Destroys:
398 1.1 mrg ! T bit
399 1.1 mrg !
400 1.1 mrg !
401 1.1 mrg ! GLOBAL(ashlsi3_r0)
402 1.1 mrg !
403 1.1 mrg ! Entry:
404 1.1 mrg ! r4: Value to shift
405 1.1 mrg ! r0: Shift count
406 1.1 mrg !
407 1.1 mrg ! Exit:
408 1.1 mrg ! r0: Result
409 1.1 mrg !
410 1.1 mrg ! Destroys:
411 1.1 mrg ! T bit
412 1.1 mrg
413 1.1 mrg .global GLOBAL(ashlsi3)
414 1.1 mrg .global GLOBAL(ashlsi3_r0)
415 1.1 mrg HIDDEN_FUNC(GLOBAL(ashlsi3))
416 1.1 mrg HIDDEN_FUNC(GLOBAL(ashlsi3_r0))
417 1.1 mrg GLOBAL(ashlsi3):
418 1.1 mrg mov r5,r0
419 1.1 mrg .align 2
420 1.1 mrg GLOBAL(ashlsi3_r0):
421 1.1 mrg
422 1.1 mrg #ifdef __sh1__
423 1.1 mrg and #31,r0
424 1.1 mrg shll2 r0
425 1.1 mrg mov.l r4,@-r15
426 1.1 mrg mov r0,r4
427 1.1 mrg mova LOCAL(ashlsi3_table),r0
428 1.1 mrg add r4,r0
429 1.1 mrg mov.l @r15+,r4
430 1.1 mrg jmp @r0
431 1.1 mrg mov r4,r0
432 1.1 mrg .align 2
433 1.1 mrg #else
434 1.1 mrg and #31,r0
435 1.1 mrg shll2 r0
436 1.1 mrg braf r0
437 1.1 mrg mov r4,r0
438 1.1 mrg #endif
439 1.1 mrg
440 1.1 mrg LOCAL(ashlsi3_table):
441 1.1 mrg rts // << 0
442 1.1 mrg nop
443 1.1 mrg LOCAL(ashlsi_1):
444 1.1 mrg rts // << 1
445 1.1 mrg shll r0
446 1.1 mrg LOCAL(ashlsi_2): // << 2
447 1.1 mrg rts
448 1.1 mrg shll2 r0
449 1.1 mrg bra LOCAL(ashlsi_1) // << 3
450 1.1 mrg shll2 r0
451 1.1 mrg bra LOCAL(ashlsi_2) // << 4
452 1.1 mrg shll2 r0
453 1.1 mrg bra LOCAL(ashlsi_5) // << 5
454 1.1 mrg shll r0
455 1.1 mrg bra LOCAL(ashlsi_6) // << 6
456 1.1 mrg shll2 r0
457 1.1 mrg bra LOCAL(ashlsi_7) // << 7
458 1.1 mrg shll r0
459 1.1 mrg LOCAL(ashlsi_8): // << 8
460 1.1 mrg rts
461 1.1 mrg shll8 r0
462 1.1 mrg bra LOCAL(ashlsi_8) // << 9
463 1.1 mrg shll r0
464 1.1 mrg bra LOCAL(ashlsi_8) // << 10
465 1.1 mrg shll2 r0
466 1.1 mrg bra LOCAL(ashlsi_11) // << 11
467 1.1 mrg shll r0
468 1.1 mrg bra LOCAL(ashlsi_12) // << 12
469 1.1 mrg shll2 r0
470 1.1 mrg bra LOCAL(ashlsi_13) // << 13
471 1.1 mrg shll r0
472 1.1 mrg bra LOCAL(ashlsi_14) // << 14
473 1.1 mrg shll8 r0
474 1.1 mrg bra LOCAL(ashlsi_15) // << 15
475 1.1 mrg shll8 r0
476 1.1 mrg LOCAL(ashlsi_16): // << 16
477 1.1 mrg rts
478 1.1 mrg shll16 r0
479 1.1 mrg bra LOCAL(ashlsi_16) // << 17
480 1.1 mrg shll r0
481 1.1 mrg bra LOCAL(ashlsi_16) // << 18
482 1.1 mrg shll2 r0
483 1.1 mrg bra LOCAL(ashlsi_19) // << 19
484 1.1 mrg shll r0
485 1.1 mrg bra LOCAL(ashlsi_20) // << 20
486 1.1 mrg shll2 r0
487 1.1 mrg bra LOCAL(ashlsi_21) // << 21
488 1.1 mrg shll r0
489 1.1 mrg bra LOCAL(ashlsi_22) // << 22
490 1.1 mrg shll16 r0
491 1.1 mrg bra LOCAL(ashlsi_23) // << 23
492 1.1 mrg shll16 r0
493 1.1 mrg bra LOCAL(ashlsi_16) // << 24
494 1.1 mrg shll8 r0
495 1.1 mrg bra LOCAL(ashlsi_25) // << 25
496 1.1 mrg shll r0
497 1.1 mrg bra LOCAL(ashlsi_26) // << 26
498 1.1 mrg shll2 r0
499 1.1 mrg bra LOCAL(ashlsi_27) // << 27
500 1.1 mrg shll r0
501 1.1 mrg bra LOCAL(ashlsi_28) // << 28
502 1.1 mrg shll2 r0
503 1.1 mrg bra LOCAL(ashlsi_29) // << 29
504 1.1 mrg shll16 r0
505 1.1 mrg bra LOCAL(ashlsi_30) // << 30
506 1.1 mrg shll16 r0
507 1.1 mrg and #1,r0 // << 31
508 1.1 mrg rts
509 1.1 mrg rotr r0
510 1.1 mrg
511 1.1 mrg LOCAL(ashlsi_7):
512 1.1 mrg shll2 r0
513 1.1 mrg LOCAL(ashlsi_5):
514 1.1 mrg LOCAL(ashlsi_6):
515 1.1 mrg shll2 r0
516 1.1 mrg rts
517 1.1 mrg LOCAL(ashlsi_13):
518 1.1 mrg shll2 r0
519 1.1 mrg LOCAL(ashlsi_12):
520 1.1 mrg LOCAL(ashlsi_11):
521 1.1 mrg shll8 r0
522 1.1 mrg rts
523 1.1 mrg LOCAL(ashlsi_21):
524 1.1 mrg shll2 r0
525 1.1 mrg LOCAL(ashlsi_20):
526 1.1 mrg LOCAL(ashlsi_19):
527 1.1 mrg shll16 r0
528 1.1 mrg rts
529 1.1 mrg LOCAL(ashlsi_28):
530 1.1 mrg LOCAL(ashlsi_27):
531 1.1 mrg shll2 r0
532 1.1 mrg LOCAL(ashlsi_26):
533 1.1 mrg LOCAL(ashlsi_25):
534 1.1 mrg shll16 r0
535 1.1 mrg rts
536 1.1 mrg shll8 r0
537 1.1 mrg
538 1.1 mrg LOCAL(ashlsi_22):
539 1.1 mrg LOCAL(ashlsi_14):
540 1.1 mrg shlr2 r0
541 1.1 mrg rts
542 1.1 mrg shll8 r0
543 1.1 mrg
544 1.1 mrg LOCAL(ashlsi_23):
545 1.1 mrg LOCAL(ashlsi_15):
546 1.1 mrg shlr r0
547 1.1 mrg rts
548 1.1 mrg shll8 r0
549 1.1 mrg
550 1.1 mrg LOCAL(ashlsi_29):
551 1.1 mrg shlr r0
552 1.1 mrg LOCAL(ashlsi_30):
553 1.1 mrg shlr2 r0
554 1.1 mrg rts
555 1.1 mrg shll16 r0
556 1.1 mrg
557 1.1 mrg ENDFUNC(GLOBAL(ashlsi3))
558 1.1 mrg ENDFUNC(GLOBAL(ashlsi3_r0))
559 1.1 mrg #endif
560 1.1 mrg
561 1.1 mrg #ifdef L_lshiftrt
562 1.1 mrg
563 1.1 mrg !
564 1.1 mrg ! GLOBAL(lshrsi3)
565 1.1 mrg ! (For compatibility with older binaries, not used by compiler)
566 1.1 mrg !
567 1.1 mrg ! Entry:
568 1.1 mrg ! r4: Value to shift
569 1.1 mrg ! r5: Shift count
570 1.1 mrg !
571 1.1 mrg ! Exit:
572 1.1 mrg ! r0: Result
573 1.1 mrg !
574 1.1 mrg ! Destroys:
575 1.1 mrg ! T bit
576 1.1 mrg !
577 1.1 mrg !
578 1.1 mrg ! GLOBAL(lshrsi3_r0)
579 1.1 mrg !
580 1.1 mrg ! Entry:
581 1.1 mrg ! r4: Value to shift
582 1.1 mrg ! r0: Shift count
583 1.1 mrg !
584 1.1 mrg ! Exit:
585 1.1 mrg ! r0: Result
586 1.1 mrg !
587 1.1 mrg ! Destroys:
588 1.1 mrg ! T bit
589 1.1 mrg
590 1.1 mrg .global GLOBAL(lshrsi3)
591 1.1 mrg .global GLOBAL(lshrsi3_r0)
592 1.1 mrg HIDDEN_FUNC(GLOBAL(lshrsi3))
593 1.1 mrg HIDDEN_FUNC(GLOBAL(lshrsi3_r0))
594 1.1 mrg GLOBAL(lshrsi3):
595 1.1 mrg mov r5,r0
596 1.1 mrg .align 2
597 1.1 mrg GLOBAL(lshrsi3_r0):
598 1.1 mrg
599 1.1 mrg #ifdef __sh1__
600 1.1 mrg and #31,r0
601 1.1 mrg shll2 r0
602 1.1 mrg mov.l r4,@-r15
603 1.1 mrg mov r0,r4
604 1.1 mrg mova LOCAL(lshrsi3_table),r0
605 1.1 mrg add r4,r0
606 1.1 mrg mov.l @r15+,r4
607 1.1 mrg jmp @r0
608 1.1 mrg mov r4,r0
609 1.1 mrg .align 2
610 1.1 mrg #else
611 1.1 mrg and #31,r0
612 1.1 mrg shll2 r0
613 1.1 mrg braf r0
614 1.1 mrg mov r4,r0
615 1.1 mrg #endif
616 1.1 mrg LOCAL(lshrsi3_table):
617 1.1 mrg rts // >> 0
618 1.1 mrg nop
619 1.1 mrg LOCAL(lshrsi_1): // >> 1
620 1.1 mrg rts
621 1.1 mrg shlr r0
622 1.1 mrg LOCAL(lshrsi_2): // >> 2
623 1.1 mrg rts
624 1.1 mrg shlr2 r0
625 1.1 mrg bra LOCAL(lshrsi_1) // >> 3
626 1.1 mrg shlr2 r0
627 1.1 mrg bra LOCAL(lshrsi_2) // >> 4
628 1.1 mrg shlr2 r0
629 1.1 mrg bra LOCAL(lshrsi_5) // >> 5
630 1.1 mrg shlr r0
631 1.1 mrg bra LOCAL(lshrsi_6) // >> 6
632 1.1 mrg shlr2 r0
633 1.1 mrg bra LOCAL(lshrsi_7) // >> 7
634 1.1 mrg shlr r0
635 1.1 mrg LOCAL(lshrsi_8): // >> 8
636 1.1 mrg rts
637 1.1 mrg shlr8 r0
638 1.1 mrg bra LOCAL(lshrsi_8) // >> 9
639 1.1 mrg shlr r0
640 1.1 mrg bra LOCAL(lshrsi_8) // >> 10
641 1.1 mrg shlr2 r0
642 1.1 mrg bra LOCAL(lshrsi_11) // >> 11
643 1.1 mrg shlr r0
644 1.1 mrg bra LOCAL(lshrsi_12) // >> 12
645 1.1 mrg shlr2 r0
646 1.1 mrg bra LOCAL(lshrsi_13) // >> 13
647 1.1 mrg shlr r0
648 1.1 mrg bra LOCAL(lshrsi_14) // >> 14
649 1.1 mrg shlr8 r0
650 1.1 mrg bra LOCAL(lshrsi_15) // >> 15
651 1.1 mrg shlr8 r0
652 1.1 mrg LOCAL(lshrsi_16): // >> 16
653 1.1 mrg rts
654 1.1 mrg shlr16 r0
655 1.1 mrg bra LOCAL(lshrsi_16) // >> 17
656 1.1 mrg shlr r0
657 1.1 mrg bra LOCAL(lshrsi_16) // >> 18
658 1.1 mrg shlr2 r0
659 1.1 mrg bra LOCAL(lshrsi_19) // >> 19
660 1.1 mrg shlr r0
661 1.1 mrg bra LOCAL(lshrsi_20) // >> 20
662 1.1 mrg shlr2 r0
663 1.1 mrg bra LOCAL(lshrsi_21) // >> 21
664 1.1 mrg shlr r0
665 1.1 mrg bra LOCAL(lshrsi_22) // >> 22
666 1.1 mrg shlr16 r0
667 1.1 mrg bra LOCAL(lshrsi_23) // >> 23
668 1.1 mrg shlr16 r0
669 1.1 mrg bra LOCAL(lshrsi_16) // >> 24
670 1.1 mrg shlr8 r0
671 1.1 mrg bra LOCAL(lshrsi_25) // >> 25
672 1.1 mrg shlr r0
673 1.1 mrg bra LOCAL(lshrsi_26) // >> 26
674 1.1 mrg shlr2 r0
675 1.1 mrg bra LOCAL(lshrsi_27) // >> 27
676 1.1 mrg shlr r0
677 1.1 mrg bra LOCAL(lshrsi_28) // >> 28
678 1.1 mrg shlr2 r0
679 1.1 mrg bra LOCAL(lshrsi_29) // >> 29
680 1.1 mrg shlr16 r0
681 1.1 mrg bra LOCAL(lshrsi_30) // >> 30
682 1.1 mrg shlr16 r0
683 1.1 mrg shll r0 // >> 31
684 1.1 mrg rts
685 1.1 mrg movt r0
686 1.1 mrg
687 1.1 mrg LOCAL(lshrsi_7):
688 1.1 mrg shlr2 r0
689 1.1 mrg LOCAL(lshrsi_5):
690 1.1 mrg LOCAL(lshrsi_6):
691 1.1 mrg shlr2 r0
692 1.1 mrg rts
693 1.1 mrg LOCAL(lshrsi_13):
694 1.1 mrg shlr2 r0
695 1.1 mrg LOCAL(lshrsi_12):
696 1.1 mrg LOCAL(lshrsi_11):
697 1.1 mrg shlr8 r0
698 1.1 mrg rts
699 1.1 mrg LOCAL(lshrsi_21):
700 1.1 mrg shlr2 r0
701 1.1 mrg LOCAL(lshrsi_20):
702 1.1 mrg LOCAL(lshrsi_19):
703 1.1 mrg shlr16 r0
704 1.1 mrg rts
705 1.1 mrg LOCAL(lshrsi_28):
706 1.1 mrg LOCAL(lshrsi_27):
707 1.1 mrg shlr2 r0
708 1.1 mrg LOCAL(lshrsi_26):
709 1.1 mrg LOCAL(lshrsi_25):
710 1.1 mrg shlr16 r0
711 1.1 mrg rts
712 1.1 mrg shlr8 r0
713 1.1 mrg
714 1.1 mrg LOCAL(lshrsi_22):
715 1.1 mrg LOCAL(lshrsi_14):
716 1.1 mrg shll2 r0
717 1.1 mrg rts
718 1.1 mrg shlr8 r0
719 1.1 mrg
720 1.1 mrg LOCAL(lshrsi_23):
721 1.1 mrg LOCAL(lshrsi_15):
722 1.1 mrg shll r0
723 1.1 mrg rts
724 1.1 mrg shlr8 r0
725 1.1 mrg
726 1.1 mrg LOCAL(lshrsi_29):
727 1.1 mrg shll r0
728 1.1 mrg LOCAL(lshrsi_30):
729 1.1 mrg shll2 r0
730 1.1 mrg rts
731 1.1 mrg shlr16 r0
732 1.1 mrg
733 1.1 mrg ENDFUNC(GLOBAL(lshrsi3))
734 1.1 mrg ENDFUNC(GLOBAL(lshrsi3_r0))
735 1.1 mrg #endif
736 1.1 mrg
737 1.1 mrg #ifdef L_movmem
738 1.1 mrg .text
739 1.1 mrg .balign 4
740 1.1 mrg .global GLOBAL(movmem)
741 1.1 mrg HIDDEN_FUNC(GLOBAL(movmem))
742 1.1 mrg HIDDEN_ALIAS(movstr,movmem)
743 1.1 mrg /* This would be a lot simpler if r6 contained the byte count
744 1.1 mrg minus 64, and we wouldn't be called here for a byte count of 64. */
745 1.1 mrg GLOBAL(movmem):
746 1.1 mrg sts.l pr,@-r15
747 1.1 mrg shll2 r6
748 1.1 mrg bsr GLOBAL(movmemSI52+2)
749 1.1 mrg mov.l @(48,r5),r0
750 1.1 mrg .balign 4
751 1.1 mrg LOCAL(movmem_loop): /* Reached with rts */
752 1.1 mrg mov.l @(60,r5),r0
753 1.1 mrg add #-64,r6
754 1.1 mrg mov.l r0,@(60,r4)
755 1.1 mrg tst r6,r6
756 1.1 mrg mov.l @(56,r5),r0
757 1.1 mrg bt LOCAL(movmem_done)
758 1.1 mrg mov.l r0,@(56,r4)
759 1.1 mrg cmp/pl r6
760 1.1 mrg mov.l @(52,r5),r0
761 1.1 mrg add #64,r5
762 1.1 mrg mov.l r0,@(52,r4)
763 1.1 mrg add #64,r4
764 1.1 mrg bt GLOBAL(movmemSI52)
765 1.1 mrg ! done all the large groups, do the remainder
766 1.1 mrg ! jump to movmem+
767 1.1 mrg mova GLOBAL(movmemSI4)+4,r0
768 1.1 mrg add r6,r0
769 1.1 mrg jmp @r0
770 1.1 mrg LOCAL(movmem_done): ! share slot insn, works out aligned.
771 1.1 mrg lds.l @r15+,pr
772 1.1 mrg mov.l r0,@(56,r4)
773 1.1 mrg mov.l @(52,r5),r0
774 1.1 mrg rts
775 1.1 mrg mov.l r0,@(52,r4)
776 1.1 mrg .balign 4
777 1.1 mrg ! ??? We need aliases movstr* for movmem* for the older libraries. These
778 1.1 mrg ! aliases will be removed at the some point in the future.
779 1.1 mrg .global GLOBAL(movmemSI64)
780 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI64))
781 1.1 mrg HIDDEN_ALIAS(movstrSI64,movmemSI64)
782 1.1 mrg GLOBAL(movmemSI64):
783 1.1 mrg mov.l @(60,r5),r0
784 1.1 mrg mov.l r0,@(60,r4)
785 1.1 mrg .global GLOBAL(movmemSI60)
786 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI60))
787 1.1 mrg HIDDEN_ALIAS(movstrSI60,movmemSI60)
788 1.1 mrg GLOBAL(movmemSI60):
789 1.1 mrg mov.l @(56,r5),r0
790 1.1 mrg mov.l r0,@(56,r4)
791 1.1 mrg .global GLOBAL(movmemSI56)
792 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI56))
793 1.1 mrg HIDDEN_ALIAS(movstrSI56,movmemSI56)
794 1.1 mrg GLOBAL(movmemSI56):
795 1.1 mrg mov.l @(52,r5),r0
796 1.1 mrg mov.l r0,@(52,r4)
797 1.1 mrg .global GLOBAL(movmemSI52)
798 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI52))
799 1.1 mrg HIDDEN_ALIAS(movstrSI52,movmemSI52)
800 1.1 mrg GLOBAL(movmemSI52):
801 1.1 mrg mov.l @(48,r5),r0
802 1.1 mrg mov.l r0,@(48,r4)
803 1.1 mrg .global GLOBAL(movmemSI48)
804 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI48))
805 1.1 mrg HIDDEN_ALIAS(movstrSI48,movmemSI48)
806 1.1 mrg GLOBAL(movmemSI48):
807 1.1 mrg mov.l @(44,r5),r0
808 1.1 mrg mov.l r0,@(44,r4)
809 1.1 mrg .global GLOBAL(movmemSI44)
810 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI44))
811 1.1 mrg HIDDEN_ALIAS(movstrSI44,movmemSI44)
812 1.1 mrg GLOBAL(movmemSI44):
813 1.1 mrg mov.l @(40,r5),r0
814 1.1 mrg mov.l r0,@(40,r4)
815 1.1 mrg .global GLOBAL(movmemSI40)
816 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI40))
817 1.1 mrg HIDDEN_ALIAS(movstrSI40,movmemSI40)
818 1.1 mrg GLOBAL(movmemSI40):
819 1.1 mrg mov.l @(36,r5),r0
820 1.1 mrg mov.l r0,@(36,r4)
821 1.1 mrg .global GLOBAL(movmemSI36)
822 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI36))
823 1.1 mrg HIDDEN_ALIAS(movstrSI36,movmemSI36)
824 1.1 mrg GLOBAL(movmemSI36):
825 1.1 mrg mov.l @(32,r5),r0
826 1.1 mrg mov.l r0,@(32,r4)
827 1.1 mrg .global GLOBAL(movmemSI32)
828 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI32))
829 1.1 mrg HIDDEN_ALIAS(movstrSI32,movmemSI32)
830 1.1 mrg GLOBAL(movmemSI32):
831 1.1 mrg mov.l @(28,r5),r0
832 1.1 mrg mov.l r0,@(28,r4)
833 1.1 mrg .global GLOBAL(movmemSI28)
834 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI28))
835 1.1 mrg HIDDEN_ALIAS(movstrSI28,movmemSI28)
836 1.1 mrg GLOBAL(movmemSI28):
837 1.1 mrg mov.l @(24,r5),r0
838 1.1 mrg mov.l r0,@(24,r4)
839 1.1 mrg .global GLOBAL(movmemSI24)
840 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI24))
841 1.1 mrg HIDDEN_ALIAS(movstrSI24,movmemSI24)
842 1.1 mrg GLOBAL(movmemSI24):
843 1.1 mrg mov.l @(20,r5),r0
844 1.1 mrg mov.l r0,@(20,r4)
845 1.1 mrg .global GLOBAL(movmemSI20)
846 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI20))
847 1.1 mrg HIDDEN_ALIAS(movstrSI20,movmemSI20)
848 1.1 mrg GLOBAL(movmemSI20):
849 1.1 mrg mov.l @(16,r5),r0
850 1.1 mrg mov.l r0,@(16,r4)
851 1.1 mrg .global GLOBAL(movmemSI16)
852 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI16))
853 1.1 mrg HIDDEN_ALIAS(movstrSI16,movmemSI16)
854 1.1 mrg GLOBAL(movmemSI16):
855 1.1 mrg mov.l @(12,r5),r0
856 1.1 mrg mov.l r0,@(12,r4)
857 1.1 mrg .global GLOBAL(movmemSI12)
858 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI12))
859 1.1 mrg HIDDEN_ALIAS(movstrSI12,movmemSI12)
860 1.1 mrg GLOBAL(movmemSI12):
861 1.1 mrg mov.l @(8,r5),r0
862 1.1 mrg mov.l r0,@(8,r4)
863 1.1 mrg .global GLOBAL(movmemSI8)
864 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI8))
865 1.1 mrg HIDDEN_ALIAS(movstrSI8,movmemSI8)
866 1.1 mrg GLOBAL(movmemSI8):
867 1.1 mrg mov.l @(4,r5),r0
868 1.1 mrg mov.l r0,@(4,r4)
869 1.1 mrg .global GLOBAL(movmemSI4)
870 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI4))
871 1.1 mrg HIDDEN_ALIAS(movstrSI4,movmemSI4)
872 1.1 mrg GLOBAL(movmemSI4):
873 1.1 mrg mov.l @(0,r5),r0
874 1.1 mrg rts
875 1.1 mrg mov.l r0,@(0,r4)
876 1.1 mrg
877 1.1 mrg ENDFUNC(GLOBAL(movmemSI64))
878 1.1 mrg ENDFUNC(GLOBAL(movmemSI60))
879 1.1 mrg ENDFUNC(GLOBAL(movmemSI56))
880 1.1 mrg ENDFUNC(GLOBAL(movmemSI52))
881 1.1 mrg ENDFUNC(GLOBAL(movmemSI48))
882 1.1 mrg ENDFUNC(GLOBAL(movmemSI44))
883 1.1 mrg ENDFUNC(GLOBAL(movmemSI40))
884 1.1 mrg ENDFUNC(GLOBAL(movmemSI36))
885 1.1 mrg ENDFUNC(GLOBAL(movmemSI32))
886 1.1 mrg ENDFUNC(GLOBAL(movmemSI28))
887 1.1 mrg ENDFUNC(GLOBAL(movmemSI24))
888 1.1 mrg ENDFUNC(GLOBAL(movmemSI20))
889 1.1 mrg ENDFUNC(GLOBAL(movmemSI16))
890 1.1 mrg ENDFUNC(GLOBAL(movmemSI12))
891 1.1 mrg ENDFUNC(GLOBAL(movmemSI8))
892 1.1 mrg ENDFUNC(GLOBAL(movmemSI4))
893 1.1 mrg ENDFUNC(GLOBAL(movmem))
894 1.1 mrg #endif
895 1.1 mrg
896 1.1 mrg #ifdef L_movmem_i4
897 1.1 mrg .text
898 1.1 mrg .global GLOBAL(movmem_i4_even)
899 1.1 mrg .global GLOBAL(movmem_i4_odd)
900 1.1 mrg .global GLOBAL(movmemSI12_i4)
901 1.1 mrg
902 1.1 mrg HIDDEN_FUNC(GLOBAL(movmem_i4_even))
903 1.1 mrg HIDDEN_FUNC(GLOBAL(movmem_i4_odd))
904 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI12_i4))
905 1.1 mrg
906 1.1 mrg HIDDEN_ALIAS(movstr_i4_even,movmem_i4_even)
907 1.1 mrg HIDDEN_ALIAS(movstr_i4_odd,movmem_i4_odd)
908 1.1 mrg HIDDEN_ALIAS(movstrSI12_i4,movmemSI12_i4)
909 1.1 mrg
910 1.1 mrg .p2align 5
911 1.1 mrg L_movmem_2mod4_end:
912 1.1 mrg mov.l r0,@(16,r4)
913 1.1 mrg rts
914 1.1 mrg mov.l r1,@(20,r4)
915 1.1 mrg
916 1.1 mrg .p2align 2
917 1.1 mrg
918 1.1 mrg GLOBAL(movmem_i4_even):
919 1.1 mrg mov.l @r5+,r0
920 1.1 mrg bra L_movmem_start_even
921 1.1 mrg mov.l @r5+,r1
922 1.1 mrg
923 1.1 mrg GLOBAL(movmem_i4_odd):
924 1.1 mrg mov.l @r5+,r1
925 1.1 mrg add #-4,r4
926 1.1 mrg mov.l @r5+,r2
927 1.1 mrg mov.l @r5+,r3
928 1.1 mrg mov.l r1,@(4,r4)
929 1.1 mrg mov.l r2,@(8,r4)
930 1.1 mrg
931 1.1 mrg L_movmem_loop:
932 1.1 mrg mov.l r3,@(12,r4)
933 1.1 mrg dt r6
934 1.1 mrg mov.l @r5+,r0
935 1.1 mrg bt/s L_movmem_2mod4_end
936 1.1 mrg mov.l @r5+,r1
937 1.1 mrg add #16,r4
938 1.1 mrg L_movmem_start_even:
939 1.1 mrg mov.l @r5+,r2
940 1.1 mrg mov.l @r5+,r3
941 1.1 mrg mov.l r0,@r4
942 1.1 mrg dt r6
943 1.1 mrg mov.l r1,@(4,r4)
944 1.1 mrg bf/s L_movmem_loop
945 1.1 mrg mov.l r2,@(8,r4)
946 1.1 mrg rts
947 1.1 mrg mov.l r3,@(12,r4)
948 1.1 mrg
949 1.1 mrg ENDFUNC(GLOBAL(movmem_i4_even))
950 1.1 mrg ENDFUNC(GLOBAL(movmem_i4_odd))
951 1.1 mrg
952 1.1 mrg .p2align 4
953 1.1 mrg GLOBAL(movmemSI12_i4):
954 1.1 mrg mov.l @r5,r0
955 1.1 mrg mov.l @(4,r5),r1
956 1.1 mrg mov.l @(8,r5),r2
957 1.1 mrg mov.l r0,@r4
958 1.1 mrg mov.l r1,@(4,r4)
959 1.1 mrg rts
960 1.1 mrg mov.l r2,@(8,r4)
961 1.1 mrg
962 1.1 mrg ENDFUNC(GLOBAL(movmemSI12_i4))
963 1.1 mrg #endif
964 1.1 mrg
965 1.1 mrg #ifdef L_mulsi3
966 1.1 mrg
967 1.1 mrg
968 1.1 mrg .global GLOBAL(mulsi3)
969 1.1 mrg HIDDEN_FUNC(GLOBAL(mulsi3))
970 1.1 mrg
971 1.1 mrg ! r4 = aabb
972 1.1 mrg ! r5 = ccdd
973 1.1 mrg ! r0 = aabb*ccdd via partial products
974 1.1 mrg !
975 1.1 mrg ! if aa == 0 and cc = 0
976 1.1 mrg ! r0 = bb*dd
977 1.1 mrg !
978 1.1 mrg ! else
979 1.1 mrg ! aa = bb*dd + (aa*dd*65536) + (cc*bb*65536)
980 1.1 mrg !
981 1.1 mrg
982 1.1 mrg GLOBAL(mulsi3):
983 1.1 mrg mulu.w r4,r5 ! multiply the lsws macl=bb*dd
984 1.1 mrg mov r5,r3 ! r3 = ccdd
985 1.1 mrg swap.w r4,r2 ! r2 = bbaa
986 1.1 mrg xtrct r2,r3 ! r3 = aacc
987 1.1 mrg tst r3,r3 ! msws zero ?
988 1.1 mrg bf hiset
989 1.1 mrg rts ! yes - then we have the answer
990 1.1 mrg sts macl,r0
991 1.1 mrg
992 1.1 mrg hiset: sts macl,r0 ! r0 = bb*dd
993 1.1 mrg mulu.w r2,r5 ! brewing macl = aa*dd
994 1.1 mrg sts macl,r1
995 1.1 mrg mulu.w r3,r4 ! brewing macl = cc*bb
996 1.1 mrg sts macl,r2
997 1.1 mrg add r1,r2
998 1.1 mrg shll16 r2
999 1.1 mrg rts
1000 1.1 mrg add r2,r0
1001 1.1 mrg
1002 1.1 mrg ENDFUNC(GLOBAL(mulsi3))
1003 1.1 mrg #endif
1004 1.3 mrg
1005 1.3 mrg /*------------------------------------------------------------------------------
1006 1.3 mrg 32 bit signed integer division that uses FPU double precision division. */
1007 1.3 mrg
1008 1.1 mrg #ifdef L_sdivsi3_i4
1009 1.1 mrg .title "SH DIVIDE"
1010 1.3 mrg
1011 1.1 mrg #if defined (__SH4__) || defined (__SH2A__)
1012 1.3 mrg /* This variant is used when FPSCR.PR = 1 (double precision) is the default
1013 1.3 mrg setting.
1014 1.3 mrg Args in r4 and r5, result in fpul, clobber dr0, dr2. */
1015 1.1 mrg
1016 1.1 mrg .global GLOBAL(sdivsi3_i4)
1017 1.1 mrg HIDDEN_FUNC(GLOBAL(sdivsi3_i4))
1018 1.1 mrg GLOBAL(sdivsi3_i4):
1019 1.1 mrg lds r4,fpul
1020 1.1 mrg float fpul,dr0
1021 1.1 mrg lds r5,fpul
1022 1.1 mrg float fpul,dr2
1023 1.1 mrg fdiv dr2,dr0
1024 1.1 mrg rts
1025 1.1 mrg ftrc dr0,fpul
1026 1.1 mrg
1027 1.1 mrg ENDFUNC(GLOBAL(sdivsi3_i4))
1028 1.3 mrg
1029 1.6 mrg #elif defined (__SH2A_SINGLE__) || defined (__SH2A_SINGLE_ONLY__) || defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__)
1030 1.3 mrg /* This variant is used when FPSCR.PR = 0 (sigle precision) is the default
1031 1.3 mrg setting.
1032 1.3 mrg Args in r4 and r5, result in fpul, clobber r2, dr0, dr2.
1033 1.3 mrg For this to work, we must temporarily switch the FPU do double precision,
1034 1.3 mrg but we better do not touch FPSCR.FR. See PR 6526. */
1035 1.1 mrg
1036 1.1 mrg .global GLOBAL(sdivsi3_i4)
1037 1.1 mrg HIDDEN_FUNC(GLOBAL(sdivsi3_i4))
1038 1.1 mrg GLOBAL(sdivsi3_i4):
1039 1.3 mrg
1040 1.3 mrg #ifndef __SH4A__
1041 1.3 mrg mov.l r3,@-r15
1042 1.3 mrg sts fpscr,r2
1043 1.3 mrg mov #8,r3
1044 1.3 mrg swap.w r3,r3 // r3 = 1 << 19 (FPSCR.PR bit)
1045 1.3 mrg or r2,r3
1046 1.3 mrg lds r3,fpscr // Set FPSCR.PR = 1.
1047 1.3 mrg lds r4,fpul
1048 1.3 mrg float fpul,dr0
1049 1.3 mrg lds r5,fpul
1050 1.3 mrg float fpul,dr2
1051 1.3 mrg fdiv dr2,dr0
1052 1.3 mrg ftrc dr0,fpul
1053 1.3 mrg lds r2,fpscr
1054 1.3 mrg rts
1055 1.3 mrg mov.l @r15+,r3
1056 1.3 mrg #else
1057 1.3 mrg /* On SH4A we can use the fpchg instruction to flip the FPSCR.PR bit. */
1058 1.3 mrg fpchg
1059 1.3 mrg lds r4,fpul
1060 1.3 mrg float fpul,dr0
1061 1.3 mrg lds r5,fpul
1062 1.3 mrg float fpul,dr2
1063 1.3 mrg fdiv dr2,dr0
1064 1.3 mrg ftrc dr0,fpul
1065 1.1 mrg rts
1066 1.3 mrg fpchg
1067 1.3 mrg
1068 1.3 mrg #endif /* __SH4A__ */
1069 1.1 mrg
1070 1.1 mrg ENDFUNC(GLOBAL(sdivsi3_i4))
1071 1.1 mrg #endif /* ! __SH4__ || __SH2A__ */
1072 1.3 mrg #endif /* L_sdivsi3_i4 */
1073 1.1 mrg
1074 1.3 mrg //------------------------------------------------------------------------------
1075 1.1 mrg #ifdef L_sdivsi3
1076 1.1 mrg /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with
1077 1.1 mrg sh2e/sh3e code. */
1078 1.1 mrg !!
1079 1.1 mrg !! Steve Chamberlain
1080 1.1 mrg !! sac@cygnus.com
1081 1.1 mrg !!
1082 1.1 mrg !!
1083 1.1 mrg
1084 1.1 mrg !! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit
1085 1.1 mrg
1086 1.1 mrg .global GLOBAL(sdivsi3)
1087 1.1 mrg .align 2
1088 1.6 mrg
1089 1.1 mrg FUNC(GLOBAL(sdivsi3))
1090 1.1 mrg GLOBAL(sdivsi3):
1091 1.1 mrg mov r4,r1
1092 1.1 mrg mov r5,r0
1093 1.1 mrg
1094 1.1 mrg tst r0,r0
1095 1.1 mrg bt div0
1096 1.1 mrg mov #0,r2
1097 1.1 mrg div0s r2,r1
1098 1.1 mrg subc r3,r3
1099 1.1 mrg subc r2,r1
1100 1.1 mrg div0s r0,r3
1101 1.1 mrg rotcl r1
1102 1.1 mrg div1 r0,r3
1103 1.1 mrg rotcl r1
1104 1.1 mrg div1 r0,r3
1105 1.1 mrg rotcl r1
1106 1.1 mrg div1 r0,r3
1107 1.1 mrg rotcl r1
1108 1.1 mrg div1 r0,r3
1109 1.1 mrg rotcl r1
1110 1.1 mrg div1 r0,r3
1111 1.1 mrg rotcl r1
1112 1.1 mrg div1 r0,r3
1113 1.1 mrg rotcl r1
1114 1.1 mrg div1 r0,r3
1115 1.1 mrg rotcl r1
1116 1.1 mrg div1 r0,r3
1117 1.1 mrg rotcl r1
1118 1.1 mrg div1 r0,r3
1119 1.1 mrg rotcl r1
1120 1.1 mrg div1 r0,r3
1121 1.1 mrg rotcl r1
1122 1.1 mrg div1 r0,r3
1123 1.1 mrg rotcl r1
1124 1.1 mrg div1 r0,r3
1125 1.1 mrg rotcl r1
1126 1.1 mrg div1 r0,r3
1127 1.1 mrg rotcl r1
1128 1.1 mrg div1 r0,r3
1129 1.1 mrg rotcl r1
1130 1.1 mrg div1 r0,r3
1131 1.1 mrg rotcl r1
1132 1.1 mrg div1 r0,r3
1133 1.1 mrg rotcl r1
1134 1.1 mrg div1 r0,r3
1135 1.1 mrg rotcl r1
1136 1.1 mrg div1 r0,r3
1137 1.1 mrg rotcl r1
1138 1.1 mrg div1 r0,r3
1139 1.1 mrg rotcl r1
1140 1.1 mrg div1 r0,r3
1141 1.1 mrg rotcl r1
1142 1.1 mrg div1 r0,r3
1143 1.1 mrg rotcl r1
1144 1.1 mrg div1 r0,r3
1145 1.1 mrg rotcl r1
1146 1.1 mrg div1 r0,r3
1147 1.1 mrg rotcl r1
1148 1.1 mrg div1 r0,r3
1149 1.1 mrg rotcl r1
1150 1.1 mrg div1 r0,r3
1151 1.1 mrg rotcl r1
1152 1.1 mrg div1 r0,r3
1153 1.1 mrg rotcl r1
1154 1.1 mrg div1 r0,r3
1155 1.1 mrg rotcl r1
1156 1.1 mrg div1 r0,r3
1157 1.1 mrg rotcl r1
1158 1.1 mrg div1 r0,r3
1159 1.1 mrg rotcl r1
1160 1.1 mrg div1 r0,r3
1161 1.1 mrg rotcl r1
1162 1.1 mrg div1 r0,r3
1163 1.1 mrg rotcl r1
1164 1.1 mrg div1 r0,r3
1165 1.1 mrg rotcl r1
1166 1.1 mrg addc r2,r1
1167 1.1 mrg rts
1168 1.1 mrg mov r1,r0
1169 1.1 mrg
1170 1.1 mrg
1171 1.1 mrg div0: rts
1172 1.1 mrg mov #0,r0
1173 1.1 mrg
1174 1.1 mrg ENDFUNC(GLOBAL(sdivsi3))
1175 1.3 mrg #endif /* L_sdivsi3 */
1176 1.3 mrg
1177 1.3 mrg /*------------------------------------------------------------------------------
1178 1.3 mrg 32 bit unsigned integer division that uses FPU double precision division. */
1179 1.3 mrg
1180 1.1 mrg #ifdef L_udivsi3_i4
1181 1.3 mrg .title "SH DIVIDE"
1182 1.1 mrg
1183 1.1 mrg #if defined (__SH4__) || defined (__SH2A__)
1184 1.3 mrg /* This variant is used when FPSCR.PR = 1 (double precision) is the default
1185 1.3 mrg setting.
1186 1.3 mrg Args in r4 and r5, result in fpul,
1187 1.3 mrg clobber r0, r1, r4, r5, dr0, dr2, dr4, and t bit */
1188 1.1 mrg
1189 1.1 mrg .global GLOBAL(udivsi3_i4)
1190 1.1 mrg HIDDEN_FUNC(GLOBAL(udivsi3_i4))
1191 1.1 mrg GLOBAL(udivsi3_i4):
1192 1.3 mrg mov #1,r1
1193 1.3 mrg cmp/hi r1,r5
1194 1.3 mrg bf/s trivial
1195 1.3 mrg rotr r1
1196 1.3 mrg xor r1,r4
1197 1.3 mrg lds r4,fpul
1198 1.3 mrg mova L1,r0
1199 1.1 mrg #ifdef FMOVD_WORKS
1200 1.3 mrg fmov.d @r0+,dr4
1201 1.1 mrg #else
1202 1.3 mrg fmov.s @r0+,DR40
1203 1.3 mrg fmov.s @r0,DR41
1204 1.1 mrg #endif
1205 1.3 mrg float fpul,dr0
1206 1.3 mrg xor r1,r5
1207 1.3 mrg lds r5,fpul
1208 1.3 mrg float fpul,dr2
1209 1.3 mrg fadd dr4,dr0
1210 1.3 mrg fadd dr4,dr2
1211 1.3 mrg fdiv dr2,dr0
1212 1.1 mrg rts
1213 1.3 mrg ftrc dr0,fpul
1214 1.1 mrg
1215 1.1 mrg trivial:
1216 1.1 mrg rts
1217 1.3 mrg lds r4,fpul
1218 1.1 mrg
1219 1.1 mrg .align 2
1220 1.1 mrg #ifdef FMOVD_WORKS
1221 1.3 mrg .align 3 // Make the double below 8 byte aligned.
1222 1.1 mrg #endif
1223 1.1 mrg L1:
1224 1.1 mrg .double 2147483648
1225 1.1 mrg
1226 1.1 mrg ENDFUNC(GLOBAL(udivsi3_i4))
1227 1.3 mrg
1228 1.1 mrg #elif defined (__SH2A_SINGLE__) || defined (__SH2A_SINGLE_ONLY__) || defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__)
1229 1.3 mrg /* This variant is used when FPSCR.PR = 0 (sigle precision) is the default
1230 1.3 mrg setting.
1231 1.3 mrg Args in r4 and r5, result in fpul,
1232 1.3 mrg clobber r0, r1, r4, r5, dr0, dr2, dr4.
1233 1.3 mrg For this to work, we must temporarily switch the FPU do double precision,
1234 1.3 mrg but we better do not touch FPSCR.FR. See PR 6526. */
1235 1.1 mrg
1236 1.1 mrg .global GLOBAL(udivsi3_i4)
1237 1.1 mrg HIDDEN_FUNC(GLOBAL(udivsi3_i4))
1238 1.1 mrg GLOBAL(udivsi3_i4):
1239 1.3 mrg
1240 1.3 mrg #ifndef __SH4A__
1241 1.3 mrg mov #1,r1
1242 1.3 mrg cmp/hi r1,r5
1243 1.3 mrg bf/s trivial
1244 1.3 mrg rotr r1 // r1 = 1 << 31
1245 1.3 mrg sts.l fpscr,@-r15
1246 1.3 mrg xor r1,r4
1247 1.3 mrg mov.l @(0,r15),r0
1248 1.3 mrg xor r1,r5
1249 1.3 mrg mov.l L2,r1
1250 1.3 mrg lds r4,fpul
1251 1.3 mrg or r0,r1
1252 1.3 mrg mova L1,r0
1253 1.3 mrg lds r1,fpscr
1254 1.1 mrg #ifdef FMOVD_WORKS
1255 1.3 mrg fmov.d @r0+,dr4
1256 1.1 mrg #else
1257 1.3 mrg fmov.s @r0+,DR40
1258 1.3 mrg fmov.s @r0,DR41
1259 1.1 mrg #endif
1260 1.3 mrg float fpul,dr0
1261 1.3 mrg lds r5,fpul
1262 1.3 mrg float fpul,dr2
1263 1.3 mrg fadd dr4,dr0
1264 1.3 mrg fadd dr4,dr2
1265 1.3 mrg fdiv dr2,dr0
1266 1.3 mrg ftrc dr0,fpul
1267 1.1 mrg rts
1268 1.3 mrg lds.l @r15+,fpscr
1269 1.1 mrg
1270 1.1 mrg #ifdef FMOVD_WORKS
1271 1.3 mrg .align 3 // Make the double below 8 byte aligned.
1272 1.1 mrg #endif
1273 1.1 mrg trivial:
1274 1.1 mrg rts
1275 1.3 mrg lds r4,fpul
1276 1.1 mrg
1277 1.1 mrg .align 2
1278 1.3 mrg L2:
1279 1.3 mrg #ifdef FMOVD_WORKS
1280 1.3 mrg .long 0x180000 // FPSCR.PR = 1, FPSCR.SZ = 1
1281 1.3 mrg #else
1282 1.3 mrg .long 0x80000 // FPSCR.PR = 1
1283 1.3 mrg #endif
1284 1.1 mrg L1:
1285 1.3 mrg .double 2147483648
1286 1.3 mrg
1287 1.1 mrg #else
1288 1.3 mrg /* On SH4A we can use the fpchg instruction to flip the FPSCR.PR bit.
1289 1.3 mrg Although on SH4A fmovd usually works, it would require either additional
1290 1.3 mrg two fschg instructions or an FPSCR push + pop. It's not worth the effort
1291 1.3 mrg for loading only one double constant. */
1292 1.3 mrg mov #1,r1
1293 1.3 mrg cmp/hi r1,r5
1294 1.3 mrg bf/s trivial
1295 1.3 mrg rotr r1 // r1 = 1 << 31
1296 1.3 mrg fpchg
1297 1.3 mrg mova L1,r0
1298 1.3 mrg xor r1,r4
1299 1.3 mrg fmov.s @r0+,DR40
1300 1.3 mrg lds r4,fpul
1301 1.3 mrg fmov.s @r0,DR41
1302 1.3 mrg xor r1,r5
1303 1.3 mrg float fpul,dr0
1304 1.3 mrg lds r5,fpul
1305 1.3 mrg float fpul,dr2
1306 1.3 mrg fadd dr4,dr0
1307 1.3 mrg fadd dr4,dr2
1308 1.3 mrg fdiv dr2,dr0
1309 1.3 mrg ftrc dr0,fpul
1310 1.3 mrg rts
1311 1.3 mrg fpchg
1312 1.3 mrg
1313 1.3 mrg trivial:
1314 1.3 mrg rts
1315 1.3 mrg lds r4,fpul
1316 1.3 mrg
1317 1.3 mrg .align 2
1318 1.3 mrg L1:
1319 1.1 mrg .double 2147483648
1320 1.1 mrg
1321 1.3 mrg #endif /* __SH4A__ */
1322 1.3 mrg
1323 1.3 mrg
1324 1.1 mrg ENDFUNC(GLOBAL(udivsi3_i4))
1325 1.1 mrg #endif /* ! __SH4__ */
1326 1.3 mrg #endif /* L_udivsi3_i4 */
1327 1.1 mrg
1328 1.1 mrg #ifdef L_udivsi3
1329 1.1 mrg /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with
1330 1.1 mrg sh2e/sh3e code. */
1331 1.1 mrg
1332 1.1 mrg !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit
1333 1.1 mrg .global GLOBAL(udivsi3)
1334 1.1 mrg HIDDEN_FUNC(GLOBAL(udivsi3))
1335 1.1 mrg
1336 1.1 mrg LOCAL(div8):
1337 1.1 mrg div1 r5,r4
1338 1.1 mrg LOCAL(div7):
1339 1.1 mrg div1 r5,r4; div1 r5,r4; div1 r5,r4
1340 1.1 mrg div1 r5,r4; div1 r5,r4; div1 r5,r4; rts; div1 r5,r4
1341 1.1 mrg
1342 1.1 mrg LOCAL(divx4):
1343 1.1 mrg div1 r5,r4; rotcl r0
1344 1.1 mrg div1 r5,r4; rotcl r0
1345 1.1 mrg div1 r5,r4; rotcl r0
1346 1.1 mrg rts; div1 r5,r4
1347 1.1 mrg
1348 1.1 mrg GLOBAL(udivsi3):
1349 1.1 mrg sts.l pr,@-r15
1350 1.1 mrg extu.w r5,r0
1351 1.1 mrg cmp/eq r5,r0
1352 1.1 mrg #ifdef __sh1__
1353 1.1 mrg bf LOCAL(large_divisor)
1354 1.1 mrg #else
1355 1.1 mrg bf/s LOCAL(large_divisor)
1356 1.1 mrg #endif
1357 1.1 mrg div0u
1358 1.1 mrg swap.w r4,r0
1359 1.1 mrg shlr16 r4
1360 1.1 mrg bsr LOCAL(div8)
1361 1.1 mrg shll16 r5
1362 1.1 mrg bsr LOCAL(div7)
1363 1.1 mrg div1 r5,r4
1364 1.1 mrg xtrct r4,r0
1365 1.1 mrg xtrct r0,r4
1366 1.1 mrg bsr LOCAL(div8)
1367 1.1 mrg swap.w r4,r4
1368 1.1 mrg bsr LOCAL(div7)
1369 1.1 mrg div1 r5,r4
1370 1.1 mrg lds.l @r15+,pr
1371 1.1 mrg xtrct r4,r0
1372 1.1 mrg swap.w r0,r0
1373 1.1 mrg rotcl r0
1374 1.1 mrg rts
1375 1.1 mrg shlr16 r5
1376 1.1 mrg
1377 1.1 mrg LOCAL(large_divisor):
1378 1.1 mrg #ifdef __sh1__
1379 1.1 mrg div0u
1380 1.1 mrg #endif
1381 1.1 mrg mov #0,r0
1382 1.1 mrg xtrct r4,r0
1383 1.1 mrg xtrct r0,r4
1384 1.1 mrg bsr LOCAL(divx4)
1385 1.1 mrg rotcl r0
1386 1.1 mrg bsr LOCAL(divx4)
1387 1.1 mrg rotcl r0
1388 1.1 mrg bsr LOCAL(divx4)
1389 1.1 mrg rotcl r0
1390 1.1 mrg bsr LOCAL(divx4)
1391 1.1 mrg rotcl r0
1392 1.1 mrg lds.l @r15+,pr
1393 1.1 mrg rts
1394 1.1 mrg rotcl r0
1395 1.1 mrg
1396 1.1 mrg ENDFUNC(GLOBAL(udivsi3))
1397 1.1 mrg #endif /* L_udivsi3 */
1398 1.1 mrg
1399 1.1 mrg #ifdef L_set_fpscr
1400 1.1 mrg #if !defined (__SH2A_NOFPU__)
1401 1.6 mrg #if defined (__SH2E__) || defined (__SH2A__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
1402 1.1 mrg .global GLOBAL(set_fpscr)
1403 1.1 mrg HIDDEN_FUNC(GLOBAL(set_fpscr))
1404 1.1 mrg GLOBAL(set_fpscr):
1405 1.1 mrg lds r4,fpscr
1406 1.1 mrg #ifdef __PIC__
1407 1.1 mrg mov.l r12,@-r15
1408 1.1 mrg #ifdef __vxworks
1409 1.1 mrg mov.l LOCAL(set_fpscr_L0_base),r12
1410 1.1 mrg mov.l LOCAL(set_fpscr_L0_index),r0
1411 1.1 mrg mov.l @r12,r12
1412 1.1 mrg mov.l @(r0,r12),r12
1413 1.1 mrg #else
1414 1.1 mrg mova LOCAL(set_fpscr_L0),r0
1415 1.1 mrg mov.l LOCAL(set_fpscr_L0),r12
1416 1.1 mrg add r0,r12
1417 1.1 mrg #endif
1418 1.1 mrg mov.l LOCAL(set_fpscr_L1),r0
1419 1.1 mrg mov.l @(r0,r12),r1
1420 1.1 mrg mov.l @r15+,r12
1421 1.1 mrg #else
1422 1.1 mrg mov.l LOCAL(set_fpscr_L1),r1
1423 1.1 mrg #endif
1424 1.1 mrg swap.w r4,r0
1425 1.1 mrg or #24,r0
1426 1.1 mrg #ifndef FMOVD_WORKS
1427 1.1 mrg xor #16,r0
1428 1.1 mrg #endif
1429 1.1 mrg #if defined(__SH4__) || defined (__SH2A_DOUBLE__)
1430 1.1 mrg swap.w r0,r3
1431 1.1 mrg mov.l r3,@(4,r1)
1432 1.1 mrg #else /* defined (__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE*__) */
1433 1.1 mrg swap.w r0,r2
1434 1.1 mrg mov.l r2,@r1
1435 1.1 mrg #endif
1436 1.1 mrg #ifndef FMOVD_WORKS
1437 1.1 mrg xor #8,r0
1438 1.1 mrg #else
1439 1.1 mrg xor #24,r0
1440 1.1 mrg #endif
1441 1.1 mrg #if defined(__SH4__) || defined (__SH2A_DOUBLE__)
1442 1.1 mrg swap.w r0,r2
1443 1.1 mrg rts
1444 1.1 mrg mov.l r2,@r1
1445 1.1 mrg #else /* defined(__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE*__) */
1446 1.1 mrg swap.w r0,r3
1447 1.1 mrg rts
1448 1.1 mrg mov.l r3,@(4,r1)
1449 1.1 mrg #endif
1450 1.1 mrg .align 2
1451 1.1 mrg #ifdef __PIC__
1452 1.1 mrg #ifdef __vxworks
1453 1.1 mrg LOCAL(set_fpscr_L0_base):
1454 1.1 mrg .long ___GOTT_BASE__
1455 1.1 mrg LOCAL(set_fpscr_L0_index):
1456 1.1 mrg .long ___GOTT_INDEX__
1457 1.1 mrg #else
1458 1.1 mrg LOCAL(set_fpscr_L0):
1459 1.1 mrg .long _GLOBAL_OFFSET_TABLE_
1460 1.1 mrg #endif
1461 1.1 mrg LOCAL(set_fpscr_L1):
1462 1.1 mrg .long GLOBAL(fpscr_values@GOT)
1463 1.1 mrg #else
1464 1.1 mrg LOCAL(set_fpscr_L1):
1465 1.1 mrg .long GLOBAL(fpscr_values)
1466 1.1 mrg #endif
1467 1.1 mrg
1468 1.1 mrg ENDFUNC(GLOBAL(set_fpscr))
1469 1.1 mrg #ifndef NO_FPSCR_VALUES
1470 1.1 mrg #ifdef __ELF__
1471 1.1 mrg .comm GLOBAL(fpscr_values),8,4
1472 1.1 mrg #else
1473 1.1 mrg .comm GLOBAL(fpscr_values),8
1474 1.1 mrg #endif /* ELF */
1475 1.1 mrg #endif /* NO_FPSCR_VALUES */
1476 1.1 mrg #endif /* SH2E / SH3E / SH4 */
1477 1.1 mrg #endif /* __SH2A_NOFPU__ */
1478 1.1 mrg #endif /* L_set_fpscr */
1479 1.1 mrg #ifdef L_ic_invalidate
1480 1.6 mrg
1481 1.6 mrg #if defined(__SH4A__)
1482 1.1 mrg .global GLOBAL(ic_invalidate)
1483 1.1 mrg HIDDEN_FUNC(GLOBAL(ic_invalidate))
1484 1.1 mrg GLOBAL(ic_invalidate):
1485 1.1 mrg ocbwb @r4
1486 1.1 mrg synco
1487 1.1 mrg icbi @r4
1488 1.1 mrg rts
1489 1.1 mrg nop
1490 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate))
1491 1.6 mrg #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH4_NOFPU__)
1492 1.1 mrg /* For system code, we use ic_invalidate_line_i, but user code
1493 1.1 mrg needs a different mechanism. A kernel call is generally not
1494 1.1 mrg available, and it would also be slow. Different SH4 variants use
1495 1.1 mrg different sizes and associativities of the Icache. We use a small
1496 1.1 mrg bit of dispatch code that can be put hidden in every shared object,
1497 1.1 mrg which calls the actual processor-specific invalidation code in a
1498 1.1 mrg separate module.
1499 1.1 mrg Or if you have operating system support, the OS could mmap the
1500 1.1 mrg procesor-specific code from a single page, since it is highly
1501 1.1 mrg repetitive. */
1502 1.1 mrg .global GLOBAL(ic_invalidate)
1503 1.1 mrg HIDDEN_FUNC(GLOBAL(ic_invalidate))
1504 1.1 mrg GLOBAL(ic_invalidate):
1505 1.1 mrg #ifdef __pic__
1506 1.1 mrg #ifdef __vxworks
1507 1.1 mrg mov.l 1f,r1
1508 1.1 mrg mov.l 2f,r0
1509 1.1 mrg mov.l @r1,r1
1510 1.1 mrg mov.l 0f,r2
1511 1.1 mrg mov.l @(r0,r1),r0
1512 1.1 mrg #else
1513 1.1 mrg mov.l 1f,r1
1514 1.1 mrg mova 1f,r0
1515 1.1 mrg mov.l 0f,r2
1516 1.1 mrg add r1,r0
1517 1.1 mrg #endif
1518 1.1 mrg mov.l @(r0,r2),r1
1519 1.1 mrg #else
1520 1.1 mrg mov.l 0f,r1
1521 1.1 mrg #endif
1522 1.1 mrg ocbwb @r4
1523 1.1 mrg mov.l @(8,r1),r0
1524 1.1 mrg sub r1,r4
1525 1.1 mrg and r4,r0
1526 1.1 mrg add r1,r0
1527 1.1 mrg jmp @r0
1528 1.1 mrg mov.l @(4,r1),r0
1529 1.1 mrg .align 2
1530 1.1 mrg #ifndef __pic__
1531 1.1 mrg 0: .long GLOBAL(ic_invalidate_array)
1532 1.1 mrg #else /* __pic__ */
1533 1.1 mrg .global GLOBAL(ic_invalidate_array)
1534 1.1 mrg 0: .long GLOBAL(ic_invalidate_array)@GOT
1535 1.1 mrg #ifdef __vxworks
1536 1.1 mrg 1: .long ___GOTT_BASE__
1537 1.1 mrg 2: .long ___GOTT_INDEX__
1538 1.1 mrg #else
1539 1.1 mrg 1: .long _GLOBAL_OFFSET_TABLE_
1540 1.1 mrg #endif
1541 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate))
1542 1.1 mrg #endif /* __pic__ */
1543 1.1 mrg #endif /* SH4 */
1544 1.1 mrg #endif /* L_ic_invalidate */
1545 1.1 mrg
1546 1.1 mrg #ifdef L_ic_invalidate_array
1547 1.6 mrg #if defined(__SH4A__) || (defined (__FORCE_SH4A__) && (defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH4_NOFPU__)))
1548 1.1 mrg .global GLOBAL(ic_invalidate_array)
1549 1.1 mrg /* This is needed when an SH4 dso with trampolines is used on SH4A. */
1550 1.1 mrg .global GLOBAL(ic_invalidate_array)
1551 1.1 mrg FUNC(GLOBAL(ic_invalidate_array))
1552 1.1 mrg GLOBAL(ic_invalidate_array):
1553 1.1 mrg add r1,r4
1554 1.1 mrg synco
1555 1.1 mrg icbi @r4
1556 1.1 mrg rts
1557 1.1 mrg nop
1558 1.1 mrg .align 2
1559 1.1 mrg .long 0
1560 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate_array))
1561 1.6 mrg #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH4_NOFPU__)
1562 1.1 mrg .global GLOBAL(ic_invalidate_array)
1563 1.1 mrg .p2align 5
1564 1.1 mrg FUNC(GLOBAL(ic_invalidate_array))
1565 1.1 mrg /* This must be aligned to the beginning of a cache line. */
1566 1.1 mrg GLOBAL(ic_invalidate_array):
1567 1.1 mrg #ifndef WAYS
1568 1.1 mrg #define WAYS 4
1569 1.1 mrg #define WAY_SIZE 0x4000
1570 1.1 mrg #endif
1571 1.1 mrg #if WAYS == 1
1572 1.1 mrg .rept WAY_SIZE * WAYS / 32
1573 1.1 mrg rts
1574 1.1 mrg nop
1575 1.1 mrg .rept 7
1576 1.1 mrg .long WAY_SIZE - 32
1577 1.1 mrg .endr
1578 1.1 mrg .endr
1579 1.1 mrg #elif WAYS <= 6
1580 1.1 mrg .rept WAY_SIZE * WAYS / 32
1581 1.1 mrg braf r0
1582 1.1 mrg add #-8,r0
1583 1.1 mrg .long WAY_SIZE + 8
1584 1.1 mrg .long WAY_SIZE - 32
1585 1.1 mrg .rept WAYS-2
1586 1.1 mrg braf r0
1587 1.1 mrg nop
1588 1.1 mrg .endr
1589 1.1 mrg .rept 7 - WAYS
1590 1.1 mrg rts
1591 1.1 mrg nop
1592 1.1 mrg .endr
1593 1.1 mrg .endr
1594 1.1 mrg #else /* WAYS > 6 */
1595 1.1 mrg /* This variant needs two different pages for mmap-ing. */
1596 1.1 mrg .rept WAYS-1
1597 1.1 mrg .rept WAY_SIZE / 32
1598 1.1 mrg braf r0
1599 1.1 mrg nop
1600 1.1 mrg .long WAY_SIZE
1601 1.1 mrg .rept 6
1602 1.1 mrg .long WAY_SIZE - 32
1603 1.1 mrg .endr
1604 1.1 mrg .endr
1605 1.1 mrg .endr
1606 1.1 mrg .rept WAY_SIZE / 32
1607 1.1 mrg rts
1608 1.1 mrg .rept 15
1609 1.1 mrg nop
1610 1.1 mrg .endr
1611 1.1 mrg .endr
1612 1.1 mrg #endif /* WAYS */
1613 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate_array))
1614 1.1 mrg #endif /* SH4 */
1615 1.1 mrg #endif /* L_ic_invalidate_array */
1616 1.1 mrg
1617 1.1 mrg
1618 1.1 mrg #ifdef L_div_table
1619 1.1 mrg
1620 1.6 mrg #if defined (__SH2A__) || defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
1621 1.1 mrg /* This code uses shld, thus is not suitable for SH1 / SH2. */
1622 1.1 mrg
1623 1.1 mrg /* Signed / unsigned division without use of FPU, optimized for SH4.
1624 1.1 mrg Uses a lookup table for divisors in the range -128 .. +128, and
1625 1.1 mrg div1 with case distinction for larger divisors in three more ranges.
1626 1.1 mrg The code is lumped together with the table to allow the use of mova. */
1627 1.1 mrg #ifdef __LITTLE_ENDIAN__
1628 1.1 mrg #define L_LSB 0
1629 1.1 mrg #define L_LSWMSB 1
1630 1.1 mrg #define L_MSWLSB 2
1631 1.1 mrg #else
1632 1.1 mrg #define L_LSB 3
1633 1.1 mrg #define L_LSWMSB 2
1634 1.1 mrg #define L_MSWLSB 1
1635 1.1 mrg #endif
1636 1.1 mrg
1637 1.1 mrg .balign 4
1638 1.1 mrg .global GLOBAL(udivsi3_i4i)
1639 1.1 mrg FUNC(GLOBAL(udivsi3_i4i))
1640 1.1 mrg GLOBAL(udivsi3_i4i):
1641 1.1 mrg mov.w LOCAL(c128_w), r1
1642 1.1 mrg div0u
1643 1.1 mrg mov r4,r0
1644 1.1 mrg shlr8 r0
1645 1.1 mrg cmp/hi r1,r5
1646 1.1 mrg extu.w r5,r1
1647 1.1 mrg bf LOCAL(udiv_le128)
1648 1.1 mrg cmp/eq r5,r1
1649 1.1 mrg bf LOCAL(udiv_ge64k)
1650 1.1 mrg shlr r0
1651 1.1 mrg mov r5,r1
1652 1.1 mrg shll16 r5
1653 1.1 mrg mov.l r4,@-r15
1654 1.1 mrg div1 r5,r0
1655 1.1 mrg mov.l r1,@-r15
1656 1.1 mrg div1 r5,r0
1657 1.1 mrg div1 r5,r0
1658 1.1 mrg bra LOCAL(udiv_25)
1659 1.1 mrg div1 r5,r0
1660 1.1 mrg
1661 1.1 mrg LOCAL(div_le128):
1662 1.1 mrg mova LOCAL(div_table_ix),r0
1663 1.1 mrg bra LOCAL(div_le128_2)
1664 1.1 mrg mov.b @(r0,r5),r1
1665 1.1 mrg LOCAL(udiv_le128):
1666 1.1 mrg mov.l r4,@-r15
1667 1.1 mrg mova LOCAL(div_table_ix),r0
1668 1.1 mrg mov.b @(r0,r5),r1
1669 1.1 mrg mov.l r5,@-r15
1670 1.1 mrg LOCAL(div_le128_2):
1671 1.1 mrg mova LOCAL(div_table_inv),r0
1672 1.1 mrg mov.l @(r0,r1),r1
1673 1.1 mrg mov r5,r0
1674 1.1 mrg tst #0xfe,r0
1675 1.1 mrg mova LOCAL(div_table_clz),r0
1676 1.1 mrg dmulu.l r1,r4
1677 1.1 mrg mov.b @(r0,r5),r1
1678 1.1 mrg bt/s LOCAL(div_by_1)
1679 1.1 mrg mov r4,r0
1680 1.1 mrg mov.l @r15+,r5
1681 1.1 mrg sts mach,r0
1682 1.1 mrg /* clrt */
1683 1.1 mrg addc r4,r0
1684 1.1 mrg mov.l @r15+,r4
1685 1.1 mrg rotcr r0
1686 1.1 mrg rts
1687 1.1 mrg shld r1,r0
1688 1.1 mrg
1689 1.1 mrg LOCAL(div_by_1_neg):
1690 1.1 mrg neg r4,r0
1691 1.1 mrg LOCAL(div_by_1):
1692 1.1 mrg mov.l @r15+,r5
1693 1.1 mrg rts
1694 1.1 mrg mov.l @r15+,r4
1695 1.1 mrg
1696 1.1 mrg LOCAL(div_ge64k):
1697 1.1 mrg bt/s LOCAL(div_r8)
1698 1.1 mrg div0u
1699 1.1 mrg shll8 r5
1700 1.1 mrg bra LOCAL(div_ge64k_2)
1701 1.1 mrg div1 r5,r0
1702 1.1 mrg LOCAL(udiv_ge64k):
1703 1.1 mrg cmp/hi r0,r5
1704 1.1 mrg mov r5,r1
1705 1.1 mrg bt LOCAL(udiv_r8)
1706 1.1 mrg shll8 r5
1707 1.1 mrg mov.l r4,@-r15
1708 1.1 mrg div1 r5,r0
1709 1.1 mrg mov.l r1,@-r15
1710 1.1 mrg LOCAL(div_ge64k_2):
1711 1.1 mrg div1 r5,r0
1712 1.1 mrg mov.l LOCAL(zero_l),r1
1713 1.1 mrg .rept 4
1714 1.1 mrg div1 r5,r0
1715 1.1 mrg .endr
1716 1.1 mrg mov.l r1,@-r15
1717 1.1 mrg div1 r5,r0
1718 1.1 mrg mov.w LOCAL(m256_w),r1
1719 1.1 mrg div1 r5,r0
1720 1.1 mrg mov.b r0,@(L_LSWMSB,r15)
1721 1.1 mrg xor r4,r0
1722 1.1 mrg and r1,r0
1723 1.1 mrg bra LOCAL(div_ge64k_end)
1724 1.1 mrg xor r4,r0
1725 1.1 mrg
1726 1.1 mrg LOCAL(div_r8):
1727 1.1 mrg shll16 r4
1728 1.1 mrg bra LOCAL(div_r8_2)
1729 1.1 mrg shll8 r4
1730 1.1 mrg LOCAL(udiv_r8):
1731 1.1 mrg mov.l r4,@-r15
1732 1.1 mrg shll16 r4
1733 1.1 mrg clrt
1734 1.1 mrg shll8 r4
1735 1.1 mrg mov.l r5,@-r15
1736 1.1 mrg LOCAL(div_r8_2):
1737 1.1 mrg rotcl r4
1738 1.1 mrg mov r0,r1
1739 1.1 mrg div1 r5,r1
1740 1.1 mrg mov r4,r0
1741 1.1 mrg rotcl r0
1742 1.1 mrg mov r5,r4
1743 1.1 mrg div1 r5,r1
1744 1.1 mrg .rept 5
1745 1.1 mrg rotcl r0; div1 r5,r1
1746 1.1 mrg .endr
1747 1.1 mrg rotcl r0
1748 1.1 mrg mov.l @r15+,r5
1749 1.1 mrg div1 r4,r1
1750 1.1 mrg mov.l @r15+,r4
1751 1.1 mrg rts
1752 1.1 mrg rotcl r0
1753 1.1 mrg
1754 1.1 mrg ENDFUNC(GLOBAL(udivsi3_i4i))
1755 1.1 mrg
1756 1.1 mrg .global GLOBAL(sdivsi3_i4i)
1757 1.1 mrg FUNC(GLOBAL(sdivsi3_i4i))
1758 1.1 mrg /* This is link-compatible with a GLOBAL(sdivsi3) call,
1759 1.1 mrg but we effectively clobber only r1. */
1760 1.1 mrg GLOBAL(sdivsi3_i4i):
1761 1.1 mrg mov.l r4,@-r15
1762 1.1 mrg cmp/pz r5
1763 1.1 mrg mov.w LOCAL(c128_w), r1
1764 1.1 mrg bt/s LOCAL(pos_divisor)
1765 1.1 mrg cmp/pz r4
1766 1.1 mrg mov.l r5,@-r15
1767 1.1 mrg neg r5,r5
1768 1.1 mrg bt/s LOCAL(neg_result)
1769 1.1 mrg cmp/hi r1,r5
1770 1.1 mrg neg r4,r4
1771 1.1 mrg LOCAL(pos_result):
1772 1.1 mrg extu.w r5,r0
1773 1.1 mrg bf LOCAL(div_le128)
1774 1.1 mrg cmp/eq r5,r0
1775 1.1 mrg mov r4,r0
1776 1.1 mrg shlr8 r0
1777 1.1 mrg bf/s LOCAL(div_ge64k)
1778 1.1 mrg cmp/hi r0,r5
1779 1.1 mrg div0u
1780 1.1 mrg shll16 r5
1781 1.1 mrg div1 r5,r0
1782 1.1 mrg div1 r5,r0
1783 1.1 mrg div1 r5,r0
1784 1.1 mrg LOCAL(udiv_25):
1785 1.1 mrg mov.l LOCAL(zero_l),r1
1786 1.1 mrg div1 r5,r0
1787 1.1 mrg div1 r5,r0
1788 1.1 mrg mov.l r1,@-r15
1789 1.1 mrg .rept 3
1790 1.1 mrg div1 r5,r0
1791 1.1 mrg .endr
1792 1.1 mrg mov.b r0,@(L_MSWLSB,r15)
1793 1.1 mrg xtrct r4,r0
1794 1.1 mrg swap.w r0,r0
1795 1.1 mrg .rept 8
1796 1.1 mrg div1 r5,r0
1797 1.1 mrg .endr
1798 1.1 mrg mov.b r0,@(L_LSWMSB,r15)
1799 1.1 mrg LOCAL(div_ge64k_end):
1800 1.1 mrg .rept 8
1801 1.1 mrg div1 r5,r0
1802 1.1 mrg .endr
1803 1.1 mrg mov.l @r15+,r4 ! zero-extension and swap using LS unit.
1804 1.1 mrg extu.b r0,r0
1805 1.1 mrg mov.l @r15+,r5
1806 1.1 mrg or r4,r0
1807 1.1 mrg mov.l @r15+,r4
1808 1.1 mrg rts
1809 1.1 mrg rotcl r0
1810 1.1 mrg
1811 1.1 mrg LOCAL(div_le128_neg):
1812 1.1 mrg tst #0xfe,r0
1813 1.1 mrg mova LOCAL(div_table_ix),r0
1814 1.1 mrg mov.b @(r0,r5),r1
1815 1.1 mrg mova LOCAL(div_table_inv),r0
1816 1.1 mrg bt/s LOCAL(div_by_1_neg)
1817 1.1 mrg mov.l @(r0,r1),r1
1818 1.1 mrg mova LOCAL(div_table_clz),r0
1819 1.1 mrg dmulu.l r1,r4
1820 1.1 mrg mov.b @(r0,r5),r1
1821 1.1 mrg mov.l @r15+,r5
1822 1.1 mrg sts mach,r0
1823 1.1 mrg /* clrt */
1824 1.1 mrg addc r4,r0
1825 1.1 mrg mov.l @r15+,r4
1826 1.1 mrg rotcr r0
1827 1.1 mrg shld r1,r0
1828 1.1 mrg rts
1829 1.1 mrg neg r0,r0
1830 1.1 mrg
1831 1.1 mrg LOCAL(pos_divisor):
1832 1.1 mrg mov.l r5,@-r15
1833 1.1 mrg bt/s LOCAL(pos_result)
1834 1.1 mrg cmp/hi r1,r5
1835 1.1 mrg neg r4,r4
1836 1.1 mrg LOCAL(neg_result):
1837 1.1 mrg extu.w r5,r0
1838 1.1 mrg bf LOCAL(div_le128_neg)
1839 1.1 mrg cmp/eq r5,r0
1840 1.1 mrg mov r4,r0
1841 1.1 mrg shlr8 r0
1842 1.1 mrg bf/s LOCAL(div_ge64k_neg)
1843 1.1 mrg cmp/hi r0,r5
1844 1.1 mrg div0u
1845 1.1 mrg mov.l LOCAL(zero_l),r1
1846 1.1 mrg shll16 r5
1847 1.1 mrg div1 r5,r0
1848 1.1 mrg mov.l r1,@-r15
1849 1.1 mrg .rept 7
1850 1.1 mrg div1 r5,r0
1851 1.1 mrg .endr
1852 1.1 mrg mov.b r0,@(L_MSWLSB,r15)
1853 1.1 mrg xtrct r4,r0
1854 1.1 mrg swap.w r0,r0
1855 1.1 mrg .rept 8
1856 1.1 mrg div1 r5,r0
1857 1.1 mrg .endr
1858 1.1 mrg mov.b r0,@(L_LSWMSB,r15)
1859 1.1 mrg LOCAL(div_ge64k_neg_end):
1860 1.1 mrg .rept 8
1861 1.1 mrg div1 r5,r0
1862 1.1 mrg .endr
1863 1.1 mrg mov.l @r15+,r4 ! zero-extension and swap using LS unit.
1864 1.1 mrg extu.b r0,r1
1865 1.1 mrg mov.l @r15+,r5
1866 1.1 mrg or r4,r1
1867 1.1 mrg LOCAL(div_r8_neg_end):
1868 1.1 mrg mov.l @r15+,r4
1869 1.1 mrg rotcl r1
1870 1.1 mrg rts
1871 1.1 mrg neg r1,r0
1872 1.1 mrg
1873 1.1 mrg LOCAL(div_ge64k_neg):
1874 1.1 mrg bt/s LOCAL(div_r8_neg)
1875 1.1 mrg div0u
1876 1.1 mrg shll8 r5
1877 1.1 mrg mov.l LOCAL(zero_l),r1
1878 1.1 mrg .rept 6
1879 1.1 mrg div1 r5,r0
1880 1.1 mrg .endr
1881 1.1 mrg mov.l r1,@-r15
1882 1.1 mrg div1 r5,r0
1883 1.1 mrg mov.w LOCAL(m256_w),r1
1884 1.1 mrg div1 r5,r0
1885 1.1 mrg mov.b r0,@(L_LSWMSB,r15)
1886 1.1 mrg xor r4,r0
1887 1.1 mrg and r1,r0
1888 1.1 mrg bra LOCAL(div_ge64k_neg_end)
1889 1.1 mrg xor r4,r0
1890 1.1 mrg
1891 1.1 mrg LOCAL(c128_w):
1892 1.1 mrg .word 128
1893 1.1 mrg
1894 1.1 mrg LOCAL(div_r8_neg):
1895 1.1 mrg clrt
1896 1.1 mrg shll16 r4
1897 1.1 mrg mov r4,r1
1898 1.1 mrg shll8 r1
1899 1.1 mrg mov r5,r4
1900 1.1 mrg .rept 7
1901 1.1 mrg rotcl r1; div1 r5,r0
1902 1.1 mrg .endr
1903 1.1 mrg mov.l @r15+,r5
1904 1.1 mrg rotcl r1
1905 1.1 mrg bra LOCAL(div_r8_neg_end)
1906 1.1 mrg div1 r4,r0
1907 1.1 mrg
1908 1.1 mrg LOCAL(m256_w):
1909 1.1 mrg .word 0xff00
1910 1.1 mrg /* This table has been generated by divtab-sh4.c. */
1911 1.1 mrg .balign 4
1912 1.1 mrg LOCAL(div_table_clz):
1913 1.1 mrg .byte 0
1914 1.1 mrg .byte 1
1915 1.1 mrg .byte 0
1916 1.1 mrg .byte -1
1917 1.1 mrg .byte -1
1918 1.1 mrg .byte -2
1919 1.1 mrg .byte -2
1920 1.1 mrg .byte -2
1921 1.1 mrg .byte -2
1922 1.1 mrg .byte -3
1923 1.1 mrg .byte -3
1924 1.1 mrg .byte -3
1925 1.1 mrg .byte -3
1926 1.1 mrg .byte -3
1927 1.1 mrg .byte -3
1928 1.1 mrg .byte -3
1929 1.1 mrg .byte -3
1930 1.1 mrg .byte -4
1931 1.1 mrg .byte -4
1932 1.1 mrg .byte -4
1933 1.1 mrg .byte -4
1934 1.1 mrg .byte -4
1935 1.1 mrg .byte -4
1936 1.1 mrg .byte -4
1937 1.1 mrg .byte -4
1938 1.1 mrg .byte -4
1939 1.1 mrg .byte -4
1940 1.1 mrg .byte -4
1941 1.1 mrg .byte -4
1942 1.1 mrg .byte -4
1943 1.1 mrg .byte -4
1944 1.1 mrg .byte -4
1945 1.1 mrg .byte -4
1946 1.1 mrg .byte -5
1947 1.1 mrg .byte -5
1948 1.1 mrg .byte -5
1949 1.1 mrg .byte -5
1950 1.1 mrg .byte -5
1951 1.1 mrg .byte -5
1952 1.1 mrg .byte -5
1953 1.1 mrg .byte -5
1954 1.1 mrg .byte -5
1955 1.1 mrg .byte -5
1956 1.1 mrg .byte -5
1957 1.1 mrg .byte -5
1958 1.1 mrg .byte -5
1959 1.1 mrg .byte -5
1960 1.1 mrg .byte -5
1961 1.1 mrg .byte -5
1962 1.1 mrg .byte -5
1963 1.1 mrg .byte -5
1964 1.1 mrg .byte -5
1965 1.1 mrg .byte -5
1966 1.1 mrg .byte -5
1967 1.1 mrg .byte -5
1968 1.1 mrg .byte -5
1969 1.1 mrg .byte -5
1970 1.1 mrg .byte -5
1971 1.1 mrg .byte -5
1972 1.1 mrg .byte -5
1973 1.1 mrg .byte -5
1974 1.1 mrg .byte -5
1975 1.1 mrg .byte -5
1976 1.1 mrg .byte -5
1977 1.1 mrg .byte -5
1978 1.1 mrg .byte -6
1979 1.1 mrg .byte -6
1980 1.1 mrg .byte -6
1981 1.1 mrg .byte -6
1982 1.1 mrg .byte -6
1983 1.1 mrg .byte -6
1984 1.1 mrg .byte -6
1985 1.1 mrg .byte -6
1986 1.1 mrg .byte -6
1987 1.1 mrg .byte -6
1988 1.1 mrg .byte -6
1989 1.1 mrg .byte -6
1990 1.1 mrg .byte -6
1991 1.1 mrg .byte -6
1992 1.1 mrg .byte -6
1993 1.1 mrg .byte -6
1994 1.1 mrg .byte -6
1995 1.1 mrg .byte -6
1996 1.1 mrg .byte -6
1997 1.1 mrg .byte -6
1998 1.1 mrg .byte -6
1999 1.1 mrg .byte -6
2000 1.1 mrg .byte -6
2001 1.1 mrg .byte -6
2002 1.1 mrg .byte -6
2003 1.1 mrg .byte -6
2004 1.1 mrg .byte -6
2005 1.1 mrg .byte -6
2006 1.1 mrg .byte -6
2007 1.1 mrg .byte -6
2008 1.1 mrg .byte -6
2009 1.1 mrg .byte -6
2010 1.1 mrg .byte -6
2011 1.1 mrg .byte -6
2012 1.1 mrg .byte -6
2013 1.1 mrg .byte -6
2014 1.1 mrg .byte -6
2015 1.1 mrg .byte -6
2016 1.1 mrg .byte -6
2017 1.1 mrg .byte -6
2018 1.1 mrg .byte -6
2019 1.1 mrg .byte -6
2020 1.1 mrg .byte -6
2021 1.1 mrg .byte -6
2022 1.1 mrg .byte -6
2023 1.1 mrg .byte -6
2024 1.1 mrg .byte -6
2025 1.1 mrg .byte -6
2026 1.1 mrg .byte -6
2027 1.1 mrg .byte -6
2028 1.1 mrg .byte -6
2029 1.1 mrg .byte -6
2030 1.1 mrg .byte -6
2031 1.1 mrg .byte -6
2032 1.1 mrg .byte -6
2033 1.1 mrg .byte -6
2034 1.1 mrg .byte -6
2035 1.1 mrg .byte -6
2036 1.1 mrg .byte -6
2037 1.1 mrg .byte -6
2038 1.1 mrg .byte -6
2039 1.1 mrg .byte -6
2040 1.1 mrg .byte -6
2041 1.1 mrg /* Lookup table translating positive divisor to index into table of
2042 1.1 mrg normalized inverse. N.B. the '0' entry is also the last entry of the
2043 1.1 mrg previous table, and causes an unaligned access for division by zero. */
2044 1.1 mrg LOCAL(div_table_ix):
2045 1.1 mrg .byte -6
2046 1.1 mrg .byte -128
2047 1.1 mrg .byte -128
2048 1.1 mrg .byte 0
2049 1.1 mrg .byte -128
2050 1.1 mrg .byte -64
2051 1.1 mrg .byte 0
2052 1.1 mrg .byte 64
2053 1.1 mrg .byte -128
2054 1.1 mrg .byte -96
2055 1.1 mrg .byte -64
2056 1.1 mrg .byte -32
2057 1.1 mrg .byte 0
2058 1.1 mrg .byte 32
2059 1.1 mrg .byte 64
2060 1.1 mrg .byte 96
2061 1.1 mrg .byte -128
2062 1.1 mrg .byte -112
2063 1.1 mrg .byte -96
2064 1.1 mrg .byte -80
2065 1.1 mrg .byte -64
2066 1.1 mrg .byte -48
2067 1.1 mrg .byte -32
2068 1.1 mrg .byte -16
2069 1.1 mrg .byte 0
2070 1.1 mrg .byte 16
2071 1.1 mrg .byte 32
2072 1.1 mrg .byte 48
2073 1.1 mrg .byte 64
2074 1.1 mrg .byte 80
2075 1.1 mrg .byte 96
2076 1.1 mrg .byte 112
2077 1.1 mrg .byte -128
2078 1.1 mrg .byte -120
2079 1.1 mrg .byte -112
2080 1.1 mrg .byte -104
2081 1.1 mrg .byte -96
2082 1.1 mrg .byte -88
2083 1.1 mrg .byte -80
2084 1.1 mrg .byte -72
2085 1.1 mrg .byte -64
2086 1.1 mrg .byte -56
2087 1.1 mrg .byte -48
2088 1.1 mrg .byte -40
2089 1.1 mrg .byte -32
2090 1.1 mrg .byte -24
2091 1.1 mrg .byte -16
2092 1.1 mrg .byte -8
2093 1.1 mrg .byte 0
2094 1.1 mrg .byte 8
2095 1.1 mrg .byte 16
2096 1.1 mrg .byte 24
2097 1.1 mrg .byte 32
2098 1.1 mrg .byte 40
2099 1.1 mrg .byte 48
2100 1.1 mrg .byte 56
2101 1.1 mrg .byte 64
2102 1.1 mrg .byte 72
2103 1.1 mrg .byte 80
2104 1.1 mrg .byte 88
2105 1.1 mrg .byte 96
2106 1.1 mrg .byte 104
2107 1.1 mrg .byte 112
2108 1.1 mrg .byte 120
2109 1.1 mrg .byte -128
2110 1.1 mrg .byte -124
2111 1.1 mrg .byte -120
2112 1.1 mrg .byte -116
2113 1.1 mrg .byte -112
2114 1.1 mrg .byte -108
2115 1.1 mrg .byte -104
2116 1.1 mrg .byte -100
2117 1.1 mrg .byte -96
2118 1.1 mrg .byte -92
2119 1.1 mrg .byte -88
2120 1.1 mrg .byte -84
2121 1.1 mrg .byte -80
2122 1.1 mrg .byte -76
2123 1.1 mrg .byte -72
2124 1.1 mrg .byte -68
2125 1.1 mrg .byte -64
2126 1.1 mrg .byte -60
2127 1.1 mrg .byte -56
2128 1.1 mrg .byte -52
2129 1.1 mrg .byte -48
2130 1.1 mrg .byte -44
2131 1.1 mrg .byte -40
2132 1.1 mrg .byte -36
2133 1.1 mrg .byte -32
2134 1.1 mrg .byte -28
2135 1.1 mrg .byte -24
2136 1.1 mrg .byte -20
2137 1.1 mrg .byte -16
2138 1.1 mrg .byte -12
2139 1.1 mrg .byte -8
2140 1.1 mrg .byte -4
2141 1.1 mrg .byte 0
2142 1.1 mrg .byte 4
2143 1.1 mrg .byte 8
2144 1.1 mrg .byte 12
2145 1.1 mrg .byte 16
2146 1.1 mrg .byte 20
2147 1.1 mrg .byte 24
2148 1.1 mrg .byte 28
2149 1.1 mrg .byte 32
2150 1.1 mrg .byte 36
2151 1.1 mrg .byte 40
2152 1.1 mrg .byte 44
2153 1.1 mrg .byte 48
2154 1.1 mrg .byte 52
2155 1.1 mrg .byte 56
2156 1.1 mrg .byte 60
2157 1.1 mrg .byte 64
2158 1.1 mrg .byte 68
2159 1.1 mrg .byte 72
2160 1.1 mrg .byte 76
2161 1.1 mrg .byte 80
2162 1.1 mrg .byte 84
2163 1.1 mrg .byte 88
2164 1.1 mrg .byte 92
2165 1.1 mrg .byte 96
2166 1.1 mrg .byte 100
2167 1.1 mrg .byte 104
2168 1.1 mrg .byte 108
2169 1.1 mrg .byte 112
2170 1.1 mrg .byte 116
2171 1.1 mrg .byte 120
2172 1.1 mrg .byte 124
2173 1.1 mrg .byte -128
2174 1.1 mrg /* 1/64 .. 1/127, normalized. There is an implicit leading 1 in bit 32. */
2175 1.1 mrg .balign 4
2176 1.1 mrg LOCAL(zero_l):
2177 1.1 mrg .long 0x0
2178 1.1 mrg .long 0xF81F81F9
2179 1.1 mrg .long 0xF07C1F08
2180 1.1 mrg .long 0xE9131AC0
2181 1.1 mrg .long 0xE1E1E1E2
2182 1.1 mrg .long 0xDAE6076C
2183 1.1 mrg .long 0xD41D41D5
2184 1.1 mrg .long 0xCD856891
2185 1.1 mrg .long 0xC71C71C8
2186 1.1 mrg .long 0xC0E07039
2187 1.1 mrg .long 0xBACF914D
2188 1.1 mrg .long 0xB4E81B4F
2189 1.1 mrg .long 0xAF286BCB
2190 1.1 mrg .long 0xA98EF607
2191 1.1 mrg .long 0xA41A41A5
2192 1.1 mrg .long 0x9EC8E952
2193 1.1 mrg .long 0x9999999A
2194 1.1 mrg .long 0x948B0FCE
2195 1.1 mrg .long 0x8F9C18FA
2196 1.1 mrg .long 0x8ACB90F7
2197 1.1 mrg .long 0x86186187
2198 1.1 mrg .long 0x81818182
2199 1.1 mrg .long 0x7D05F418
2200 1.1 mrg .long 0x78A4C818
2201 1.1 mrg .long 0x745D1746
2202 1.1 mrg .long 0x702E05C1
2203 1.1 mrg .long 0x6C16C16D
2204 1.1 mrg .long 0x68168169
2205 1.1 mrg .long 0x642C8591
2206 1.1 mrg .long 0x60581606
2207 1.1 mrg .long 0x5C9882BA
2208 1.1 mrg .long 0x58ED2309
2209 1.1 mrg LOCAL(div_table_inv):
2210 1.1 mrg .long 0x55555556
2211 1.1 mrg .long 0x51D07EAF
2212 1.1 mrg .long 0x4E5E0A73
2213 1.1 mrg .long 0x4AFD6A06
2214 1.1 mrg .long 0x47AE147B
2215 1.1 mrg .long 0x446F8657
2216 1.1 mrg .long 0x41414142
2217 1.1 mrg .long 0x3E22CBCF
2218 1.1 mrg .long 0x3B13B13C
2219 1.1 mrg .long 0x38138139
2220 1.1 mrg .long 0x3521CFB3
2221 1.1 mrg .long 0x323E34A3
2222 1.1 mrg .long 0x2F684BDB
2223 1.1 mrg .long 0x2C9FB4D9
2224 1.1 mrg .long 0x29E4129F
2225 1.1 mrg .long 0x27350B89
2226 1.1 mrg .long 0x24924925
2227 1.1 mrg .long 0x21FB7813
2228 1.1 mrg .long 0x1F7047DD
2229 1.1 mrg .long 0x1CF06ADB
2230 1.1 mrg .long 0x1A7B9612
2231 1.1 mrg .long 0x18118119
2232 1.1 mrg .long 0x15B1E5F8
2233 1.1 mrg .long 0x135C8114
2234 1.1 mrg .long 0x11111112
2235 1.1 mrg .long 0xECF56BF
2236 1.1 mrg .long 0xC9714FC
2237 1.1 mrg .long 0xA6810A7
2238 1.1 mrg .long 0x8421085
2239 1.1 mrg .long 0x624DD30
2240 1.1 mrg .long 0x4104105
2241 1.1 mrg .long 0x2040811
2242 1.1 mrg /* maximum error: 0.987342 scaled: 0.921875*/
2243 1.1 mrg
2244 1.1 mrg ENDFUNC(GLOBAL(sdivsi3_i4i))
2245 1.1 mrg #endif /* SH3 / SH4 */
2246 1.1 mrg
2247 1.1 mrg #endif /* L_div_table */
2248 1.1 mrg
2249 1.1 mrg #ifdef L_udiv_qrnnd_16
2250 1.1 mrg HIDDEN_FUNC(GLOBAL(udiv_qrnnd_16))
2251 1.1 mrg /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */
2252 1.1 mrg /* n1 < d, but n1 might be larger than d1. */
2253 1.1 mrg .global GLOBAL(udiv_qrnnd_16)
2254 1.1 mrg .balign 8
2255 1.1 mrg GLOBAL(udiv_qrnnd_16):
2256 1.1 mrg div0u
2257 1.1 mrg cmp/hi r6,r0
2258 1.1 mrg bt .Lots
2259 1.1 mrg .rept 16
2260 1.1 mrg div1 r6,r0
2261 1.1 mrg .endr
2262 1.1 mrg extu.w r0,r1
2263 1.1 mrg bt 0f
2264 1.1 mrg add r6,r0
2265 1.1 mrg 0: rotcl r1
2266 1.1 mrg mulu.w r1,r5
2267 1.1 mrg xtrct r4,r0
2268 1.1 mrg swap.w r0,r0
2269 1.1 mrg sts macl,r2
2270 1.1 mrg cmp/hs r2,r0
2271 1.1 mrg sub r2,r0
2272 1.1 mrg bt 0f
2273 1.1 mrg addc r5,r0
2274 1.1 mrg add #-1,r1
2275 1.1 mrg bt 0f
2276 1.1 mrg 1: add #-1,r1
2277 1.1 mrg rts
2278 1.1 mrg add r5,r0
2279 1.1 mrg .balign 8
2280 1.1 mrg .Lots:
2281 1.1 mrg sub r5,r0
2282 1.1 mrg swap.w r4,r1
2283 1.1 mrg xtrct r0,r1
2284 1.1 mrg clrt
2285 1.1 mrg mov r1,r0
2286 1.1 mrg addc r5,r0
2287 1.1 mrg mov #-1,r1
2288 1.1 mrg SL1(bf, 1b,
2289 1.1 mrg shlr16 r1)
2290 1.1 mrg 0: rts
2291 1.1 mrg nop
2292 1.1 mrg ENDFUNC(GLOBAL(udiv_qrnnd_16))
2293 1.1 mrg #endif /* L_udiv_qrnnd_16 */
2294