Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[linux-2.6] / arch / sparc / lib / udivdi3.S
1 /* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
2
3 This file is part of GNU CC.
4
5 GNU CC is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
8 any later version.
9
10 GNU CC is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNU CC; see the file COPYING.  If not, write to
17 the Free Software Foundation, 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.  */
19
20         .text
21         .align 4
22         .globl __udivdi3
23 __udivdi3:
24         save %sp,-104,%sp
25         mov %i3,%o3
26         cmp %i2,0
27         bne .LL40
28         mov %i1,%i3
29         cmp %o3,%i0
30         bleu .LL41
31         mov %i3,%o1
32         ! Inlined udiv_qrnnd
33         mov     32,%g1
34         subcc   %i0,%o3,%g0
35 1:      bcs     5f
36          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
37         sub     %i0,%o3,%i0     ! this kills msb of n
38         addx    %i0,%i0,%i0     ! so this cannot give carry
39         subcc   %g1,1,%g1
40 2:      bne     1b
41          subcc  %i0,%o3,%g0
42         bcs     3f
43          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
44         b       3f
45          sub    %i0,%o3,%i0     ! this kills msb of n
46 4:      sub     %i0,%o3,%i0
47 5:      addxcc  %i0,%i0,%i0
48         bcc     2b
49          subcc  %g1,1,%g1
50 ! Got carry from n.  Subtract next step to cancel this carry.
51         bne     4b
52          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
53         sub     %i0,%o3,%i0
54 3:      xnor    %o1,0,%o1
55         ! End of inline udiv_qrnnd
56         b .LL45
57         mov 0,%o2
58 .LL41:
59         cmp %o3,0
60         bne .LL77
61         mov %i0,%o2
62         mov 1,%o0
63         call .udiv,0
64         mov 0,%o1
65         mov %o0,%o3
66         mov %i0,%o2
67 .LL77:
68         mov 0,%o4
69         ! Inlined udiv_qrnnd
70         mov     32,%g1
71         subcc   %o4,%o3,%g0
72 1:      bcs     5f
73          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
74         sub     %o4,%o3,%o4     ! this kills msb of n
75         addx    %o4,%o4,%o4     ! so this cannot give carry
76         subcc   %g1,1,%g1
77 2:      bne     1b
78          subcc  %o4,%o3,%g0
79         bcs     3f
80          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
81         b       3f
82          sub    %o4,%o3,%o4     ! this kills msb of n
83 4:      sub     %o4,%o3,%o4
84 5:      addxcc  %o4,%o4,%o4
85         bcc     2b
86          subcc  %g1,1,%g1
87 ! Got carry from n.  Subtract next step to cancel this carry.
88         bne     4b
89          addcc  %o2,%o2,%o2     ! shift n1n0 and a 0-bit in lsb
90         sub     %o4,%o3,%o4
91 3:      xnor    %o2,0,%o2
92         ! End of inline udiv_qrnnd
93         mov %o4,%i0
94         mov %i3,%o1
95         ! Inlined udiv_qrnnd
96         mov     32,%g1
97         subcc   %i0,%o3,%g0
98 1:      bcs     5f
99          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
100         sub     %i0,%o3,%i0     ! this kills msb of n
101         addx    %i0,%i0,%i0     ! so this cannot give carry
102         subcc   %g1,1,%g1
103 2:      bne     1b
104          subcc  %i0,%o3,%g0
105         bcs     3f
106          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
107         b       3f
108          sub    %i0,%o3,%i0     ! this kills msb of n
109 4:      sub     %i0,%o3,%i0
110 5:      addxcc  %i0,%i0,%i0
111         bcc     2b
112          subcc  %g1,1,%g1
113 ! Got carry from n.  Subtract next step to cancel this carry.
114         bne     4b
115          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
116         sub     %i0,%o3,%i0
117 3:      xnor    %o1,0,%o1
118         ! End of inline udiv_qrnnd
119         b .LL78
120         mov %o1,%l1
121 .LL40:
122         cmp %i2,%i0
123         bleu .LL46
124         sethi %hi(65535),%o0
125         b .LL73
126         mov 0,%o1
127 .LL46:
128         or %o0,%lo(65535),%o0
129         cmp %i2,%o0
130         bgu .LL53
131         mov %i2,%o1
132         cmp %i2,256
133         addx %g0,-1,%o0
134         b .LL59
135         and %o0,8,%o2
136 .LL53:
137         sethi %hi(16777215),%o0
138         or %o0,%lo(16777215),%o0
139         cmp %o1,%o0
140         bgu .LL59
141         mov 24,%o2
142         mov 16,%o2
143 .LL59:
144         srl %o1,%o2,%o1
145         sethi %hi(__clz_tab),%o0
146         or %o0,%lo(__clz_tab),%o0
147         ldub [%o1+%o0],%o0
148         add %o0,%o2,%o0
149         mov 32,%o1
150         subcc %o1,%o0,%o2
151         bne,a .LL67
152         mov 32,%o0
153         cmp %i0,%i2
154         bgu .LL69
155         cmp %i3,%o3
156         blu .LL73
157         mov 0,%o1
158 .LL69:
159         b .LL73
160         mov 1,%o1
161 .LL67:
162         sub %o0,%o2,%o0
163         sll %i2,%o2,%i2
164         srl %o3,%o0,%o1
165         or %i2,%o1,%i2
166         sll %o3,%o2,%o3
167         srl %i0,%o0,%o1
168         sll %i0,%o2,%i0
169         srl %i3,%o0,%o0
170         or %i0,%o0,%i0
171         sll %i3,%o2,%i3
172         mov %i0,%o5
173         mov %o1,%o4
174         ! Inlined udiv_qrnnd
175         mov     32,%g1
176         subcc   %o4,%i2,%g0
177 1:      bcs     5f
178          addxcc %o5,%o5,%o5     ! shift n1n0 and a q-bit in lsb
179         sub     %o4,%i2,%o4     ! this kills msb of n
180         addx    %o4,%o4,%o4     ! so this cannot give carry
181         subcc   %g1,1,%g1
182 2:      bne     1b
183          subcc  %o4,%i2,%g0
184         bcs     3f
185          addxcc %o5,%o5,%o5     ! shift n1n0 and a q-bit in lsb
186         b       3f
187          sub    %o4,%i2,%o4     ! this kills msb of n
188 4:      sub     %o4,%i2,%o4
189 5:      addxcc  %o4,%o4,%o4
190         bcc     2b
191          subcc  %g1,1,%g1
192 ! Got carry from n.  Subtract next step to cancel this carry.
193         bne     4b
194          addcc  %o5,%o5,%o5     ! shift n1n0 and a 0-bit in lsb
195         sub     %o4,%i2,%o4
196 3:      xnor    %o5,0,%o5
197         ! End of inline udiv_qrnnd
198         mov %o4,%i0
199         mov %o5,%o1
200         ! Inlined umul_ppmm
201         wr      %g0,%o1,%y      ! SPARC has 0-3 delay insn after a wr
202         sra     %o3,31,%g2      ! Do not move this insn
203         and     %o1,%g2,%g2     ! Do not move this insn
204         andcc   %g0,0,%g1       ! Do not move this insn
205         mulscc  %g1,%o3,%g1
206         mulscc  %g1,%o3,%g1
207         mulscc  %g1,%o3,%g1
208         mulscc  %g1,%o3,%g1
209         mulscc  %g1,%o3,%g1
210         mulscc  %g1,%o3,%g1
211         mulscc  %g1,%o3,%g1
212         mulscc  %g1,%o3,%g1
213         mulscc  %g1,%o3,%g1
214         mulscc  %g1,%o3,%g1
215         mulscc  %g1,%o3,%g1
216         mulscc  %g1,%o3,%g1
217         mulscc  %g1,%o3,%g1
218         mulscc  %g1,%o3,%g1
219         mulscc  %g1,%o3,%g1
220         mulscc  %g1,%o3,%g1
221         mulscc  %g1,%o3,%g1
222         mulscc  %g1,%o3,%g1
223         mulscc  %g1,%o3,%g1
224         mulscc  %g1,%o3,%g1
225         mulscc  %g1,%o3,%g1
226         mulscc  %g1,%o3,%g1
227         mulscc  %g1,%o3,%g1
228         mulscc  %g1,%o3,%g1
229         mulscc  %g1,%o3,%g1
230         mulscc  %g1,%o3,%g1
231         mulscc  %g1,%o3,%g1
232         mulscc  %g1,%o3,%g1
233         mulscc  %g1,%o3,%g1
234         mulscc  %g1,%o3,%g1
235         mulscc  %g1,%o3,%g1
236         mulscc  %g1,%o3,%g1
237         mulscc  %g1,0,%g1
238         add     %g1,%g2,%o0
239         rd      %y,%o2
240         cmp %o0,%i0
241         bgu,a .LL73
242         add %o1,-1,%o1
243         bne,a .LL45
244         mov 0,%o2
245         cmp %o2,%i3
246         bleu .LL45
247         mov 0,%o2
248         add %o1,-1,%o1
249 .LL73:
250         mov 0,%o2
251 .LL45:
252         mov %o1,%l1
253 .LL78:
254         mov %o2,%l0
255         mov %l0,%i0
256         mov %l1,%i1
257         ret
258         restore