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