Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / sparc / lib / divdi3.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6  */
7
8 #include <asm/export.h>
9         .text
10         .align 4
11         .globl __divdi3
12 __divdi3:
13         save %sp,-104,%sp
14         cmp %i0,0
15         bge .LL40
16         mov 0,%l4
17         mov -1,%l4
18         sub %g0,%i1,%o0
19         mov %o0,%o5
20         subcc %g0,%o0,%g0
21         sub %g0,%i0,%o0
22         subx %o0,0,%o4
23         mov %o4,%i0
24         mov %o5,%i1
25 .LL40:
26         cmp %i2,0
27         bge .LL84
28         mov %i3,%o4
29         xnor %g0,%l4,%l4
30         sub %g0,%i3,%o0
31         mov %o0,%o3
32         subcc %g0,%o0,%g0
33         sub %g0,%i2,%o0
34         subx %o0,0,%o2
35         mov %o2,%i2
36         mov %o3,%i3
37         mov %i3,%o4
38 .LL84:
39         cmp %i2,0
40         bne .LL45
41         mov %i1,%i3
42         cmp %o4,%i0
43         bleu .LL46
44         mov %i3,%o1
45         mov     32,%g1
46         subcc   %i0,%o4,%g0
47 1:      bcs     5f
48          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
49         sub     %i0,%o4,%i0     ! this kills msb of n
50         addx    %i0,%i0,%i0     ! so this cannot give carry
51         subcc   %g1,1,%g1
52 2:      bne     1b
53          subcc  %i0,%o4,%g0
54         bcs     3f
55          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
56         b       3f
57          sub    %i0,%o4,%i0     ! this kills msb of n
58 4:      sub     %i0,%o4,%i0
59 5:      addxcc  %i0,%i0,%i0
60         bcc     2b
61          subcc  %g1,1,%g1
62 ! Got carry from n.  Subtract next step to cancel this carry.
63         bne     4b
64          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
65         sub     %i0,%o4,%i0
66 3:      xnor    %o1,0,%o1
67         b .LL50
68         mov 0,%o2
69 .LL46:
70         cmp %o4,0
71         bne .LL85
72         mov %i0,%o2
73         mov 1,%o0
74         mov 0,%o1
75         wr %g0, 0, %y
76         udiv %o0, %o1, %o0
77         mov %o0,%o4
78         mov %i0,%o2
79 .LL85:
80         mov 0,%g3
81         mov     32,%g1
82         subcc   %g3,%o4,%g0
83 1:      bcs     5f
84          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
85         sub     %g3,%o4,%g3     ! this kills msb of n
86         addx    %g3,%g3,%g3     ! so this cannot give carry
87         subcc   %g1,1,%g1
88 2:      bne     1b
89          subcc  %g3,%o4,%g0
90         bcs     3f
91          addxcc %o2,%o2,%o2     ! shift n1n0 and a q-bit in lsb
92         b       3f
93          sub    %g3,%o4,%g3     ! this kills msb of n
94 4:      sub     %g3,%o4,%g3
95 5:      addxcc  %g3,%g3,%g3
96         bcc     2b
97          subcc  %g1,1,%g1
98 ! Got carry from n.  Subtract next step to cancel this carry.
99         bne     4b
100          addcc  %o2,%o2,%o2     ! shift n1n0 and a 0-bit in lsb
101         sub     %g3,%o4,%g3
102 3:      xnor    %o2,0,%o2
103         mov %g3,%i0
104         mov %i3,%o1
105         mov     32,%g1
106         subcc   %i0,%o4,%g0
107 1:      bcs     5f
108          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
109         sub     %i0,%o4,%i0     ! this kills msb of n
110         addx    %i0,%i0,%i0     ! so this cannot give carry
111         subcc   %g1,1,%g1
112 2:      bne     1b
113          subcc  %i0,%o4,%g0
114         bcs     3f
115          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
116         b       3f
117          sub    %i0,%o4,%i0     ! this kills msb of n
118 4:      sub     %i0,%o4,%i0
119 5:      addxcc  %i0,%i0,%i0
120         bcc     2b
121          subcc  %g1,1,%g1
122 ! Got carry from n.  Subtract next step to cancel this carry.
123         bne     4b
124          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
125         sub     %i0,%o4,%i0
126 3:      xnor    %o1,0,%o1
127         b .LL86
128         mov %o1,%l1
129 .LL45:
130         cmp %i2,%i0
131         bleu .LL51
132         sethi %hi(65535),%o0
133         b .LL78
134         mov 0,%o1
135 .LL51:
136         or %o0,%lo(65535),%o0
137         cmp %i2,%o0
138         bgu .LL58
139         mov %i2,%o1
140         cmp %i2,256
141         addx %g0,-1,%o0
142         b .LL64
143         and %o0,8,%o2
144 .LL58:
145         sethi %hi(16777215),%o0
146         or %o0,%lo(16777215),%o0
147         cmp %i2,%o0
148         bgu .LL64
149         mov 24,%o2
150         mov 16,%o2
151 .LL64:
152         srl %o1,%o2,%o0
153         sethi %hi(__clz_tab),%o1
154         or %o1,%lo(__clz_tab),%o1
155         ldub [%o0+%o1],%o0
156         add %o0,%o2,%o0
157         mov 32,%o1
158         subcc %o1,%o0,%o3
159         bne,a .LL72
160         sub %o1,%o3,%o1
161         cmp %i0,%i2
162         bgu .LL74
163         cmp %i3,%o4
164         blu .LL78
165         mov 0,%o1
166 .LL74:
167         b .LL78
168         mov 1,%o1
169 .LL72:
170         sll %i2,%o3,%o2
171         srl %o4,%o1,%o0
172         or %o2,%o0,%i2
173         sll %o4,%o3,%o4
174         srl %i0,%o1,%o2
175         sll %i0,%o3,%o0
176         srl %i3,%o1,%o1
177         or %o0,%o1,%i0
178         sll %i3,%o3,%i3
179         mov %i0,%o1
180         mov     32,%g1
181         subcc   %o2,%i2,%g0
182 1:      bcs     5f
183          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
184         sub     %o2,%i2,%o2     ! this kills msb of n
185         addx    %o2,%o2,%o2     ! so this cannot give carry
186         subcc   %g1,1,%g1
187 2:      bne     1b
188          subcc  %o2,%i2,%g0
189         bcs     3f
190          addxcc %o1,%o1,%o1     ! shift n1n0 and a q-bit in lsb
191         b       3f
192          sub    %o2,%i2,%o2     ! this kills msb of n
193 4:      sub     %o2,%i2,%o2
194 5:      addxcc  %o2,%o2,%o2
195         bcc     2b
196          subcc  %g1,1,%g1
197 ! Got carry from n.  Subtract next step to cancel this carry.
198         bne     4b
199          addcc  %o1,%o1,%o1     ! shift n1n0 and a 0-bit in lsb
200         sub     %o2,%i2,%o2
201 3:      xnor    %o1,0,%o1
202         mov %o2,%i0
203         wr      %g0,%o1,%y      ! SPARC has 0-3 delay insn after a wr
204         sra     %o4,31,%g2      ! Do not move this insn
205         and     %o1,%g2,%g2     ! Do not move this insn
206         andcc   %g0,0,%g1       ! Do not move this insn
207         mulscc  %g1,%o4,%g1
208         mulscc  %g1,%o4,%g1
209         mulscc  %g1,%o4,%g1
210         mulscc  %g1,%o4,%g1
211         mulscc  %g1,%o4,%g1
212         mulscc  %g1,%o4,%g1
213         mulscc  %g1,%o4,%g1
214         mulscc  %g1,%o4,%g1
215         mulscc  %g1,%o4,%g1
216         mulscc  %g1,%o4,%g1
217         mulscc  %g1,%o4,%g1
218         mulscc  %g1,%o4,%g1
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,0,%g1
240         add     %g1,%g2,%o0
241         rd      %y,%o2
242         cmp %o0,%i0
243         bgu,a .LL78
244         add %o1,-1,%o1
245         bne,a .LL50
246         mov 0,%o2
247         cmp %o2,%i3
248         bleu .LL50
249         mov 0,%o2
250         add %o1,-1,%o1
251 .LL78:
252         mov 0,%o2
253 .LL50:
254         mov %o1,%l1
255 .LL86:
256         mov %o2,%l0
257         mov %l0,%i0
258         mov %l1,%i1
259         cmp %l4,0
260         be .LL81
261         sub %g0,%i1,%o0
262         mov %o0,%l3
263         subcc %g0,%o0,%g0
264         sub %g0,%i0,%o0
265         subx %o0,0,%l2
266         mov %l2,%i0
267         mov %l3,%i1
268 .LL81:
269         ret
270         restore
271 EXPORT_SYMBOL(__divdi3)