divu.S revision 1.2 1 1.2 chs /* $NetBSD: divu.S,v 1.2 2003/10/10 15:07:43 chs Exp $ */
2 1.1 fredette
3 1.1 fredette /* $OpenBSD: divu.S,v 1.5 2001/03/29 03:58:18 mickey Exp $ */
4 1.1 fredette
5 1.1 fredette /*
6 1.1 fredette * Copyright 1996 1995 by Open Software Foundation, Inc.
7 1.1 fredette * All Rights Reserved
8 1.1 fredette *
9 1.1 fredette * Permission to use, copy, modify, and distribute this software and
10 1.1 fredette * its documentation for any purpose and without fee is hereby granted,
11 1.1 fredette * provided that the above copyright notice appears in all copies and
12 1.1 fredette * that both the copyright notice and this permission notice appear in
13 1.1 fredette * supporting documentation.
14 1.1 fredette *
15 1.1 fredette * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
16 1.1 fredette * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
17 1.1 fredette * FOR A PARTICULAR PURPOSE.
18 1.1 fredette *
19 1.1 fredette * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
20 1.1 fredette * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
21 1.1 fredette * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
22 1.1 fredette * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
23 1.1 fredette * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 1.1 fredette *
25 1.1 fredette */
26 1.1 fredette /*
27 1.1 fredette * pmk1.1
28 1.1 fredette */
29 1.1 fredette /*
30 1.1 fredette * (c) Copyright 1986 HEWLETT-PACKARD COMPANY
31 1.1 fredette *
32 1.1 fredette * To anyone who acknowledges that this file is provided "AS IS"
33 1.1 fredette * without any express or implied warranty:
34 1.1 fredette * permission to use, copy, modify, and distribute this file
35 1.1 fredette * for any purpose is hereby granted without fee, provided that
36 1.1 fredette * the above copyright notice and this notice appears in all
37 1.1 fredette * copies, and that the name of Hewlett-Packard Company not be
38 1.1 fredette * used in advertising or publicity pertaining to distribution
39 1.1 fredette * of the software without specific, written prior permission.
40 1.1 fredette * Hewlett-Packard Company makes no representations about the
41 1.1 fredette * suitability of this software for any purpose.
42 1.1 fredette */
43 1.1 fredette
44 1.1 fredette #include <machine/asm.h>
45 1.1 fredette
46 1.1 fredette /**************************************************************************
47 1.1 fredette * Implement an integer divide routine for 32-bit operands and 32-bit quotient
48 1.1 fredette * and remainder with operand values of zero (divisor only) treated specially.
49 1.1 fredette *
50 1.1 fredette ***************************************************************************/
51 1.1 fredette /*
52 1.1 fredette * General registers
53 1.1 fredette */
54 1.2 chs gr0: .reg %r0 /* General register zero */
55 1.2 chs rem: .reg %r3 /* remainder and upper part of dividend */
56 1.2 chs quo: .reg %r4 /* quotient and lower part of dividend */
57 1.2 chs dvr: .reg %r5 /* divisor */
58 1.2 chs tp: .reg %r6 /* temp. reg. */
59 1.1 fredette
60 1.1 fredette .text
61 1.1 fredette
62 1.1 fredette /*****************************************************************************/
63 1.1 fredette ENTRY(divu,16)
64 1.2 chs stws,ma rem,4(%sp) ; save registers on stack
65 1.2 chs stws,ma quo,4(%sp) ; save registers on stack
66 1.2 chs stws,ma dvr,4(%sp) ; save registers on stack
67 1.2 chs stws,ma tp,4(%sp) ; save registers on stack
68 1.2 chs
69 1.2 chs addi 0,%arg2,dvr ; get divisor
70 1.2 chs addi 0,%arg1,quo ; get lower dividend
71 1.2 chs addi 0,%arg0,rem ; get upper dividend
72 1.1 fredette
73 1.1 fredette comib,>,n 0,dvr,hibit ; check for dvr >= 2**31
74 1.1 fredette addi -1,gr0,tp ; set V-bit to 1
75 1.1 fredette ds 0,tp,0
76 1.1 fredette add quo,quo,quo ; shift msb bit into carry
77 1.1 fredette ds rem,dvr,rem ; 1st divide step, if carry
78 1.1 fredette ; out, msb of quotient = 0
79 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
80 1.1 fredette ds rem,dvr,rem ; 2nd divide step
81 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
82 1.1 fredette ds rem,dvr,rem ; 3rd divide step
83 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
84 1.1 fredette ds rem,dvr,rem ; 4th divide step
85 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
86 1.1 fredette ds rem,dvr,rem ; 5th divide step
87 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
88 1.1 fredette ds rem,dvr,rem ; 6th divide step
89 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
90 1.1 fredette ds rem,dvr,rem ; 7th divide step
91 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
92 1.1 fredette ds rem,dvr,rem ; 8th divide step
93 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
94 1.1 fredette ds rem,dvr,rem ; 9th divide step
95 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
96 1.1 fredette ds rem,dvr,rem ; 10th divide step
97 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
98 1.1 fredette ds rem,dvr,rem ; 11th divide step
99 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
100 1.1 fredette ds rem,dvr,rem ; 12th divide step
101 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
102 1.1 fredette ds rem,dvr,rem ; 13th divide step
103 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
104 1.1 fredette ds rem,dvr,rem ; 14th divide step
105 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
106 1.1 fredette ds rem,dvr,rem ; 15th divide step
107 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
108 1.1 fredette ds rem,dvr,rem ; 16th divide step
109 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
110 1.1 fredette ds rem,dvr,rem ; 17th divide step
111 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
112 1.1 fredette ds rem,dvr,rem ; 18th divide step
113 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
114 1.1 fredette ds rem,dvr,rem ; 19th divide step
115 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
116 1.1 fredette ds rem,dvr,rem ; 20th divide step
117 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
118 1.1 fredette ds rem,dvr,rem ; 21st divide step
119 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
120 1.1 fredette ds rem,dvr,rem ; 22nd divide step
121 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
122 1.1 fredette ds rem,dvr,rem ; 23rd divide step
123 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
124 1.1 fredette ds rem,dvr,rem ; 24th divide step
125 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
126 1.1 fredette ds rem,dvr,rem ; 25th divide step
127 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
128 1.1 fredette ds rem,dvr,rem ; 26th divide step
129 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
130 1.1 fredette ds rem,dvr,rem ; 27th divide step
131 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
132 1.1 fredette ds rem,dvr,rem ; 28th divide step
133 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
134 1.1 fredette ds rem,dvr,rem ; 29th divide step
135 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
136 1.1 fredette ds rem,dvr,rem ; 30th divide step
137 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
138 1.1 fredette ds rem,dvr,rem ; 31st divide step
139 1.1 fredette addc quo,quo,quo ; shift quo with/into carry
140 1.1 fredette ds rem,dvr,rem ; 32nd divide step,
141 1.1 fredette addc quo,quo,quo ; shift last quo bit into quo
142 1.1 fredette addb,>=,n rem,0,finish ; branch if pos. rem
143 1.1 fredette add,< dvr,0,0 ; if dvr > 0, add dvr
144 1.1 fredette add,tr rem,dvr,rem ; for correcting rem.
145 1.1 fredette sub rem,dvr,rem ; else subtract dvr
146 1.1 fredette ;
147 1.1 fredette ; end of divide routine
148 1.1 fredette ;
149 1.2 chs finish: stws rem,0(%arg3) ; save remainder in high part
150 1.1 fredette ; of result
151 1.2 chs stws quo,4(%arg3) ; save quotient in low part
152 1.1 fredette ; of result
153 1.2 chs ldws,mb -4(%sp),tp ; restore registers
154 1.2 chs ldws,mb -4(%sp),dvr ; restore registers
155 1.2 chs ldws,mb -4(%sp),quo ; restore registers
156 1.2 chs bv 0(%rp) ; return
157 1.2 chs ldws,mb -4(%sp),rem ; restore registers
158 1.1 fredette ;
159 1.2 chs hibit: ldo 32(0),tp ; initialize loop counter
160 1.1 fredette add quo,quo,quo ; shift high bit into carry
161 1.2 chs loop: addc rem,rem,rem ; shift in high bit of dvdl
162 1.1 fredette addc,<> 0,0,0 ; if bit shifted out of dvdu,
163 1.1 fredette ; want to do subtract
164 1.1 fredette comb,<<,n rem,dvr,nosub ; if upper dividend > dvr,
165 1.1 fredette sub rem,dvr,rem ; subtract and
166 1.1 fredette add,tr dvr,dvr,0 ; set carry
167 1.2 chs nosub: addi 0,0,0 ; otherwise clear carry
168 1.1 fredette addib,> -1,tp,loop ; inc. counter; finished?
169 1.1 fredette addc quo,quo,quo ; shift bit of result into dvdl
170 1.1 fredette b finish+4 ; finish up
171 1.2 chs stws rem,0(%arg3) ; save remainder in high part
172 1.1 fredette ; of result
173 1.1 fredette
174 1.1 fredette EXIT(divu)
175 1.1 fredette .end
176