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 | .text |
9 | .align 4 |
10 | .globl __udivdi3 |
11 | __udivdi3: |
12 | save %sp,-104,%sp |
13 | mov %i3,%o3 |
14 | cmp %i2,0 |
15 | bne .LL40 |
16 | mov %i1,%i3 |
17 | cmp %o3,%i0 |
18 | bleu .LL41 |
19 | mov %i3,%o1 |
20 | ! Inlined udiv_qrnnd |
21 | mov 32,%g1 |
22 | subcc %i0,%o3,%g0 |
23 | 1: bcs 5f |
24 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb |
25 | sub %i0,%o3,%i0 ! this kills msb of n |
26 | addx %i0,%i0,%i0 ! so this cannot give carry |
27 | subcc %g1,1,%g1 |
28 | 2: bne 1b |
29 | subcc %i0,%o3,%g0 |
30 | bcs 3f |
31 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb |
32 | b 3f |
33 | sub %i0,%o3,%i0 ! this kills msb of n |
34 | 4: sub %i0,%o3,%i0 |
35 | 5: addxcc %i0,%i0,%i0 |
36 | bcc 2b |
37 | subcc %g1,1,%g1 |
38 | ! Got carry from n. Subtract next step to cancel this carry. |
39 | bne 4b |
40 | addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb |
41 | sub %i0,%o3,%i0 |
42 | 3: xnor %o1,0,%o1 |
43 | ! End of inline udiv_qrnnd |
44 | b .LL45 |
45 | mov 0,%o2 |
46 | .LL41: |
47 | cmp %o3,0 |
48 | bne .LL77 |
49 | mov %i0,%o2 |
50 | mov 1,%o0 |
51 | mov 0,%o1 |
52 | wr %g0, 0, %y |
53 | udiv %o0, %o1, %o0 |
54 | mov %o0,%o3 |
55 | mov %i0,%o2 |
56 | .LL77: |
57 | mov 0,%o4 |
58 | ! Inlined udiv_qrnnd |
59 | mov 32,%g1 |
60 | subcc %o4,%o3,%g0 |
61 | 1: bcs 5f |
62 | addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb |
63 | sub %o4,%o3,%o4 ! this kills msb of n |
64 | addx %o4,%o4,%o4 ! so this cannot give carry |
65 | subcc %g1,1,%g1 |
66 | 2: bne 1b |
67 | subcc %o4,%o3,%g0 |
68 | bcs 3f |
69 | addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb |
70 | b 3f |
71 | sub %o4,%o3,%o4 ! this kills msb of n |
72 | 4: sub %o4,%o3,%o4 |
73 | 5: addxcc %o4,%o4,%o4 |
74 | bcc 2b |
75 | subcc %g1,1,%g1 |
76 | ! Got carry from n. Subtract next step to cancel this carry. |
77 | bne 4b |
78 | addcc %o2,%o2,%o2 ! shift n1n0 and a 0-bit in lsb |
79 | sub %o4,%o3,%o4 |
80 | 3: xnor %o2,0,%o2 |
81 | ! End of inline udiv_qrnnd |
82 | mov %o4,%i0 |
83 | mov %i3,%o1 |
84 | ! Inlined udiv_qrnnd |
85 | mov 32,%g1 |
86 | subcc %i0,%o3,%g0 |
87 | 1: bcs 5f |
88 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb |
89 | sub %i0,%o3,%i0 ! this kills msb of n |
90 | addx %i0,%i0,%i0 ! so this cannot give carry |
91 | subcc %g1,1,%g1 |
92 | 2: bne 1b |
93 | subcc %i0,%o3,%g0 |
94 | bcs 3f |
95 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb |
96 | b 3f |
97 | sub %i0,%o3,%i0 ! this kills msb of n |
98 | 4: sub %i0,%o3,%i0 |
99 | 5: addxcc %i0,%i0,%i0 |
100 | bcc 2b |
101 | subcc %g1,1,%g1 |
102 | ! Got carry from n. Subtract next step to cancel this carry. |
103 | bne 4b |
104 | addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb |
105 | sub %i0,%o3,%i0 |
106 | 3: xnor %o1,0,%o1 |
107 | ! End of inline udiv_qrnnd |
108 | b .LL78 |
109 | mov %o1,%l1 |
110 | .LL40: |
111 | cmp %i2,%i0 |
112 | bleu .LL46 |
113 | sethi %hi(65535),%o0 |
114 | b .LL73 |
115 | mov 0,%o1 |
116 | .LL46: |
117 | or %o0,%lo(65535),%o0 |
118 | cmp %i2,%o0 |
119 | bgu .LL53 |
120 | mov %i2,%o1 |
121 | cmp %i2,256 |
122 | addx %g0,-1,%o0 |
123 | b .LL59 |
124 | and %o0,8,%o2 |
125 | .LL53: |
126 | sethi %hi(16777215),%o0 |
127 | or %o0,%lo(16777215),%o0 |
128 | cmp %o1,%o0 |
129 | bgu .LL59 |
130 | mov 24,%o2 |
131 | mov 16,%o2 |
132 | .LL59: |
133 | srl %o1,%o2,%o1 |
134 | sethi %hi(__clz_tab),%o0 |
135 | or %o0,%lo(__clz_tab),%o0 |
136 | ldub [%o1+%o0],%o0 |
137 | add %o0,%o2,%o0 |
138 | mov 32,%o1 |
139 | subcc %o1,%o0,%o2 |
140 | bne,a .LL67 |
141 | mov 32,%o0 |
142 | cmp %i0,%i2 |
143 | bgu .LL69 |
144 | cmp %i3,%o3 |
145 | blu .LL73 |
146 | mov 0,%o1 |
147 | .LL69: |
148 | b .LL73 |
149 | mov 1,%o1 |
150 | .LL67: |
151 | sub %o0,%o2,%o0 |
152 | sll %i2,%o2,%i2 |
153 | srl %o3,%o0,%o1 |
154 | or %i2,%o1,%i2 |
155 | sll %o3,%o2,%o3 |
156 | srl %i0,%o0,%o1 |
157 | sll %i0,%o2,%i0 |
158 | srl %i3,%o0,%o0 |
159 | or %i0,%o0,%i0 |
160 | sll %i3,%o2,%i3 |
161 | mov %i0,%o5 |
162 | mov %o1,%o4 |
163 | ! Inlined udiv_qrnnd |
164 | mov 32,%g1 |
165 | subcc %o4,%i2,%g0 |
166 | 1: bcs 5f |
167 | addxcc %o5,%o5,%o5 ! shift n1n0 and a q-bit in lsb |
168 | sub %o4,%i2,%o4 ! this kills msb of n |
169 | addx %o4,%o4,%o4 ! so this cannot give carry |
170 | subcc %g1,1,%g1 |
171 | 2: bne 1b |
172 | subcc %o4,%i2,%g0 |
173 | bcs 3f |
174 | addxcc %o5,%o5,%o5 ! shift n1n0 and a q-bit in lsb |
175 | b 3f |
176 | sub %o4,%i2,%o4 ! this kills msb of n |
177 | 4: sub %o4,%i2,%o4 |
178 | 5: addxcc %o4,%o4,%o4 |
179 | bcc 2b |
180 | subcc %g1,1,%g1 |
181 | ! Got carry from n. Subtract next step to cancel this carry. |
182 | bne 4b |
183 | addcc %o5,%o5,%o5 ! shift n1n0 and a 0-bit in lsb |
184 | sub %o4,%i2,%o4 |
185 | 3: xnor %o5,0,%o5 |
186 | ! End of inline udiv_qrnnd |
187 | mov %o4,%i0 |
188 | mov %o5,%o1 |
189 | ! Inlined umul_ppmm |
190 | wr %g0,%o1,%y ! SPARC has 0-3 delay insn after a wr |
191 | sra %o3,31,%g2 ! Do not move this insn |
192 | and %o1,%g2,%g2 ! Do not move this insn |
193 | andcc %g0,0,%g1 ! Do not move this insn |
194 | mulscc %g1,%o3,%g1 |
195 | mulscc %g1,%o3,%g1 |
196 | mulscc %g1,%o3,%g1 |
197 | mulscc %g1,%o3,%g1 |
198 | mulscc %g1,%o3,%g1 |
199 | mulscc %g1,%o3,%g1 |
200 | mulscc %g1,%o3,%g1 |
201 | mulscc %g1,%o3,%g1 |
202 | mulscc %g1,%o3,%g1 |
203 | mulscc %g1,%o3,%g1 |
204 | mulscc %g1,%o3,%g1 |
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,0,%g1 |
227 | add %g1,%g2,%o0 |
228 | rd %y,%o2 |
229 | cmp %o0,%i0 |
230 | bgu,a .LL73 |
231 | add %o1,-1,%o1 |
232 | bne,a .LL45 |
233 | mov 0,%o2 |
234 | cmp %o2,%i3 |
235 | bleu .LL45 |
236 | mov 0,%o2 |
237 | add %o1,-1,%o1 |
238 | .LL73: |
239 | mov 0,%o2 |
240 | .LL45: |
241 | mov %o1,%l1 |
242 | .LL78: |
243 | mov %o2,%l0 |
244 | mov %l0,%i0 |
245 | mov %l1,%i1 |
246 | ret |
247 | restore |
248 | |