xref: /original-bsd/sys/vax/vax/udiv.s (revision e59fb703)
1#ifdef LIBC_SCCS
2	.asciz	"@(#)udiv.s	7.3 (Berkeley) 12/03/87"
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	.text
23	.align	2
24	.globl	udiv
25udiv:	.word	0x0000
26#ifdef	GPROF
27	jsb	mcount
28#endif	/*GPROF*/
29	movl	4(ap),r0	/* dividend */
30	movl	8(ap),r2	/* divisor */
31	jeql	1f		/* if divisor=0, force exception */
32	cmpl	r2,$1		/* if divisor <= 1 (signed), */
33	jleq	2f		/*  no division is necessary */
341:
35	clrl	r1		/* zero-extend the dividend */
36	ediv	r2,r0,r0,r2	/* divide.  q->r0, r->r2 (discarded) */
37	ret
382:
39	jeql	1f		/* if divisor=1, return dividend */
40	cmpl	r0,r2		/* unsigned comparison between */
41	jgequ	2f		/*  dividend and divisor */
42	clrl	r0		/* dividend < divisor, return 0 */
43	ret
442:
45	movl	$1,r0		/* dividend >= divisor, return 1 */
461:
47	ret
48
49/*
50 * audiv - unsigned division for vax-11
51 *
52 * arguments: *dividend, divisor.
53 * result: quotient in r0 and *dividend.
54 * uses r0-r2
55 */
56
57	.align	2
58	.globl	audiv
59audiv:	.word	0x0000
60#ifdef GPROF
61	jsb	mcount
62#endif /*GPROF*/
63	movl	*4(ap),r0	/* dividend */
64	movl	8(ap),r2	/* divisor */
65	jeql	1f		/* if divisor=0, force exception */
66	cmpl	r2,$1		/* if divisor <= 1 (signed), */
67	jleq	2f		/*  no division is necessary */
681:
69	clrl	r1		/* zero-extend the dividend */
70	ediv	r2,r0,r0,r2	/* divide.  q->r0, r->r2 (discarded) */
71	movl	r0,*4(ap)	/* save result */
72	ret
732:
74	jeql	1f		/* if divisor=1, return dividend */
75	cmpl	r0,r2		/* unsigned comparison between */
76	jgequ	2f		/*  dividend and divisor */
77	clrl	r0		/* dividend < divisor, return 0 */
78	clrl	*4(ap)		/* save result */
79	ret
802:
81	movl	$1,r0		/* dividend >= divisor, return 1 */
821:
83	movl	r0,*4(ap)	/* save result */
84	ret
85