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