diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/sparc/lib/divdi3.S |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/sparc/lib/divdi3.S')
-rw-r--r-- | arch/sparc/lib/divdi3.S | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/arch/sparc/lib/divdi3.S b/arch/sparc/lib/divdi3.S new file mode 100644 index 000000000000..681b3683da9e --- /dev/null +++ b/arch/sparc/lib/divdi3.S | |||
@@ -0,0 +1,295 @@ | |||
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 | .data | ||
21 | .align 8 | ||
22 | .globl __clz_tab | ||
23 | __clz_tab: | ||
24 | .byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 | ||
25 | .byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 | ||
26 | .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 | ||
27 | .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 | ||
28 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
29 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
30 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
31 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
32 | .size __clz_tab,256 | ||
33 | .global .udiv | ||
34 | |||
35 | .text | ||
36 | .align 4 | ||
37 | .globl __divdi3 | ||
38 | __divdi3: | ||
39 | save %sp,-104,%sp | ||
40 | cmp %i0,0 | ||
41 | bge .LL40 | ||
42 | mov 0,%l4 | ||
43 | mov -1,%l4 | ||
44 | sub %g0,%i1,%o0 | ||
45 | mov %o0,%o5 | ||
46 | subcc %g0,%o0,%g0 | ||
47 | sub %g0,%i0,%o0 | ||
48 | subx %o0,0,%o4 | ||
49 | mov %o4,%i0 | ||
50 | mov %o5,%i1 | ||
51 | .LL40: | ||
52 | cmp %i2,0 | ||
53 | bge .LL84 | ||
54 | mov %i3,%o4 | ||
55 | xnor %g0,%l4,%l4 | ||
56 | sub %g0,%i3,%o0 | ||
57 | mov %o0,%o3 | ||
58 | subcc %g0,%o0,%g0 | ||
59 | sub %g0,%i2,%o0 | ||
60 | subx %o0,0,%o2 | ||
61 | mov %o2,%i2 | ||
62 | mov %o3,%i3 | ||
63 | mov %i3,%o4 | ||
64 | .LL84: | ||
65 | cmp %i2,0 | ||
66 | bne .LL45 | ||
67 | mov %i1,%i3 | ||
68 | cmp %o4,%i0 | ||
69 | bleu .LL46 | ||
70 | mov %i3,%o1 | ||
71 | mov 32,%g1 | ||
72 | subcc %i0,%o4,%g0 | ||
73 | 1: bcs 5f | ||
74 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb | ||
75 | sub %i0,%o4,%i0 ! this kills msb of n | ||
76 | addx %i0,%i0,%i0 ! so this cannot give carry | ||
77 | subcc %g1,1,%g1 | ||
78 | 2: bne 1b | ||
79 | subcc %i0,%o4,%g0 | ||
80 | bcs 3f | ||
81 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb | ||
82 | b 3f | ||
83 | sub %i0,%o4,%i0 ! this kills msb of n | ||
84 | 4: sub %i0,%o4,%i0 | ||
85 | 5: addxcc %i0,%i0,%i0 | ||
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 %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb | ||
91 | sub %i0,%o4,%i0 | ||
92 | 3: xnor %o1,0,%o1 | ||
93 | b .LL50 | ||
94 | mov 0,%o2 | ||
95 | .LL46: | ||
96 | cmp %o4,0 | ||
97 | bne .LL85 | ||
98 | mov %i0,%o2 | ||
99 | mov 1,%o0 | ||
100 | call .udiv,0 | ||
101 | mov 0,%o1 | ||
102 | mov %o0,%o4 | ||
103 | mov %i0,%o2 | ||
104 | .LL85: | ||
105 | mov 0,%g3 | ||
106 | mov 32,%g1 | ||
107 | subcc %g3,%o4,%g0 | ||
108 | 1: bcs 5f | ||
109 | addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb | ||
110 | sub %g3,%o4,%g3 ! this kills msb of n | ||
111 | addx %g3,%g3,%g3 ! so this cannot give carry | ||
112 | subcc %g1,1,%g1 | ||
113 | 2: bne 1b | ||
114 | subcc %g3,%o4,%g0 | ||
115 | bcs 3f | ||
116 | addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb | ||
117 | b 3f | ||
118 | sub %g3,%o4,%g3 ! this kills msb of n | ||
119 | 4: sub %g3,%o4,%g3 | ||
120 | 5: addxcc %g3,%g3,%g3 | ||
121 | bcc 2b | ||
122 | subcc %g1,1,%g1 | ||
123 | ! Got carry from n. Subtract next step to cancel this carry. | ||
124 | bne 4b | ||
125 | addcc %o2,%o2,%o2 ! shift n1n0 and a 0-bit in lsb | ||
126 | sub %g3,%o4,%g3 | ||
127 | 3: xnor %o2,0,%o2 | ||
128 | mov %g3,%i0 | ||
129 | mov %i3,%o1 | ||
130 | mov 32,%g1 | ||
131 | subcc %i0,%o4,%g0 | ||
132 | 1: bcs 5f | ||
133 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb | ||
134 | sub %i0,%o4,%i0 ! this kills msb of n | ||
135 | addx %i0,%i0,%i0 ! so this cannot give carry | ||
136 | subcc %g1,1,%g1 | ||
137 | 2: bne 1b | ||
138 | subcc %i0,%o4,%g0 | ||
139 | bcs 3f | ||
140 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb | ||
141 | b 3f | ||
142 | sub %i0,%o4,%i0 ! this kills msb of n | ||
143 | 4: sub %i0,%o4,%i0 | ||
144 | 5: addxcc %i0,%i0,%i0 | ||
145 | bcc 2b | ||
146 | subcc %g1,1,%g1 | ||
147 | ! Got carry from n. Subtract next step to cancel this carry. | ||
148 | bne 4b | ||
149 | addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb | ||
150 | sub %i0,%o4,%i0 | ||
151 | 3: xnor %o1,0,%o1 | ||
152 | b .LL86 | ||
153 | mov %o1,%l1 | ||
154 | .LL45: | ||
155 | cmp %i2,%i0 | ||
156 | bleu .LL51 | ||
157 | sethi %hi(65535),%o0 | ||
158 | b .LL78 | ||
159 | mov 0,%o1 | ||
160 | .LL51: | ||
161 | or %o0,%lo(65535),%o0 | ||
162 | cmp %i2,%o0 | ||
163 | bgu .LL58 | ||
164 | mov %i2,%o1 | ||
165 | cmp %i2,256 | ||
166 | addx %g0,-1,%o0 | ||
167 | b .LL64 | ||
168 | and %o0,8,%o2 | ||
169 | .LL58: | ||
170 | sethi %hi(16777215),%o0 | ||
171 | or %o0,%lo(16777215),%o0 | ||
172 | cmp %i2,%o0 | ||
173 | bgu .LL64 | ||
174 | mov 24,%o2 | ||
175 | mov 16,%o2 | ||
176 | .LL64: | ||
177 | srl %o1,%o2,%o0 | ||
178 | sethi %hi(__clz_tab),%o1 | ||
179 | or %o1,%lo(__clz_tab),%o1 | ||
180 | ldub [%o0+%o1],%o0 | ||
181 | add %o0,%o2,%o0 | ||
182 | mov 32,%o1 | ||
183 | subcc %o1,%o0,%o3 | ||
184 | bne,a .LL72 | ||
185 | sub %o1,%o3,%o1 | ||
186 | cmp %i0,%i2 | ||
187 | bgu .LL74 | ||
188 | cmp %i3,%o4 | ||
189 | blu .LL78 | ||
190 | mov 0,%o1 | ||
191 | .LL74: | ||
192 | b .LL78 | ||
193 | mov 1,%o1 | ||
194 | .LL72: | ||
195 | sll %i2,%o3,%o2 | ||
196 | srl %o4,%o1,%o0 | ||
197 | or %o2,%o0,%i2 | ||
198 | sll %o4,%o3,%o4 | ||
199 | srl %i0,%o1,%o2 | ||
200 | sll %i0,%o3,%o0 | ||
201 | srl %i3,%o1,%o1 | ||
202 | or %o0,%o1,%i0 | ||
203 | sll %i3,%o3,%i3 | ||
204 | mov %i0,%o1 | ||
205 | mov 32,%g1 | ||
206 | subcc %o2,%i2,%g0 | ||
207 | 1: bcs 5f | ||
208 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb | ||
209 | sub %o2,%i2,%o2 ! this kills msb of n | ||
210 | addx %o2,%o2,%o2 ! so this cannot give carry | ||
211 | subcc %g1,1,%g1 | ||
212 | 2: bne 1b | ||
213 | subcc %o2,%i2,%g0 | ||
214 | bcs 3f | ||
215 | addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb | ||
216 | b 3f | ||
217 | sub %o2,%i2,%o2 ! this kills msb of n | ||
218 | 4: sub %o2,%i2,%o2 | ||
219 | 5: addxcc %o2,%o2,%o2 | ||
220 | bcc 2b | ||
221 | subcc %g1,1,%g1 | ||
222 | ! Got carry from n. Subtract next step to cancel this carry. | ||
223 | bne 4b | ||
224 | addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb | ||
225 | sub %o2,%i2,%o2 | ||
226 | 3: xnor %o1,0,%o1 | ||
227 | mov %o2,%i0 | ||
228 | wr %g0,%o1,%y ! SPARC has 0-3 delay insn after a wr | ||
229 | sra %o4,31,%g2 ! Do not move this insn | ||
230 | and %o1,%g2,%g2 ! Do not move this insn | ||
231 | andcc %g0,0,%g1 ! Do not move this insn | ||
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,%o4,%g1 | ||
252 | mulscc %g1,%o4,%g1 | ||
253 | mulscc %g1,%o4,%g1 | ||
254 | mulscc %g1,%o4,%g1 | ||
255 | mulscc %g1,%o4,%g1 | ||
256 | mulscc %g1,%o4,%g1 | ||
257 | mulscc %g1,%o4,%g1 | ||
258 | mulscc %g1,%o4,%g1 | ||
259 | mulscc %g1,%o4,%g1 | ||
260 | mulscc %g1,%o4,%g1 | ||
261 | mulscc %g1,%o4,%g1 | ||
262 | mulscc %g1,%o4,%g1 | ||
263 | mulscc %g1,%o4,%g1 | ||
264 | mulscc %g1,0,%g1 | ||
265 | add %g1,%g2,%o0 | ||
266 | rd %y,%o2 | ||
267 | cmp %o0,%i0 | ||
268 | bgu,a .LL78 | ||
269 | add %o1,-1,%o1 | ||
270 | bne,a .LL50 | ||
271 | mov 0,%o2 | ||
272 | cmp %o2,%i3 | ||
273 | bleu .LL50 | ||
274 | mov 0,%o2 | ||
275 | add %o1,-1,%o1 | ||
276 | .LL78: | ||
277 | mov 0,%o2 | ||
278 | .LL50: | ||
279 | mov %o1,%l1 | ||
280 | .LL86: | ||
281 | mov %o2,%l0 | ||
282 | mov %l0,%i0 | ||
283 | mov %l1,%i1 | ||
284 | cmp %l4,0 | ||
285 | be .LL81 | ||
286 | sub %g0,%i1,%o0 | ||
287 | mov %o0,%l3 | ||
288 | subcc %g0,%o0,%g0 | ||
289 | sub %g0,%i0,%o0 | ||
290 | subx %o0,0,%l2 | ||
291 | mov %l2,%i0 | ||
292 | mov %l3,%i1 | ||
293 | .LL81: | ||
294 | ret | ||
295 | restore | ||