681b3683da9e6134d065d8d719a691738f01653d
[linux-2.6.git] / arch / sparc / lib / divdi3.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         .data
21         .align 8
22         .globl  __clz_tab
23 __clz_tab:
24         .byte   0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
25         .byte   6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
26         .byte   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
27         .byte   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
28         .byte   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
29         .byte   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
30         .byte   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
31         .byte   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
32         .size    __clz_tab,256
33         .global .udiv
34
35         .text
36         .align 4
37         .globl __divdi3
38 __divdi3:
39         save %sp,-104,%sp
40         cmp %i0,0
41         bge .LL40
42         mov 0,%l4
43         mov -1,%l4
44         sub %g0,%i1,%o0
45         mov %o0,%o5
46         subcc %g0,%o0,%g0
47         sub %g0,%i0,%o0
48         subx %o0,0,%o4
49         mov %o4,%i0
50         mov %o5,%i1
51 .LL40:
52         cmp %i2,0
53         bge .LL84
54         mov %i3,%o4
55         xnor %g0,%l4,%l4
56         sub %g0,%i3,%o0
57         mov %o0,%o3
58         subcc %g0,%o0,%g0
59         sub %g0,%i2,%o0
60         subx %o0,0,%o2
61         mov %o2,%i2
62         mov %o3,%i3
63         mov %i3,%o4
64 .LL84:
65         cmp %i2,0
66         bne .LL45
67         mov %i1,%i3
68         cmp %o4,%i0
69         bleu .LL46
70         mov %i3,%o1
71         mov     32,%g1
72         subcc   %i0,%o4,%g0
73 1:      bcs     5f
74          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
75         sub     %i0,%o4,%i0     ! this kills msb of n
76         addx    %i0,%i0,%i0     ! so this cannot give carry
77         subcc   %g1,1,%g1
78 2:      bne     1b
79          subcc  %i0,%o4,%g0
80         bcs     3f
81          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
82         b       3f
83          sub    %i0,%o4,%i0     ! this kills msb of n
84 4:      sub     %i0,%o4,%i0
85 5:      addxcc  %i0,%i0,%i0
86         bcc     2b
87          subcc  %g1,1,%g1
88 ! Got carry from n.  Subtract next step to cancel this carry.
89         bne     4b
90          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
91         sub     %i0,%o4,%i0
92 3:      xnor    %o1,0,%o1
93         b .LL50
94         mov 0,%o2
95 .LL46:
96         cmp %o4,0
97         bne .LL85
98         mov %i0,%o2
99         mov 1,%o0
100         call .udiv,0
101         mov 0,%o1
102         mov %o0,%o4
103         mov %i0,%o2
104 .LL85:
105         mov 0,%g3
106         mov     32,%g1
107         subcc   %g3,%o4,%g0
108 1:      bcs     5f
109          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
110         sub     %g3,%o4,%g3     ! this kills msb of n
111         addx    %g3,%g3,%g3     ! so this cannot give carry
112         subcc   %g1,1,%g1
113 2:      bne     1b
114          subcc  %g3,%o4,%g0
115         bcs     3f
116          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
117         b       3f
118          sub    %g3,%o4,%g3     ! this kills msb of n
119 4:      sub     %g3,%o4,%g3
120 5:      addxcc  %g3,%g3,%g3
121         bcc     2b
122          subcc  %g1,1,%g1
123 ! Got carry from n.  Subtract next step to cancel this carry.
124         bne     4b
125          addcc  %o2,%o2,%o2     ! shift n1n0 and a 0-bit in lsb
126         sub     %g3,%o4,%g3
127 3:      xnor    %o2,0,%o2
128         mov %g3,%i0
129         mov %i3,%o1
130         mov     32,%g1
131         subcc   %i0,%o4,%g0
132 1:      bcs     5f
133          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
134         sub     %i0,%o4,%i0     ! this kills msb of n
135         addx    %i0,%i0,%i0     ! so this cannot give carry
136         subcc   %g1,1,%g1
137 2:      bne     1b
138          subcc  %i0,%o4,%g0
139         bcs     3f
140          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
141         b       3f
142          sub    %i0,%o4,%i0     ! this kills msb of n
143 4:      sub     %i0,%o4,%i0
144 5:      addxcc  %i0,%i0,%i0
145         bcc     2b
146          subcc  %g1,1,%g1
147 ! Got carry from n.  Subtract next step to cancel this carry.
148         bne     4b
149          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
150         sub     %i0,%o4,%i0
151 3:      xnor    %o1,0,%o1
152         b .LL86
153         mov %o1,%l1
154 .LL45:
155         cmp %i2,%i0
156         bleu .LL51
157         sethi %hi(65535),%o0
158         b .LL78
159         mov 0,%o1
160 .LL51:
161         or %o0,%lo(65535),%o0
162         cmp %i2,%o0
163         bgu .LL58
164         mov %i2,%o1
165         cmp %i2,256
166         addx %g0,-1,%o0
167         b .LL64
168         and %o0,8,%o2
169 .LL58:
170         sethi %hi(16777215),%o0
171         or %o0,%lo(16777215),%o0
172         cmp %i2,%o0
173         bgu .LL64
174         mov 24,%o2
175         mov 16,%o2
176 .LL64:
177         srl %o1,%o2,%o0
178         sethi %hi(__clz_tab),%o1
179         or %o1,%lo(__clz_tab),%o1
180         ldub [%o0+%o1],%o0
181         add %o0,%o2,%o0
182         mov 32,%o1
183         subcc %o1,%o0,%o3
184         bne,a .LL72
185         sub %o1,%o3,%o1
186         cmp %i0,%i2
187         bgu .LL74
188         cmp %i3,%o4
189         blu .LL78
190         mov 0,%o1
191 .LL74:
192         b .LL78
193         mov 1,%o1
194 .LL72:
195         sll %i2,%o3,%o2
196         srl %o4,%o1,%o0
197         or %o2,%o0,%i2
198         sll %o4,%o3,%o4
199         srl %i0,%o1,%o2
200         sll %i0,%o3,%o0
201         srl %i3,%o1,%o1
202         or %o0,%o1,%i0
203         sll %i3,%o3,%i3
204         mov %i0,%o1
205         mov     32,%g1
206         subcc   %o2,%i2,%g0
207 1:      bcs     5f
208          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
209         sub     %o2,%i2,%o2     ! this kills msb of n
210         addx    %o2,%o2,%o2     ! so this cannot give carry
211         subcc   %g1,1,%g1
212 2:      bne     1b
213          subcc  %o2,%i2,%g0
214         bcs     3f
215          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
216         b       3f
217          sub    %o2,%i2,%o2     ! this kills msb of n
218 4:      sub     %o2,%i2,%o2
219 5:      addxcc  %o2,%o2,%o2
220         bcc     2b
221          subcc  %g1,1,%g1
222 ! Got carry from n.  Subtract next step to cancel this carry.
223         bne     4b
224          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
225         sub     %o2,%i2,%o2
226 3:      xnor    %o1,0,%o1
227         mov %o2,%i0
228         wr      %g0,%o1,%y      ! SPARC has 0-3 delay insn after a wr
229         sra     %o4,31,%g2      ! Do not move this insn
230         and     %o1,%g2,%g2     ! Do not move this insn
231         andcc   %g0,0,%g1       ! Do not move this insn
232         mulscc  %g1,%o4,%g1
233         mulscc  %g1,%o4,%g1
234         mulscc  %g1,%o4,%g1
235         mulscc  %g1,%o4,%g1
236         mulscc  %g1,%o4,%g1
237         mulscc  %g1,%o4,%g1
238         mulscc  %g1,%o4,%g1
239         mulscc  %g1,%o4,%g1
240         mulscc  %g1,%o4,%g1
241         mulscc  %g1,%o4,%g1
242         mulscc  %g1,%o4,%g1
243         mulscc  %g1,%o4,%g1
244         mulscc  %g1,%o4,%g1
245         mulscc  %g1,%o4,%g1
246         mulscc  %g1,%o4,%g1
247         mulscc  %g1,%o4,%g1
248         mulscc  %g1,%o4,%g1
249         mulscc  %g1,%o4,%g1
250         mulscc  %g1,%o4,%g1
251         mulscc  %g1,%o4,%g1
252         mulscc  %g1,%o4,%g1
253         mulscc  %g1,%o4,%g1
254         mulscc  %g1,%o4,%g1
255         mulscc  %g1,%o4,%g1
256         mulscc  %g1,%o4,%g1
257         mulscc  %g1,%o4,%g1
258         mulscc  %g1,%o4,%g1
259         mulscc  %g1,%o4,%g1
260         mulscc  %g1,%o4,%g1
261         mulscc  %g1,%o4,%g1
262         mulscc  %g1,%o4,%g1
263         mulscc  %g1,%o4,%g1
264         mulscc  %g1,0,%g1
265         add     %g1,%g2,%o0
266         rd      %y,%o2
267         cmp %o0,%i0
268         bgu,a .LL78
269         add %o1,-1,%o1
270         bne,a .LL50
271         mov 0,%o2
272         cmp %o2,%i3
273         bleu .LL50
274         mov 0,%o2
275         add %o1,-1,%o1
276 .LL78:
277         mov 0,%o2
278 .LL50:
279         mov %o1,%l1
280 .LL86:
281         mov %o2,%l0
282         mov %l0,%i0
283         mov %l1,%i1
284         cmp %l4,0
285         be .LL81
286         sub %g0,%i1,%o0
287         mov %o0,%l3
288         subcc %g0,%o0,%g0
289         sub %g0,%i0,%o0
290         subx %o0,0,%l2
291         mov %l2,%i0
292         mov %l3,%i1
293 .LL81:
294         ret
295         restore