OSDN Git Service

2010-04-06 Kai Tietz <kai.tietz@onevision.com>
[pf3gnuchains/gcc-fork.git] / gcc / config / sh / lib1funcs.asm
1 /* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2    2004, 2005, 2006, 2009
3    Free Software Foundation, Inc.
4
5 This file is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 3, or (at your option) any
8 later version.
9
10 This file is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 General Public License for more details.
14
15 Under Section 7 of GPL version 3, you are granted additional
16 permissions described in the GCC Runtime Library Exception, version
17 3.1, as published by the Free Software Foundation.
18
19 You should have received a copy of the GNU General Public License and
20 a copy of the GCC Runtime Library Exception along with this program;
21 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
22 <http://www.gnu.org/licenses/>.  */
23
24
25 !! libgcc routines for the Renesas / SuperH SH CPUs.
26 !! Contributed by Steve Chamberlain.
27 !! sac@cygnus.com
28
29 !! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
30 !! recoded in assembly by Toshiyasu Morita
31 !! tm@netcom.com
32
33 #if defined(__ELF__) && defined(__linux__)
34 .section .note.GNU-stack,"",%progbits
35 .previous
36 #endif
37
38 /* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
39    ELF local label prefixes by J"orn Rennecke
40    amylaar@cygnus.com  */
41
42 #include "lib1funcs.h"
43
44 /* t-vxworks needs to build both PIC and non-PIC versions of libgcc,
45    so it is more convenient to define NO_FPSCR_VALUES here than to
46    define it on the command line.  */
47 #if defined __vxworks && defined __PIC__
48 #define NO_FPSCR_VALUES
49 #endif
50         
51 #if ! __SH5__
52 #ifdef L_ashiftrt
53         .global GLOBAL(ashiftrt_r4_0)
54         .global GLOBAL(ashiftrt_r4_1)
55         .global GLOBAL(ashiftrt_r4_2)
56         .global GLOBAL(ashiftrt_r4_3)
57         .global GLOBAL(ashiftrt_r4_4)
58         .global GLOBAL(ashiftrt_r4_5)
59         .global GLOBAL(ashiftrt_r4_6)
60         .global GLOBAL(ashiftrt_r4_7)
61         .global GLOBAL(ashiftrt_r4_8)
62         .global GLOBAL(ashiftrt_r4_9)
63         .global GLOBAL(ashiftrt_r4_10)
64         .global GLOBAL(ashiftrt_r4_11)
65         .global GLOBAL(ashiftrt_r4_12)
66         .global GLOBAL(ashiftrt_r4_13)
67         .global GLOBAL(ashiftrt_r4_14)
68         .global GLOBAL(ashiftrt_r4_15)
69         .global GLOBAL(ashiftrt_r4_16)
70         .global GLOBAL(ashiftrt_r4_17)
71         .global GLOBAL(ashiftrt_r4_18)
72         .global GLOBAL(ashiftrt_r4_19)
73         .global GLOBAL(ashiftrt_r4_20)
74         .global GLOBAL(ashiftrt_r4_21)
75         .global GLOBAL(ashiftrt_r4_22)
76         .global GLOBAL(ashiftrt_r4_23)
77         .global GLOBAL(ashiftrt_r4_24)
78         .global GLOBAL(ashiftrt_r4_25)
79         .global GLOBAL(ashiftrt_r4_26)
80         .global GLOBAL(ashiftrt_r4_27)
81         .global GLOBAL(ashiftrt_r4_28)
82         .global GLOBAL(ashiftrt_r4_29)
83         .global GLOBAL(ashiftrt_r4_30)
84         .global GLOBAL(ashiftrt_r4_31)
85         .global GLOBAL(ashiftrt_r4_32)
86
87         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_0))
88         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_1))
89         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_2))
90         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_3))
91         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_4))
92         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_5))
93         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_6))
94         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_7))
95         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_8))
96         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_9))
97         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_10))
98         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_11))
99         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_12))
100         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_13))
101         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_14))
102         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_15))
103         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_16))
104         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_17))
105         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_18))
106         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_19))
107         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_20))
108         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_21))
109         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_22))
110         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_23))
111         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_24))
112         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_25))
113         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_26))
114         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_27))
115         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_28))
116         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_29))
117         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_30))
118         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_31))
119         HIDDEN_FUNC(GLOBAL(ashiftrt_r4_32))
120
121         .align  1
122 GLOBAL(ashiftrt_r4_32):
123 GLOBAL(ashiftrt_r4_31):
124         rotcl   r4
125         rts
126         subc    r4,r4
127
128 GLOBAL(ashiftrt_r4_30):
129         shar    r4
130 GLOBAL(ashiftrt_r4_29):
131         shar    r4
132 GLOBAL(ashiftrt_r4_28):
133         shar    r4
134 GLOBAL(ashiftrt_r4_27):
135         shar    r4
136 GLOBAL(ashiftrt_r4_26):
137         shar    r4
138 GLOBAL(ashiftrt_r4_25):
139         shar    r4
140 GLOBAL(ashiftrt_r4_24):
141         shlr16  r4
142         shlr8   r4
143         rts
144         exts.b  r4,r4
145
146 GLOBAL(ashiftrt_r4_23):
147         shar    r4
148 GLOBAL(ashiftrt_r4_22):
149         shar    r4
150 GLOBAL(ashiftrt_r4_21):
151         shar    r4
152 GLOBAL(ashiftrt_r4_20):
153         shar    r4
154 GLOBAL(ashiftrt_r4_19):
155         shar    r4
156 GLOBAL(ashiftrt_r4_18):
157         shar    r4
158 GLOBAL(ashiftrt_r4_17):
159         shar    r4
160 GLOBAL(ashiftrt_r4_16):
161         shlr16  r4
162         rts
163         exts.w  r4,r4
164
165 GLOBAL(ashiftrt_r4_15):
166         shar    r4
167 GLOBAL(ashiftrt_r4_14):
168         shar    r4
169 GLOBAL(ashiftrt_r4_13):
170         shar    r4
171 GLOBAL(ashiftrt_r4_12):
172         shar    r4
173 GLOBAL(ashiftrt_r4_11):
174         shar    r4
175 GLOBAL(ashiftrt_r4_10):
176         shar    r4
177 GLOBAL(ashiftrt_r4_9):
178         shar    r4
179 GLOBAL(ashiftrt_r4_8):
180         shar    r4
181 GLOBAL(ashiftrt_r4_7):
182         shar    r4
183 GLOBAL(ashiftrt_r4_6):
184         shar    r4
185 GLOBAL(ashiftrt_r4_5):
186         shar    r4
187 GLOBAL(ashiftrt_r4_4):
188         shar    r4
189 GLOBAL(ashiftrt_r4_3):
190         shar    r4
191 GLOBAL(ashiftrt_r4_2):
192         shar    r4
193 GLOBAL(ashiftrt_r4_1):
194         rts
195         shar    r4
196
197 GLOBAL(ashiftrt_r4_0):
198         rts
199         nop
200
201         ENDFUNC(GLOBAL(ashiftrt_r4_0))
202         ENDFUNC(GLOBAL(ashiftrt_r4_1))
203         ENDFUNC(GLOBAL(ashiftrt_r4_2))
204         ENDFUNC(GLOBAL(ashiftrt_r4_3))
205         ENDFUNC(GLOBAL(ashiftrt_r4_4))
206         ENDFUNC(GLOBAL(ashiftrt_r4_5))
207         ENDFUNC(GLOBAL(ashiftrt_r4_6))
208         ENDFUNC(GLOBAL(ashiftrt_r4_7))
209         ENDFUNC(GLOBAL(ashiftrt_r4_8))
210         ENDFUNC(GLOBAL(ashiftrt_r4_9))
211         ENDFUNC(GLOBAL(ashiftrt_r4_10))
212         ENDFUNC(GLOBAL(ashiftrt_r4_11))
213         ENDFUNC(GLOBAL(ashiftrt_r4_12))
214         ENDFUNC(GLOBAL(ashiftrt_r4_13))
215         ENDFUNC(GLOBAL(ashiftrt_r4_14))
216         ENDFUNC(GLOBAL(ashiftrt_r4_15))
217         ENDFUNC(GLOBAL(ashiftrt_r4_16))
218         ENDFUNC(GLOBAL(ashiftrt_r4_17))
219         ENDFUNC(GLOBAL(ashiftrt_r4_18))
220         ENDFUNC(GLOBAL(ashiftrt_r4_19))
221         ENDFUNC(GLOBAL(ashiftrt_r4_20))
222         ENDFUNC(GLOBAL(ashiftrt_r4_21))
223         ENDFUNC(GLOBAL(ashiftrt_r4_22))
224         ENDFUNC(GLOBAL(ashiftrt_r4_23))
225         ENDFUNC(GLOBAL(ashiftrt_r4_24))
226         ENDFUNC(GLOBAL(ashiftrt_r4_25))
227         ENDFUNC(GLOBAL(ashiftrt_r4_26))
228         ENDFUNC(GLOBAL(ashiftrt_r4_27))
229         ENDFUNC(GLOBAL(ashiftrt_r4_28))
230         ENDFUNC(GLOBAL(ashiftrt_r4_29))
231         ENDFUNC(GLOBAL(ashiftrt_r4_30))
232         ENDFUNC(GLOBAL(ashiftrt_r4_31))
233         ENDFUNC(GLOBAL(ashiftrt_r4_32))
234 #endif
235
236 #ifdef L_ashiftrt_n
237
238 !
239 ! GLOBAL(ashrsi3)
240 !
241 ! Entry:
242 !
243 ! r4: Value to shift
244 ! r5: Shifts
245 !
246 ! Exit:
247 !
248 ! r0: Result
249 !
250 ! Destroys:
251 !
252 ! (none)
253 !
254
255         .global GLOBAL(ashrsi3)
256         HIDDEN_FUNC(GLOBAL(ashrsi3))
257         .align  2
258 GLOBAL(ashrsi3):
259         mov     #31,r0
260         and     r0,r5
261         mova    LOCAL(ashrsi3_table),r0
262         mov.b   @(r0,r5),r5
263 #ifdef __sh1__
264         add     r5,r0
265         jmp     @r0
266 #else
267         braf    r5
268 #endif
269         mov     r4,r0
270
271         .align  2
272 LOCAL(ashrsi3_table):
273         .byte           LOCAL(ashrsi3_0)-LOCAL(ashrsi3_table)
274         .byte           LOCAL(ashrsi3_1)-LOCAL(ashrsi3_table)
275         .byte           LOCAL(ashrsi3_2)-LOCAL(ashrsi3_table)
276         .byte           LOCAL(ashrsi3_3)-LOCAL(ashrsi3_table)
277         .byte           LOCAL(ashrsi3_4)-LOCAL(ashrsi3_table)
278         .byte           LOCAL(ashrsi3_5)-LOCAL(ashrsi3_table)
279         .byte           LOCAL(ashrsi3_6)-LOCAL(ashrsi3_table)
280         .byte           LOCAL(ashrsi3_7)-LOCAL(ashrsi3_table)
281         .byte           LOCAL(ashrsi3_8)-LOCAL(ashrsi3_table)
282         .byte           LOCAL(ashrsi3_9)-LOCAL(ashrsi3_table)
283         .byte           LOCAL(ashrsi3_10)-LOCAL(ashrsi3_table)
284         .byte           LOCAL(ashrsi3_11)-LOCAL(ashrsi3_table)
285         .byte           LOCAL(ashrsi3_12)-LOCAL(ashrsi3_table)
286         .byte           LOCAL(ashrsi3_13)-LOCAL(ashrsi3_table)
287         .byte           LOCAL(ashrsi3_14)-LOCAL(ashrsi3_table)
288         .byte           LOCAL(ashrsi3_15)-LOCAL(ashrsi3_table)
289         .byte           LOCAL(ashrsi3_16)-LOCAL(ashrsi3_table)
290         .byte           LOCAL(ashrsi3_17)-LOCAL(ashrsi3_table)
291         .byte           LOCAL(ashrsi3_18)-LOCAL(ashrsi3_table)
292         .byte           LOCAL(ashrsi3_19)-LOCAL(ashrsi3_table)
293         .byte           LOCAL(ashrsi3_20)-LOCAL(ashrsi3_table)
294         .byte           LOCAL(ashrsi3_21)-LOCAL(ashrsi3_table)
295         .byte           LOCAL(ashrsi3_22)-LOCAL(ashrsi3_table)
296         .byte           LOCAL(ashrsi3_23)-LOCAL(ashrsi3_table)
297         .byte           LOCAL(ashrsi3_24)-LOCAL(ashrsi3_table)
298         .byte           LOCAL(ashrsi3_25)-LOCAL(ashrsi3_table)
299         .byte           LOCAL(ashrsi3_26)-LOCAL(ashrsi3_table)
300         .byte           LOCAL(ashrsi3_27)-LOCAL(ashrsi3_table)
301         .byte           LOCAL(ashrsi3_28)-LOCAL(ashrsi3_table)
302         .byte           LOCAL(ashrsi3_29)-LOCAL(ashrsi3_table)
303         .byte           LOCAL(ashrsi3_30)-LOCAL(ashrsi3_table)
304         .byte           LOCAL(ashrsi3_31)-LOCAL(ashrsi3_table)
305
306 LOCAL(ashrsi3_31):
307         rotcl   r0
308         rts
309         subc    r0,r0
310
311 LOCAL(ashrsi3_30):
312         shar    r0
313 LOCAL(ashrsi3_29):
314         shar    r0
315 LOCAL(ashrsi3_28):
316         shar    r0
317 LOCAL(ashrsi3_27):
318         shar    r0
319 LOCAL(ashrsi3_26):
320         shar    r0
321 LOCAL(ashrsi3_25):
322         shar    r0
323 LOCAL(ashrsi3_24):
324         shlr16  r0
325         shlr8   r0
326         rts
327         exts.b  r0,r0
328
329 LOCAL(ashrsi3_23):
330         shar    r0
331 LOCAL(ashrsi3_22):
332         shar    r0
333 LOCAL(ashrsi3_21):
334         shar    r0
335 LOCAL(ashrsi3_20):
336         shar    r0
337 LOCAL(ashrsi3_19):
338         shar    r0
339 LOCAL(ashrsi3_18):
340         shar    r0
341 LOCAL(ashrsi3_17):
342         shar    r0
343 LOCAL(ashrsi3_16):
344         shlr16  r0
345         rts
346         exts.w  r0,r0
347
348 LOCAL(ashrsi3_15):
349         shar    r0
350 LOCAL(ashrsi3_14):
351         shar    r0
352 LOCAL(ashrsi3_13):
353         shar    r0
354 LOCAL(ashrsi3_12):
355         shar    r0
356 LOCAL(ashrsi3_11):
357         shar    r0
358 LOCAL(ashrsi3_10):
359         shar    r0
360 LOCAL(ashrsi3_9):
361         shar    r0
362 LOCAL(ashrsi3_8):
363         shar    r0
364 LOCAL(ashrsi3_7):
365         shar    r0
366 LOCAL(ashrsi3_6):
367         shar    r0
368 LOCAL(ashrsi3_5):
369         shar    r0
370 LOCAL(ashrsi3_4):
371         shar    r0
372 LOCAL(ashrsi3_3):
373         shar    r0
374 LOCAL(ashrsi3_2):
375         shar    r0
376 LOCAL(ashrsi3_1):
377         rts
378         shar    r0
379
380 LOCAL(ashrsi3_0):
381         rts
382         nop
383
384         ENDFUNC(GLOBAL(ashrsi3))
385 #endif
386
387 #ifdef L_ashiftlt
388
389 !
390 ! GLOBAL(ashlsi3)
391 !
392 ! Entry:
393 !
394 ! r4: Value to shift
395 ! r5: Shifts
396 !
397 ! Exit:
398 !
399 ! r0: Result
400 !
401 ! Destroys:
402 !
403 ! (none)
404 !
405         .global GLOBAL(ashlsi3)
406         HIDDEN_FUNC(GLOBAL(ashlsi3))
407         .align  2
408 GLOBAL(ashlsi3):
409         mov     #31,r0
410         and     r0,r5
411         mova    LOCAL(ashlsi3_table),r0
412         mov.b   @(r0,r5),r5
413 #ifdef __sh1__
414         add     r5,r0
415         jmp     @r0
416 #else
417         braf    r5
418 #endif
419         mov     r4,r0
420
421         .align  2
422 LOCAL(ashlsi3_table):
423         .byte           LOCAL(ashlsi3_0)-LOCAL(ashlsi3_table)
424         .byte           LOCAL(ashlsi3_1)-LOCAL(ashlsi3_table)
425         .byte           LOCAL(ashlsi3_2)-LOCAL(ashlsi3_table)
426         .byte           LOCAL(ashlsi3_3)-LOCAL(ashlsi3_table)
427         .byte           LOCAL(ashlsi3_4)-LOCAL(ashlsi3_table)
428         .byte           LOCAL(ashlsi3_5)-LOCAL(ashlsi3_table)
429         .byte           LOCAL(ashlsi3_6)-LOCAL(ashlsi3_table)
430         .byte           LOCAL(ashlsi3_7)-LOCAL(ashlsi3_table)
431         .byte           LOCAL(ashlsi3_8)-LOCAL(ashlsi3_table)
432         .byte           LOCAL(ashlsi3_9)-LOCAL(ashlsi3_table)
433         .byte           LOCAL(ashlsi3_10)-LOCAL(ashlsi3_table)
434         .byte           LOCAL(ashlsi3_11)-LOCAL(ashlsi3_table)
435         .byte           LOCAL(ashlsi3_12)-LOCAL(ashlsi3_table)
436         .byte           LOCAL(ashlsi3_13)-LOCAL(ashlsi3_table)
437         .byte           LOCAL(ashlsi3_14)-LOCAL(ashlsi3_table)
438         .byte           LOCAL(ashlsi3_15)-LOCAL(ashlsi3_table)
439         .byte           LOCAL(ashlsi3_16)-LOCAL(ashlsi3_table)
440         .byte           LOCAL(ashlsi3_17)-LOCAL(ashlsi3_table)
441         .byte           LOCAL(ashlsi3_18)-LOCAL(ashlsi3_table)
442         .byte           LOCAL(ashlsi3_19)-LOCAL(ashlsi3_table)
443         .byte           LOCAL(ashlsi3_20)-LOCAL(ashlsi3_table)
444         .byte           LOCAL(ashlsi3_21)-LOCAL(ashlsi3_table)
445         .byte           LOCAL(ashlsi3_22)-LOCAL(ashlsi3_table)
446         .byte           LOCAL(ashlsi3_23)-LOCAL(ashlsi3_table)
447         .byte           LOCAL(ashlsi3_24)-LOCAL(ashlsi3_table)
448         .byte           LOCAL(ashlsi3_25)-LOCAL(ashlsi3_table)
449         .byte           LOCAL(ashlsi3_26)-LOCAL(ashlsi3_table)
450         .byte           LOCAL(ashlsi3_27)-LOCAL(ashlsi3_table)
451         .byte           LOCAL(ashlsi3_28)-LOCAL(ashlsi3_table)
452         .byte           LOCAL(ashlsi3_29)-LOCAL(ashlsi3_table)
453         .byte           LOCAL(ashlsi3_30)-LOCAL(ashlsi3_table)
454         .byte           LOCAL(ashlsi3_31)-LOCAL(ashlsi3_table)
455
456 LOCAL(ashlsi3_6):
457         shll2   r0
458 LOCAL(ashlsi3_4):
459         shll2   r0
460 LOCAL(ashlsi3_2):
461         rts
462         shll2   r0
463
464 LOCAL(ashlsi3_7):
465         shll2   r0
466 LOCAL(ashlsi3_5):
467         shll2   r0
468 LOCAL(ashlsi3_3):
469         shll2   r0
470 LOCAL(ashlsi3_1):
471         rts
472         shll    r0
473
474 LOCAL(ashlsi3_14):
475         shll2   r0
476 LOCAL(ashlsi3_12):
477         shll2   r0
478 LOCAL(ashlsi3_10):
479         shll2   r0
480 LOCAL(ashlsi3_8):
481         rts
482         shll8   r0
483
484 LOCAL(ashlsi3_15):
485         shll2   r0
486 LOCAL(ashlsi3_13):
487         shll2   r0
488 LOCAL(ashlsi3_11):
489         shll2   r0
490 LOCAL(ashlsi3_9):
491         shll8   r0
492         rts
493         shll    r0
494
495 LOCAL(ashlsi3_22):
496         shll2   r0
497 LOCAL(ashlsi3_20):
498         shll2   r0
499 LOCAL(ashlsi3_18):
500         shll2   r0
501 LOCAL(ashlsi3_16):
502         rts
503         shll16  r0
504
505 LOCAL(ashlsi3_23):
506         shll2   r0
507 LOCAL(ashlsi3_21):
508         shll2   r0
509 LOCAL(ashlsi3_19):
510         shll2   r0
511 LOCAL(ashlsi3_17):
512         shll16  r0
513         rts
514         shll    r0
515
516 LOCAL(ashlsi3_30):
517         shll2   r0
518 LOCAL(ashlsi3_28):
519         shll2   r0
520 LOCAL(ashlsi3_26):
521         shll2   r0
522 LOCAL(ashlsi3_24):
523         shll16  r0
524         rts
525         shll8   r0
526
527 LOCAL(ashlsi3_31):
528         shll2   r0
529 LOCAL(ashlsi3_29):
530         shll2   r0
531 LOCAL(ashlsi3_27):
532         shll2   r0
533 LOCAL(ashlsi3_25):
534         shll16  r0
535         shll8   r0
536         rts
537         shll    r0
538
539 LOCAL(ashlsi3_0):
540         rts
541         nop
542
543         ENDFUNC(GLOBAL(ashlsi3))
544 #endif
545
546 #ifdef L_lshiftrt
547
548 !
549 ! GLOBAL(lshrsi3)
550 !
551 ! Entry:
552 !
553 ! r4: Value to shift
554 ! r5: Shifts
555 !
556 ! Exit:
557 !
558 ! r0: Result
559 !
560 ! Destroys:
561 !
562 ! (none)
563 !
564         .global GLOBAL(lshrsi3)
565         HIDDEN_FUNC(GLOBAL(lshrsi3))
566         .align  2
567 GLOBAL(lshrsi3):
568         mov     #31,r0
569         and     r0,r5
570         mova    LOCAL(lshrsi3_table),r0
571         mov.b   @(r0,r5),r5
572 #ifdef __sh1__
573         add     r5,r0
574         jmp     @r0
575 #else
576         braf    r5
577 #endif
578         mov     r4,r0
579
580         .align  2
581 LOCAL(lshrsi3_table):
582         .byte           LOCAL(lshrsi3_0)-LOCAL(lshrsi3_table)
583         .byte           LOCAL(lshrsi3_1)-LOCAL(lshrsi3_table)
584         .byte           LOCAL(lshrsi3_2)-LOCAL(lshrsi3_table)
585         .byte           LOCAL(lshrsi3_3)-LOCAL(lshrsi3_table)
586         .byte           LOCAL(lshrsi3_4)-LOCAL(lshrsi3_table)
587         .byte           LOCAL(lshrsi3_5)-LOCAL(lshrsi3_table)
588         .byte           LOCAL(lshrsi3_6)-LOCAL(lshrsi3_table)
589         .byte           LOCAL(lshrsi3_7)-LOCAL(lshrsi3_table)
590         .byte           LOCAL(lshrsi3_8)-LOCAL(lshrsi3_table)
591         .byte           LOCAL(lshrsi3_9)-LOCAL(lshrsi3_table)
592         .byte           LOCAL(lshrsi3_10)-LOCAL(lshrsi3_table)
593         .byte           LOCAL(lshrsi3_11)-LOCAL(lshrsi3_table)
594         .byte           LOCAL(lshrsi3_12)-LOCAL(lshrsi3_table)
595         .byte           LOCAL(lshrsi3_13)-LOCAL(lshrsi3_table)
596         .byte           LOCAL(lshrsi3_14)-LOCAL(lshrsi3_table)
597         .byte           LOCAL(lshrsi3_15)-LOCAL(lshrsi3_table)
598         .byte           LOCAL(lshrsi3_16)-LOCAL(lshrsi3_table)
599         .byte           LOCAL(lshrsi3_17)-LOCAL(lshrsi3_table)
600         .byte           LOCAL(lshrsi3_18)-LOCAL(lshrsi3_table)
601         .byte           LOCAL(lshrsi3_19)-LOCAL(lshrsi3_table)
602         .byte           LOCAL(lshrsi3_20)-LOCAL(lshrsi3_table)
603         .byte           LOCAL(lshrsi3_21)-LOCAL(lshrsi3_table)
604         .byte           LOCAL(lshrsi3_22)-LOCAL(lshrsi3_table)
605         .byte           LOCAL(lshrsi3_23)-LOCAL(lshrsi3_table)
606         .byte           LOCAL(lshrsi3_24)-LOCAL(lshrsi3_table)
607         .byte           LOCAL(lshrsi3_25)-LOCAL(lshrsi3_table)
608         .byte           LOCAL(lshrsi3_26)-LOCAL(lshrsi3_table)
609         .byte           LOCAL(lshrsi3_27)-LOCAL(lshrsi3_table)
610         .byte           LOCAL(lshrsi3_28)-LOCAL(lshrsi3_table)
611         .byte           LOCAL(lshrsi3_29)-LOCAL(lshrsi3_table)
612         .byte           LOCAL(lshrsi3_30)-LOCAL(lshrsi3_table)
613         .byte           LOCAL(lshrsi3_31)-LOCAL(lshrsi3_table)
614
615 LOCAL(lshrsi3_6):
616         shlr2   r0
617 LOCAL(lshrsi3_4):
618         shlr2   r0
619 LOCAL(lshrsi3_2):
620         rts
621         shlr2   r0
622
623 LOCAL(lshrsi3_7):
624         shlr2   r0
625 LOCAL(lshrsi3_5):
626         shlr2   r0
627 LOCAL(lshrsi3_3):
628         shlr2   r0
629 LOCAL(lshrsi3_1):
630         rts
631         shlr    r0
632
633 LOCAL(lshrsi3_14):
634         shlr2   r0
635 LOCAL(lshrsi3_12):
636         shlr2   r0
637 LOCAL(lshrsi3_10):
638         shlr2   r0
639 LOCAL(lshrsi3_8):
640         rts
641         shlr8   r0
642
643 LOCAL(lshrsi3_15):
644         shlr2   r0
645 LOCAL(lshrsi3_13):
646         shlr2   r0
647 LOCAL(lshrsi3_11):
648         shlr2   r0
649 LOCAL(lshrsi3_9):
650         shlr8   r0
651         rts
652         shlr    r0
653
654 LOCAL(lshrsi3_22):
655         shlr2   r0
656 LOCAL(lshrsi3_20):
657         shlr2   r0
658 LOCAL(lshrsi3_18):
659         shlr2   r0
660 LOCAL(lshrsi3_16):
661         rts
662         shlr16  r0
663
664 LOCAL(lshrsi3_23):
665         shlr2   r0
666 LOCAL(lshrsi3_21):
667         shlr2   r0
668 LOCAL(lshrsi3_19):
669         shlr2   r0
670 LOCAL(lshrsi3_17):
671         shlr16  r0
672         rts
673         shlr    r0
674
675 LOCAL(lshrsi3_30):
676         shlr2   r0
677 LOCAL(lshrsi3_28):
678         shlr2   r0
679 LOCAL(lshrsi3_26):
680         shlr2   r0
681 LOCAL(lshrsi3_24):
682         shlr16  r0
683         rts
684         shlr8   r0
685
686 LOCAL(lshrsi3_31):
687         shlr2   r0
688 LOCAL(lshrsi3_29):
689         shlr2   r0
690 LOCAL(lshrsi3_27):
691         shlr2   r0
692 LOCAL(lshrsi3_25):
693         shlr16  r0
694         shlr8   r0
695         rts
696         shlr    r0
697
698 LOCAL(lshrsi3_0):
699         rts
700         nop
701
702         ENDFUNC(GLOBAL(lshrsi3))
703 #endif
704
705 #ifdef L_movmem
706         .text
707         .balign 4
708         .global GLOBAL(movmem)
709         HIDDEN_FUNC(GLOBAL(movmem))
710         HIDDEN_ALIAS(movstr,movmem)
711         /* This would be a lot simpler if r6 contained the byte count
712            minus 64, and we wouldn't be called here for a byte count of 64.  */
713 GLOBAL(movmem):
714         sts.l   pr,@-r15
715         shll2   r6
716         bsr     GLOBAL(movmemSI52+2)
717         mov.l   @(48,r5),r0
718         .balign 4
719 LOCAL(movmem_loop): /* Reached with rts */
720         mov.l   @(60,r5),r0
721         add     #-64,r6
722         mov.l   r0,@(60,r4)
723         tst     r6,r6
724         mov.l   @(56,r5),r0
725         bt      LOCAL(movmem_done)
726         mov.l   r0,@(56,r4)
727         cmp/pl  r6
728         mov.l   @(52,r5),r0
729         add     #64,r5
730         mov.l   r0,@(52,r4)
731         add     #64,r4
732         bt      GLOBAL(movmemSI52)
733 ! done all the large groups, do the remainder
734 ! jump to movmem+
735         mova    GLOBAL(movmemSI4)+4,r0
736         add     r6,r0
737         jmp     @r0
738 LOCAL(movmem_done): ! share slot insn, works out aligned.
739         lds.l   @r15+,pr
740         mov.l   r0,@(56,r4)
741         mov.l   @(52,r5),r0
742         rts
743         mov.l   r0,@(52,r4)
744         .balign 4
745 ! ??? We need aliases movstr* for movmem* for the older libraries.  These
746 ! aliases will be removed at the some point in the future.
747         .global GLOBAL(movmemSI64)
748         HIDDEN_FUNC(GLOBAL(movmemSI64))
749         HIDDEN_ALIAS(movstrSI64,movmemSI64)
750 GLOBAL(movmemSI64):
751         mov.l   @(60,r5),r0
752         mov.l   r0,@(60,r4)
753         .global GLOBAL(movmemSI60)
754         HIDDEN_FUNC(GLOBAL(movmemSI60))
755         HIDDEN_ALIAS(movstrSI60,movmemSI60)
756 GLOBAL(movmemSI60):
757         mov.l   @(56,r5),r0
758         mov.l   r0,@(56,r4)
759         .global GLOBAL(movmemSI56)
760         HIDDEN_FUNC(GLOBAL(movmemSI56))
761         HIDDEN_ALIAS(movstrSI56,movmemSI56)
762 GLOBAL(movmemSI56):
763         mov.l   @(52,r5),r0
764         mov.l   r0,@(52,r4)
765         .global GLOBAL(movmemSI52)
766         HIDDEN_FUNC(GLOBAL(movmemSI52))
767         HIDDEN_ALIAS(movstrSI52,movmemSI52)
768 GLOBAL(movmemSI52):
769         mov.l   @(48,r5),r0
770         mov.l   r0,@(48,r4)
771         .global GLOBAL(movmemSI48)
772         HIDDEN_FUNC(GLOBAL(movmemSI48))
773         HIDDEN_ALIAS(movstrSI48,movmemSI48)
774 GLOBAL(movmemSI48):
775         mov.l   @(44,r5),r0
776         mov.l   r0,@(44,r4)
777         .global GLOBAL(movmemSI44)
778         HIDDEN_FUNC(GLOBAL(movmemSI44))
779         HIDDEN_ALIAS(movstrSI44,movmemSI44)
780 GLOBAL(movmemSI44):
781         mov.l   @(40,r5),r0
782         mov.l   r0,@(40,r4)
783         .global GLOBAL(movmemSI40)
784         HIDDEN_FUNC(GLOBAL(movmemSI40))
785         HIDDEN_ALIAS(movstrSI40,movmemSI40)
786 GLOBAL(movmemSI40):
787         mov.l   @(36,r5),r0
788         mov.l   r0,@(36,r4)
789         .global GLOBAL(movmemSI36)
790         HIDDEN_FUNC(GLOBAL(movmemSI36))
791         HIDDEN_ALIAS(movstrSI36,movmemSI36)
792 GLOBAL(movmemSI36):
793         mov.l   @(32,r5),r0
794         mov.l   r0,@(32,r4)
795         .global GLOBAL(movmemSI32)
796         HIDDEN_FUNC(GLOBAL(movmemSI32))
797         HIDDEN_ALIAS(movstrSI32,movmemSI32)
798 GLOBAL(movmemSI32):
799         mov.l   @(28,r5),r0
800         mov.l   r0,@(28,r4)
801         .global GLOBAL(movmemSI28)
802         HIDDEN_FUNC(GLOBAL(movmemSI28))
803         HIDDEN_ALIAS(movstrSI28,movmemSI28)
804 GLOBAL(movmemSI28):
805         mov.l   @(24,r5),r0
806         mov.l   r0,@(24,r4)
807         .global GLOBAL(movmemSI24)
808         HIDDEN_FUNC(GLOBAL(movmemSI24))
809         HIDDEN_ALIAS(movstrSI24,movmemSI24)
810 GLOBAL(movmemSI24):
811         mov.l   @(20,r5),r0
812         mov.l   r0,@(20,r4)
813         .global GLOBAL(movmemSI20)
814         HIDDEN_FUNC(GLOBAL(movmemSI20))
815         HIDDEN_ALIAS(movstrSI20,movmemSI20)
816 GLOBAL(movmemSI20):
817         mov.l   @(16,r5),r0
818         mov.l   r0,@(16,r4)
819         .global GLOBAL(movmemSI16)
820         HIDDEN_FUNC(GLOBAL(movmemSI16))
821         HIDDEN_ALIAS(movstrSI16,movmemSI16)
822 GLOBAL(movmemSI16):
823         mov.l   @(12,r5),r0
824         mov.l   r0,@(12,r4)
825         .global GLOBAL(movmemSI12)
826         HIDDEN_FUNC(GLOBAL(movmemSI12))
827         HIDDEN_ALIAS(movstrSI12,movmemSI12)
828 GLOBAL(movmemSI12):
829         mov.l   @(8,r5),r0
830         mov.l   r0,@(8,r4)
831         .global GLOBAL(movmemSI8)
832         HIDDEN_FUNC(GLOBAL(movmemSI8))
833         HIDDEN_ALIAS(movstrSI8,movmemSI8)
834 GLOBAL(movmemSI8):
835         mov.l   @(4,r5),r0
836         mov.l   r0,@(4,r4)
837         .global GLOBAL(movmemSI4)
838         HIDDEN_FUNC(GLOBAL(movmemSI4))
839         HIDDEN_ALIAS(movstrSI4,movmemSI4)
840 GLOBAL(movmemSI4):
841         mov.l   @(0,r5),r0
842         rts
843         mov.l   r0,@(0,r4)
844
845         ENDFUNC(GLOBAL(movmemSI64))
846         ENDFUNC(GLOBAL(movmemSI60))
847         ENDFUNC(GLOBAL(movmemSI56))
848         ENDFUNC(GLOBAL(movmemSI52))
849         ENDFUNC(GLOBAL(movmemSI48))
850         ENDFUNC(GLOBAL(movmemSI44))
851         ENDFUNC(GLOBAL(movmemSI40))
852         ENDFUNC(GLOBAL(movmemSI36))
853         ENDFUNC(GLOBAL(movmemSI32))
854         ENDFUNC(GLOBAL(movmemSI28))
855         ENDFUNC(GLOBAL(movmemSI24))
856         ENDFUNC(GLOBAL(movmemSI20))
857         ENDFUNC(GLOBAL(movmemSI16))
858         ENDFUNC(GLOBAL(movmemSI12))
859         ENDFUNC(GLOBAL(movmemSI8))
860         ENDFUNC(GLOBAL(movmemSI4))
861         ENDFUNC(GLOBAL(movmem))
862 #endif
863
864 #ifdef L_movmem_i4
865         .text
866         .global GLOBAL(movmem_i4_even)
867         .global GLOBAL(movmem_i4_odd)
868         .global GLOBAL(movmemSI12_i4)
869
870         HIDDEN_FUNC(GLOBAL(movmem_i4_even))
871         HIDDEN_FUNC(GLOBAL(movmem_i4_odd))
872         HIDDEN_FUNC(GLOBAL(movmemSI12_i4))
873
874         HIDDEN_ALIAS(movstr_i4_even,movmem_i4_even)
875         HIDDEN_ALIAS(movstr_i4_odd,movmem_i4_odd)
876         HIDDEN_ALIAS(movstrSI12_i4,movmemSI12_i4)
877
878         .p2align        5
879 L_movmem_2mod4_end:
880         mov.l   r0,@(16,r4)
881         rts
882         mov.l   r1,@(20,r4)
883
884         .p2align        2
885
886 GLOBAL(movmem_i4_even):
887         mov.l   @r5+,r0
888         bra     L_movmem_start_even
889         mov.l   @r5+,r1
890
891 GLOBAL(movmem_i4_odd):
892         mov.l   @r5+,r1
893         add     #-4,r4
894         mov.l   @r5+,r2
895         mov.l   @r5+,r3
896         mov.l   r1,@(4,r4)
897         mov.l   r2,@(8,r4)
898
899 L_movmem_loop:
900         mov.l   r3,@(12,r4)
901         dt      r6
902         mov.l   @r5+,r0
903         bt/s    L_movmem_2mod4_end
904         mov.l   @r5+,r1
905         add     #16,r4
906 L_movmem_start_even:
907         mov.l   @r5+,r2
908         mov.l   @r5+,r3
909         mov.l   r0,@r4
910         dt      r6
911         mov.l   r1,@(4,r4)
912         bf/s    L_movmem_loop
913         mov.l   r2,@(8,r4)
914         rts
915         mov.l   r3,@(12,r4)
916
917         ENDFUNC(GLOBAL(movmem_i4_even))
918         ENDFUNC(GLOBAL(movmem_i4_odd))
919
920         .p2align        4
921 GLOBAL(movmemSI12_i4):
922         mov.l   @r5,r0
923         mov.l   @(4,r5),r1
924         mov.l   @(8,r5),r2
925         mov.l   r0,@r4
926         mov.l   r1,@(4,r4)
927         rts
928         mov.l   r2,@(8,r4)
929
930         ENDFUNC(GLOBAL(movmemSI12_i4))
931 #endif
932
933 #ifdef L_mulsi3
934
935
936         .global GLOBAL(mulsi3)
937         HIDDEN_FUNC(GLOBAL(mulsi3))
938
939 ! r4 =       aabb
940 ! r5 =       ccdd
941 ! r0 = aabb*ccdd  via partial products
942 !
943 ! if aa == 0 and cc = 0
944 ! r0 = bb*dd
945 !
946 ! else
947 ! aa = bb*dd + (aa*dd*65536) + (cc*bb*65536)
948 !
949
950 GLOBAL(mulsi3):
951         mulu.w  r4,r5           ! multiply the lsws  macl=bb*dd
952         mov     r5,r3           ! r3 = ccdd
953         swap.w  r4,r2           ! r2 = bbaa
954         xtrct   r2,r3           ! r3 = aacc
955         tst     r3,r3           ! msws zero ?
956         bf      hiset
957         rts                     ! yes - then we have the answer
958         sts     macl,r0
959
960 hiset:  sts     macl,r0         ! r0 = bb*dd
961         mulu.w  r2,r5           ! brewing macl = aa*dd
962         sts     macl,r1
963         mulu.w  r3,r4           ! brewing macl = cc*bb
964         sts     macl,r2
965         add     r1,r2
966         shll16  r2
967         rts
968         add     r2,r0
969
970         ENDFUNC(GLOBAL(mulsi3))
971 #endif
972 #endif /* ! __SH5__ */
973 #ifdef L_sdivsi3_i4
974         .title "SH DIVIDE"
975 !! 4 byte integer Divide code for the Renesas SH
976 #ifdef __SH4__
977 !! args in r4 and r5, result in fpul, clobber dr0, dr2
978
979         .global GLOBAL(sdivsi3_i4)
980         HIDDEN_FUNC(GLOBAL(sdivsi3_i4))
981 GLOBAL(sdivsi3_i4):
982         lds r4,fpul
983         float fpul,dr0
984         lds r5,fpul
985         float fpul,dr2
986         fdiv dr2,dr0
987         rts
988         ftrc dr0,fpul
989
990         ENDFUNC(GLOBAL(sdivsi3_i4))
991 #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
992 !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2
993
994 #if ! __SH5__ || __SH5__ == 32
995 #if __SH5__
996         .mode   SHcompact
997 #endif
998         .global GLOBAL(sdivsi3_i4)
999         HIDDEN_FUNC(GLOBAL(sdivsi3_i4))
1000 GLOBAL(sdivsi3_i4):
1001         sts.l fpscr,@-r15
1002         mov #8,r2
1003         swap.w r2,r2
1004         lds r2,fpscr
1005         lds r4,fpul
1006         float fpul,dr0
1007         lds r5,fpul
1008         float fpul,dr2
1009         fdiv dr2,dr0
1010         ftrc dr0,fpul
1011         rts
1012         lds.l @r15+,fpscr
1013
1014         ENDFUNC(GLOBAL(sdivsi3_i4))
1015 #endif /* ! __SH5__ || __SH5__ == 32 */
1016 #endif /* ! __SH4__ */
1017 #endif
1018
1019 #ifdef L_sdivsi3
1020 /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with
1021    sh2e/sh3e code.  */
1022 #if (! defined(__SH4__) && ! defined (__SH4_SINGLE__)) || defined (__linux__)
1023 !!
1024 !! Steve Chamberlain
1025 !! sac@cygnus.com
1026 !!
1027 !!
1028
1029 !! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit
1030
1031         .global GLOBAL(sdivsi3)
1032 #if __SHMEDIA__
1033 #if __SH5__ == 32
1034         .section        .text..SHmedia32,"ax"
1035 #else
1036         .text
1037 #endif
1038         .align  2
1039 #if 0
1040 /* The assembly code that follows is a hand-optimized version of the C
1041    code that follows.  Note that the registers that are modified are
1042    exactly those listed as clobbered in the patterns divsi3_i1 and
1043    divsi3_i1_media.
1044         
1045 int __sdivsi3 (i, j)
1046      int i, j;
1047 {
1048   register unsigned long long r18 asm ("r18");
1049   register unsigned long long r19 asm ("r19");
1050   register unsigned long long r0 asm ("r0") = 0;
1051   register unsigned long long r1 asm ("r1") = 1;
1052   register int r2 asm ("r2") = i >> 31;
1053   register int r3 asm ("r3") = j >> 31;
1054
1055   r2 = r2 ? r2 : r1;
1056   r3 = r3 ? r3 : r1;
1057   r18 = i * r2;
1058   r19 = j * r3;
1059   r2 *= r3;
1060   
1061   r19 <<= 31;
1062   r1 <<= 31;
1063   do
1064     if (r18 >= r19)
1065       r0 |= r1, r18 -= r19;
1066   while (r19 >>= 1, r1 >>= 1);
1067
1068   return r2 * (int)r0;
1069 }
1070 */
1071 GLOBAL(sdivsi3):
1072         pt/l    LOCAL(sdivsi3_dontadd), tr2
1073         pt/l    LOCAL(sdivsi3_loop), tr1
1074         ptabs/l r18, tr0
1075         movi    0, r0
1076         movi    1, r1
1077         shari.l r4, 31, r2
1078         shari.l r5, 31, r3
1079         cmveq   r2, r1, r2
1080         cmveq   r3, r1, r3
1081         muls.l  r4, r2, r18
1082         muls.l  r5, r3, r19
1083         muls.l  r2, r3, r2
1084         shlli   r19, 31, r19
1085         shlli   r1, 31, r1
1086 LOCAL(sdivsi3_loop):
1087         bgtu    r19, r18, tr2
1088         or      r0, r1, r0
1089         sub     r18, r19, r18
1090 LOCAL(sdivsi3_dontadd):
1091         shlri   r1, 1, r1
1092         shlri   r19, 1, r19
1093         bnei    r1, 0, tr1
1094         muls.l  r0, r2, r0
1095         add.l   r0, r63, r0
1096         blink   tr0, r63
1097 #elif 0 /* ! 0 */
1098  // inputs: r4,r5
1099  // clobbered: r1,r2,r3,r18,r19,r20,r21,r25,tr0
1100  // result in r0
1101 GLOBAL(sdivsi3):
1102  // can create absolute value without extra latency,
1103  // but dependent on proper sign extension of inputs:
1104  // shari.l r5,31,r2
1105  // xor r5,r2,r20
1106  // sub r20,r2,r20 // r20 is now absolute value of r5, zero-extended.
1107  shari.l r5,31,r2
1108  ori r2,1,r2
1109  muls.l r5,r2,r20 // r20 is now absolute value of r5, zero-extended.
1110  movi 0xffffffffffffbb0c,r19 // shift count eqiv 76
1111  shari.l r4,31,r3
1112  nsb r20,r0
1113  shlld r20,r0,r25
1114  shlri r25,48,r25
1115  sub r19,r25,r1
1116  mmulfx.w r1,r1,r2
1117  mshflo.w r1,r63,r1
1118  // If r4 was to be used in-place instead of r21, could use this sequence
1119  // to compute absolute:
1120  // sub r63,r4,r19 // compute absolute value of r4
1121  // shlri r4,32,r3 // into lower 32 bit of r4, keeping
1122  // mcmv r19,r3,r4 // the sign in the upper 32 bits intact.
1123  ori r3,1,r3
1124  mmulfx.w r25,r2,r2
1125  sub r19,r0,r0
1126  muls.l r4,r3,r21
1127  msub.w r1,r2,r2
1128  addi r2,-2,r1
1129  mulu.l r21,r1,r19
1130  mmulfx.w r2,r2,r2
1131  shlli r1,15,r1
1132  shlrd r19,r0,r19
1133  mulu.l r19,r20,r3
1134  mmacnfx.wl r25,r2,r1
1135  ptabs r18,tr0
1136  sub r21,r3,r25
1137
1138  mulu.l r25,r1,r2
1139  addi r0,14,r0
1140  xor r4,r5,r18
1141  shlrd r2,r0,r2
1142  mulu.l r2,r20,r3
1143  add r19,r2,r19
1144  shari.l r18,31,r18
1145  sub r25,r3,r25
1146
1147  mulu.l r25,r1,r2
1148  sub r25,r20,r25
1149  add r19,r18,r19
1150  shlrd r2,r0,r2
1151  mulu.l r2,r20,r3
1152  addi r25,1,r25
1153  add r19,r2,r19
1154
1155  cmpgt r25,r3,r25
1156  add.l r19,r25,r0
1157  xor r0,r18,r0
1158  blink tr0,r63
1159 #else /* ! 0 && ! 0 */
1160
1161  // inputs: r4,r5
1162  // clobbered: r1,r18,r19,r20,r21,r25,tr0
1163  // result in r0
1164         HIDDEN_FUNC(GLOBAL(sdivsi3_2))
1165 #ifndef __pic__
1166         FUNC(GLOBAL(sdivsi3))
1167 GLOBAL(sdivsi3): /* this is the shcompact entry point */
1168  // The special SHmedia entry point sdivsi3_1 prevents accidental linking
1169  // with the SHcompact implementation, which clobbers tr1 / tr2.
1170  .global GLOBAL(sdivsi3_1)
1171 GLOBAL(sdivsi3_1):
1172  .global GLOBAL(div_table_internal)
1173  movi (GLOBAL(div_table_internal) >> 16) & 65535, r20
1174  shori GLOBAL(div_table_internal) & 65535, r20
1175 #endif
1176  .global GLOBAL(sdivsi3_2)
1177  // div_table in r20
1178  // clobbered: r1,r18,r19,r21,r25,tr0
1179 GLOBAL(sdivsi3_2):
1180  nsb r5, r1
1181  shlld r5, r1, r25    // normalize; [-2 ..1, 1..2) in s2.62
1182  shari r25, 58, r21   // extract 5(6) bit index (s2.4 with hole -1..1)
1183  ldx.ub r20, r21, r19 // u0.8
1184  shari r25, 32, r25   // normalize to s2.30
1185  shlli r21, 1, r21
1186  muls.l r25, r19, r19 // s2.38
1187  ldx.w r20, r21, r21  // s2.14
1188   ptabs r18, tr0
1189  shari r19, 24, r19   // truncate to s2.14
1190  sub r21, r19, r19    // some 11 bit inverse in s1.14
1191  muls.l r19, r19, r21 // u0.28
1192   sub r63, r1, r1
1193   addi r1, 92, r1
1194  muls.l r25, r21, r18 // s2.58
1195  shlli r19, 45, r19   // multiply by two and convert to s2.58
1196   /* bubble */
1197  sub r19, r18, r18
1198  shari r18, 28, r18   // some 22 bit inverse in s1.30
1199  muls.l r18, r25, r0  // s2.60
1200   muls.l r18, r4, r25 // s32.30
1201   /* bubble */
1202  shari r0, 16, r19   // s-16.44
1203  muls.l r19, r18, r19 // s-16.74
1204   shari r25, 63, r0
1205   shari r4, 14, r18   // s19.-14
1206  shari r19, 30, r19   // s-16.44
1207  muls.l r19, r18, r19 // s15.30
1208   xor r21, r0, r21    // You could also use the constant 1 << 27.
1209   add r21, r25, r21
1210  sub r21, r19, r21
1211  shard r21, r1, r21
1212  sub r21, r0, r0
1213  blink tr0, r63
1214 #ifndef __pic__
1215         ENDFUNC(GLOBAL(sdivsi3))
1216 #endif
1217         ENDFUNC(GLOBAL(sdivsi3_2))
1218 #endif
1219 #elif defined __SHMEDIA__
1220 /* m5compact-nofpu */
1221  // clobbered: r18,r19,r20,r21,r25,tr0,tr1,tr2
1222         .mode   SHmedia
1223         .section        .text..SHmedia32,"ax"
1224         .align  2
1225         FUNC(GLOBAL(sdivsi3))
1226 GLOBAL(sdivsi3):
1227         pt/l LOCAL(sdivsi3_dontsub), tr0
1228         pt/l LOCAL(sdivsi3_loop), tr1
1229         ptabs/l r18,tr2
1230         shari.l r4,31,r18
1231         shari.l r5,31,r19
1232         xor r4,r18,r20
1233         xor r5,r19,r21
1234         sub.l r20,r18,r20
1235         sub.l r21,r19,r21
1236         xor r18,r19,r19
1237         shlli r21,32,r25
1238         addi r25,-1,r21
1239         addz.l r20,r63,r20
1240 LOCAL(sdivsi3_loop):
1241         shlli r20,1,r20
1242         bgeu/u r21,r20,tr0
1243         sub r20,r21,r20
1244 LOCAL(sdivsi3_dontsub):
1245         addi.l r25,-1,r25
1246         bnei r25,-32,tr1
1247         xor r20,r19,r20
1248         sub.l r20,r19,r0
1249         blink tr2,r63
1250         ENDFUNC(GLOBAL(sdivsi3))
1251 #else /* ! __SHMEDIA__ */
1252         FUNC(GLOBAL(sdivsi3))
1253 GLOBAL(sdivsi3):
1254         mov     r4,r1
1255         mov     r5,r0
1256
1257         tst     r0,r0
1258         bt      div0
1259         mov     #0,r2
1260         div0s   r2,r1
1261         subc    r3,r3
1262         subc    r2,r1
1263         div0s   r0,r3
1264         rotcl   r1
1265         div1    r0,r3
1266         rotcl   r1
1267         div1    r0,r3
1268         rotcl   r1
1269         div1    r0,r3
1270         rotcl   r1
1271         div1    r0,r3
1272         rotcl   r1
1273         div1    r0,r3
1274         rotcl   r1
1275         div1    r0,r3
1276         rotcl   r1
1277         div1    r0,r3
1278         rotcl   r1
1279         div1    r0,r3
1280         rotcl   r1
1281         div1    r0,r3
1282         rotcl   r1
1283         div1    r0,r3
1284         rotcl   r1
1285         div1    r0,r3
1286         rotcl   r1
1287         div1    r0,r3
1288         rotcl   r1
1289         div1    r0,r3
1290         rotcl   r1
1291         div1    r0,r3
1292         rotcl   r1
1293         div1    r0,r3
1294         rotcl   r1
1295         div1    r0,r3
1296         rotcl   r1
1297         div1    r0,r3
1298         rotcl   r1
1299         div1    r0,r3
1300         rotcl   r1
1301         div1    r0,r3
1302         rotcl   r1
1303         div1    r0,r3
1304         rotcl   r1
1305         div1    r0,r3
1306         rotcl   r1
1307         div1    r0,r3
1308         rotcl   r1
1309         div1    r0,r3
1310         rotcl   r1
1311         div1    r0,r3
1312         rotcl   r1
1313         div1    r0,r3
1314         rotcl   r1
1315         div1    r0,r3
1316         rotcl   r1
1317         div1    r0,r3
1318         rotcl   r1
1319         div1    r0,r3
1320         rotcl   r1
1321         div1    r0,r3
1322         rotcl   r1
1323         div1    r0,r3
1324         rotcl   r1
1325         div1    r0,r3
1326         rotcl   r1
1327         div1    r0,r3
1328         rotcl   r1
1329         addc    r2,r1
1330         rts
1331         mov     r1,r0
1332
1333
1334 div0:   rts
1335         mov     #0,r0
1336
1337         ENDFUNC(GLOBAL(sdivsi3))
1338 #endif /* ! __SHMEDIA__ */
1339 #endif /* ! __SH4__ */
1340 #endif
1341 #ifdef L_udivsi3_i4
1342
1343         .title "SH DIVIDE"
1344 !! 4 byte integer Divide code for the Renesas SH
1345 #ifdef __SH4__
1346 !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4,
1347 !! and t bit
1348
1349         .global GLOBAL(udivsi3_i4)
1350         HIDDEN_FUNC(GLOBAL(udivsi3_i4))
1351 GLOBAL(udivsi3_i4):
1352         mov #1,r1
1353         cmp/hi r1,r5
1354         bf trivial
1355         rotr r1
1356         xor r1,r4
1357         lds r4,fpul
1358         mova L1,r0
1359 #ifdef FMOVD_WORKS
1360         fmov.d @r0+,dr4
1361 #else
1362         fmov.s @r0+,DR40
1363         fmov.s @r0,DR41
1364 #endif
1365         float fpul,dr0
1366         xor r1,r5
1367         lds r5,fpul
1368         float fpul,dr2
1369         fadd dr4,dr0
1370         fadd dr4,dr2
1371         fdiv dr2,dr0
1372         rts
1373         ftrc dr0,fpul
1374
1375 trivial:
1376         rts
1377         lds r4,fpul
1378
1379         .align 2
1380 #ifdef FMOVD_WORKS
1381         .align 3        ! make double below 8 byte aligned.
1382 #endif
1383 L1:
1384         .double 2147483648
1385
1386         ENDFUNC(GLOBAL(udivsi3_i4))
1387 #elif defined (__SH5__) && ! defined (__SH4_NOFPU__)
1388 #if ! __SH5__ || __SH5__ == 32
1389 !! args in r4 and r5, result in fpul, clobber r20, r21, dr0, fr33
1390         .mode   SHmedia
1391         .global GLOBAL(udivsi3_i4)
1392         HIDDEN_FUNC(GLOBAL(udivsi3_i4))
1393 GLOBAL(udivsi3_i4):
1394         addz.l  r4,r63,r20
1395         addz.l  r5,r63,r21
1396         fmov.qd r20,dr0
1397         fmov.qd r21,dr32
1398         ptabs   r18,tr0
1399         float.qd dr0,dr0
1400         float.qd dr32,dr32
1401         fdiv.d  dr0,dr32,dr0
1402         ftrc.dq dr0,dr32
1403         fmov.s fr33,fr32
1404         blink tr0,r63
1405
1406         ENDFUNC(GLOBAL(udivsi3_i4))
1407 #endif /* ! __SH5__ || __SH5__ == 32 */
1408 #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__)
1409 !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
1410
1411         .global GLOBAL(udivsi3_i4)
1412         HIDDEN_FUNC(GLOBAL(udivsi3_i4))
1413 GLOBAL(udivsi3_i4):
1414         mov #1,r1
1415         cmp/hi r1,r5
1416         bf trivial
1417         sts.l fpscr,@-r15
1418         mova L1,r0
1419         lds.l @r0+,fpscr
1420         rotr r1
1421         xor r1,r4
1422         lds r4,fpul
1423 #ifdef FMOVD_WORKS
1424         fmov.d @r0+,dr4
1425 #else
1426         fmov.s @r0+,DR40
1427         fmov.s @r0,DR41
1428 #endif
1429         float fpul,dr0
1430         xor r1,r5
1431         lds r5,fpul
1432         float fpul,dr2
1433         fadd dr4,dr0
1434         fadd dr4,dr2
1435         fdiv dr2,dr0
1436         ftrc dr0,fpul
1437         rts
1438         lds.l @r15+,fpscr
1439
1440 #ifdef FMOVD_WORKS
1441         .align 3        ! make double below 8 byte aligned.
1442 #endif
1443 trivial:
1444         rts
1445         lds r4,fpul
1446
1447         .align 2
1448 L1:
1449 #ifndef FMOVD_WORKS
1450         .long 0x80000
1451 #else
1452         .long 0x180000
1453 #endif
1454         .double 2147483648
1455
1456         ENDFUNC(GLOBAL(udivsi3_i4))
1457 #endif /* ! __SH4__ */
1458 #endif
1459
1460 #ifdef L_udivsi3
1461 /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with
1462    sh2e/sh3e code.  */
1463 #if (! defined(__SH4__) && ! defined (__SH4_SINGLE__)) || defined (__linux__)
1464
1465 !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit
1466         .global GLOBAL(udivsi3)
1467         HIDDEN_FUNC(GLOBAL(udivsi3))
1468
1469 #if __SHMEDIA__
1470 #if __SH5__ == 32
1471         .section        .text..SHmedia32,"ax"
1472 #else
1473         .text
1474 #endif
1475         .align  2
1476 #if 0
1477 /* The assembly code that follows is a hand-optimized version of the C
1478    code that follows.  Note that the registers that are modified are
1479    exactly those listed as clobbered in the patterns udivsi3_i1 and
1480    udivsi3_i1_media.
1481         
1482 unsigned 
1483 __udivsi3 (i, j)
1484     unsigned i, j; 
1485 {
1486   register unsigned long long r0 asm ("r0") = 0;
1487   register unsigned long long r18 asm ("r18") = 1;
1488   register unsigned long long r4 asm ("r4") = i;
1489   register unsigned long long r19 asm ("r19") = j;
1490
1491   r19 <<= 31;
1492   r18 <<= 31;
1493   do
1494     if (r4 >= r19)
1495       r0 |= r18, r4 -= r19;
1496   while (r19 >>= 1, r18 >>= 1);
1497
1498   return r0;
1499 }
1500 */
1501 GLOBAL(udivsi3):
1502         pt/l    LOCAL(udivsi3_dontadd), tr2
1503         pt/l    LOCAL(udivsi3_loop), tr1
1504         ptabs/l r18, tr0
1505         movi    0, r0
1506         movi    1, r18
1507         addz.l  r5, r63, r19
1508         addz.l  r4, r63, r4
1509         shlli   r19, 31, r19
1510         shlli   r18, 31, r18
1511 LOCAL(udivsi3_loop):
1512         bgtu    r19, r4, tr2
1513         or      r0, r18, r0
1514         sub     r4, r19, r4
1515 LOCAL(udivsi3_dontadd):
1516         shlri   r18, 1, r18
1517         shlri   r19, 1, r19
1518         bnei    r18, 0, tr1
1519         blink   tr0, r63
1520 #else
1521 GLOBAL(udivsi3):
1522  // inputs: r4,r5
1523  // clobbered: r18,r19,r20,r21,r22,r25,tr0
1524  // result in r0.
1525  addz.l r5,r63,r22
1526  nsb r22,r0
1527  shlld r22,r0,r25
1528  shlri r25,48,r25
1529  movi 0xffffffffffffbb0c,r20 // shift count eqiv 76
1530  sub r20,r25,r21
1531  mmulfx.w r21,r21,r19
1532  mshflo.w r21,r63,r21
1533  ptabs r18,tr0
1534  mmulfx.w r25,r19,r19
1535  sub r20,r0,r0
1536  /* bubble */
1537  msub.w r21,r19,r19
1538  addi r19,-2,r21 /* It would be nice for scheduling to do this add to r21
1539                     before the msub.w, but we need a different value for
1540                     r19 to keep errors under control.  */
1541  mulu.l r4,r21,r18
1542  mmulfx.w r19,r19,r19
1543  shlli r21,15,r21
1544  shlrd r18,r0,r18
1545  mulu.l r18,r22,r20
1546  mmacnfx.wl r25,r19,r21
1547  /* bubble */
1548  sub r4,r20,r25
1549
1550  mulu.l r25,r21,r19
1551  addi r0,14,r0
1552  /* bubble */
1553  shlrd r19,r0,r19
1554  mulu.l r19,r22,r20
1555  add r18,r19,r18
1556  /* bubble */
1557  sub.l r25,r20,r25
1558
1559  mulu.l r25,r21,r19
1560  addz.l r25,r63,r25
1561  sub r25,r22,r25
1562  shlrd r19,r0,r19
1563  mulu.l r19,r22,r20
1564  addi r25,1,r25
1565  add r18,r19,r18
1566
1567  cmpgt r25,r20,r25
1568  add.l r18,r25,r0
1569  blink tr0,r63
1570 #endif
1571 #elif defined (__SHMEDIA__)
1572 /* m5compact-nofpu - more emphasis on code size than on speed, but don't
1573    ignore speed altogether - div1 needs 9 cycles, subc 7 and rotcl 4.
1574    So use a short shmedia loop.  */
1575  // clobbered: r20,r21,r25,tr0,tr1,tr2
1576         .mode   SHmedia
1577         .section        .text..SHmedia32,"ax"
1578         .align  2
1579 GLOBAL(udivsi3):
1580  pt/l LOCAL(udivsi3_dontsub), tr0
1581  pt/l LOCAL(udivsi3_loop), tr1
1582  ptabs/l r18,tr2
1583  shlli r5,32,r25
1584  addi r25,-1,r21
1585  addz.l r4,r63,r20
1586 LOCAL(udivsi3_loop):
1587  shlli r20,1,r20
1588  bgeu/u r21,r20,tr0
1589  sub r20,r21,r20
1590 LOCAL(udivsi3_dontsub):
1591  addi.l r25,-1,r25
1592  bnei r25,-32,tr1
1593  add.l r20,r63,r0
1594  blink tr2,r63
1595 #else /* ! defined (__SHMEDIA__) */
1596 LOCAL(div8):
1597  div1 r5,r4
1598 LOCAL(div7):
1599  div1 r5,r4; div1 r5,r4; div1 r5,r4
1600  div1 r5,r4; div1 r5,r4; div1 r5,r4; rts; div1 r5,r4
1601
1602 LOCAL(divx4):
1603  div1 r5,r4; rotcl r0
1604  div1 r5,r4; rotcl r0
1605  div1 r5,r4; rotcl r0
1606  rts; div1 r5,r4
1607
1608 GLOBAL(udivsi3):
1609  sts.l pr,@-r15
1610  extu.w r5,r0
1611  cmp/eq r5,r0
1612 #ifdef __sh1__
1613  bf LOCAL(large_divisor)
1614 #else
1615  bf/s LOCAL(large_divisor)
1616 #endif
1617  div0u
1618  swap.w r4,r0
1619  shlr16 r4
1620  bsr LOCAL(div8)
1621  shll16 r5
1622  bsr LOCAL(div7)
1623  div1 r5,r4
1624  xtrct r4,r0
1625  xtrct r0,r4
1626  bsr LOCAL(div8)
1627  swap.w r4,r4
1628  bsr LOCAL(div7)
1629  div1 r5,r4
1630  lds.l @r15+,pr
1631  xtrct r4,r0
1632  swap.w r0,r0
1633  rotcl r0
1634  rts
1635  shlr16 r5
1636
1637 LOCAL(large_divisor):
1638 #ifdef __sh1__
1639  div0u
1640 #endif
1641  mov #0,r0
1642  xtrct r4,r0
1643  xtrct r0,r4
1644  bsr LOCAL(divx4)
1645  rotcl r0
1646  bsr LOCAL(divx4)
1647  rotcl r0
1648  bsr LOCAL(divx4)
1649  rotcl r0
1650  bsr LOCAL(divx4)
1651  rotcl r0
1652  lds.l @r15+,pr
1653  rts
1654  rotcl r0
1655
1656         ENDFUNC(GLOBAL(udivsi3))
1657 #endif /* ! __SHMEDIA__ */
1658 #endif /* __SH4__ */
1659 #endif /* L_udivsi3 */
1660
1661 #ifdef L_udivdi3
1662 #ifdef __SHMEDIA__
1663         .mode   SHmedia
1664         .section        .text..SHmedia32,"ax"
1665         .align  2
1666         .global GLOBAL(udivdi3)
1667         FUNC(GLOBAL(udivdi3))
1668 GLOBAL(udivdi3):
1669         HIDDEN_ALIAS(udivdi3_internal,udivdi3)
1670         shlri r3,1,r4
1671         nsb r4,r22
1672         shlld r3,r22,r6
1673         shlri r6,49,r5
1674         movi 0xffffffffffffbaf1,r21 /* .l shift count 17.  */
1675         sub r21,r5,r1
1676         mmulfx.w r1,r1,r4
1677         mshflo.w r1,r63,r1
1678         sub r63,r22,r20 // r63 == 64 % 64
1679         mmulfx.w r5,r4,r4
1680         pta LOCAL(large_divisor),tr0
1681         addi r20,32,r9
1682         msub.w r1,r4,r1
1683         madd.w r1,r1,r1
1684         mmulfx.w r1,r1,r4
1685         shlri r6,32,r7
1686         bgt/u r9,r63,tr0 // large_divisor
1687         mmulfx.w r5,r4,r4
1688         shlri r2,32+14,r19
1689         addi r22,-31,r0
1690         msub.w r1,r4,r1
1691
1692         mulu.l r1,r7,r4
1693         addi r1,-3,r5
1694         mulu.l r5,r19,r5
1695         sub r63,r4,r4 // Negate to make sure r1 ends up <= 1/r2
1696         shlri r4,2,r4 /* chop off leading %0000000000000000 001.00000000000 - or, as
1697                          the case may be, %0000000000000000 000.11111111111, still */
1698         muls.l r1,r4,r4 /* leaving at least one sign bit.  */
1699         mulu.l r5,r3,r8
1700         mshalds.l r1,r21,r1
1701         shari r4,26,r4
1702         shlld r8,r0,r8
1703         add r1,r4,r1 // 31 bit unsigned reciprocal now in r1 (msb equiv. 0.5)
1704         sub r2,r8,r2
1705         /* Can do second step of 64 : 32 div now, using r1 and the rest in r2.  */
1706
1707         shlri r2,22,r21
1708         mulu.l r21,r1,r21
1709         shlld r5,r0,r8
1710         addi r20,30-22,r0
1711         shlrd r21,r0,r21
1712         mulu.l r21,r3,r5
1713         add r8,r21,r8
1714         mcmpgt.l r21,r63,r21 // See Note 1
1715         addi r20,30,r0
1716         mshfhi.l r63,r21,r21
1717         sub r2,r5,r2
1718         andc r2,r21,r2
1719
1720         /* small divisor: need a third divide step */
1721         mulu.l r2,r1,r7
1722         ptabs r18,tr0
1723         addi r2,1,r2
1724         shlrd r7,r0,r7
1725         mulu.l r7,r3,r5
1726         add r8,r7,r8
1727         sub r2,r3,r2
1728         cmpgt r2,r5,r5
1729         add r8,r5,r2
1730         /* could test r3 here to check for divide by zero.  */
1731         blink tr0,r63
1732
1733 LOCAL(large_divisor):
1734         mmulfx.w r5,r4,r4
1735         shlrd r2,r9,r25
1736         shlri r25,32,r8
1737         msub.w r1,r4,r1
1738
1739         mulu.l r1,r7,r4
1740         addi r1,-3,r5
1741         mulu.l r5,r8,r5
1742         sub r63,r4,r4 // Negate to make sure r1 ends up <= 1/r2
1743         shlri r4,2,r4 /* chop off leading %0000000000000000 001.00000000000 - or, as
1744                          the case may be, %0000000000000000 000.11111111111, still */
1745         muls.l r1,r4,r4 /* leaving at least one sign bit.  */
1746         shlri r5,14-1,r8
1747         mulu.l r8,r7,r5
1748         mshalds.l r1,r21,r1
1749         shari r4,26,r4
1750         add r1,r4,r1 // 31 bit unsigned reciprocal now in r1 (msb equiv. 0.5)
1751         sub r25,r5,r25
1752         /* Can do second step of 64 : 32 div now, using r1 and the rest in r25.  */
1753
1754         shlri r25,22,r21
1755         mulu.l r21,r1,r21
1756         pta LOCAL(no_lo_adj),tr0
1757         addi r22,32,r0
1758         shlri r21,40,r21
1759         mulu.l r21,r7,r5
1760         add r8,r21,r8
1761         shlld r2,r0,r2
1762         sub r25,r5,r25
1763         bgtu/u r7,r25,tr0 // no_lo_adj
1764         addi r8,1,r8
1765         sub r25,r7,r25
1766 LOCAL(no_lo_adj):
1767         mextr4 r2,r25,r2
1768
1769         /* large_divisor: only needs a few adjustments.  */
1770         mulu.l r8,r6,r5
1771         ptabs r18,tr0
1772         /* bubble */
1773         cmpgtu r5,r2,r5
1774         sub r8,r5,r2
1775         blink tr0,r63
1776         ENDFUNC(GLOBAL(udivdi3))
1777 /* Note 1: To shift the result of the second divide stage so that the result
1778    always fits into 32 bits, yet we still reduce the rest sufficiently
1779    would require a lot of instructions to do the shifts just right.  Using
1780    the full 64 bit shift result to multiply with the divisor would require
1781    four extra instructions for the upper 32 bits (shift / mulu / shift / sub).
1782    Fortunately, if the upper 32 bits of the shift result are nonzero, we
1783    know that the rest after taking this partial result into account will
1784    fit into 32 bits.  So we just clear the upper 32 bits of the rest if the
1785    upper 32 bits of the partial result are nonzero.  */
1786 #endif /* __SHMEDIA__ */
1787 #endif /* L_udivdi3 */
1788
1789 #ifdef L_divdi3
1790 #ifdef __SHMEDIA__
1791         .mode   SHmedia
1792         .section        .text..SHmedia32,"ax"
1793         .align  2
1794         .global GLOBAL(divdi3)
1795         FUNC(GLOBAL(divdi3))
1796 GLOBAL(divdi3):
1797         pta GLOBAL(udivdi3_internal),tr0
1798         shari r2,63,r22
1799         shari r3,63,r23
1800         xor r2,r22,r2
1801         xor r3,r23,r3
1802         sub r2,r22,r2
1803         sub r3,r23,r3
1804         beq/u r22,r23,tr0
1805         ptabs r18,tr1
1806         blink tr0,r18
1807         sub r63,r2,r2
1808         blink tr1,r63
1809         ENDFUNC(GLOBAL(divdi3))
1810 #endif /* __SHMEDIA__ */
1811 #endif /* L_divdi3 */
1812
1813 #ifdef L_umoddi3
1814 #ifdef __SHMEDIA__
1815         .mode   SHmedia
1816         .section        .text..SHmedia32,"ax"
1817         .align  2
1818         .global GLOBAL(umoddi3)
1819         FUNC(GLOBAL(umoddi3))
1820 GLOBAL(umoddi3):
1821         HIDDEN_ALIAS(umoddi3_internal,umoddi3)
1822         shlri r3,1,r4
1823         nsb r4,r22
1824         shlld r3,r22,r6
1825         shlri r6,49,r5
1826         movi 0xffffffffffffbaf1,r21 /* .l shift count 17.  */
1827         sub r21,r5,r1
1828         mmulfx.w r1,r1,r4
1829         mshflo.w r1,r63,r1
1830         sub r63,r22,r20 // r63 == 64 % 64
1831         mmulfx.w r5,r4,r4
1832         pta LOCAL(large_divisor),tr0
1833         addi r20,32,r9
1834         msub.w r1,r4,r1
1835         madd.w r1,r1,r1
1836         mmulfx.w r1,r1,r4
1837         shlri r6,32,r7
1838         bgt/u r9,r63,tr0 // large_divisor
1839         mmulfx.w r5,r4,r4
1840         shlri r2,32+14,r19
1841         addi r22,-31,r0
1842         msub.w r1,r4,r1
1843
1844         mulu.l r1,r7,r4
1845         addi r1,-3,r5
1846         mulu.l r5,r19,r5
1847         sub r63,r4,r4 // Negate to make sure r1 ends up <= 1/r2
1848         shlri r4,2,r4 /* chop off leading %0000000000000000 001.00000000000 - or, as
1849                          the case may be, %0000000000000000 000.11111111111, still */
1850         muls.l r1,r4,r4 /* leaving at least one sign bit.  */
1851         mulu.l r5,r3,r5
1852         mshalds.l r1,r21,r1
1853         shari r4,26,r4
1854         shlld r5,r0,r5
1855         add r1,r4,r1 // 31 bit unsigned reciprocal now in r1 (msb equiv. 0.5)
1856         sub r2,r5,r2
1857         /* Can do second step of 64 : 32 div now, using r1 and the rest in r2.  */
1858
1859         shlri r2,22,r21
1860         mulu.l r21,r1,r21
1861         addi r20,30-22,r0
1862         /* bubble */ /* could test r3 here to check for divide by zero.  */
1863         shlrd r21,r0,r21
1864         mulu.l r21,r3,r5
1865         mcmpgt.l r21,r63,r21 // See Note 1
1866         addi r20,30,r0
1867         mshfhi.l r63,r21,r21
1868         sub r2,r5,r2
1869         andc r2,r21,r2
1870
1871         /* small divisor: need a third divide step */
1872         mulu.l r2,r1,r7
1873         ptabs r18,tr0
1874         sub r2,r3,r8 /* re-use r8 here for rest - r3 */
1875         shlrd r7,r0,r7
1876         mulu.l r7,r3,r5
1877         /* bubble */
1878         addi r8,1,r7
1879         cmpgt r7,r5,r7
1880         cmvne r7,r8,r2
1881         sub r2,r5,r2
1882         blink tr0,r63
1883
1884 LOCAL(large_divisor):
1885         mmulfx.w r5,r4,r4
1886         shlrd r2,r9,r25
1887         shlri r25,32,r8
1888         msub.w r1,r4,r1
1889
1890         mulu.l r1,r7,r4
1891         addi r1,-3,r5
1892         mulu.l r5,r8,r5
1893         sub r63,r4,r4 // Negate to make sure r1 ends up <= 1/r2
1894         shlri r4,2,r4 /* chop off leading %0000000000000000 001.00000000000 - or, as
1895                          the case may be, %0000000000000000 000.11111111111, still */
1896         muls.l r1,r4,r4 /* leaving at least one sign bit.  */
1897         shlri r5,14-1,r8
1898         mulu.l r8,r7,r5
1899         mshalds.l r1,r21,r1
1900         shari r4,26,r4
1901         add r1,r4,r1 // 31 bit unsigned reciprocal now in r1 (msb equiv. 0.5)
1902         sub r25,r5,r25
1903         /* Can do second step of 64 : 32 div now, using r1 and the rest in r25.  */
1904
1905         shlri r25,22,r21
1906         mulu.l r21,r1,r21
1907         pta LOCAL(no_lo_adj),tr0
1908         addi r22,32,r0
1909         shlri r21,40,r21
1910         mulu.l r21,r7,r5
1911         add r8,r21,r8
1912         shlld r2,r0,r2
1913         sub r25,r5,r25
1914         bgtu/u r7,r25,tr0 // no_lo_adj
1915         addi r8,1,r8
1916         sub r25,r7,r25
1917 LOCAL(no_lo_adj):
1918         mextr4 r2,r25,r2
1919
1920         /* large_divisor: only needs a few adjustments.  */
1921         mulu.l r8,r6,r5
1922         ptabs r18,tr0
1923         add r2,r6,r7
1924         cmpgtu r5,r2,r8
1925         cmvne r8,r7,r2
1926         sub r2,r5,r2
1927         shlrd r2,r22,r2
1928         blink tr0,r63
1929         ENDFUNC(GLOBAL(umoddi3))
1930 /* Note 1: To shift the result of the second divide stage so that the result
1931    always fits into 32 bits, yet we still reduce the rest sufficiently
1932    would require a lot of instructions to do the shifts just right.  Using
1933    the full 64 bit shift result to multiply with the divisor would require
1934    four extra instructions for the upper 32 bits (shift / mulu / shift / sub).
1935    Fortunately, if the upper 32 bits of the shift result are nonzero, we
1936    know that the rest after taking this partial result into account will
1937    fit into 32 bits.  So we just clear the upper 32 bits of the rest if the
1938    upper 32 bits of the partial result are nonzero.  */
1939 #endif /* __SHMEDIA__ */
1940 #endif /* L_umoddi3 */
1941
1942 #ifdef L_moddi3
1943 #ifdef __SHMEDIA__
1944         .mode   SHmedia
1945         .section        .text..SHmedia32,"ax"
1946         .align  2
1947         .global GLOBAL(moddi3)
1948         FUNC(GLOBAL(moddi3))
1949 GLOBAL(moddi3):
1950         pta GLOBAL(umoddi3_internal),tr0
1951         shari r2,63,r22
1952         shari r3,63,r23
1953         xor r2,r22,r2
1954         xor r3,r23,r3
1955         sub r2,r22,r2
1956         sub r3,r23,r3
1957         beq/u r22,r63,tr0
1958         ptabs r18,tr1
1959         blink tr0,r18
1960         sub r63,r2,r2
1961         blink tr1,r63
1962         ENDFUNC(GLOBAL(moddi3))
1963 #endif /* __SHMEDIA__ */
1964 #endif /* L_moddi3 */
1965
1966 #ifdef L_set_fpscr
1967 #if !defined (__SH2A_NOFPU__)
1968 #if defined (__SH2E__) || defined (__SH2A__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || __SH5__ == 32
1969 #ifdef __SH5__
1970         .mode   SHcompact
1971 #endif
1972         .global GLOBAL(set_fpscr)
1973         HIDDEN_FUNC(GLOBAL(set_fpscr))
1974 GLOBAL(set_fpscr):
1975         lds r4,fpscr
1976 #ifdef __PIC__
1977         mov.l   r12,@-r15
1978 #ifdef __vxworks
1979         mov.l   LOCAL(set_fpscr_L0_base),r12
1980         mov.l   LOCAL(set_fpscr_L0_index),r0
1981         mov.l   @r12,r12
1982         mov.l   @(r0,r12),r12
1983 #else
1984         mova    LOCAL(set_fpscr_L0),r0
1985         mov.l   LOCAL(set_fpscr_L0),r12
1986         add     r0,r12
1987 #endif
1988         mov.l   LOCAL(set_fpscr_L1),r0
1989         mov.l   @(r0,r12),r1
1990         mov.l   @r15+,r12
1991 #else
1992         mov.l LOCAL(set_fpscr_L1),r1
1993 #endif
1994         swap.w r4,r0
1995         or #24,r0
1996 #ifndef FMOVD_WORKS
1997         xor #16,r0
1998 #endif
1999 #if defined(__SH4__) || defined (__SH2A_DOUBLE__)
2000         swap.w r0,r3
2001         mov.l r3,@(4,r1)
2002 #else /* defined (__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE*__) */
2003         swap.w r0,r2
2004         mov.l r2,@r1
2005 #endif
2006 #ifndef FMOVD_WORKS
2007         xor #8,r0
2008 #else
2009         xor #24,r0
2010 #endif
2011 #if defined(__SH4__) || defined (__SH2A_DOUBLE__)
2012         swap.w r0,r2
2013         rts
2014         mov.l r2,@r1
2015 #else /* defined(__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE*__) */
2016         swap.w r0,r3
2017         rts
2018         mov.l r3,@(4,r1)
2019 #endif
2020         .align 2
2021 #ifdef __PIC__
2022 #ifdef __vxworks
2023 LOCAL(set_fpscr_L0_base):
2024         .long ___GOTT_BASE__
2025 LOCAL(set_fpscr_L0_index):
2026         .long ___GOTT_INDEX__
2027 #else
2028 LOCAL(set_fpscr_L0):
2029         .long _GLOBAL_OFFSET_TABLE_
2030 #endif
2031 LOCAL(set_fpscr_L1):
2032         .long GLOBAL(fpscr_values@GOT)
2033 #else
2034 LOCAL(set_fpscr_L1):
2035         .long GLOBAL(fpscr_values)
2036 #endif
2037
2038         ENDFUNC(GLOBAL(set_fpscr))
2039 #ifndef NO_FPSCR_VALUES
2040 #ifdef __ELF__
2041         .comm   GLOBAL(fpscr_values),8,4
2042 #else
2043         .comm   GLOBAL(fpscr_values),8
2044 #endif /* ELF */
2045 #endif /* NO_FPSCR_VALUES */
2046 #endif /* SH2E / SH3E / SH4 */
2047 #endif /* __SH2A_NOFPU__ */
2048 #endif /* L_set_fpscr */
2049 #ifdef L_ic_invalidate
2050 #if __SH5__ == 32
2051         .mode   SHmedia
2052         .section        .text..SHmedia32,"ax"
2053         .align  2
2054         .global GLOBAL(init_trampoline)
2055         HIDDEN_FUNC(GLOBAL(init_trampoline))
2056 GLOBAL(init_trampoline):
2057         st.l    r0,8,r2
2058 #ifdef __LITTLE_ENDIAN__
2059         movi    9,r20
2060         shori   0x402b,r20
2061         shori   0xd101,r20
2062         shori   0xd002,r20
2063 #else
2064         movi    0xffffffffffffd002,r20
2065         shori   0xd101,r20
2066         shori   0x402b,r20
2067         shori   9,r20
2068 #endif
2069         st.q    r0,0,r20
2070         st.l    r0,12,r3
2071         ENDFUNC(GLOBAL(init_trampoline))
2072         .global GLOBAL(ic_invalidate)
2073         HIDDEN_FUNC(GLOBAL(ic_invalidate))
2074 GLOBAL(ic_invalidate):
2075         ocbwb   r0,0
2076         synco
2077         icbi    r0, 0
2078         ptabs   r18, tr0
2079         synci
2080         blink   tr0, r63
2081         ENDFUNC(GLOBAL(ic_invalidate))
2082 #elif defined(__SH4A__)
2083         .global GLOBAL(ic_invalidate)
2084         HIDDEN_FUNC(GLOBAL(ic_invalidate))
2085 GLOBAL(ic_invalidate):
2086         ocbwb   @r4
2087         synco
2088         icbi    @r4
2089         rts
2090           nop
2091         ENDFUNC(GLOBAL(ic_invalidate))
2092 #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || (defined(__SH4_NOFPU__) && !defined(__SH5__))
2093         /* For system code, we use ic_invalidate_line_i, but user code
2094            needs a different mechanism.  A kernel call is generally not
2095            available, and it would also be slow.  Different SH4 variants use
2096            different sizes and associativities of the Icache.  We use a small
2097            bit of dispatch code that can be put hidden in every shared object,
2098            which calls the actual processor-specific invalidation code in a
2099            separate module.
2100            Or if you have operating system support, the OS could mmap the
2101            procesor-specific code from a single page, since it is highly
2102            repetitive.  */
2103         .global GLOBAL(ic_invalidate)
2104         HIDDEN_FUNC(GLOBAL(ic_invalidate))
2105 GLOBAL(ic_invalidate):
2106 #ifdef __pic__
2107 #ifdef __vxworks
2108         mov.l   1f,r1
2109         mov.l   2f,r0
2110         mov.l   @r1,r1
2111         mov.l   0f,r2
2112         mov.l   @(r0,r1),r0
2113 #else
2114         mov.l   1f,r1
2115         mova    1f,r0
2116         mov.l   0f,r2
2117         add     r1,r0
2118 #endif
2119         mov.l   @(r0,r2),r1
2120 #else
2121         mov.l   0f,r1
2122 #endif
2123         ocbwb   @r4
2124         mov.l   @(8,r1),r0
2125         sub     r1,r4
2126         and     r4,r0
2127         add     r1,r0
2128         jmp     @r0
2129         mov.l   @(4,r1),r0
2130         .align  2
2131 #ifndef __pic__
2132 0:      .long   GLOBAL(ic_invalidate_array)
2133 #else /* __pic__ */
2134         .global GLOBAL(ic_invalidate_array)
2135 0:      .long   GLOBAL(ic_invalidate_array)@GOT
2136 #ifdef __vxworks
2137 1:      .long   ___GOTT_BASE__
2138 2:      .long   ___GOTT_INDEX__
2139 #else
2140 1:      .long   _GLOBAL_OFFSET_TABLE_
2141 #endif
2142         ENDFUNC(GLOBAL(ic_invalidate))
2143 #endif /* __pic__ */
2144 #endif /* SH4 */
2145 #endif /* L_ic_invalidate */
2146
2147 #ifdef L_ic_invalidate_array
2148 #if defined(__SH4A__) || (defined (__FORCE_SH4A__) && (defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || (defined(__SH4_NOFPU__) && !defined(__SH5__))))
2149         .global GLOBAL(ic_invalidate_array)
2150         /* This is needed when an SH4 dso with trampolines is used on SH4A.  */
2151         .global GLOBAL(ic_invalidate_array)
2152         FUNC(GLOBAL(ic_invalidate_array))
2153 GLOBAL(ic_invalidate_array):
2154         add     r1,r4
2155         synco
2156         icbi    @r4
2157         rts
2158           nop
2159         .align 2
2160         .long   0
2161         ENDFUNC(GLOBAL(ic_invalidate_array))
2162 #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || (defined(__SH4_NOFPU__) && !defined(__SH5__))
2163         .global GLOBAL(ic_invalidate_array)
2164         .p2align 5
2165         FUNC(GLOBAL(ic_invalidate_array))
2166 /* This must be aligned to the beginning of a cache line.  */
2167 GLOBAL(ic_invalidate_array):
2168 #ifndef WAYS
2169 #define WAYS 4
2170 #define WAY_SIZE 0x4000
2171 #endif
2172 #if WAYS == 1
2173         .rept   WAY_SIZE * WAYS / 32
2174         rts
2175         nop
2176         .rept   7
2177         .long   WAY_SIZE - 32
2178         .endr
2179         .endr
2180 #elif WAYS <= 6
2181         .rept   WAY_SIZE * WAYS / 32
2182         braf    r0
2183         add     #-8,r0
2184         .long   WAY_SIZE + 8
2185         .long   WAY_SIZE - 32
2186         .rept   WAYS-2
2187         braf    r0
2188         nop
2189         .endr
2190         .rept   7 - WAYS
2191         rts
2192         nop
2193         .endr
2194         .endr
2195 #else /* WAYS > 6 */
2196         /* This variant needs two different pages for mmap-ing.  */
2197         .rept   WAYS-1
2198         .rept   WAY_SIZE / 32
2199         braf    r0
2200         nop
2201         .long   WAY_SIZE
2202         .rept 6
2203         .long   WAY_SIZE - 32
2204         .endr
2205         .endr
2206         .endr
2207         .rept   WAY_SIZE / 32
2208         rts
2209         .rept   15
2210         nop
2211         .endr
2212         .endr
2213 #endif /* WAYS */
2214         ENDFUNC(GLOBAL(ic_invalidate_array))
2215 #endif /* SH4 */
2216 #endif /* L_ic_invalidate_array */
2217
2218 #if defined (__SH5__) && __SH5__ == 32
2219 #ifdef L_shcompact_call_trampoline
2220         .section        .rodata
2221         .align  1
2222 LOCAL(ct_main_table):
2223 .word   LOCAL(ct_r2_fp) - datalabel LOCAL(ct_main_label)
2224 .word   LOCAL(ct_r2_ld) - datalabel LOCAL(ct_main_label)
2225 .word   LOCAL(ct_r2_pop) - datalabel LOCAL(ct_main_label)
2226 .word   LOCAL(ct_r3_fp) - datalabel LOCAL(ct_main_label)
2227 .word   LOCAL(ct_r3_ld) - datalabel LOCAL(ct_main_label)
2228 .word   LOCAL(ct_r3_pop) - datalabel LOCAL(ct_main_label)
2229 .word   LOCAL(ct_r4_fp) - datalabel LOCAL(ct_main_label)
2230 .word   LOCAL(ct_r4_ld) - datalabel LOCAL(ct_main_label)
2231 .word   LOCAL(ct_r4_pop) - datalabel LOCAL(ct_main_label)
2232 .word   LOCAL(ct_r5_fp) - datalabel LOCAL(ct_main_label)
2233 .word   LOCAL(ct_r5_ld) - datalabel LOCAL(ct_main_label)
2234 .word   LOCAL(ct_r5_pop) - datalabel LOCAL(ct_main_label)
2235 .word   LOCAL(ct_r6_fph) - datalabel LOCAL(ct_main_label)
2236 .word   LOCAL(ct_r6_fpl) - datalabel LOCAL(ct_main_label)
2237 .word   LOCAL(ct_r6_ld) - datalabel LOCAL(ct_main_label)
2238 .word   LOCAL(ct_r6_pop) - datalabel LOCAL(ct_main_label)
2239 .word   LOCAL(ct_r7_fph) - datalabel LOCAL(ct_main_label)
2240 .word   LOCAL(ct_r7_fpl) - datalabel LOCAL(ct_main_label)
2241 .word   LOCAL(ct_r7_ld) - datalabel LOCAL(ct_main_label)
2242 .word   LOCAL(ct_r7_pop) - datalabel LOCAL(ct_main_label)
2243 .word   LOCAL(ct_r8_fph) - datalabel LOCAL(ct_main_label)
2244 .word   LOCAL(ct_r8_fpl) - datalabel LOCAL(ct_main_label)
2245 .word   LOCAL(ct_r8_ld) - datalabel LOCAL(ct_main_label)
2246 .word   LOCAL(ct_r8_pop) - datalabel LOCAL(ct_main_label)
2247 .word   LOCAL(ct_r9_fph) - datalabel LOCAL(ct_main_label)
2248 .word   LOCAL(ct_r9_fpl) - datalabel LOCAL(ct_main_label)
2249 .word   LOCAL(ct_r9_ld) - datalabel LOCAL(ct_main_label)
2250 .word   LOCAL(ct_r9_pop) - datalabel LOCAL(ct_main_label)
2251 .word   LOCAL(ct_pop_seq) - datalabel LOCAL(ct_main_label)
2252 .word   LOCAL(ct_pop_seq) - datalabel LOCAL(ct_main_label)
2253 .word   LOCAL(ct_r9_pop) - datalabel LOCAL(ct_main_label)
2254 .word   LOCAL(ct_ret_wide) - datalabel LOCAL(ct_main_label)
2255 .word   LOCAL(ct_call_func) - datalabel LOCAL(ct_main_label)
2256         .mode   SHmedia
2257         .section        .text..SHmedia32, "ax"
2258         .align  2
2259         
2260      /* This function loads 64-bit general-purpose registers from the
2261         stack, from a memory address contained in them or from an FP
2262         register, according to a cookie passed in r1.  Its execution
2263         time is linear on the number of registers that actually have
2264         to be copied.  See sh.h for details on the actual bit pattern.
2265
2266         The function to be called is passed in r0.  If a 32-bit return
2267         value is expected, the actual function will be tail-called,
2268         otherwise the return address will be stored in r10 (that the
2269         caller should expect to be clobbered) and the return value
2270         will be expanded into r2/r3 upon return.  */
2271         
2272         .global GLOBAL(GCC_shcompact_call_trampoline)
2273         FUNC(GLOBAL(GCC_shcompact_call_trampoline))
2274 GLOBAL(GCC_shcompact_call_trampoline):
2275         ptabs/l r0, tr0 /* Prepare to call the actual function.  */
2276         movi    ((datalabel LOCAL(ct_main_table) - 31 * 2) >> 16) & 65535, r0
2277         pt/l    LOCAL(ct_loop), tr1
2278         addz.l  r1, r63, r1
2279         shori   ((datalabel LOCAL(ct_main_table) - 31 * 2)) & 65535, r0
2280 LOCAL(ct_loop):
2281         nsb     r1, r28
2282         shlli   r28, 1, r29
2283         ldx.w   r0, r29, r30
2284 LOCAL(ct_main_label):
2285         ptrel/l r30, tr2
2286         blink   tr2, r63
2287 LOCAL(ct_r2_fp):        /* Copy r2 from an FP register.  */
2288         /* It must be dr0, so just do it.  */
2289         fmov.dq dr0, r2
2290         movi    7, r30
2291         shlli   r30, 29, r31
2292         andc    r1, r31, r1
2293         blink   tr1, r63
2294 LOCAL(ct_r3_fp):        /* Copy r3 from an FP register.  */
2295         /* It is either dr0 or dr2.  */
2296         movi    7, r30
2297         shlri   r1, 26, r32
2298         shlli   r30, 26, r31
2299         andc    r1, r31, r1
2300         fmov.dq dr0, r3
2301         beqi/l  r32, 4, tr1
2302         fmov.dq dr2, r3
2303         blink   tr1, r63
2304 LOCAL(ct_r4_fp):        /* Copy r4 from an FP register.  */
2305         shlri   r1, 23 - 3, r34
2306         andi    r34, 3 << 3, r33
2307         addi    r33, LOCAL(ct_r4_fp_copy) - datalabel LOCAL(ct_r4_fp_base), r32
2308 LOCAL(ct_r4_fp_base):
2309         ptrel/l r32, tr2
2310         movi    7, r30
2311         shlli   r30, 23, r31
2312         andc    r1, r31, r1
2313         blink   tr2, r63
2314 LOCAL(ct_r4_fp_copy):
2315         fmov.dq dr0, r4
2316         blink   tr1, r63
2317         fmov.dq dr2, r4
2318         blink   tr1, r63
2319         fmov.dq dr4, r4
2320         blink   tr1, r63
2321 LOCAL(ct_r5_fp):        /* Copy r5 from an FP register.  */
2322         shlri   r1, 20 - 3, r34
2323         andi    r34, 3 << 3, r33
2324         addi    r33, LOCAL(ct_r5_fp_copy) - datalabel LOCAL(ct_r5_fp_base), r32
2325 LOCAL(ct_r5_fp_base):
2326         ptrel/l r32, tr2
2327         movi    7, r30
2328         shlli   r30, 20, r31
2329         andc    r1, r31, r1
2330         blink   tr2, r63
2331 LOCAL(ct_r5_fp_copy):
2332         fmov.dq dr0, r5
2333         blink   tr1, r63
2334         fmov.dq dr2, r5
2335         blink   tr1, r63
2336         fmov.dq dr4, r5
2337         blink   tr1, r63
2338         fmov.dq dr6, r5
2339         blink   tr1, r63
2340 LOCAL(ct_r6_fph):       /* Copy r6 from a high FP register.  */
2341         /* It must be dr8.  */
2342         fmov.dq dr8, r6
2343         movi    15, r30
2344         shlli   r30, 16, r31
2345         andc    r1, r31, r1
2346         blink   tr1, r63
2347 LOCAL(ct_r6_fpl):       /* Copy r6 from a low FP register.  */
2348         shlri   r1, 16 - 3, r34
2349         andi    r34, 3 << 3, r33
2350         addi    r33, LOCAL(ct_r6_fp_copy) - datalabel LOCAL(ct_r6_fp_base), r32
2351 LOCAL(ct_r6_fp_base):
2352         ptrel/l r32, tr2
2353         movi    7, r30
2354         shlli   r30, 16, r31
2355         andc    r1, r31, r1
2356         blink   tr2, r63
2357 LOCAL(ct_r6_fp_copy):
2358         fmov.dq dr0, r6
2359         blink   tr1, r63
2360         fmov.dq dr2, r6
2361         blink   tr1, r63
2362         fmov.dq dr4, r6
2363         blink   tr1, r63
2364         fmov.dq dr6, r6
2365         blink   tr1, r63
2366 LOCAL(ct_r7_fph):       /* Copy r7 from a high FP register.  */
2367         /* It is either dr8 or dr10.  */
2368         movi    15 << 12, r31
2369         shlri   r1, 12, r32
2370         andc    r1, r31, r1
2371         fmov.dq dr8, r7
2372         beqi/l  r32, 8, tr1
2373         fmov.dq dr10, r7
2374         blink   tr1, r63
2375 LOCAL(ct_r7_fpl):       /* Copy r7 from a low FP register.  */
2376         shlri   r1, 12 - 3, r34
2377         andi    r34, 3 << 3, r33
2378         addi    r33, LOCAL(ct_r7_fp_copy) - datalabel LOCAL(ct_r7_fp_base), r32
2379 LOCAL(ct_r7_fp_base):
2380         ptrel/l r32, tr2
2381         movi    7 << 12, r31
2382         andc    r1, r31, r1
2383         blink   tr2, r63
2384 LOCAL(ct_r7_fp_copy):
2385         fmov.dq dr0, r7
2386         blink   tr1, r63
2387         fmov.dq dr2, r7
2388         blink   tr1, r63
2389         fmov.dq dr4, r7
2390         blink   tr1, r63
2391         fmov.dq dr6, r7
2392         blink   tr1, r63
2393 LOCAL(ct_r8_fph):       /* Copy r8 from a high FP register.  */
2394         /* It is either dr8 or dr10.  */
2395         movi    15 << 8, r31
2396         andi    r1, 1 << 8, r32
2397         andc    r1, r31, r1
2398         fmov.dq dr8, r8
2399         beq/l   r32, r63, tr1
2400         fmov.dq dr10, r8
2401         blink   tr1, r63
2402 LOCAL(ct_r8_fpl):       /* Copy r8 from a low FP register.  */
2403         shlri   r1, 8 - 3, r34
2404         andi    r34, 3 << 3, r33
2405         addi    r33, LOCAL(ct_r8_fp_copy) - datalabel LOCAL(ct_r8_fp_base), r32
2406 LOCAL(ct_r8_fp_base):
2407         ptrel/l r32, tr2
2408         movi    7 << 8, r31
2409         andc    r1, r31, r1
2410         blink   tr2, r63
2411 LOCAL(ct_r8_fp_copy):
2412         fmov.dq dr0, r8
2413         blink   tr1, r63
2414         fmov.dq dr2, r8
2415         blink   tr1, r63
2416         fmov.dq dr4, r8
2417         blink   tr1, r63
2418         fmov.dq dr6, r8
2419         blink   tr1, r63
2420 LOCAL(ct_r9_fph):       /* Copy r9 from a high FP register.  */
2421         /* It is either dr8 or dr10.  */
2422         movi    15 << 4, r31
2423         andi    r1, 1 << 4, r32
2424         andc    r1, r31, r1
2425         fmov.dq dr8, r9
2426         beq/l   r32, r63, tr1
2427         fmov.dq dr10, r9
2428         blink   tr1, r63
2429 LOCAL(ct_r9_fpl):       /* Copy r9 from a low FP register.  */
2430         shlri   r1, 4 - 3, r34
2431         andi    r34, 3 << 3, r33
2432         addi    r33, LOCAL(ct_r9_fp_copy) - datalabel LOCAL(ct_r9_fp_base), r32
2433 LOCAL(ct_r9_fp_base):
2434         ptrel/l r32, tr2
2435         movi    7 << 4, r31
2436         andc    r1, r31, r1
2437         blink   tr2, r63
2438 LOCAL(ct_r9_fp_copy):
2439         fmov.dq dr0, r9
2440         blink   tr1, r63
2441         fmov.dq dr2, r9
2442         blink   tr1, r63
2443         fmov.dq dr4, r9
2444         blink   tr1, r63
2445         fmov.dq dr6, r9
2446         blink   tr1, r63
2447 LOCAL(ct_r2_ld):        /* Copy r2 from a memory address.  */
2448         pt/l    LOCAL(ct_r2_load), tr2
2449         movi    3, r30
2450         shlli   r30, 29, r31
2451         and     r1, r31, r32
2452         andc    r1, r31, r1
2453         beq/l   r31, r32, tr2
2454         addi.l  r2, 8, r3
2455         ldx.q   r2, r63, r2
2456         /* Fall through.  */
2457 LOCAL(ct_r3_ld):        /* Copy r3 from a memory address.  */
2458         pt/l    LOCAL(ct_r3_load), tr2
2459         movi    3, r30
2460         shlli   r30, 26, r31
2461         and     r1, r31, r32
2462         andc    r1, r31, r1
2463         beq/l   r31, r32, tr2
2464         addi.l  r3, 8, r4
2465         ldx.q   r3, r63, r3
2466 LOCAL(ct_r4_ld):        /* Copy r4 from a memory address.  */
2467         pt/l    LOCAL(ct_r4_load), tr2
2468         movi    3, r30
2469         shlli   r30, 23, r31
2470         and     r1, r31, r32
2471         andc    r1, r31, r1
2472         beq/l   r31, r32, tr2
2473         addi.l  r4, 8, r5
2474         ldx.q   r4, r63, r4
2475 LOCAL(ct_r5_ld):        /* Copy r5 from a memory address.  */
2476         pt/l    LOCAL(ct_r5_load), tr2
2477         movi    3, r30
2478         shlli   r30, 20, r31
2479         and     r1, r31, r32
2480         andc    r1, r31, r1
2481         beq/l   r31, r32, tr2
2482         addi.l  r5, 8, r6
2483         ldx.q   r5, r63, r5
2484 LOCAL(ct_r6_ld):        /* Copy r6 from a memory address.  */
2485         pt/l    LOCAL(ct_r6_load), tr2
2486         movi    3 << 16, r31
2487         and     r1, r31, r32
2488         andc    r1, r31, r1
2489         beq/l   r31, r32, tr2
2490         addi.l  r6, 8, r7
2491         ldx.q   r6, r63, r6
2492 LOCAL(ct_r7_ld):        /* Copy r7 from a memory address.  */
2493         pt/l    LOCAL(ct_r7_load), tr2
2494         movi    3 << 12, r31
2495         and     r1, r31, r32
2496         andc    r1, r31, r1
2497         beq/l   r31, r32, tr2
2498         addi.l  r7, 8, r8
2499         ldx.q   r7, r63, r7
2500 LOCAL(ct_r8_ld):        /* Copy r8 from a memory address.  */
2501         pt/l    LOCAL(ct_r8_load), tr2
2502         movi    3 << 8, r31
2503         and     r1, r31, r32
2504         andc    r1, r31, r1
2505         beq/l   r31, r32, tr2
2506         addi.l  r8, 8, r9
2507         ldx.q   r8, r63, r8
2508 LOCAL(ct_r9_ld):        /* Copy r9 from a memory address.  */
2509         pt/l    LOCAL(ct_check_tramp), tr2
2510         ldx.q   r9, r63, r9
2511         blink   tr2, r63
2512 LOCAL(ct_r2_load):
2513         ldx.q   r2, r63, r2
2514         blink   tr1, r63
2515 LOCAL(ct_r3_load):
2516         ldx.q   r3, r63, r3
2517         blink   tr1, r63
2518 LOCAL(ct_r4_load):
2519         ldx.q   r4, r63, r4
2520         blink   tr1, r63
2521 LOCAL(ct_r5_load):
2522         ldx.q   r5, r63, r5
2523         blink   tr1, r63
2524 LOCAL(ct_r6_load):
2525         ldx.q   r6, r63, r6
2526         blink   tr1, r63
2527 LOCAL(ct_r7_load):
2528         ldx.q   r7, r63, r7
2529         blink   tr1, r63
2530 LOCAL(ct_r8_load):
2531         ldx.q   r8, r63, r8
2532         blink   tr1, r63
2533 LOCAL(ct_r2_pop):       /* Pop r2 from the stack.  */
2534         movi    1, r30
2535         ldx.q   r15, r63, r2
2536         shlli   r30, 29, r31
2537         addi.l  r15, 8, r15
2538         andc    r1, r31, r1
2539         blink   tr1, r63
2540 LOCAL(ct_r3_pop):       /* Pop r3 from the stack.  */
2541         movi    1, r30
2542         ldx.q   r15, r63, r3
2543         shlli   r30, 26, r31
2544         addi.l  r15, 8, r15
2545         andc    r1, r31, r1
2546         blink   tr1, r63
2547 LOCAL(ct_r4_pop):       /* Pop r4 from the stack.  */
2548         movi    1, r30
2549         ldx.q   r15, r63, r4
2550         shlli   r30, 23, r31
2551         addi.l  r15, 8, r15
2552         andc    r1, r31, r1
2553         blink   tr1, r63
2554 LOCAL(ct_r5_pop):       /* Pop r5 from the stack.  */
2555         movi    1, r30
2556         ldx.q   r15, r63, r5
2557         shlli   r30, 20, r31
2558         addi.l  r15, 8, r15
2559         andc    r1, r31, r1
2560         blink   tr1, r63
2561 LOCAL(ct_r6_pop):       /* Pop r6 from the stack.  */
2562         movi    1, r30
2563         ldx.q   r15, r63, r6
2564         shlli   r30, 16, r31
2565         addi.l  r15, 8, r15
2566         andc    r1, r31, r1
2567         blink   tr1, r63
2568 LOCAL(ct_r7_pop):       /* Pop r7 from the stack.  */
2569         ldx.q   r15, r63, r7
2570         movi    1 << 12, r31
2571         addi.l  r15, 8, r15
2572         andc    r1, r31, r1
2573         blink   tr1, r63
2574 LOCAL(ct_r8_pop):       /* Pop r8 from the stack.  */
2575         ldx.q   r15, r63, r8
2576         movi    1 << 8, r31
2577         addi.l  r15, 8, r15
2578         andc    r1, r31, r1
2579         blink   tr1, r63
2580 LOCAL(ct_pop_seq):      /* Pop a sequence of registers off the stack.  */
2581         andi    r1, 7 << 1, r30
2582         movi    (LOCAL(ct_end_of_pop_seq) >> 16) & 65535, r32
2583         shlli   r30, 2, r31
2584         shori   LOCAL(ct_end_of_pop_seq) & 65535, r32
2585         sub.l   r32, r31, r33
2586         ptabs/l r33, tr2
2587         blink   tr2, r63
2588 LOCAL(ct_start_of_pop_seq):     /* Beginning of pop sequence.  */
2589         ldx.q   r15, r63, r3
2590         addi.l  r15, 8, r15
2591         ldx.q   r15, r63, r4
2592         addi.l  r15, 8, r15
2593         ldx.q   r15, r63, r5
2594         addi.l  r15, 8, r15
2595         ldx.q   r15, r63, r6
2596         addi.l  r15, 8, r15
2597         ldx.q   r15, r63, r7
2598         addi.l  r15, 8, r15
2599         ldx.q   r15, r63, r8
2600         addi.l  r15, 8, r15
2601 LOCAL(ct_r9_pop):       /* Pop r9 from the stack.  */
2602         ldx.q   r15, r63, r9
2603         addi.l  r15, 8, r15
2604 LOCAL(ct_end_of_pop_seq): /* Label used to compute first pop instruction.  */
2605 LOCAL(ct_check_tramp):  /* Check whether we need a trampoline.  */
2606         pt/u    LOCAL(ct_ret_wide), tr2
2607         andi    r1, 1, r1
2608         bne/u   r1, r63, tr2
2609 LOCAL(ct_call_func):    /* Just branch to the function.  */
2610         blink   tr0, r63
2611 LOCAL(ct_ret_wide):     /* Call the function, so that we can unpack its 
2612                            64-bit return value.  */
2613         add.l   r18, r63, r10
2614         blink   tr0, r18
2615         ptabs   r10, tr0
2616 #if __LITTLE_ENDIAN__
2617         shari   r2, 32, r3
2618         add.l   r2, r63, r2
2619 #else
2620         add.l   r2, r63, r3
2621         shari   r2, 32, r2
2622 #endif
2623         blink   tr0, r63
2624
2625         ENDFUNC(GLOBAL(GCC_shcompact_call_trampoline))
2626 #endif /* L_shcompact_call_trampoline */
2627
2628 #ifdef L_shcompact_return_trampoline
2629      /* This function does the converse of the code in `ret_wide'
2630         above.  It is tail-called by SHcompact functions returning
2631         64-bit non-floating-point values, to pack the 32-bit values in
2632         r2 and r3 into r2.  */
2633
2634         .mode   SHmedia
2635         .section        .text..SHmedia32, "ax"
2636         .align  2
2637         .global GLOBAL(GCC_shcompact_return_trampoline)
2638         HIDDEN_FUNC(GLOBAL(GCC_shcompact_return_trampoline))
2639 GLOBAL(GCC_shcompact_return_trampoline):
2640         ptabs/l r18, tr0
2641 #if __LITTLE_ENDIAN__
2642         addz.l  r2, r63, r2
2643         shlli   r3, 32, r3
2644 #else
2645         addz.l  r3, r63, r3
2646         shlli   r2, 32, r2
2647 #endif
2648         or      r3, r2, r2
2649         blink   tr0, r63
2650
2651         ENDFUNC(GLOBAL(GCC_shcompact_return_trampoline))
2652 #endif /* L_shcompact_return_trampoline */
2653
2654 #ifdef L_shcompact_incoming_args
2655         .section        .rodata
2656         .align  1
2657 LOCAL(ia_main_table):
2658 .word   1 /* Invalid, just loop */
2659 .word   LOCAL(ia_r2_ld) - datalabel LOCAL(ia_main_label)
2660 .word   LOCAL(ia_r2_push) - datalabel LOCAL(ia_main_label)
2661 .word   1 /* Invalid, just loop */
2662 .word   LOCAL(ia_r3_ld) - datalabel LOCAL(ia_main_label)
2663 .word   LOCAL(ia_r3_push) - datalabel LOCAL(ia_main_label)
2664 .word   1 /* Invalid, just loop */
2665 .word   LOCAL(ia_r4_ld) - datalabel LOCAL(ia_main_label)
2666 .word   LOCAL(ia_r4_push) - datalabel LOCAL(ia_main_label)
2667 .word   1 /* Invalid, just loop */
2668 .word   LOCAL(ia_r5_ld) - datalabel LOCAL(ia_main_label)
2669 .word   LOCAL(ia_r5_push) - datalabel LOCAL(ia_main_label)
2670 .word   1 /* Invalid, just loop */
2671 .word   1 /* Invalid, just loop */
2672 .word   LOCAL(ia_r6_ld) - datalabel LOCAL(ia_main_label)
2673 .word   LOCAL(ia_r6_push) - datalabel LOCAL(ia_main_label)
2674 .word   1 /* Invalid, just loop */
2675 .word   1 /* Invalid, just loop */
2676 .word   LOCAL(ia_r7_ld) - datalabel LOCAL(ia_main_label)
2677 .word   LOCAL(ia_r7_push) - datalabel LOCAL(ia_main_label)
2678 .word   1 /* Invalid, just loop */
2679 .word   1 /* Invalid, just loop */
2680 .word   LOCAL(ia_r8_ld) - datalabel LOCAL(ia_main_label)
2681 .word   LOCAL(ia_r8_push) - datalabel LOCAL(ia_main_label)
2682 .word   1 /* Invalid, just loop */
2683 .word   1 /* Invalid, just loop */
2684 .word   LOCAL(ia_r9_ld) - datalabel LOCAL(ia_main_label)
2685 .word   LOCAL(ia_r9_push) - datalabel LOCAL(ia_main_label)
2686 .word   LOCAL(ia_push_seq) - datalabel LOCAL(ia_main_label)
2687 .word   LOCAL(ia_push_seq) - datalabel LOCAL(ia_main_label)
2688 .word   LOCAL(ia_r9_push) - datalabel LOCAL(ia_main_label)
2689 .word   LOCAL(ia_return) - datalabel LOCAL(ia_main_label)
2690 .word   LOCAL(ia_return) - datalabel LOCAL(ia_main_label)
2691         .mode   SHmedia
2692         .section        .text..SHmedia32, "ax"
2693         .align  2
2694         
2695      /* This function stores 64-bit general-purpose registers back in
2696         the stack, and loads the address in which each register
2697         was stored into itself.  The lower 32 bits of r17 hold the address
2698         to begin storing, and the upper 32 bits of r17 hold the cookie.
2699         Its execution time is linear on the
2700         number of registers that actually have to be copied, and it is
2701         optimized for structures larger than 64 bits, as opposed to
2702         individual `long long' arguments.  See sh.h for details on the
2703         actual bit pattern.  */
2704         
2705         .global GLOBAL(GCC_shcompact_incoming_args)
2706         FUNC(GLOBAL(GCC_shcompact_incoming_args))
2707 GLOBAL(GCC_shcompact_incoming_args):
2708         ptabs/l r18, tr0        /* Prepare to return.  */
2709         shlri   r17, 32, r0     /* Load the cookie.  */
2710         movi    ((datalabel LOCAL(ia_main_table) - 31 * 2) >> 16) & 65535, r43
2711         pt/l    LOCAL(ia_loop), tr1
2712         add.l   r17, r63, r17
2713         shori   ((datalabel LOCAL(ia_main_table) - 31 * 2)) & 65535, r43
2714 LOCAL(ia_loop):
2715         nsb     r0, r36
2716         shlli   r36, 1, r37
2717         ldx.w   r43, r37, r38
2718 LOCAL(ia_main_label):
2719         ptrel/l r38, tr2
2720         blink   tr2, r63
2721 LOCAL(ia_r2_ld):        /* Store r2 and load its address.  */
2722         movi    3, r38
2723         shlli   r38, 29, r39
2724         and     r0, r39, r40
2725         andc    r0, r39, r0
2726         stx.q   r17, r63, r2
2727         add.l   r17, r63, r2
2728         addi.l  r17, 8, r17
2729         beq/u   r39, r40, tr1
2730 LOCAL(ia_r3_ld):        /* Store r3 and load its address.  */
2731         movi    3, r38
2732         shlli   r38, 26, r39
2733         and     r0, r39, r40
2734         andc    r0, r39, r0
2735         stx.q   r17, r63, r3
2736         add.l   r17, r63, r3
2737         addi.l  r17, 8, r17
2738         beq/u   r39, r40, tr1
2739 LOCAL(ia_r4_ld):        /* Store r4 and load its address.  */
2740         movi    3, r38
2741         shlli   r38, 23, r39
2742         and     r0, r39, r40
2743         andc    r0, r39, r0
2744         stx.q   r17, r63, r4
2745         add.l   r17, r63, r4
2746         addi.l  r17, 8, r17
2747         beq/u   r39, r40, tr1
2748 LOCAL(ia_r5_ld):        /* Store r5 and load its address.  */
2749         movi    3, r38
2750         shlli   r38, 20, r39
2751         and     r0, r39, r40
2752         andc    r0, r39, r0
2753         stx.q   r17, r63, r5
2754         add.l   r17, r63, r5
2755         addi.l  r17, 8, r17
2756         beq/u   r39, r40, tr1
2757 LOCAL(ia_r6_ld):        /* Store r6 and load its address.  */
2758         movi    3, r38
2759         shlli   r38, 16, r39
2760         and     r0, r39, r40
2761         andc    r0, r39, r0
2762         stx.q   r17, r63, r6
2763         add.l   r17, r63, r6
2764         addi.l  r17, 8, r17
2765         beq/u   r39, r40, tr1
2766 LOCAL(ia_r7_ld):        /* Store r7 and load its address.  */
2767         movi    3 << 12, r39
2768         and     r0, r39, r40
2769         andc    r0, r39, r0
2770         stx.q   r17, r63, r7
2771         add.l   r17, r63, r7
2772         addi.l  r17, 8, r17
2773         beq/u   r39, r40, tr1
2774 LOCAL(ia_r8_ld):        /* Store r8 and load its address.  */
2775         movi    3 << 8, r39
2776         and     r0, r39, r40
2777         andc    r0, r39, r0
2778         stx.q   r17, r63, r8
2779         add.l   r17, r63, r8
2780         addi.l  r17, 8, r17
2781         beq/u   r39, r40, tr1
2782 LOCAL(ia_r9_ld):        /* Store r9 and load its address.  */
2783         stx.q   r17, r63, r9
2784         add.l   r17, r63, r9
2785         blink   tr0, r63
2786 LOCAL(ia_r2_push):      /* Push r2 onto the stack.  */
2787         movi    1, r38
2788         shlli   r38, 29, r39
2789         andc    r0, r39, r0
2790         stx.q   r17, r63, r2
2791         addi.l  r17, 8, r17
2792         blink   tr1, r63
2793 LOCAL(ia_r3_push):      /* Push r3 onto the stack.  */
2794         movi    1, r38
2795         shlli   r38, 26, r39
2796         andc    r0, r39, r0
2797         stx.q   r17, r63, r3
2798         addi.l  r17, 8, r17
2799         blink   tr1, r63
2800 LOCAL(ia_r4_push):      /* Push r4 onto the stack.  */
2801         movi    1, r38
2802         shlli   r38, 23, r39
2803         andc    r0, r39, r0
2804         stx.q   r17, r63, r4
2805         addi.l  r17, 8, r17
2806         blink   tr1, r63
2807 LOCAL(ia_r5_push):      /* Push r5 onto the stack.  */
2808         movi    1, r38
2809         shlli   r38, 20, r39
2810         andc    r0, r39, r0
2811         stx.q   r17, r63, r5
2812         addi.l  r17, 8, r17
2813         blink   tr1, r63
2814 LOCAL(ia_r6_push):      /* Push r6 onto the stack.  */
2815         movi    1, r38
2816         shlli   r38, 16, r39
2817         andc    r0, r39, r0
2818         stx.q   r17, r63, r6
2819         addi.l  r17, 8, r17
2820         blink   tr1, r63
2821 LOCAL(ia_r7_push):      /* Push r7 onto the stack.  */
2822         movi    1 << 12, r39
2823         andc    r0, r39, r0
2824         stx.q   r17, r63, r7
2825         addi.l  r17, 8, r17
2826         blink   tr1, r63
2827 LOCAL(ia_r8_push):      /* Push r8 onto the stack.  */
2828         movi    1 << 8, r39
2829         andc    r0, r39, r0
2830         stx.q   r17, r63, r8
2831         addi.l  r17, 8, r17
2832         blink   tr1, r63
2833 LOCAL(ia_push_seq):     /* Push a sequence of registers onto the stack.  */
2834         andi    r0, 7 << 1, r38
2835         movi    (LOCAL(ia_end_of_push_seq) >> 16) & 65535, r40
2836         shlli   r38, 2, r39
2837         shori   LOCAL(ia_end_of_push_seq) & 65535, r40
2838         sub.l   r40, r39, r41
2839         ptabs/l r41, tr2
2840         blink   tr2, r63
2841 LOCAL(ia_stack_of_push_seq):     /* Beginning of push sequence.  */
2842         stx.q   r17, r63, r3
2843         addi.l  r17, 8, r17
2844         stx.q   r17, r63, r4
2845         addi.l  r17, 8, r17
2846         stx.q   r17, r63, r5
2847         addi.l  r17, 8, r17
2848         stx.q   r17, r63, r6
2849         addi.l  r17, 8, r17
2850         stx.q   r17, r63, r7
2851         addi.l  r17, 8, r17
2852         stx.q   r17, r63, r8
2853         addi.l  r17, 8, r17
2854 LOCAL(ia_r9_push):      /* Push r9 onto the stack.  */
2855         stx.q   r17, r63, r9
2856 LOCAL(ia_return):       /* Return.  */
2857         blink   tr0, r63
2858 LOCAL(ia_end_of_push_seq): /* Label used to compute the first push instruction.  */
2859         ENDFUNC(GLOBAL(GCC_shcompact_incoming_args))
2860 #endif /* L_shcompact_incoming_args */
2861 #endif
2862 #if __SH5__
2863 #ifdef L_nested_trampoline
2864 #if __SH5__ == 32
2865         .section        .text..SHmedia32,"ax"
2866 #else
2867         .text
2868 #endif
2869         .align  3 /* It is copied in units of 8 bytes in SHmedia mode.  */
2870         .global GLOBAL(GCC_nested_trampoline)
2871         HIDDEN_FUNC(GLOBAL(GCC_nested_trampoline))
2872 GLOBAL(GCC_nested_trampoline):
2873         .mode   SHmedia
2874         ptrel/u r63, tr0
2875         gettr   tr0, r0
2876 #if __SH5__ == 64
2877         ld.q    r0, 24, r1
2878 #else
2879         ld.l    r0, 24, r1
2880 #endif
2881         ptabs/l r1, tr1
2882 #if __SH5__ == 64
2883         ld.q    r0, 32, r1
2884 #else
2885         ld.l    r0, 28, r1
2886 #endif
2887         blink   tr1, r63
2888
2889         ENDFUNC(GLOBAL(GCC_nested_trampoline))
2890 #endif /* L_nested_trampoline */
2891 #endif /* __SH5__ */
2892 #if __SH5__ == 32
2893 #ifdef L_push_pop_shmedia_regs
2894         .section        .text..SHmedia32,"ax"
2895         .mode   SHmedia
2896         .align  2
2897 #ifndef __SH4_NOFPU__   
2898         .global GLOBAL(GCC_push_shmedia_regs)
2899         FUNC(GLOBAL(GCC_push_shmedia_regs))
2900 GLOBAL(GCC_push_shmedia_regs):
2901         addi.l  r15, -14*8, r15
2902         fst.d   r15, 13*8, dr62
2903         fst.d   r15, 12*8, dr60
2904         fst.d   r15, 11*8, dr58
2905         fst.d   r15, 10*8, dr56
2906         fst.d   r15,  9*8, dr54
2907         fst.d   r15,  8*8, dr52
2908         fst.d   r15,  7*8, dr50
2909         fst.d   r15,  6*8, dr48
2910         fst.d   r15,  5*8, dr46
2911         fst.d   r15,  4*8, dr44
2912         fst.d   r15,  3*8, dr42
2913         fst.d   r15,  2*8, dr40
2914         fst.d   r15,  1*8, dr38
2915         fst.d   r15,  0*8, dr36
2916 #else /* ! __SH4_NOFPU__ */
2917         .global GLOBAL(GCC_push_shmedia_regs_nofpu)
2918         FUNC(GLOBAL(GCC_push_shmedia_regs_nofpu))
2919 GLOBAL(GCC_push_shmedia_regs_nofpu):
2920 #endif /* ! __SH4_NOFPU__ */
2921         ptabs/l r18, tr0
2922         addi.l  r15, -27*8, r15
2923         gettr   tr7, r62
2924         gettr   tr6, r61
2925         gettr   tr5, r60
2926         st.q    r15, 26*8, r62
2927         st.q    r15, 25*8, r61
2928         st.q    r15, 24*8, r60
2929         st.q    r15, 23*8, r59
2930         st.q    r15, 22*8, r58
2931         st.q    r15, 21*8, r57
2932         st.q    r15, 20*8, r56
2933         st.q    r15, 19*8, r55
2934         st.q    r15, 18*8, r54
2935         st.q    r15, 17*8, r53
2936         st.q    r15, 16*8, r52
2937         st.q    r15, 15*8, r51
2938         st.q    r15, 14*8, r50
2939         st.q    r15, 13*8, r49
2940         st.q    r15, 12*8, r48
2941         st.q    r15, 11*8, r47
2942         st.q    r15, 10*8, r46
2943         st.q    r15,  9*8, r45
2944         st.q    r15,  8*8, r44
2945         st.q    r15,  7*8, r35
2946         st.q    r15,  6*8, r34
2947         st.q    r15,  5*8, r33
2948         st.q    r15,  4*8, r32
2949         st.q    r15,  3*8, r31
2950         st.q    r15,  2*8, r30
2951         st.q    r15,  1*8, r29
2952         st.q    r15,  0*8, r28
2953         blink   tr0, r63
2954 #ifndef __SH4_NOFPU__   
2955         ENDFUNC(GLOBAL(GCC_push_shmedia_regs))
2956 #else
2957         ENDFUNC(GLOBAL(GCC_push_shmedia_regs_nofpu))
2958 #endif
2959 #ifndef __SH4_NOFPU__   
2960         .global GLOBAL(GCC_pop_shmedia_regs)
2961         FUNC(GLOBAL(GCC_pop_shmedia_regs))
2962 GLOBAL(GCC_pop_shmedia_regs):
2963         pt      .L0, tr1
2964         movi    41*8, r0
2965         fld.d   r15, 40*8, dr62
2966         fld.d   r15, 39*8, dr60
2967         fld.d   r15, 38*8, dr58
2968         fld.d   r15, 37*8, dr56
2969         fld.d   r15, 36*8, dr54
2970         fld.d   r15, 35*8, dr52
2971         fld.d   r15, 34*8, dr50
2972         fld.d   r15, 33*8, dr48
2973         fld.d   r15, 32*8, dr46
2974         fld.d   r15, 31*8, dr44
2975         fld.d   r15, 30*8, dr42
2976         fld.d   r15, 29*8, dr40
2977         fld.d   r15, 28*8, dr38
2978         fld.d   r15, 27*8, dr36
2979         blink   tr1, r63
2980 #else /* ! __SH4_NOFPU__        */
2981         .global GLOBAL(GCC_pop_shmedia_regs_nofpu)
2982         FUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu))
2983 GLOBAL(GCC_pop_shmedia_regs_nofpu):
2984 #endif /* ! __SH4_NOFPU__       */
2985         movi    27*8, r0
2986 .L0:
2987         ptabs   r18, tr0
2988         ld.q    r15, 26*8, r62
2989         ld.q    r15, 25*8, r61
2990         ld.q    r15, 24*8, r60
2991         ptabs   r62, tr7
2992         ptabs   r61, tr6
2993         ptabs   r60, tr5
2994         ld.q    r15, 23*8, r59
2995         ld.q    r15, 22*8, r58
2996         ld.q    r15, 21*8, r57
2997         ld.q    r15, 20*8, r56
2998         ld.q    r15, 19*8, r55
2999         ld.q    r15, 18*8, r54
3000         ld.q    r15, 17*8, r53
3001         ld.q    r15, 16*8, r52
3002         ld.q    r15, 15*8, r51
3003         ld.q    r15, 14*8, r50
3004         ld.q    r15, 13*8, r49
3005         ld.q    r15, 12*8, r48
3006         ld.q    r15, 11*8, r47
3007         ld.q    r15, 10*8, r46
3008         ld.q    r15,  9*8, r45
3009         ld.q    r15,  8*8, r44
3010         ld.q    r15,  7*8, r35
3011         ld.q    r15,  6*8, r34
3012         ld.q    r15,  5*8, r33
3013         ld.q    r15,  4*8, r32
3014         ld.q    r15,  3*8, r31
3015         ld.q    r15,  2*8, r30
3016         ld.q    r15,  1*8, r29
3017         ld.q    r15,  0*8, r28
3018         add.l   r15, r0, r15
3019         blink   tr0, r63
3020
3021 #ifndef __SH4_NOFPU__
3022         ENDFUNC(GLOBAL(GCC_pop_shmedia_regs))
3023 #else
3024         ENDFUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu))
3025 #endif
3026 #endif /* __SH5__ == 32 */
3027 #endif /* L_push_pop_shmedia_regs */
3028
3029 #ifdef L_div_table
3030 #if __SH5__
3031 #if defined(__pic__) && defined(__SHMEDIA__)
3032         .global GLOBAL(sdivsi3)
3033         FUNC(GLOBAL(sdivsi3))
3034 #if __SH5__ == 32
3035         .section        .text..SHmedia32,"ax"
3036 #else
3037         .text
3038 #endif
3039 #if 0
3040 /* ??? FIXME: Presumably due to a linker bug, exporting data symbols
3041    in a text section does not work (at least for shared libraries):
3042    the linker sets the LSB of the address as if this was SHmedia code.  */
3043 #define TEXT_DATA_BUG
3044 #endif
3045         .align  2
3046  // inputs: r4,r5
3047  // clobbered: r1,r18,r19,r20,r21,r25,tr0
3048  // result in r0
3049  .global GLOBAL(sdivsi3)
3050 GLOBAL(sdivsi3):
3051 #ifdef TEXT_DATA_BUG
3052  ptb datalabel Local_div_table,tr0
3053 #else
3054  ptb GLOBAL(div_table_internal),tr0
3055 #endif
3056  nsb r5, r1
3057  shlld r5, r1, r25    // normalize; [-2 ..1, 1..2) in s2.62
3058  shari r25, 58, r21   // extract 5(6) bit index (s2.4 with hole -1..1)
3059  /* bubble */
3060  gettr tr0,r20
3061  ldx.ub r20, r21, r19 // u0.8
3062  shari r25, 32, r25   // normalize to s2.30
3063  shlli r21, 1, r21
3064  muls.l r25, r19, r19 // s2.38
3065  ldx.w r20, r21, r21  // s2.14
3066   ptabs r18, tr0
3067  shari r19, 24, r19   // truncate to s2.14
3068  sub r21, r19, r19    // some 11 bit inverse in s1.14
3069  muls.l r19, r19, r21 // u0.28
3070   sub r63, r1, r1
3071   addi r1, 92, r1
3072  muls.l r25, r21, r18 // s2.58
3073  shlli r19, 45, r19   // multiply by two and convert to s2.58
3074   /* bubble */
3075  sub r19, r18, r18
3076  shari r18, 28, r18   // some 22 bit inverse in s1.30
3077  muls.l r18, r25, r0  // s2.60
3078   muls.l r18, r4, r25 // s32.30
3079   /* bubble */
3080  shari r0, 16, r19   // s-16.44
3081  muls.l r19, r18, r19 // s-16.74
3082   shari r25, 63, r0
3083   shari r4, 14, r18   // s19.-14
3084  shari r19, 30, r19   // s-16.44
3085  muls.l r19, r18, r19 // s15.30
3086   xor r21, r0, r21    // You could also use the constant 1 << 27.
3087   add r21, r25, r21
3088  sub r21, r19, r21
3089  shard r21, r1, r21
3090  sub r21, r0, r0
3091  blink tr0, r63
3092         ENDFUNC(GLOBAL(sdivsi3))
3093 /* This table has been generated by divtab.c .
3094 Defects for bias -330:
3095    Max defect: 6.081536e-07 at -1.000000e+00
3096    Min defect: 2.849516e-08 at 1.030651e+00
3097    Max 2nd step defect: 9.606539e-12 at -1.000000e+00
3098    Min 2nd step defect: 0.000000e+00 at 0.000000e+00
3099    Defect at 1: 1.238659e-07
3100    Defect at -2: 1.061708e-07 */
3101 #else /* ! __pic__ || ! __SHMEDIA__ */
3102         .section        .rodata
3103 #endif /* __pic__ */
3104 #if defined(TEXT_DATA_BUG) && defined(__pic__) && defined(__SHMEDIA__)
3105         .balign 2
3106         .type   Local_div_table,@object
3107         .size   Local_div_table,128
3108 /* negative division constants */
3109         .word   -16638
3110         .word   -17135
3111         .word   -17737
3112         .word   -18433
3113         .word   -19103
3114         .word   -19751
3115         .word   -20583
3116         .word   -21383
3117         .word   -22343
3118         .word   -23353
3119         .word   -24407
3120         .word   -25582
3121         .word   -26863
3122         .word   -28382
3123         .word   -29965
3124         .word   -31800
3125 /* negative division factors */
3126         .byte   66
3127         .byte   70
3128         .byte   75
3129         .byte   81
3130         .byte   87
3131         .byte   93
3132         .byte   101
3133         .byte   109
3134         .byte   119
3135         .byte   130
3136         .byte   142
3137         .byte   156
3138         .byte   172
3139         .byte   192
3140         .byte   214
3141         .byte   241
3142         .skip 16
3143 Local_div_table:
3144         .skip 16
3145 /* positive division factors */
3146         .byte   241
3147         .byte   214
3148         .byte   192
3149         .byte   172
3150         .byte   156
3151         .byte   142
3152         .byte   130
3153         .byte   119
3154         .byte   109
3155         .byte   101
3156         .byte   93
3157         .byte   87
3158         .byte   81
3159         .byte   75
3160         .byte   70
3161         .byte   66
3162 /* positive division constants */
3163         .word   31801
3164         .word   29966
3165         .word   28383
3166         .word   26864
3167         .word   25583
3168         .word   24408
3169         .word   23354
3170         .word   22344
3171         .word   21384
3172         .word   20584
3173         .word   19752
3174         .word   19104
3175         .word   18434
3176         .word   17738
3177         .word   17136
3178         .word   16639
3179         .section        .rodata
3180 #endif /* TEXT_DATA_BUG */
3181         .balign 2
3182         .type   GLOBAL(div_table),@object
3183         .size   GLOBAL(div_table),128
3184 /* negative division constants */
3185         .word   -16638
3186         .word   -17135
3187         .word   -17737
3188         .word   -18433
3189         .word   -19103
3190         .word   -19751
3191         .word   -20583
3192         .word   -21383
3193         .word   -22343
3194         .word   -23353
3195         .word   -24407
3196         .word   -25582
3197         .word   -26863
3198         .word   -28382
3199         .word   -29965
3200         .word   -31800
3201 /* negative division factors */
3202         .byte   66
3203         .byte   70
3204         .byte   75
3205         .byte   81
3206         .byte   87
3207         .byte   93
3208         .byte   101
3209         .byte   109
3210         .byte   119
3211         .byte   130
3212         .byte   142
3213         .byte   156
3214         .byte   172
3215         .byte   192
3216         .byte   214
3217         .byte   241
3218         .skip 16
3219         .global GLOBAL(div_table)
3220 GLOBAL(div_table):
3221         HIDDEN_ALIAS(div_table_internal,div_table)
3222         .skip 16
3223 /* positive division factors */
3224         .byte   241
3225         .byte   214
3226         .byte   192
3227         .byte   172
3228         .byte   156
3229         .byte   142
3230         .byte   130
3231         .byte   119
3232         .byte   109
3233         .byte   101
3234         .byte   93
3235         .byte   87
3236         .byte   81
3237         .byte   75
3238         .byte   70
3239         .byte   66
3240 /* positive division constants */
3241         .word   31801
3242         .word   29966
3243         .word   28383
3244         .word   26864
3245         .word   25583
3246         .word   24408
3247         .word   23354
3248         .word   22344
3249         .word   21384
3250         .word   20584
3251         .word   19752
3252         .word   19104
3253         .word   18434
3254         .word   17738
3255         .word   17136
3256         .word   16639
3257
3258 #elif defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__)
3259 /* This code used shld, thus is not suitable for SH1 / SH2.  */
3260
3261 /* Signed / unsigned division without use of FPU, optimized for SH4.
3262    Uses a lookup table for divisors in the range -128 .. +128, and
3263    div1 with case distinction for larger divisors in three more ranges.
3264    The code is lumped together with the table to allow the use of mova.  */
3265 #ifdef __LITTLE_ENDIAN__
3266 #define L_LSB 0
3267 #define L_LSWMSB 1
3268 #define L_MSWLSB 2
3269 #else
3270 #define L_LSB 3
3271 #define L_LSWMSB 2
3272 #define L_MSWLSB 1
3273 #endif
3274
3275         .balign 4
3276         .global GLOBAL(udivsi3_i4i)
3277         FUNC(GLOBAL(udivsi3_i4i))
3278 GLOBAL(udivsi3_i4i):
3279         mov.w LOCAL(c128_w), r1
3280         div0u
3281         mov r4,r0
3282         shlr8 r0
3283         cmp/hi r1,r5
3284         extu.w r5,r1
3285         bf LOCAL(udiv_le128)
3286         cmp/eq r5,r1
3287         bf LOCAL(udiv_ge64k)
3288         shlr r0
3289         mov r5,r1
3290         shll16 r5
3291         mov.l r4,@-r15
3292         div1 r5,r0
3293         mov.l r1,@-r15
3294         div1 r5,r0
3295         div1 r5,r0
3296         bra LOCAL(udiv_25)
3297         div1 r5,r0
3298
3299 LOCAL(div_le128):
3300         mova LOCAL(div_table_ix),r0
3301         bra LOCAL(div_le128_2)
3302         mov.b @(r0,r5),r1
3303 LOCAL(udiv_le128):
3304         mov.l r4,@-r15
3305         mova LOCAL(div_table_ix),r0
3306         mov.b @(r0,r5),r1
3307         mov.l r5,@-r15
3308 LOCAL(div_le128_2):
3309         mova LOCAL(div_table_inv),r0
3310         mov.l @(r0,r1),r1
3311         mov r5,r0
3312         tst #0xfe,r0
3313         mova LOCAL(div_table_clz),r0
3314         dmulu.l r1,r4
3315         mov.b @(r0,r5),r1
3316         bt/s LOCAL(div_by_1)
3317         mov r4,r0
3318         mov.l @r15+,r5
3319         sts mach,r0
3320         /* clrt */
3321         addc r4,r0
3322         mov.l @r15+,r4
3323         rotcr r0
3324         rts
3325         shld r1,r0
3326
3327 LOCAL(div_by_1_neg):
3328         neg r4,r0
3329 LOCAL(div_by_1):
3330         mov.l @r15+,r5
3331         rts
3332         mov.l @r15+,r4
3333
3334 LOCAL(div_ge64k):
3335         bt/s LOCAL(div_r8)
3336         div0u
3337         shll8 r5
3338         bra LOCAL(div_ge64k_2)
3339         div1 r5,r0
3340 LOCAL(udiv_ge64k):
3341         cmp/hi r0,r5
3342         mov r5,r1
3343         bt LOCAL(udiv_r8)
3344         shll8 r5
3345         mov.l r4,@-r15
3346         div1 r5,r0
3347         mov.l r1,@-r15
3348 LOCAL(div_ge64k_2):
3349         div1 r5,r0
3350         mov.l LOCAL(zero_l),r1
3351         .rept 4
3352         div1 r5,r0
3353         .endr
3354         mov.l r1,@-r15
3355         div1 r5,r0
3356         mov.w LOCAL(m256_w),r1
3357         div1 r5,r0
3358         mov.b r0,@(L_LSWMSB,r15)
3359         xor r4,r0
3360         and r1,r0
3361         bra LOCAL(div_ge64k_end)
3362         xor r4,r0
3363         
3364 LOCAL(div_r8):
3365         shll16 r4
3366         bra LOCAL(div_r8_2)
3367         shll8 r4
3368 LOCAL(udiv_r8):
3369         mov.l r4,@-r15
3370         shll16 r4
3371         clrt
3372         shll8 r4
3373         mov.l r5,@-r15
3374 LOCAL(div_r8_2):
3375         rotcl r4
3376         mov r0,r1
3377         div1 r5,r1
3378         mov r4,r0
3379         rotcl r0
3380         mov r5,r4
3381         div1 r5,r1
3382         .rept 5
3383         rotcl r0; div1 r5,r1
3384         .endr
3385         rotcl r0
3386         mov.l @r15+,r5
3387         div1 r4,r1
3388         mov.l @r15+,r4
3389         rts
3390         rotcl r0
3391
3392         ENDFUNC(GLOBAL(udivsi3_i4i))
3393
3394         .global GLOBAL(sdivsi3_i4i)
3395         FUNC(GLOBAL(sdivsi3_i4i))
3396         /* This is link-compatible with a GLOBAL(sdivsi3) call,
3397            but we effectively clobber only r1.  */
3398 GLOBAL(sdivsi3_i4i):
3399         mov.l r4,@-r15
3400         cmp/pz r5
3401         mov.w LOCAL(c128_w), r1
3402         bt/s LOCAL(pos_divisor)
3403         cmp/pz r4
3404         mov.l r5,@-r15
3405         neg r5,r5
3406         bt/s LOCAL(neg_result)
3407         cmp/hi r1,r5
3408         neg r4,r4
3409 LOCAL(pos_result):
3410         extu.w r5,r0
3411         bf LOCAL(div_le128)
3412         cmp/eq r5,r0
3413         mov r4,r0
3414         shlr8 r0
3415         bf/s LOCAL(div_ge64k)
3416         cmp/hi r0,r5
3417         div0u
3418         shll16 r5
3419         div1 r5,r0
3420         div1 r5,r0
3421         div1 r5,r0
3422 LOCAL(udiv_25):
3423         mov.l LOCAL(zero_l),r1
3424         div1 r5,r0
3425         div1 r5,r0
3426         mov.l r1,@-r15
3427         .rept 3
3428         div1 r5,r0
3429         .endr
3430         mov.b r0,@(L_MSWLSB,r15)
3431         xtrct r4,r0
3432         swap.w r0,r0
3433         .rept 8
3434         div1 r5,r0
3435         .endr
3436         mov.b r0,@(L_LSWMSB,r15)
3437 LOCAL(div_ge64k_end):
3438         .rept 8
3439         div1 r5,r0
3440         .endr
3441         mov.l @r15+,r4 ! zero-extension and swap using LS unit.
3442         extu.b r0,r0
3443         mov.l @r15+,r5
3444         or r4,r0
3445         mov.l @r15+,r4
3446         rts
3447         rotcl r0
3448
3449 LOCAL(div_le128_neg):
3450         tst #0xfe,r0
3451         mova LOCAL(div_table_ix),r0
3452         mov.b @(r0,r5),r1
3453         mova LOCAL(div_table_inv),r0
3454         bt/s LOCAL(div_by_1_neg)
3455         mov.l @(r0,r1),r1
3456         mova LOCAL(div_table_clz),r0
3457         dmulu.l r1,r4
3458         mov.b @(r0,r5),r1
3459         mov.l @r15+,r5
3460         sts mach,r0
3461         /* clrt */
3462         addc r4,r0
3463         mov.l @r15+,r4
3464         rotcr r0
3465         shld r1,r0
3466         rts
3467         neg r0,r0
3468
3469 LOCAL(pos_divisor):
3470         mov.l r5,@-r15
3471         bt/s LOCAL(pos_result)
3472         cmp/hi r1,r5
3473         neg r4,r4
3474 LOCAL(neg_result):
3475         extu.w r5,r0
3476         bf LOCAL(div_le128_neg)
3477         cmp/eq r5,r0
3478         mov r4,r0
3479         shlr8 r0
3480         bf/s LOCAL(div_ge64k_neg)
3481         cmp/hi r0,r5
3482         div0u
3483         mov.l LOCAL(zero_l),r1
3484         shll16 r5
3485         div1 r5,r0
3486         mov.l r1,@-r15
3487         .rept 7
3488         div1 r5,r0
3489         .endr
3490         mov.b r0,@(L_MSWLSB,r15)
3491         xtrct r4,r0
3492         swap.w r0,r0
3493         .rept 8
3494         div1 r5,r0
3495         .endr
3496         mov.b r0,@(L_LSWMSB,r15)
3497 LOCAL(div_ge64k_neg_end):
3498         .rept 8
3499         div1 r5,r0
3500         .endr
3501         mov.l @r15+,r4 ! zero-extension and swap using LS unit.
3502         extu.b r0,r1
3503         mov.l @r15+,r5
3504         or r4,r1
3505 LOCAL(div_r8_neg_end):
3506         mov.l @r15+,r4
3507         rotcl r1
3508         rts
3509         neg r1,r0
3510
3511 LOCAL(div_ge64k_neg):
3512         bt/s LOCAL(div_r8_neg)
3513         div0u
3514         shll8 r5
3515         mov.l LOCAL(zero_l),r1
3516         .rept 6
3517         div1 r5,r0
3518         .endr
3519         mov.l r1,@-r15
3520         div1 r5,r0
3521         mov.w LOCAL(m256_w),r1
3522         div1 r5,r0
3523         mov.b r0,@(L_LSWMSB,r15)
3524         xor r4,r0
3525         and r1,r0
3526         bra LOCAL(div_ge64k_neg_end)
3527         xor r4,r0
3528
3529 LOCAL(c128_w):
3530         .word 128
3531
3532 LOCAL(div_r8_neg):
3533         clrt
3534         shll16 r4
3535         mov r4,r1
3536         shll8 r1
3537         mov r5,r4
3538         .rept 7
3539         rotcl r1; div1 r5,r0
3540         .endr
3541         mov.l @r15+,r5
3542         rotcl r1
3543         bra LOCAL(div_r8_neg_end)
3544         div1 r4,r0
3545
3546 LOCAL(m256_w):
3547         .word 0xff00
3548 /* This table has been generated by divtab-sh4.c.  */
3549         .balign 4
3550 LOCAL(div_table_clz):
3551         .byte   0
3552         .byte   1
3553         .byte   0
3554         .byte   -1
3555         .byte   -1
3556         .byte   -2
3557         .byte   -2
3558         .byte   -2
3559         .byte   -2
3560         .byte   -3
3561         .byte   -3
3562         .byte   -3
3563         .byte   -3
3564         .byte   -3
3565         .byte   -3
3566         .byte   -3
3567         .byte   -3
3568         .byte   -4
3569         .byte   -4
3570         .byte   -4
3571         .byte   -4
3572         .byte   -4
3573         .byte   -4
3574         .byte   -4
3575         .byte   -4
3576         .byte   -4
3577         .byte   -4
3578         .byte   -4
3579         .byte   -4
3580         .byte   -4
3581         .byte   -4
3582         .byte   -4
3583         .byte   -4
3584         .byte   -5
3585         .byte   -5
3586         .byte   -5
3587         .byte   -5
3588         .byte   -5
3589         .byte   -5
3590         .byte   -5
3591         .byte   -5
3592         .byte   -5
3593         .byte   -5
3594         .byte   -5
3595         .byte   -5
3596         .byte   -5
3597         .byte   -5
3598         .byte   -5
3599         .byte   -5
3600         .byte   -5
3601         .byte   -5
3602         .byte   -5
3603         .byte   -5
3604         .byte   -5
3605         .byte   -5
3606         .byte   -5
3607         .byte   -5
3608         .byte   -5
3609         .byte   -5
3610         .byte   -5
3611         .byte   -5
3612         .byte   -5
3613         .byte   -5
3614         .byte   -5
3615         .byte   -5
3616         .byte   -6
3617         .byte   -6
3618         .byte   -6
3619         .byte   -6
3620         .byte   -6
3621         .byte   -6
3622         .byte   -6
3623         .byte   -6
3624         .byte   -6
3625         .byte   -6
3626         .byte   -6
3627         .byte   -6
3628         .byte   -6
3629         .byte   -6
3630         .byte   -6
3631         .byte   -6
3632         .byte   -6
3633         .byte   -6
3634         .byte   -6
3635         .byte   -6
3636         .byte   -6
3637         .byte   -6
3638         .byte   -6
3639         .byte   -6
3640         .byte   -6
3641         .byte   -6
3642         .byte   -6
3643         .byte   -6
3644         .byte   -6
3645         .byte   -6
3646         .byte   -6
3647         .byte   -6
3648         .byte   -6
3649         .byte   -6
3650         .byte   -6
3651         .byte   -6
3652         .byte   -6
3653         .byte   -6
3654         .byte   -6
3655         .byte   -6
3656         .byte   -6
3657         .byte   -6
3658         .byte   -6
3659         .byte   -6
3660         .byte   -6
3661         .byte   -6
3662         .byte   -6
3663         .byte   -6
3664         .byte   -6
3665         .byte   -6
3666         .byte   -6
3667         .byte   -6
3668         .byte   -6
3669         .byte   -6
3670         .byte   -6
3671         .byte   -6
3672         .byte   -6
3673         .byte   -6
3674         .byte   -6
3675         .byte   -6
3676         .byte   -6
3677         .byte   -6
3678         .byte   -6
3679 /* Lookup table translating positive divisor to index into table of
3680    normalized inverse.  N.B. the '0' entry is also the last entry of the
3681  previous table, and causes an unaligned access for division by zero.  */
3682 LOCAL(div_table_ix):
3683         .byte   -6
3684         .byte   -128
3685         .byte   -128
3686         .byte   0
3687         .byte   -128
3688         .byte   -64
3689         .byte   0
3690         .byte   64
3691         .byte   -128
3692         .byte   -96
3693         .byte   -64
3694         .byte   -32
3695         .byte   0
3696         .byte   32
3697         .byte   64
3698         .byte   96
3699         .byte   -128
3700         .byte   -112
3701         .byte   -96
3702         .byte   -80
3703         .byte   -64
3704         .byte   -48
3705         .byte   -32
3706         .byte   -16
3707         .byte   0
3708         .byte   16
3709         .byte   32
3710         .byte   48
3711         .byte   64
3712         .byte   80
3713         .byte   96
3714         .byte   112
3715         .byte   -128
3716         .byte   -120
3717         .byte   -112
3718         .byte   -104
3719         .byte   -96
3720         .byte   -88
3721         .byte   -80
3722         .byte   -72
3723         .byte   -64
3724         .byte   -56
3725         .byte   -48
3726         .byte   -40
3727         .byte   -32
3728         .byte   -24
3729         .byte   -16
3730         .byte   -8
3731         .byte   0
3732         .byte   8
3733         .byte   16
3734         .byte   24
3735         .byte   32
3736         .byte   40
3737         .byte   48
3738         .byte   56
3739         .byte   64
3740         .byte   72
3741         .byte   80
3742         .byte   88
3743         .byte   96
3744         .byte   104
3745         .byte   112
3746         .byte   120
3747         .byte   -128
3748         .byte   -124
3749         .byte   -120
3750         .byte   -116
3751         .byte   -112
3752         .byte   -108
3753         .byte   -104
3754         .byte   -100
3755         .byte   -96
3756         .byte   -92
3757         .byte   -88
3758         .byte   -84
3759         .byte   -80
3760         .byte   -76
3761         .byte   -72
3762         .byte   -68
3763         .byte   -64
3764         .byte   -60
3765         .byte   -56
3766         .byte   -52
3767         .byte   -48
3768         .byte   -44
3769         .byte   -40
3770         .byte   -36
3771         .byte   -32
3772         .byte   -28
3773         .byte   -24
3774         .byte   -20
3775         .byte   -16
3776         .byte   -12
3777         .byte   -8
3778         .byte   -4
3779         .byte   0
3780         .byte   4
3781         .byte   8
3782         .byte   12
3783         .byte   16
3784         .byte   20
3785         .byte   24
3786         .byte   28
3787         .byte   32
3788         .byte   36
3789         .byte   40
3790         .byte   44
3791         .byte   48
3792         .byte   52
3793         .byte   56
3794         .byte   60
3795         .byte   64
3796         .byte   68
3797         .byte   72
3798         .byte   76
3799         .byte   80
3800         .byte   84
3801         .byte   88
3802         .byte   92
3803         .byte   96
3804         .byte   100
3805         .byte   104
3806         .byte   108
3807         .byte   112
3808         .byte   116
3809         .byte   120
3810         .byte   124
3811         .byte   -128
3812 /* 1/64 .. 1/127, normalized.  There is an implicit leading 1 in bit 32.  */
3813         .balign 4
3814 LOCAL(zero_l):
3815         .long   0x0
3816         .long   0xF81F81F9
3817         .long   0xF07C1F08
3818         .long   0xE9131AC0
3819         .long   0xE1E1E1E2
3820         .long   0xDAE6076C
3821         .long   0xD41D41D5
3822         .long   0xCD856891
3823         .long   0xC71C71C8
3824         .long   0xC0E07039
3825         .long   0xBACF914D
3826         .long   0xB4E81B4F
3827         .long   0xAF286BCB
3828         .long   0xA98EF607
3829         .long   0xA41A41A5
3830         .long   0x9EC8E952
3831         .long   0x9999999A
3832         .long   0x948B0FCE
3833         .long   0x8F9C18FA
3834         .long   0x8ACB90F7
3835         .long   0x86186187
3836         .long   0x81818182
3837         .long   0x7D05F418
3838         .long   0x78A4C818
3839         .long   0x745D1746
3840         .long   0x702E05C1
3841         .long   0x6C16C16D
3842         .long   0x68168169
3843         .long   0x642C8591
3844         .long   0x60581606
3845         .long   0x5C9882BA
3846         .long   0x58ED2309
3847 LOCAL(div_table_inv):
3848         .long   0x55555556
3849         .long   0x51D07EAF
3850         .long   0x4E5E0A73
3851         .long   0x4AFD6A06
3852         .long   0x47AE147B
3853         .long   0x446F8657
3854         .long   0x41414142
3855         .long   0x3E22CBCF
3856         .long   0x3B13B13C
3857         .long   0x38138139
3858         .long   0x3521CFB3
3859         .long   0x323E34A3
3860         .long   0x2F684BDB
3861         .long   0x2C9FB4D9
3862         .long   0x29E4129F
3863         .long   0x27350B89
3864         .long   0x24924925
3865         .long   0x21FB7813
3866         .long   0x1F7047DD
3867         .long   0x1CF06ADB
3868         .long   0x1A7B9612
3869         .long   0x18118119
3870         .long   0x15B1E5F8
3871         .long   0x135C8114
3872         .long   0x11111112
3873         .long   0xECF56BF
3874         .long   0xC9714FC
3875         .long   0xA6810A7
3876         .long   0x8421085
3877         .long   0x624DD30
3878         .long   0x4104105
3879         .long   0x2040811
3880         /* maximum error: 0.987342 scaled: 0.921875*/
3881
3882         ENDFUNC(GLOBAL(sdivsi3_i4i))
3883 #endif /* SH3 / SH4 */
3884
3885 #endif /* L_div_table */
3886
3887 #ifdef L_udiv_qrnnd_16
3888 #if !__SHMEDIA__
3889         HIDDEN_FUNC(GLOBAL(udiv_qrnnd_16))
3890         /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */
3891         /* n1 < d, but n1 might be larger than d1.  */
3892         .global GLOBAL(udiv_qrnnd_16)
3893         .balign 8
3894 GLOBAL(udiv_qrnnd_16):
3895         div0u
3896         cmp/hi r6,r0
3897         bt .Lots
3898         .rept 16
3899         div1 r6,r0 
3900         .endr
3901         extu.w r0,r1
3902         bt 0f
3903         add r6,r0
3904 0:      rotcl r1
3905         mulu.w r1,r5
3906         xtrct r4,r0
3907         swap.w r0,r0
3908         sts macl,r2
3909         cmp/hs r2,r0
3910         sub r2,r0
3911         bt 0f
3912         addc r5,r0
3913         add #-1,r1
3914         bt 0f
3915 1:      add #-1,r1
3916         rts
3917         add r5,r0
3918         .balign 8
3919 .Lots:
3920         sub r5,r0
3921         swap.w r4,r1
3922         xtrct r0,r1
3923         clrt
3924         mov r1,r0
3925         addc r5,r0
3926         mov #-1,r1
3927         SL1(bf, 1b,
3928         shlr16 r1)
3929 0:      rts
3930         nop
3931         ENDFUNC(GLOBAL(udiv_qrnnd_16))
3932 #endif /* !__SHMEDIA__ */
3933 #endif /* L_udiv_qrnnd_16 */