xref: /original-bsd/lib/libc/vax/gen/udiv.s (revision 7d595439)
1#ifdef LIBC_SCCS
2	.asciz	"@(#)udiv.s	5.2 (Berkeley) 03/09/86"
3#endif LIBC_SCCS
4
5/*
6 * udiv - unsigned division for vax-11
7 *
8 * arguments: dividend, divisor.
9 * result: quotient.
10 * uses r0-r2
11 *
12 * If 1 < divisor <= 2147483647, zero-extend the dividend
13 * to 64 bits and let ediv do the work.  If the divisor is 1,
14 * ediv will overflow if bit 31 of the dividend is on, so
15 * just return the dividend unchanged.  If the divisor is 0,
16 * do the ediv also, so it will generate the proper exception.
17 * All other values of the divisor have bit 31 on: in this case
18 * the quotient must be 0 if divisor > dividend, and 1 otherwise,
19 * provided that the comparison is made as unsigned.
20 */
21
22#include "DEFS.h"
23
24ASENTRY(udiv, 0)
25	movl	4(ap),r0	/* dividend */
26	movl	8(ap),r2	/* divisor */
27	jeql	1f		/* if divisor=0, force exception */
28	cmpl	r2,$1		/* if divisor <= 1 (signed), */
29	jleq	2f		/*  no division is necessary */
301:
31	clrl	r1		/* zero-extend the dividend */
32	ediv	r2,r0,r0,r2	/* divide.  q->r0, r->r2 (discarded) */
33	ret
342:
35	jeql	1f		/* if divisor=1, return dividend */
36	cmpl	r0,r2		/* unsigned comparison between */
37	jgequ	2f		/*  dividend and divisor */
38	clrl	r0		/* dividend < divisor, return 0 */
39	ret
402:
41	movl	$1,r0		/* dividend >= divisor, return 1 */
421:
43	ret
44
45/*
46 * audiv - unsigned division for vax-11
47 *
48 * arguments: *dividend, divisor.
49 * result: quotient in r0 and *dividend.
50 * uses r0-r2
51 */
52
53#include "DEFS.h"
54
55ASENTRY(audiv, 0)
56	movl	*4(ap),r0	/* dividend */
57	movl	8(ap),r2	/* divisor */
58	jeql	1f		/* if divisor=0, force exception */
59	cmpl	r2,$1		/* if divisor <= 1 (signed), */
60	jleq	2f		/*  no division is necessary */
611:
62	clrl	r1		/* zero-extend the dividend */
63	ediv	r2,r0,r0,r2	/* divide.  q->r0, r->r2 (discarded) */
64	movl	r0,*4(ap)	/* save result */
65	ret
662:
67	jeql	1f		/* if divisor=1, return dividend */
68	cmpl	r0,r2		/* unsigned comparison between */
69	jgequ	2f		/*  dividend and divisor */
70	clrl	r0		/* dividend < divisor, return 0 */
71	clrl	*4(ap)		/* save result */
72	ret
732:
74	movl	$1,r0		/* dividend >= divisor, return 1 */
751:
76	movl	r0,*4(ap)	/* save result */
77	ret
78