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