OSDN Git Service

* a29k/t-a29kbare: Fix some comments.
[pf3gnuchains/gcc-fork.git] / gcc / config / pa / lib1funcs.asm
1 ;  Low level integer divide, multiply, remainder, etc routines for the HPPA.
2 ;  Copyright (C) 1995 Free Software Foundation, Inc.
3
4 ;  This file is part of GNU CC.
5
6 ;  GNU CC is free software; you can redistribute it and/or modify
7 ;  it under the terms of the GNU General Public License as published by
8 ;  the Free Software Foundation; either version 2, or (at your option)
9 ;  any later version.
10
11 ; In addition to the permissions in the GNU General Public License, the
12 ; Free Software Foundation gives you unlimited permission to link the
13 ; compiled version of this file with other programs, and to distribute
14 ; those programs without any restriction coming from the use of this
15 ; file.  (The General Public License restrictions do apply in other
16 ; respects; for example, they cover modification of the file, and
17 ; distribution when not linked into another program.)
18
19 ;  GNU CC is distributed in the hope that it will be useful,
20 ;  but WITHOUT ANY WARRANTY; without even the implied warranty of
21 ;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 ;  GNU General Public License for more details.
23
24 ;  You should have received a copy of the GNU General Public License
25 ;  along with GNU CC; see the file COPYING.  If not, write to
26 ;  the Free Software Foundation, 59 Temple Place - Suite 330,
27 ;  Boston, MA 02111-1307, USA.
28
29 #ifdef L_dyncall
30         .space  $TEXT$
31         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
32         .export $$dyncall
33 $$dyncall
34         .proc
35         .callinfo       frame=0,no_calls
36         .entry
37         bb,>=,n %r22,30,L$1             ; branch if not plabel address
38         depi    0,31,2,%r22             ; clear the two least significant bits
39         ldw     4(%sr0,%r22),%r19       ; load new LTP value
40         ldw     0(%sr0,%r22),%r22       ; load address of target
41 L$1     ldsid   (%sr0,%r22),%r1         ; get the "space ident" selected by r22
42         mtsp    %r1,%sr0                ; move that space identifier into sr0
43         be      0(%sr0,%r22)            ; branch to the real target
44         stw     %r2,-24(%sr0,%r30)      ; save return address into frame marker
45         .exit
46         .procend
47 #endif
48
49
50 #ifdef L_multiply
51 #define op0     %r26
52 #define op1     %r25
53 #define res     %r29
54 #define ret     %r31
55 #define tmp     %r1
56         .space  $TEXT$
57         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
58         .align 4
59         .export $$mulU
60         .export $$mulI
61 $$mulU
62 $$mulI
63         .proc
64         .callinfo       frame=0,no_calls
65         .entry
66         addi,tr         0,%r0,res       ; clear out res, skip next insn
67 L$loop  zdep            op1,26,27,op1   ; shift up op1 by 5
68 L$lo    zdep            op0,30,5,tmp    ; extract next 5 bits and shift up
69         blr             tmp,%r0
70         extru           op0,26,27,op0   ; shift down op0 by 5
71 L$0     comib,<>        0,op0,L$lo
72         zdep            op1,26,27,op1   ; shift up op1 by 5
73         bv              %r0(ret)
74         nop
75 L$1     b               L$loop
76         addl            op1,res,res
77         nop
78         nop
79 L$2     b               L$loop
80         sh1addl         op1,res,res
81         nop
82         nop
83 L$3     sh1addl         op1,op1,tmp     ; 3x
84         b               L$loop
85         addl            tmp,res,res
86         nop
87 L$4     b               L$loop
88         sh2addl         op1,res,res
89         nop
90         nop
91 L$5     sh2addl         op1,op1,tmp     ; 5x
92         b               L$loop
93         addl            tmp,res,res
94         nop
95 L$6     sh1addl         op1,op1,tmp     ; 3x
96         b               L$loop
97         sh1addl         tmp,res,res
98         nop
99 L$7     zdep            op1,28,29,tmp   ; 8x
100         sub             tmp,op1,tmp     ; 7x
101         b               L$loop
102         addl            tmp,res,res
103 L$8     b               L$loop
104         sh3addl         op1,res,res
105         nop
106         nop
107 L$9     sh3addl         op1,op1,tmp     ; 9x
108         b               L$loop
109         addl            tmp,res,res
110         nop
111 L$10    sh2addl         op1,op1,tmp     ; 5x
112         b               L$loop
113         sh1addl         tmp,res,res
114         nop
115 L$11    sh2addl         op1,op1,tmp     ; 5x
116         sh1addl         tmp,op1,tmp     ; 11x
117         b               L$loop
118         addl            tmp,res,res
119 L$12    sh1addl         op1,op1,tmp     ; 3x
120         b               L$loop
121         sh2addl         tmp,res,res
122         nop
123 L$13    sh1addl         op1,op1,tmp     ; 3x
124         sh2addl         tmp,op1,tmp     ; 13x
125         b               L$loop
126         addl            tmp,res,res
127 L$14    zdep            op1,28,29,tmp   ; 8x
128         sub             tmp,op1,tmp     ; 7x
129         b               L$loop
130         sh1addl         tmp,res,res
131 L$15    zdep            op1,27,28,tmp   ; 16x
132         sub             tmp,op1,tmp     ; 15x
133         b               L$loop
134         addl            tmp,res,res
135 L$16    zdep            op1,27,28,tmp   ; 16x
136         b               L$loop
137         addl            tmp,res,res
138         nop
139 L$17    zdep            op1,27,28,tmp   ; 16x
140         addl            tmp,op1,tmp     ; 17x
141         b               L$loop
142         addl            tmp,res,res
143 L$18    sh3addl         op1,op1,tmp     ; 9x
144         b               L$loop
145         sh1addl         tmp,res,res
146         nop
147 L$19    sh3addl         op1,op1,tmp     ; 9x
148         sh1addl         tmp,op1,tmp     ; 19x
149         b               L$loop
150         addl            tmp,res,res
151 L$20    sh2addl         op1,op1,tmp     ; 5x
152         b               L$loop
153         sh2addl         tmp,res,res
154         nop
155 L$21    sh2addl         op1,op1,tmp     ; 5x
156         sh2addl         tmp,op1,tmp     ; 21x
157         b               L$loop
158         addl            tmp,res,res
159 L$22    sh2addl         op1,op1,tmp     ; 5x
160         sh1addl         tmp,op1,tmp     ; 11x
161         b               L$loop
162         sh1addl         tmp,res,res
163 L$23    sh1addl         op1,op1,tmp     ; 3x
164         sh3addl         tmp,res,res     ; += 8x3
165         b               L$loop
166         sub             res,op1,res     ; -= x
167 L$24    sh1addl         op1,op1,tmp     ; 3x
168         b               L$loop
169         sh3addl         tmp,res,res     ; += 8x3
170         nop
171 L$25    sh2addl         op1,op1,tmp     ; 5x
172         sh2addl         tmp,tmp,tmp     ; 25x
173         b               L$loop
174         addl            tmp,res,res
175 L$26    sh1addl         op1,op1,tmp     ; 3x
176         sh2addl         tmp,op1,tmp     ; 13x
177         b               L$loop
178         sh1addl         tmp,res,res     ; += 2x13
179 L$27    sh1addl         op1,op1,tmp     ; 3x
180         sh3addl         tmp,tmp,tmp     ; 27x
181         b               L$loop
182         addl            tmp,res,res
183 L$28    zdep            op1,28,29,tmp   ; 8x
184         sub             tmp,op1,tmp     ; 7x
185         b               L$loop
186         sh2addl         tmp,res,res     ; += 4x7
187 L$29    sh1addl         op1,op1,tmp     ; 3x
188         sub             res,tmp,res     ; -= 3x
189         b               L$foo
190         zdep            op1,26,27,tmp   ; 32x
191 L$30    zdep            op1,27,28,tmp   ; 16x
192         sub             tmp,op1,tmp     ; 15x
193         b               L$loop
194         sh1addl         tmp,res,res     ; += 2x15
195 L$31    zdep            op1,26,27,tmp   ; 32x
196         sub             tmp,op1,tmp     ; 31x
197 L$foo   b               L$loop
198         addl            tmp,res,res
199         .exit
200         .procend
201 #endif
202
203
204 #ifdef L_divU
205 #define dividend %r26
206 #define divisor %r25
207 #define tmp %r1
208 #define quotient %r29
209 #define ret %r31
210         .space  $TEXT$
211         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
212         .align 4
213         .export $$divU
214 $$divU
215         .proc
216         .callinfo       frame=0,no_calls
217         .entry
218         comb,<          divisor,0,L$largedivisor
219          sub            %r0,divisor,%r1         ; clear cy as side-effect
220         ds              %r0,%r1,%r0
221         addc            dividend,dividend,dividend
222         ds              %r0,divisor,%r1
223         addc            dividend,dividend,dividend
224         ds              %r1,divisor,%r1
225         addc            dividend,dividend,dividend
226         ds              %r1,divisor,%r1
227         addc            dividend,dividend,dividend
228         ds              %r1,divisor,%r1
229         addc            dividend,dividend,dividend
230         ds              %r1,divisor,%r1
231         addc            dividend,dividend,dividend
232         ds              %r1,divisor,%r1
233         addc            dividend,dividend,dividend
234         ds              %r1,divisor,%r1
235         addc            dividend,dividend,dividend
236         ds              %r1,divisor,%r1
237         addc            dividend,dividend,dividend
238         ds              %r1,divisor,%r1
239         addc            dividend,dividend,dividend
240         ds              %r1,divisor,%r1
241         addc            dividend,dividend,dividend
242         ds              %r1,divisor,%r1
243         addc            dividend,dividend,dividend
244         ds              %r1,divisor,%r1
245         addc            dividend,dividend,dividend
246         ds              %r1,divisor,%r1
247         addc            dividend,dividend,dividend
248         ds              %r1,divisor,%r1
249         addc            dividend,dividend,dividend
250         ds              %r1,divisor,%r1
251         addc            dividend,dividend,dividend
252         ds              %r1,divisor,%r1
253         addc            dividend,dividend,dividend
254         ds              %r1,divisor,%r1
255         addc            dividend,dividend,dividend
256         ds              %r1,divisor,%r1
257         addc            dividend,dividend,dividend
258         ds              %r1,divisor,%r1
259         addc            dividend,dividend,dividend
260         ds              %r1,divisor,%r1
261         addc            dividend,dividend,dividend
262         ds              %r1,divisor,%r1
263         addc            dividend,dividend,dividend
264         ds              %r1,divisor,%r1
265         addc            dividend,dividend,dividend
266         ds              %r1,divisor,%r1
267         addc            dividend,dividend,dividend
268         ds              %r1,divisor,%r1
269         addc            dividend,dividend,dividend
270         ds              %r1,divisor,%r1
271         addc            dividend,dividend,dividend
272         ds              %r1,divisor,%r1
273         addc            dividend,dividend,dividend
274         ds              %r1,divisor,%r1
275         addc            dividend,dividend,dividend
276         ds              %r1,divisor,%r1
277         addc            dividend,dividend,dividend
278         ds              %r1,divisor,%r1
279         addc            dividend,dividend,dividend
280         ds              %r1,divisor,%r1
281         addc            dividend,dividend,dividend
282         ds              %r1,divisor,%r1
283         addc            dividend,dividend,quotient
284         ds              %r1,divisor,%r1
285         bv              %r0(ret)
286         addc            quotient,quotient,quotient
287 L$largedivisor
288         comclr,<<       dividend,divisor,quotient
289         ldi             1,quotient
290         bv,n            %r0(ret)
291         .exit
292         .procend
293 #endif
294
295
296 #ifdef L_remU
297 #define dividend %r26
298 #define divisor %r25
299 #define quotient %r29
300 #define tmp %r1
301 #define ret %r31
302         .space  $TEXT$
303         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
304         .align 4
305         .export $$remU
306 $$remU
307         .proc
308         .callinfo       frame=0,no_calls
309         .entry
310         comb,<          divisor,0,L$largedivisor
311          sub            %r0,divisor,%r1         ; clear cy as side-effect
312         ds              %r0,%r1,%r0
313         addc            dividend,dividend,dividend
314         ds              %r0,divisor,%r1
315         addc            dividend,dividend,dividend
316         ds              %r1,divisor,%r1
317         addc            dividend,dividend,dividend
318         ds              %r1,divisor,%r1
319         addc            dividend,dividend,dividend
320         ds              %r1,divisor,%r1
321         addc            dividend,dividend,dividend
322         ds              %r1,divisor,%r1
323         addc            dividend,dividend,dividend
324         ds              %r1,divisor,%r1
325         addc            dividend,dividend,dividend
326         ds              %r1,divisor,%r1
327         addc            dividend,dividend,dividend
328         ds              %r1,divisor,%r1
329         addc            dividend,dividend,dividend
330         ds              %r1,divisor,%r1
331         addc            dividend,dividend,dividend
332         ds              %r1,divisor,%r1
333         addc            dividend,dividend,dividend
334         ds              %r1,divisor,%r1
335         addc            dividend,dividend,dividend
336         ds              %r1,divisor,%r1
337         addc            dividend,dividend,dividend
338         ds              %r1,divisor,%r1
339         addc            dividend,dividend,dividend
340         ds              %r1,divisor,%r1
341         addc            dividend,dividend,dividend
342         ds              %r1,divisor,%r1
343         addc            dividend,dividend,dividend
344         ds              %r1,divisor,%r1
345         addc            dividend,dividend,dividend
346         ds              %r1,divisor,%r1
347         addc            dividend,dividend,dividend
348         ds              %r1,divisor,%r1
349         addc            dividend,dividend,dividend
350         ds              %r1,divisor,%r1
351         addc            dividend,dividend,dividend
352         ds              %r1,divisor,%r1
353         addc            dividend,dividend,dividend
354         ds              %r1,divisor,%r1
355         addc            dividend,dividend,dividend
356         ds              %r1,divisor,%r1
357         addc            dividend,dividend,dividend
358         ds              %r1,divisor,%r1
359         addc            dividend,dividend,dividend
360         ds              %r1,divisor,%r1
361         addc            dividend,dividend,dividend
362         ds              %r1,divisor,%r1
363         addc            dividend,dividend,dividend
364         ds              %r1,divisor,%r1
365         addc            dividend,dividend,dividend
366         ds              %r1,divisor,%r1
367         addc            dividend,dividend,dividend
368         ds              %r1,divisor,%r1
369         addc            dividend,dividend,dividend
370         ds              %r1,divisor,%r1
371         addc            dividend,dividend,dividend
372         ds              %r1,divisor,%r1
373         addc            dividend,dividend,dividend
374         ds              %r1,divisor,%r1
375         addc            dividend,dividend,quotient
376         ds              %r1,divisor,%r1
377         comclr,>=       %r1,%r0,%r0
378         addl            %r1,divisor,%r1
379         bv              %r0(ret)
380         copy            %r1,quotient
381 L$largedivisor
382         sub,>>=         dividend,divisor,quotient
383         copy            dividend,quotient
384         bv,n            %r0(ret)
385         .exit
386         .procend
387 #endif
388
389
390 #ifdef L_divI
391 #define dividend %r26
392 #define divisor %r25
393 #define quotient %r29
394 #define tmp %r1
395 #define ret %r31
396         .space  $TEXT$
397         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
398         .align 4
399         .export $$divI
400 $$divI
401         .proc
402         .callinfo       frame=0,no_calls
403         .entry
404         xor             dividend,divisor,quotient       ; result sign
405         comclr,>=       divisor,%r0,%r0                 ; get absolute values
406         sub             %r0,divisor,divisor
407         comclr,>=       dividend,%r0,%r0
408         sub             %r0,dividend,dividend
409
410         comb,<          divisor,0,L$largedivisor
411          sub            %r0,divisor,%r1         ; clear cy as side-effect
412         ds              %r0,%r1,%r0
413         addc            dividend,dividend,dividend
414         ds              %r0,divisor,%r1
415         addc            dividend,dividend,dividend
416         ds              %r1,divisor,%r1
417         addc            dividend,dividend,dividend
418         ds              %r1,divisor,%r1
419         addc            dividend,dividend,dividend
420         ds              %r1,divisor,%r1
421         addc            dividend,dividend,dividend
422         ds              %r1,divisor,%r1
423         addc            dividend,dividend,dividend
424         ds              %r1,divisor,%r1
425         addc            dividend,dividend,dividend
426         ds              %r1,divisor,%r1
427         addc            dividend,dividend,dividend
428         ds              %r1,divisor,%r1
429         addc            dividend,dividend,dividend
430         ds              %r1,divisor,%r1
431         addc            dividend,dividend,dividend
432         ds              %r1,divisor,%r1
433         addc            dividend,dividend,dividend
434         ds              %r1,divisor,%r1
435         addc            dividend,dividend,dividend
436         ds              %r1,divisor,%r1
437         addc            dividend,dividend,dividend
438         ds              %r1,divisor,%r1
439         addc            dividend,dividend,dividend
440         ds              %r1,divisor,%r1
441         addc            dividend,dividend,dividend
442         ds              %r1,divisor,%r1
443         addc            dividend,dividend,dividend
444         ds              %r1,divisor,%r1
445         addc            dividend,dividend,dividend
446         ds              %r1,divisor,%r1
447         addc            dividend,dividend,dividend
448         ds              %r1,divisor,%r1
449         addc            dividend,dividend,dividend
450         ds              %r1,divisor,%r1
451         addc            dividend,dividend,dividend
452         ds              %r1,divisor,%r1
453         addc            dividend,dividend,dividend
454         ds              %r1,divisor,%r1
455         addc            dividend,dividend,dividend
456         ds              %r1,divisor,%r1
457         addc            dividend,dividend,dividend
458         ds              %r1,divisor,%r1
459         addc            dividend,dividend,dividend
460         ds              %r1,divisor,%r1
461         addc            dividend,dividend,dividend
462         ds              %r1,divisor,%r1
463         addc            dividend,dividend,dividend
464         ds              %r1,divisor,%r1
465         addc            dividend,dividend,dividend
466         ds              %r1,divisor,%r1
467         addc            dividend,dividend,dividend
468         ds              %r1,divisor,%r1
469         addc            dividend,dividend,dividend
470         ds              %r1,divisor,%r1
471         addc            dividend,dividend,dividend
472         ds              %r1,divisor,%r1
473         addc            dividend,dividend,dividend
474         ds              %r1,divisor,%r1
475         addc            dividend,dividend,dividend
476         ds              %r1,divisor,%r1
477         addc            dividend,dividend,dividend
478         comclr,>=       %r1,%r0,%r0
479         addl            %r1,divisor,%r1
480         comclr,>=       quotient,%r0,%r0        ; skip of no need to negate
481         sub             %r0,dividend,dividend
482         bv              %r0(ret)
483         copy            dividend,quotient
484 L$largedivisor
485         comclr,<<       dividend,divisor,quotient
486         ldi             1,quotient
487         bv,n            %r0(ret)
488         .exit
489         .procend
490 #endif
491
492
493 #ifdef L_remI
494 #define dividend %r26
495 #define divisor %r25
496 #define quotient %r29
497 #define tmp %r1
498 #define ret %r31
499         .space  $TEXT$
500         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
501         .align 4
502         .export $$remI
503 $$remI
504         .proc
505         .callinfo       frame=0,no_calls
506         .entry
507         xor             dividend,%r0,quotient           ; result sign
508         comclr,>=       divisor,%r0,%r0                 ; get absolute values
509         sub             %r0,divisor,divisor
510         comclr,>=       dividend,%r0,%r0
511         sub             %r0,dividend,dividend
512
513         comb,<          divisor,0,L$largedivisor
514          sub            %r0,divisor,%r1         ; clear cy as side-effect
515         ds              %r0,%r1,%r0
516         addc            dividend,dividend,dividend
517         ds              %r0,divisor,%r1
518         addc            dividend,dividend,dividend
519         ds              %r1,divisor,%r1
520         addc            dividend,dividend,dividend
521         ds              %r1,divisor,%r1
522         addc            dividend,dividend,dividend
523         ds              %r1,divisor,%r1
524         addc            dividend,dividend,dividend
525         ds              %r1,divisor,%r1
526         addc            dividend,dividend,dividend
527         ds              %r1,divisor,%r1
528         addc            dividend,dividend,dividend
529         ds              %r1,divisor,%r1
530         addc            dividend,dividend,dividend
531         ds              %r1,divisor,%r1
532         addc            dividend,dividend,dividend
533         ds              %r1,divisor,%r1
534         addc            dividend,dividend,dividend
535         ds              %r1,divisor,%r1
536         addc            dividend,dividend,dividend
537         ds              %r1,divisor,%r1
538         addc            dividend,dividend,dividend
539         ds              %r1,divisor,%r1
540         addc            dividend,dividend,dividend
541         ds              %r1,divisor,%r1
542         addc            dividend,dividend,dividend
543         ds              %r1,divisor,%r1
544         addc            dividend,dividend,dividend
545         ds              %r1,divisor,%r1
546         addc            dividend,dividend,dividend
547         ds              %r1,divisor,%r1
548         addc            dividend,dividend,dividend
549         ds              %r1,divisor,%r1
550         addc            dividend,dividend,dividend
551         ds              %r1,divisor,%r1
552         addc            dividend,dividend,dividend
553         ds              %r1,divisor,%r1
554         addc            dividend,dividend,dividend
555         ds              %r1,divisor,%r1
556         addc            dividend,dividend,dividend
557         ds              %r1,divisor,%r1
558         addc            dividend,dividend,dividend
559         ds              %r1,divisor,%r1
560         addc            dividend,dividend,dividend
561         ds              %r1,divisor,%r1
562         addc            dividend,dividend,dividend
563         ds              %r1,divisor,%r1
564         addc            dividend,dividend,dividend
565         ds              %r1,divisor,%r1
566         addc            dividend,dividend,dividend
567         ds              %r1,divisor,%r1
568         addc            dividend,dividend,dividend
569         ds              %r1,divisor,%r1
570         addc            dividend,dividend,dividend
571         ds              %r1,divisor,%r1
572         addc            dividend,dividend,dividend
573         ds              %r1,divisor,%r1
574         addc            dividend,dividend,dividend
575         ds              %r1,divisor,%r1
576         addc            dividend,dividend,dividend
577         ds              %r1,divisor,%r1
578         addc            dividend,dividend,dividend
579         ds              %r1,divisor,%r1
580         addc            dividend,dividend,dividend
581         comclr,>=       %r1,%r0,%r0
582         addl            %r1,divisor,%r1
583         comclr,>=       quotient,%r0,%r0        ; skip of no need to negate
584         sub             %r0,%r1,%r1
585         bv              %r0(ret)
586         copy            %r1,quotient
587 L$largedivisor
588         sub,>>=         dividend,divisor,quotient
589         copy            dividend,quotient
590         bv,n            %r0(ret)
591         .exit
592         .procend
593 #endif
594
595
596 #if defined (L_divU_3) && !defined (SMALL_LIB)
597 #undef L_divU_3
598 #define dividend %r26
599 #define divisor %r25
600 #define tmp %r1
601 #define result %r29
602 #define ret %r31
603         .space  $TEXT$
604         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
605         .align 4
606         .export $$divU_3
607 $$divU_3
608         .proc
609         .callinfo       frame=0,no_calls
610         .entry
611         sh2add  %r26,%r26,%r29          ; r29 = lo(101 x r)
612         shd     %r0,%r26,30,%r1         ;  r1 = hi(100 x r)
613         addc    %r1,%r0,%r1             ;  r1 = hi(101 x r)
614 ; r in r1,,r29
615         zdep    %r29,27,28,%r25         ; r25 = lo(10000 x r)
616         add     %r25,%r29,%r25          ; r25 = lo(10001 x r)
617         shd     %r1,%r29,28,%r29        ; r29 = hi(10000 x r)
618         addc    %r29,%r1,%r29           ; r29 = hi(10001 x r)
619 ; r in r29,,r25
620         zdep    %r25,23,24,%r1          ;  r1 = lo(100000000 x r)
621         add     %r1,%r25,%r1            ;  r1 = lo(100000001 x r)
622         shd     %r29,%r25,24,%r25       ; r25 = hi(100000000 x r)
623         addc    %r25,%r29,%r25          ; r25 = hi(100000001 x r)
624 ; r in r25,,r1
625         zdep    %r1,15,16,%r29
626         add     %r29,%r1,%r29
627         shd     %r25,%r1,16,%r1
628         addc    %r1,%r25,%r1
629 ; r in r1,,r29
630         sh1add  %r29,%r26,%r0           ;  r0 = lo(10 x r) + dividend
631         shd     %r1,%r29,31,%r29        ; r29 = hi(10 x r)
632         addc    %r29,%r0,%r29
633         bv      %r0(ret)
634         extru   %r29,30,31,result
635         .exit
636         .procend
637 #endif
638
639
640 #if defined (L_divU_5) && !defined (SMALL_LIB)
641 #undef L_divU_5
642 #define dividend %r26
643 #define divisor %r25
644 #define tmp %r1
645 #define result %r29
646 #define ret %r31
647         .space  $TEXT$
648         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
649         .align 4
650         .export $$divU_5
651 $$divU_5
652         .proc
653         .callinfo       frame=0,no_calls
654         .entry
655         sh1add  %r26,%r26,%r29          ; r29 = lo(11 x r)
656         shd     %r0,%r26,31,%r1         ;  r1 = hi(10 x r)
657         addc    %r1,%r0,%r1             ;  r1 = hi(11 x r)
658 ; r in r1,,r29
659         zdep    %r29,27,28,%r25         ; r25 = lo(10000 x r)
660         add     %r25,%r29,%r25          ; r25 = lo(10001 x r)
661         shd     %r1,%r29,28,%r29        ; r29 = hi(10000 x r)
662         addc    %r29,%r1,%r29           ; r29 = hi(10001 x r)
663 ; r in r29,,r25
664         zdep    %r25,23,24,%r1          ;  r1 = lo(100000000 x r)
665         add     %r1,%r25,%r1            ;  r1 = lo(100000001 x r)
666         shd     %r29,%r25,24,%r25       ; r25 = hi(100000000 x r)
667         addc    %r25,%r29,%r25          ; r25 = hi(100000001 x r)
668 ; r in r25,,r1
669         zdep    %r1,15,16,%r29
670         add     %r29,%r1,%r29
671         shd     %r25,%r1,16,%r1
672         addc    %r1,%r25,%r1
673 ; r in r1,,r29
674         sh2add  %r29,%r26,%r0           ;  r0 = lo(1000 x r) + dividend
675         shd     %r1,%r29,30,%r29        ; r29 = hi(1000 x r)
676         addc    %r29,%r0,%r29
677         bv      %r0(ret)
678         extru   %r29,29,30,result
679         .exit
680         .procend
681 #endif
682
683
684 #if defined (L_divU_6) && !defined (SMALL_LIB)
685 #undef L_divU_6
686 #define dividend %r26
687 #define divisor %r25
688 #define tmp %r1
689 #define result %r29
690 #define ret %r31
691         .space  $TEXT$
692         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
693         .align 4
694         .export $$divU_6
695 $$divU_6
696         .proc
697         .callinfo       frame=0,no_calls
698         .entry
699         sh2add  %r26,%r26,%r29          ; r29 = lo(101 x r)
700         shd     %r0,%r26,30,%r1         ;  r1 = hi(100 x r)
701         addc    %r1,%r0,%r1             ;  r1 = hi(101 x r)
702 ; r in r1,,r29
703         zdep    %r29,27,28,%r25         ; r25 = lo(10000 x r)
704         add     %r25,%r29,%r25          ; r25 = lo(10001 x r)
705         shd     %r1,%r29,28,%r29        ; r29 = hi(10000 x r)
706         addc    %r29,%r1,%r29           ; r29 = hi(10001 x r)
707 ; r in r29,,r25
708         zdep    %r25,23,24,%r1          ;  r1 = lo(100000000 x r)
709         add     %r1,%r25,%r1            ;  r1 = lo(100000001 x r)
710         shd     %r29,%r25,24,%r25       ; r25 = hi(100000000 x r)
711         addc    %r25,%r29,%r25          ; r25 = hi(100000001 x r)
712 ; r in r25,,r1
713         zdep    %r1,15,16,%r29
714         add     %r29,%r1,%r29
715         shd     %r25,%r1,16,%r1
716         addc    %r1,%r25,%r1
717 ; r in r1,,r29
718         sh1add  %r29,%r26,%r0           ;  r0 = lo(10 x r) + dividend
719         shd     %r1,%r29,31,%r29        ; r29 = hi(10 x r)
720         addc    %r29,%r0,%r29
721         bv      %r0(ret)
722         extru   %r29,29,30,result
723         .exit
724         .procend
725 #endif
726
727
728 #if defined (L_divU_9) && !defined (SMALL_LIB)
729 #undef L_divU_9
730 #define dividend %r26
731 #define divisor %r25
732 #define tmp %r1
733 #define result %r29
734 #define ret %r31
735         .space  $TEXT$
736         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
737         .align 4
738         .export $$divU_9
739 $$divU_9
740         .proc
741         .callinfo       frame=0,no_calls
742         .entry
743         zdep    %r26,28,29,%r29
744         sub     %r29,%r26,%r29
745         shd     0,%r26,29,%r1
746         subb    %r1,0,%r1               /* 111 */
747
748         zdep    %r29,25,26,%r25
749         add     %r25,%r29,%r25
750         shd     %r1,%r29,26,%r29
751         addc    %r29,%r1,%r29           /* 111000111 */
752
753         sh3add  %r25,%r26,%r1
754         shd     %r29,%r25,29,%r25
755         addc    %r25,0,%r25             /* 111000111001 */
756
757         zdep    %r1,16,17,%r29
758         sub     %r29,%r1,%r29
759         shd     %r25,%r1,17,%r1
760         subb    %r1,%r25,%r1            /* 111000111000111000111000111 */
761
762         sh3add  %r29,%r26,%r0
763         shd     %r1,%r29,29,%r29
764         addc    %r29,0,%r29             /* 111000111000111000111000111001 */
765         bv      %r0(ret)
766         extru   %r29,30,31,result
767         .exit
768         .procend
769 #endif
770
771
772 #if defined (L_divU_10) && !defined (SMALL_LIB)
773 #undef L_divU_10
774 #define dividend %r26
775 #define divisor %r25
776 #define tmp %r1
777 #define result %r29
778 #define ret %r31
779         .space  $TEXT$
780         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
781         .align 4
782         .export $$divU_10
783 $$divU_10
784         .proc
785         .callinfo       frame=0,no_calls
786         .entry
787         sh1add  %r26,%r26,%r29          ; r29 = lo(11 x r)
788         shd     %r0,%r26,31,%r1         ;  r1 = hi(10 x r)
789         addc    %r1,%r0,%r1             ;  r1 = hi(11 x r)
790 ; r in r1,,r29
791         zdep    %r29,27,28,%r25         ; r25 = lo(10000 x r)
792         add     %r25,%r29,%r25          ; r25 = lo(10001 x r)
793         shd     %r1,%r29,28,%r29        ; r29 = hi(10000 x r)
794         addc    %r29,%r1,%r29           ; r29 = hi(10001 x r)
795 ; r in r29,,r25
796         zdep    %r25,23,24,%r1          ;  r1 = lo(100000000 x r)
797         add     %r1,%r25,%r1            ;  r1 = lo(100000001 x r)
798         shd     %r29,%r25,24,%r25       ; r25 = hi(100000000 x r)
799         addc    %r25,%r29,%r25          ; r25 = hi(100000001 x r)
800 ; r in r25,,r1
801         zdep    %r1,15,16,%r29
802         add     %r29,%r1,%r29
803         shd     %r25,%r1,16,%r1
804         addc    %r1,%r25,%r1
805 ; r in r1,,r29
806         sh2add  %r29,%r26,%r0           ;  r0 = lo(1000 x r) + dividend
807         shd     %r1,%r29,30,%r29        ; r29 = hi(1000 x r)
808         addc    %r29,%r0,%r29
809         bv      %r0(ret)
810         extru   %r29,28,29,result
811         .exit
812         .procend
813 #endif
814
815
816 #if defined (L_divU_12) && !defined (SMALL_LIB)
817 #undef L_divU_12
818 #define dividend %r26
819 #define divisor %r25
820 #define tmp %r1
821 #define result %r29
822 #define ret %r31
823         .space  $TEXT$
824         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
825         .align 4
826         .export $$divU_12
827 $$divU_12
828         .proc
829         .callinfo       frame=0,no_calls
830         .entry
831         sh2add  %r26,%r26,%r29          ; r29 = lo(101 x r)
832         shd     %r0,%r26,30,%r1         ;  r1 = hi(100 x r)
833         addc    %r1,%r0,%r1             ;  r1 = hi(101 x r)
834 ; r in r1,,r29
835         zdep    %r29,27,28,%r25         ; r25 = lo(10000 x r)
836         add     %r25,%r29,%r25          ; r25 = lo(10001 x r)
837         shd     %r1,%r29,28,%r29        ; r29 = hi(10000 x r)
838         addc    %r29,%r1,%r29           ; r29 = hi(10001 x r)
839 ; r in r29,,r25
840         zdep    %r25,23,24,%r1          ;  r1 = lo(100000000 x r)
841         add     %r1,%r25,%r1            ;  r1 = lo(100000001 x r)
842         shd     %r29,%r25,24,%r25       ; r25 = hi(100000000 x r)
843         addc    %r25,%r29,%r25          ; r25 = hi(100000001 x r)
844 ; r in r25,,r1
845         zdep    %r1,15,16,%r29
846         add     %r29,%r1,%r29
847         shd     %r25,%r1,16,%r1
848         addc    %r1,%r25,%r1
849 ; r in r1,,r29
850         sh1add  %r29,%r26,%r0           ;  r0 = lo(10 x r) + dividend
851         shd     %r1,%r29,31,%r29        ; r29 = hi(10 x r)
852         addc    %r29,%r0,%r29
853         bv      %r0(ret)
854         extru   %r29,28,29,result
855         .exit
856         .procend
857 #endif
858
859
860 #ifdef L_divU_3
861         .space  $TEXT$
862         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
863         .align  4
864         .export $$divU_3
865 $$divU_3
866         .proc
867         .callinfo       frame=0,no_calls
868         .entry
869         b               $$divU
870         ldi             3,%r25
871         .exit
872         .procend
873         .import         $$divU,MILLICODE
874 #endif
875
876 #ifdef L_divU_5
877         .space  $TEXT$
878         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
879         .align  4
880         .export $$divU_5
881 $$divU_5
882         .proc
883         .callinfo       frame=0,no_calls
884         .entry
885         b               $$divU
886         ldi             5,%r25
887         .exit
888         .procend
889         .import         $$divU,MILLICODE
890 #endif
891
892 #ifdef L_divU_6
893         .space  $TEXT$
894         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
895         .align  4
896         .export $$divU_6
897 $$divU_6
898         .proc
899         .callinfo       frame=0,no_calls
900         .entry
901         b               $$divU
902         ldi             6,%r25
903         .exit
904         .procend
905         .import         $$divU,MILLICODE
906 #endif
907
908 #ifdef L_divU_7
909         .space  $TEXT$
910         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
911         .align  4
912         .export $$divU_7
913 $$divU_7
914         .proc
915         .callinfo       frame=0,no_calls
916         .entry
917         b               $$divU
918         ldi             7,%r25
919         .exit
920         .procend
921         .import         $$divU,MILLICODE
922 #endif
923
924 #ifdef L_divU_9
925         .space  $TEXT$
926         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
927         .align  4
928         .export $$divU_9
929 $$divU_9
930         .proc
931         .callinfo       frame=0,no_calls
932         .entry
933         b               $$divU
934         ldi             9,%r25
935         .exit
936         .procend
937         .import         $$divU,MILLICODE
938 #endif
939
940 #ifdef L_divU_10
941         .space  $TEXT$
942         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
943         .align  4
944         .export $$divU_10
945 $$divU_10
946         .proc
947         .callinfo       frame=0,no_calls
948         .entry
949         b               $$divU
950         ldi             10,%r25
951         .exit
952         .procend
953         .import         $$divU,MILLICODE
954 #endif
955
956 #ifdef L_divU_12
957         .space  $TEXT$
958         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
959         .align  4
960         .export $$divU_12
961 $$divU_12
962         .proc
963         .callinfo       frame=0,no_calls
964         .entry
965         b               $$divU
966         ldi             12,%r25
967         .exit
968         .procend
969         .import         $$divU,MILLICODE
970 #endif
971
972 #ifdef L_divU_14
973         .space  $TEXT$
974         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
975         .align  4
976         .export $$divU_14
977 $$divU_14
978         .proc
979         .callinfo       frame=0,no_calls
980         .entry
981         b               $$divU
982         ldi             14,%r25
983         .exit
984         .procend
985         .import         $$divU,MILLICODE
986 #endif
987
988 #ifdef L_divU_15
989         .space  $TEXT$
990         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
991         .align  4
992         .export $$divU_15
993 $$divU_15
994         .proc
995         .callinfo       frame=0,no_calls
996         .entry
997         b               $$divU
998         ldi             15,%r25
999         .exit
1000         .procend
1001         .import         $$divU,MILLICODE
1002 #endif
1003
1004 #ifdef L_divI_3
1005         .space  $TEXT$
1006         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1007         .align  4
1008         .export $$divI_3
1009 $$divI_3
1010         .proc
1011         .callinfo       frame=0,no_calls
1012         .entry
1013         b               $$divI
1014         ldi             3,%r25
1015         .exit
1016         .procend
1017         .import         $$divI,MILLICODE
1018 #endif
1019
1020 #ifdef L_divI_5
1021         .space  $TEXT$
1022         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1023         .align  4
1024         .export $$divI_5
1025 $$divI_5
1026         .proc
1027         .callinfo       frame=0,no_calls
1028         .entry
1029         b               $$divI
1030         ldi             5,%r25
1031         .exit
1032         .procend
1033         .import         $$divI,MILLICODE
1034 #endif
1035
1036 #ifdef L_divI_6
1037         .space  $TEXT$
1038         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1039         .align  4
1040         .export $$divI_6
1041 $$divI_6
1042         .proc
1043         .callinfo       frame=0,no_calls
1044         .entry
1045         b               $$divI
1046         ldi             6,%r25
1047         .exit
1048         .procend
1049         .import         $$divI,MILLICODE
1050 #endif
1051
1052 #ifdef L_divI_7
1053         .space  $TEXT$
1054         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1055         .align  4
1056         .export $$divI_7
1057 $$divI_7
1058         .proc
1059         .callinfo       frame=0,no_calls
1060         .entry
1061         b               $$divI
1062         ldi             7,%r25
1063         .exit
1064         .procend
1065         .import         $$divI,MILLICODE
1066 #endif
1067
1068 #ifdef L_divI_9
1069         .space  $TEXT$
1070         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1071         .align  4
1072         .export $$divI_9
1073 $$divI_9
1074         .proc
1075         .callinfo       frame=0,no_calls
1076         .entry
1077         b               $$divI
1078         ldi             9,%r25
1079         .exit
1080         .procend
1081         .import         $$divI,MILLICODE
1082 #endif
1083
1084 #ifdef L_divI_10
1085         .space  $TEXT$
1086         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1087         .align  4
1088         .export $$divI_10
1089 $$divI_10
1090         .proc
1091         .callinfo       frame=0,no_calls
1092         .entry
1093         b               $$divI
1094         ldi             10,%r25
1095         .exit
1096         .procend
1097         .import         $$divI,MILLICODE
1098 #endif
1099
1100 #ifdef L_divI_12
1101         .space  $TEXT$
1102         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1103         .align  4
1104         .export $$divI_12
1105 $$divI_12
1106         .proc
1107         .callinfo       frame=0,no_calls
1108         .entry
1109         b               $$divI
1110         ldi             12,%r25
1111         .exit
1112         .procend
1113         .import         $$divI,MILLICODE
1114 #endif
1115
1116 #ifdef L_divI_14
1117         .space  $TEXT$
1118         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1119         .align  4
1120         .export $$divI_14
1121 $$divI_14
1122         .proc
1123         .callinfo       frame=0,no_calls
1124         .entry
1125         b               $$divI
1126         ldi             14,%r25
1127         .exit
1128         .procend
1129         .import         $$divI,MILLICODE
1130 #endif
1131
1132 #ifdef L_divI_15
1133         .space  $TEXT$
1134         .subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
1135         .align  4
1136         .export $$divI_15
1137 $$divI_15
1138         .proc
1139         .callinfo       frame=0,no_calls
1140         .entry
1141         b               $$divI
1142         ldi             15,%r25
1143         .exit
1144         .procend
1145         .import         $$divI,MILLICODE
1146 #endif