udiv_nfp.asm revision 1.1 1 1.1 mrg dnl SPARC v7 __udiv_qrnnd division support, used from longlong.h.
2 1.1 mrg dnl This is for v7 CPUs without a floating-point unit.
3 1.1 mrg
4 1.1 mrg dnl Copyright 1993, 1994, 1996, 2000 Free Software Foundation, Inc.
5 1.1 mrg
6 1.1 mrg dnl This file is part of the GNU MP Library.
7 1.1 mrg
8 1.1 mrg dnl The GNU MP Library is free software; you can redistribute it and/or modify
9 1.1 mrg dnl it under the terms of the GNU Lesser General Public License as published
10 1.1 mrg dnl by the Free Software Foundation; either version 3 of the License, or (at
11 1.1 mrg dnl your option) any later version.
12 1.1 mrg
13 1.1 mrg dnl The GNU MP Library is distributed in the hope that it will be useful, but
14 1.1 mrg dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg dnl License for more details.
17 1.1 mrg
18 1.1 mrg dnl You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg dnl along with the GNU MP Library. If not, see http://www.gnu.org/licenses/.
20 1.1 mrg
21 1.1 mrg
22 1.1 mrg include(`../config.m4')
23 1.1 mrg
24 1.1 mrg C INPUT PARAMETERS
25 1.1 mrg C rem_ptr o0
26 1.1 mrg C n1 o1
27 1.1 mrg C n0 o2
28 1.1 mrg C d o3
29 1.1 mrg
30 1.1 mrg ASM_START()
31 1.1 mrg PROLOGUE(mpn_udiv_qrnnd)
32 1.1 mrg tst %o3
33 1.1 mrg bneg L(largedivisor)
34 1.1 mrg mov 8,%g1
35 1.1 mrg
36 1.1 mrg b L(p1)
37 1.1 mrg addxcc %o2,%o2,%o2
38 1.1 mrg
39 1.1 mrg L(plop):
40 1.1 mrg bcc L(n1)
41 1.1 mrg addxcc %o2,%o2,%o2
42 1.1 mrg L(p1): addx %o1,%o1,%o1
43 1.1 mrg subcc %o1,%o3,%o4
44 1.1 mrg bcc L(n2)
45 1.1 mrg addxcc %o2,%o2,%o2
46 1.1 mrg L(p2): addx %o1,%o1,%o1
47 1.1 mrg subcc %o1,%o3,%o4
48 1.1 mrg bcc L(n3)
49 1.1 mrg addxcc %o2,%o2,%o2
50 1.1 mrg L(p3): addx %o1,%o1,%o1
51 1.1 mrg subcc %o1,%o3,%o4
52 1.1 mrg bcc L(n4)
53 1.1 mrg addxcc %o2,%o2,%o2
54 1.1 mrg L(p4): addx %o1,%o1,%o1
55 1.1 mrg addcc %g1,-1,%g1
56 1.1 mrg bne L(plop)
57 1.1 mrg subcc %o1,%o3,%o4
58 1.1 mrg bcc L(n5)
59 1.1 mrg addxcc %o2,%o2,%o2
60 1.1 mrg L(p5): st %o1,[%o0]
61 1.1 mrg retl
62 1.1 mrg xnor %g0,%o2,%o0
63 1.1 mrg
64 1.1 mrg L(nlop):
65 1.1 mrg bcc L(p1)
66 1.1 mrg addxcc %o2,%o2,%o2
67 1.1 mrg L(n1): addx %o4,%o4,%o4
68 1.1 mrg subcc %o4,%o3,%o1
69 1.1 mrg bcc L(p2)
70 1.1 mrg addxcc %o2,%o2,%o2
71 1.1 mrg L(n2): addx %o4,%o4,%o4
72 1.1 mrg subcc %o4,%o3,%o1
73 1.1 mrg bcc L(p3)
74 1.1 mrg addxcc %o2,%o2,%o2
75 1.1 mrg L(n3): addx %o4,%o4,%o4
76 1.1 mrg subcc %o4,%o3,%o1
77 1.1 mrg bcc L(p4)
78 1.1 mrg addxcc %o2,%o2,%o2
79 1.1 mrg L(n4): addx %o4,%o4,%o4
80 1.1 mrg addcc %g1,-1,%g1
81 1.1 mrg bne L(nlop)
82 1.1 mrg subcc %o4,%o3,%o1
83 1.1 mrg bcc L(p5)
84 1.1 mrg addxcc %o2,%o2,%o2
85 1.1 mrg L(n5): st %o4,[%o0]
86 1.1 mrg retl
87 1.1 mrg xnor %g0,%o2,%o0
88 1.1 mrg
89 1.1 mrg L(largedivisor):
90 1.1 mrg and %o2,1,%o5 C %o5 = n0 & 1
91 1.1 mrg
92 1.1 mrg srl %o2,1,%o2
93 1.1 mrg sll %o1,31,%g2
94 1.1 mrg or %g2,%o2,%o2 C %o2 = lo(n1n0 >> 1)
95 1.1 mrg srl %o1,1,%o1 C %o1 = hi(n1n0 >> 1)
96 1.1 mrg
97 1.1 mrg and %o3,1,%g2
98 1.1 mrg srl %o3,1,%g3 C %g3 = floor(d / 2)
99 1.1 mrg add %g3,%g2,%g3 C %g3 = ceil(d / 2)
100 1.1 mrg
101 1.1 mrg b L(Lp1)
102 1.1 mrg addxcc %o2,%o2,%o2
103 1.1 mrg
104 1.1 mrg L(Lplop):
105 1.1 mrg bcc L(Ln1)
106 1.1 mrg addxcc %o2,%o2,%o2
107 1.1 mrg L(Lp1): addx %o1,%o1,%o1
108 1.1 mrg subcc %o1,%g3,%o4
109 1.1 mrg bcc L(Ln2)
110 1.1 mrg addxcc %o2,%o2,%o2
111 1.1 mrg L(Lp2): addx %o1,%o1,%o1
112 1.1 mrg subcc %o1,%g3,%o4
113 1.1 mrg bcc L(Ln3)
114 1.1 mrg addxcc %o2,%o2,%o2
115 1.1 mrg L(Lp3): addx %o1,%o1,%o1
116 1.1 mrg subcc %o1,%g3,%o4
117 1.1 mrg bcc L(Ln4)
118 1.1 mrg addxcc %o2,%o2,%o2
119 1.1 mrg L(Lp4): addx %o1,%o1,%o1
120 1.1 mrg addcc %g1,-1,%g1
121 1.1 mrg bne L(Lplop)
122 1.1 mrg subcc %o1,%g3,%o4
123 1.1 mrg bcc L(Ln5)
124 1.1 mrg addxcc %o2,%o2,%o2
125 1.1 mrg L(Lp5): add %o1,%o1,%o1 C << 1
126 1.1 mrg tst %g2
127 1.1 mrg bne L(oddp)
128 1.1 mrg add %o5,%o1,%o1
129 1.1 mrg st %o1,[%o0]
130 1.1 mrg retl
131 1.1 mrg xnor %g0,%o2,%o0
132 1.1 mrg
133 1.1 mrg L(Lnlop):
134 1.1 mrg bcc L(Lp1)
135 1.1 mrg addxcc %o2,%o2,%o2
136 1.1 mrg L(Ln1): addx %o4,%o4,%o4
137 1.1 mrg subcc %o4,%g3,%o1
138 1.1 mrg bcc L(Lp2)
139 1.1 mrg addxcc %o2,%o2,%o2
140 1.1 mrg L(Ln2): addx %o4,%o4,%o4
141 1.1 mrg subcc %o4,%g3,%o1
142 1.1 mrg bcc L(Lp3)
143 1.1 mrg addxcc %o2,%o2,%o2
144 1.1 mrg L(Ln3): addx %o4,%o4,%o4
145 1.1 mrg subcc %o4,%g3,%o1
146 1.1 mrg bcc L(Lp4)
147 1.1 mrg addxcc %o2,%o2,%o2
148 1.1 mrg L(Ln4): addx %o4,%o4,%o4
149 1.1 mrg addcc %g1,-1,%g1
150 1.1 mrg bne L(Lnlop)
151 1.1 mrg subcc %o4,%g3,%o1
152 1.1 mrg bcc L(Lp5)
153 1.1 mrg addxcc %o2,%o2,%o2
154 1.1 mrg L(Ln5): add %o4,%o4,%o4 C << 1
155 1.1 mrg tst %g2
156 1.1 mrg bne L(oddn)
157 1.1 mrg add %o5,%o4,%o4
158 1.1 mrg st %o4,[%o0]
159 1.1 mrg retl
160 1.1 mrg xnor %g0,%o2,%o0
161 1.1 mrg
162 1.1 mrg L(oddp):
163 1.1 mrg xnor %g0,%o2,%o2
164 1.1 mrg C q' in %o2. r' in %o1
165 1.1 mrg addcc %o1,%o2,%o1
166 1.1 mrg bcc L(Lp6)
167 1.1 mrg addx %o2,0,%o2
168 1.1 mrg sub %o1,%o3,%o1
169 1.1 mrg L(Lp6): subcc %o1,%o3,%g0
170 1.1 mrg bcs L(Lp7)
171 1.1 mrg subx %o2,-1,%o2
172 1.1 mrg sub %o1,%o3,%o1
173 1.1 mrg L(Lp7): st %o1,[%o0]
174 1.1 mrg retl
175 1.1 mrg mov %o2,%o0
176 1.1 mrg
177 1.1 mrg L(oddn):
178 1.1 mrg xnor %g0,%o2,%o2
179 1.1 mrg C q' in %o2. r' in %o4
180 1.1 mrg addcc %o4,%o2,%o4
181 1.1 mrg bcc L(Ln6)
182 1.1 mrg addx %o2,0,%o2
183 1.1 mrg sub %o4,%o3,%o4
184 1.1 mrg L(Ln6): subcc %o4,%o3,%g0
185 1.1 mrg bcs L(Ln7)
186 1.1 mrg subx %o2,-1,%o2
187 1.1 mrg sub %o4,%o3,%o4
188 1.1 mrg L(Ln7): st %o4,[%o0]
189 1.1 mrg retl
190 1.1 mrg mov %o2,%o0
191 1.1 mrg EPILOGUE(mpn_udiv_qrnnd)
192