GNU Linux-libre 4.9.296-gnu1
[releases.git] / 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         mov 0,%o1
64         wr %g0, 0, %y
65         udiv %o0, %o1, %o0
66         mov %o0,%o3
67         mov %i0,%o2
68 .LL77:
69         mov 0,%o4
70         ! Inlined udiv_qrnnd
71         mov     32,%g1
72         subcc   %o4,%o3,%g0
73 1:      bcs     5f
74          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
75         sub     %o4,%o3,%o4     ! this kills msb of n
76         addx    %o4,%o4,%o4     ! so this cannot give carry
77         subcc   %g1,1,%g1
78 2:      bne     1b
79          subcc  %o4,%o3,%g0
80         bcs     3f
81          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
82         b       3f
83          sub    %o4,%o3,%o4     ! this kills msb of n
84 4:      sub     %o4,%o3,%o4
85 5:      addxcc  %o4,%o4,%o4
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  %o2,%o2,%o2     ! shift n1n0 and a 0-bit in lsb
91         sub     %o4,%o3,%o4
92 3:      xnor    %o2,0,%o2
93         ! End of inline udiv_qrnnd
94         mov %o4,%i0
95         mov %i3,%o1
96         ! Inlined udiv_qrnnd
97         mov     32,%g1
98         subcc   %i0,%o3,%g0
99 1:      bcs     5f
100          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
101         sub     %i0,%o3,%i0     ! this kills msb of n
102         addx    %i0,%i0,%i0     ! so this cannot give carry
103         subcc   %g1,1,%g1
104 2:      bne     1b
105          subcc  %i0,%o3,%g0
106         bcs     3f
107          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
108         b       3f
109          sub    %i0,%o3,%i0     ! this kills msb of n
110 4:      sub     %i0,%o3,%i0
111 5:      addxcc  %i0,%i0,%i0
112         bcc     2b
113          subcc  %g1,1,%g1
114 ! Got carry from n.  Subtract next step to cancel this carry.
115         bne     4b
116          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
117         sub     %i0,%o3,%i0
118 3:      xnor    %o1,0,%o1
119         ! End of inline udiv_qrnnd
120         b .LL78
121         mov %o1,%l1
122 .LL40:
123         cmp %i2,%i0
124         bleu .LL46
125         sethi %hi(65535),%o0
126         b .LL73
127         mov 0,%o1
128 .LL46:
129         or %o0,%lo(65535),%o0
130         cmp %i2,%o0
131         bgu .LL53
132         mov %i2,%o1
133         cmp %i2,256
134         addx %g0,-1,%o0
135         b .LL59
136         and %o0,8,%o2
137 .LL53:
138         sethi %hi(16777215),%o0
139         or %o0,%lo(16777215),%o0
140         cmp %o1,%o0
141         bgu .LL59
142         mov 24,%o2
143         mov 16,%o2
144 .LL59:
145         srl %o1,%o2,%o1
146         sethi %hi(__clz_tab),%o0
147         or %o0,%lo(__clz_tab),%o0
148         ldub [%o1+%o0],%o0
149         add %o0,%o2,%o0
150         mov 32,%o1
151         subcc %o1,%o0,%o2
152         bne,a .LL67
153         mov 32,%o0
154         cmp %i0,%i2
155         bgu .LL69
156         cmp %i3,%o3
157         blu .LL73
158         mov 0,%o1
159 .LL69:
160         b .LL73
161         mov 1,%o1
162 .LL67:
163         sub %o0,%o2,%o0
164         sll %i2,%o2,%i2
165         srl %o3,%o0,%o1
166         or %i2,%o1,%i2
167         sll %o3,%o2,%o3
168         srl %i0,%o0,%o1
169         sll %i0,%o2,%i0
170         srl %i3,%o0,%o0
171         or %i0,%o0,%i0
172         sll %i3,%o2,%i3
173         mov %i0,%o5
174         mov %o1,%o4
175         ! Inlined udiv_qrnnd
176         mov     32,%g1
177         subcc   %o4,%i2,%g0
178 1:      bcs     5f
179          addxcc %o5,%o5,%o5     ! shift n1n0 and a q-bit in lsb
180         sub     %o4,%i2,%o4     ! this kills msb of n
181         addx    %o4,%o4,%o4     ! so this cannot give carry
182         subcc   %g1,1,%g1
183 2:      bne     1b
184          subcc  %o4,%i2,%g0
185         bcs     3f
186          addxcc %o5,%o5,%o5     ! shift n1n0 and a q-bit in lsb
187         b       3f
188          sub    %o4,%i2,%o4     ! this kills msb of n
189 4:      sub     %o4,%i2,%o4
190 5:      addxcc  %o4,%o4,%o4
191         bcc     2b
192          subcc  %g1,1,%g1
193 ! Got carry from n.  Subtract next step to cancel this carry.
194         bne     4b
195          addcc  %o5,%o5,%o5     ! shift n1n0 and a 0-bit in lsb
196         sub     %o4,%i2,%o4
197 3:      xnor    %o5,0,%o5
198         ! End of inline udiv_qrnnd
199         mov %o4,%i0
200         mov %o5,%o1
201         ! Inlined umul_ppmm
202         wr      %g0,%o1,%y      ! SPARC has 0-3 delay insn after a wr
203         sra     %o3,31,%g2      ! Do not move this insn
204         and     %o1,%g2,%g2     ! Do not move this insn
205         andcc   %g0,0,%g1       ! Do not move this insn
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,%o3,%g1
238         mulscc  %g1,0,%g1
239         add     %g1,%g2,%o0
240         rd      %y,%o2
241         cmp %o0,%i0
242         bgu,a .LL73
243         add %o1,-1,%o1
244         bne,a .LL45
245         mov 0,%o2
246         cmp %o2,%i3
247         bleu .LL45
248         mov 0,%o2
249         add %o1,-1,%o1
250 .LL73:
251         mov 0,%o2
252 .LL45:
253         mov %o1,%l1
254 .LL78:
255         mov %o2,%l0
256         mov %l0,%i0
257         mov %l1,%i1
258         ret
259         restore